mongo-c-driver-1.26.0/000077500000000000000000000000001456567454500144555ustar00rootroot00000000000000mongo-c-driver-1.26.0/.clang-format000066400000000000000000000020101456567454500170210ustar00rootroot00000000000000--- AlignAfterOpenBracket: Align AlignConsecutiveAssignments: 'false' AlignConsecutiveDeclarations: 'false' AlignEscapedNewlinesLeft: 'true' AllowAllParametersOfDeclarationOnNextLine: 'true' AllowShortBlocksOnASingleLine: 'false' AllowShortCaseLabelsOnASingleLine: 'false' AllowShortFunctionsOnASingleLine: None AllowShortIfStatementsOnASingleLine: 'false' AllowShortLoopsOnASingleLine: 'false' AlwaysBreakAfterReturnType: All BinPackArguments: 'false' BinPackParameters: 'false' BreakBeforeBraces: Linux ColumnLimit: '80' ContinuationIndentWidth: '3' IndentCaseLabels: 'false' IndentWidth: '3' KeepEmptyLinesAtTheStartOfBlocks: 'false' Language: Cpp MaxEmptyLinesToKeep: '2' SortIncludes: 'false' SpaceAfterCStyleCast: 'true' SpaceBeforeAssignmentOperators: 'true' SpaceBeforeParens: Always SpaceInEmptyParentheses: 'false' SpacesInAngles: 'false' SpacesInCStyleCastParentheses: 'false' SpacesInContainerLiterals: 'true' SpacesInParentheses: 'false' SpacesInSquareBrackets: 'false' Standard: Cpp11 TabWidth: '3' UseTab: Never ... mongo-c-driver-1.26.0/.evergreen/000077500000000000000000000000001456567454500165155ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/.codecov.yml000066400000000000000000000001411456567454500207340ustar00rootroot00000000000000ignore: - "src/kms-message" - "src/zlib-*" - "src/libbson/tests" - "src/libmongoc/tests" mongo-c-driver-1.26.0/.evergreen/benchmark.yml000066400000000000000000000167551456567454500212100ustar00rootroot00000000000000####################################### # C Benchmark Tests # ####################################### ####################################### # Variables # ####################################### variables: ## Task list benchmark_compile: &benchmark_compile - name: "compile" benchmark_test_list: &benchmark_tests - name: "BenchMarkTests" ## Common download urls (merge in as hashes) mongo_download_url_prefixes: mongo_v60_perf: &mongo_v60_perf mongo_url: "https://downloads.mongodb.com/linux/mongodb-linux-x86_64-enterprise-rhel90-6.0.6.tgz" ## Common sets of CFLAGS cflags: standard: &cflags_64 cflags: "-m64 -march=x86-64" ## Scripts that are shared between buildvariants scripts: compile: unix: &compile_unix compile_script: | set -o errexit set -o verbose cmake -DENABLE_TESTS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=mongoc -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF . && make -j8 && make install git clone git@github.com:mongodb/mongo-c-driver-performance.git cd mongo-c-driver-performance cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=../mongoc . && make -j8 mongodb: start_mongod_command: &start_mongod_command start_mongod: | set -o errexit set -o verbose mkdir db echo "Starting Mongodb" ./mongodb/bin/mongod --dbpath `pwd`/db --logpath `pwd`/db/db.log --fork benchmark_common: &benchmark_common <<: [ *compile_unix, *start_mongod_command ] ####################################### # Functions # ####################################### functions: "compile function" : command: shell.exec params: working_dir: "mongo-c-driver" script: | export PATH=${extra_path}:$PATH export CFLAGS="${cflags}" ${compile_script} "fetch source" : command: git.get_project params: directory: "mongo-c-driver" "fetch artifacts" : command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o verbose set -o errexit rm -rf mongo-c-driver* curl --retry 5 http://s3.amazonaws.com/mciuploads/mongo-c-driver/${compile_variant}/${revision}/artifacts/${file}.tar.gz -o c-perf-binaries.tar.gz -sS --max-time 120 ${decompress} c-perf-binaries.tar.gz rm c-perf-binaries.tar.gz "fetch mongodb" : command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o verbose set -o errexit curl --retry 5 -s ${mongo_url} --output mongo-archive.${ext|tgz} ${decompress} mongo-archive.${ext|tgz} mv mongodb* mongodb chmod +x ./mongodb/bin/mongod${extension} "fetch driver test data" : command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o verbose set -o errexit curl --retry 5 https://s3.amazonaws.com/boxes.10gen.com/build/driver-test-data.tar.gz -o driver-test-data.tar.gz -sS --max-time 120 ${decompress} driver-test-data.tar.gz "run benchmark tests" : command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o errexit set -o verbose result=-1 # Negative one. ulimit -c unlimited || true # Run this function on exit. done=false finish () { set +o errexit if [ "$done" = false ]; then # There was an error. echo "something went wrong, killing mongod and exiting" killall -9 mongod fi exit $result } trap finish EXIT echo "Starting mongod" ${start_mongod} sleep 15 echo "Running Benchmark tests " start_time=$(date +%s) # rhel90 installs into lib64 LD_LIBRARY_PATH=`pwd`/mongoc/lib64:$LD_LIBRARY_PATH ./mongo-c-driver-performance/mongo-c-performance ./data set +o errexit result=$? cat results.json result=$? end_time=$(date +%s) elapsed_secs=$((end_time-start_time)) if [ $result -eq 0 ]; then status='"pass"' failures=0 else status='"fail"' failures=1 fi echo "{\"failures\": $failures, \"results\": [{\"status\": $status, \"exit_code\": $result, \"test_file\": \"BenchMarkTests\", \"start\": $start_time, \"end\": $end_time, \"elapsed\": $elapsed_secs}]}" > report.json cat report.json set +o errexit killall -9 mongod done=true exit $result "attach benchmark test results" : command: attach.results params: file_location: mongo-c-driver/report.json "send dashboard data" : command: perf.send params: name: perf file: mongo-c-driver/results.json "backtrace": - command: shell.exec params: working_dir: "mongo-c-driver" script: | echo "Debugging core files" shopt -s nullglob for i in *core*; do echo $i echo "backtrace full" | gdb -q ./mongo-c-driver-performance/mongo-c-performance $i done pre: # Remove and recreate old directory - command: shell.exec params: script: | rm -rf mongo-c-driver mkdir mongo-c-driver post: - func: "backtrace" # Remove and recreate old directory - command: shell.exec params: script: | rm -rf mongo-c-driver mkdir mongo-c-driver ####################################### # Tasks # ####################################### tasks: - name: compile commands: - func: "fetch source" - command: git.apply_patch params: directory: "mongo-c-driver" - func: "compile function" - command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o errexit set -o verbose tar czf ../mongo-c-driver.tar.gz . - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} local_file: mongo-c-driver.tar.gz remote_file: mongo-c-driver/${build_variant}/${revision}/artifacts/${file}.tar.gz bucket: mciuploads permissions: public-read content_type: ${content_type|application/x-gzip} - name: BenchMarkTests depends_on: - variant: c-driver-benchmark-compile name: compile commands: - func: "fetch artifacts" - func: "fetch mongodb" - func: "fetch driver test data" - func: "run benchmark tests" - func: "attach benchmark test results" - func: "send dashboard data" ####################################### # Buildvariants # ####################################### buildvariants: - name: c-driver-benchmark-compile display_name: "C Driver Benchmark Compile" expansions: <<: [ *cflags_64, *mongo_v60_perf, *benchmark_common ] file: c-binaries-rhel90 run_on: - rhel90-dbx-perf-large tasks: *benchmark_compile - name: c-driver-benchmark-mongo60_perf display_name: "C Driver Benchmark Mongo 6.0" expansions: <<: [ *cflags_64, *mongo_v60_perf, *benchmark_common ] file: c-binaries-rhel90 compile_variant: c-driver-benchmark-compile run_on: - rhel90-dbx-perf-large tasks: *benchmark_tests mongo-c-driver-1.26.0/.evergreen/config.yml000066400000000000000000000034121456567454500205050ustar00rootroot00000000000000# Default timeout for all tasks is 1 hour. # May be overridden by individual tasks. exec_timeout_secs: 3600 # Default command type is 'system' to indicate failures unrelated to tests or # their setup. Most commands should define their type as 'setup' or 'test'. # - setup: before test (lavendar). # - test: during test (red). # - system: after test (purple). command_type: system # Ensure Evergreen tests earlier commits when a task fails. stepback: true # Ensure failure in pre commands is also considered task failure. pre_error_fails_task: true # Too many post commands are not designed to handle errors. # TODO: set to true once failing post commands have been moved into # teardown_group commands of appropriate task groups. post_error_fails_task: false # Unlikely, but document loudly when task failure is due to early termination. early_termination: - func: early-termination # TODO: move into timeout commands of appropriate task groups. timeout: - func: backtrace # Commands run before all tasks (excluding those in task groups). # Use sparingly and ensure they are error-proof. pre: - func: fetch-source # Commands run after all tasks (excluding those in task groups). # Use sparingly and ensure they are error-proof. # TODO: move into teardown_group commands of appropriate task groups. post: - func: backtrace - func: upload-mo-artifacts - func: upload-test-results - func: stop-mongo-orchestration - func: stop-load-balancer - func: restore-instance-profile include: - filename: .evergreen/generated_configs/legacy-config.yml - filename: .evergreen/generated_configs/functions.yml - filename: .evergreen/generated_configs/task_groups.yml - filename: .evergreen/generated_configs/tasks.yml - filename: .evergreen/generated_configs/variants.yml mongo-c-driver-1.26.0/.evergreen/config_generator/000077500000000000000000000000001456567454500220305ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/README.md000066400000000000000000000025621456567454500233140ustar00rootroot00000000000000# Generating the Evergreen Configuration Files The scripts in this directory are used to generate the Evergreen configuration files stored in `.evergreen/generated_configs/`. The easiest way to execute these scripts is using the Poetry to install the dependencies and then run the scripts. **Note**: These scripts require Python 3.10 or newer. ## Setting Up Before running, use Poetry to install a virtualenv containing the dependencies. This can be done by using the `poetry.sh` (or `poetry.ps1`) script contained in the `tools/` directory at the root of the `mongo-c-driver` repository: ```sh ./tools/poetry.sh install --with=dev ``` Or with PowerShell: ```pwsh ./tools/poetry.ps1 install --with=dev ``` ## Running the Generator The package defines a program `mc-evg-generate`, which can be run within the virtualenv. This can be done via Poetry as well, following the setup: ```sh ./tools/poetry.sh run mc-evg-generate ``` This command will ready the generation files and generate a new set of Evergreen configs in `.evergreen/config_generator/generated_configs`. The `mc-evg-generate` command executes `main` function defined in `config_generator/generate.py`. ## Modifying the Configs To modify the Evergreen configuration, update the Python scripts within the `etc/`, `config_generator/`, and `legacy_config_generator/` directories, and execute `mc-evg-generate` again. mongo-c-driver-1.26.0/.evergreen/config_generator/components/000077500000000000000000000000001456567454500242155ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/components/abi_compliance_check.py000066400000000000000000000035151456567454500306550ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_command import s3_put from shrub.v3.evg_task import EvgTask from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class CheckABICompliance(Function): name = 'abi-compliance-check' commands = [ bash_exec( command_type=EvgCommandType.SETUP, add_expansions_to_env=True, working_dir='mongoc', script='.evergreen/scripts/abi-compliance-check.sh' ), bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', env={ 'AWS_ACCESS_KEY_ID': '${aws_key}', 'AWS_SECRET_ACCESS_KEY': '${aws_secret}', }, script='''\ aws s3 cp abi-compliance/compat_reports s3://mciuploads/${project}/${build_variant}/${revision}/${version_id}/${build_id}/abi-compliance/compat_reports --recursive --acl public-read --region us-east-1 [[ ! -f ./abi-compliance/abi-error.txt ]] ''' ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='text/html', display_name='ABI Report:', local_files_include_filter='mongoc/abi-compliance/compat_reports/**/*.html', permissions='public-read', remote_file='${project}/${build_variant}/${revision}/${version_id}/${build_id}/abi-compliance/compat_report.html', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return CheckABICompliance.defn() def tasks(): return [ EvgTask( name=CheckABICompliance.name, commands=[CheckABICompliance.call()], ) ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/c_std_compile.py000066400000000000000000000053221456567454500273750ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.distros import find_large_distro from config_generator.etc.distros import make_distro_str from config_generator.etc.distros import to_cc from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec from config_generator.etc.utils import Task TAG = 'std-matrix' # pylint: disable=line-too-long # fmt: off MATRIX = [ ('archlinux', 'clang', None, [11, ]), ('debian92', 'clang', None, [11, ]), ('ubuntu1604', 'clang', 'i686', [11, ]), ('ubuntu1604', 'clang', None, [11, ]), ('ubuntu1804', 'clang', 'i686', [11, ]), ('ubuntu1804', 'gcc', None, [11, ]), ('debian10', 'clang', None, [11, ]), ('debian10', 'gcc', None, [11, 17]), ('debian11', 'clang', None, [11, ]), ('debian11', 'gcc', None, [11, 17]), ('ubuntu2004', 'clang', None, [11, ]), ('ubuntu2004', 'gcc', None, [11, ]), ('windows-vsCurrent', 'vs2017x64', None, [11, 17]), ] # fmt: on # pylint: enable=line-too-long class StdCompile(Function): name = 'std-compile' commands = [ bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, working_dir='mongoc', script='.evergreen/scripts/compile-std.sh', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return StdCompile.defn() def tasks(): res = [] for distro_name, compiler, arch, stds in MATRIX: tags = [TAG, distro_name, compiler, 'compile'] distro = find_large_distro(distro_name) compile_vars = None compile_vars = {'CC': to_cc(compiler)} if arch: tags.append(arch) compile_vars.update({'MARCH': arch}) distro_str = make_distro_str(distro_name, compiler, arch) for std in stds: with_std = {'C_STD_VERSION': std} task_name = f'std-c{std}-{distro_str}-compile' res.append( Task( name=task_name, run_on=distro.name, tags=tags + [f'std-c{std}'], commands=[StdCompile.call(vars=compile_vars | with_std)], ) ) return res def variants(): return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/check_mongoc_public_headers.py000066400000000000000000000016551456567454500322460ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_task import EvgTask from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class CheckMongocPublicHeaders(Function): name = 'check-headers' commands = [ bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', script='.evergreen/scripts/check-public-decls.sh', ), bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', script='.evergreen/scripts/check-preludes.py .', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return CheckMongocPublicHeaders.defn() def tasks(): return [ EvgTask( name=CheckMongocPublicHeaders.name, commands=[CheckMongocPublicHeaders.call()], ) ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/cse/000077500000000000000000000000001456567454500247675ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/components/cse/darwinssl.py000066400000000000000000000034641456567454500273560ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.cse.compile import CompileCommon from config_generator.etc.cse.test import generate_test_tasks SSL = 'darwinssl' TAG = f'cse-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('macos-1100', 'clang', None, ['cyrus']), ] # TODO (CDRIVER-3789): test cse with the 'sharded' topology. TEST_MATRIX = [ ('macos-1100', 'clang', None, 'cyrus', ['auth'], ['server', 'replica' ], ['4.2', '4.4', '5.0', '6.0' ]), # Test 7.0+ with a replica set since Queryable Encryption does not support the 'server' topology. Queryable Encryption tests require 7.0+. ('macos-1100', 'clang', None, 'cyrus', ['auth'], ['server', 'replica' ], [ '7.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long class DarwinSSLCompileCommon(CompileCommon): ssl = 'DARWIN' class SaslCyrusDarwinSSLCompile(DarwinSSLCompileCommon): name = 'cse-sasl-cyrus-darwinssl-compile' commands = DarwinSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return SaslCyrusDarwinSSLCompile.defn() def tasks(): res = [] SASL_TO_FUNC = { 'cyrus': SaslCyrusDarwinSSLCompile, } MORE_TAGS = ['cse'] res += generate_compile_tasks( SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS ) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = { 'CLIENT_SIDE_ENCRYPTION': 'on', 'DEBUG': 'ON', } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/cse/openssl.py000066400000000000000000000063221456567454500270270ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.function import merge_defns from config_generator.etc.cse.compile import CompileCommon from config_generator.etc.cse.test import generate_test_tasks SSL = 'openssl' TAG = f'cse-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('debian10', 'gcc', None, ['cyrus']), ('debian11', 'gcc', None, ['cyrus']), ('debian92', 'clang', None, ['cyrus']), ('debian92', 'gcc', None, ['cyrus']), ('rhel80', 'gcc', None, ['cyrus']), ('rhel83-zseries', 'gcc', None, ['cyrus']), ('ubuntu1604', 'clang', None, ['cyrus']), ('ubuntu1804-arm64', 'gcc', None, ['cyrus']), ('ubuntu1804', 'gcc', None, ['cyrus']), ('ubuntu2004', 'gcc', None, ['cyrus']), ('ubuntu2004-arm64', 'gcc', None, ['cyrus']), ('windows-vsCurrent', 'vs2017x64', None, ['cyrus']), ] # TODO (CDRIVER-3789): test cse with the 'sharded' topology. TEST_MATRIX = [ # 4.2 and 4.4 not available on rhel83-zseries. ('rhel83-zseries', 'gcc', None, 'cyrus', ['auth'], ['server'], ['5.0']), ('ubuntu1804-arm64', 'gcc', None, 'cyrus', ['auth'], ['server'], ['4.2', '4.4', '5.0', '6.0' ]), ('ubuntu1804', 'gcc', None, 'cyrus', ['auth'], ['server'], ['4.2', '4.4', '5.0', '6.0' ]), ('windows-vsCurrent', 'vs2017x64', None, 'cyrus', ['auth'], ['server'], ['4.2', '4.4', '5.0', '6.0' ]), # Test 7.0+ with a replica set since Queryable Encryption does not support the 'server' topology. Queryable Encryption tests require 7.0+. # Test 7.0+ with Ubuntu 20.04+ since MongoDB 7.0 no longer ships binaries for Ubuntu 18.04. ('ubuntu2004', 'gcc', None, 'cyrus', ['auth'], ['server', 'replica'], [ '7.0', 'latest']), ('rhel83-zseries', 'gcc', None, 'cyrus', ['auth'], ['server', 'replica'], [ '7.0', 'latest']), ('ubuntu2004-arm64', 'gcc', None, 'cyrus', ['auth'], ['server', 'replica'], [ '7.0', 'latest']), ('windows-vsCurrent', 'vs2017x64', None, 'cyrus', ['auth'], ['server', 'replica'], [ '7.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long class OpenSSLCompileCommon(CompileCommon): ssl = 'OPENSSL' class SaslCyrusOpenSSLCompile(OpenSSLCompileCommon): name = 'cse-sasl-cyrus-openssl-compile' commands = OpenSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return merge_defns( SaslCyrusOpenSSLCompile.defn(), ) def tasks(): res = [] SASL_TO_FUNC = { 'cyrus': SaslCyrusOpenSSLCompile, } MORE_TAGS = ['cse'] res += generate_compile_tasks( SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS ) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = { 'CLIENT_SIDE_ENCRYPTION': 'on', 'DEBUG': 'ON', } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/cse/winssl.py000066400000000000000000000035371456567454500266700ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.cse.compile import CompileCommon from config_generator.etc.cse.test import generate_test_tasks SSL = 'winssl' TAG = f'cse-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('windows-64-vs2015', 'vs2015x64', None, ['cyrus']), ('windows-vsCurrent', 'vs2017x64', None, ['cyrus']), ] # TODO (CDRIVER-3789): test cse with the 'sharded' topology. TEST_MATRIX = [ ('windows-vsCurrent', 'vs2017x64', None, 'cyrus', ['auth'], ['server'], ['4.2', '4.4', '5.0', '6.0' ]), # Test 7.0+ with a replica set since Queryable Encryption does not support the 'server' topology. Queryable Encryption tests require 7.0+. ('windows-vsCurrent', 'vs2017x64', None, 'cyrus', ['auth'], ['server', 'replica' ], [ '7.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long class WinSSLCompileCommon(CompileCommon): ssl = 'WINDOWS' class SaslCyrusWinSSLCompile(WinSSLCompileCommon): name = 'cse-sasl-cyrus-winssl-compile' commands = WinSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return SaslCyrusWinSSLCompile.defn() def tasks(): res = [] SASL_TO_FUNC = { 'cyrus': SaslCyrusWinSSLCompile, } MORE_TAGS = ['cse'] res += generate_compile_tasks( SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS ) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = { 'CLIENT_SIDE_ENCRYPTION': 'on', 'DEBUG': 'ON', } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/early_termination.py000066400000000000000000000010441456567454500303130ustar00rootroot00000000000000from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class EarlyTermination(Function): name = 'early-termination' commands = [ bash_exec( script='''\ echo 'EVERGREEN HOST WAS UNEXPECTEDLY TERMINATED!!!' 1>&2 echo 'Restart this Evergreen task and try again!' 1>&2 ''' ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return EarlyTermination.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/earthly.py000066400000000000000000000150371456567454500262450ustar00rootroot00000000000000from __future__ import annotations import functools import itertools from typing import Any, Iterable, Literal, TypeVar, get_args, NamedTuple, get_type_hints from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from ..etc.utils import Task from shrub.v3.evg_command import subprocess_exec, EvgCommandType T = TypeVar("T") _ENV_PARAM_NAME = "MONGOC_EARTHLY_ENV" "The name of the EVG expansion parameter used to key the Earthly build env" EnvKey = Literal["u22", "alpine3.18", "archlinux"] "Identifiers for environments. These correspond to special '*-env' targets in the Earthfile." _ENV_NAMES: dict[EnvKey, str] = { "u22": "Ubuntu 22.04", "alpine3.18": "Alpine 3.18", "archlinux": "Arch Linux", } "A mapping from environment keys to 'pretty' environment names" # Other options: SSPI (Windows only), AUTO (not reliably test-able without more environments) SASLOption = Literal["Cyrus", "off"] "Valid options for the SASL configuration parameter" TLSOption = Literal["LibreSSL", "OpenSSL", "off"] "Options for the TLS backend configuration parameter (AKA 'ENABLE_SSL')" CxxVersion = Literal["master", "r3.8.0"] "C++ driver refs that are under CI test" # A Unicode non-breaking space character _BULLET = "\N{Bullet}" class Configuration(NamedTuple): """ Represent a complete set of argument values to give to the Earthly task execution. Each field name matches the ARG in the Earthfile. Adding/removing fields will add/remove dimensions on the task matrix. The 'env' parameter is not encoded here, but is managed separately. Keep this in sync with the 'PartialConfiguration' class defined below! """ sasl: SASLOption tls: TLSOption test_mongocxx_ref: CxxVersion @classmethod def all(cls) -> Iterable[Configuration]: """ Generate all configurations for all options of our parameters. """ # Iter each configuration parameter: fields: Iterable[tuple[str, type]] = get_type_hints(Configuration).items() # Generate lists of pairs of parameter names their options: all_pairs: Iterable[Iterable[tuple[str, str]]] = ( # Generate a (key, opt) pair for each option in parameter 'key' [(key, opt) for opt in get_args(typ)] # Over each parameter and type thereof: for key, typ in fields ) # Now generate the cross product of all alternative for all options: matrix: Iterable[dict[str, Any]] = map(dict, itertools.product(*all_pairs)) for items in matrix: # Convert each item to a Configuration: yield Configuration(**items) @property def suffix(self) -> str: return f"{_BULLET}".join(f"{k}={v}" for k, v in self._asdict().items()) def task_filter(env: EnvKey, conf: Configuration) -> bool: """ Control which tasks are actually defined by matching on the platform and configuration values. """ match env, conf: # We only need one task with "sasl=off" case "u22", ("off", "OpenSSL", "master"): return True # Other sasl=off tasks we'll just ignore: case _, ("off", _tls, _cxx): return False # Ubuntu does not ship with a LibreSSL package: case e, (_sasl, "LibreSSL", _cxx) if _ENV_NAMES[e].startswith("Ubuntu"): return False # Anything else: Allow it to run: case _: return True def envs_for(config: Configuration) -> Iterable[EnvKey]: """Get all environment keys that are not excluded for the given configuration""" all_envs: tuple[EnvKey, ...] = get_args(EnvKey) allow_env_for_config = functools.partial(task_filter, conf=config) return filter(allow_env_for_config, all_envs) def earthly_task( *, name: str, targets: Iterable[str], config: Configuration, ) -> Task | None: # Attach "earthly-xyz" tags to the task to allow build variants to select # these tasks by the environment of that variant. env_tags = sorted(f"earthly-{e}" for e in sorted(envs_for(config))) if not env_tags: # All environments have been excluded for this configuration. This means # the task itself should not be run: return # Generate the build-arg arguments based on the configuration options. The # NamedTuple field names must match with the ARG keys in the Earthfile! earthly_args = [f"--{key}={val}" for key, val in config._asdict().items()] return Task( name=name, commands=[ # First, just build the "env-warmup" which will prepare the build environment. # This won't generate any output, but allows EVG to track it as a separate build step # for timing and logging purposes. The subequent build step will cache-hit the # warmed-up build environments. subprocess_exec( "bash", args=[ "tools/earthly.sh", "+env-warmup", f"--env=${{{_ENV_PARAM_NAME}}}", *earthly_args, ], working_dir="mongoc", command_type=EvgCommandType.SETUP, ), # Now execute the main tasks: subprocess_exec( "bash", args=[ "tools/earthly.sh", "+run", f"--targets={' '.join(targets)}", f"--env=${{{_ENV_PARAM_NAME}}}", *earthly_args, ], working_dir="mongoc", command_type=EvgCommandType.TEST, ), ], tags=[f"earthly", "pr-merge-gate", *env_tags], run_on=CONTAINER_RUN_DISTROS, ) CONTAINER_RUN_DISTROS = [ "ubuntu2204-small", "ubuntu2204-large", "ubuntu2004-small", "ubuntu2004", "ubuntu1804", "ubuntu1804-medium", "debian10", "debian11", "amazon2", ] def tasks() -> Iterable[Task]: for conf in Configuration.all(): task = earthly_task( name=f"check:{conf.suffix}", targets=("test-example", "test-cxx-driver"), config=conf, ) if task is not None: yield task def variants() -> list[BuildVariant]: envs: tuple[EnvKey, ...] = get_args(EnvKey) return [ BuildVariant( name=f"earthly-{env}", tasks=[EvgTaskRef(name=f".earthly-{env}")], display_name=_ENV_NAMES[env], expansions={ _ENV_PARAM_NAME: env, }, ) for env in envs ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/000077500000000000000000000000001456567454500253335ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/backtrace.py000066400000000000000000000006701456567454500276270ustar00rootroot00000000000000from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class Backtrace(Function): name = 'backtrace' commands = [ bash_exec( working_dir='mongoc', script='.evergreen/scripts/debug-core-evergreen.sh', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return Backtrace.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/bootstrap_mongo_orchestration.py000066400000000000000000000015001456567454500340610ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_command import expansions_update from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class BootstrapMongoOrchestration(Function): name = 'bootstrap-mongo-orchestration' command_type = EvgCommandType.SETUP commands = [ bash_exec( command_type=command_type, working_dir='mongoc', script='.evergreen/scripts/integration-tests.sh', add_expansions_to_env=True, ), expansions_update( command_type=command_type, file='mongoc/mo-expansion.yml' ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return BootstrapMongoOrchestration.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/fetch_build.py000066400000000000000000000026051456567454500301600ustar00rootroot00000000000000from shrub.v3.evg_command import archive_targz_extract from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_command import s3_get from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class FetchBuild(Function): name = 'fetch-build' command_type = EvgCommandType.SETUP commands = [ bash_exec(command_type=command_type, script='rm -rf mongoc'), s3_get( command_type=command_type, aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', local_file='build.tar.gz', remote_file='${project}/${build_variant}/${revision}/${BUILD_NAME}/${build_id}.tar.gz', ), archive_targz_extract(path='build.tar.gz', destination='mongoc'), # Scripts may not be executable on Windows. bash_exec( command_type=command_type, working_dir='mongoc', script='''\ for file in $(find .evergreen/scripts -type f); do chmod +rx "$file" || exit done ''' ), ] @classmethod def call(cls, build_name, vars=None, **kwargs): if vars is None: vars = {} vars.update({'BUILD_NAME': build_name}) return cls.default_call(vars=vars, **kwargs) def functions(): return FetchBuild.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/fetch_det.py000066400000000000000000000027511456567454500276370ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_command import expansions_update from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class FetchDET(Function): name = 'fetch-det' commands = [ bash_exec( command_type=EvgCommandType.SETUP, script='''\ if [[ ! -d drivers-evergreen-tools ]]; then git clone --depth=1 git@github.com:mongodb-labs/drivers-evergreen-tools.git fi ''', ), # Make shell scripts executable. bash_exec( command_type=EvgCommandType.SETUP, working_dir="drivers-evergreen-tools", script='find .evergreen -type f -name "*.sh" -exec chmod +rx "{}" \;', ), # python is used frequently enough by many tasks that it is worth # running find_python3 once here and reusing the result. bash_exec( command_type=EvgCommandType.SETUP, script='''\ set -o errexit . drivers-evergreen-tools/.evergreen/find-python3.sh echo "PYTHON3_BINARY: $(find_python3)" >|python3_binary.yml ''', ), expansions_update( command_type=EvgCommandType.SETUP, file='python3_binary.yml', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return FetchDET.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/fetch_source.py000066400000000000000000000036631456567454500303660ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_command import expansions_update from shrub.v3.evg_command import git_get_project from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class FetchSource(Function): name = 'fetch-source' command_type = EvgCommandType.SETUP commands = [ git_get_project(command_type=command_type, directory='mongoc'), bash_exec( command_type=command_type, working_dir='mongoc', script='''\ set -o errexit set -o pipefail if [ -n "${github_pr_number}" -o "${is_patch}" = "true" ]; then # This is a GitHub PR or patch build, probably branched from master if command -v python3 &>/dev/null; then # Prefer python3 if it is available echo $(python3 ./build/calc_release_version.py --next-minor) > VERSION_CURRENT else echo $(python ./build/calc_release_version.py --next-minor) > VERSION_CURRENT fi VERSION=$VERSION_CURRENT-${version_id} else VERSION=latest fi echo "CURRENT_VERSION: $VERSION" > expansion.yml ''' ), expansions_update(command_type=command_type, file='mongoc/expansion.yml'), # Scripts may not be executable on Windows. bash_exec( command_type=EvgCommandType.SETUP, working_dir='mongoc', script='''\ for file in $(find .evergreen/scripts -type f); do chmod +rx "$file" || exit done ''' ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return FetchSource.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/prepare_kerberos.py000066400000000000000000000022451456567454500312420ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class PrepareKerberos(Function): name = 'prepare-kerberos' commands = [ bash_exec( command_type=EvgCommandType.SETUP, working_dir='mongoc', silent=True, script='''\ if test "${keytab|}" && command -v kinit >/dev/null; then echo "${keytab}" > /tmp/drivers.keytab.base64 base64 --decode /tmp/drivers.keytab.base64 > /tmp/drivers.keytab if touch /etc/krb5.conf 2>/dev/null; then cat .evergreen/etc/kerberos.realm | tee -a /etc/krb5.conf elif command sudo true 2>/dev/null; then cat .evergreen/etc/kerberos.realm | sudo tee -a /etc/krb5.conf else echo "Cannot append kerberos.realm to /etc/krb5.conf; skipping." 1>&2 fi fi ''' ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return PrepareKerberos.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/restore_instance_profile.py000066400000000000000000000026271456567454500330030ustar00rootroot00000000000000from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class RestoreInstanceProfile(Function): name = 'restore-instance-profile' commands = [ bash_exec( script='''\ # Restore the AWS Instance Profile that may have been removed in AWS tasks. if [[ ! -d drivers-evergreen-tools ]]; then echo "drivers-evergreen-tools not present ... skipping" exit 0 fi cd drivers-evergreen-tools/.evergreen/auth_aws if [[ ! -f aws_e2e_setup.json ]]; then echo "aws_e2e_setup.json not present ... skipping" exit 0 fi . ./activate-authawsvenv.sh echo "restoring instance profile ... " # Capture and hide logs on success. Logs may included expected `HTTP Error 404: Not Found` messages when checking for instance profile. if ! { python ./lib/aws_assign_instance_profile.py 2>&1 >|output.txt; }; then echo "restoring instance profile ... failed" cat output.txt 1>&2 exit 1 fi echo "restoring instance profile ... succeeded" ''' ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return RestoreInstanceProfile.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/run_mock_kms_servers.py000066400000000000000000000055721456567454500321560ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class RunMockKMSServers(Function): name = 'run-mock-kms-servers' command_type = EvgCommandType.SETUP commands = [ # This command ensures future invocations of activate-kmstlsvenv.sh conducted in # parallel do not race to setup a venv environment; it has already been prepared. # This primarily addresses the situation where the "run tests" and "run-mock-kms-servers" # functions invoke 'activate-kmstlsvenv.sh' simultaneously. # TODO: remove this function along with the "run-mock-kms-servers" function. bash_exec( command_type=command_type, working_dir='drivers-evergreen-tools/.evergreen/csfle', script='''\ set -o errexit echo "Preparing KMS TLS venv environment..." # TODO: remove this function along with the "run kms servers" function. if [[ "$OSTYPE" =~ cygwin && ! -d kmstlsvenv ]]; then # Avoid using Python 3.10 on Windows due to incompatible cipher suites. # See CDRIVER-4530. . ../venv-utils.sh venvcreate "C:/python/Python39/python.exe" kmstlsvenv || # windows-2017 venvcreate "C:/python/Python38/python.exe" kmstlsvenv # windows-2015 python -m pip install --upgrade boto3~=1.19 pykmip~=0.10.0 "sqlalchemy<2.0.0" deactivate else . ./activate-kmstlsvenv.sh deactivate fi echo "Preparing KMS TLS venv environment... done." ''', ), bash_exec( command_type=command_type, background=True, working_dir='drivers-evergreen-tools/.evergreen/csfle', script='''\ set -o errexit echo "Starting mock KMS TLS servers..." . ./activate-kmstlsvenv.sh python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --port 8999 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/expired.pem --port 9000 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/wrong-host.pem --port 9001 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --require_client_cert --port 9002 & python -u kms_kmip_server.py & deactivate echo "Starting mock KMS TLS servers... done." ''', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return RunMockKMSServers.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/run_simple_http_server.py000066400000000000000000000015661456567454500325170ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class RunSimpleHTTPServer(Function): name = 'run-simple-http-server' command_type = EvgCommandType.SETUP commands = [ bash_exec( command_type=command_type, background=True, working_dir='mongoc', script='''\ set -o errexit echo "Starting simple HTTP server..." command -V "${PYTHON3_BINARY}" >/dev/null "${PYTHON3_BINARY}" .evergreen/scripts/simple_http_server.py echo "Starting simple HTTP server... done." ''', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return RunSimpleHTTPServer.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/run_tests.py000066400000000000000000000010621456567454500277320ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class RunTests(Function): name = 'run-tests' commands = [ bash_exec( command_type=EvgCommandType.TEST, script='.evergreen/scripts/run-tests.sh', working_dir='mongoc', add_expansions_to_env=True, ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return RunTests.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/stop_load_balancer.py000066400000000000000000000014241456567454500315210ustar00rootroot00000000000000from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class StopLoadBalancer(Function): name = 'stop-load-balancer' commands = [ bash_exec( script='''\ # Only run if a load balancer was started. if [[ -z "${SINGLE_MONGOS_LB_URI}" ]]; then echo "OK - no load balancer running" exit fi if [[ -d drivers-evergreen-tools ]]; then cd drivers-evergreen-tools && .evergreen/run-load-balancer.sh stop fi ''' ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return StopLoadBalancer.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/stop_mongo_orchestration.py000066400000000000000000000010241456567454500330320ustar00rootroot00000000000000from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class StopMongoOrchestration(Function): name = 'stop-mongo-orchestration' commands = [ bash_exec( script='''\ if [[ -d MO ]]; then cd MO && mongo-orchestration stop fi ''' ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return StopMongoOrchestration.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/upload_build.py000066400000000000000000000015641456567454500303560ustar00rootroot00000000000000from config_generator.etc.function import Function from shrub.v3.evg_command import archive_targz_pack from shrub.v3.evg_command import s3_put class UploadBuild(Function): name = 'upload-build' commands = [ archive_targz_pack( target='${build_id}.tar.gz', source_dir='mongoc', include=['./**'], ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', remote_file='${project}/${build_variant}/${revision}/${task_name}/${build_id}.tar.gz', bucket='mciuploads', permissions='public-read', local_file='${build_id}.tar.gz', content_type='${content_type|application/x-gzip}', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return UploadBuild.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/upload_mo_artifacts.py000066400000000000000000000067361456567454500317400ustar00rootroot00000000000000from shrub.v3.evg_command import archive_targz_pack from shrub.v3.evg_command import s3_put from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class UploadMOArtifacts(Function): name = 'upload-mo-artifacts' commands = [ bash_exec( working_dir='mongoc', script='''\ set -o errexit declare dir="MO" if [[ -d "/cygdrive/c/data/mo" ]]; then dir="/cygdrive/c/data/mo" fi if [[ -d "$dir" ]]; then find "$dir" -name \\*.log | xargs tar czf mongodb-logs.tar.gz fi ''' ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='${content_type|application/x-gzip}', display_name='mongodb-logs.tar.gz', local_file='mongoc/mongodb-logs.tar.gz', optional=True, permissions='public-read', remote_file='${project}/${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-mongodb-logs.tar.gz', ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='${content_type|text/plain}', display_name='orchestration.log', local_file='mongoc/MO/server.log', optional=True, permissions='public-read', remote_file='${project}/${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-orchestration.log', ), bash_exec( working_dir='mongoc', script='''\ set -o errexit # Find all core files from mongodb in orchestration and move to mongoc declare dir="MO" if [[ -d "/cygdrive/c/data/mo" ]]; then dir="/cygdrive/c/data/mo" fi declare mdmp_dir="$dir" if [[ -d "/cygdrive/c/mongodb" ]]; then mdmp_dir="/cygdrive/c/mongodb" fi for core_file in $(find -H "$dir" "$mdmp_dir" \\( -name "*.core" -o -name "*.mdmp" \\) 2> /dev/null); do declare base_name base_name="$(echo "$core_file" | sed "s/.*\\///")" # Move file if it does not already exist if [[ ! -f "$base_name" ]]; then mv "$core_file" . fi done ''' ), archive_targz_pack( target='mongo-coredumps.tgz', source_dir='mongoc', include=[ './**.core', './**.mdmp', ], ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='${content_type|application/x-gzip}', display_name='Core Dumps - Execution ${execution}', local_file='mongo-coredumps.tgz', optional=True, permissions='public-read', remote_file='${project}/${build_variant}/${revision}/${version_id}/${build_id}/coredumps/${task_id}-${execution}-coredumps.log', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return UploadMOArtifacts.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/funcs/upload_test_results.py000066400000000000000000000012751456567454500320160ustar00rootroot00000000000000from shrub.v3.evg_command import attach_results from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class UploadTestResults(Function): name = 'upload-test-results' commands = [ # Ensure attach_results does not fail even if no tests results exist. bash_exec( script='''\ mkdir -p mongoc touch mongoc/test-results.json ''' ), attach_results( file_location='mongoc/test-results.json' ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return UploadTestResults.defn() mongo-c-driver-1.26.0/.evergreen/config_generator/components/kms_divergence_check.py000066400000000000000000000014711456567454500307140ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_command import s3_put from shrub.v3.evg_task import EvgTask from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class KmsDivergenceCheck(Function): name = "kms-divergence-check" commands = [ bash_exec( command_type=EvgCommandType.TEST, working_dir="mongoc", script=".evergreen/scripts/kms-divergence-check.sh" ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return KmsDivergenceCheck.defn() def tasks(): return [ EvgTask( name=KmsDivergenceCheck.name, commands=[ KmsDivergenceCheck.call(), ], ) ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/loadbalanced.py000066400000000000000000000106431456567454500271640ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType, FunctionCall, expansions_update from shrub.v3.evg_task import EvgTaskRef, EvgTaskDependency from config_generator.components.funcs.bootstrap_mongo_orchestration import BootstrapMongoOrchestration from config_generator.components.funcs.fetch_build import FetchBuild from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.run_simple_http_server import RunSimpleHTTPServer from config_generator.components.funcs.run_tests import RunTests from config_generator.components.funcs.upload_build import UploadBuild from config_generator.etc.distros import make_distro_str, find_small_distro, find_large_distro from config_generator.etc.utils import Task, bash_exec # Use `rhel8.7` distro. `rhel8.7` distro includes necessary dependency: `haproxy`. _DISTRO_NAME = "rhel87" _COMPILER = "gcc" def functions(): return { 'start-load-balancer': [ bash_exec( command_type=EvgCommandType.SETUP, script='''\ export DRIVERS_TOOLS=./drivers-evergreen-tools export MONGODB_URI="${MONGODB_URI}" $DRIVERS_TOOLS/.evergreen/run-load-balancer.sh start ''', ), expansions_update( command_type=EvgCommandType.SETUP, file='lb-expansion.yml', ) ] } def make_test_task(auth: bool, ssl: bool, server_version: str): auth_str = "auth" if auth else "noauth" ssl_str = "openssl" if ssl else "nossl" distro_str = make_distro_str(_DISTRO_NAME, _COMPILER, None) return Task( name=f"loadbalanced-{distro_str}-test-{server_version}-{auth_str}-{ssl_str}", depends_on=[EvgTaskDependency( name=f"loadbalanced-{distro_str}-compile")], run_on=find_small_distro(_DISTRO_NAME).name, tags=['loadbalanced', _DISTRO_NAME, _COMPILER, auth_str, ssl_str], commands=[ FetchBuild.call(build_name=f"loadbalanced-{distro_str}-compile"), FetchDET.call(), BootstrapMongoOrchestration().call(vars={ 'AUTH': auth_str, 'SSL': ssl_str, 'MONGODB_VERSION': server_version, 'TOPOLOGY': 'sharded_cluster', 'LOAD_BALANCER': 'on', }), RunSimpleHTTPServer.call(), FunctionCall(func='start-load-balancer', vars={ 'MONGODB_URI': 'mongodb://localhost:27017,localhost:27018' }), RunTests().call(vars={ 'AUTH': auth_str, 'SSL': ssl_str, 'LOADBALANCED': 'loadbalanced', 'CC': _COMPILER, }) ], ) def tasks(): distro_str = make_distro_str(_DISTRO_NAME, _COMPILER, None) yield Task( name=f"loadbalanced-{distro_str}-compile", run_on=find_large_distro(_DISTRO_NAME).name, tags=['loadbalanced', _DISTRO_NAME, _COMPILER], commands=[ bash_exec( command_type=EvgCommandType.TEST, env={ 'CC': _COMPILER, 'CFLAGS': '-fno-omit-frame-pointer', 'EXTRA_CONFIGURE_FLAGS': '-DENABLE_EXTRA_ALIGNMENT=OFF', 'SSL': 'OPENSSL' }, working_dir='mongoc', script='.evergreen/scripts/compile.sh', ), UploadBuild.call() ], ) # Satisfy requirements specified in # https://github.com/mongodb/specifications/blob/14916f76fd92b2686d8e3d1f0e4c2d2ef88ca5a7/source/load-balancers/tests/README.rst#testing-requirements # # > For each server version that supports load balanced clusters, drivers # > MUST add two Evergreen tasks: one with a sharded cluster with both # > authentication and TLS enabled and one with a sharded cluster with # > authentication and TLS disabled. server_versions = ['5.0', '6.0', '7.0', 'latest'] for server_version in server_versions: yield make_test_task(auth=False, ssl=False, server_version=server_version) yield make_test_task(auth=True, ssl=True, server_version=server_version) def variants(): return [ BuildVariant( name="loadbalanced", display_name="loadbalanced", tasks=[EvgTaskRef(name='.loadbalanced')] ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/make_docs.py000066400000000000000000000111361456567454500265160ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_command import s3_put from shrub.v3.evg_task import EvgTask from config_generator.etc.function import Function from config_generator.etc.function import merge_defns from config_generator.etc.utils import bash_exec class MakeDocs(Function): name = "make-docs" commands = [ bash_exec( command_type=EvgCommandType.TEST, working_dir="mongoc", include_expansions_in_env=["distro_id"], script="""\ set -o errexit bash tools/poetry.sh install --with=docs # See SphinxBuild.cmake for EVG_DOCS_BUILD reasoning bash tools/poetry.sh run env EVG_DOCS_BUILD=1 bash .evergreen/scripts/build-docs.sh """, ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) class UploadDocs(Function): name = "upload-docs" commands = [ bash_exec( working_dir="mongoc/_build/for-docs/src/libbson", env={ "AWS_ACCESS_KEY_ID": "${aws_key}", "AWS_SECRET_ACCESS_KEY": "${aws_secret}", }, script="aws s3 cp doc/html s3://mciuploads/${project}/docs/libbson/${CURRENT_VERSION} --quiet --recursive --acl public-read --region us-east-1", ), s3_put( aws_key="${aws_key}", aws_secret="${aws_secret}", bucket="mciuploads", content_type="text/html", display_name="libbson docs", local_file="mongoc/_build/for-docs/src/libbson/doc/html/index.html", permissions="public-read", remote_file="${project}/docs/libbson/${CURRENT_VERSION}/index.html", ), bash_exec( working_dir="mongoc/_build/for-docs/src/libmongoc", env={ "AWS_ACCESS_KEY_ID": "${aws_key}", "AWS_SECRET_ACCESS_KEY": "${aws_secret}", }, script="aws s3 cp doc/html s3://mciuploads/${project}/docs/libmongoc/${CURRENT_VERSION} --quiet --recursive --acl public-read --region us-east-1", ), s3_put( aws_key="${aws_key}", aws_secret="${aws_secret}", bucket="mciuploads", content_type="text/html", display_name="libmongoc docs", local_file="mongoc/_build/for-docs/src/libmongoc/doc/html/index.html", permissions="public-read", remote_file="${project}/docs/libmongoc/${CURRENT_VERSION}/index.html", ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) class UploadManPages(Function): name = "upload-man-pages" commands = [ bash_exec( working_dir="mongoc", silent=True, script="""\ set -o errexit # Get "aha", the ANSI HTML Adapter. git clone --depth 1 https://github.com/theZiz/aha.git aha-repo pushd aha-repo make popd # aha-repo mv aha-repo/aha . .evergreen/scripts/man-pages-to-html.sh libbson _build/for-docs/src/libbson/doc/man > bson-man-pages.html .evergreen/scripts/man-pages-to-html.sh libmongoc _build/for-docs/src/libmongoc/doc/man > mongoc-man-pages.html """, ), s3_put( aws_key="${aws_key}", aws_secret="${aws_secret}", bucket="mciuploads", content_type="text/html", display_name="libbson man pages", local_file="mongoc/bson-man-pages.html", permissions="public-read", remote_file="${project}/man-pages/libbson/${CURRENT_VERSION}/index.html", ), s3_put( aws_key="${aws_key}", aws_secret="${aws_secret}", bucket="mciuploads", content_type="text/html", display_name="libmongoc man pages", local_file="mongoc/mongoc-man-pages.html", permissions="public-read", remote_file="${project}/man-pages/libmongoc/${CURRENT_VERSION}/index.html", ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return merge_defns( MakeDocs.defn(), UploadDocs.defn(), UploadManPages.defn(), ) def tasks(): return [ EvgTask( name="make-docs", commands=[ MakeDocs.call(), UploadDocs.call(), UploadManPages.call(), ], ) ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/mock_server.py000066400000000000000000000032301456567454500271040ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_task import EvgTaskRef from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.run_simple_http_server import RunSimpleHTTPServer from config_generator.etc.utils import Task from config_generator.etc.utils import bash_exec def tasks(): return [ Task( name="mock-server-test", run_on="ubuntu2204-small", commands=[ # Call fetch-det to define PYTHON3_BINARY expansion required for run-simple-http-server. FetchDET.call(), RunSimpleHTTPServer.call(), bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, working_dir='mongoc', script='.evergreen/scripts/compile.sh', ), bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', script='.evergreen/scripts/run-mock-server-tests.sh', ) ], ) ] def variants(): return [ BuildVariant( name="mock-server-test", display_name="Mock Server Test", tasks=[EvgTaskRef(name='mock-server-test')], expansions={ 'CC': 'gcc', 'ASAN': 'on', 'CFLAGS': '-fno-omit-frame-pointer', 'EXTRA_CONFIGURE_FLAGS': '-DENABLE_EXTRA_ALIGNMENT=OFF', 'SANITIZE': 'address,undefined', } ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/openssl_static_compile.py000066400000000000000000000040241456567454500313310ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.distros import find_large_distro from config_generator.etc.distros import make_distro_str from config_generator.etc.distros import to_cc from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec from config_generator.etc.utils import Task SSL = 'openssl-static' TAG = f'{SSL}-matrix' # pylint: disable=line-too-long # fmt: off MATRIX = [ ('debian92', 'gcc', None), ('debian10', 'gcc', None), ('debian11', 'gcc', None), ('ubuntu2004', 'gcc', None), ] # fmt: on # pylint: enable=line-too-long class StaticOpenSSLCompile(Function): name = 'openssl-static-compile' commands = [ bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, working_dir='mongoc', script='.evergreen/scripts/compile-openssl-static.sh', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return StaticOpenSSLCompile.defn() def tasks(): res = [] for distro_name, compiler, arch, in MATRIX: tags = [TAG, distro_name, compiler] distro = find_large_distro(distro_name) compile_vars = None compile_vars = {'CC': to_cc(compiler)} if arch: tags.append(arch) compile_vars.update({'MARCH': arch}) distro_str = make_distro_str(distro_name, compiler, arch) task_name = f'openssl-static-compile-{distro_str}' res.append( Task( name=task_name, run_on=distro.name, tags=tags, commands=[StaticOpenSSLCompile.call(vars=compile_vars)], ) ) return res def variants(): return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/sanitizers/000077500000000000000000000000001456567454500264105ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/components/sanitizers/asan.py000066400000000000000000000010551456567454500277050ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef TAG = 'sanitizers-matrix-asan' def variants(): expansions = { 'ASAN': 'on', 'CFLAGS': '-fno-omit-frame-pointer', 'CHECK_LOG': 'ON', 'EXTRA_CONFIGURE_FLAGS': '-DENABLE_EXTRA_ALIGNMENT=OFF', 'SANITIZE': 'address,undefined', } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/sanitizers/asan_cse.py000066400000000000000000000026231456567454500305410ustar00rootroot00000000000000from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sanitizers.test import generate_test_tasks from config_generator.components.cse.openssl import SaslCyrusOpenSSLCompile from config_generator.components.sanitizers.asan import TAG # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('ubuntu1804', 'clang', None, ['cyrus']), ('ubuntu2004', 'clang', None, ['cyrus']), ] TEST_MATRIX = [ ('ubuntu1804', 'clang', None, 'cyrus', ['auth'], ['server'], ['4.2', '4.4', '5.0', '6.0']), # Test 7.0+ with a replica set since Queryable Encryption does not support the 'server' topology. Queryable Encryption tests require 7.0+. # Test 7.0+ with Ubuntu 20.04+ since MongoDB 7.0 no longer ships binaries for Ubuntu 18.04. ('ubuntu2004', 'clang', None, 'cyrus', ['auth'], ['server', 'replica'], ['7.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long MORE_TAGS = ['cse', 'asan'] def tasks(): res = [] SSL = 'openssl' SASL_TO_FUNC = { 'cyrus': SaslCyrusOpenSSLCompile, } res += generate_compile_tasks( SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS ) res += generate_test_tasks(SSL, TAG, TEST_MATRIX, MORE_TAGS) res += generate_test_tasks( SSL, TAG, TEST_MATRIX, MORE_TAGS, MORE_TEST_TAGS=['with-mongocrypt'], MORE_VARS={'SKIP_CRYPT_SHARED_LIB': 'on'} ) return res mongo-c-driver-1.26.0/.evergreen/config_generator/components/sanitizers/asan_sasl.py000066400000000000000000000024301456567454500307250ustar00rootroot00000000000000from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sanitizers.test import generate_test_tasks from config_generator.components.sasl.openssl import SaslCyrusOpenSSLCompile from config_generator.components.sanitizers.asan import TAG # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('ubuntu1604', 'clang', None, ['cyrus']), ('ubuntu1804', 'clang', None, ['cyrus']), ('ubuntu2004', 'clang', None, ['cyrus']), ] TEST_MATRIX = [ ('ubuntu1604', 'clang', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['3.6', ]), ('ubuntu1804', 'clang', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], [ '4.0', '4.2', '4.4', '5.0', '6.0']), # Test 7.0+ with Ubuntu 20.04+ since MongoDB 7.0 no longer ships binaries for Ubuntu 18.04. ('ubuntu2004', 'clang', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['7.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long def tasks(): res = [] SSL = 'openssl' SASL_TO_FUNC = { 'cyrus': SaslCyrusOpenSSLCompile, } res += generate_compile_tasks( SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, ['asan'] ) res += generate_test_tasks(SSL, TAG, TEST_MATRIX, ['asan']) return res mongo-c-driver-1.26.0/.evergreen/config_generator/components/sanitizers/tsan.py000066400000000000000000000010461456567454500277300ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef TAG = 'sanitizers-matrix-tsan' def variants(): expansions = { 'CFLAGS': '-fno-omit-frame-pointer', 'CHECK_LOG': 'ON', 'EXTRA_CONFIGURE_FLAGS': '-DENABLE_EXTRA_ALIGNMENT=OFF -DENABLE_SHM_COUNTERS=OFF', 'SANITIZE': 'thread', } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/sanitizers/tsan_sasl.py000066400000000000000000000021711456567454500307520ustar00rootroot00000000000000from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sanitizers.test import generate_test_tasks from config_generator.components.sasl.openssl import SaslCyrusOpenSSLCompile from config_generator.components.sanitizers.tsan import TAG # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('ubuntu1804', 'clang', None, ['cyrus']), ('ubuntu2004', 'clang', None, ['cyrus']), ] TEST_OPENSSL_MATRIX = [ ('ubuntu1804', 'clang', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['4.0', '4.2', '4.4', '5.0', '6.0']), # Test 7.0+ with Ubuntu 20.04+ since MongoDB 7.0 no longer ships binaries for Ubuntu 18.04. ('ubuntu2004', 'clang', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['7.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long MORE_TAGS = ['tsan'] def tasks(): res = [] SSL = 'openssl' SASL_TO_FUNC = {'cyrus': SaslCyrusOpenSSLCompile} res += generate_compile_tasks( SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS ) res += generate_test_tasks(SSL, TAG, TEST_OPENSSL_MATRIX, MORE_TAGS) return res mongo-c-driver-1.26.0/.evergreen/config_generator/components/sasl/000077500000000000000000000000001456567454500251575ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/components/sasl/darwinssl.py000066400000000000000000000030351456567454500275400ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.function import merge_defns from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sasl.compile import CompileCommon from config_generator.etc.sasl.test import generate_test_tasks SSL = 'darwinssl' TAG = f'sasl-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('macos-1100', 'clang', None, ['cyrus']), ('macos-1100-arm64', 'clang', None, ['cyrus']), ] TEST_MATRIX = [ ('macos-1100', 'clang', None, 'cyrus', ['auth'], ['server'], ['3.6', '4.0', '4.2', '4.4', '5.0', '6.0', '7.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long class DarwinSSLCompileCommon(CompileCommon): ssl = 'DARWIN' class SaslCyrusDarwinSSLCompile(DarwinSSLCompileCommon): name = 'sasl-cyrus-darwinssl-compile' commands = DarwinSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return merge_defns( SaslCyrusDarwinSSLCompile.defn(), ) def tasks(): res = [] SASL_TO_FUNC = { 'cyrus': SaslCyrusDarwinSSLCompile, } res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = { 'DEBUG': 'ON' } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/sasl/nossl.py000066400000000000000000000036541456567454500266770ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.function import merge_defns from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sasl.compile import CompileCommon from config_generator.etc.sasl.test import generate_test_tasks SSL = 'nossl' TAG = f'sasl-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('ubuntu1604', 'gcc', None, ['off']), ('ubuntu1804', 'gcc', None, ['off']), ('ubuntu2004', 'gcc', None, ['off']), ('windows-vsCurrent', 'vs2017x64', None, ['off']), ] TEST_MATRIX = [ ('ubuntu1604', 'gcc', None, 'off', ['noauth'], ['server', 'replica', 'sharded'], ['3.6', ]), ('ubuntu1804', 'gcc', None, 'off', ['noauth'], ['server', 'replica', 'sharded'], [ '4.0', '4.2', '4.4', '5.0', '6.0', ]), ('ubuntu2004', 'gcc', None, 'off', ['noauth'], ['server', 'replica', 'sharded'], [ '7.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long class NoSSLCompileCommon(CompileCommon): ssl = 'OFF' class SaslOffNoSSLCompile(NoSSLCompileCommon): name = 'sasl-off-nossl-compile' commands = NoSSLCompileCommon.compile_commands(sasl='OFF') def functions(): return merge_defns( SaslOffNoSSLCompile.defn(), ) def tasks(): res = [] SASL_TO_FUNC = { 'off': SaslOffNoSSLCompile, } res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = { 'DEBUG': 'ON' } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/sasl/openssl.py000066400000000000000000000067151456567454500272250ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.function import merge_defns from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sasl.compile import CompileCommon from config_generator.etc.sasl.test import generate_test_tasks SSL = 'openssl' TAG = f'sasl-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('archlinux', 'clang', None, ['cyrus']), ('archlinux', 'gcc', None, ['cyrus']), ('debian10', 'gcc', None, ['cyrus']), ('debian11', 'gcc', None, ['cyrus']), ('debian92', 'clang', None, ['cyrus']), ('debian92', 'gcc', None, ['cyrus']), ('rhel70', 'gcc', None, ['cyrus']), ('rhel80', 'gcc', None, ['cyrus']), ('rhel81-power8', 'gcc', None, ['cyrus']), ('rhel83-zseries', 'gcc', None, ['cyrus']), ('ubuntu1604-arm64', 'gcc', None, ['cyrus']), ('ubuntu1604', 'clang', None, ['cyrus']), ('ubuntu1804-arm64', 'gcc', None, ['cyrus']), ('ubuntu1804', 'gcc', None, ['cyrus']), ('ubuntu2004-arm64', 'gcc', None, ['cyrus']), ('ubuntu2004', 'gcc', None, ['cyrus']), ('windows-vsCurrent', 'vs2017x64', None, ['cyrus']), ] TEST_MATRIX = [ ('rhel81-power8', 'gcc', None, 'cyrus', ['auth'], ['server', ], [ '4.2', '4.4', '5.0', '6.0', '7.0', 'latest']), ('rhel83-zseries', 'gcc', None, 'cyrus', ['auth'], ['server', ], [ '5.0', '6.0', '7.0', 'latest']), ('ubuntu1804-arm64', 'gcc', None, 'cyrus', ['auth'], ['server', ], [ '4.2', '4.4', '5.0', '6.0', ]), ('ubuntu1804', 'gcc', None, 'cyrus', ['auth'], ['server', 'replica'], ['4.0', '4.2', '4.4', '5.0', '6.0', ]), # Test 7.0+ with Ubuntu 20.04+ since MongoDB 7.0 no longer ships binaries for Ubuntu 18.04. ('ubuntu2004-arm64', 'gcc', None, 'cyrus', ['auth'], ['server'], ['7.0', 'latest']), ('ubuntu2004', 'gcc', None, 'cyrus', ['auth'], ['server'], ['7.0', 'latest']), ('windows-vsCurrent', 'vs2017x64', None, 'cyrus', ['auth'], ['server'], [ 'latest']), # Test ARM64 + 4.0 on Ubuntu 16.04, as MongoDB server does not produce # downloads for Ubuntu 18.04 arm64. # See: https://www.mongodb.com/docs/manual/administration/production-notes/ ('ubuntu1604-arm64', 'gcc', None, 'cyrus', ['auth'], ['server'], ['4.0']), ] # fmt: on # pylint: enable=line-too-long class OpenSSLCompileCommon(CompileCommon): ssl = 'OPENSSL' class SaslCyrusOpenSSLCompile(OpenSSLCompileCommon): name = 'sasl-cyrus-openssl-compile' commands = OpenSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return merge_defns( SaslCyrusOpenSSLCompile.defn(), ) def tasks(): res = [] SASL_TO_FUNC = { 'cyrus': SaslCyrusOpenSSLCompile, } res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = { 'DEBUG': 'ON' } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/sasl/winssl.py000066400000000000000000000051671456567454500270610ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.function import merge_defns from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sasl.compile import CompileCommon from config_generator.etc.sasl.test import generate_test_tasks SSL = 'winssl' TAG = f'sasl-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('windows-64-vs2013', 'vs2013x64', None, [ 'cyrus', ]), ('windows-64-vs2013', 'vs2013x86', None, ['off', ]), ('windows-64-vs2015', 'vs2015x64', None, [ 'cyrus', ]), ('windows-64-vs2015', 'vs2015x86', None, ['off', ]), ('windows-vsCurrent', 'mingw', None, [ 'sspi']), ('windows-vsCurrent', 'vs2017x64', None, ['off', 'cyrus', 'sspi']), ('windows-vsCurrent', 'vs2017x86', None, ['off', 'sspi']), ] TEST_MATRIX = [ ('windows-vsCurrent', 'vs2017x64', None, 'cyrus', ['auth'], ['server'], ['3.6', '4.0', '4.2', '4.4', '5.0', '6.0', '7.0', 'latest']), ('windows-vsCurrent', 'mingw', None, 'sspi', ['auth'], ['server'], ['latest']), ('windows-vsCurrent', 'vs2017x64', None, 'sspi', ['auth'], ['server'], ['latest']), ('windows-vsCurrent', 'vs2017x86', None, 'sspi', ['auth'], ['server'], ['latest']), ] # fmt: on # pylint: enable=line-too-long class WinSSLCompileCommon(CompileCommon): ssl = 'WINDOWS' class SaslOffWinSSLCompile(WinSSLCompileCommon): name = 'sasl-off-winssl-compile' commands = WinSSLCompileCommon.compile_commands(sasl='OFF') class SaslCyrusWinSSLCompile(WinSSLCompileCommon): name = 'sasl-cyrus-winssl-compile' commands = WinSSLCompileCommon.compile_commands(sasl='CYRUS') class SaslSspiWinSSLCompile(WinSSLCompileCommon): name = 'sasl-sspi-winssl-compile' commands = WinSSLCompileCommon.compile_commands(sasl='SSPI') def functions(): return merge_defns( SaslOffWinSSLCompile.defn(), SaslCyrusWinSSLCompile.defn(), SaslSspiWinSSLCompile.defn(), ) def tasks(): res = [] SASL_TO_FUNC = { 'off': SaslOffWinSSLCompile, 'cyrus': SaslCyrusWinSSLCompile, 'sspi': SaslSspiWinSSLCompile, } res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = { 'DEBUG': 'ON' } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/components/scan_build.py000066400000000000000000000044231456567454500266750ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_command import FunctionCall from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.distros import find_large_distro from config_generator.etc.distros import make_distro_str from config_generator.etc.distros import to_cc from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec from config_generator.etc.utils import Task TAG = 'scan-build-matrix' # pylint: disable=line-too-long # fmt: off MATRIX = [ ('macos-1100', 'clang', None ), ('ubuntu1604-arm64', 'clang', None ), ('ubuntu1604', 'clang', 'i686'), ('ubuntu1604', 'clang', None ), ('ubuntu1804-arm64', 'clang', None ), ('ubuntu1804', 'clang', 'i686'), ] # fmt: on # pylint: enable=line-too-long class ScanBuild(Function): name = 'scan-build' commands = [ bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, redirect_standard_error_to_output=True, working_dir='mongoc', script='.evergreen/scripts/compile-scan-build.sh', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) def functions(): return ScanBuild.defn() def tasks(): res = [] for distro_name, compiler, arch in MATRIX: tags = [TAG, distro_name, compiler] distro = find_large_distro(distro_name) compile_vars = None compile_vars = {'CC': to_cc(compiler)} if arch: tags.append(arch) compile_vars.update({'MARCH': arch}) distro_str = make_distro_str(distro_name, compiler, arch) task_name = f'scan-build-{distro_str}' res.append( Task( name=task_name, run_on=distro.name, tags=tags, commands=[ ScanBuild.call(vars=compile_vars), FunctionCall(func='upload scan artifacts'), ], ) ) return res def variants(): return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], ), ] mongo-c-driver-1.26.0/.evergreen/config_generator/etc/000077500000000000000000000000001456567454500226035ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/etc/compile.py000066400000000000000000000027561456567454500246170ustar00rootroot00000000000000from config_generator.etc.distros import find_large_distro from config_generator.etc.distros import make_distro_str from config_generator.etc.distros import to_cc from config_generator.etc.utils import Task from config_generator.components.funcs.upload_build import UploadBuild def generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, MATRIX, MORE_TAGS=None, MORE_VARS=None): res = [] MORE_TAGS = MORE_TAGS if MORE_TAGS else [] MORE_VARS = MORE_VARS if MORE_VARS else {} for distro_name, compiler, arch, sasls, in MATRIX: tags = [TAG, 'compile', distro_name, compiler] + MORE_TAGS distro = find_large_distro(distro_name) compile_vars = None compile_vars = {'CC': to_cc(compiler)} if arch: tags.append(arch) compile_vars.update({'MARCH': arch}) compile_vars.update(MORE_VARS) distro_str = make_distro_str(distro_name, compiler, arch) for sasl in sasls: task_name = f'sasl-{sasl}-{SSL}-{distro_str}-compile' for tag in MORE_TAGS: task_name = f'{tag}-{task_name}' commands = [] commands.append(SASL_TO_FUNC[sasl].call(vars=compile_vars)) commands.append(UploadBuild.call()) res.append( Task( name=task_name, run_on=distro.name, tags=tags + [f'sasl-{sasl}'], commands=commands, ) ) return res mongo-c-driver-1.26.0/.evergreen/config_generator/etc/cse/000077500000000000000000000000001456567454500233555ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/etc/cse/compile.py000066400000000000000000000022661456567454500253650ustar00rootroot00000000000000from typing import ClassVar from shrub.v3.evg_command import EvgCommand from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_command import expansions_update from shrub.v3.evg_command import KeyValueParam from config_generator.etc.utils import bash_exec from config_generator.etc.function import Function class CompileCommon(Function): ssl: ClassVar[str | None] @classmethod def compile_commands(cls, sasl=None) -> list[EvgCommand]: updates = [] if cls.ssl: updates.append(KeyValueParam(key='SSL', value=cls.ssl)) if sasl: updates.append(KeyValueParam(key='SASL', value=sasl)) return [ expansions_update(updates=updates), bash_exec( command_type=EvgCommandType.TEST, script='EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON ${EXTRA_CONFIGURE_FLAGS}" .evergreen/scripts/compile.sh', working_dir='mongoc', add_expansions_to_env=True, env={ 'COMPILE_LIBMONGOCRYPT': 'ON', }, ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) mongo-c-driver-1.26.0/.evergreen/config_generator/etc/cse/test.py000066400000000000000000000057721456567454500247210ustar00rootroot00000000000000from itertools import product from shrub.v3.evg_command import expansions_update from shrub.v3.evg_command import KeyValueParam from shrub.v3.evg_task import EvgTaskDependency from config_generator.etc.distros import find_small_distro from config_generator.etc.distros import make_distro_str from config_generator.etc.distros import to_cc from config_generator.etc.utils import Task from config_generator.components.funcs.bootstrap_mongo_orchestration import BootstrapMongoOrchestration from config_generator.components.funcs.fetch_build import FetchBuild from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.run_mock_kms_servers import RunMockKMSServers from config_generator.components.funcs.run_tests import RunTests def generate_test_tasks(SSL, TAG, MATRIX): res = [] TOPOLOGY_TO_STR = { 'server': 'server', 'replica': 'replica_set', 'sharded': 'sharded_cluster', } for distro_name, compiler, arch, sasl, auths, topologies, server_vers in MATRIX: tags = [TAG, 'test', distro_name, compiler, f'sasl-{sasl}', 'cse'] test_distro = find_small_distro(distro_name) compile_vars = [] compile_vars.append(KeyValueParam(key='CC', value=to_cc(compiler))) if arch: tags.append(arch) compile_vars.append(KeyValueParam(key='MARCH', value=arch)) distro_str = make_distro_str(distro_name, compiler, arch) compile_task_name = f'cse-sasl-{sasl}-{SSL}-{distro_str}-compile' for auth, topology, server_ver in product(auths, topologies, server_vers): test_tags = tags + [auth, topology, server_ver] # Do not add `nossl` tag to prevent being selected by legacy config variants. # Remove the `if` when CDRIVER-4571 is resolved. if SSL != 'nossl': test_tags += [SSL] test_task_name = f'cse-sasl-{sasl}-{SSL}-{distro_str}-test-{server_ver}-{topology}-{auth}' test_commands = [] test_commands.append(FetchBuild.call(build_name=compile_task_name)) updates = compile_vars + [ KeyValueParam(key='AUTH', value=auth), KeyValueParam(key='MONGODB_VERSION', value=server_ver), KeyValueParam(key='TOPOLOGY', value=TOPOLOGY_TO_STR[topology]), KeyValueParam(key='SSL', value=SSL), ] test_commands.append(expansions_update(updates=updates)) test_commands.append(FetchDET.call()) test_commands.append(BootstrapMongoOrchestration.call()) test_commands.append(RunMockKMSServers.call()) test_commands.append(RunTests.call()) res.append( Task( name=test_task_name, run_on=test_distro.name, tags=test_tags, depends_on=[EvgTaskDependency(name=compile_task_name)], commands=test_commands, ) ) return res mongo-c-driver-1.26.0/.evergreen/config_generator/etc/distros.py000066400000000000000000000314571456567454500246560ustar00rootroot00000000000000from typing import Literal from pydantic import BaseModel, validator from packaging.version import Version class Distro(BaseModel): """ Defines common properties of a given Evergreen distro. * name: Name of the distro. * os: Name of the operating system. * os_type: One of Linux, MacOS, or Windows. * os_ver: Version of the operating system. * vs_ver: Version of Visual Studio available. * size: Size of tasks the distro is designed to handle. * arch: Target architecture. """ name: str os: str | None = None os_type: Literal['linux', 'macos', 'windows'] | None = None os_ver: str | None = None vs_ver: Literal[ '2013', '2015', '2017', '2019', '2022', 'vsCurrent', 'vsCurrent2', 'vsMulti', ] | None = None size: Literal['small', 'large'] | None = None arch: Literal['arm64', 'power8', 'zseries'] | None = None @validator('os_ver') @classmethod def validate_os_ver(cls, value): return Version(value) # See: https://evergreen.mongodb.com/distros # pylint: disable=line-too-long #fmt: off ARCHLINUX_DISTROS = [ Distro(name='archlinux-large', os='archlinux', os_type='linux', size='large'), Distro(name='archlinux-small', os='archlinux', os_type='linux', size='small'), Distro(name='archlinux-new-large', os='archlinux', os_type='linux', size='large'), Distro(name='archlinux-new-small', os='archlinux', os_type='linux', size='small'), ] DEBIAN_DISTROS = [ Distro(name='debian10-large', os='debian', os_type='linux', os_ver='10', size='large'), Distro(name='debian10-small', os='debian', os_type='linux', os_ver='10', size='small'), Distro(name='debian11-large', os='debian', os_type='linux', os_ver='11', size='large'), Distro(name='debian11-small', os='debian', os_type='linux', os_ver='11', size='small'), Distro(name='debian92-large', os='debian', os_type='linux', os_ver='9.2', size='large'), Distro(name='debian92-small', os='debian', os_type='linux', os_ver='9.2', size='small'), ] MACOS_DISTROS = [ Distro(name='macos-1100', os='macos', os_type='macos', os_ver='11.00'), ] MACOS_ARM64_DISTROS = [ Distro(name='macos-1100-arm64', os='macos', os_type='macos', os_ver='11.00', arch='arm64'), ] RHEL_DISTROS = [ Distro(name='rhel70-large', os='rhel', os_type='linux', os_ver='7.0', size='large'), Distro(name='rhel70-small', os='rhel', os_type='linux', os_ver='7.0', size='small'), Distro(name='rhel76-large', os='rhel', os_type='linux', os_ver='7.6', size='large'), Distro(name='rhel76-small', os='rhel', os_type='linux', os_ver='7.6', size='small'), Distro(name='rhel80-large', os='rhel', os_type='linux', os_ver='8.0', size='large'), Distro(name='rhel80-small', os='rhel', os_type='linux', os_ver='8.0', size='small'), Distro(name='rhel84-large', os='rhel', os_type='linux', os_ver='8.4', size='large'), Distro(name='rhel84-small', os='rhel', os_type='linux', os_ver='8.4', size='small'), Distro(name='rhel87-large', os='rhel', os_type='linux', os_ver='8.7', size='large'), Distro(name='rhel87-small', os='rhel', os_type='linux', os_ver='8.7', size='small'), Distro(name='rhel90-large', os='rhel', os_type='linux', os_ver='9.0', size='large'), Distro(name='rhel90-small', os='rhel', os_type='linux', os_ver='9.0', size='small'), ] RHEL_ARM64_DISTROS = [ Distro(name='rhel82-arm64-large', os='rhel', os_type='linux', os_ver='8.2', size='large', arch='arm64'), Distro(name='rhel82-arm64-small', os='rhel', os_type='linux', os_ver='8.2', size='small', arch='arm64'), Distro(name='rhel90-arm64-large', os='rhel', os_type='linux', os_ver='9.0', size='large', arch='arm64'), Distro(name='rhel90-arm64-small', os='rhel', os_type='linux', os_ver='9.0', size='small', arch='arm64'), ] RHEL_POWER8_DISTROS = [ Distro(name='rhel71-power8-large', os='rhel', os_type='linux', os_ver='7.1', size='large', arch='power8'), Distro(name='rhel71-power8-small', os='rhel', os_type='linux', os_ver='7.1', size='small', arch='power8'), Distro(name='rhel81-power8-large', os='rhel', os_type='linux', os_ver='8.1', size='large', arch='power8'), Distro(name='rhel81-power8-small', os='rhel', os_type='linux', os_ver='8.1', size='small', arch='power8'), ] RHEL_ZSERIES_DISTROS = [ Distro(name='rhel67-zseries-large', os='rhel', os_type='linux', os_ver='6.7', size='large', arch='zseries'), Distro(name='rhel67-zseries-small', os='rhel', os_type='linux', os_ver='6.7', size='small', arch='zseries'), Distro(name='rhel72-zseries-large', os='rhel', os_type='linux', os_ver='7.2', size='large', arch='zseries'), Distro(name='rhel72-zseries-small', os='rhel', os_type='linux', os_ver='7.2', size='small', arch='zseries'), Distro(name='rhel83-zseries-large', os='rhel', os_type='linux', os_ver='8.3', size='large', arch='zseries'), Distro(name='rhel83-zseries-small', os='rhel', os_type='linux', os_ver='8.3', size='small', arch='zseries'), ] UBUNTU_DISTROS = [ Distro(name='ubuntu1604-large', os='ubuntu', os_type='linux', os_ver='16.04', size='large'), Distro(name='ubuntu1604-small', os='ubuntu', os_type='linux', os_ver='16.04', size='small'), Distro(name='ubuntu1804-large', os='ubuntu', os_type='linux', os_ver='18.04', size='large'), Distro(name='ubuntu1804-small', os='ubuntu', os_type='linux', os_ver='18.04', size='small'), Distro(name='ubuntu2004-large', os='ubuntu', os_type='linux', os_ver='20.04', size='large'), Distro(name='ubuntu2004-small', os='ubuntu', os_type='linux', os_ver='20.04', size='small'), Distro(name='ubuntu2204-large', os='ubuntu', os_type='linux', os_ver='22.04', size='large'), Distro(name='ubuntu2204-small', os='ubuntu', os_type='linux', os_ver='22.04', size='small'), ] UBUNTU_POWER8_DISTROS = [ Distro(name='ubuntu1604-power8-large', os='ubuntu', os_type='linux', os_ver='16.04', size='large', arch='power8'), Distro(name='ubuntu1604-power8-small', os='ubuntu', os_type='linux', os_ver='16.04', size='small', arch='power8'), Distro(name='ubuntu1804-power8-large', os='ubuntu', os_type='linux', os_ver='18.04', size='large', arch='power8'), Distro(name='ubuntu1804-power8-small', os='ubuntu', os_type='linux', os_ver='18.04', size='small', arch='power8'), ] UBUNTU_ARM64_DISTROS = [ Distro(name='ubuntu1604-arm64-large', os='ubuntu', os_type='linux', os_ver='16.04', size='large', arch='arm64'), Distro(name='ubuntu1604-arm64-small', os='ubuntu', os_type='linux', os_ver='16.04', size='small', arch='arm64'), Distro(name='ubuntu1804-arm64-large', os='ubuntu', os_type='linux', os_ver='18.04', size='large', arch='arm64'), Distro(name='ubuntu1804-arm64-small', os='ubuntu', os_type='linux', os_ver='18.04', size='small', arch='arm64'), Distro(name='ubuntu2004-arm64-large', os='ubuntu', os_type='linux', os_ver='20.04', size='large', arch='arm64'), Distro(name='ubuntu2004-arm64-small', os='ubuntu', os_type='linux', os_ver='20.04', size='small', arch='arm64'), Distro(name='ubuntu2204-arm64-large', os='ubuntu', os_type='linux', os_ver='22.04', size='large', arch='arm64'), Distro(name='ubuntu2204-arm64-small', os='ubuntu', os_type='linux', os_ver='22.04', size='small', arch='arm64'), ] UBUNTU_ZSERIES_DISTROS = [ Distro(name='ubuntu1604-zseries-large', os='ubuntu', os_type='linux', os_ver='16.04', size='large', arch='zseries'), Distro(name='ubuntu1604-zseries-small', os='ubuntu', os_type='linux', os_ver='16.04', size='small', arch='zseries'), Distro(name='ubuntu1804-zseries-large', os='ubuntu', os_type='linux', os_ver='18.04', size='large', arch='zseries'), Distro(name='ubuntu1804-zseries-small', os='ubuntu', os_type='linux', os_ver='18.04', size='small', arch='zseries'), ] WINDOWS_DISTROS = [ Distro(name='windows-64-vs2013-large', os='windows', os_type='windows', vs_ver='2013', size='large'), Distro(name='windows-64-vs2013-small', os='windows', os_type='windows', vs_ver='2013', size='small'), Distro(name='windows-64-vs2015-large', os='windows', os_type='windows', vs_ver='2015', size='large'), Distro(name='windows-64-vs2015-small', os='windows', os_type='windows', vs_ver='2015', size='small'), Distro(name='windows-64-vs2017-large', os='windows', os_type='windows', vs_ver='2017', size='large'), Distro(name='windows-64-vs2017-small', os='windows', os_type='windows', vs_ver='2017', size='small'), Distro(name='windows-64-vs2019-large', os='windows', os_type='windows', vs_ver='2019', size='large'), Distro(name='windows-64-vs2019-small', os='windows', os_type='windows', vs_ver='2019', size='small'), Distro(name='windows-2022-large', os='windows', os_type='windows', os_ver='2022'), Distro(name='windows-2022-small', os='windows', os_type='windows', os_ver='2022'), Distro(name='windows-64-2019', os='windows', os_type='windows', os_ver='2019'), Distro(name='windows-64-vsMulti-small', os='windows', os_type='windows', vs_ver='vsMulti', size='small'), Distro(name='windows-vsCurrent-2022-large', os='windows', os_type='windows', os_ver='2022', vs_ver='vsCurrent', size='large'), Distro(name='windows-vsCurrent-2022-small', os='windows', os_type='windows', os_ver='2022', vs_ver='vsCurrent', size='small'), Distro(name='windows-vsCurrent-large', os='windows', os_type='windows', vs_ver='vsCurrent', size='large'), # Windows Server 2019 Distro(name='windows-vsCurrent-small', os='windows', os_type='windows', vs_ver='vsCurrent', size='small'), # Windows Server 2019 Distro(name='windows-vsCurrent2-large', os='windows', os_type='windows', vs_ver='vsCurrent2', size='large'), Distro(name='windows-vsCurrent2-small', os='windows', os_type='windows', vs_ver='vsCurrent2', size='small'), ] #fmt: on # pylint: enable=line-too-long # Ensure no-arch distros are ordered before arch-specific distros. ALL_DISTROS = [] + \ ARCHLINUX_DISTROS + \ DEBIAN_DISTROS + \ MACOS_DISTROS + \ MACOS_ARM64_DISTROS + \ RHEL_DISTROS + \ RHEL_ARM64_DISTROS + \ RHEL_POWER8_DISTROS + \ RHEL_ZSERIES_DISTROS + \ UBUNTU_DISTROS + \ UBUNTU_ARM64_DISTROS + \ UBUNTU_POWER8_DISTROS + \ UBUNTU_ZSERIES_DISTROS + \ WINDOWS_DISTROS def find_distro(name) -> Distro: candidates = [d for d in ALL_DISTROS if name == d.name] if not candidates: raise ValueError(f'could not find a distro with the name {name}') return candidates[0] def find_large_distro(name) -> Distro: candidates = [d for d in ALL_DISTROS if f'{name}-large' == d.name] if candidates: return candidates[0] return find_distro(name) def find_small_distro(name) -> Distro: candidates = [d for d in ALL_DISTROS if f'{name}-small' == d.name] if candidates: return candidates[0] return find_distro(name) def make_distro_str(distro_name, compiler, arch) -> str: if distro_name.startswith('windows-vsCurrent'): # Rename `windows-vsCurrent-*` distros to `windows-` where`` # is the Windows Server version used by the distro, e.g.: # ('windows-vsCurrent-2022', 'vs2017x64', None) -> windows-2022-vs2017-x64 # ('windows-vsCurrent-2022', 'mingw', None) -> windows-2022-mingw # ('windows-vsCurrent', 'vs2017x64', None) -> windows-2019-vs2017-x64 # ('windows-vsCurrent', 'mingw', None) -> windows-2019-mingw maybe_arch = compiler[len('vs20XY'):] if maybe_arch in ('x86', 'x64'): compiler_str = compiler[:-len(maybe_arch)] + '-' + maybe_arch else: compiler_str = compiler if distro_name.startswith('windows-vsCurrent-'): distro_str = 'windows-' + \ distro_name[len('windows-vsCurrent-'):] + f'-{compiler_str}' else: distro_str = 'windows-2019' + f'-{compiler_str}' elif distro_name.startswith('windows-64-vs'): # Abbreviate 'windows-64-vs' as 'vs' and append '-' if # given in compiler string as 'vs', e.g.: # ('windows-64-vs2017', 'vs2017x64', None) -> vs2017-x64 # ('windows-64-vs2017', 'mingw', None) -> vs2017-mingw distro_str = distro_name[len('windows-64-'):] + { 'vs2013x64': '-x64', 'vs2013x86': '-x86', 'vs2015x64': '-x64', 'vs2015x86': '-x86', 'vs2017x64': '-x64', 'vs2017x86': '-x86', }.get(compiler, f'-{compiler}') else: distro_str = distro_name if compiler: distro_str += f'-{compiler}' if arch: distro_str += f'-{arch}' return distro_str def to_cc(compiler): return { 'vs2013x64': 'Visual Studio 12 2013 Win64', 'vs2013x86': 'Visual Studio 12 2013', 'vs2015x64': 'Visual Studio 14 2015 Win64', 'vs2015x86': 'Visual Studio 14 2015', 'vs2017x64': 'Visual Studio 15 2017 Win64', 'vs2017x86': 'Visual Studio 15 2017', }.get(compiler, compiler) mongo-c-driver-1.26.0/.evergreen/config_generator/etc/function.py000066400000000000000000000010461456567454500250030ustar00rootroot00000000000000from typing import ClassVar from typing import Mapping from collections import ChainMap from shrub.v3.evg_command import EvgCommand from shrub.v3.evg_command import FunctionCall class Function: name: ClassVar[str] commands: ClassVar[list[EvgCommand]] @classmethod def defn(cls) -> Mapping[str, list[EvgCommand]]: return {cls.name: cls.commands} @classmethod def default_call(cls, **kwargs) -> FunctionCall: return FunctionCall(func=cls.name, **kwargs) def merge_defns(*args): return ChainMap(*args) mongo-c-driver-1.26.0/.evergreen/config_generator/etc/sanitizers/000077500000000000000000000000001456567454500247765ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/etc/sanitizers/test.py000066400000000000000000000077231456567454500263400ustar00rootroot00000000000000from itertools import product from shrub.v3.evg_command import expansions_update from shrub.v3.evg_command import KeyValueParam from shrub.v3.evg_task import EvgTaskDependency from config_generator.etc.distros import find_small_distro from config_generator.etc.distros import make_distro_str from config_generator.etc.distros import to_cc from config_generator.etc.utils import Task from config_generator.components.funcs.bootstrap_mongo_orchestration import BootstrapMongoOrchestration from config_generator.components.funcs.fetch_build import FetchBuild from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.run_simple_http_server import RunSimpleHTTPServer from config_generator.components.funcs.run_mock_kms_servers import RunMockKMSServers from config_generator.components.funcs.run_tests import RunTests def generate_test_tasks(SSL, TAG, MATRIX, MORE_COMPILE_TAGS=None, MORE_TEST_TAGS=None, MORE_VARS=None): res = [] TOPOLOGY_TO_STR = { 'server': 'server', 'replica': 'replica_set', 'sharded': 'sharded_cluster', } MORE_COMPILE_TAGS = MORE_COMPILE_TAGS if MORE_COMPILE_TAGS else [] MORE_TEST_TAGS = MORE_TEST_TAGS if MORE_TEST_TAGS else [] MORE_VARS = MORE_VARS if MORE_VARS else {} for distro_name, compiler, arch, sasl, auths, topologies, server_vers in MATRIX: tags = [ TAG, 'test', distro_name, compiler, f'sasl-{sasl}' ] + MORE_COMPILE_TAGS test_distro = find_small_distro(distro_name) compile_vars = [] compile_vars.append(KeyValueParam(key='CC', value=to_cc(compiler))) if arch: tags.append(arch) compile_vars.append(KeyValueParam(key='MARCH', value=arch)) distro_str = make_distro_str(distro_name, compiler, arch) base_task_name = f'sasl-{sasl}-{SSL}-{distro_str}' for tag in MORE_COMPILE_TAGS: base_task_name = f'{tag}-{base_task_name}' compile_task_name = f'{base_task_name}-compile' for auth, topology, server_ver in product(auths, topologies, server_vers): test_tags = tags + [auth, topology, server_ver] + MORE_TEST_TAGS # Do not add `nossl` tag to prevent being selected by legacy config variants. # Remove the `if` when CDRIVER-4571 is resolved. if SSL != 'nossl': test_tags += [SSL] test_task_name = f'{base_task_name}-test-{server_ver}-{topology}-{auth}' for tag in MORE_TEST_TAGS: test_task_name += f'-{tag}' test_commands = [] test_commands.append(FetchBuild.call(build_name=compile_task_name)) updates = compile_vars + [ KeyValueParam(key='AUTH', value=auth), KeyValueParam(key='MONGODB_VERSION', value=server_ver), KeyValueParam(key='TOPOLOGY', value=TOPOLOGY_TO_STR[topology]), KeyValueParam(key='SSL', value=SSL), ] if 'cse' in MORE_COMPILE_TAGS: updates.append( KeyValueParam(key='CLIENT_SIDE_ENCRYPTION', value='on') ) for key, value in MORE_VARS.items(): updates.append(KeyValueParam(key=key, value=value)) test_commands.append(expansions_update(updates=updates)) test_commands.append(FetchDET.call()) test_commands.append(BootstrapMongoOrchestration.call()) test_commands.append(RunSimpleHTTPServer.call()) if 'cse' in MORE_COMPILE_TAGS: test_commands.append(RunMockKMSServers.call()) test_commands.append(RunTests.call()) res.append( Task( name=test_task_name, run_on=test_distro.name, tags=test_tags, depends_on=[EvgTaskDependency(name=compile_task_name)], commands=test_commands, ) ) return res mongo-c-driver-1.26.0/.evergreen/config_generator/etc/sasl/000077500000000000000000000000001456567454500235455ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/etc/sasl/compile.py000066400000000000000000000015261456567454500255530ustar00rootroot00000000000000from typing import ClassVar from shrub.v3.evg_command import EvgCommand from shrub.v3.evg_command import EvgCommandType from config_generator.etc.utils import bash_exec from config_generator.etc.function import Function class CompileCommon(Function): ssl: ClassVar[str | None] @classmethod def compile_commands(cls, sasl=None) -> list[EvgCommand]: env = {} if cls.ssl: env['SSL'] = cls.ssl if sasl: env['SASL'] = sasl return [ bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, env=env, working_dir='mongoc', script='.evergreen/scripts/compile.sh', ), ] @classmethod def call(cls, **kwargs): return cls.default_call(**kwargs) mongo-c-driver-1.26.0/.evergreen/config_generator/etc/sasl/test.py000066400000000000000000000057621456567454500251100ustar00rootroot00000000000000from itertools import product from shrub.v3.evg_command import expansions_update from shrub.v3.evg_command import KeyValueParam from shrub.v3.evg_task import EvgTaskDependency from config_generator.etc.distros import find_small_distro from config_generator.etc.distros import make_distro_str from config_generator.etc.distros import to_cc from config_generator.etc.utils import Task from config_generator.components.funcs.bootstrap_mongo_orchestration import BootstrapMongoOrchestration from config_generator.components.funcs.fetch_build import FetchBuild from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.run_simple_http_server import RunSimpleHTTPServer from config_generator.components.funcs.run_tests import RunTests def generate_test_tasks(SSL, TAG, MATRIX): res = [] TOPOLOGY_TO_STR = { 'server': 'server', 'replica': 'replica_set', 'sharded': 'sharded_cluster', } for distro_name, compiler, arch, sasl, auths, topologies, server_vers in MATRIX: tags = [TAG, 'test', distro_name, compiler] test_distro = find_small_distro(distro_name) compile_vars = [] compile_vars.append(KeyValueParam(key='CC', value=to_cc(compiler))) if arch: tags.append(arch) compile_vars.append(KeyValueParam(key='MARCH', value=arch)) distro_str = make_distro_str(distro_name, compiler, arch) compile_task_name = f'sasl-{sasl}-{SSL}-{distro_str}-compile' for auth, topology, server_ver in product(auths, topologies, server_vers): test_tags = tags + [f'sasl-{sasl}', auth, topology, server_ver] # Do not add `nossl` tag to prevent being selected by legacy config variants. # Remove the `if` when CDRIVER-4571 is resolved. if SSL != 'nossl': test_tags += [SSL] test_task_name = f'sasl-{sasl}-{SSL}-{distro_str}-test-{server_ver}-{topology}-{auth}' test_commands = [] test_commands.append(FetchBuild.call(build_name=compile_task_name)) updates = compile_vars + [ KeyValueParam(key='AUTH', value=auth), KeyValueParam(key='MONGODB_VERSION', value=server_ver), KeyValueParam(key='TOPOLOGY', value=TOPOLOGY_TO_STR[topology]), KeyValueParam(key='SSL', value=SSL), ] test_commands.append(expansions_update(updates=updates)) test_commands.append(FetchDET.call()) test_commands.append(BootstrapMongoOrchestration.call()) test_commands.append(RunSimpleHTTPServer.call()) test_commands.append(RunTests.call()) res.append( Task( name=test_task_name, run_on=test_distro.name, tags=test_tags, depends_on=[EvgTaskDependency(name=compile_task_name)], commands=test_commands, ) ) return res mongo-c-driver-1.26.0/.evergreen/config_generator/etc/utils.py000066400000000000000000000152631456567454500243240ustar00rootroot00000000000000from importlib import import_module from pathlib import Path from textwrap import dedent from typing import Sequence, Iterable, Mapping import yaml from shrub.v3.evg_project import EvgProject from shrub.v3.evg_task import EvgTask from shrub.v3.evg_command import subprocess_exec, EvgCommandType # Equivalent to EvgTask but defines additional properties. class Task(EvgTask): """ An evergreen task model that also includes additional properties. (The shrub.py model is missing some properties) """ disable: bool = False run_on: str | Sequence[str] | None = None # Automatically formats the provided script and invokes it in Bash. def bash_exec( script, *, include_expansions_in_env: Iterable[str] | None = None, working_dir: str | None = None, command_type: EvgCommandType | None = None, env: Mapping[str, str] | None = None, **kwargs, ): return subprocess_exec( binary="bash", args=["-c", dedent(script)], include_expansions_in_env=list(include_expansions_in_env) if include_expansions_in_env else None, working_dir=working_dir, command_type=command_type, env=dict(env) if env else None, **kwargs, ) def all_components(): res = [] # .evergreen/config_generator/etc/utils.py -> .evergreen/config_generator/components components_dir = Path(__file__).parent.parent / 'components' all_paths = components_dir.glob('**/*.py') for path in sorted(all_paths): component_path = path.relative_to(components_dir) component_str = str(component_path.with_suffix('')) # Drop '.py'. component_str = component_str.replace('/', '.') # 'a/b' -> 'a.b' module_name = f'config_generator.components.{component_str}' res.append(import_module(module_name)) return res # Helper function to print component name for diagnostic purposes. def component_name(component): component_prefix = 'config_generator.components.' res = component.__name__[len(component_prefix):] return res def write_to_file(yml, filename): # .evergreen/config_generator/etc/utils.py -> .evergreen evergreen_dir = Path(__file__).parent.parent.parent filename = evergreen_dir / 'generated_configs' / filename with open(filename.resolve(), 'w', encoding='utf-8') as file: file.write(yml) class ConfigDumper(yaml.SafeDumper): # Represent multiline strings in the form: # key: | # multiline string # multiline string # multiline string def represent_scalar(self, tag, value, style=None): if isinstance(value, str) and '\n' in value: style = '|' return super().represent_scalar(tag, value, style) # Prefer using double quotes when able. def analyze_scalar(self, scalar): res = super().analyze_scalar(scalar) if res.allow_single_quoted and res.allow_double_quoted: res.allow_single_quoted = False return res # Represent flow mappings with space after left brace: # node: { key: value } # ^ def expect_flow_mapping(self): super().expect_flow_mapping() self.write_indicator('', False) # Represent flow mappings with space before right brace: # node: { key: value } # ^ def expect_flow_mapping_key(self): if isinstance(self.event, yaml.MappingEndEvent): self.write_indicator(' ', False) super().expect_flow_mapping_key() # Allow for special-casing depending on parent node. def represent_special_mapping(self, tag, mapping, flow_style): value = [] for item_key, item_value in mapping: node_key = self.represent_data(item_key) if item_key == 'tags': # Represent task tags using flow style to reduce line count: # - name: task-name # tags: [A, B, C] node_value = self.represent_sequence( 'tag:yaml.org,2002:seq', item_value, flow_style=True) elif item_key == 'depends_on' and len(item_value) == 1: # Represent task depends_on using flow style when only one # dependency is given to reduce line count: # - name: task-name # depends_on: [{ name: dependency }] node_value = self.represent_sequence( 'tag:yaml.org,2002:seq', item_value, flow_style=True) else: # Use default behavior. node_value = self.represent_data(item_value) value.append((node_key, node_value)) node = yaml.MappingNode(tag, value, flow_style=flow_style) if self.alias_key is not None: self.represented_objects[self.alias_key] = node return node # Make an effort to order fields in a readable manner. # Ordering applies to *all* mappings regardless of the parent node. def represent_mapping(self, tag, mapping, flow_style=False): # Represent updates mapping for expansions.update commands using flow # style to reduce line count: # - command: expansions.update # params: # updates: # - { key: KEY, value: VALUE } # - { key: KEY, value: VALUE } # - { key: KEY, value: VALUE } if len(mapping) == 2 and 'key' in mapping and 'value' in mapping: flow_style = True before = [ 'name', 'display_name', 'command', 'type', 'run_on', 'tags', 'depends_on', 'binary', 'working_dir', ] after = [ 'commands', 'args', ] ordered = { field: mapping.pop(field) for field in before if field in mapping } suffix = { field: mapping.pop(field) for field in after if field in mapping } ordered.update(sorted(mapping.items())) ordered.update(suffix) return self.represent_special_mapping(tag, ordered.items(), flow_style) # Ensure a block sequence is indented relative to its parent node:: # key: # - a # - b # - c # instead of:: # key: # - a # - b # - c def increase_indent(self, flow=None, indentless=None): indentless = False return super().increase_indent(flow=flow, indentless=indentless) def to_yaml(project: EvgProject) -> str: return yaml.dump( project.dict(exclude_none=True, exclude_unset=True, by_alias=True), Dumper=ConfigDumper, default_flow_style=False, width=float('inf'), ) mongo-c-driver-1.26.0/.evergreen/config_generator/generate.py000066400000000000000000000015611456567454500241770ustar00rootroot00000000000000#!/usr/bin/env python3 # Generates *.yml files under .evergreen/generated_configs. # # Install dependencies by running (preferably in a virtual environment): # python -m pip install -r .evergreen/config_generator/requirements.txt # # Invoke this using the command: # python3 .evergreen/config_generator/generate-config.py import sys from importlib import import_module GENERATOR_NAMES = [ "functions", "tasks", "task_groups", "variants", "legacy_config", ] def main(): # Requires Python 3.10 or newer. assert sys.version_info.major >= 3 assert sys.version_info.minor >= 10 for name in GENERATOR_NAMES: m = import_module(f"config_generator.generators.{name}") print(f"Running {name}.generate()...") m.generate() print(f"Running {name}.generate()... done.") if __name__ == "__main__": main() mongo-c-driver-1.26.0/.evergreen/config_generator/generators/000077500000000000000000000000001456567454500242015ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/config_generator/generators/functions.py000066400000000000000000000010061456567454500265600ustar00rootroot00000000000000from shrub.v3.evg_project import EvgProject from config_generator.etc import utils def generate(): functions = {} for component in utils.all_components(): if hasattr(component, 'functions'): component_name = utils.component_name(component) print(f' - {component_name}') functions.update(component.functions()) functions = dict(sorted(functions.items())) yml = utils.to_yaml(EvgProject(functions=functions)) utils.write_to_file(yml, 'functions.yml') mongo-c-driver-1.26.0/.evergreen/config_generator/generators/legacy_config.py000066400000000000000000000003421456567454500273430ustar00rootroot00000000000000import subprocess import sys def generate(): subprocess.run( args=[ sys.executable, '.evergreen/legacy_config_generator/generate-evergreen-config.py', ], check=True, ) mongo-c-driver-1.26.0/.evergreen/config_generator/generators/task_groups.py000066400000000000000000000010141456567454500271100ustar00rootroot00000000000000from shrub.v3.evg_project import EvgProject from config_generator.etc import utils def generate(): task_groups = [] for component in utils.all_components(): if hasattr(component, 'task_groups'): component_name = utils.component_name(component) print(f' - {component_name}') task_groups += component.task_groups() task_groups.sort(key=lambda v: v.name) yaml = utils.to_yaml(EvgProject(task_groups=task_groups)) utils.write_to_file(yaml, 'task_groups.yml') mongo-c-driver-1.26.0/.evergreen/config_generator/generators/tasks.py000066400000000000000000000007341456567454500257040ustar00rootroot00000000000000from shrub.v3.evg_project import EvgProject from config_generator.etc import utils def generate(): tasks = [] for component in utils.all_components(): if hasattr(component, 'tasks'): component_name = utils.component_name(component) print(f' - {component_name}') tasks += component.tasks() tasks.sort(key=lambda v: v.name) yaml = utils.to_yaml(EvgProject(tasks=tasks)) utils.write_to_file(yaml, 'tasks.yml') mongo-c-driver-1.26.0/.evergreen/config_generator/generators/variants.py000066400000000000000000000007711456567454500264070ustar00rootroot00000000000000from shrub.v3.evg_project import EvgProject from config_generator.etc import utils def generate(): variants = [] for component in utils.all_components(): if hasattr(component, 'variants'): component_name = utils.component_name(component) print(f' - {component_name}') variants += component.variants() variants.sort(key=lambda v: v.name) yaml = utils.to_yaml(EvgProject(buildvariants=variants)) utils.write_to_file(yaml, 'variants.yml') mongo-c-driver-1.26.0/.evergreen/config_generator/requirements.txt000066400000000000000000000004341456567454500253150ustar00rootroot00000000000000-e git+https://github.com/mongodb-labs/drivers-evergreen-tools#egg=evergreen_config_generator&subdirectory=evergreen_config_generator git-url-parse==1.2.2 packaging==23.1 pbr==5.11.1 pydantic==1.10.4 PyYAML==5.4.1 shrub.py==3.0.4 typing_extensions==4.4.0 yamlordereddictloader==0.4.0 mongo-c-driver-1.26.0/.evergreen/etc/000077500000000000000000000000001456567454500172705ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/etc/ecs_hosted_test.js000066400000000000000000000026341456567454500230120ustar00rootroot00000000000000/** * This script is used to verify the AWS IAM ECS hosted auth works. * It is copied to a remote ECS cluster and run as a task. */ TestData = {}; (function() { "use strict"; // This varies based on hosting ECS task as the account id and role name can vary const AWS_ACCOUNT_ARN = "arn:aws:sts::557821124784:assumed-role/ecsTaskExecutionRole/*"; const conn = MongoRunner.runMongod({ setParameter: { "authenticationMechanisms": "MONGODB-AWS,SCRAM-SHA-256", }, auth: "", }); const external = conn.getDB("$external"); const admin = conn.getDB("admin"); assert.commandWorked(admin.runCommand({createUser: "admin", pwd: "pwd", roles: ['root']})); assert(admin.auth("admin", "pwd")); assert.commandWorked(external.runCommand({createUser: AWS_ACCOUNT_ARN, roles:[{role: 'read', db: "aws"}]})); const uri = "mongodb://127.0.0.1:20000/aws?authMechanism=MONGODB-AWS"; const program = "/root/mongoc/.evergreen/scripts/run-mongodb-aws-ecs-test.sh"; // Try the command line const smoke = runMongoProgram(program, uri); assert.eq(smoke, 0, "Could not auth"); // Try the auth function on a new client. (function () { const conn = Mongo("mongodb://127.0.0.1:20000"); const external = conn.getDB("$external"); assert(external.auth({mechanism: 'MONGODB-AWS'})); }()); MongoRunner.stopMongod(conn); }()); mongo-c-driver-1.26.0/.evergreen/etc/kerberos.realm000066400000000000000000000001461456567454500221270ustar00rootroot00000000000000[realms] LDAPTEST.10GEN.CC = { kdc = ldaptest.10gen.cc admin_server = ldaptest.10gen.cc } mongo-c-driver-1.26.0/.evergreen/etc/mongo-c-driver.spec000066400000000000000000000537701456567454500230100ustar00rootroot00000000000000# remirepo/fedora spec file for mongo-c-driver # # Copyright (c) 2015-2024 Remi Collet # License: CC-BY-SA-4.0 # http://creativecommons.org/licenses/by-sa/4.0/ # # Please, preserve the changelog entries # %global gh_owner mongodb %global gh_project mongo-c-driver %global libname libmongoc %global libver 1.0 %global up_version 1.25.4 #global up_prever rc0 # disabled as require a MongoDB server %bcond_with tests # disable for bootstrap (libmongocrypt needs libbson) %bcond_without libmongocrypt Name: mongo-c-driver Summary: Client library written in C for MongoDB Version: %{up_version}%{?up_prever:~%{up_prever}} Release: 1%{?dist} # See THIRD_PARTY_NOTICES License: Apache-2.0 AND ISC AND MIT AND Zlib URL: https://github.com/%{gh_owner}/%{gh_project} Source0: https://github.com/%{gh_owner}/%{gh_project}/archive/refs/tags/%{up_version}%{?up_prever:-%{up_prever}}.tar.gz BuildRequires: cmake >= 3.15 BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: make # pkg-config may pull compat-openssl10 BuildRequires: openssl-devel BuildRequires: pkgconfig(libsasl2) BuildRequires: pkgconfig(zlib) BuildRequires: pkgconfig(snappy) BuildRequires: pkgconfig(libutf8proc) BuildRequires: pkgconfig(libzstd) %if %{with tests} BuildRequires: mongodb-server BuildRequires: openssl %endif %if %{with libmongocrypt} BuildRequires: cmake(mongocrypt) >= 1.5.2 %endif BuildRequires: perl-interpreter # From man pages BuildRequires: python3 BuildRequires: python3-sphinx >= 5.0 Requires: %{name}-libs%{?_isa} = %{version}-%{release} # Sub package removed Obsoletes: %{name}-tools < 1.3.0 Provides: %{name}-tools = %{version} Provides: %{name}-tools%{?_isa} = %{version} %description %{name} is a client library written in C for MongoDB. %package libs Summary: Shared libraries for %{name} %description libs This package contains the shared libraries for %{name}. %package devel Summary: Header files and development libraries for %{name} Requires: %{name}%{?_isa} = %{version}-%{release} Requires: pkgconfig Requires: cmake-filesystem Requires: pkgconfig(libzstd) %if %{with libmongocrypt} Requires: cmake(mongocrypt) %endif %description devel This package contains the header files and development libraries for %{name}. Documentation: http://mongoc.org/libmongoc/%{version}/ %package -n libbson Summary: Building, parsing, and iterating BSON documents # Modified (with bson allocator and some warning fixes and huge indentation # refactoring) jsonsl is bundled . # jsonsl upstream likes copylib approach and does not plan a release # . Provides: bundled(jsonsl) %description -n libbson This is a library providing useful routines related to building, parsing, and iterating BSON documents . %package -n libbson-devel Summary: Development files for %{name} Requires: libbson%{?_isa} = %{version}-%{release} Requires: pkgconfig Requires: cmake-filesystem %description -n libbson-devel This package contains libraries and header files needed for developing applications that use %{name}. Documentation: http://mongoc.org/libbson/%{version}/ %prep %setup -q -n %{gh_project}-%{up_version}%{?up_prever:-%{up_prever}} %build %cmake \ -DBUILD_VERSION=%{up_version}%{?up_prever:-%{up_prever}} \ -DENABLE_MONGOC:BOOL=ON \ -DENABLE_SHM_COUNTERS:BOOL=ON \ -DENABLE_SSL:STRING=OPENSSL \ -DENABLE_SASL:STRING=CYRUS \ -DENABLE_MONGODB_AWS_AUTH:STRING=ON \ -DENABLE_AUTOMATIC_INIT_AND_CLEANUP:BOOL=OFF \ -DENABLE_CRYPTO_SYSTEM_PROFILE:BOOL=ON \ -DENABLE_MAN_PAGES:BOOL=ON \ -DENABLE_SHARED:BOOL=ON \ -DENABLE_STATIC:STRING=OFF \ -DENABLE_ZLIB:STRING=SYSTEM \ -DENABLE_ZSTD:STRING=ON \ -DENABLE_SNAPPY:STRING=ON \ %if %{with tests} -DENABLE_TESTS:BOOL=ON \ %else -DENABLE_TESTS:BOOL=OFF \ %endif -DENABLE_EXAMPLES:BOOL=OFF \ -DENABLE_UNINSTALL:BOOL=OFF \ %if %{with libmongocrypt} -DENABLE_CLIENT_SIDE_ENCRYPTION:BOOL=ON \ %else -DENABLE_CLIENT_SIDE_ENCRYPTION:BOOL=OFF \ %endif -DCMAKE_SKIP_RPATH:BOOL=ON \ -DUSE_BUNDLED_UTF8PROC:BOOL=OFF \ -DENABLE_SRV:BOOL=ON \ -DENABLE_MONGODB_AWS_AUTH:STRING=ON \ -S . %if 0%{?cmake_build:1} %cmake_build %else make %{?_smp_mflags} %endif %install %if 0%{?cmake_install:1} %cmake_install %else make install DESTDIR=%{buildroot} %endif : Static library rm -f %{buildroot}%{_libdir}/*.a rm -rf %{buildroot}%{_libdir}/cmake/*static* rm -rf %{buildroot}%{_libdir}/pkgconfig/*static* : Documentation rm -rf %{buildroot}%{_datadir}/%{name} %check ret=0 %if %{with tests} : Run a server mkdir dbtest mongod \ --journal \ --ipv6 \ --unixSocketPrefix /tmp \ --logpath $PWD/server.log \ --pidfilepath $PWD/server.pid \ --dbpath $PWD/dbtest \ --fork : Run the test suite export MONGOC_TEST_OFFLINE=on export MONGOC_TEST_SKIP_MOCK=on #export MONGOC_TEST_SKIP_SLOW=on make check || ret=1 : Cleanup [ -s server.pid ] && kill $(cat server.pid) %endif if grep -r static %{buildroot}%{_libdir}/cmake; then : cmake configuration file contain reference to static library ret=1 fi exit $ret %files %{_bindir}/mongoc-stat %files libs %{!?_licensedir:%global license %%doc} %license COPYING %license THIRD_PARTY_NOTICES %{_libdir}/%{libname}-%{libver}.so.* %files devel %doc src/%{libname}/examples %doc NEWS %{_includedir}/%{libname}-%{libver} %{_libdir}/%{libname}-%{libver}.so %{_libdir}/pkgconfig/%{libname}-*.pc %{_libdir}/cmake/%{libname}-%{libver} %{_libdir}/cmake/mongoc-%{libver} %{_mandir}/man3/mongoc* %files -n libbson %license COPYING %license THIRD_PARTY_NOTICES %{_libdir}/libbson*.so.* %files -n libbson-devel %doc src/libbson/examples %doc src/libbson/NEWS %{_includedir}/libbson-%{libver} %{_libdir}/libbson*.so %{_libdir}/cmake/libbson-%{libver} %{_libdir}/cmake/bson-%{libver} %{_libdir}/pkgconfig/libbson-*.pc %{_mandir}/man3/bson* %changelog * Wed Jan 3 2024 Remi Collet - 1.25.4-1 - update to 1.25.4 * Wed Dec 13 2023 Remi Collet - 1.25.3-1 - update to 1.25.3 * Wed Dec 6 2023 Remi Collet - 1.25.2-1 - update to 1.25.2 * Wed Nov 8 2023 Remi Collet - 1.25.1-1 - update to 1.25.1 * Mon Nov 6 2023 Remi Collet - 1.25.0-1 - update to 1.25.0 - drop dependency on libicu - add dependency on libutf8proc - open https://jira.mongodb.org/browse/CDRIVER-4767 unusable archive * Wed Sep 6 2023 Remi Collet - 1.24.4-1 - update to 1.24.4 (no change) * Thu Aug 17 2023 Remi Collet - 1.24.3-1 - update to 1.24.3 * Thu Jul 20 2023 Fedora Release Engineering - 1.24.2-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild * Thu Jul 13 2023 František Zatloukal - 1.24.2-2 - Rebuilt for ICU 73.2 * Thu Jul 13 2023 Remi Collet - 1.24.2-1 - update to 1.24.2 * Tue Jul 11 2023 František Zatloukal - 1.24.1-2 - Rebuilt for ICU 73.2 * Wed Jun 21 2023 Remi Collet - 1.24.1-1 - update to 1.24.1 * Wed Jun 21 2023 Remi Collet - 1.24.0-1 - update to 1.24.0 * Wed Jun 7 2023 Remi Collet - 1.23.5-1 - update to 1.23.5 * Tue May 9 2023 Remi Collet - 1.23.4-1 - update to 1.23.4 * Wed Apr 5 2023 Remi Collet - 1.23.3-1 - update to 1.23.3 * Thu Jan 19 2023 Fedora Release Engineering - 1.23.2-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild * Wed Jan 4 2023 Remi Collet - 1.23.2-1 - update to 1.23.2 - use SPDX license ID * Sat Dec 31 2022 Pete Walter - 1.23.1-3 - Rebuild for ICU 72 * Thu Oct 20 2022 Remi Collet - 1.23.1-2 - update to 1.23.1 * Thu Sep 8 2022 Remi Collet - 1.23.0-1 - update to 1.23.0 * Wed Aug 3 2022 Remi Collet - 1.22.1-1 - update to 1.22.1 - raise dependency to libmongocrypt 1.5.2 * Mon Aug 01 2022 Frantisek Zatloukal - 1.22.0-3 - Rebuilt for ICU 71.1 * Thu Jul 21 2022 Fedora Release Engineering - 1.22.0-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild * Mon Jul 18 2022 Remi Collet - 1.22.0-1 - update to 1.22.0 - raise dependency to libmongocrypt 1.5.0 * Wed Jun 8 2022 Remi Collet - 1.21.2-1 - update to 1.21.2 (no change) * Wed Mar 2 2022 Remi Collet - 1.21.1-1 - update to 1.21.1 * Wed Feb 2 2022 Remi Collet - 1.21.0-1 - update to 1.21.0 * Thu Jan 20 2022 Fedora Release Engineering - 1.20.1-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild * Thu Jan 6 2022 Remi Collet - 1.20.1-1 - update to 1.20.1 * Thu Nov 18 2021 Remi Collet - 1.20.0-1 - update to 1.20.0 * Thu Nov 4 2021 Remi Collet - 1.19.2-1 - update to 1.19.2 * Wed Oct 6 2021 Remi Collet - 1.19.1-1 - update to 1.19.1 * Tue Sep 14 2021 Sahana Prasad - 1.19.0-2 - Rebuilt with OpenSSL 3.0.0 * Fri Sep 3 2021 Remi Collet - 1.19.0-1 - update to 1.19.0 * Fri Jul 30 2021 Remi Collet - 1.18.0-3 - use better fix for invalid RPATH using upstream solution from https://jira.mongodb.org/browse/CDRIVER-4013 * Thu Jul 22 2021 Fedora Release Engineering - 1.18.0-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild * Wed Jul 14 2021 Remi Collet - 1.18.0-1 - update to 1.18.0 * Wed Jul 7 2021 Remi Collet - 1.17.7-1 - update to 1.17.7 * Thu Jun 3 2021 Remi Collet - 1.17.6-2 - update to 1.17.6 - fix invalid rpath * Thu May 20 2021 Pete Walter - 1.17.5-3 - Rebuild for ICU 69 * Wed May 19 2021 Pete Walter - 1.17.5-2 - Rebuild for ICU 69 * Fri Apr 9 2021 Remi Collet - 1.17.5-1 - update to 1.17.5 (no change) * Thu Feb 4 2021 Remi Collet - 1.17.4-1 - update to 1.17.4 * Tue Jan 26 2021 Fedora Release Engineering - 1.17.3-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild * Wed Dec 2 2020 Remi Collet - 1.17.3-1 - update to 1.17.3 * Wed Nov 4 2020 Remi Collet - 1.17.2-1 - update to 1.17.2 * Wed Oct 7 2020 Remi Collet - 1.17.1-1 - update to 1.17.1 * Fri Jul 31 2020 Remi Collet - 1.17.0-1 - update to 1.17.0 * Tue Jul 28 2020 Fedora Release Engineering - 1.17.0~rc0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild * Fri Jul 24 2020 Remi Collet - 1.17.0~rc0-2 - use more cmake macros - add upstream patch for latest sphinx * Fri Jul 17 2020 Remi Collet - 1.17.0~rc0-1 - update to 1.17.0-rc0 * Thu Jun 11 2020 Remi Collet - 1.17.0~beta2-2 - rebuild * Wed Jun 10 2020 Remi Collet - 1.17.0~beta2-1 - update to 1.17.0-beta2 - drop patch merged upstream * Fri May 15 2020 Pete Walter - 1.17.0~beta-2 - Rebuild for ICU 67 * Wed Apr 15 2020 Remi Collet - 1.17.0~beta-1 - update to 1.17.0-beta - fix cmake for static lilbraries using patch from https://github.com/mongodb/mongo-c-driver/pull/600 * Mon Mar 09 2020 Honza Horak - 1.16.2-2 - Add missing devel libraries to the mongo-c-driver devel sub-package, so depended packages find them * Tue Feb 25 2020 Remi Collet - 1.16.2-1 - update to 1.16.2 (no change) * Tue Feb 4 2020 Remi Collet - 1.16.1-1 - update to 1.16.1 * Wed Jan 29 2020 Fedora Release Engineering - 1.16.0-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild * Tue Jan 21 2020 Remi Collet - 1.16.0-3 - enable client side encryption - add dependency to libmongocrypt * Sat Jan 18 2020 Remi Collet - 1.16.0-2 - clean reference to static library in cmake files - see https://jira.mongodb.org/browse/CDRIVER-3495 * Fri Jan 17 2020 Remi Collet - 1.16.0-1 - update to 1.16.0 - disable client side encryption until #1792224 is approved * Wed Dec 18 2019 Remi Collet - 1.15.3-1 - update to 1.15.3 * Thu Nov 7 2019 Remi Collet - 1.15.2-1 - update to 1.15.2 - add zstd compression support on EL-8 * Fri Nov 01 2019 Pete Walter - 1.15.1-2 - Rebuild for ICU 65 * Mon Sep 2 2019 Remi Collet - 1.15.1-1 - update to 1.15.1 * Wed Aug 21 2019 Remi Collet - 1.15.0-1 - update to 1.15.0 - add zstd compression support on Fedora - use python3 during the build * Thu Jul 25 2019 Fedora Release Engineering - 1.14.0-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild * Mon Feb 25 2019 Remi Collet - 1.14.0-1 - update to 1.14.0 * Thu Jan 31 2019 Remi Collet - 1.13.1-1 - update to 1.13.1 - disable test suite, as MongoDB server is required * Wed Jan 23 2019 Pete Walter - 1.13.0-4 - Rebuild for ICU 63 * Wed Jan 23 2019 Björn Esser - 1.13.0-3 - Append curdir to CMake invokation. (#1668512) * Wed Sep 19 2018 Remi Collet - 1.13.0-2 - enable test suite on all 64-bit arches but skip tests relying on the mock server * Tue Sep 18 2018 Remi Collet - 1.13.0-1 - update to 1.13.0 - open https://jira.mongodb.org/browse/CDRIVER-2827 make install fails - open https://jira.mongodb.org/browse/CDRIVER-2828 test failures - disable test suite * Thu Jul 19 2018 Remi Collet - 1.12.0-1 - update to 1.12.0 * Fri Jul 13 2018 Fedora Release Engineering - 1.11.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild * Tue Jul 10 2018 Pete Walter - 1.11.0-2 - Rebuild for ICU 62 * Sat Jun 23 2018 Remi Collet - 1.11.0-1 - update to 1.11.0 - add dependency on libicu * Wed Jun 20 2018 Remi Collet - 1.10.3-1 - update to 1.10.3 * Fri Jun 8 2018 Remi Collet - 1.10.2-1 - update to 1.10.2 - soname switch back to 0 * Thu May 31 2018 Remi Collet - 1.10.1-1 - update to 1.10.1 * Mon May 28 2018 Remi Collet - 1.10.0-2 - add patch from https://github.com/mongodb/mongo-c-driver/pull/498 for https://jira.mongodb.org/browse/CDRIVER-2667 "mongoc-stat is not supported on your platform" - open https://jira.mongodb.org/browse/CDRIVER-2668 "mongoc-stat build but not installed" * Mon May 28 2018 Remi Collet - 1.10.0-1 - update to 1.10.0 - also build libbson and create new sub-packages - switch to cmake - soname bump to 1 * Wed May 2 2018 Remi Collet - 1.9.5-1 - update to 1.9.5 * Tue Apr 10 2018 Remi Collet - 1.9.4-1 - update to 1.9.4 - ensure all libraries referenced in pkgconfig file are required by devel reported as https://jira.mongodb.org/browse/CDRIVER-2603, #1560611 * Wed Mar 14 2018 Charalampos Stratakis - 1.9.3-2 - Fix docs build with Sphinx >= 1.7 * Thu Mar 1 2018 Remi Collet - 1.9.3-1 - update to 1.9.3 * Thu Feb 22 2018 Remi Collet - 1.9.2-5 - add workaround for https://jira.mongodb.org/browse/CDRIVER-2516 - enable test suite * Wed Feb 14 2018 Remi Collet - 1.9.2-4 - drop ldconfig scriptlets - disable again test suite * Thu Feb 08 2018 Fedora Release Engineering - 1.9.2-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild * Fri Jan 12 2018 Remi Collet - 1.9.2-2 - enable test suite on 64-bit * Fri Jan 12 2018 Remi Collet - 1.9.2-1 - update to 1.9.2 (no change) * Wed Jan 10 2018 Remi Collet - 1.9.1-1 - update to 1.9.1 * Fri Dec 22 2017 Remi Collet - 1.9.0-1 - update to 1.9.0 - raise dependency on libbson 1.9 * Fri Nov 17 2017 Remi Collet - 1.8.2-1 - update to 1.8.2 * Thu Oct 12 2017 Remi Collet - 1.8.1-1 - update to 1.8.1 * Fri Sep 15 2017 Remi Collet - 1.8.0-1 - update to 1.8.0 * Thu Aug 10 2017 Remi Collet - 1.7.0-1 - update to 1.7.0 - disable test suite in rawhide (mongodb-server is broken) * Tue Aug 8 2017 Remi Collet - 1.7.0-0.1.rc2 - update to 1.7.0-rc2 - add --with-snappy and --with-zlib build options * Thu Aug 03 2017 Fedora Release Engineering - 1.6.3-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild * Wed Jul 26 2017 Fedora Release Engineering - 1.6.3-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild * Wed May 24 2017 Remi Collet - 1.6.3-1 - update to 1.6.2 * Tue Mar 28 2017 Remi Collet - 1.6.2-1 - update to 1.6.2 * Wed Mar 8 2017 Remi Collet - 1.6.1-2 - rebuild with new upstream tarball - add examples in devel documentation - use patch instead of sed hacks for rpm specific changes * Tue Mar 7 2017 Remi Collet - 1.6.1-1 - update to 1.6.1 - open https://jira.mongodb.org/browse/CDRIVER-2078 can't build man pages * Thu Feb 9 2017 Remi Collet - 1.6.0-1 - update to 1.6.0 - add fix for https://jira.mongodb.org/browse/CDRIVER-2042 from https://github.com/mongodb/mongo-c-driver/pull/421 * Thu Jan 12 2017 Remi Collet - 1.5.3-1 - update to 1.5.3 * Wed Jan 11 2017 Remi Collet - 1.5.2-1 - update to 1.5.2 - run server on both IPv4 and IPv6 - open https://jira.mongodb.org/browse/CDRIVER-1988 - Failed test - revert IPv6 commit * Tue Dec 20 2016 Remi Collet - 1.5.1-1 - update to 1.5.1 * Mon Nov 28 2016 Remi Collet - 1.5.0-1 - update to 1.5.0 * Fri Nov 18 2016 Remi Collet - 1.5.0-0.5.rc6 - update to 1.5.0-rc6 * Fri Nov 4 2016 Remi Collet - 1.5.0-0.4.rc4 - update to 1.5.0-rc4 * Thu Oct 20 2016 Remi Collet - 1.5.0-0.3.rc3 - update to 1.5.0-rc3 - drop patches merged upstream * Fri Oct 14 2016 Remi Collet - 1.5.0-0.2.rc2 - open https://jira.mongodb.org/browse/CDRIVER-1703 missing files - open https://jira.mongodb.org/browse/CDRIVER-1702 broken test - enable test suite * Fri Oct 14 2016 Remi Collet - 1.5.0-0.1.rc2 - update to 1.5.0-rc2 - drop crypto patch merged upstream - drop the private library - disable test suite * Mon Aug 29 2016 Petr Pisar - 1.3.5-6 - Rebuild against libbson-1.4.0 (bug #1361166) * Tue Jul 26 2016 Remi Collet - 1.3.5-5 - add BR on perl, FTBFS from Koschei * Mon Jun 13 2016 Remi Collet - 1.3.5-4 - add workaround to abicheck failure see https://bugzilla.redhat.com/1345868 * Mon May 16 2016 Remi Collet - 1.3.5-2 - add patch to enforce system crypto policies * Thu Mar 31 2016 Remi Collet - 1.3.5-1 - update to 1.3.5 - use --disable-automatic-init-and-cleanup build option - ignore check for libbson version = libmongoc version * Sat Mar 19 2016 Remi Collet - 1.3.4-2 - build with MONGOC_NO_AUTOMATIC_GLOBALS * Tue Mar 15 2016 Remi Collet - 1.3.4-1 - update to 1.3.4 - drop patch merged upstream * Mon Feb 29 2016 Remi Collet - 1.3.3-2 - cleanup for review - move libraries in "libs" sub-package - add patch to skip online tests open https://github.com/mongodb/mongo-c-driver/pull/314 - temporarily disable test suite on arm (#1303864) - temporarily disable test suite on i686/F24+ (#1313018) * Sun Feb 7 2016 Remi Collet - 1.3.3-1 - Update to 1.3.3 * Tue Feb 2 2016 Remi Collet - 1.3.2-1 - Update to 1.3.2 * Thu Jan 21 2016 Remi Collet - 1.3.1-1 - Update to 1.3.1 * Wed Dec 16 2015 Remi Collet - 1.3.0-1 - Update to 1.3.0 - move tools in devel package * Tue Dec 8 2015 Remi Collet - 1.2.3-1 - Update to 1.2.3 * Tue Dec 8 2015 Remi Collet - 1.3.0-1 - Update to 1.3.0 - open https://jira.mongodb.org/browse/CDRIVER-1040 - ABI breaks * Wed Oct 14 2015 Remi Collet - 1.2.0-1 - Update to 1.2.0 * Sun Oct 4 2015 Remi Collet - 1.2.0-0.6.rc0 - Update to 1.2.0-rc0 * Fri Sep 11 2015 Remi Collet - 1.2.0-0.5.20150903git3eaf73e - add patch to export library verson in the API open https://github.com/mongodb/mongo-c-driver/pull/265 * Fri Sep 4 2015 Remi Collet - 1.2.0-0.4.20150903git3eaf73e - update to version 1.2.0beta1 from git snapshot - https://jira.mongodb.org/browse/CDRIVER-828 missing tests/json * Mon Aug 31 2015 Remi Collet - 1.2.0-0.3.beta - more upstream patch (for EL-6) * Mon Aug 31 2015 Remi Collet - 1.2.0-0.2.beta - Upstream version 1.2.0beta * Wed May 20 2015 Remi Collet - 1.1.6-1 - Upstream version 1.1.6 * Mon May 18 2015 Remi Collet - 1.1.5-1 - Upstream version 1.1.5 * Sat Apr 25 2015 Remi Collet - 1.1.4-3 - test build for upstream patch * Thu Apr 23 2015 Remi Collet - 1.1.4-2 - cleanup build dependencies and options * Wed Apr 22 2015 Remi Collet - 1.1.4-1 - Initial package - open https://jira.mongodb.org/browse/CDRIVER-624 - gcc 5 mongo-c-driver-1.26.0/.evergreen/etc/require-api-version.js000066400000000000000000000001001456567454500235230ustar00rootroot00000000000000db.adminCommand({ "setParameter": 1, "requireApiVersion": 1 }); mongo-c-driver-1.26.0/.evergreen/etc/skip-tests.txt000066400000000000000000000053431456567454500221440ustar00rootroot00000000000000# This file lists known failing or flaky tests that for some reason or another # cannot be fixed and rather should be skipped in Evergreen builds. Note that # listing a test in this file will result in the test being skipped on all # platforms, build variants, tasks, etc. # # The format of this file is as follows: # - one test per line, with an optional comment (total lines in file < 1,000) # - comments begin with a hash (#) character and continue to the end of the line # - lines starting with the comment character and blank lines are ignored # - specify test names as they are known to the test runner (e.g., /some/test) # - specify sub-tests of spec tests by an additional slash (/) and the quoted description # (e.g., /some/spec/test/"sub-test 1") # - placing a comment at the end of a line will cause the test runner to output # the comment text as the skip reason when the test is skipped # # Example entries: # /skip/entire/test # this will be output by the runner as the skip reason # /skip/part/of/spec/test/"sub-test description" # this will also be output /change_stream/live/track_resume_token # (CDRIVER-4344) Condition 'bson_compare (resume_token, &doc2_rt) == 0' failed /ClientPool/pop_timeout # (CDRIVER-4348) precondition failed: duration_usec / 1000 >= 1990 /change_streams/legacy/change-streams # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] /change_streams/legacy/change-streams-resume-allowlist # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] /change_streams/legacy/change-streams-resume-errorLabels # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] /unified/entity-find-cursor # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] /change_streams/legacy/change-streams-errors # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] (on ASAN Tests Ubuntu 18.04 build variant) /transactions/legacy/mongos-recovery-token/"commitTransaction retry fails on new mongos" # fails with server selection timeout (CDRIVER-4268) /transactions/legacy/pin-mongos/"unpin after transient error within a transaction and commit" # (CDRIVER-4351) server selection timeout (on ASAN Tests Ubuntu 18.04 build variant) /Samples # (CDRIVER-4352) strange "heartbeat failed" error /client_side_encryption/bypass_spawning_mongocryptd/mongocryptdBypassSpawn # Fails if crypt_shared is visible mongo-c-driver-1.26.0/.evergreen/etc/spec.patch000066400000000000000000000011311456567454500212370ustar00rootroot00000000000000--- mongo-c-driver.spec +++ mongo-c-driver.spec @@ -10,7 +10,7 @@ %global gh_project mongo-c-driver %global libname libmongoc %global libver 1.0 -%global up_version 1.25.4 +%global up_version 1.26.0 #global up_prever rc0 # disabled as require a MongoDB server %bcond_with tests @@ -20,7 +20,7 @@ Name: mongo-c-driver Summary: Client library written in C for MongoDB -Version: %{up_version}%{?up_prever:~%{up_prever}} +Version: %{up_version}%{?up_prever} Release: 1%{?dist} # See THIRD_PARTY_NOTICES License: Apache-2.0 AND ISC AND MIT AND Zlib mongo-c-driver-1.26.0/.evergreen/generated_configs/000077500000000000000000000000001456567454500221635ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/generated_configs/functions.yml000066400000000000000000000545701456567454500247310ustar00rootroot00000000000000functions: abi-compliance-check: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/abi-compliance-check.sh - command: subprocess.exec type: test params: binary: bash working_dir: mongoc env: AWS_ACCESS_KEY_ID: ${aws_key} AWS_SECRET_ACCESS_KEY: ${aws_secret} args: - -c - | aws s3 cp abi-compliance/compat_reports s3://mciuploads/${project}/${build_variant}/${revision}/${version_id}/${build_id}/abi-compliance/compat_reports --recursive --acl public-read --region us-east-1 [[ ! -f ./abi-compliance/abi-error.txt ]] - command: s3.put params: display_name: "ABI Report:" aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_files_include_filter: mongoc/abi-compliance/compat_reports/**/*.html permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/abi-compliance/compat_report.html backtrace: - command: subprocess.exec params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/debug-core-evergreen.sh bootstrap-mongo-orchestration: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/integration-tests.sh - command: expansions.update type: setup params: file: mongoc/mo-expansion.yml check-headers: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/check-public-decls.sh - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/check-preludes.py . cse-sasl-cyrus-darwinssl-compile: - command: expansions.update params: updates: - { key: SSL, value: DARWIN } - { key: SASL, value: CYRUS } - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: COMPILE_LIBMONGOCRYPT: "ON" args: - -c - EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON ${EXTRA_CONFIGURE_FLAGS}" .evergreen/scripts/compile.sh cse-sasl-cyrus-openssl-compile: - command: expansions.update params: updates: - { key: SSL, value: OPENSSL } - { key: SASL, value: CYRUS } - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: COMPILE_LIBMONGOCRYPT: "ON" args: - -c - EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON ${EXTRA_CONFIGURE_FLAGS}" .evergreen/scripts/compile.sh cse-sasl-cyrus-winssl-compile: - command: expansions.update params: updates: - { key: SSL, value: WINDOWS } - { key: SASL, value: CYRUS } - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: COMPILE_LIBMONGOCRYPT: "ON" args: - -c - EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON ${EXTRA_CONFIGURE_FLAGS}" .evergreen/scripts/compile.sh early-termination: - command: subprocess.exec params: binary: bash args: - -c - | echo 'EVERGREEN HOST WAS UNEXPECTEDLY TERMINATED!!!' 1>&2 echo 'Restart this Evergreen task and try again!' 1>&2 fetch-build: - command: subprocess.exec type: setup params: binary: bash args: - -c - rm -rf mongoc - command: s3.get type: setup params: aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads local_file: build.tar.gz remote_file: ${project}/${build_variant}/${revision}/${BUILD_NAME}/${build_id}.tar.gz - command: archive.targz_extract params: destination: mongoc path: build.tar.gz - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - -c - | for file in $(find .evergreen/scripts -type f); do chmod +rx "$file" || exit done fetch-det: - command: subprocess.exec type: setup params: binary: bash args: - -c - | if [[ ! -d drivers-evergreen-tools ]]; then git clone --depth=1 git@github.com:mongodb-labs/drivers-evergreen-tools.git fi - command: subprocess.exec type: setup params: binary: bash working_dir: drivers-evergreen-tools args: - -c - find .evergreen -type f -name "*.sh" -exec chmod +rx "{}" \; - command: subprocess.exec type: setup params: binary: bash args: - -c - | set -o errexit . drivers-evergreen-tools/.evergreen/find-python3.sh echo "PYTHON3_BINARY: $(find_python3)" >|python3_binary.yml - command: expansions.update type: setup params: file: python3_binary.yml fetch-source: - command: git.get_project type: setup params: directory: mongoc - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - -c - | set -o errexit set -o pipefail if [ -n "${github_pr_number}" -o "${is_patch}" = "true" ]; then # This is a GitHub PR or patch build, probably branched from master if command -v python3 &>/dev/null; then # Prefer python3 if it is available echo $(python3 ./build/calc_release_version.py --next-minor) > VERSION_CURRENT else echo $(python ./build/calc_release_version.py --next-minor) > VERSION_CURRENT fi VERSION=$VERSION_CURRENT-${version_id} else VERSION=latest fi echo "CURRENT_VERSION: $VERSION" > expansion.yml - command: expansions.update type: setup params: file: mongoc/expansion.yml - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - -c - | for file in $(find .evergreen/scripts -type f); do chmod +rx "$file" || exit done kms-divergence-check: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/kms-divergence-check.sh make-docs: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc include_expansions_in_env: - distro_id args: - -c - | set -o errexit bash tools/poetry.sh install --with=docs # See SphinxBuild.cmake for EVG_DOCS_BUILD reasoning bash tools/poetry.sh run env EVG_DOCS_BUILD=1 bash .evergreen/scripts/build-docs.sh openssl-static-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/compile-openssl-static.sh prepare-kerberos: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc silent: true args: - -c - | if test "${keytab|}" && command -v kinit >/dev/null; then echo "${keytab}" > /tmp/drivers.keytab.base64 base64 --decode /tmp/drivers.keytab.base64 > /tmp/drivers.keytab if touch /etc/krb5.conf 2>/dev/null; then cat .evergreen/etc/kerberos.realm | tee -a /etc/krb5.conf elif command sudo true 2>/dev/null; then cat .evergreen/etc/kerberos.realm | sudo tee -a /etc/krb5.conf else echo "Cannot append kerberos.realm to /etc/krb5.conf; skipping." 1>&2 fi fi restore-instance-profile: - command: subprocess.exec params: binary: bash args: - -c - | # Restore the AWS Instance Profile that may have been removed in AWS tasks. if [[ ! -d drivers-evergreen-tools ]]; then echo "drivers-evergreen-tools not present ... skipping" exit 0 fi cd drivers-evergreen-tools/.evergreen/auth_aws if [[ ! -f aws_e2e_setup.json ]]; then echo "aws_e2e_setup.json not present ... skipping" exit 0 fi . ./activate-authawsvenv.sh echo "restoring instance profile ... " # Capture and hide logs on success. Logs may included expected `HTTP Error 404: Not Found` messages when checking for instance profile. if ! { python ./lib/aws_assign_instance_profile.py 2>&1 >|output.txt; }; then echo "restoring instance profile ... failed" cat output.txt 1>&2 exit 1 fi echo "restoring instance profile ... succeeded" run-mock-kms-servers: - command: subprocess.exec type: setup params: binary: bash working_dir: drivers-evergreen-tools/.evergreen/csfle args: - -c - | set -o errexit echo "Preparing KMS TLS venv environment..." # TODO: remove this function along with the "run kms servers" function. if [[ "$OSTYPE" =~ cygwin && ! -d kmstlsvenv ]]; then # Avoid using Python 3.10 on Windows due to incompatible cipher suites. # See CDRIVER-4530. . ../venv-utils.sh venvcreate "C:/python/Python39/python.exe" kmstlsvenv || # windows-2017 venvcreate "C:/python/Python38/python.exe" kmstlsvenv # windows-2015 python -m pip install --upgrade boto3~=1.19 pykmip~=0.10.0 "sqlalchemy<2.0.0" deactivate else . ./activate-kmstlsvenv.sh deactivate fi echo "Preparing KMS TLS venv environment... done." - command: subprocess.exec type: setup params: binary: bash working_dir: drivers-evergreen-tools/.evergreen/csfle background: true args: - -c - | set -o errexit echo "Starting mock KMS TLS servers..." . ./activate-kmstlsvenv.sh python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --port 8999 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/expired.pem --port 9000 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/wrong-host.pem --port 9001 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --require_client_cert --port 9002 & python -u kms_kmip_server.py & deactivate echo "Starting mock KMS TLS servers... done." run-simple-http-server: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc background: true args: - -c - | set -o errexit echo "Starting simple HTTP server..." command -V "${PYTHON3_BINARY}" >/dev/null "${PYTHON3_BINARY}" .evergreen/scripts/simple_http_server.py echo "Starting simple HTTP server... done." run-tests: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/run-tests.sh sasl-cyrus-darwinssl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: CYRUS SSL: DARWIN args: - -c - .evergreen/scripts/compile.sh sasl-cyrus-openssl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: CYRUS SSL: OPENSSL args: - -c - .evergreen/scripts/compile.sh sasl-cyrus-winssl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: CYRUS SSL: WINDOWS args: - -c - .evergreen/scripts/compile.sh sasl-off-nossl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: "OFF" SSL: "OFF" args: - -c - .evergreen/scripts/compile.sh sasl-off-winssl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: "OFF" SSL: WINDOWS args: - -c - .evergreen/scripts/compile.sh sasl-sspi-winssl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: SSPI SSL: WINDOWS args: - -c - .evergreen/scripts/compile.sh scan-build: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true redirect_standard_error_to_output: true args: - -c - .evergreen/scripts/compile-scan-build.sh start-load-balancer: - command: subprocess.exec type: setup params: binary: bash args: - -c - | export DRIVERS_TOOLS=./drivers-evergreen-tools export MONGODB_URI="${MONGODB_URI}" $DRIVERS_TOOLS/.evergreen/run-load-balancer.sh start - command: expansions.update type: setup params: file: lb-expansion.yml std-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/compile-std.sh stop-load-balancer: - command: subprocess.exec params: binary: bash args: - -c - | # Only run if a load balancer was started. if [[ -z "${SINGLE_MONGOS_LB_URI}" ]]; then echo "OK - no load balancer running" exit fi if [[ -d drivers-evergreen-tools ]]; then cd drivers-evergreen-tools && .evergreen/run-load-balancer.sh stop fi stop-mongo-orchestration: - command: subprocess.exec params: binary: bash args: - -c - | if [[ -d MO ]]; then cd MO && mongo-orchestration stop fi upload-build: - command: archive.targz_pack params: include: - ./** source_dir: mongoc target: ${build_id}.tar.gz - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: ${content_type|application/x-gzip} local_file: ${build_id}.tar.gz permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${task_name}/${build_id}.tar.gz upload-docs: - command: subprocess.exec params: binary: bash working_dir: mongoc/_build/for-docs/src/libbson env: AWS_ACCESS_KEY_ID: ${aws_key} AWS_SECRET_ACCESS_KEY: ${aws_secret} args: - -c - aws s3 cp doc/html s3://mciuploads/${project}/docs/libbson/${CURRENT_VERSION} --quiet --recursive --acl public-read --region us-east-1 - command: s3.put params: display_name: libbson docs aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_file: mongoc/_build/for-docs/src/libbson/doc/html/index.html permissions: public-read remote_file: ${project}/docs/libbson/${CURRENT_VERSION}/index.html - command: subprocess.exec params: binary: bash working_dir: mongoc/_build/for-docs/src/libmongoc env: AWS_ACCESS_KEY_ID: ${aws_key} AWS_SECRET_ACCESS_KEY: ${aws_secret} args: - -c - aws s3 cp doc/html s3://mciuploads/${project}/docs/libmongoc/${CURRENT_VERSION} --quiet --recursive --acl public-read --region us-east-1 - command: s3.put params: display_name: libmongoc docs aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_file: mongoc/_build/for-docs/src/libmongoc/doc/html/index.html permissions: public-read remote_file: ${project}/docs/libmongoc/${CURRENT_VERSION}/index.html upload-man-pages: - command: subprocess.exec params: binary: bash working_dir: mongoc silent: true args: - -c - | set -o errexit # Get "aha", the ANSI HTML Adapter. git clone --depth 1 https://github.com/theZiz/aha.git aha-repo pushd aha-repo make popd # aha-repo mv aha-repo/aha . .evergreen/scripts/man-pages-to-html.sh libbson _build/for-docs/src/libbson/doc/man > bson-man-pages.html .evergreen/scripts/man-pages-to-html.sh libmongoc _build/for-docs/src/libmongoc/doc/man > mongoc-man-pages.html - command: s3.put params: display_name: libbson man pages aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_file: mongoc/bson-man-pages.html permissions: public-read remote_file: ${project}/man-pages/libbson/${CURRENT_VERSION}/index.html - command: s3.put params: display_name: libmongoc man pages aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_file: mongoc/mongoc-man-pages.html permissions: public-read remote_file: ${project}/man-pages/libmongoc/${CURRENT_VERSION}/index.html upload-mo-artifacts: - command: subprocess.exec params: binary: bash working_dir: mongoc args: - -c - | set -o errexit declare dir="MO" if [[ -d "/cygdrive/c/data/mo" ]]; then dir="/cygdrive/c/data/mo" fi if [[ -d "$dir" ]]; then find "$dir" -name \*.log | xargs tar czf mongodb-logs.tar.gz fi - command: s3.put params: display_name: mongodb-logs.tar.gz aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: ${content_type|application/x-gzip} local_file: mongoc/mongodb-logs.tar.gz optional: true permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-mongodb-logs.tar.gz - command: s3.put params: display_name: orchestration.log aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: ${content_type|text/plain} local_file: mongoc/MO/server.log optional: true permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-orchestration.log - command: subprocess.exec params: binary: bash working_dir: mongoc args: - -c - | set -o errexit # Find all core files from mongodb in orchestration and move to mongoc declare dir="MO" if [[ -d "/cygdrive/c/data/mo" ]]; then dir="/cygdrive/c/data/mo" fi declare mdmp_dir="$dir" if [[ -d "/cygdrive/c/mongodb" ]]; then mdmp_dir="/cygdrive/c/mongodb" fi for core_file in $(find -H "$dir" "$mdmp_dir" \( -name "*.core" -o -name "*.mdmp" \) 2> /dev/null); do declare base_name base_name="$(echo "$core_file" | sed "s/.*\///")" # Move file if it does not already exist if [[ ! -f "$base_name" ]]; then mv "$core_file" . fi done - command: archive.targz_pack params: include: - ./**.core - ./**.mdmp source_dir: mongoc target: mongo-coredumps.tgz - command: s3.put params: display_name: Core Dumps - Execution ${execution} aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: ${content_type|application/x-gzip} local_file: mongo-coredumps.tgz optional: true permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/coredumps/${task_id}-${execution}-coredumps.log upload-test-results: - command: subprocess.exec params: binary: bash args: - -c - | mkdir -p mongoc touch mongoc/test-results.json - command: attach.results params: file_location: mongoc/test-results.json mongo-c-driver-1.26.0/.evergreen/generated_configs/legacy-config.yml000066400000000000000000014141371456567454500254300ustar00rootroot00000000000000#################################### # Evergreen configuration # # Generated with evergreen_config_generator from # github.com/mongodb-labs/drivers-evergreen-tools # # DO NOT EDIT THIS FILE # #################################### functions: install ssl: - command: shell.exec params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit bash .evergreen/scripts/install-ssl.sh upload coverage: - command: shell.exec params: silent: true working_dir: mongoc shell: bash script: |- set -o errexit export AWS_ACCESS_KEY_ID=${aws_key} export AWS_SECRET_ACCESS_KEY=${aws_secret} aws s3 cp coverage s3://mciuploads/${project}/${build_variant}/${revision}/${version_id}/${build_id}/coverage/ --recursive --acl public-read --region us-east-1 - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/coverage/index.html bucket: mciuploads permissions: public-read local_file: mongoc/coverage/index.html content_type: text/html display_name: Coverage Report upload scan artifacts: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit if find scan -name \*.html | grep -q html; then (cd scan && find . -name index.html -exec echo "
  • {}
  • " \;) >> scan.html else echo "No issues found" > scan.html fi - command: shell.exec params: silent: true working_dir: mongoc shell: bash script: |- set -o errexit export AWS_ACCESS_KEY_ID=${aws_key} export AWS_SECRET_ACCESS_KEY=${aws_secret} aws s3 cp scan s3://mciuploads/${project}/${build_variant}/${revision}/${version_id}/${build_id}/scan/ --recursive --acl public-read --region us-east-1 - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/scan/index.html bucket: mciuploads permissions: public-read local_file: mongoc/scan.html content_type: text/html display_name: Scan Build Report run auth tests: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit bash .evergreen/scripts/run-auth-tests.sh link sample program: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit # Compile a program that links dynamically or statically to libmongoc, # using variables from pkg-config or CMake's find_package command. export BUILD_SAMPLE_WITH_CMAKE=${BUILD_SAMPLE_WITH_CMAKE} export BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=${BUILD_SAMPLE_WITH_CMAKE_DEPRECATED} export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} LINK_STATIC= bash .evergreen/scripts/link-sample-program.sh LINK_STATIC=1 bash .evergreen/scripts/link-sample-program.sh link sample program bson: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit # Compile a program that links dynamically or statically to libbson, # using variables from pkg-config or from CMake's find_package command. BUILD_SAMPLE_WITH_CMAKE= BUILD_SAMPLE_WITH_CMAKE_DEPRECATED= LINK_STATIC= bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE= BUILD_SAMPLE_WITH_CMAKE_DEPRECATED= LINK_STATIC=1 bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED= LINK_STATIC= bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED= LINK_STATIC=1 bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=1 LINK_STATIC= bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=1 LINK_STATIC=1 bash .evergreen/scripts/link-sample-program-bson.sh link sample program MSVC: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit # Build libmongoc with CMake and compile a program that links # dynamically or statically to it, using variables from CMake's # find_package command. export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} . .evergreen/scripts/use-tools.sh paths . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(native-path "$(find_cmake_latest)")" LINK_STATIC= cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc.cmd LINK_STATIC=1 cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc.cmd link sample program mingw: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit # Build libmongoc with CMake and compile a program that links # dynamically to it, using variables from pkg-config.exe. . .evergreen/scripts/use-tools.sh paths . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(native-path "$(find_cmake_latest)")" cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-mingw.cmd link sample program MSVC bson: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit # Build libmongoc with CMake and compile a program that links # dynamically or statically to it, using variables from CMake's # find_package command. export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} . .evergreen/scripts/use-tools.sh paths . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(native-path "$(find_cmake_latest)")" LINK_STATIC= cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc-bson.cmd LINK_STATIC=1 cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc-bson.cmd link sample program mingw bson: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit # Build libmongoc with CMake and compile a program that links # dynamically to it, using variables from pkg-config.exe. . .evergreen/scripts/use-tools.sh paths . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(native-path "$(find_cmake_latest)")" cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-mingw-bson.cmd update codecov.io: - command: shell.exec params: working_dir: mongoc shell: bash script: |- set -o errexit # Note: coverage is currently only enabled on the ubuntu1804 distro. # This script does not support MacOS, Windows, or non-x86_64 distros. # Update accordingly if code coverage is expanded to other distros. curl -Os https://uploader.codecov.io/latest/linux/codecov chmod +x codecov # -Z: Exit with a non-zero value if error. # -g: Run with gcov support. # -t: Codecov upload token. # perl: filter verbose "Found" list and "Processing" messages. ./codecov -Zgt "${codecov_token}" | perl -lne 'print if not m|^.*\.gcov(\.\.\.)?$|' compile coverage: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit COVERAGE=ON DEBUG=ON bash .evergreen/scripts/compile.sh build mongohouse: - command: shell.exec type: test params: shell: bash script: |- set -o errexit cd drivers-evergreen-tools export DRIVERS_TOOLS=$(pwd) bash .evergreen/atlas_data_lake/pull-mongohouse-image.sh run mongohouse: - command: shell.exec type: test params: shell: bash script: |- set -o errexit cd drivers-evergreen-tools export DRIVERS_TOOLS=$(pwd) bash .evergreen/atlas_data_lake/run-mongohouse-image.sh test mongohouse: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit echo "Waiting for mongohouse to start..." wait_for_mongohouse() { for _ in $(seq 300); do # Exit code 7: "Failed to connect to host". if curl -s localhost:$1; (("$?" != 7)); then return 0 else sleep 1 fi done echo "Could not detect mongohouse on port $1" 1>&2 return 1 } wait_for_mongohouse 27017 || exit echo "Waiting for mongohouse to start... done." pgrep -a "mongohouse" export RUN_MONGOHOUSE_TESTS=ON ./src/libmongoc/test-libmongoc --no-fork -l /mongohouse/* -d --skip-tests .evergreen/etc/skip-tests.txt run aws tests: - command: ec2.assume_role params: role_arn: ${aws_test_secrets_role} - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN shell: bash script: |- set -o errexit pushd ../drivers-evergreen-tools/.evergreen/auth_aws ./setup_secrets.sh drivers/aws_auth popd # ../drivers-evergreen-tools/.evergreen/auth_aws - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - TESTCASE shell: bash script: |- set -o errexit pushd ../drivers-evergreen-tools/.evergreen/auth_aws . ./activate-authawsvenv.sh popd # ../drivers-evergreen-tools/.evergreen/auth_aws bash .evergreen/scripts/run-aws-tests.sh tasks: - name: hardened-compile tags: - hardened commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-fno-strict-overflow -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -O" DEBUG="ON" LDFLAGS="-pie -Wl,-z,relro -Wl,-z,now" SNAPPY="OFF" ZLIB="OFF" ZSTD="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-compression-zlib tags: - compression - zlib commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SNAPPY="OFF" ZLIB="BUNDLED" ZSTD="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-compression-snappy tags: - compression - snappy commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SNAPPY="ON" ZLIB="OFF" ZSTD="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-compression-zstd tags: - compression - zstd commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SNAPPY="OFF" ZLIB="OFF" ZSTD="ON" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-compression tags: - compression - snappy - zlib - zstd commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SNAPPY="ON" ZLIB="BUNDLED" ZSTD="ON" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-no-align tags: - debug-compile commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" EXTRA_CONFIGURE_FLAGS="-DENABLE_EXTRA_ALIGNMENT=OFF" SNAPPY="OFF" ZLIB="BUNDLED" ZSTD="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-nossl tags: - debug-compile - nosasl - nossl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SSL="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-lto commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-flto" DEBUG="ON" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-lto-thin commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-flto=thin" DEBUG="ON" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-no-counters tags: - debug-compile - no-counters commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" ENABLE_SHM_COUNTERS="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-asan-clang tags: - asan-clang - debug-compile - special commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-fno-omit-frame-pointer" CHECK_LOG="ON" DEBUG="ON" EXTRA_CONFIGURE_FLAGS="-DENABLE_EXTRA_ALIGNMENT=OFF" SANITIZE="address" SNAPPY="OFF" ZLIB="BUNDLED" ZSTD="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-asan-clang-openssl tags: - asan-clang - debug-compile - special commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-fno-omit-frame-pointer" CHECK_LOG="ON" DEBUG="ON" EXTRA_CONFIGURE_FLAGS="-DENABLE_EXTRA_ALIGNMENT=OFF" SANITIZE="address" SNAPPY="OFF" SSL="OPENSSL" ZLIB="BUNDLED" ZSTD="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: compile-tracing commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-Werror -Wno-cast-align" DEBUG="ON" TRACING="ON" bash .evergreen/scripts/compile.sh - func: upload-build - name: release-compile commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env RELEASE="ON" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-openssl tags: - debug-compile - nosasl - openssl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SSL="OPENSSL" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-openssl-static tags: - debug-compile - nosasl - openssl-static commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SSL="OPENSSL_STATIC" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-darwinssl tags: - darwinssl - debug-compile - nosasl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SSL="DARWIN" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-winssl tags: - debug-compile - nosasl - winssl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SSL="WINDOWS" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sasl-nossl tags: - debug-compile - nossl - sasl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SASL="AUTO" SSL="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sasl-openssl tags: - debug-compile - openssl - sasl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SASL="AUTO" SSL="OPENSSL" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sasl-openssl-static tags: - debug-compile - openssl-static - sasl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SASL="AUTO" SSL="OPENSSL_STATIC" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sasl-darwinssl tags: - darwinssl - debug-compile - sasl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SASL="AUTO" SSL="DARWIN" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sspi-nossl tags: - debug-compile - nossl - sspi commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SASL="SSPI" SSL="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sspi-openssl tags: - debug-compile - openssl - sspi commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SASL="SSPI" SSL="OPENSSL" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sspi-openssl-static tags: - debug-compile - openssl-static - sspi commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SASL="SSPI" SSL="OPENSSL_STATIC" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-rdtscp commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" ENABLE_RDTSCP="ON" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sspi-winssl tags: - debug-compile - sspi - winssl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SASL="SSPI" SSL="WINDOWS" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosrv tags: - debug-compile commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG="ON" SRV="OFF" bash .evergreen/scripts/compile.sh - func: upload-build - name: link-with-cmake commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 - name: link-with-cmake-ssl commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 ENABLE_SSL: 1 - name: link-with-cmake-snappy commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 ENABLE_SNAPPY: 'ON' - name: link-with-cmake-mac commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 - name: link-with-cmake-deprecated commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED: 1 - name: link-with-cmake-ssl-deprecated commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED: 1 ENABLE_SSL: 1 - name: link-with-cmake-snappy-deprecated commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED: 1 ENABLE_SNAPPY: 'ON' - name: link-with-cmake-mac-deprecated commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED: 1 - name: link-with-cmake-windows commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program MSVC - name: link-with-cmake-windows-ssl commands: - func: fetch-det - func: bootstrap-mongo-orchestration vars: SSL: openssl - func: link sample program MSVC vars: ENABLE_SSL: 1 - name: link-with-cmake-windows-snappy commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program MSVC vars: ENABLE_SNAPPY: 'ON' - name: link-with-cmake-mingw commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program mingw - name: link-with-pkg-config commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program - name: link-with-pkg-config-mac commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program - name: link-with-pkg-config-ssl commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: ENABLE_SSL: 1 - name: link-with-bson commands: - func: link sample program bson - name: link-with-bson-mac commands: - func: link sample program bson - name: link-with-bson-windows commands: - func: link sample program MSVC bson - name: link-with-bson-mingw commands: - func: link sample program mingw bson - name: debian-package-build commands: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit export IS_PATCH="${is_patch}" sh .evergreen/scripts/debian_package_build.sh - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/mongo-c-driver-debian-packages-${CURRENT_VERSION}.tar.gz bucket: mciuploads permissions: public-read local_file: deb.tar.gz content_type: ${content_type|application/x-gzip} - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-debian-packages.tar.gz bucket: mciuploads permissions: public-read local_file: deb.tar.gz content_type: ${content_type|application/x-gzip} - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/mongo-c-driver-debian-packages-i386-${CURRENT_VERSION}.tar.gz bucket: mciuploads permissions: public-read local_file: deb-i386.tar.gz content_type: ${content_type|application/x-gzip} - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-debian-packages-i386.tar.gz bucket: mciuploads permissions: public-read local_file: deb-i386.tar.gz content_type: ${content_type|application/x-gzip} - name: rpm-package-build commands: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit sh .evergreen/scripts/build_snapshot_rpm.sh - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/mongo-c-driver-rpm-packages-${CURRENT_VERSION}.tar.gz bucket: mciuploads permissions: public-read local_file: rpm.tar.gz content_type: ${content_type|application/x-gzip} - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-rpm-packages.tar.gz bucket: mciuploads permissions: public-read local_file: rpm.tar.gz content_type: ${content_type|application/x-gzip} - name: install-uninstall-check-mingw commands: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(find_cmake_latest)" export CC="C:/mingw-w64/x86_64-4.9.1-posix-seh-rt_v3-rev1/mingw64/bin/gcc.exe" BSON_ONLY=1 cmd.exe /c .\\.evergreen\\scripts\\install-uninstall-check-windows.cmd cmd.exe /c .\\.evergreen\\scripts\\install-uninstall-check-windows.cmd - name: install-uninstall-check-msvc commands: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(find_cmake_latest)" export CC="Visual Studio 14 2015 Win64" BSON_ONLY=1 cmd.exe /c .\\.evergreen\\scripts\\install-uninstall-check-windows.cmd cmd.exe /c .\\.evergreen\\scripts\\install-uninstall-check-windows.cmd - name: install-uninstall-check commands: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(find_cmake_latest)" DESTDIR="$(pwd)/dest" bash ./.evergreen/scripts/install-uninstall-check.sh BSON_ONLY=1 bash ./.evergreen/scripts/install-uninstall-check.sh bash ./.evergreen/scripts/install-uninstall-check.sh - name: debug-compile-with-warnings commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-Werror -Wno-cast-align" DEBUG="ON" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sasl-openssl-static-cse tags: - client-side-encryption - debug-compile - openssl-static - sasl - special commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env COMPILE_LIBMONGOCRYPT="ON" DEBUG="ON" EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON" SASL="AUTO" SSL="OPENSSL_STATIC" bash .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-openssl-1.0.1 commands: - func: install ssl vars: SSL: openssl-1.0.1u - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-Wno-redundant-decls" DEBUG="ON" SASL="OFF" SSL="OPENSSL" bash .evergreen/scripts/compile.sh - func: upload-build - name: build-and-test-with-toolchain commands: - command: s3.get params: aws_key: ${toolchain_aws_key} aws_secret: ${toolchain_aws_secret} remote_file: mongo-c-toolchain/${distro_id}/2023/06/07/mongo-c-toolchain.tar.gz bucket: mongo-c-toolchain local_file: mongo-c-toolchain.tar.gz - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit bash ./.evergreen/scripts/build-and-test-with-toolchain.sh - name: install-libmongoc-after-libbson commands: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit bash ./.evergreen/scripts/install-libmongoc-after-libbson.sh - name: test-coverage-latest-replica-set-auth-sasl-openssl tags: - latest - test-coverage commands: - func: compile coverage vars: SASL: AUTO SSL: OPENSSL - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest SSL: openssl TOPOLOGY: replica_set - func: run-simple-http-server - func: run-tests vars: AUTH: auth COVERAGE: 'ON' SSL: openssl - func: upload coverage - func: update codecov.io - name: test-coverage-latest-replica-set-auth-sasl-openssl-cse tags: - client-side-encryption - latest - test-coverage commands: - func: compile coverage vars: COMPILE_LIBMONGOCRYPT: 'ON' EXTRA_CONFIGURE_FLAGS: EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON" SASL: AUTO SSL: OPENSSL - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest SSL: openssl TOPOLOGY: replica_set - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests vars: AUTH: auth CLIENT_SIDE_ENCRYPTION: 'ON' COVERAGE: 'ON' SSL: openssl - func: upload coverage - func: update codecov.io - name: test-dns-openssl depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth SSL: ssl TOPOLOGY: replica_set - func: run-tests vars: AUTH: noauth DNS: 'on' SSL: ssl - name: test-dns-winssl depends_on: name: debug-compile-sspi-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sspi-winssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth SSL: ssl TOPOLOGY: replica_set - func: run-tests vars: AUTH: noauth DNS: 'on' SSL: ssl - name: test-dns-darwinssl depends_on: name: debug-compile-sasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-darwinssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth SSL: ssl TOPOLOGY: replica_set - func: run-tests vars: AUTH: noauth DNS: 'on' SSL: ssl - name: test-dns-loadbalanced-openssl depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: 'on' SSL: ssl TOPOLOGY: sharded_cluster - func: fetch-det - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth DNS: loadbalanced SSL: ssl - name: test-dns-auth-openssl depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth SSL: ssl TOPOLOGY: replica_set AUTHSOURCE: thisDB - func: run-tests vars: AUTH: auth DNS: dns-auth SSL: ssl - name: test-dns-auth-winssl depends_on: name: debug-compile-sspi-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sspi-winssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth SSL: ssl TOPOLOGY: replica_set AUTHSOURCE: thisDB - func: run-tests vars: AUTH: auth DNS: dns-auth SSL: ssl - name: test-dns-auth-darwinssl depends_on: name: debug-compile-sasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-darwinssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth SSL: ssl TOPOLOGY: replica_set AUTHSOURCE: thisDB - func: run-tests vars: AUTH: auth DNS: dns-auth SSL: ssl - name: test-latest-server-compression-zlib tags: - compression - latest - zlib depends_on: name: debug-compile-compression-zlib commands: - func: fetch-build vars: BUILD_NAME: debug-compile-compression-zlib - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth ORCHESTRATION_FILE: zlib SSL: nossl - func: run-simple-http-server - func: run-tests vars: AUTH: noauth COMPRESSORS: zlib SSL: nossl - name: test-latest-server-compression-snappy tags: - compression - latest - snappy depends_on: name: debug-compile-compression-snappy commands: - func: fetch-build vars: BUILD_NAME: debug-compile-compression-snappy - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth ORCHESTRATION_FILE: snappy SSL: nossl - func: run-simple-http-server - func: run-tests vars: AUTH: noauth COMPRESSORS: snappy SSL: nossl - name: test-latest-server-compression-zstd tags: - compression - latest - zstd depends_on: name: debug-compile-compression-zstd commands: - func: fetch-build vars: BUILD_NAME: debug-compile-compression-zstd - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth ORCHESTRATION_FILE: zstd SSL: nossl - func: run-simple-http-server - func: run-tests vars: AUTH: noauth COMPRESSORS: zstd SSL: nossl - name: test-latest-server-compression tags: - compression - latest - snappy - zlib - zstd depends_on: name: debug-compile-compression commands: - func: fetch-build vars: BUILD_NAME: debug-compile-compression - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth ORCHESTRATION_FILE: snappy-zlib-zstd SSL: nossl - func: run-simple-http-server - func: run-tests vars: AUTH: noauth COMPRESSORS: snappy,zlib,zstd SSL: nossl - name: retry-true-latest-server depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: URI: mongodb://localhost/?retryWrites=true - name: test-latest-server-hardened tags: - hardened - latest depends_on: name: hardened-compile commands: - func: fetch-build vars: BUILD_NAME: hardened-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: URI: null - name: authentication-tests-openssl tags: - authentication-tests - openssl - sasl depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: prepare-kerberos - func: run auth tests - name: authentication-tests-darwinssl tags: - authentication-tests - darwinssl - sasl depends_on: name: debug-compile-sasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-darwinssl - func: prepare-kerberos - func: run auth tests - name: authentication-tests-winssl tags: - authentication-tests - sspi - winssl depends_on: name: debug-compile-sspi-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sspi-winssl - func: prepare-kerberos - func: run auth tests - name: authentication-tests-openssl-nosasl tags: - authentication-tests - nosasl - openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: prepare-kerberos - func: run auth tests - name: test-mongohouse depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: fetch-det - func: build mongohouse - func: run mongohouse - func: test mongohouse - name: authentication-tests-asan-memcheck tags: - asan - authentication-tests commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SANITIZE=address DEBUG=ON SASL=AUTO SSL=OPENSSL EXTRA_CONFIGURE_FLAGS='-DENABLE_EXTRA_ALIGNMENT=OFF' bash .evergreen/scripts/compile.sh - func: prepare-kerberos - func: run auth tests vars: ASAN: 'on' - name: test-versioned-api-7.0 tags: - '7.0' - versioned-api depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' REQUIRE_API_VERSION: 'true' SSL: ssl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: auth MONGODB_API_VERSION: 1 SSL: ssl - name: test-versioned-api-accept-version-two-7.0 tags: - '7.0' - versioned-api depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: versioned-api-testing SSL: nossl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: noauth MONGODB_API_VERSION: 1 SSL: nossl - name: test-versioned-api-6.0 tags: - '6.0' - versioned-api depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' REQUIRE_API_VERSION: 'true' SSL: ssl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: auth MONGODB_API_VERSION: 1 SSL: ssl - name: test-versioned-api-accept-version-two-6.0 tags: - '6.0' - versioned-api depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: versioned-api-testing SSL: nossl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: noauth MONGODB_API_VERSION: 1 SSL: nossl - name: test-versioned-api-5.0 tags: - '5.0' - versioned-api depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' REQUIRE_API_VERSION: 'true' SSL: ssl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: auth MONGODB_API_VERSION: 1 SSL: ssl - name: test-versioned-api-accept-version-two-5.0 tags: - '5.0' - versioned-api depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: versioned-api-testing SSL: nossl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: noauth MONGODB_API_VERSION: 1 SSL: nossl - name: build-and-run-authentication-tests-openssl-1.0.1 commands: - func: install ssl vars: SSL: openssl-1.0.1u - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS=-Wno-redundant-decls DEBUG=ON SASL=OFF SSL=OPENSSL bash .evergreen/scripts/compile.sh - func: run auth tests - func: upload-build - name: build-and-run-authentication-tests-openssl-1.0.1-fips commands: - func: install ssl vars: SSL: openssl-1.0.1u-fips - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS=-Wno-redundant-decls DEBUG=ON SASL=OFF SSL=OPENSSL bash .evergreen/scripts/compile.sh - func: run auth tests - func: upload-build - name: build-and-run-authentication-tests-openssl-1.0.2 commands: - func: install ssl vars: SSL: openssl-1.0.2l - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS=-Wno-redundant-decls DEBUG=ON SASL=OFF SSL=OPENSSL bash .evergreen/scripts/compile.sh - func: run auth tests - func: upload-build - name: build-and-run-authentication-tests-openssl-1.1.0 commands: - func: install ssl vars: SSL: openssl-1.1.0l - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG=ON SASL=OFF SSL=OPENSSL bash .evergreen/scripts/compile.sh - func: run auth tests - func: upload-build - name: build-and-run-authentication-tests-libressl-2.5 commands: - func: install ssl vars: SSL: libressl-2.5.2 - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG=ON SASL=OFF SSL=LIBRESSL bash .evergreen/scripts/compile.sh - func: run auth tests vars: require_tls12: true - func: upload-build - name: build-and-run-authentication-tests-libressl-3.0-auto commands: - func: install ssl vars: SSL: libressl-3.0.2 - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG=ON SASL=OFF SSL=AUTO bash .evergreen/scripts/compile.sh - func: run auth tests vars: require_tls12: true - func: upload-build - name: build-and-run-authentication-tests-libressl-3.0 commands: - func: install ssl vars: SSL: libressl-3.0.2 - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env DEBUG=ON SASL=OFF SSL=LIBRESSL bash .evergreen/scripts/compile.sh - func: run auth tests vars: require_tls12: true - func: upload-build - name: test-latest-server-ipv6-client-ipv6-noauth-nosasl-nossl tags: - ipv4-ipv6 - latest - nosasl - nossl - server depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: IPV4_ONLY: 'off' - func: run-simple-http-server - func: run-tests vars: IPV4_ONLY: 'off' URI: mongodb://[::1]/ - name: test-latest-server-ipv6-client-ipv4-noauth-nosasl-nossl tags: - ipv4-ipv6 - latest - nosasl - nossl - server depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: IPV4_ONLY: 'off' - func: run-simple-http-server - func: run-tests vars: IPV4_ONLY: 'off' URI: mongodb://127.0.0.1/ - name: test-latest-server-ipv4-client-ipv4-noauth-nosasl-nossl tags: - ipv4-ipv6 - latest - nosasl - nossl - server depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: IPV4_ONLY: 'on' - func: run-simple-http-server - func: run-tests vars: IPV4_ONLY: 'on' URI: mongodb://127.0.0.1/ - name: test-latest-server-ipv4-client-localhost-noauth-nosasl-nossl tags: - ipv4-ipv6 - latest - nosasl - nossl - server depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: IPV4_ONLY: 'on' - func: run-simple-http-server - func: run-tests vars: IPV4_ONLY: 'on' URI: mongodb://localhost/ - name: debug-compile-aws commands: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit export distro_id='${distro_id}' # Required by find_cmake_latest. . .evergreen/scripts/find-cmake-latest.sh cmake_binary="$(find_cmake_latest)" # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$(pwd)" CCACHE_NOHASHDIR=1 # Compile test-awsauth. Disable unnecessary dependencies since test-awsauth is copied to a remote Ubuntu 20.04 ECS cluster for testing, which may not have all dependent libraries. export CC='${CC}' "$cmake_binary" -DENABLE_TRACING=ON -DENABLE_SASL=OFF -DENABLE_SNAPPY=OFF -DENABLE_ZSTD=OFF -DENABLE_CLIENT_SIDE_ENCRYPTION=OFF . "$cmake_binary" --build . --target test-awsauth - func: upload-build - name: test-aws-openssl-regular-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-regular-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-regular-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-regular-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-regular-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-ec2-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ec2-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ec2-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ec2-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ec2-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ecs-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-ecs-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-ecs-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-ecs-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-ecs-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-lambda-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-lambda-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-lambda-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-lambda-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-lambda-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-assume_role-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role_with_web_identity-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: test-aws-openssl-assume_role_with_web_identity-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: test-aws-openssl-assume_role_with_web_identity-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: test-aws-openssl-assume_role_with_web_identity-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: test-aws-openssl-assume_role_with_web_identity-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: ocsp-openssl-test_1-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-rsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_1-ecdsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-rsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_2-ecdsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-delegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-delegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-delegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-delegate-5.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-delegate-4.4 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-rsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-nodelegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-nodelegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-nodelegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-nodelegate-5.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_3-rsa-nodelegate-4.4 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_3-ecdsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-delegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-delegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-delegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-delegate-5.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-delegate-4.4 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-rsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-nodelegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-nodelegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-nodelegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-nodelegate-5.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-nodelegate-4.4 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-test_4-ecdsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-rsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-rsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-rsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-rsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-rsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-soft_fail_test-rsa-nodelegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-soft_fail_test-rsa-nodelegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-soft_fail_test-rsa-nodelegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-soft_fail_test-rsa-nodelegate-5.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-soft_fail_test-rsa-nodelegate-4.4 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-ecdsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-ecdsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-ecdsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-ecdsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-soft_fail_test-ecdsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-delegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-delegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-delegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-delegate-5.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-delegate-4.4 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-delegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-delegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-delegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-delegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-delegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-rsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-nodelegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-nodelegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-nodelegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-nodelegate-5.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-nodelegate-4.4 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_1-ecdsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-rsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-rsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-rsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-rsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-rsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-ecdsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-ecdsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-ecdsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-ecdsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-1.0.1-malicious_server_test_2-ecdsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-rsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-rsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-rsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-rsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-rsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=rsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-ecdsa-nodelegate-latest tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-ecdsa-nodelegate-7.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-ecdsa-nodelegate-6.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-ecdsa-nodelegate-5.0 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-1.0.1-cache-ecdsa-nodelegate-4.4 tags: - ocsp-openssl-1.0.1 depends_on: name: debug-compile-nosasl-openssl-1.0.1 commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl-1.0.1 - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF bash .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE=ecdsa bash .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: testazurekms-task commands: - func: fetch-source - command: shell.exec params: add_expansions_to_env: true shell: bash script: |- set -o errexit echo "Building test-azurekms ... begin" pushd mongoc ./.evergreen/scripts/compile-test-azurekms.sh popd echo "Building test-azurekms ... end" echo "Copying files ... begin" export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools mkdir testazurekms cp ./mongoc/src/libmongoc/test-azurekms ./mongoc/install/lib/libmongocrypt.* testazurekms tar czf testazurekms.tgz testazurekms/* AZUREKMS_SRC="testazurekms.tgz" \ AZUREKMS_DST="./" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/copy-file.sh echo "Copying files ... end" echo "Untarring file ... begin" AZUREKMS_CMD="tar xf testazurekms.tgz" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh echo "Untarring file ... end" - command: shell.exec type: test params: shell: bash script: |- set -o errexit export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools AZUREKMS_CMD="LD_LIBRARY_PATH=./testazurekms MONGODB_URI='mongodb://localhost:27017' KEY_NAME='${testazurekms_keyname}' KEY_VAULT_ENDPOINT='${testazurekms_keyvaultendpoint}' ./testazurekms/test-azurekms" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh - name: testazurekms-fail-task commands: - func: fetch-source - command: shell.exec params: add_expansions_to_env: true shell: bash script: |- set -o errexit pushd mongoc ./.evergreen/scripts/compile-test-azurekms.sh popd - command: shell.exec type: test params: shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$PWD/install \ MONGODB_URI='mongodb://localhost:27017' \ KEY_NAME='${testazurekms_keyname}' \ KEY_VAULT_ENDPOINT='${testazurekms_keyvaultendpoint}' \ EXPECT_ERROR='Error from Azure IMDS server' \ ./mongoc/src/libmongoc/test-azurekms - name: testgcpkms-task commands: - func: fetch-source - command: shell.exec params: add_expansions_to_env: true shell: bash script: |- set -o errexit echo "Building test-gcpkms ... begin" pushd mongoc ./.evergreen/scripts/compile-test-gcpkms.sh popd echo "Building test-gcpkms ... end" echo "Copying files ... begin" export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools mkdir testgcpkms cp ./mongoc/src/libmongoc/test-gcpkms ./mongoc/install/lib/libmongocrypt.* testgcpkms tar czf testgcpkms.tgz testgcpkms/* GCPKMS_SRC="testgcpkms.tgz" GCPKMS_DST=$GCPKMS_INSTANCENAME: $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/copy-file.sh echo "Copying files ... end" echo "Untarring file ... begin" GCPKMS_CMD="tar xf testgcpkms.tgz" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh echo "Untarring file ... end" - command: shell.exec type: test params: shell: bash script: |- set -o errexit export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools GCPKMS_CMD="LD_LIBRARY_PATH=./testgcpkms MONGODB_URI='mongodb://localhost:27017' ./testgcpkms/test-gcpkms" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh - name: testgcpkms-fail-task commands: - command: shell.exec params: add_expansions_to_env: true shell: bash script: |- set -o errexit pushd mongoc ./.evergreen/scripts/compile-test-gcpkms.sh popd - command: shell.exec type: test params: shell: bash script: |- set -o errexit export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} LD_LIBRARY_PATH=$(pwd)/install MONGODB_URI='mongodb://localhost:27017' EXPECT_ERROR='Failed to connect to: metadata.google.internal' ./mongoc/src/libmongoc/test-gcpkms task_groups: - name: testazurekms_task_group setup_group: - func: fetch-det - command: shell.exec params: shell: bash script: |- set -o errexit DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools echo '${testazurekms_publickey}' > /tmp/testazurekms_publickey echo '${testazurekms_privatekey}' > /tmp/testazurekms_privatekey # Set 600 permissions on private key file. Otherwise ssh / scp may error with permissions "are too open". chmod 600 /tmp/testazurekms_privatekey export AZUREKMS_CLIENTID=${testazurekms_clientid} export AZUREKMS_TENANTID=${testazurekms_tenantid} export AZUREKMS_SECRET=${testazurekms_secret} export AZUREKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_PUBLICKEYPATH=/tmp/testazurekms_publickey export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey export AZUREKMS_SCOPE=${testazurekms_scope} export AZUREKMS_VMNAME_PREFIX=CDRIVER $DRIVERS_TOOLS/.evergreen/csfle/azurekms/create-and-setup-vm.sh - command: expansions.update params: file: testazurekms-expansions.yml teardown_group: - command: expansions.update params: file: testazurekms-expansions.yml - command: shell.exec params: shell: bash script: |- set -o errexit DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} $DRIVERS_TOOLS/.evergreen/csfle/azurekms/delete-vm.sh setup_group_can_fail_task: true setup_group_timeout_secs: 1800 tasks: - testazurekms-task - name: testgcpkms_task_group setup_group: - func: fetch-det - command: shell.exec params: shell: bash script: |- set -o errexit DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools echo '${testgcpkms_key_file}' > /tmp/testgcpkms_key_file.json export GCPKMS_KEYFILE=/tmp/testgcpkms_key_file.json export GCPKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS export GCPKMS_SERVICEACCOUNT="${testgcpkms_service_account}" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/create-and-setup-instance.sh - command: expansions.update params: file: testgcpkms-expansions.yml teardown_group: - command: shell.exec params: shell: bash script: |- set -o errexit DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/delete-instance.sh setup_group_can_fail_task: true setup_group_timeout_secs: 1800 tasks: - testgcpkms-task buildvariants: - name: abi-compliance-check display_name: ABI Compliance Check run_on: - ubuntu1804-small - ubuntu1804-medium - ubuntu1804-large tasks: - abi-compliance-check - name: smoke display_name: Smoke Tests expansions: SKIP_LEGACY_SHELL: '1' run_on: ubuntu2204-small tasks: - make-docs - kms-divergence-check - release-compile - debug-compile-no-counters - compile-tracing - link-with-cmake - link-with-cmake-deprecated - link-with-cmake-ssl - link-with-cmake-ssl-deprecated - link-with-cmake-snappy - link-with-cmake-snappy-deprecated - name: link-with-cmake-mac distros: - macos-1100 - name: link-with-cmake-mac-deprecated distros: - macos-1100 - name: link-with-cmake-windows distros: - windows-vsCurrent-large - name: link-with-cmake-windows-ssl distros: - windows-vsCurrent-large - name: link-with-cmake-windows-snappy distros: - windows-vsCurrent-large - name: link-with-cmake-mingw distros: - windows-vsCurrent-large - name: link-with-pkg-config distros: - ubuntu1804-test - name: link-with-pkg-config-mac distros: - macos-1100 - link-with-pkg-config-ssl - link-with-bson - name: link-with-bson-windows distros: - windows-vsCurrent-large - name: link-with-bson-mac distros: - macos-1100 - name: link-with-bson-mingw distros: - windows-vsCurrent-large - check-headers - install-uninstall-check - name: install-uninstall-check-mingw distros: - windows-vsCurrent-large - name: install-uninstall-check-msvc distros: - windows-vsCurrent-large - debug-compile-with-warnings - name: build-and-test-with-toolchain distros: - debian10-small - install-libmongoc-after-libbson tags: - pr-merge-gate - name: clang38 display_name: clang 3.8 (Debian 9.2) expansions: CC: clang run_on: debian92-test tasks: - release-compile - debug-compile-nosasl-nossl - .latest .nossl - name: openssl display_name: OpenSSL / LibreSSL run_on: archlinux-build tasks: - build-and-run-authentication-tests-openssl-1.0.1 - build-and-run-authentication-tests-openssl-1.0.2 - build-and-run-authentication-tests-openssl-1.1.0 - build-and-run-authentication-tests-openssl-1.0.1-fips - build-and-run-authentication-tests-libressl-2.5 - build-and-run-authentication-tests-libressl-3.0-auto - build-and-run-authentication-tests-libressl-3.0 - name: clang37 display_name: clang 3.7 (Archlinux) expansions: CC: clang run_on: archlinux-test tasks: - release-compile - debug-compile-sasl-openssl - debug-compile-nosasl-openssl - .authentication-tests .openssl - name: clang60-i686 display_name: clang 6.0 (i686) (Ubuntu 18.04) expansions: CC: clang MARCH: i686 run_on: ubuntu1804-test tasks: - release-compile - debug-compile-nosasl-nossl - debug-compile-no-align - .debug-compile !.sspi .nossl .nosasl - .latest .nossl .nosasl - name: clang38-i686 display_name: clang 3.8 (i686) (Ubuntu 16.04) expansions: CC: clang MARCH: i686 run_on: ubuntu1604-test tasks: - release-compile - debug-compile-no-align - name: clang38ubuntu display_name: clang 3.8 (Ubuntu 16.04) expansions: CC: clang run_on: ubuntu1604-test tasks: - .compression !.zstd - release-compile - debug-compile-sasl-openssl - debug-compile-nosasl-openssl - debug-compile-no-align - .authentication-tests .openssl - name: gcc82rhel display_name: GCC 8.2 (RHEL 8.0) expansions: CC: gcc run_on: rhel80-test tasks: - .hardened - .compression !.snappy !.zstd - release-compile - debug-compile-nosasl-nossl - debug-compile-nosasl-openssl - debug-compile-sasl-openssl - .authentication-tests .openssl - .latest .nossl - name: gcc48rhel display_name: GCC 4.8 (RHEL 7.0) expansions: CC: gcc run_on: rhel70 tasks: - .hardened - .compression !.snappy - release-compile - debug-compile-nosasl-nossl - debug-compile-sasl-openssl - debug-compile-nosasl-openssl - .authentication-tests .openssl - .latest .nossl - name: gcc63 display_name: GCC 6.3 (Debian 9.2) expansions: CC: gcc run_on: debian92-test tasks: - release-compile - debug-compile-nosasl-nossl - .latest .nossl - name: gcc83 display_name: GCC 8.3 (Debian 10.0) expansions: CC: gcc run_on: debian10-test tasks: - release-compile - debug-compile-nosasl-nossl - .latest .nossl - name: gcc102 display_name: GCC 10.2 (Debian 11.0) expansions: CC: gcc run_on: debian11-large tasks: - release-compile - debug-compile-nosasl-nossl - .latest .nossl - name: gcc94 display_name: GCC 9.4 (Ubuntu 20.04) expansions: CC: gcc run_on: ubuntu2004-large tasks: - release-compile - debug-compile-nosasl-nossl - .latest .nossl - name: gcc75-i686 display_name: GCC 7.5 (i686) (Ubuntu 18.04) expansions: CC: gcc MARCH: i686 run_on: ubuntu1804-test tasks: - release-compile - debug-compile-nosasl-nossl - debug-compile-no-align - .latest .nossl .nosasl - name: gcc75 display_name: GCC 7.5 (Ubuntu 18.04) expansions: CC: gcc run_on: ubuntu1804-test tasks: - .compression !.zstd - debug-compile-nosrv - release-compile - debug-compile-nosasl-nossl - debug-compile-no-align - debug-compile-sasl-openssl - debug-compile-nosasl-openssl - .authentication-tests .openssl - .authentication-tests .asan - .test-coverage - .latest .nossl - retry-true-latest-server - test-dns-openssl - test-dns-auth-openssl - test-dns-loadbalanced-openssl - name: gcc54 display_name: GCC 5.4 (Ubuntu 16.04) expansions: CC: gcc run_on: ubuntu1604-test tasks: - .compression !.zstd - debug-compile-nosrv - release-compile - debug-compile-no-align - name: darwin display_name: '*Darwin, macOS (Apple LLVM)' expansions: CC: clang run_on: macos-1100 tasks: - .compression !.snappy - release-compile - debug-compile-nosasl-nossl - debug-compile-rdtscp - debug-compile-no-align - debug-compile-nosrv - debug-compile-sasl-darwinssl - debug-compile-nosasl-nossl - .authentication-tests .darwinssl - .latest .nossl - test-dns-darwinssl - test-dns-auth-darwinssl - debug-compile-lto - debug-compile-lto-thin - debug-compile-aws - test-aws-openssl-regular-4.4 - test-aws-openssl-regular-latest - name: windows-2017-32 display_name: Windows (i686) (VS 2017) expansions: CC: Visual Studio 15 2017 run_on: windows-vsCurrent-large tasks: - debug-compile-nosasl-nossl - .latest .nossl .nosasl - name: windows-2017 display_name: Windows (VS 2017) expansions: CC: Visual Studio 15 2017 Win64 run_on: windows-vsCurrent-large tasks: - debug-compile-nosasl-nossl - debug-compile-nosasl-openssl - debug-compile-sspi-winssl - .latest .nossl - .nosasl .latest .nossl - test-dns-winssl - test-dns-auth-winssl - debug-compile-aws - test-aws-openssl-regular-4.4 - test-aws-openssl-regular-latest - .authentication-tests .openssl !.sasl - .authentication-tests .winssl - name: windows-2015 display_name: Windows (VS 2015) expansions: CC: Visual Studio 14 2015 Win64 run_on: windows-64-vs2015-compile tasks: - .compression !.snappy !.zstd !.latest - release-compile - debug-compile-sspi-winssl - debug-compile-no-align - debug-compile-nosrv - .authentication-tests .winssl - name: windows-2015-32 display_name: Windows (i686) (VS 2015) expansions: CC: Visual Studio 14 2015 run_on: windows-64-vs2015-compile tasks: - .compression !.snappy !.zstd !.latest - release-compile - debug-compile-sspi-winssl - debug-compile-no-align - .authentication-tests .winssl - name: windows-2013 display_name: Windows (VS 2013) expansions: CC: Visual Studio 12 2013 Win64 run_on: windows-64-vs2013-compile tasks: - .compression !.snappy !.zstd !.latest - release-compile - debug-compile-sspi-winssl - .authentication-tests .winssl - name: windows-2013-32 display_name: Windows (i686) (VS 2013) expansions: CC: Visual Studio 12 2013 run_on: windows-64-vs2013-compile tasks: - release-compile - debug-compile-rdtscp - debug-compile-sspi-winssl - .authentication-tests .winssl - name: mingw-windows2016 display_name: MinGW-W64 (Windows Server 2016) expansions: CC: mingw run_on: windows-vsCurrent-large tasks: - debug-compile-nosasl-nossl - .latest .nossl .nosasl .server - name: mingw display_name: MinGW-W64 expansions: CC: mingw run_on: windows-vsCurrent-large tasks: - debug-compile-no-align - name: power8-rhel81 display_name: Power8 (ppc64le) (RHEL 8.1) expansions: CC: gcc run_on: rhel81-power8-test tasks: - release-compile - debug-compile-nosasl-nossl - debug-compile-sasl-openssl - .latest .nossl - test-dns-openssl batchtime: 1440 - name: arm-ubuntu1804 display_name: '*ARM (aarch64) (Ubuntu 18.04)' expansions: CC: gcc run_on: ubuntu1804-arm64-large tasks: - .compression !.snappy !.zstd - debug-compile-no-align - release-compile - debug-compile-nosasl-nossl - debug-compile-nosasl-openssl - debug-compile-sasl-openssl - .authentication-tests .openssl - .latest .nossl - test-dns-openssl batchtime: 1440 - name: arm-ubuntu1604 display_name: '*ARM (aarch64) (Ubuntu 16.04)' expansions: CC: gcc run_on: ubuntu1604-arm64-large tasks: - .compression !.snappy !.zstd - debug-compile-no-align - release-compile batchtime: 1440 - name: zseries-rhel83 display_name: '*zSeries' expansions: CC: gcc run_on: rhel83-zseries-small tasks: - release-compile - debug-compile-no-align - debug-compile-nosasl-nossl - debug-compile-nosasl-openssl - debug-compile-sasl-openssl - .authentication-tests .openssl - .latest .nossl batchtime: 1440 - name: clang60ubuntu display_name: clang 6.0 (Ubuntu 18.04) expansions: CC: clang run_on: ubuntu1804-test tasks: - debug-compile-sasl-openssl-static - .authentication-tests .asan - name: aws-ubuntu2004 display_name: AWS Tests (Ubuntu 20.04) expansions: CC: clang run_on: ubuntu2004-small tasks: - debug-compile-aws - .test-aws .4.4 - .test-aws .5.0 - name: aws-ubuntu2204 display_name: AWS Tests (Ubuntu 22.04) expansions: CC: clang run_on: ubuntu2004-small tasks: - debug-compile-aws - .test-aws .6.0 - .test-aws .7.0 - .test-aws .latest - name: mongohouse display_name: Mongohouse Test run_on: ubuntu2204-small tasks: - debug-compile-sasl-openssl - test-mongohouse - name: ocsp display_name: OCSP tests run_on: ubuntu2004-small tasks: - name: debug-compile-nosasl-openssl - name: debug-compile-nosasl-openssl-static - name: debug-compile-nosasl-darwinssl distros: - macos-1100 - name: debug-compile-nosasl-winssl distros: - windows-vsCurrent-large - name: .ocsp-openssl - name: .ocsp-darwinssl distros: - macos-1100 - name: .ocsp-winssl distros: - windows-vsCurrent-large - name: debug-compile-nosasl-openssl-1.0.1 - name: .ocsp-openssl-1.0.1 batchtime: 10080 - name: packaging display_name: Linux Distro Packaging run_on: ubuntu1804-test tasks: - debian-package-build - name: rpm-package-build distros: - rhel90-arm64-small tags: - pr-merge-gate - name: versioned-api-ubuntu1804 display_name: Versioned API Tests (Ubuntu 18.04) run_on: ubuntu1804-test tasks: - debug-compile-nosasl-openssl - debug-compile-nosasl-nossl - .versioned-api .5.0 - .versioned-api .6.0 - name: versioned-api-ubuntu2004 display_name: Versioned API Tests (Ubuntu 20.04) run_on: ubuntu2004-test tasks: - debug-compile-nosasl-openssl - debug-compile-nosasl-nossl - .versioned-api .7.0 - name: testazurekms-variant display_name: Azure KMS run_on: debian10-small tasks: - testazurekms_task_group - testazurekms-fail-task batchtime: 20160 - name: testgcpkms-variant display_name: GCP KMS run_on: debian11-small tasks: - testgcpkms_task_group - testgcpkms-fail-task batchtime: 20160 mongo-c-driver-1.26.0/.evergreen/generated_configs/task_groups.yml000066400000000000000000000000201456567454500252370ustar00rootroot00000000000000task_groups: [] mongo-c-driver-1.26.0/.evergreen/generated_configs/tasks.yml000066400000000000000000005667111456567454500240530ustar00rootroot00000000000000tasks: - name: abi-compliance-check commands: - func: abi-compliance-check - name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile run_on: ubuntu1804-large tags: [sanitizers-matrix-asan, compile, ubuntu1804, clang, cse, asan, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-test-4.2-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, cse, asan, auth, server, "4.2", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-test-4.2-server-auth-with-mongocrypt run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, cse, asan, auth, server, "4.2", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-test-4.4-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, cse, asan, auth, server, "4.4", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-test-4.4-server-auth-with-mongocrypt run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, cse, asan, auth, server, "4.4", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-test-5.0-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, cse, asan, auth, server, "5.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-test-5.0-server-auth-with-mongocrypt run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, cse, asan, auth, server, "5.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-test-6.0-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, cse, asan, auth, server, "6.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-test-6.0-server-auth-with-mongocrypt run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, cse, asan, auth, server, "6.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile run_on: ubuntu2004-large tags: [sanitizers-matrix-asan, compile, ubuntu2004, clang, cse, asan, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-replica-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, cse, asan, auth, replica, "7.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-replica-auth-with-mongocrypt run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, cse, asan, auth, replica, "7.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-server-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, cse, asan, auth, server, "7.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-server-auth-with-mongocrypt run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, cse, asan, auth, server, "7.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-replica-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, cse, asan, auth, replica, latest, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-replica-auth-with-mongocrypt run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, cse, asan, auth, replica, latest, with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-server-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, cse, asan, auth, server, latest, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-server-auth-with-mongocrypt run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, cse, asan, auth, server, latest, with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1604-clang-compile run_on: ubuntu1604-large tags: [sanitizers-matrix-asan, compile, ubuntu1604, clang, asan, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: asan-sasl-cyrus-openssl-ubuntu1604-clang-test-3.6-replica-auth run_on: ubuntu1604-small tags: [sanitizers-matrix-asan, test, ubuntu1604, clang, sasl-cyrus, asan, auth, replica, "3.6", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1604-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1604-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "3.6" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1604-clang-test-3.6-server-auth run_on: ubuntu1604-small tags: [sanitizers-matrix-asan, test, ubuntu1604, clang, sasl-cyrus, asan, auth, server, "3.6", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1604-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1604-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "3.6" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1604-clang-test-3.6-sharded-auth run_on: ubuntu1604-small tags: [sanitizers-matrix-asan, test, ubuntu1604, clang, sasl-cyrus, asan, auth, sharded, "3.6", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1604-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1604-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "3.6" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile run_on: ubuntu1804-large tags: [sanitizers-matrix-asan, compile, ubuntu1804, clang, asan, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.0-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, replica, "4.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.0-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, server, "4.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.0-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, sharded, "4.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.2-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, replica, "4.2", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.2-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, server, "4.2", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.2-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, sharded, "4.2", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.4-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, replica, "4.4", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.4-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, server, "4.4", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.4-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, sharded, "4.4", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-5.0-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, replica, "5.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-5.0-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, server, "5.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-5.0-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, sharded, "5.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-6.0-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, replica, "6.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-6.0-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, server, "6.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu1804-clang-test-6.0-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-asan, test, ubuntu1804, clang, sasl-cyrus, asan, auth, sharded, "6.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile run_on: ubuntu2004-large tags: [sanitizers-matrix-asan, compile, ubuntu2004, clang, asan, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: asan-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-replica-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, asan, auth, replica, "7.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-server-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, asan, auth, server, "7.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-sharded-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, asan, auth, sharded, "7.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-replica-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, asan, auth, replica, latest, openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-server-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, asan, auth, server, latest, openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-sharded-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-asan, test, ubuntu2004, clang, sasl-cyrus, asan, auth, sharded, latest, openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: check-headers commands: - func: check-headers - name: "check:sasl=Cyrus\u2022tls=LibreSSL\u2022test_mongocxx_ref=master" run_on: - ubuntu2204-small - ubuntu2204-large - ubuntu2004-small - ubuntu2004 - ubuntu1804 - ubuntu1804-medium - debian10 - debian11 - amazon2 tags: [earthly, pr-merge-gate, earthly-alpine3.18, earthly-archlinux] commands: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +env-warmup - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=LibreSSL - --test_mongocxx_ref=master - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +run - --targets=test-example test-cxx-driver - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=LibreSSL - --test_mongocxx_ref=master - name: "check:sasl=Cyrus\u2022tls=LibreSSL\u2022test_mongocxx_ref=r3.8.0" run_on: - ubuntu2204-small - ubuntu2204-large - ubuntu2004-small - ubuntu2004 - ubuntu1804 - ubuntu1804-medium - debian10 - debian11 - amazon2 tags: [earthly, pr-merge-gate, earthly-alpine3.18, earthly-archlinux] commands: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +env-warmup - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=LibreSSL - --test_mongocxx_ref=r3.8.0 - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +run - --targets=test-example test-cxx-driver - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=LibreSSL - --test_mongocxx_ref=r3.8.0 - name: "check:sasl=Cyrus\u2022tls=OpenSSL\u2022test_mongocxx_ref=master" run_on: - ubuntu2204-small - ubuntu2204-large - ubuntu2004-small - ubuntu2004 - ubuntu1804 - ubuntu1804-medium - debian10 - debian11 - amazon2 tags: [earthly, pr-merge-gate, earthly-alpine3.18, earthly-archlinux, earthly-u22] commands: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +env-warmup - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=master - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +run - --targets=test-example test-cxx-driver - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=master - name: "check:sasl=Cyrus\u2022tls=OpenSSL\u2022test_mongocxx_ref=r3.8.0" run_on: - ubuntu2204-small - ubuntu2204-large - ubuntu2004-small - ubuntu2004 - ubuntu1804 - ubuntu1804-medium - debian10 - debian11 - amazon2 tags: [earthly, pr-merge-gate, earthly-alpine3.18, earthly-archlinux, earthly-u22] commands: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +env-warmup - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=r3.8.0 - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +run - --targets=test-example test-cxx-driver - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=r3.8.0 - name: "check:sasl=Cyrus\u2022tls=off\u2022test_mongocxx_ref=master" run_on: - ubuntu2204-small - ubuntu2204-large - ubuntu2004-small - ubuntu2004 - ubuntu1804 - ubuntu1804-medium - debian10 - debian11 - amazon2 tags: [earthly, pr-merge-gate, earthly-alpine3.18, earthly-archlinux, earthly-u22] commands: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +env-warmup - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=master - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +run - --targets=test-example test-cxx-driver - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=master - name: "check:sasl=Cyrus\u2022tls=off\u2022test_mongocxx_ref=r3.8.0" run_on: - ubuntu2204-small - ubuntu2204-large - ubuntu2004-small - ubuntu2004 - ubuntu1804 - ubuntu1804-medium - debian10 - debian11 - amazon2 tags: [earthly, pr-merge-gate, earthly-alpine3.18, earthly-archlinux, earthly-u22] commands: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +env-warmup - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=r3.8.0 - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +run - --targets=test-example test-cxx-driver - --env=${MONGOC_EARTHLY_ENV} - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=r3.8.0 - name: "check:sasl=off\u2022tls=OpenSSL\u2022test_mongocxx_ref=master" run_on: - ubuntu2204-small - ubuntu2204-large - ubuntu2004-small - ubuntu2004 - ubuntu1804 - ubuntu1804-medium - debian10 - debian11 - amazon2 tags: [earthly, pr-merge-gate, earthly-u22] commands: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +env-warmup - --env=${MONGOC_EARTHLY_ENV} - --sasl=off - --tls=OpenSSL - --test_mongocxx_ref=master - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - tools/earthly.sh - +run - --targets=test-example test-cxx-driver - --env=${MONGOC_EARTHLY_ENV} - --sasl=off - --tls=OpenSSL - --test_mongocxx_ref=master - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile run_on: macos-1100 tags: [cse-matrix-darwinssl, compile, macos-1100, clang, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-darwinssl-compile vars: CC: clang - func: upload-build - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-4.2-replica-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, replica, "4.2", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-4.2-server-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, server, "4.2", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-4.4-replica-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, replica, "4.4", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-4.4-server-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, server, "4.4", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-5.0-replica-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, replica, "5.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-5.0-server-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, server, "5.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-6.0-replica-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, replica, "6.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-6.0-server-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, server, "6.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-7.0-replica-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, replica, "7.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-7.0-server-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, server, "7.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-latest-replica-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, replica, latest, darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-1100-clang-test-latest-server-auth run_on: macos-1100 tags: [cse-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, cse, auth, server, latest, darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-debian10-gcc-compile run_on: debian10-large tags: [cse-matrix-openssl, compile, debian10, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: cse-sasl-cyrus-openssl-debian11-gcc-compile run_on: debian11-large tags: [cse-matrix-openssl, compile, debian11, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: cse-sasl-cyrus-openssl-debian92-clang-compile run_on: debian92-large tags: [cse-matrix-openssl, compile, debian92, clang, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: cse-sasl-cyrus-openssl-debian92-gcc-compile run_on: debian92-large tags: [cse-matrix-openssl, compile, debian92, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: cse-sasl-cyrus-openssl-rhel80-gcc-compile run_on: rhel80-large tags: [cse-matrix-openssl, compile, rhel80, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile run_on: rhel83-zseries-large tags: [cse-matrix-openssl, compile, rhel83-zseries, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-test-5.0-server-auth run_on: rhel83-zseries-small tags: [cse-matrix-openssl, test, rhel83-zseries, gcc, sasl-cyrus, cse, auth, server, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-test-7.0-replica-auth run_on: rhel83-zseries-small tags: [cse-matrix-openssl, test, rhel83-zseries, gcc, sasl-cyrus, cse, auth, replica, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-test-7.0-server-auth run_on: rhel83-zseries-small tags: [cse-matrix-openssl, test, rhel83-zseries, gcc, sasl-cyrus, cse, auth, server, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-test-latest-replica-auth run_on: rhel83-zseries-small tags: [cse-matrix-openssl, test, rhel83-zseries, gcc, sasl-cyrus, cse, auth, replica, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-test-latest-server-auth run_on: rhel83-zseries-small tags: [cse-matrix-openssl, test, rhel83-zseries, gcc, sasl-cyrus, cse, auth, server, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel83-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu1604-clang-compile run_on: ubuntu1604-large tags: [cse-matrix-openssl, compile, ubuntu1604, clang, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile run_on: ubuntu1804-arm64-large tags: [cse-matrix-openssl, compile, ubuntu1804-arm64, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-test-4.2-server-auth run_on: ubuntu1804-arm64-small tags: [cse-matrix-openssl, test, ubuntu1804-arm64, gcc, sasl-cyrus, cse, auth, server, "4.2", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-test-4.4-server-auth run_on: ubuntu1804-arm64-small tags: [cse-matrix-openssl, test, ubuntu1804-arm64, gcc, sasl-cyrus, cse, auth, server, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-test-5.0-server-auth run_on: ubuntu1804-arm64-small tags: [cse-matrix-openssl, test, ubuntu1804-arm64, gcc, sasl-cyrus, cse, auth, server, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-test-6.0-server-auth run_on: ubuntu1804-arm64-small tags: [cse-matrix-openssl, test, ubuntu1804-arm64, gcc, sasl-cyrus, cse, auth, server, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu1804-gcc-compile run_on: ubuntu1804-large tags: [cse-matrix-openssl, compile, ubuntu1804, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: cse-sasl-cyrus-openssl-ubuntu1804-gcc-test-4.2-server-auth run_on: ubuntu1804-small tags: [cse-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, cse, auth, server, "4.2", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu1804-gcc-test-4.4-server-auth run_on: ubuntu1804-small tags: [cse-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, cse, auth, server, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu1804-gcc-test-5.0-server-auth run_on: ubuntu1804-small tags: [cse-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, cse, auth, server, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu1804-gcc-test-6.0-server-auth run_on: ubuntu1804-small tags: [cse-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, cse, auth, server, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile run_on: ubuntu2004-arm64-large tags: [cse-matrix-openssl, compile, ubuntu2004-arm64, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-test-7.0-replica-auth run_on: ubuntu2004-arm64-small tags: [cse-matrix-openssl, test, ubuntu2004-arm64, gcc, sasl-cyrus, cse, auth, replica, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-test-7.0-server-auth run_on: ubuntu2004-arm64-small tags: [cse-matrix-openssl, test, ubuntu2004-arm64, gcc, sasl-cyrus, cse, auth, server, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-test-latest-replica-auth run_on: ubuntu2004-arm64-small tags: [cse-matrix-openssl, test, ubuntu2004-arm64, gcc, sasl-cyrus, cse, auth, replica, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-test-latest-server-auth run_on: ubuntu2004-arm64-small tags: [cse-matrix-openssl, test, ubuntu2004-arm64, gcc, sasl-cyrus, cse, auth, server, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu2004-gcc-compile run_on: ubuntu2004-large tags: [cse-matrix-openssl, compile, ubuntu2004, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: cse-sasl-cyrus-openssl-ubuntu2004-gcc-test-7.0-replica-auth run_on: ubuntu2004-small tags: [cse-matrix-openssl, test, ubuntu2004, gcc, sasl-cyrus, cse, auth, replica, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu2004-gcc-test-7.0-server-auth run_on: ubuntu2004-small tags: [cse-matrix-openssl, test, ubuntu2004, gcc, sasl-cyrus, cse, auth, server, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu2004-gcc-test-latest-replica-auth run_on: ubuntu2004-small tags: [cse-matrix-openssl, test, ubuntu2004, gcc, sasl-cyrus, cse, auth, replica, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-ubuntu2004-gcc-test-latest-server-auth run_on: ubuntu2004-small tags: [cse-matrix-openssl, test, ubuntu2004, gcc, sasl-cyrus, cse, auth, server, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [cse-matrix-openssl, compile, windows-vsCurrent, vs2017x64, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: Visual Studio 15 2017 Win64 - func: upload-build - name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-test-4.2-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "4.2", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-test-4.4-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-test-5.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-test-6.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-test-7.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, replica, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-test-7.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-test-latest-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, replica, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-test-latest-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-vs2015-x64-compile run_on: windows-64-vs2015-large tags: [cse-matrix-winssl, compile, windows-64-vs2015, vs2015x64, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-winssl-compile vars: CC: Visual Studio 14 2015 Win64 - func: upload-build - name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [cse-matrix-winssl, compile, windows-vsCurrent, vs2017x64, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-winssl-compile vars: CC: Visual Studio 15 2017 Win64 - func: upload-build - name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-test-4.2-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "4.2", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-test-4.4-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "4.4", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-test-5.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "5.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-test-6.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "6.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-test-7.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, replica, "7.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-test-7.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, "7.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-test-latest-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, replica, latest, winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-test-latest-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, cse, auth, server, latest, winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: kms-divergence-check commands: - func: kms-divergence-check - name: loadbalanced-rhel87-gcc-compile run_on: rhel87-large tags: [loadbalanced, rhel87, gcc] commands: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc env: CC: gcc CFLAGS: -fno-omit-frame-pointer EXTRA_CONFIGURE_FLAGS: -DENABLE_EXTRA_ALIGNMENT=OFF SSL: OPENSSL args: - -c - .evergreen/scripts/compile.sh - func: upload-build - name: loadbalanced-rhel87-gcc-test-5.0-auth-openssl run_on: rhel87-small tags: [loadbalanced, rhel87, gcc, auth, openssl] depends_on: [{ name: loadbalanced-rhel87-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel87-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth LOAD_BALANCER: "on" MONGODB_VERSION: "5.0" SSL: openssl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: auth CC: gcc LOADBALANCED: loadbalanced SSL: openssl - name: loadbalanced-rhel87-gcc-test-5.0-noauth-nossl run_on: rhel87-small tags: [loadbalanced, rhel87, gcc, noauth, nossl] depends_on: [{ name: loadbalanced-rhel87-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel87-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: "on" MONGODB_VERSION: "5.0" SSL: nossl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth CC: gcc LOADBALANCED: loadbalanced SSL: nossl - name: loadbalanced-rhel87-gcc-test-6.0-auth-openssl run_on: rhel87-small tags: [loadbalanced, rhel87, gcc, auth, openssl] depends_on: [{ name: loadbalanced-rhel87-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel87-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth LOAD_BALANCER: "on" MONGODB_VERSION: "6.0" SSL: openssl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: auth CC: gcc LOADBALANCED: loadbalanced SSL: openssl - name: loadbalanced-rhel87-gcc-test-6.0-noauth-nossl run_on: rhel87-small tags: [loadbalanced, rhel87, gcc, noauth, nossl] depends_on: [{ name: loadbalanced-rhel87-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel87-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: "on" MONGODB_VERSION: "6.0" SSL: nossl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth CC: gcc LOADBALANCED: loadbalanced SSL: nossl - name: loadbalanced-rhel87-gcc-test-7.0-auth-openssl run_on: rhel87-small tags: [loadbalanced, rhel87, gcc, auth, openssl] depends_on: [{ name: loadbalanced-rhel87-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel87-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth LOAD_BALANCER: "on" MONGODB_VERSION: "7.0" SSL: openssl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: auth CC: gcc LOADBALANCED: loadbalanced SSL: openssl - name: loadbalanced-rhel87-gcc-test-7.0-noauth-nossl run_on: rhel87-small tags: [loadbalanced, rhel87, gcc, noauth, nossl] depends_on: [{ name: loadbalanced-rhel87-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel87-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: "on" MONGODB_VERSION: "7.0" SSL: nossl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth CC: gcc LOADBALANCED: loadbalanced SSL: nossl - name: loadbalanced-rhel87-gcc-test-latest-auth-openssl run_on: rhel87-small tags: [loadbalanced, rhel87, gcc, auth, openssl] depends_on: [{ name: loadbalanced-rhel87-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel87-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth LOAD_BALANCER: "on" MONGODB_VERSION: latest SSL: openssl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: auth CC: gcc LOADBALANCED: loadbalanced SSL: openssl - name: loadbalanced-rhel87-gcc-test-latest-noauth-nossl run_on: rhel87-small tags: [loadbalanced, rhel87, gcc, noauth, nossl] depends_on: [{ name: loadbalanced-rhel87-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel87-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: "on" MONGODB_VERSION: latest SSL: nossl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth CC: gcc LOADBALANCED: loadbalanced SSL: nossl - name: make-docs commands: - func: make-docs - func: upload-docs - func: upload-man-pages - name: mock-server-test run_on: ubuntu2204-small commands: - func: fetch-det - func: run-simple-http-server - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/compile.sh - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/run-mock-server-tests.sh - name: openssl-static-compile-debian10-gcc run_on: debian10-large tags: [openssl-static-matrix, debian10, gcc] commands: - func: openssl-static-compile vars: CC: gcc - name: openssl-static-compile-debian11-gcc run_on: debian11-large tags: [openssl-static-matrix, debian11, gcc] commands: - func: openssl-static-compile vars: CC: gcc - name: openssl-static-compile-debian92-gcc run_on: debian92-large tags: [openssl-static-matrix, debian92, gcc] commands: - func: openssl-static-compile vars: CC: gcc - name: openssl-static-compile-ubuntu2004-gcc run_on: ubuntu2004-large tags: [openssl-static-matrix, ubuntu2004, gcc] commands: - func: openssl-static-compile vars: CC: gcc - name: sasl-cyrus-darwinssl-macos-1100-arm64-clang-compile run_on: macos-1100-arm64 tags: [sasl-matrix-darwinssl, compile, macos-1100-arm64, clang, sasl-cyrus] commands: - func: sasl-cyrus-darwinssl-compile vars: CC: clang - func: upload-build - name: sasl-cyrus-darwinssl-macos-1100-clang-compile run_on: macos-1100 tags: [sasl-matrix-darwinssl, compile, macos-1100, clang, sasl-cyrus] commands: - func: sasl-cyrus-darwinssl-compile vars: CC: clang - func: upload-build - name: sasl-cyrus-darwinssl-macos-1100-clang-test-3.6-server-auth run_on: macos-1100 tags: [sasl-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, auth, server, "3.6", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "3.6" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-1100-clang-test-4.0-server-auth run_on: macos-1100 tags: [sasl-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, auth, server, "4.0", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-1100-clang-test-4.2-server-auth run_on: macos-1100 tags: [sasl-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, auth, server, "4.2", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-1100-clang-test-4.4-server-auth run_on: macos-1100 tags: [sasl-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, auth, server, "4.4", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-1100-clang-test-5.0-server-auth run_on: macos-1100 tags: [sasl-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, auth, server, "5.0", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-1100-clang-test-6.0-server-auth run_on: macos-1100 tags: [sasl-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, auth, server, "6.0", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-1100-clang-test-7.0-server-auth run_on: macos-1100 tags: [sasl-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, auth, server, "7.0", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-1100-clang-test-latest-server-auth run_on: macos-1100 tags: [sasl-matrix-darwinssl, test, macos-1100, clang, sasl-cyrus, auth, server, latest, darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-1100-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-1100-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-archlinux-clang-compile run_on: archlinux-large tags: [sasl-matrix-openssl, compile, archlinux, clang, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: sasl-cyrus-openssl-archlinux-gcc-compile run_on: archlinux-large tags: [sasl-matrix-openssl, compile, archlinux, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-debian10-gcc-compile run_on: debian10-large tags: [sasl-matrix-openssl, compile, debian10, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-debian11-gcc-compile run_on: debian11-large tags: [sasl-matrix-openssl, compile, debian11, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-debian92-clang-compile run_on: debian92-large tags: [sasl-matrix-openssl, compile, debian92, clang, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: sasl-cyrus-openssl-debian92-gcc-compile run_on: debian92-large tags: [sasl-matrix-openssl, compile, debian92, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-rhel70-gcc-compile run_on: rhel70-large tags: [sasl-matrix-openssl, compile, rhel70, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-rhel80-gcc-compile run_on: rhel80-large tags: [sasl-matrix-openssl, compile, rhel80, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-rhel81-power8-gcc-compile run_on: rhel81-power8-large tags: [sasl-matrix-openssl, compile, rhel81-power8, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-rhel81-power8-gcc-test-4.2-server-auth run_on: rhel81-power8-small tags: [sasl-matrix-openssl, test, rhel81-power8, gcc, sasl-cyrus, auth, server, "4.2", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel81-power8-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel81-power8-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel81-power8-gcc-test-4.4-server-auth run_on: rhel81-power8-small tags: [sasl-matrix-openssl, test, rhel81-power8, gcc, sasl-cyrus, auth, server, "4.4", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel81-power8-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel81-power8-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel81-power8-gcc-test-5.0-server-auth run_on: rhel81-power8-small tags: [sasl-matrix-openssl, test, rhel81-power8, gcc, sasl-cyrus, auth, server, "5.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel81-power8-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel81-power8-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel81-power8-gcc-test-6.0-server-auth run_on: rhel81-power8-small tags: [sasl-matrix-openssl, test, rhel81-power8, gcc, sasl-cyrus, auth, server, "6.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel81-power8-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel81-power8-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel81-power8-gcc-test-7.0-server-auth run_on: rhel81-power8-small tags: [sasl-matrix-openssl, test, rhel81-power8, gcc, sasl-cyrus, auth, server, "7.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel81-power8-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel81-power8-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel81-power8-gcc-test-latest-server-auth run_on: rhel81-power8-small tags: [sasl-matrix-openssl, test, rhel81-power8, gcc, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel81-power8-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel81-power8-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel83-zseries-gcc-compile run_on: rhel83-zseries-large tags: [sasl-matrix-openssl, compile, rhel83-zseries, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-rhel83-zseries-gcc-test-5.0-server-auth run_on: rhel83-zseries-small tags: [sasl-matrix-openssl, test, rhel83-zseries, gcc, sasl-cyrus, auth, server, "5.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel83-zseries-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel83-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel83-zseries-gcc-test-6.0-server-auth run_on: rhel83-zseries-small tags: [sasl-matrix-openssl, test, rhel83-zseries, gcc, sasl-cyrus, auth, server, "6.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel83-zseries-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel83-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel83-zseries-gcc-test-7.0-server-auth run_on: rhel83-zseries-small tags: [sasl-matrix-openssl, test, rhel83-zseries, gcc, sasl-cyrus, auth, server, "7.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel83-zseries-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel83-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel83-zseries-gcc-test-latest-server-auth run_on: rhel83-zseries-small tags: [sasl-matrix-openssl, test, rhel83-zseries, gcc, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel83-zseries-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel83-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1604-arm64-gcc-compile run_on: ubuntu1604-arm64-large tags: [sasl-matrix-openssl, compile, ubuntu1604-arm64, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-ubuntu1604-arm64-gcc-test-4.0-server-auth run_on: ubuntu1604-arm64-small tags: [sasl-matrix-openssl, test, ubuntu1604-arm64, gcc, sasl-cyrus, auth, server, "4.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1604-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1604-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1604-clang-compile run_on: ubuntu1604-large tags: [sasl-matrix-openssl, compile, ubuntu1604, clang, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile run_on: ubuntu1804-arm64-large tags: [sasl-matrix-openssl, compile, ubuntu1804-arm64, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-test-4.2-server-auth run_on: ubuntu1804-arm64-small tags: [sasl-matrix-openssl, test, ubuntu1804-arm64, gcc, sasl-cyrus, auth, server, "4.2", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-test-4.4-server-auth run_on: ubuntu1804-arm64-small tags: [sasl-matrix-openssl, test, ubuntu1804-arm64, gcc, sasl-cyrus, auth, server, "4.4", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-test-5.0-server-auth run_on: ubuntu1804-arm64-small tags: [sasl-matrix-openssl, test, ubuntu1804-arm64, gcc, sasl-cyrus, auth, server, "5.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-test-6.0-server-auth run_on: ubuntu1804-arm64-small tags: [sasl-matrix-openssl, test, ubuntu1804-arm64, gcc, sasl-cyrus, auth, server, "6.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-compile run_on: ubuntu1804-large tags: [sasl-matrix-openssl, compile, ubuntu1804, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-4.0-replica-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, replica, "4.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-4.0-server-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, server, "4.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-4.2-replica-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, replica, "4.2", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-4.2-server-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, server, "4.2", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-4.4-replica-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, replica, "4.4", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-4.4-server-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, server, "4.4", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-5.0-replica-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, replica, "5.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-5.0-server-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, server, "5.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-6.0-replica-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, replica, "6.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu1804-gcc-test-6.0-server-auth run_on: ubuntu1804-small tags: [sasl-matrix-openssl, test, ubuntu1804, gcc, sasl-cyrus, auth, server, "6.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile run_on: ubuntu2004-arm64-large tags: [sasl-matrix-openssl, compile, ubuntu2004-arm64, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-ubuntu2004-arm64-gcc-test-7.0-server-auth run_on: ubuntu2004-arm64-small tags: [sasl-matrix-openssl, test, ubuntu2004-arm64, gcc, sasl-cyrus, auth, server, "7.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu2004-arm64-gcc-test-latest-server-auth run_on: ubuntu2004-arm64-small tags: [sasl-matrix-openssl, test, ubuntu2004-arm64, gcc, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu2004-arm64-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu2004-gcc-compile run_on: ubuntu2004-large tags: [sasl-matrix-openssl, compile, ubuntu2004, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc - func: upload-build - name: sasl-cyrus-openssl-ubuntu2004-gcc-test-7.0-server-auth run_on: ubuntu2004-small tags: [sasl-matrix-openssl, test, ubuntu2004, gcc, sasl-cyrus, auth, server, "7.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-ubuntu2004-gcc-test-latest-server-auth run_on: ubuntu2004-small tags: [sasl-matrix-openssl, test, ubuntu2004, gcc, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-openssl, compile, windows-vsCurrent, vs2017x64, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: Visual Studio 15 2017 Win64 - func: upload-build - name: sasl-cyrus-openssl-windows-2019-vs2017-x64-test-latest-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-winssl-vs2013-x64-compile run_on: windows-64-vs2013-large tags: [sasl-matrix-winssl, compile, windows-64-vs2013, vs2013x64, sasl-cyrus] commands: - func: sasl-cyrus-winssl-compile vars: CC: Visual Studio 12 2013 Win64 - func: upload-build - name: sasl-cyrus-winssl-vs2015-x64-compile run_on: windows-64-vs2015-large tags: [sasl-matrix-winssl, compile, windows-64-vs2015, vs2015x64, sasl-cyrus] commands: - func: sasl-cyrus-winssl-compile vars: CC: Visual Studio 14 2015 Win64 - func: upload-build - name: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2017x64, sasl-cyrus] commands: - func: sasl-cyrus-winssl-compile vars: CC: Visual Studio 15 2017 Win64 - func: upload-build - name: sasl-cyrus-winssl-windows-2019-vs2017-x64-test-3.6-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, "3.6", winssl] depends_on: [{ name: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "3.6" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-winssl-windows-2019-vs2017-x64-test-4.0-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, "4.0", winssl] depends_on: [{ name: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-winssl-windows-2019-vs2017-x64-test-4.2-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, "4.2", winssl] depends_on: [{ name: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-winssl-windows-2019-vs2017-x64-test-4.4-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, "4.4", winssl] depends_on: [{ name: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-winssl-windows-2019-vs2017-x64-test-5.0-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, "5.0", winssl] depends_on: [{ name: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-winssl-windows-2019-vs2017-x64-test-6.0-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, "6.0", winssl] depends_on: [{ name: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-winssl-windows-2019-vs2017-x64-test-7.0-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, "7.0", winssl] depends_on: [{ name: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-winssl-windows-2019-vs2017-x64-test-latest-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, latest, winssl] depends_on: [{ name: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1604-gcc-compile run_on: ubuntu1604-large tags: [sasl-matrix-nossl, compile, ubuntu1604, gcc, sasl-off] commands: - func: sasl-off-nossl-compile vars: CC: gcc - func: upload-build - name: sasl-off-nossl-ubuntu1604-gcc-test-3.6-replica-noauth run_on: ubuntu1604-small tags: [sasl-matrix-nossl, test, ubuntu1604, gcc, sasl-off, noauth, replica, "3.6"] depends_on: [{ name: sasl-off-nossl-ubuntu1604-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1604-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "3.6" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1604-gcc-test-3.6-server-noauth run_on: ubuntu1604-small tags: [sasl-matrix-nossl, test, ubuntu1604, gcc, sasl-off, noauth, server, "3.6"] depends_on: [{ name: sasl-off-nossl-ubuntu1604-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1604-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "3.6" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1604-gcc-test-3.6-sharded-noauth run_on: ubuntu1604-small tags: [sasl-matrix-nossl, test, ubuntu1604, gcc, sasl-off, noauth, sharded, "3.6"] depends_on: [{ name: sasl-off-nossl-ubuntu1604-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1604-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "3.6" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-compile run_on: ubuntu1804-large tags: [sasl-matrix-nossl, compile, ubuntu1804, gcc, sasl-off] commands: - func: sasl-off-nossl-compile vars: CC: gcc - func: upload-build - name: sasl-off-nossl-ubuntu1804-gcc-test-4.0-replica-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, replica, "4.0"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-4.0-server-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, server, "4.0"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-4.0-sharded-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, sharded, "4.0"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-4.2-replica-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, replica, "4.2"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-4.2-server-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, server, "4.2"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-4.2-sharded-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, sharded, "4.2"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-4.4-replica-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, replica, "4.4"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-4.4-server-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, server, "4.4"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-4.4-sharded-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, sharded, "4.4"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-5.0-replica-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, replica, "5.0"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-5.0-server-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, server, "5.0"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-5.0-sharded-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, sharded, "5.0"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-6.0-replica-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, replica, "6.0"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-6.0-server-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, server, "6.0"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu1804-gcc-test-6.0-sharded-noauth run_on: ubuntu1804-small tags: [sasl-matrix-nossl, test, ubuntu1804, gcc, sasl-off, noauth, sharded, "6.0"] depends_on: [{ name: sasl-off-nossl-ubuntu1804-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu1804-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu2004-gcc-compile run_on: ubuntu2004-large tags: [sasl-matrix-nossl, compile, ubuntu2004, gcc, sasl-off] commands: - func: sasl-off-nossl-compile vars: CC: gcc - func: upload-build - name: sasl-off-nossl-ubuntu2004-gcc-test-7.0-replica-noauth run_on: ubuntu2004-small tags: [sasl-matrix-nossl, test, ubuntu2004, gcc, sasl-off, noauth, replica, "7.0"] depends_on: [{ name: sasl-off-nossl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu2004-gcc-test-7.0-server-noauth run_on: ubuntu2004-small tags: [sasl-matrix-nossl, test, ubuntu2004, gcc, sasl-off, noauth, server, "7.0"] depends_on: [{ name: sasl-off-nossl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu2004-gcc-test-7.0-sharded-noauth run_on: ubuntu2004-small tags: [sasl-matrix-nossl, test, ubuntu2004, gcc, sasl-off, noauth, sharded, "7.0"] depends_on: [{ name: sasl-off-nossl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu2004-gcc-test-latest-replica-noauth run_on: ubuntu2004-small tags: [sasl-matrix-nossl, test, ubuntu2004, gcc, sasl-off, noauth, replica, latest] depends_on: [{ name: sasl-off-nossl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu2004-gcc-test-latest-server-noauth run_on: ubuntu2004-small tags: [sasl-matrix-nossl, test, ubuntu2004, gcc, sasl-off, noauth, server, latest] depends_on: [{ name: sasl-off-nossl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu2004-gcc-test-latest-sharded-noauth run_on: ubuntu2004-small tags: [sasl-matrix-nossl, test, ubuntu2004, gcc, sasl-off, noauth, sharded, latest] depends_on: [{ name: sasl-off-nossl-ubuntu2004-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-ubuntu2004-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-nossl, compile, windows-vsCurrent, vs2017x64, sasl-off] commands: - func: sasl-off-nossl-compile vars: CC: Visual Studio 15 2017 Win64 - func: upload-build - name: sasl-off-winssl-vs2013-x86-compile run_on: windows-64-vs2013-large tags: [sasl-matrix-winssl, compile, windows-64-vs2013, vs2013x86, sasl-off] commands: - func: sasl-off-winssl-compile vars: CC: Visual Studio 12 2013 - func: upload-build - name: sasl-off-winssl-vs2015-x86-compile run_on: windows-64-vs2015-large tags: [sasl-matrix-winssl, compile, windows-64-vs2015, vs2015x86, sasl-off] commands: - func: sasl-off-winssl-compile vars: CC: Visual Studio 14 2015 - func: upload-build - name: sasl-off-winssl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2017x64, sasl-off] commands: - func: sasl-off-winssl-compile vars: CC: Visual Studio 15 2017 Win64 - func: upload-build - name: sasl-off-winssl-windows-2019-vs2017-x86-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2017x86, sasl-off] commands: - func: sasl-off-winssl-compile vars: CC: Visual Studio 15 2017 - func: upload-build - name: sasl-sspi-winssl-windows-2019-mingw-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, mingw, sasl-sspi] commands: - func: sasl-sspi-winssl-compile vars: CC: mingw - func: upload-build - name: sasl-sspi-winssl-windows-2019-mingw-test-latest-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, mingw, sasl-sspi, auth, server, latest, winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-mingw-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-mingw-compile - command: expansions.update params: updates: - { key: CC, value: mingw } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2017x64, sasl-sspi] commands: - func: sasl-sspi-winssl-compile vars: CC: Visual Studio 15 2017 Win64 - func: upload-build - name: sasl-sspi-winssl-windows-2019-vs2017-x64-test-latest-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x64, sasl-sspi, auth, server, latest, winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 Win64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2017-x86-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2017x86, sasl-sspi] commands: - func: sasl-sspi-winssl-compile vars: CC: Visual Studio 15 2017 - func: upload-build - name: sasl-sspi-winssl-windows-2019-vs2017-x86-test-latest-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2017x86, sasl-sspi, auth, server, latest, winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2017-x86-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2017-x86-compile - command: expansions.update params: updates: - { key: CC, value: Visual Studio 15 2017 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: scan-build-macos-1100-clang run_on: macos-1100 tags: [scan-build-matrix, macos-1100, clang] commands: - func: scan-build vars: CC: clang - func: upload scan artifacts - name: scan-build-ubuntu1604-arm64-clang run_on: ubuntu1604-arm64-large tags: [scan-build-matrix, ubuntu1604-arm64, clang] commands: - func: scan-build vars: CC: clang - func: upload scan artifacts - name: scan-build-ubuntu1604-clang run_on: ubuntu1604-large tags: [scan-build-matrix, ubuntu1604, clang] commands: - func: scan-build vars: CC: clang - func: upload scan artifacts - name: scan-build-ubuntu1604-clang-i686 run_on: ubuntu1604-large tags: [scan-build-matrix, ubuntu1604, clang, i686] commands: - func: scan-build vars: CC: clang MARCH: i686 - func: upload scan artifacts - name: scan-build-ubuntu1804-arm64-clang run_on: ubuntu1804-arm64-large tags: [scan-build-matrix, ubuntu1804-arm64, clang] commands: - func: scan-build vars: CC: clang - func: upload scan artifacts - name: scan-build-ubuntu1804-clang-i686 run_on: ubuntu1804-large tags: [scan-build-matrix, ubuntu1804, clang, i686] commands: - func: scan-build vars: CC: clang MARCH: i686 - func: upload scan artifacts - name: std-c11-archlinux-clang-compile run_on: archlinux-large tags: [std-matrix, archlinux, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang C_STD_VERSION: 11 - name: std-c11-debian10-clang-compile run_on: debian10-large tags: [std-matrix, debian10, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang C_STD_VERSION: 11 - name: std-c11-debian10-gcc-compile run_on: debian10-large tags: [std-matrix, debian10, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc C_STD_VERSION: 11 - name: std-c11-debian11-clang-compile run_on: debian11-large tags: [std-matrix, debian11, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang C_STD_VERSION: 11 - name: std-c11-debian11-gcc-compile run_on: debian11-large tags: [std-matrix, debian11, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc C_STD_VERSION: 11 - name: std-c11-debian92-clang-compile run_on: debian92-large tags: [std-matrix, debian92, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang C_STD_VERSION: 11 - name: std-c11-ubuntu1604-clang-compile run_on: ubuntu1604-large tags: [std-matrix, ubuntu1604, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang C_STD_VERSION: 11 - name: std-c11-ubuntu1604-clang-i686-compile run_on: ubuntu1604-large tags: [std-matrix, ubuntu1604, clang, compile, i686, std-c11] commands: - func: std-compile vars: CC: clang C_STD_VERSION: 11 MARCH: i686 - name: std-c11-ubuntu1804-clang-i686-compile run_on: ubuntu1804-large tags: [std-matrix, ubuntu1804, clang, compile, i686, std-c11] commands: - func: std-compile vars: CC: clang C_STD_VERSION: 11 MARCH: i686 - name: std-c11-ubuntu1804-gcc-compile run_on: ubuntu1804-large tags: [std-matrix, ubuntu1804, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc C_STD_VERSION: 11 - name: std-c11-ubuntu2004-clang-compile run_on: ubuntu2004-large tags: [std-matrix, ubuntu2004, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang C_STD_VERSION: 11 - name: std-c11-ubuntu2004-gcc-compile run_on: ubuntu2004-large tags: [std-matrix, ubuntu2004, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc C_STD_VERSION: 11 - name: std-c11-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2017x64, compile, std-c11] commands: - func: std-compile vars: CC: Visual Studio 15 2017 Win64 C_STD_VERSION: 11 - name: std-c17-debian10-gcc-compile run_on: debian10-large tags: [std-matrix, debian10, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc C_STD_VERSION: 17 - name: std-c17-debian11-gcc-compile run_on: debian11-large tags: [std-matrix, debian11, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc C_STD_VERSION: 17 - name: std-c17-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2017x64, compile, std-c17] commands: - func: std-compile vars: CC: Visual Studio 15 2017 Win64 C_STD_VERSION: 17 - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile run_on: ubuntu1804-large tags: [sanitizers-matrix-tsan, compile, ubuntu1804, clang, tsan, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.0-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, replica, "4.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.0-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, server, "4.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.0-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, sharded, "4.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.2-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, replica, "4.2", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.2-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, server, "4.2", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.2-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, sharded, "4.2", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.4-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, replica, "4.4", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.4-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, server, "4.4", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-4.4-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, sharded, "4.4", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-5.0-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, replica, "5.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-5.0-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, server, "5.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-5.0-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, sharded, "5.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-6.0-replica-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, replica, "6.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-6.0-server-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, server, "6.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-test-6.0-sharded-auth run_on: ubuntu1804-small tags: [sanitizers-matrix-tsan, test, ubuntu1804, clang, sasl-cyrus, tsan, auth, sharded, "6.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu1804-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile run_on: ubuntu2004-large tags: [sanitizers-matrix-tsan, compile, ubuntu2004, clang, tsan, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang - func: upload-build - name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-replica-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-tsan, test, ubuntu2004, clang, sasl-cyrus, tsan, auth, replica, "7.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-server-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-tsan, test, ubuntu2004, clang, sasl-cyrus, tsan, auth, server, "7.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-test-7.0-sharded-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-tsan, test, ubuntu2004, clang, sasl-cyrus, tsan, auth, sharded, "7.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-replica-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-tsan, test, ubuntu2004, clang, sasl-cyrus, tsan, auth, replica, latest, openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-server-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-tsan, test, ubuntu2004, clang, sasl-cyrus, tsan, auth, server, latest, openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-test-latest-sharded-auth run_on: ubuntu2004-small tags: [sanitizers-matrix-tsan, test, ubuntu2004, clang, sasl-cyrus, tsan, auth, sharded, latest, openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-ubuntu2004-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests mongo-c-driver-1.26.0/.evergreen/generated_configs/variants.yml000066400000000000000000000055211456567454500245400ustar00rootroot00000000000000buildvariants: - name: cse-matrix-darwinssl display_name: cse-matrix-darwinssl expansions: CLIENT_SIDE_ENCRYPTION: "on" DEBUG: "ON" tasks: - name: .cse-matrix-darwinssl - name: cse-matrix-openssl display_name: cse-matrix-openssl expansions: CLIENT_SIDE_ENCRYPTION: "on" DEBUG: "ON" tasks: - name: .cse-matrix-openssl - name: cse-matrix-winssl display_name: cse-matrix-winssl expansions: CLIENT_SIDE_ENCRYPTION: "on" DEBUG: "ON" tasks: - name: .cse-matrix-winssl - name: earthly-alpine3.18 display_name: Alpine 3.18 expansions: MONGOC_EARTHLY_ENV: alpine3.18 tasks: - name: .earthly-alpine3.18 - name: earthly-archlinux display_name: Arch Linux expansions: MONGOC_EARTHLY_ENV: archlinux tasks: - name: .earthly-archlinux - name: earthly-u22 display_name: Ubuntu 22.04 expansions: MONGOC_EARTHLY_ENV: u22 tasks: - name: .earthly-u22 - name: loadbalanced display_name: loadbalanced tasks: - name: .loadbalanced - name: mock-server-test display_name: Mock Server Test expansions: ASAN: "on" CC: gcc CFLAGS: -fno-omit-frame-pointer EXTRA_CONFIGURE_FLAGS: -DENABLE_EXTRA_ALIGNMENT=OFF SANITIZE: address,undefined tasks: - name: mock-server-test - name: openssl-static-matrix display_name: openssl-static-matrix tasks: - name: .openssl-static-matrix - name: sanitizers-matrix-asan display_name: sanitizers-matrix-asan expansions: ASAN: "on" CFLAGS: -fno-omit-frame-pointer CHECK_LOG: "ON" EXTRA_CONFIGURE_FLAGS: -DENABLE_EXTRA_ALIGNMENT=OFF SANITIZE: address,undefined tasks: - name: .sanitizers-matrix-asan - name: sanitizers-matrix-tsan display_name: sanitizers-matrix-tsan expansions: CFLAGS: -fno-omit-frame-pointer CHECK_LOG: "ON" EXTRA_CONFIGURE_FLAGS: -DENABLE_EXTRA_ALIGNMENT=OFF -DENABLE_SHM_COUNTERS=OFF SANITIZE: thread tasks: - name: .sanitizers-matrix-tsan - name: sasl-matrix-darwinssl display_name: sasl-matrix-darwinssl expansions: DEBUG: "ON" tasks: - name: .sasl-matrix-darwinssl - name: sasl-matrix-nossl display_name: sasl-matrix-nossl expansions: DEBUG: "ON" tasks: - name: .sasl-matrix-nossl - name: sasl-matrix-openssl display_name: sasl-matrix-openssl expansions: DEBUG: "ON" tasks: - name: .sasl-matrix-openssl - name: sasl-matrix-winssl display_name: sasl-matrix-winssl expansions: DEBUG: "ON" tasks: - name: .sasl-matrix-winssl - name: scan-build-matrix display_name: scan-build-matrix tasks: - name: .scan-build-matrix - name: std-matrix display_name: std-matrix tasks: - name: .std-matrix mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/000077500000000000000000000000001456567454500233545ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_generator/000077500000000000000000000000001456567454500307315ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_generator/__init__.py000066400000000000000000000070571456567454500330530ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys from collections import OrderedDict as OD from typing import Any, Iterable, Mapping, MutableMapping, MutableSequence, Sequence, Union Scalar = Union[str, bool, int, None, float] "YAML simple schema scalar types" ValueSequence = Sequence["Value"] "Sequence of YAML simple values" MutableValueArray = MutableSequence["Value"] "A mutable sequence of JSON values" ValueMapping = Mapping[Scalar, "Value"] "A YAML mapping type (arbitrary scalars as keys)" MutableValueMapping = MutableMapping[Scalar, "Value"] "A mutable YAML mapping type" Value = Union[ValueSequence, ValueMapping, Scalar] "Any YAML simple value" MutableValue = Union[MutableValueMapping, MutableValueArray, Scalar] "Any YAML simple value, which may be a mutable sequence or map" ValueOrderedDict = OD[Scalar, Value] "An OrderedDict of YAML values" try: import yaml import yamlordereddictloader # type: ignore except ImportError: sys.stderr.write("try 'pip install -r evergreen_config_generator/requirements.txt'\n") raise class ConfigObject(object): @property def name(self) -> str: return "UNSET" def to_dict(self) -> Value: return OD([("name", self.name)]) # We want legible YAML tasks: # # - name: debug-compile # tags: [zlib, snappy, compression, openssl] # commands: # - command: shell.exec # params: # script: |- # set -o errexit # ... # # Write values compactly except multiline strings, which use "|" style. Write # tag sets as lists. class _Dumper(yamlordereddictloader.Dumper): def __init__(self, *args: Value, **kwargs: Value): super().__init__(*args, **kwargs) # type: ignore self.add_representer(set, type(self).represent_set) # Use "multi_representer" to represent all subclasses of ConfigObject. self.add_multi_representer(ConfigObject, type(self).represent_config_object) def represent_scalar(self, tag: str, value: Value, style: str | None = None) -> yaml.ScalarNode: if isinstance(value, (str)) and "\n" in value: style = "|" return super().represent_scalar(tag, value, style) # type: ignore def represent_set(self, data: Iterable[Value]) -> yaml.MappingNode: return super().represent_list(sorted(set(data))) # type: ignore def represent_config_object(self, obj: ConfigObject) -> yaml.Node: d = obj.to_dict() return super().represent_data(d) # type: ignore def yaml_dump(obj: Any): return yaml.dump(obj, Dumper=_Dumper, default_flow_style=False) def generate(config: Any, path: str): """Dump config to a file as YAML. config is a dict, preferably an OrderedDict. path is a file path. """ f = open(path, "w+") f.write( """#################################### # Evergreen configuration # # Generated with evergreen_config_generator from # github.com/mongodb-labs/drivers-evergreen-tools # # DO NOT EDIT THIS FILE # #################################### """ ) f.write(yaml_dump(config)) mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_generator/functions.py000066400000000000000000000072421456567454500333200ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from textwrap import dedent from typing import Iterable from evergreen_config_generator import ConfigObject from . import Value, MutableValueMapping, ValueMapping, ValueOrderedDict def func(func_name: str, **kwargs: Value) -> MutableValueMapping: od: MutableValueMapping = OD([("func", func_name)]) if kwargs: od["vars"] = OD(sorted(kwargs.items())) return od def s3_put(remote_file: str, project_path: bool = True, **kwargs: Value) -> ValueMapping: if project_path: remote_file = "${project}/" + remote_file return ValueOrderedDict( [ ("command", "s3.put"), ( "params", ValueOrderedDict( ( ("aws_key", "${aws_key}"), ("aws_secret", "${aws_secret}"), ("remote_file", remote_file), ("bucket", "mciuploads"), ("permissions", "public-read"), *kwargs.items(), ) ), ), ] ) def strip_lines(s: str) -> str: return "\n".join(line for line in s.split("\n") if line.strip()) def shell_exec( script: str, test: bool = True, errexit: bool = True, xtrace: bool = False, silent: bool = False, continue_on_err: bool = False, working_dir: str | None = None, background: bool = False, add_expansions_to_env: bool = False, redirect_standard_error_to_output: bool = False, include_expansions_in_env: Iterable[str] = (), ) -> ValueMapping: dedented = "" if errexit: dedented += "set -o errexit\n" if xtrace: dedented += "set -o xtrace\n" dedented += dedent(strip_lines(script)) command = ValueOrderedDict([("command", "shell.exec")]) if test: command["type"] = "test" command["params"] = OD() if silent: command["params"]["silent"] = True if working_dir is not None: command["params"]["working_dir"] = working_dir if continue_on_err: command["params"]["continue_on_err"] = True if background: command["params"]["background"] = True if add_expansions_to_env: command["params"]["add_expansions_to_env"] = True if redirect_standard_error_to_output: command["params"]["redirect_standard_error_to_output"] = True if include_expansions_in_env: command["params"]["include_expansions_in_env"] = list(include_expansions_in_env) command["params"]["shell"] = "bash" command["params"]["script"] = dedented return command def targz_pack(target: str, source_dir: str, *include: str) -> ValueMapping: return OD( [ ("command", "archive.targz_pack"), ("params", OD([("target", target), ("source_dir", source_dir), ("include", list(include))])), ] ) class Function(ConfigObject): def __init__(self, *commands: Value): super(Function, self).__init__() self.commands = commands def to_dict(self) -> Value: return list(self.commands) mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_generator/taskgroups.py000066400000000000000000000040651456567454500335120ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from typing import MutableMapping from evergreen_config_generator import ConfigObject from . import Value, ValueSequence class TaskGroup(ConfigObject): def __init__(self, name: str): self._task_group_name = name self.setup_group: ValueSequence | None = None self.teardown_group: ValueSequence | None = None self.setup_task: str | None = None self.teardown_task: str | None = None self.max_hosts: int | None = None self.timeout: int | None = None self.setup_group_can_fail_task: bool | None = None self.setup_group_timeout_secs: int | None = None self.share_processes: bool | None = None self.tasks: ValueSequence | None = None @property def name(self) -> str: return self._task_group_name def to_dict(self) -> Value: v = super().to_dict() assert isinstance(v, MutableMapping) # See possible TaskGroup attributes from the Evergreen wiki: # https://github.com/evergreen-ci/evergreen/wiki/Project-Configuration-Files#task-groups attrs = [ "setup_group", "teardown_group", "setup_task", "teardown_task", "max_hosts", "timeout", "setup_group_can_fail_task", "setup_group_timeout_secs", "share_processes", "tasks", ] for i in attrs: if getattr(self, i, None): v[i] = getattr(self, i) return v mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_generator/tasks.py000066400000000000000000000156371456567454500324440ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD import copy from itertools import chain, product import itertools from typing import ClassVar, Iterable, Literal, Mapping, MutableMapping, Sequence, Union from evergreen_config_generator import ConfigObject from evergreen_config_generator.functions import func from . import Value, MutableValueMapping, ValueSequence DependencySpec = Union[str, Mapping[str, Value]] class Task(ConfigObject): def __init__( self, task_name: str | None = None, commands: Iterable[Value] = (), tags: Iterable[str] = (), depends_on: Iterable[DependencySpec] = (), exec_timeout_secs: int | None = None, ): self._name = task_name self._tags = list(tags) self.options: MutableValueMapping = OD() self.commands: ValueSequence = list(commands) self.exec_timeout_secs = exec_timeout_secs self._depends_on = list(map(self._normal_dep, depends_on)) if exec_timeout_secs is not None: self.options["exec_timeout_secs"] = exec_timeout_secs @property def dependencies(self) -> Sequence[Mapping[str, Value]]: main = list(self._depends_on) main.extend(map(self._normal_dep, self.additional_dependencies())) return tuple(main) def _normal_dep(self, spec: DependencySpec) -> Mapping[str, Value]: if isinstance(spec, str): return OD([("name", spec)]) return spec @property def tags(self) -> Sequence[str]: return tuple(sorted(chain(self.additional_tags(), self._tags))) def pre_commands(self) -> Iterable[Value]: return () def main_commands(self) -> Iterable[Value]: return () def post_commands(self) -> Iterable[Value]: return () def additional_dependencies(self) -> Iterable[DependencySpec]: return () @property def name(self) -> str: assert self._name is not None, f'Task {self} did not set a name, and did not override the "name" property' return self._name def additional_tags(self) -> Iterable[str]: return () def add_dependency(self, dependency: DependencySpec): if isinstance(dependency, str): dependency = OD([("name", dependency)]) self._depends_on.append(dependency) def to_dict(self): task: MutableValueMapping = super().to_dict() # type: ignore assert isinstance(task, MutableMapping) if self.tags: task["tags"] = list(self.tags) task.update(self.options) deps: Sequence[MutableValueMapping] = list(self.dependencies) # type: ignore if deps: if len(deps) == 1: task["depends_on"] = OD(deps[0]) else: task["depends_on"] = copy.deepcopy(deps) task["commands"] = list( itertools.chain( self.pre_commands(), self.main_commands(), self.commands, self.post_commands(), ) ) return task NamedTask = Task class FuncTask(NamedTask): def __init__( self, task_name: str, functions: Iterable[str], tags: Iterable[str] = (), depends_on: Iterable[DependencySpec] = (), exec_timeout_secs: int | None = None, ): commands = [func(func_name) for func_name in functions] super().__init__(task_name, commands, tags=tags, depends_on=depends_on, exec_timeout_secs=exec_timeout_secs) super(FuncTask, self).__init__(task_name, commands=commands) class Prohibited(Exception): pass def require(rule: bool) -> None: if not rule: raise Prohibited() def prohibit(rule: bool) -> None: if rule: raise Prohibited() def both_or_neither(rule0: bool, rule1: bool) -> None: if rule0: require(rule1) else: prohibit(rule1) class SettingsAccess: def __init__(self, inst: "MatrixTask") -> None: self._task = inst def __getattr__(self, __setting: str) -> str | bool: return self._task.setting_value(__setting) class MatrixTask(Task): axes: ClassVar[Mapping[str, Sequence[str | bool]]] = OD() def __init__(self, settings: Mapping[str, str | bool]): super().__init__() self._settings = {k: v for k, v in settings.items()} for axis, options in type(self).axes.items(): if axis not in self._settings: self._settings[axis] = options[0] def display(self, axis_name: str) -> str: value = self.setting_value(axis_name) if value is False: # E.g., if self.auth is False, return 'noauth'. return f"no{axis_name}" elif value is True: return axis_name else: return value def on_off(self, key: str, val: str) -> Literal["on", "off"]: return "on" if self.setting_value(key) == val else "off" @property def name(self) -> str: return "-".join(self.name_parts()) def name_parts(self) -> Iterable[str]: raise NotImplementedError @property def settings(self) -> SettingsAccess: return SettingsAccess(self) def setting_value(self, axis: str) -> str | bool: assert ( axis in type(self).axes.keys() ), f'Attempted to inspect setting "{axis}", which is not defined for this task type' return self._settings[axis] def setting_eq(self, axis: str, val: str | bool) -> bool: current = self.setting_value(axis) options = type(self).axes[axis] assert ( val in options ), f'Looking for value "{val}" on setting "{axis}", but that is not a supported option (Expects one of {options})' return current == val def is_valid_combination(self) -> bool: try: return self.do_is_valid_combination() except Prohibited: print(f"Ignoring invalid combination {self.name!r}") return False def do_is_valid_combination(self) -> bool: return True @classmethod def matrix(cls): for cell in product(*cls.axes.values()): axis_values = dict(zip(cls.axes, cell)) task = cls(settings=axis_values) if task.allowed: yield task @property def allowed(self): try: return self.do_is_valid_combination() except Prohibited: return False mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_generator/variants.py000066400000000000000000000031071456567454500331330ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from typing import Iterable, Mapping from evergreen_config_generator import ConfigObject from . import ValueMapping class Variant(ConfigObject): def __init__( self, name: str, display_name: str, run_on: list[str] | str, tasks: Iterable[str | ValueMapping], expansions: Mapping[str, str] | None = None, tags: Iterable[str] = (), batchtime: int | None = None, ): super(Variant, self).__init__() self._variant_name = name self.display_name = display_name self.run_on = run_on self.tasks = tasks self.expansions = expansions self.tags = list(tags) self.batchtime = batchtime @property def name(self): return self._variant_name def to_dict(self): v = super(Variant, self).to_dict() for i in "display_name", "expansions", "run_on", "tasks", "batchtime", "tags": if getattr(self, i): v[i] = getattr(self, i) return v mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_lib/000077500000000000000000000000001456567454500275115ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_lib/__init__.py000066400000000000000000000026531456567454500316300ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from typing import Iterable from evergreen_config_generator.functions import shell_exec def shell_mongoc( script: str, test: bool = True, errexit: bool = True, xtrace: bool = False, silent: bool = False, continue_on_err: bool = False, background: bool = False, add_expansions_to_env: bool = False, redirect_standard_error_to_output: bool = False, include_expansions_in_env: Iterable[str] = (), ): return shell_exec( script, working_dir="mongoc", test=test, errexit=errexit, xtrace=xtrace, silent=silent, continue_on_err=continue_on_err, background=background, add_expansions_to_env=add_expansions_to_env, include_expansions_in_env=include_expansions_in_env, redirect_standard_error_to_output=redirect_standard_error_to_output, ) mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_lib/functions.py000066400000000000000000000233661456567454500321050ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from evergreen_config_generator.functions import ( Function, s3_put, shell_exec) from evergreen_config_lib import shell_mongoc build_path = '${build_variant}/${revision}/${version_id}/${build_id}' all_functions = OD([ ('install ssl', Function( shell_mongoc(r''' bash .evergreen/scripts/install-ssl.sh ''', test=False, add_expansions_to_env=True), )), ('upload coverage', Function( shell_mongoc(r''' export AWS_ACCESS_KEY_ID=${aws_key} export AWS_SECRET_ACCESS_KEY=${aws_secret} aws s3 cp coverage s3://mciuploads/${project}/%s/coverage/ --recursive --acl public-read --region us-east-1 ''' % (build_path,), test=False, silent=True), s3_put(build_path + '/coverage/index.html', aws_key='${aws_key}', aws_secret='${aws_secret}', local_file='mongoc/coverage/index.html', bucket='mciuploads', permissions='public-read', content_type='text/html', display_name='Coverage Report'), )), ('upload scan artifacts', Function( shell_mongoc(r''' if find scan -name \*.html | grep -q html; then (cd scan && find . -name index.html -exec echo "
  • {}
  • " \;) >> scan.html else echo "No issues found" > scan.html fi '''), shell_mongoc(r''' export AWS_ACCESS_KEY_ID=${aws_key} export AWS_SECRET_ACCESS_KEY=${aws_secret} aws s3 cp scan s3://mciuploads/${project}/%s/scan/ --recursive --acl public-read --region us-east-1 ''' % (build_path,), test=False, silent=True), s3_put(build_path + '/scan/index.html', aws_key='${aws_key}', aws_secret='${aws_secret}', local_file='mongoc/scan.html', bucket='mciuploads', permissions='public-read', content_type='text/html', display_name='Scan Build Report'), )), # Use "silent=True" to hide output since errors may contain credentials. ('run auth tests', Function( shell_mongoc(r''' bash .evergreen/scripts/run-auth-tests.sh ''', add_expansions_to_env=True), )), ('link sample program', Function( shell_mongoc(r''' # Compile a program that links dynamically or statically to libmongoc, # using variables from pkg-config or CMake's find_package command. export BUILD_SAMPLE_WITH_CMAKE=${BUILD_SAMPLE_WITH_CMAKE} export BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=${BUILD_SAMPLE_WITH_CMAKE_DEPRECATED} export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} LINK_STATIC= bash .evergreen/scripts/link-sample-program.sh LINK_STATIC=1 bash .evergreen/scripts/link-sample-program.sh ''', include_expansions_in_env=['distro_id']), )), ('link sample program bson', Function( shell_mongoc(r''' # Compile a program that links dynamically or statically to libbson, # using variables from pkg-config or from CMake's find_package command. BUILD_SAMPLE_WITH_CMAKE= BUILD_SAMPLE_WITH_CMAKE_DEPRECATED= LINK_STATIC= bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE= BUILD_SAMPLE_WITH_CMAKE_DEPRECATED= LINK_STATIC=1 bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED= LINK_STATIC= bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED= LINK_STATIC=1 bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=1 LINK_STATIC= bash .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=1 LINK_STATIC=1 bash .evergreen/scripts/link-sample-program-bson.sh ''', include_expansions_in_env=['distro_id']), )), ('link sample program MSVC', Function( shell_mongoc(r''' # Build libmongoc with CMake and compile a program that links # dynamically or statically to it, using variables from CMake's # find_package command. export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} . .evergreen/scripts/use-tools.sh paths . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(native-path "$(find_cmake_latest)")" LINK_STATIC= cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc.cmd LINK_STATIC=1 cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc.cmd ''', include_expansions_in_env=['distro_id']), )), ('link sample program mingw', Function( shell_mongoc(r''' # Build libmongoc with CMake and compile a program that links # dynamically to it, using variables from pkg-config.exe. . .evergreen/scripts/use-tools.sh paths . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(native-path "$(find_cmake_latest)")" cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-mingw.cmd ''', include_expansions_in_env=['distro_id']), )), ('link sample program MSVC bson', Function( shell_mongoc(r''' # Build libmongoc with CMake and compile a program that links # dynamically or statically to it, using variables from CMake's # find_package command. export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} . .evergreen/scripts/use-tools.sh paths . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(native-path "$(find_cmake_latest)")" LINK_STATIC= cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc-bson.cmd LINK_STATIC=1 cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc-bson.cmd ''', include_expansions_in_env=['distro_id']), )), ('link sample program mingw bson', Function( shell_mongoc(r''' # Build libmongoc with CMake and compile a program that links # dynamically to it, using variables from pkg-config.exe. . .evergreen/scripts/use-tools.sh paths . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(native-path "$(find_cmake_latest)")" cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-mingw-bson.cmd '''), )), ('update codecov.io', Function( shell_mongoc(r''' # Note: coverage is currently only enabled on the ubuntu1804 distro. # This script does not support MacOS, Windows, or non-x86_64 distros. # Update accordingly if code coverage is expanded to other distros. curl -Os https://uploader.codecov.io/latest/linux/codecov chmod +x codecov # -Z: Exit with a non-zero value if error. # -g: Run with gcov support. # -t: Codecov upload token. # perl: filter verbose "Found" list and "Processing" messages. ./codecov -Zgt "${codecov_token}" | perl -lne 'print if not m|^.*\.gcov(\.\.\.)?$|' ''', test=False), )), ('compile coverage', Function( shell_mongoc(r''' COVERAGE=ON DEBUG=ON bash .evergreen/scripts/compile.sh ''', add_expansions_to_env=True), )), ('build mongohouse', Function( shell_exec(r''' cd drivers-evergreen-tools export DRIVERS_TOOLS=$(pwd) bash .evergreen/atlas_data_lake/pull-mongohouse-image.sh '''), )), ('run mongohouse', Function( shell_exec(r''' cd drivers-evergreen-tools export DRIVERS_TOOLS=$(pwd) bash .evergreen/atlas_data_lake/run-mongohouse-image.sh '''), )), ('test mongohouse', Function( shell_mongoc(r''' echo "Waiting for mongohouse to start..." wait_for_mongohouse() { for _ in $(seq 300); do # Exit code 7: "Failed to connect to host". if curl -s localhost:$1; (("$?" != 7)); then return 0 else sleep 1 fi done echo "Could not detect mongohouse on port $1" 1>&2 return 1 } wait_for_mongohouse 27017 || exit echo "Waiting for mongohouse to start... done." pgrep -a "mongohouse" export RUN_MONGOHOUSE_TESTS=ON ./src/libmongoc/test-libmongoc --no-fork -l /mongohouse/* -d --skip-tests .evergreen/etc/skip-tests.txt '''), )), ('run aws tests', Function( # Assume role to get AWS secrets. { "command": "ec2.assume_role", "params": { "role_arn": "${aws_test_secrets_role}" } }, shell_mongoc(r''' pushd ../drivers-evergreen-tools/.evergreen/auth_aws ./setup_secrets.sh drivers/aws_auth popd # ../drivers-evergreen-tools/.evergreen/auth_aws ''', include_expansions_in_env=["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN"]), shell_mongoc(r''' pushd ../drivers-evergreen-tools/.evergreen/auth_aws . ./activate-authawsvenv.sh popd # ../drivers-evergreen-tools/.evergreen/auth_aws bash .evergreen/scripts/run-aws-tests.sh ''', include_expansions_in_env=["TESTCASE"]) )), ]) mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_lib/taskgroups.py000066400000000000000000000013131456567454500322630ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from typing import Sequence from evergreen_config_generator.taskgroups import TaskGroup all_task_groups: Sequence[TaskGroup] = [] mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_lib/tasks.py000066400000000000000000001217561456567454500312240ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from itertools import chain from typing import ClassVar, Iterable, Literal, Mapping, MutableMapping, MutableSequence, Optional, Sequence from evergreen_config_generator import Value, Scalar from evergreen_config_generator.functions import func, s3_put from evergreen_config_generator.tasks import ( both_or_neither, MatrixTask, NamedTask, prohibit, require, Task, DependencySpec, ) from evergreen_config_lib import shell_mongoc from pkg_resources import parse_version ToggleStr = Literal["OFF", "ON"] OptToggleStr = Optional[ToggleStr] TopologyStr = Literal["server"] class CompileTask(NamedTask): cls_compile_sh_env: ClassVar[Mapping[str, str]] = {} cls_tags: ClassVar[Sequence[str]] = () cls_sanitize: ClassVar[Sequence[str]] = () def __init__( self, task_name: str, tags: Iterable[str] = (), config: str = "debug", compression: str | None = "default", suffix_commands: Iterable[Value] = (), depends_on: Iterable[DependencySpec] = (), prefix_commands: Iterable[Value] = (), sanitize: Iterable[Literal["undefined", "address", "thread"]] = (), *, CFLAGS: str | None = None, LDFLAGS: str | None = None, EXTRA_CONFIGURE_FLAGS: str | None = None, SSL: Literal["WINDOWS", "DARWIN", "OPENSSL", "OPENSSL_STATIC", "LIBRESSL", "OFF", None] = None, ENABLE_SHM_COUNTERS: OptToggleStr = None, CHECK_LOG: OptToggleStr = None, TRACING: OptToggleStr = None, SASL: Literal[None, "OFF", "AUTO", "CYRUS", "SSPI"] = None, ENABLE_RDTSCP: OptToggleStr = None, SRV: OptToggleStr = None, ): super(CompileTask, self).__init__(task_name=task_name, depends_on=depends_on, tags=tags) self.suffix_commands = list(suffix_commands) self.prefix_commands = list(prefix_commands) # Environment variables for .evergreen/scripts/compile.sh. self.compile_sh_opt: dict[str, str] = {} if config == "debug": self.compile_sh_opt["DEBUG"] = "ON" else: assert config == "release" self.compile_sh_opt["RELEASE"] = "ON" if CFLAGS: self.compile_sh_opt["CFLAGS"] = CFLAGS if LDFLAGS: self.compile_sh_opt["LDFLAGS"] = LDFLAGS if EXTRA_CONFIGURE_FLAGS: self.compile_sh_opt["EXTRA_CONFIGURE_FLAGS"] = EXTRA_CONFIGURE_FLAGS if SSL: self.compile_sh_opt["SSL"] = SSL if ENABLE_SHM_COUNTERS: self.compile_sh_opt["ENABLE_SHM_COUNTERS"] = ENABLE_SHM_COUNTERS if CHECK_LOG: self.compile_sh_opt["CHECK_LOG"] = CHECK_LOG if TRACING: self.compile_sh_opt["TRACING"] = TRACING if SASL: self.compile_sh_opt["SASL"] = SASL if ENABLE_RDTSCP: self.compile_sh_opt["ENABLE_RDTSCP"] = ENABLE_RDTSCP if SRV: self.compile_sh_opt["SRV"] = SRV if compression != "default": self.compile_sh_opt["SNAPPY"] = "ON" if compression in ("all", "snappy") else "OFF" self.compile_sh_opt["ZLIB"] = "BUNDLED" if compression in ("all", "zlib") else "OFF" self.compile_sh_opt["ZSTD"] = "ON" if compression in ("all", "zstd") else "OFF" if sanitize: self.compile_sh_opt["SANITIZE"] = ",".join(sanitize) self.compile_sh_opt.update(type(self).cls_compile_sh_env) def additional_script_env(self) -> Mapping[str, str]: return {} def to_dict(self): task = super(CompileTask, self).to_dict() commands = task["commands"] assert isinstance(commands, MutableSequence), task commands.extend(self.prefix_commands) script = "env" for opt, value in sorted(self.compile_sh_opt.items()): script += ' %s="%s"' % (opt, value) script += " bash .evergreen/scripts/compile.sh" commands.append(shell_mongoc(script, add_expansions_to_env=True)) commands.append(func("upload-build")) commands.extend(self.suffix_commands) return task def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield from self.cls_tags class SpecialTask(CompileTask): cls_tags: ClassVar[Sequence[str]] = ["special"] class CompileWithClientSideEncryption(CompileTask): cls_compile_sh_env: ClassVar[Mapping[str, str]] = dict( # Compiling with ClientSideEncryption support requires linking against the library libmongocrypt. COMPILE_LIBMONGOCRYPT="ON", EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON", ) cls_tags: ClassVar[Sequence[str]] = "client-side-encryption", "special" class CompileWithClientSideEncryptionAsan(CompileTask): cls_compile_sh_env: ClassVar[Mapping[str, str]] = dict( CFLAGS="-fno-omit-frame-pointer", COMPILE_LIBMONGOCRYPT="ON", CHECK_LOG="ON", EXTRA_CONFIGURE_FLAGS="-DENABLE_EXTRA_ALIGNMENT=OFF", PATH="/usr/lib/llvm-3.8/bin:$PATH", ) cls_tags: ClassVar[Sequence[str]] = ["client-side-encryption"] cls_sanitize: ClassVar[Sequence[str]] = ["address"] class LinkTask(NamedTask): def __init__( self, task_name: str, suffix_commands: Iterable[Value], orchestration: Literal[True, False, "ssl"] = True ): if orchestration == "ssl": # Actual value of SSL does not matter here so long as it is not 'nossl'. bootstrap_commands = [func("fetch-det"), func("bootstrap-mongo-orchestration", SSL="openssl")] elif orchestration: bootstrap_commands = [func("fetch-det"), func("bootstrap-mongo-orchestration")] else: bootstrap_commands = [] super().__init__( task_name=task_name, commands=bootstrap_commands + list(suffix_commands), ) all_tasks = [ CompileTask( "hardened-compile", tags=["hardened"], compression=None, CFLAGS="-fno-strict-overflow -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -O", LDFLAGS="-pie -Wl,-z,relro -Wl,-z,now", ), CompileTask("debug-compile-compression-zlib", tags=["zlib", "compression"], compression="zlib"), CompileTask("debug-compile-compression-snappy", tags=["snappy", "compression"], compression="snappy"), CompileTask("debug-compile-compression-zstd", tags=["zstd", "compression"], compression="zstd"), CompileTask("debug-compile-compression", tags=["zlib", "snappy", "zstd", "compression"], compression="all"), CompileTask( "debug-compile-no-align", tags=["debug-compile"], compression="zlib", EXTRA_CONFIGURE_FLAGS="-DENABLE_EXTRA_ALIGNMENT=OFF", ), CompileTask("debug-compile-nosasl-nossl", tags=["debug-compile", "nosasl", "nossl"], SSL="OFF"), CompileTask("debug-compile-lto", CFLAGS="-flto"), CompileTask("debug-compile-lto-thin", CFLAGS="-flto=thin"), CompileTask("debug-compile-no-counters", tags=["debug-compile", "no-counters"], ENABLE_SHM_COUNTERS="OFF"), SpecialTask( "debug-compile-asan-clang", tags=["debug-compile", "asan-clang"], compression="zlib", CFLAGS="-fno-omit-frame-pointer", CHECK_LOG="ON", sanitize=["address"], EXTRA_CONFIGURE_FLAGS="-DENABLE_EXTRA_ALIGNMENT=OFF", ), SpecialTask( "debug-compile-asan-clang-openssl", tags=["debug-compile", "asan-clang"], compression="zlib", CFLAGS="-fno-omit-frame-pointer", CHECK_LOG="ON", sanitize=["address"], EXTRA_CONFIGURE_FLAGS="-DENABLE_EXTRA_ALIGNMENT=OFF", SSL="OPENSSL", ), CompileTask("compile-tracing", TRACING="ON", CFLAGS="-Werror -Wno-cast-align"), CompileTask("release-compile", config="release"), CompileTask("debug-compile-nosasl-openssl", tags=["debug-compile", "nosasl", "openssl"], SSL="OPENSSL"), CompileTask( "debug-compile-nosasl-openssl-static", tags=["debug-compile", "nosasl", "openssl-static"], SSL="OPENSSL_STATIC" ), CompileTask("debug-compile-nosasl-darwinssl", tags=["debug-compile", "nosasl", "darwinssl"], SSL="DARWIN"), CompileTask("debug-compile-nosasl-winssl", tags=["debug-compile", "nosasl", "winssl"], SSL="WINDOWS"), CompileTask("debug-compile-sasl-nossl", tags=["debug-compile", "sasl", "nossl"], SASL="AUTO", SSL="OFF"), CompileTask("debug-compile-sasl-openssl", tags=["debug-compile", "sasl", "openssl"], SASL="AUTO", SSL="OPENSSL"), CompileTask( "debug-compile-sasl-openssl-static", tags=["debug-compile", "sasl", "openssl-static"], SASL="AUTO", SSL="OPENSSL_STATIC", ), CompileTask("debug-compile-sasl-darwinssl", tags=["debug-compile", "sasl", "darwinssl"], SASL="AUTO", SSL="DARWIN"), CompileTask("debug-compile-sspi-nossl", tags=["debug-compile", "sspi", "nossl"], SASL="SSPI", SSL="OFF"), CompileTask("debug-compile-sspi-openssl", tags=["debug-compile", "sspi", "openssl"], SASL="SSPI", SSL="OPENSSL"), CompileTask( "debug-compile-sspi-openssl-static", tags=["debug-compile", "sspi", "openssl-static"], SASL="SSPI", SSL="OPENSSL_STATIC", ), CompileTask("debug-compile-rdtscp", ENABLE_RDTSCP="ON"), CompileTask("debug-compile-sspi-winssl", tags=["debug-compile", "sspi", "winssl"], SASL="SSPI", SSL="WINDOWS"), CompileTask("debug-compile-nosrv", tags=["debug-compile"], SRV="OFF"), LinkTask("link-with-cmake", suffix_commands=[func("link sample program", BUILD_SAMPLE_WITH_CMAKE=1)]), LinkTask( "link-with-cmake-ssl", suffix_commands=[func("link sample program", BUILD_SAMPLE_WITH_CMAKE=1, ENABLE_SSL=1)], ), LinkTask( "link-with-cmake-snappy", suffix_commands=[func("link sample program", BUILD_SAMPLE_WITH_CMAKE=1, ENABLE_SNAPPY="ON")], ), LinkTask("link-with-cmake-mac", suffix_commands=[func("link sample program", BUILD_SAMPLE_WITH_CMAKE=1)]), LinkTask( "link-with-cmake-deprecated", suffix_commands=[func("link sample program", BUILD_SAMPLE_WITH_CMAKE=1, BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=1)], ), LinkTask( "link-with-cmake-ssl-deprecated", suffix_commands=[ func( "link sample program", BUILD_SAMPLE_WITH_CMAKE=1, BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=1, ENABLE_SSL=1, ) ], ), LinkTask( "link-with-cmake-snappy-deprecated", suffix_commands=[ func( "link sample program", BUILD_SAMPLE_WITH_CMAKE=1, BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=1, ENABLE_SNAPPY="ON", ) ], ), LinkTask( "link-with-cmake-mac-deprecated", suffix_commands=[func("link sample program", BUILD_SAMPLE_WITH_CMAKE=1, BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=1)], ), LinkTask("link-with-cmake-windows", suffix_commands=[func("link sample program MSVC")]), LinkTask( "link-with-cmake-windows-ssl", suffix_commands=[func("link sample program MSVC", ENABLE_SSL=1)], orchestration="ssl", ), LinkTask("link-with-cmake-windows-snappy", suffix_commands=[func("link sample program MSVC", ENABLE_SNAPPY="ON")]), LinkTask("link-with-cmake-mingw", suffix_commands=[func("link sample program mingw")]), LinkTask("link-with-pkg-config", suffix_commands=[func("link sample program")]), LinkTask("link-with-pkg-config-mac", suffix_commands=[func("link sample program")]), LinkTask("link-with-pkg-config-ssl", suffix_commands=[func("link sample program", ENABLE_SSL=1)]), LinkTask("link-with-bson", suffix_commands=[func("link sample program bson")], orchestration=False), LinkTask("link-with-bson-mac", suffix_commands=[func("link sample program bson")], orchestration=False), LinkTask("link-with-bson-windows", suffix_commands=[func("link sample program MSVC bson")], orchestration=False), LinkTask("link-with-bson-mingw", suffix_commands=[func("link sample program mingw bson")], orchestration=False), NamedTask( "debian-package-build", commands=[ shell_mongoc('export IS_PATCH="${is_patch}"\n' "sh .evergreen/scripts/debian_package_build.sh"), s3_put( local_file="deb.tar.gz", remote_file="${branch_name}/mongo-c-driver-debian-packages-${CURRENT_VERSION}.tar.gz", content_type="${content_type|application/x-gzip}", ), s3_put( local_file="deb.tar.gz", remote_file="${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-debian-packages.tar.gz", content_type="${content_type|application/x-gzip}", ), s3_put( local_file="deb-i386.tar.gz", remote_file="${branch_name}/mongo-c-driver-debian-packages-i386-${CURRENT_VERSION}.tar.gz", content_type="${content_type|application/x-gzip}", ), s3_put( local_file="deb-i386.tar.gz", remote_file="${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-debian-packages-i386.tar.gz", content_type="${content_type|application/x-gzip}", ), ], ), NamedTask( "rpm-package-build", commands=[ shell_mongoc("sh .evergreen/scripts/build_snapshot_rpm.sh"), s3_put( local_file="rpm.tar.gz", remote_file="${branch_name}/mongo-c-driver-rpm-packages-${CURRENT_VERSION}.tar.gz", content_type="${content_type|application/x-gzip}", ), s3_put( local_file="rpm.tar.gz", remote_file="${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-rpm-packages.tar.gz", content_type="${content_type|application/x-gzip}", ), ], ), NamedTask( "install-uninstall-check-mingw", commands=[ shell_mongoc( r""" . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(find_cmake_latest)" export CC="C:/mingw-w64/x86_64-4.9.1-posix-seh-rt_v3-rev1/mingw64/bin/gcc.exe" BSON_ONLY=1 cmd.exe /c .\\.evergreen\\scripts\\install-uninstall-check-windows.cmd cmd.exe /c .\\.evergreen\\scripts\\install-uninstall-check-windows.cmd""", include_expansions_in_env=["distro_id"], ) ], ), NamedTask( "install-uninstall-check-msvc", commands=[ shell_mongoc( r""" . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(find_cmake_latest)" export CC="Visual Studio 14 2015 Win64" BSON_ONLY=1 cmd.exe /c .\\.evergreen\\scripts\\install-uninstall-check-windows.cmd cmd.exe /c .\\.evergreen\\scripts\\install-uninstall-check-windows.cmd""", include_expansions_in_env=["distro_id"], ) ], ), NamedTask( "install-uninstall-check", commands=[ shell_mongoc( r""" . .evergreen/scripts/find-cmake-latest.sh export CMAKE="$(find_cmake_latest)" DESTDIR="$(pwd)/dest" bash ./.evergreen/scripts/install-uninstall-check.sh BSON_ONLY=1 bash ./.evergreen/scripts/install-uninstall-check.sh bash ./.evergreen/scripts/install-uninstall-check.sh""", include_expansions_in_env=["distro_id"], ) ], ), CompileTask("debug-compile-with-warnings", CFLAGS="-Werror -Wno-cast-align"), CompileWithClientSideEncryption( "debug-compile-sasl-openssl-static-cse", tags=["debug-compile", "sasl", "openssl-static"], SASL="AUTO", SSL="OPENSSL_STATIC", ), CompileTask( "debug-compile-nosasl-openssl-1.0.1", prefix_commands=[func("install ssl", SSL="openssl-1.0.1u")], CFLAGS="-Wno-redundant-decls", SSL="OPENSSL", SASL="OFF", ), NamedTask( "build-and-test-with-toolchain", commands=[ OD( [ ("command", "s3.get"), ( "params", OD( [ ("aws_key", "${toolchain_aws_key}"), ("aws_secret", "${toolchain_aws_secret}"), ("remote_file", "mongo-c-toolchain/${distro_id}/2023/06/07/mongo-c-toolchain.tar.gz"), ("bucket", "mongo-c-toolchain"), ("local_file", "mongo-c-toolchain.tar.gz"), ] ), ), ] ), shell_mongoc("bash ./.evergreen/scripts/build-and-test-with-toolchain.sh"), ], ), NamedTask( "install-libmongoc-after-libbson", commands=[shell_mongoc("bash ./.evergreen/scripts/install-libmongoc-after-libbson.sh"),], ), ] class CoverageTask(MatrixTask): axes = OD( [ ("version", ["latest"]), ("topology", ["replica_set"]), ("auth", [True]), ("sasl", ["sasl"]), ("ssl", ["openssl"]), ("cse", [False, True]), ] ) def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield "test-coverage" yield str(self.settings.version) if self.cse: yield "client-side-encryption" def name_parts(self) -> Iterable[str]: yield "test-coverage" yield self.display("version") yield self.display("topology").replace("_", "-") yield from map(self.display, ("auth", "sasl", "ssl")) if self.settings.cse: yield "cse" @property def cse(self) -> bool: return bool(self.settings.cse) def post_commands(self) -> Iterable[Value]: if self.cse: yield func( "compile coverage", SASL="AUTO", SSL="OPENSSL", COMPILE_LIBMONGOCRYPT="ON", EXTRA_CONFIGURE_FLAGS='EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON"', ) else: yield func("compile coverage", SASL="AUTO", SSL="OPENSSL") yield func("fetch-det") yield func( "bootstrap-mongo-orchestration", MONGODB_VERSION=self.settings.version, TOPOLOGY=self.settings.topology, AUTH=self.display("auth"), SSL=self.display("ssl"), ) yield func("run-simple-http-server") extra = {"COVERAGE": "ON"} if self.cse: extra["CLIENT_SIDE_ENCRYPTION"] = "ON" yield func("run-mock-kms-servers") yield func("run-tests", AUTH=self.display("auth"), SSL=self.display("ssl"), **extra) yield func("upload coverage") yield func("update codecov.io") def do_is_valid_combination(self) -> bool: # Limit coverage tests to test-coverage-latest-replica-set-auth-sasl-openssl (+ cse). require(self.setting_eq("topology", "replica_set")) require(self.setting_eq("sasl", "sasl")) require(self.setting_eq("ssl", "openssl")) require(self.setting_eq("version", "latest")) require(self.settings.auth is True) if not self.cse: # No further requirements return True # CSE has extra requirements if self.settings.version != "latest": # We only work with 4.2 or newer for CSE require(parse_version(str(self.settings.version)) >= parse_version("4.2")) return True all_tasks = chain(all_tasks, CoverageTask.matrix()) class DNSTask(MatrixTask): axes = OD( [ ("auth", [False, True]), ("loadbalanced", [False, True]), ("ssl", ["openssl", "winssl", "darwinssl"]), ] ) name_prefix = "test-dns" def additional_dependencies(self) -> Iterable[DependencySpec]: yield self.build_task_name @property def build_task_name(self) -> str: sasl = "sspi" if self.settings.ssl == "winssl" else "sasl" return f'debug-compile-{sasl}-{self.display("ssl")}' def name_parts(self) -> Iterable[str]: yield "test-dns" if self.settings.auth: yield "auth" if self.settings.loadbalanced: yield "loadbalanced" yield self.display("ssl") def post_commands(self) -> Iterable[Value]: yield func("fetch-build", BUILD_NAME=self.build_task_name) yield func("fetch-det") if self.settings.loadbalanced: orchestration = func( "bootstrap-mongo-orchestration", TOPOLOGY="sharded_cluster", AUTH="auth" if self.settings.auth else "noauth", SSL="ssl", LOAD_BALANCER="on", ) else: orchestration = func( "bootstrap-mongo-orchestration", TOPOLOGY="replica_set", AUTH="auth" if self.settings.auth else "noauth", SSL="ssl", ) if self.settings.auth: vars = orchestration["vars"] assert isinstance(vars, MutableMapping) vars["AUTHSOURCE"] = "thisDB" yield orchestration dns = "on" if self.settings.loadbalanced: dns = "loadbalanced" yield func("fetch-det") yield func("start-load-balancer", MONGODB_URI="mongodb://localhost:27017,localhost:27018") elif self.settings.auth: dns = "dns-auth" yield func("run-tests", SSL="ssl", AUTH=self.display("auth"), DNS=dns) def do_is_valid_combination(self) -> bool: prohibit(bool(self.settings.loadbalanced) and bool(self.settings.auth)) # Load balancer tests only run on some Linux hosts in Evergreen until CDRIVER-4041 is resolved. prohibit(bool(self.settings.loadbalanced) and self.settings.ssl in ["darwinssl", "winssl"]) return True all_tasks = chain(all_tasks, DNSTask.matrix()) class CompressionTask(MatrixTask): axes = OD([("compression", ["zlib", "snappy", "zstd", "compression"])]) name_prefix = "test-latest-server" def additional_dependencies(self) -> Iterable[DependencySpec]: yield self.build_task_name @property def build_task_name(self) -> str: return f"debug-compile-{self._compressor_suffix()}" def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield "compression" yield "latest" yield from self._compressor_list() def name_parts(self) -> Iterable[str]: return [self.name_prefix, self._compressor_suffix()] def post_commands(self) -> Iterable[Value]: yield func("fetch-build", BUILD_NAME=self.build_task_name) yield func("fetch-det") if self.settings.compression == "compression": orc_file = "snappy-zlib-zstd" else: orc_file = self.settings.compression yield func("bootstrap-mongo-orchestration", AUTH="noauth", SSL="nossl", ORCHESTRATION_FILE=orc_file) yield func("run-simple-http-server") yield func("run-tests", AUTH="noauth", SSL="nossl", COMPRESSORS=",".join(self._compressor_list())) def _compressor_suffix(self): if self.settings.compression == "zlib": return "compression-zlib" elif self.settings.compression == "snappy": return "compression-snappy" elif self.settings.compression == "zstd": return "compression-zstd" else: return "compression" def _compressor_list(self): if self.settings.compression == "zlib": return ["zlib"] elif self.settings.compression == "snappy": return ["snappy"] elif self.settings.compression == "zstd": return ["zstd"] else: return ["snappy", "zlib", "zstd"] all_tasks = chain(all_tasks, CompressionTask.matrix()) class SpecialIntegrationTask(NamedTask): def __init__( self, task_name: str, main_dep: str = "debug-compile-sasl-openssl", uri: str | None = None, tags: Iterable[str] = (), version: str = "latest", topology: str = "server", ): self._main_dep = main_dep super().__init__(task_name, depends_on=[self._main_dep], tags=tags) self._uri = uri self._version = version self._topo = topology def pre_commands(self) -> Iterable[Value]: yield func("fetch-build", BUILD_NAME=self._main_dep) yield func("fetch-det") yield func("bootstrap-mongo-orchestration", MONGODB_VERSION=self._version, TOPOLOGY=self._topo) yield func("run-simple-http-server") yield func("run-tests", URI=self._uri) all_tasks = chain( all_tasks, [ # Verify that retryWrites=true is ignored with standalone. SpecialIntegrationTask("retry-true-latest-server", uri="mongodb://localhost/?retryWrites=true"), SpecialIntegrationTask("test-latest-server-hardened", "hardened-compile", tags=["hardened", "latest"]), ], ) class AuthTask(MatrixTask): axes = OD([("sasl", ["sasl", "sspi", False]), ("ssl", ["openssl", "darwinssl", "winssl"])]) name_prefix = "authentication-tests" def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield "authentication-tests" yield self.display("ssl") yield self.display("sasl") def additional_dependencies(self) -> Iterable[DependencySpec]: yield self.build_task_name def post_commands(self) -> Iterable[Value]: yield func("fetch-build", BUILD_NAME=self.build_task_name) yield func("prepare-kerberos") yield func("run auth tests") @property def build_task_name(self) -> str: return f'debug-compile-{self.display("sasl")}-{self.display("ssl")}' def name_parts(self) -> Iterable[str]: yield self.name_prefix yield self.display("ssl") if not self.settings.sasl: yield "nosasl" def do_is_valid_combination(self) -> bool: both_or_neither(self.settings.ssl == "winssl", self.settings.sasl == "sspi") if not self.settings.sasl: require(self.settings.ssl == "openssl") return True all_tasks = chain(all_tasks, AuthTask.matrix()) class PostCompileTask(NamedTask): def __init__(self, name: str, tags: Iterable[str], get_build: str, commands: Iterable[Value]): super().__init__(name, commands=commands, tags=tags, depends_on=[get_build]) self._dep = get_build def pre_commands(self) -> Iterable[Value]: yield func("fetch-build", BUILD_NAME=self._dep) all_tasks = chain( all_tasks, [ PostCompileTask( "test-mongohouse", tags=[], get_build="debug-compile-sasl-openssl", commands=[func("fetch-det"), func("build mongohouse"), func("run mongohouse"), func("test mongohouse")], ), NamedTask( "authentication-tests-asan-memcheck", tags=["authentication-tests", "asan"], commands=[ shell_mongoc( """ env SANITIZE=address DEBUG=ON SASL=AUTO SSL=OPENSSL EXTRA_CONFIGURE_FLAGS='-DENABLE_EXTRA_ALIGNMENT=OFF' bash .evergreen/scripts/compile.sh """, add_expansions_to_env=True, ), func("prepare-kerberos"), func("run auth tests", ASAN="on"), ], ) ], ) # Add API version tasks. for server_version in [ "7.0", "6.0", "5.0"]: all_tasks = chain( all_tasks, [ PostCompileTask( "test-versioned-api-" + server_version, tags=["versioned-api", f"{server_version}"], get_build="debug-compile-nosasl-openssl", commands=[ func("fetch-det"), func( "bootstrap-mongo-orchestration", TOPOLOGY="server", AUTH="auth", SSL="ssl", MONGODB_VERSION=server_version, REQUIRE_API_VERSION="true", ), func("run-simple-http-server"), func("run-tests", MONGODB_API_VERSION=1, AUTH="auth", SSL="ssl"), ], ), PostCompileTask( "test-versioned-api-accept-version-two-" + server_version, tags=["versioned-api", f"{server_version}"], get_build="debug-compile-nosasl-nossl", commands=[ func("fetch-det"), func( "bootstrap-mongo-orchestration", TOPOLOGY="server", AUTH="noauth", SSL="nossl", MONGODB_VERSION=server_version, ORCHESTRATION_FILE="versioned-api-testing", ), func("run-simple-http-server"), func("run-tests", MONGODB_API_VERSION=1, AUTH="noauth", SSL="nossl"), ], ) ] ) class SSLTask(Task): def __init__( self, version: str, patch: str, cflags: str = "", fips: bool = False, enable_ssl: str | Literal[False] = False, test_params: Mapping[str, Scalar] | None = None, ): full_version = version + patch + ("-fips" if fips else "") self.enable_ssl = enable_ssl script = "env" if cflags: script += f" CFLAGS={cflags}" script += " DEBUG=ON SASL=OFF" if enable_ssl is not False: script += " SSL=" + enable_ssl elif "libressl" in version: script += " SSL=LIBRESSL" else: script += " SSL=OPENSSL" script += " bash .evergreen/scripts/compile.sh" super(SSLTask, self).__init__( commands=[ func("install ssl", SSL=full_version), shell_mongoc(script, add_expansions_to_env=True), func("run auth tests", **(test_params or {})), func("upload-build"), ] ) self.version = version self.fips = fips @property def name(self): s = "build-and-run-authentication-tests-" + self.version if self.fips: return s + "-fips" if self.enable_ssl is not False: return s + "-" + str(self.enable_ssl).lower() return s all_tasks = chain( all_tasks, [ SSLTask( "openssl-1.0.1", "u", cflags="-Wno-redundant-decls", ), SSLTask("openssl-1.0.1", "u", cflags="-Wno-redundant-decls", fips=True), SSLTask( "openssl-1.0.2", "l", cflags="-Wno-redundant-decls", ), SSLTask("openssl-1.1.0", "l"), SSLTask("libressl-2.5", ".2", test_params=dict(require_tls12=True)), SSLTask("libressl-3.0", ".2", enable_ssl="AUTO", test_params=dict(require_tls12=True)), SSLTask("libressl-3.0", ".2", test_params=dict(require_tls12=True)), ], ) class IPTask(MatrixTask): axes = OD( [ ("client", ["ipv6", "ipv4", "localhost"]), ("server", ["ipv6", "ipv4"]), ] ) name_prefix = "test-latest" def additional_dependencies(self) -> Iterable[DependencySpec]: yield "debug-compile-nosasl-nossl" def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield from ("nossl", "nosasl", "server", "ipv4-ipv6", "latest") def post_commands(self) -> Iterable[Value]: return [ func("fetch-build", BUILD_NAME="debug-compile-nosasl-nossl"), func("fetch-det"), func("bootstrap-mongo-orchestration", IPV4_ONLY=self.on_off("server", "ipv4")), func("run-simple-http-server"), func( "run-tests", IPV4_ONLY=self.on_off("server", "ipv4"), URI={ "ipv6": "mongodb://[::1]/", "ipv4": "mongodb://127.0.0.1/", "localhost": "mongodb://localhost/", }[str(self.settings.client)], ), ] def name_parts(self) -> Iterable[str]: return ( self.name_prefix, f'server-{self.display("server")}', f'client-{self.display("client")}', "noauth", "nosasl", "nossl", ) def do_is_valid_combination(self) -> bool: # This would fail by design. if self.settings.server == "ipv4": prohibit(self.settings.client == "ipv6") # Default configuration is tested in other variants. if self.settings.server == "ipv6": prohibit(self.settings.client == "localhost") return True all_tasks = chain(all_tasks, IPTask.matrix()) aws_compile_task = NamedTask( "debug-compile-aws", commands=[ shell_mongoc( """ export distro_id='${distro_id}' # Required by find_cmake_latest. . .evergreen/scripts/find-cmake-latest.sh cmake_binary="$(find_cmake_latest)" # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$(pwd)" CCACHE_NOHASHDIR=1 # Compile test-awsauth. Disable unnecessary dependencies since test-awsauth is copied to a remote Ubuntu 20.04 ECS cluster for testing, which may not have all dependent libraries. export CC='${CC}' "$cmake_binary" -DENABLE_TRACING=ON -DENABLE_SASL=OFF -DENABLE_SNAPPY=OFF -DENABLE_ZSTD=OFF -DENABLE_CLIENT_SIDE_ENCRYPTION=OFF . "$cmake_binary" --build . --target test-awsauth """ ), func("upload-build"), ], ) all_tasks = chain(all_tasks, [aws_compile_task]) class AWSTestTask(MatrixTask): axes = OD( [ ("testcase", ["regular", "ec2", "ecs", "lambda", "assume_role", "assume_role_with_web_identity"]), ("version", ["latest", "7.0", "6.0", "5.0", "4.4"]), ] ) name_prefix = "test-aws-openssl" def additional_dependencies(self) -> Iterable[DependencySpec]: yield "debug-compile-aws" def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield f'{self.settings.version}' yield f'test-aws' def post_commands(self) -> Iterable[Value]: return [ func("fetch-build", BUILD_NAME="debug-compile-aws"), func("fetch-det"), func( "bootstrap-mongo-orchestration", AUTH="auth", ORCHESTRATION_FILE="auth-aws", MONGODB_VERSION=self.settings.version, TOPOLOGY="server", ), func("run aws tests", TESTCASE=str(self.settings.testcase).upper()), ] @property def name(self): return f"{self.name_prefix}-{self.settings.testcase}-{self.settings.version}" all_tasks = chain(all_tasks, AWSTestTask.matrix()) class OCSPTask(MatrixTask): axes = OD( [ ( "test", [ "test_1", "test_2", "test_3", "test_4", "soft_fail_test", "malicious_server_test_1", "malicious_server_test_2", "cache", ], ), ("delegate", ["delegate", "nodelegate"]), ("cert", ["rsa", "ecdsa"]), ("ssl", ["openssl", "openssl-1.0.1", "darwinssl", "winssl"]), ("version", ["latest", "7.0", "6.0", "5.0", "4.4"]), ] ) name_prefix = "test-ocsp" @property def build_task_name(self) -> str: return f'debug-compile-nosasl-{self.display("ssl")}' def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield f'ocsp-{self.display("ssl")}' def additional_dependencies(self) -> Iterable[DependencySpec]: yield self.build_task_name @property def name(self): return f"ocsp-{self.settings.ssl}-{self.test}-{self.settings.cert}-{self.settings.delegate}-{self.settings.version}" @property def test(self) -> str: return str(self.settings.test) def post_commands(self) -> Iterable[Value]: yield func("fetch-build", BUILD_NAME=self.build_task_name) yield func("fetch-det") stapling = "mustStaple" if self.test in ["test_3", "test_4", "soft_fail_test", "cache"]: stapling = "disableStapling" if self.test in ["malicious_server_test_1", "malicious_server_test_2"]: stapling = "mustStaple-disableStapling" orchestration_file = "%s-basic-tls-ocsp-%s" % (self.settings.cert, stapling) orchestration = func( "bootstrap-mongo-orchestration", MONGODB_VERSION=self.settings.version, TOPOLOGY="server", SSL="ssl", OCSP="on", ORCHESTRATION_FILE=orchestration_file, ) # The cache test expects a revoked response from an OCSP responder, exactly like TEST_4. test_column = "TEST_4" if self.test == "cache" else str(self.test).upper() use_delegate = "ON" if self.settings.delegate == "delegate" else "OFF" yield ( shell_mongoc( f""" TEST_COLUMN={test_column} CERT_TYPE={self.settings.cert} USE_DELEGATE={use_delegate} bash .evergreen/scripts/run-ocsp-responder.sh """ ) ) yield (orchestration) if self.build_task_name == "debug-compile-nosasl-openssl-1.0.1": # LD_LIBRARY_PATH is needed so the in-tree OpenSSL 1.0.1 is found at runtime if self.test == "cache": yield ( shell_mongoc( f""" LD_LIBRARY_PATH=$(pwd)/install-dir/lib CERT_TYPE={self.settings.cert} bash .evergreen/scripts/run-ocsp-cache-test.sh """ ) ) else: yield ( shell_mongoc( f""" LD_LIBRARY_PATH=$(pwd)/install-dir/lib TEST_COLUMN={self.test.upper()} CERT_TYPE={self.settings.cert} bash .evergreen/scripts/run-ocsp-test.sh """ ) ) else: if self.test == "cache": yield ( shell_mongoc( f""" CERT_TYPE={self.settings.cert} bash .evergreen/scripts/run-ocsp-cache-test.sh """ ) ) else: yield ( shell_mongoc( f""" TEST_COLUMN={self.test.upper()} CERT_TYPE={self.settings.cert} bash .evergreen/scripts/run-ocsp-test.sh """ ) ) def to_dict(self): task = super(MatrixTask, self).to_dict() # OCSP tests should run with a batchtime of 14 days. Avoid running OCSP # tests in patch builds by default (only in commit builds). task["patchable"] = False return task # Testing in OCSP has a lot of exceptions. def do_is_valid_combination(self) -> bool: if self.settings.ssl == "darwinssl": # Secure Transport quietly ignores a must-staple certificate with no stapled response. prohibit(self.test == "malicious_server_test_2") # ECDSA certs can't be loaded (in the PEM format they're stored) on Windows/macOS. Skip them. if self.settings.ssl == "darwinssl" or self.settings.ssl == "winssl": prohibit(self.settings.cert == "ecdsa") # OCSP stapling is not supported on macOS or Windows. if self.settings.ssl == "darwinssl" or self.settings.ssl == "winssl": prohibit(self.test in ["test_1", "test_2", "cache"]) if self.test == "soft_fail_test" or self.test == "malicious_server_test_2" or self.test == "cache": prohibit(self.settings.delegate == "delegate") return True all_tasks = chain(all_tasks, OCSPTask.matrix()) all_tasks = list(all_tasks) mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_lib/testazurekms.py000066400000000000000000000156341456567454500326350ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2022-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from typing import MutableSequence from evergreen_config_generator.functions import shell_exec, func from evergreen_config_generator.tasks import NamedTask from evergreen_config_generator.variants import Variant from evergreen_config_generator.taskgroups import TaskGroup def _create_tasks(): # passtask is expected to run on a remote Azure VM and succeed at obtaining credentials. passtask = NamedTask(task_name="testazurekms-task") passtask.commands = [ func("fetch-source"), shell_exec( r""" echo "Building test-azurekms ... begin" pushd mongoc ./.evergreen/scripts/compile-test-azurekms.sh popd echo "Building test-azurekms ... end" echo "Copying files ... begin" export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools mkdir testazurekms cp ./mongoc/src/libmongoc/test-azurekms ./mongoc/install/lib/libmongocrypt.* testazurekms tar czf testazurekms.tgz testazurekms/* AZUREKMS_SRC="testazurekms.tgz" \ AZUREKMS_DST="./" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/copy-file.sh echo "Copying files ... end" echo "Untarring file ... begin" AZUREKMS_CMD="tar xf testazurekms.tgz" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh echo "Untarring file ... end" """, test=False, add_expansions_to_env=True, ), shell_exec( r""" export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools AZUREKMS_CMD="LD_LIBRARY_PATH=./testazurekms MONGODB_URI='mongodb://localhost:27017' KEY_NAME='${testazurekms_keyname}' KEY_VAULT_ENDPOINT='${testazurekms_keyvaultendpoint}' ./testazurekms/test-azurekms" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh """ ), ] failtask = NamedTask(task_name="testazurekms-fail-task") failtask.commands = [ func("fetch-source"), shell_exec( r""" pushd mongoc ./.evergreen/scripts/compile-test-azurekms.sh popd """, test=False, add_expansions_to_env=True, ), shell_exec( r""" LD_LIBRARY_PATH=$PWD/install \ MONGODB_URI='mongodb://localhost:27017' \ KEY_NAME='${testazurekms_keyname}' \ KEY_VAULT_ENDPOINT='${testazurekms_keyvaultendpoint}' \ EXPECT_ERROR='Error from Azure IMDS server' \ ./mongoc/src/libmongoc/test-azurekms """ ), ] return [passtask, failtask] def _create_variant(): return Variant( name="testazurekms-variant", display_name="Azure KMS", # Azure Virtual Machine created is Debian 10. run_on="debian10-small", tasks=["testazurekms_task_group", "testazurekms-fail-task"], batchtime=20160, ) # Use a batchtime of 14 days as suggested by the CSFLE test README def _create_task_group(): task_group = TaskGroup(name="testazurekms_task_group") task_group.setup_group_can_fail_task = True task_group.setup_group_timeout_secs = 1800 # 30 minutes task_group.setup_group = [ func("fetch-det"), shell_exec( r""" DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools echo '${testazurekms_publickey}' > /tmp/testazurekms_publickey echo '${testazurekms_privatekey}' > /tmp/testazurekms_privatekey # Set 600 permissions on private key file. Otherwise ssh / scp may error with permissions "are too open". chmod 600 /tmp/testazurekms_privatekey export AZUREKMS_CLIENTID=${testazurekms_clientid} export AZUREKMS_TENANTID=${testazurekms_tenantid} export AZUREKMS_SECRET=${testazurekms_secret} export AZUREKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_PUBLICKEYPATH=/tmp/testazurekms_publickey export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey export AZUREKMS_SCOPE=${testazurekms_scope} export AZUREKMS_VMNAME_PREFIX=CDRIVER $DRIVERS_TOOLS/.evergreen/csfle/azurekms/create-and-setup-vm.sh """, test=False, ), # Load the AZUREKMS_VMNAME expansion. OD( [ ("command", "expansions.update"), ( "params", OD( [ ("file", "testazurekms-expansions.yml"), ] ), ), ] ), ] task_group.teardown_group = [ # Load expansions again. The setup task may have failed before running `expansions.update`. OD( [ ("command", "expansions.update"), ( "params", OD( [ ("file", "testazurekms-expansions.yml"), ] ), ), ] ), shell_exec( r""" DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} $DRIVERS_TOOLS/.evergreen/csfle/azurekms/delete-vm.sh """, test=False, ), ] task_group.tasks = ["testazurekms-task"] return task_group def testazurekms_generate( all_tasks: MutableSequence[NamedTask], all_variants: MutableSequence[Variant], all_task_groups: MutableSequence[TaskGroup], ): all_tasks.extend(_create_tasks()) all_variants.append(_create_variant()) all_task_groups.append(_create_task_group()) mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_lib/testgcpkms.py000066400000000000000000000132311456567454500322470ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2022 - present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0(the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http: // www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from typing import MutableSequence from evergreen_config_generator.functions import shell_exec, func from evergreen_config_generator.tasks import NamedTask from evergreen_config_generator.variants import Variant from evergreen_config_generator.taskgroups import TaskGroup def _create_tasks(): passtask = NamedTask( task_name="testgcpkms-task", commands=[ func("fetch-source"), shell_exec( r""" echo "Building test-gcpkms ... begin" pushd mongoc ./.evergreen/scripts/compile-test-gcpkms.sh popd echo "Building test-gcpkms ... end" echo "Copying files ... begin" export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools mkdir testgcpkms cp ./mongoc/src/libmongoc/test-gcpkms ./mongoc/install/lib/libmongocrypt.* testgcpkms tar czf testgcpkms.tgz testgcpkms/* GCPKMS_SRC="testgcpkms.tgz" GCPKMS_DST=$GCPKMS_INSTANCENAME: $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/copy-file.sh echo "Copying files ... end" echo "Untarring file ... begin" GCPKMS_CMD="tar xf testgcpkms.tgz" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh echo "Untarring file ... end" """, test=False, add_expansions_to_env=True, ), shell_exec( r""" export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools GCPKMS_CMD="LD_LIBRARY_PATH=./testgcpkms MONGODB_URI='mongodb://localhost:27017' ./testgcpkms/test-gcpkms" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh """ ), ], ) failtask = NamedTask( task_name="testgcpkms-fail-task", commands=[ shell_exec( r""" pushd mongoc ./.evergreen/scripts/compile-test-gcpkms.sh popd""", test=False, add_expansions_to_env=True, ), shell_exec( r""" export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} LD_LIBRARY_PATH=$(pwd)/install MONGODB_URI='mongodb://localhost:27017' EXPECT_ERROR='Failed to connect to: metadata.google.internal' ./mongoc/src/libmongoc/test-gcpkms""" ), ], ) return [passtask, failtask] def _create_variant(): return Variant( name="testgcpkms-variant", display_name="GCP KMS", # GCP Virtual Machine created is Debian 11. run_on="debian11-small", tasks=["testgcpkms_task_group", "testgcpkms-fail-task"], batchtime=20160, ) # Use a batchtime of 14 days as suggested by the CSFLE test README def _create_task_group(): task_group = TaskGroup(name="testgcpkms_task_group") task_group.setup_group_can_fail_task = True task_group.setup_group_timeout_secs = 1800 # 30 minutes task_group.setup_group = [ func("fetch-det"), # Create and set up a GCE instance using driver tools script shell_exec( r""" DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools echo '${testgcpkms_key_file}' > /tmp/testgcpkms_key_file.json export GCPKMS_KEYFILE=/tmp/testgcpkms_key_file.json export GCPKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS export GCPKMS_SERVICEACCOUNT="${testgcpkms_service_account}" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/create-and-setup-instance.sh""", test=False, ), # Load the GCPKMS_GCLOUD, GCPKMS_INSTANCE, GCPKMS_PROJECT, and GCPKMS_ZONE expansions. OD([("command", "expansions.update"), ("params", OD([("file", "testgcpkms-expansions.yml")]))]), ] task_group.teardown_group = [ shell_exec( r""" DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/delete-instance.sh""", test=False, ) ] task_group.tasks = ["testgcpkms-task"] return task_group def testgcpkms_generate( all_tasks: MutableSequence[NamedTask], all_variants: MutableSequence[Variant], all_task_groups: MutableSequence[TaskGroup], ): all_tasks.extend(_create_tasks()) all_variants.append(_create_variant()) all_task_groups.append(_create_task_group()) mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/evergreen_config_lib/variants.py000066400000000000000000000403761456567454500317240ustar00rootroot00000000000000# Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from evergreen_config_generator.variants import Variant mobile_flags = ( " -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY" " -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY" " -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER" " -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY" ) def days(n: int) -> int: "Calculate the number of minutes in the given number of days" return n * 24 * 60 all_variants = [ Variant( "abi-compliance-check", "ABI Compliance Check", ["ubuntu1804-small", "ubuntu1804-medium", "ubuntu1804-large"], ["abi-compliance-check"], ), Variant( "smoke", "Smoke Tests", "ubuntu2204-small", [ "make-docs", "kms-divergence-check", "release-compile", "debug-compile-no-counters", "compile-tracing", "link-with-cmake", "link-with-cmake-deprecated", "link-with-cmake-ssl", "link-with-cmake-ssl-deprecated", "link-with-cmake-snappy", "link-with-cmake-snappy-deprecated", OD([("name", "link-with-cmake-mac"), ("distros", ["macos-1100"])]), OD([("name", "link-with-cmake-mac-deprecated"), ("distros", ["macos-1100"])]), OD([("name", "link-with-cmake-windows"), ("distros", ["windows-vsCurrent-large"])]), OD([("name", "link-with-cmake-windows-ssl"), ("distros", ["windows-vsCurrent-large"])]), OD([("name", "link-with-cmake-windows-snappy"), ("distros", ["windows-vsCurrent-large"])]), OD([("name", "link-with-cmake-mingw"), ("distros", ["windows-vsCurrent-large"])]), OD([("name", "link-with-pkg-config"), ("distros", ["ubuntu1804-test"])]), OD([("name", "link-with-pkg-config-mac"), ("distros", ["macos-1100"])]), "link-with-pkg-config-ssl", "link-with-bson", OD([("name", "link-with-bson-windows"), ("distros", ["windows-vsCurrent-large"])]), OD([("name", "link-with-bson-mac"), ("distros", ["macos-1100"])]), OD([("name", "link-with-bson-mingw"), ("distros", ["windows-vsCurrent-large"])]), "check-headers", "install-uninstall-check", OD([("name", "install-uninstall-check-mingw"), ("distros", ["windows-vsCurrent-large"])]), OD([("name", "install-uninstall-check-msvc"), ("distros", ["windows-vsCurrent-large"])]), "debug-compile-with-warnings", OD([("name", "build-and-test-with-toolchain"), ("distros", ["debian10-small"])]), "install-libmongoc-after-libbson", ], { # Disable the MongoDB legacy shell download, which is not available in 5.0 for u22 "SKIP_LEGACY_SHELL": "1" }, tags=["pr-merge-gate"], ), Variant( "clang38", "clang 3.8 (Debian 9.2)", "debian92-test", ["release-compile", "debug-compile-nosasl-nossl", ".latest .nossl"], {"CC": "clang"}, ), Variant( "openssl", "OpenSSL / LibreSSL", "archlinux-build", [ "build-and-run-authentication-tests-openssl-1.0.1", "build-and-run-authentication-tests-openssl-1.0.2", "build-and-run-authentication-tests-openssl-1.1.0", "build-and-run-authentication-tests-openssl-1.0.1-fips", "build-and-run-authentication-tests-libressl-2.5", "build-and-run-authentication-tests-libressl-3.0-auto", "build-and-run-authentication-tests-libressl-3.0", ], {}, ), Variant( "clang37", "clang 3.7 (Archlinux)", "archlinux-test", [ "release-compile", "debug-compile-sasl-openssl", "debug-compile-nosasl-openssl", ".authentication-tests .openssl", ], {"CC": "clang"}, ), Variant( "clang60-i686", "clang 6.0 (i686) (Ubuntu 18.04)", "ubuntu1804-test", [ "release-compile", "debug-compile-nosasl-nossl", "debug-compile-no-align", ".debug-compile !.sspi .nossl .nosasl", ".latest .nossl .nosasl", ], {"CC": "clang", "MARCH": "i686"}, ), Variant( "clang38-i686", "clang 3.8 (i686) (Ubuntu 16.04)", "ubuntu1604-test", ["release-compile", "debug-compile-no-align"], {"CC": "clang", "MARCH": "i686"}, ), Variant( "clang38ubuntu", "clang 3.8 (Ubuntu 16.04)", "ubuntu1604-test", [ ".compression !.zstd", "release-compile", "debug-compile-sasl-openssl", "debug-compile-nosasl-openssl", "debug-compile-no-align", ".authentication-tests .openssl", ], {"CC": "clang"}, ), Variant( "gcc82rhel", "GCC 8.2 (RHEL 8.0)", "rhel80-test", [ ".hardened", ".compression !.snappy !.zstd", "release-compile", "debug-compile-nosasl-nossl", "debug-compile-nosasl-openssl", "debug-compile-sasl-openssl", ".authentication-tests .openssl", ".latest .nossl", ], {"CC": "gcc"}, ), Variant( "gcc48rhel", "GCC 4.8 (RHEL 7.0)", "rhel70", # Skip client-side-encryption tests on RHEL 7.0 due to OCSP errors # with Azure. See CDRIVER-3620 and CDRIVER-3814. [ ".hardened", ".compression !.snappy", "release-compile", "debug-compile-nosasl-nossl", "debug-compile-sasl-openssl", "debug-compile-nosasl-openssl", ".authentication-tests .openssl", ".latest .nossl", ], {"CC": "gcc"}, ), Variant( "gcc63", "GCC 6.3 (Debian 9.2)", "debian92-test", ["release-compile", "debug-compile-nosasl-nossl", ".latest .nossl"], {"CC": "gcc"}, ), Variant( "gcc83", "GCC 8.3 (Debian 10.0)", "debian10-test", ["release-compile", "debug-compile-nosasl-nossl", ".latest .nossl"], {"CC": "gcc"}, ), Variant( "gcc102", "GCC 10.2 (Debian 11.0)", "debian11-large", ["release-compile", "debug-compile-nosasl-nossl", ".latest .nossl"], {"CC": "gcc"}, ), Variant( "gcc94", "GCC 9.4 (Ubuntu 20.04)", "ubuntu2004-large", ["release-compile", "debug-compile-nosasl-nossl", ".latest .nossl"], {"CC": "gcc"}, ), Variant( "gcc75-i686", "GCC 7.5 (i686) (Ubuntu 18.04)", "ubuntu1804-test", ["release-compile", "debug-compile-nosasl-nossl", "debug-compile-no-align", ".latest .nossl .nosasl"], {"CC": "gcc", "MARCH": "i686"}, ), Variant( "gcc75", "GCC 7.5 (Ubuntu 18.04)", "ubuntu1804-test", [ ".compression !.zstd", "debug-compile-nosrv", "release-compile", "debug-compile-nosasl-nossl", "debug-compile-no-align", "debug-compile-sasl-openssl", "debug-compile-nosasl-openssl", ".authentication-tests .openssl", ".authentication-tests .asan", ".test-coverage", ".latest .nossl", "retry-true-latest-server", "test-dns-openssl", "test-dns-auth-openssl", "test-dns-loadbalanced-openssl", ], {"CC": "gcc"}, ), Variant( "gcc54", "GCC 5.4 (Ubuntu 16.04)", "ubuntu1604-test", [".compression !.zstd", "debug-compile-nosrv", "release-compile", "debug-compile-no-align"], {"CC": "gcc"}, ), Variant( "darwin", "*Darwin, macOS (Apple LLVM)", "macos-1100", [ ".compression !.snappy", "release-compile", "debug-compile-nosasl-nossl", "debug-compile-rdtscp", "debug-compile-no-align", "debug-compile-nosrv", "debug-compile-sasl-darwinssl", "debug-compile-nosasl-nossl", ".authentication-tests .darwinssl", ".latest .nossl", "test-dns-darwinssl", "test-dns-auth-darwinssl", "debug-compile-lto", "debug-compile-lto-thin", "debug-compile-aws", "test-aws-openssl-regular-4.4", "test-aws-openssl-regular-latest", ], {"CC": "clang"}, ), Variant( "windows-2017-32", "Windows (i686) (VS 2017)", "windows-vsCurrent-large", ["debug-compile-nosasl-nossl", ".latest .nossl .nosasl"], {"CC": "Visual Studio 15 2017"}, ), Variant( "windows-2017", "Windows (VS 2017)", "windows-vsCurrent-large", [ "debug-compile-nosasl-nossl", "debug-compile-nosasl-openssl", "debug-compile-sspi-winssl", ".latest .nossl", ".nosasl .latest .nossl", "test-dns-winssl", "test-dns-auth-winssl", "debug-compile-aws", "test-aws-openssl-regular-4.4", "test-aws-openssl-regular-latest", # Authentication tests with OpenSSL on Windows are only run on the vs2017 variant. # Older vs variants fail to verify certificates against Atlas tests. ".authentication-tests .openssl !.sasl", ".authentication-tests .winssl", ], {"CC": "Visual Studio 15 2017 Win64"}, ), Variant( "windows-2015", "Windows (VS 2015)", "windows-64-vs2015-compile", [ ".compression !.snappy !.zstd !.latest", "release-compile", "debug-compile-sspi-winssl", "debug-compile-no-align", "debug-compile-nosrv", ".authentication-tests .winssl", ], {"CC": "Visual Studio 14 2015 Win64"}, ), Variant( "windows-2015-32", "Windows (i686) (VS 2015)", "windows-64-vs2015-compile", [ ".compression !.snappy !.zstd !.latest", "release-compile", "debug-compile-sspi-winssl", "debug-compile-no-align", ".authentication-tests .winssl", ], {"CC": "Visual Studio 14 2015"}, ), Variant( "windows-2013", "Windows (VS 2013)", "windows-64-vs2013-compile", [ ".compression !.snappy !.zstd !.latest", "release-compile", "debug-compile-sspi-winssl", ".authentication-tests .winssl", ], {"CC": "Visual Studio 12 2013 Win64"}, ), Variant( "windows-2013-32", "Windows (i686) (VS 2013)", "windows-64-vs2013-compile", ["release-compile", "debug-compile-rdtscp", "debug-compile-sspi-winssl", ".authentication-tests .winssl"], {"CC": "Visual Studio 12 2013"}, ), Variant( "mingw-windows2016", "MinGW-W64 (Windows Server 2016)", "windows-vsCurrent-large", ["debug-compile-nosasl-nossl", ".latest .nossl .nosasl .server"], {"CC": "mingw"}, ), Variant("mingw", "MinGW-W64", "windows-vsCurrent-large", ["debug-compile-no-align"], {"CC": "mingw"}), Variant( "power8-rhel81", "Power8 (ppc64le) (RHEL 8.1)", "rhel81-power8-test", [ "release-compile", "debug-compile-nosasl-nossl", "debug-compile-sasl-openssl", ".latest .nossl", "test-dns-openssl", ], {"CC": "gcc"}, batchtime=days(1), ), Variant( "arm-ubuntu1804", "*ARM (aarch64) (Ubuntu 18.04)", "ubuntu1804-arm64-large", [ ".compression !.snappy !.zstd", "debug-compile-no-align", "release-compile", "debug-compile-nosasl-nossl", "debug-compile-nosasl-openssl", "debug-compile-sasl-openssl", ".authentication-tests .openssl", ".latest .nossl", "test-dns-openssl", ], {"CC": "gcc"}, batchtime=days(1), ), Variant( "arm-ubuntu1604", "*ARM (aarch64) (Ubuntu 16.04)", "ubuntu1604-arm64-large", [".compression !.snappy !.zstd", "debug-compile-no-align", "release-compile"], {"CC": "gcc"}, batchtime=days(1), ), Variant( "zseries-rhel83", "*zSeries", "rhel83-zseries-small", [ "release-compile", # '.compression', --> TODO: waiting on ticket CDRIVER-3258 "debug-compile-no-align", "debug-compile-nosasl-nossl", "debug-compile-nosasl-openssl", "debug-compile-sasl-openssl", ".authentication-tests .openssl", ".latest .nossl", ], {"CC": "gcc"}, batchtime=days(1), ), Variant( "clang60ubuntu", "clang 6.0 (Ubuntu 18.04)", "ubuntu1804-test", [ "debug-compile-sasl-openssl-static", ".authentication-tests .asan", ], {"CC": "clang"}, ), # Run AWS tests for MongoDB 4.4 and 5.0 on Ubuntu 20.04. AWS setup scripts expect Ubuntu 20.04+. MongoDB 4.4 and 5.0 are not available on 22.04. Variant( "aws-ubuntu2004", "AWS Tests (Ubuntu 20.04)", "ubuntu2004-small", [ "debug-compile-aws", ".test-aws .4.4", ".test-aws .5.0", ], {"CC": "clang"}, ), Variant( "aws-ubuntu2204", "AWS Tests (Ubuntu 22.04)", "ubuntu2004-small", [ "debug-compile-aws", ".test-aws .6.0", ".test-aws .7.0", ".test-aws .latest", ], {"CC": "clang"}, ), Variant("mongohouse", "Mongohouse Test", "ubuntu2204-small", ["debug-compile-sasl-openssl", "test-mongohouse"], {}), Variant( "ocsp", "OCSP tests", "ubuntu2004-small", [ OD([("name", "debug-compile-nosasl-openssl")]), OD([("name", "debug-compile-nosasl-openssl-static")]), OD([("name", "debug-compile-nosasl-darwinssl"), ("distros", ["macos-1100"])]), OD([("name", "debug-compile-nosasl-winssl"), ("distros", ["windows-vsCurrent-large"])]), OD([("name", ".ocsp-openssl")]), OD([("name", ".ocsp-darwinssl"), ("distros", ["macos-1100"])]), OD([("name", ".ocsp-winssl"), ("distros", ["windows-vsCurrent-large"])]), OD([("name", "debug-compile-nosasl-openssl-1.0.1")]), OD([("name", ".ocsp-openssl-1.0.1")]), ], {}, batchtime=days(7), ), Variant( "packaging", "Linux Distro Packaging", "ubuntu1804-test", [ "debian-package-build", OD([("name", "rpm-package-build"), ("distros", ["rhel90-arm64-small"])]), ], {}, tags=["pr-merge-gate"], ), Variant( "versioned-api-ubuntu1804", "Versioned API Tests (Ubuntu 18.04)", "ubuntu1804-test", [ "debug-compile-nosasl-openssl", "debug-compile-nosasl-nossl", ".versioned-api .5.0", ".versioned-api .6.0", ], {}, ), # Test 7.0+ with Ubuntu 20.04+ since MongoDB 7.0 no longer ships binaries for Ubuntu 18.04. Variant( "versioned-api-ubuntu2004", "Versioned API Tests (Ubuntu 20.04)", "ubuntu2004-test", [ "debug-compile-nosasl-openssl", "debug-compile-nosasl-nossl", ".versioned-api .7.0", ], {}, ), ] mongo-c-driver-1.26.0/.evergreen/legacy_config_generator/generate-evergreen-config.py000066400000000000000000000035121456567454500307440ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Generate C Driver's config.yml for Evergreen testing. We find that generating configuration from Python data structures is more legible than Evergreen's matrix syntax or a handwritten file. Requires the evergreen_config_generator package. """ from collections import OrderedDict as OD from os.path import dirname, join as joinpath, normpath from evergreen_config_generator import generate from evergreen_config_lib.functions import all_functions from evergreen_config_lib.tasks import all_tasks from evergreen_config_lib.variants import all_variants from evergreen_config_lib.taskgroups import all_task_groups from evergreen_config_lib.testgcpkms import testgcpkms_generate from evergreen_config_lib.testazurekms import testazurekms_generate task_groups = list(all_task_groups) testazurekms_generate(all_tasks, all_variants, task_groups) testgcpkms_generate(all_tasks, all_variants, task_groups) config = OD( [ ("functions", all_functions), ("tasks", all_tasks), ("task_groups", task_groups), ("buildvariants", all_variants), ] ) this_dir = dirname(__file__) generated_configs_dir = normpath(joinpath(this_dir, "../generated_configs")) generate(config, joinpath(generated_configs_dir, "legacy-config.yml")) mongo-c-driver-1.26.0/.evergreen/ocsp/000077500000000000000000000000001456567454500174615ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/ocsp/README.md000066400000000000000000000031461456567454500207440ustar00rootroot00000000000000# Generating Test Certificates The test certificates here were generating using a fork of the server team's [`mkcert.py`](https://github.com/mongodb/mongo/blob/master/jstests/ssl/x509/mkcert.py) tool. In order to generate a fresh set of certificates, clone this branch of a fork of the [`mongo` repository](https://github.com/vincentkam/mongo/tree/mkcert-ecdsa) and run the following command from the root of the `mongo` repository: `python3 jstests/ssl/x509/mkcert.py --config ../drivers-evergreen-tools/.evergreen/ocsp/certs.yml` Passing a certificate ID as the final parameter will limit certificate generation to that certificate and all its leaves. Note: if regenerating ECDSA leaf certificates, ``ecsda/ca.pem`` will need to be temporarily renamed back to ``ecdsa-ca-ocsp.pem``. The ECDSA certificates will be output into the folder specified by the `global.output_path` option in the `certs.yml` file, which defaults to `ecsda` directory contained in this directory. The RSA certificate definitions override this value on a per certificate basis and are output into the `rsa` directory. The default configuration also assumes that the `mongo` repository and the `driver-evergreen-tools` repository have the same parent directory. After generating the RSA root certificate, one must manually split the `rsa/ca.pem` file, which contains both the private key and the public certificate, into two files. `rsa/ca.crt` should contain the public certificate, and `ras/ca.key` should contain the private certificate. When generating ECDSA certificates, one must normalize the ECDSA certificate names by running `ecdsa/rename.sh`. mongo-c-driver-1.26.0/.evergreen/ocsp/README.txt000066400000000000000000000000641456567454500211570ustar00rootroot00000000000000Copied from drivers-evergreen-tools/.evergreen/ocsp.mongo-c-driver-1.26.0/.evergreen/ocsp/certs.yml000066400000000000000000000060231456567454500213250ustar00rootroot00000000000000 global: # All subject names will have these elements automatically, # unless `explicit_subject: true` is specified. output_path: '../drivers-evergreen-tools/.evergreen/ocsp/ecdsa/' # See README.md if customizing this path Subject: C: 'US' ST: 'New York' L: 'New York City' O: 'MongoDB' OU: 'Kernel' certs: ### # OCSP Tree ### - name: 'ca.pem' description: >- Primary Root Certificate Authority Most Certificates are issued by this CA. Subject: {CN: 'Kernel Test CA'} Issuer: self include_header: false output_path: '../drivers-evergreen-tools/.evergreen/ocsp/rsa' extensions: basicConstraints: critical: true CA: true - name: 'server.pem' description: >- Certificate with OCSP for the mongodb server. Subject: CN: 'localhost' C: US ST: NY L: OCSP-1 Issuer: 'ca.pem' include_header: false output_path: '../drivers-evergreen-tools/.evergreen/ocsp/rsa' extensions: basicConstraints: {CA: false} subjectAltName: DNS: localhost IP: 127.0.0.1 authorityInfoAccess: 'OCSP;URI:http://localhost:9001/power/level,OCSP;URI:http://localhost:8100/status' subjectKeyIdentifier: hash keyUsage: [digitalSignature, keyEncipherment] extendedKeyUsage: [serverAuth, clientAuth] - name: 'server-mustStaple.pem' description: >- Certficiate with Must Staple OCSP for the mongodb server. Subject: CN: 'localhost' C: US ST: NY L: OCSP-1 Issuer: 'ca.pem' include_header: false output_path: '../drivers-evergreen-tools/.evergreen/ocsp/rsa' extensions: basicConstraints: {CA: false} subjectAltName: DNS: localhost IP: 127.0.0.1 authorityInfoAccess: 'OCSP;URI:http://localhost:9001/power/level,OCSP;URI:http://localhost:8100/status' mustStaple: true subjectKeyIdentifier: hash keyUsage: [digitalSignature, keyEncipherment] extendedKeyUsage: [serverAuth, clientAuth] - name: 'ocsp-responder.crt' description: Certificate and key for the OCSP responder Subject: CN: 'localhost' C: US ST: NY L: OCSP-3 Issuer: 'ca.pem' include_header: false keyfile: 'ocsp-responder.key' output_path: '../drivers-evergreen-tools/.evergreen/ocsp/rsa' extensions: basicConstraints: {CA: false} keyUsage: [nonRepudiation, digitalSignature, keyEncipherment] extendedKeyUsage: [OCSPSigning] #noCheck: true ### # ECDSA tree ### # These are all special cases handled internally by mkcert.py # Do NOT change the names - name: 'ecdsa-ca-ocsp.pem' description: Root of ECDSA tree for OCSP testing Issuer: self tags: [ecdsa] - name: 'ecdsa-server-ocsp.pem' description: ECDSA server certificate w/OCSP Issuer: 'ecdsa-ca-ocsp.pem' tags: [ecdsa, ocsp] - name: 'ecdsa-server-ocsp-mustStaple.pem' description: ECDSA server certificate w/OCSP + must-staple Issuer: 'ecdsa-ca-ocsp.pem' tags: [ecdsa, ocsp, must-staple] - name: 'ecdsa-ocsp-responder.crt' description: ECDSA certificate and key for OCSP responder Issuer: 'ecdsa-ca-ocsp.pem' tags: [ecdsa, ocsp, responder ] mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/000077500000000000000000000000001456567454500205405ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/ca.crt000066400000000000000000000013451456567454500216400ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIB9jCCAZygAwIBAgIERIhZ3jAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzE3MTk0NjU5WhcNNDAwMzEyMTk0NjU5WjB6MQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UE AwwUS2VybmVsIFRlc3QgRVNDREEgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC AAT1rsrbhlZEQAubaPkS23tOfSEdWNd+u7N5kV4nxKQDNxPcScnSGrb41tBEINdG LQ/SopWZx9O8UJSrh8sqaV1AoxAwDjAMBgNVHRMEBTADAQH/MAoGCCqGSM49BAMC A0gAMEUCIDEvg1FnzNQNnLDxyOthbOqpX58A0YfLjgGb8xAvvdr4AiEAtvF2jMt6 /o4HVXXKdohjBJbETbr7XILEvnZ4Zt7QNl8= -----END CERTIFICATE----- mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/ca.key000066400000000000000000000003611456567454500216350ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMzE6ziHkSWt+sE2O RMFZ9wqjOg88cWTuMMYrKXXL1UWhRANCAAT1rsrbhlZEQAubaPkS23tOfSEdWNd+ u7N5kV4nxKQDNxPcScnSGrb41tBEINdGLQ/SopWZx9O8UJSrh8sqaV1A -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/ca.pem000066400000000000000000000017261456567454500216340ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIB9jCCAZygAwIBAgIERIhZ3jAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzE3MTk0NjU5WhcNNDAwMzEyMTk0NjU5WjB6MQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UE AwwUS2VybmVsIFRlc3QgRVNDREEgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC AAT1rsrbhlZEQAubaPkS23tOfSEdWNd+u7N5kV4nxKQDNxPcScnSGrb41tBEINdG LQ/SopWZx9O8UJSrh8sqaV1AoxAwDjAMBgNVHRMEBTADAQH/MAoGCCqGSM49BAMC A0gAMEUCIDEvg1FnzNQNnLDxyOthbOqpX58A0YfLjgGb8xAvvdr4AiEAtvF2jMt6 /o4HVXXKdohjBJbETbr7XILEvnZ4Zt7QNl8= -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMzE6ziHkSWt+sE2O RMFZ9wqjOg88cWTuMMYrKXXL1UWhRANCAAT1rsrbhlZEQAubaPkS23tOfSEdWNd+ u7N5kV4nxKQDNxPcScnSGrb41tBEINdGLQ/SopWZx9O8UJSrh8sqaV1A -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/mock-delegate-revoked.sh000077500000000000000000000003021456567454500252300ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ocsp-responder.crt \ --ocsp_responder_key ocsp-responder.key \ -p 8100 \ -v \ --fault revoked mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/mock-delegate-valid.sh000077500000000000000000000002551456567454500246770ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ocsp-responder.crt \ --ocsp_responder_key ocsp-responder.key \ -p 8100 \ -v mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/mock-revoked.sh000077500000000000000000000003161456567454500234650ustar00rootroot00000000000000#!/usr/bin/env sh # Use the CA as the OCSP responder python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ca.crt \ --ocsp_responder_key ca.key \ -p 8100 \ -v \ --fault revoked mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/mock-valid.sh000077500000000000000000000002251456567454500231240ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ca.crt \ --ocsp_responder_key ca.key \ -p 8100 \ -v mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/ocsp-responder.crt000066400000000000000000000015471456567454500242240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICVTCCAfygAwIBAgIEfpRhITAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzE3MTk0NzAwWhcNNDAwMzEyMTk0NzAwWjBsMQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEPMA0GA1UE AwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERca9Bv0PDLkCULyx axwx8nyPqonFF88MQiZpY7wK7atBfWkpZ9B/ukq5p+xVDXxS49huEIQUWOZ5xosF frma96N+MHwwCQYDVR0TBAIwADAaBgNVHREEEzARgglsb2NhbGhvc3SHBH8AAAEw HQYDVR0OBBYEFNQUc8MKrQDR4wAFZZ2o9PNLAiUHMAsGA1UdDwQEAwIF4DAnBgNV HSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMJMAoGCCqGSM49BAMC A0cAMEQCIBQs56OofXC3Io6DjP4ccgpkX8cLHpMRb3jfZ6MxulniAiBVLoXo8K23 YmpwoWKLFBKBdtGU+WDdD01Mb8X4iQ1gYg== -----END CERTIFICATE----- mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/ocsp-responder.key000066400000000000000000000003611456567454500242150ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgxxFxGTsPETczP0SW 69vnqYXZIgk+qG61j6JKElHa6duhRANCAARFxr0G/Q8MuQJQvLFrHDHyfI+qicUX zwxCJmljvArtq0F9aSln0H+6Srmn7FUNfFLj2G4QhBRY5nnGiwV+uZr3 -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/rename.sh000077500000000000000000000010301456567454500223400ustar00rootroot00000000000000#!/usr/bin/env bash [ ! -f ecdsa-ca-ocsp.pem ] || mv ecdsa-ca-ocsp.pem ca.pem [ ! -f ecdsa-ca-ocsp.crt ] || mv ecdsa-ca-ocsp.crt ca.crt [ ! -f ecdsa-ca-ocsp.key ] || mv ecdsa-ca-ocsp.key ca.key [ ! -f ecdsa-server-ocsp.pem ] || mv ecdsa-server-ocsp.pem server.pem [ ! -f ecdsa-server-ocsp-mustStaple.pem ] || mv ecdsa-server-ocsp-mustStaple.pem server-mustStaple.pem [ ! -f ecdsa-ocsp-responder.crt ] || mv ecdsa-ocsp-responder.crt ocsp-responder.crt [ ! -f ecdsa-ocsp-responder.key ] || mv ecdsa-ocsp-responder.key ocsp-responder.key mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/server-mustStaple.pem000066400000000000000000000023661456567454500247170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICyjCCAnCgAwIBAgIEA54uVTAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzI2MTU1NzU1WhcNNDAwMzIxMTU1NzU1WjBsMQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEPMA0GA1UE AwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJjAN/Hd2R/RRBoAu YouPhTbS/y2DiD47YQaUu1TlnrvABcvIgkMKYfbeNIhBfu44KzF2sKsmKrG6T6rs NdJ3pqOB8TCB7jAJBgNVHRMEAjAAMBoGA1UdEQQTMBGCCWxvY2FsaG9zdIcEfwAA ATAdBgNVHQ4EFgQUvHVMhH4zuedQN+9sQJ8LN7jvy3owCwYDVR0PBAQDAgWgMB0G A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBnBggrBgEFBQcBAQRbMFkwLQYI KwYBBQUHMAGGIWh0dHA6Ly9sb2NhbGhvc3Q6OTAwMS9wb3dlci9sZXZlbDAoBggr BgEFBQcwAYYcaHR0cDovL2xvY2FsaG9zdDo4MTAwL3N0YXR1czARBggrBgEFBQcB GAQFMAMCAQUwCgYIKoZIzj0EAwIDSAAwRQIgDiL8zqWkCR5Rc/YoAgV81qryUMrK BQoP7fb1M0KKarECIQDPa5q1pFu+5UZ8gn7CP4/9xDcBiG6tQYK5N0FHAZXzEg== -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg1IHezsqNUk0tfGOS E2RcM7R00ue1/E8/pBBUGSt7RW2hRANCAAQmMA38d3ZH9FEGgC5ii4+FNtL/LYOI PjthBpS7VOWeu8AFy8iCQwph9t40iEF+7jgrMXawqyYqsbpPquw10nem -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/ocsp/ecdsa/server.pem000066400000000000000000000023321456567454500225510ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICtzCCAl2gAwIBAgIEP6OYOTAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzI2MTU1ODA2WhcNNDAwMzIxMTU1ODA2WjBsMQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEPMA0GA1UE AwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEK4FR+soHPeGhF5c+ bPBX9/+gm+RimTqlXQAkHQHopLETOVexyt0eAVJe/euPAdKx3JvQ2fx2YOaBZK2U D98UoKOB3jCB2zAJBgNVHRMEAjAAMBoGA1UdEQQTMBGCCWxvY2FsaG9zdIcEfwAA ATAdBgNVHQ4EFgQU2JCna5G/Yd+Hd9hkAoWXxSjQ7acwCwYDVR0PBAQDAgWgMB0G A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBnBggrBgEFBQcBAQRbMFkwLQYI KwYBBQUHMAGGIWh0dHA6Ly9sb2NhbGhvc3Q6OTAwMS9wb3dlci9sZXZlbDAoBggr BgEFBQcwAYYcaHR0cDovL2xvY2FsaG9zdDo4MTAwL3N0YXR1czAKBggqhkjOPQQD AgNIADBFAiEA3F6MCGLS+gBDMl3+GTAVxYYuxLbhW92CQLwh/FbDozYCIHQzJ2G/ ht6PGW9nKueW0yDfppBVlxBmlKody9ugpcpO -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgp33qfUjflX1C7ROa e5F/RNyIhLE9hnxg4eFQQTqdxUqhRANCAAQrgVH6ygc94aEXlz5s8Ff3/6Cb5GKZ OqVdACQdAeiksRM5V7HK3R4BUl79648B0rHcm9DZ/HZg5oFkrZQP3xSg -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/ocsp/mock_ocsp_responder.py000066400000000000000000000561361456567454500241040ustar00rootroot00000000000000# # This file has been modified in 2019 by MongoDB Inc. # # OCSPBuilder is derived from https://github.com/wbond/ocspbuilder # OCSPResponder is derived from https://github.com/threema-ch/ocspresponder # Copyright (c) 2015-2018 Will Bond # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # Copyright 2016 Threema GmbH # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from __future__ import unicode_literals, division, absolute_import, print_function import logging import base64 import inspect import re import enum import sys import textwrap from datetime import datetime, timezone, timedelta from typing import Callable, Tuple, Optional from asn1crypto import x509, keys, core, ocsp from asn1crypto.ocsp import OCSPRequest, OCSPResponse from oscrypto import asymmetric from flask import Flask, request, Response __version__ = '0.10.2' __version_info__ = (0, 10, 2) logger = logging.getLogger(__name__) if sys.version_info < (3,): byte_cls = str else: byte_cls = bytes def _pretty_message(string, *params): """ Takes a multi-line string and does the following: - dedents - converts newlines with text before and after into a single line - strips leading and trailing whitespace :param string: The string to format :param *params: Params to interpolate into the string :return: The formatted string """ output = textwrap.dedent(string) # Unwrap lines, taking into account bulleted lists, ordered lists and # underlines consisting of = signs if output.find('\n') != -1: output = re.sub('(?<=\\S)\n(?=[^ \n\t\\d\\*\\-=])', ' ', output) if params: output = output % params output = output.strip() return output def _type_name(value): """ :param value: A value to get the object name of :return: A unicode string of the object name """ if inspect.isclass(value): cls = value else: cls = value.__class__ if cls.__module__ in set(['builtins', '__builtin__']): return cls.__name__ return '%s.%s' % (cls.__module__, cls.__name__) def _writer(func): """ Decorator for a custom writer, but a default reader """ name = func.__name__ return property(fget=lambda self: getattr(self, '_%s' % name), fset=func) class OCSPResponseBuilder(object): _response_status = None _certificate = None _certificate_status = None _revocation_date = None _certificate_issuer = None _hash_algo = None _key_hash_algo = None _nonce = None _this_update = None _next_update = None _response_data_extensions = None _single_response_extensions = None def __init__(self, response_status, certificate_status_list=[], revocation_date=None): """ Unless changed, responses will use SHA-256 for the signature, and will be valid from the moment created for one week. :param response_status: A unicode string of OCSP response type: - "successful" - when the response includes information about the certificate - "malformed_request" - when the request could not be understood - "internal_error" - when an internal error occured with the OCSP responder - "try_later" - when the OCSP responder is temporarily unavailable - "sign_required" - when the OCSP request must be signed - "unauthorized" - when the responder is not the correct responder for the certificate :param certificate_list: A list of tuples with certificate serial number and certificate status objects. certificate_status: A unicode string of the status of the certificate. Only required if the response_status is "successful". - "good" - when the certificate is in good standing - "revoked" - when the certificate is revoked without a reason code - "key_compromise" - when a private key is compromised - "ca_compromise" - when the CA issuing the certificate is compromised - "affiliation_changed" - when the certificate subject name changed - "superseded" - when the certificate was replaced with a new one - "cessation_of_operation" - when the certificate is no longer needed - "certificate_hold" - when the certificate is temporarily invalid - "remove_from_crl" - only delta CRLs - when temporary hold is removed - "privilege_withdrawn" - one of the usages for a certificate was removed - "unknown" - the responder doesn't know about the certificate being requested :param revocation_date: A datetime.datetime object of when the certificate was revoked, if the response_status is "successful" and the certificate status is not "good" or "unknown". """ self._response_status = response_status self._certificate_status_list = certificate_status_list self._revocation_date = revocation_date self._key_hash_algo = 'sha1' self._hash_algo = 'sha256' self._response_data_extensions = {} self._single_response_extensions = {} @_writer def nonce(self, value): """ The nonce that was provided during the request. """ if not isinstance(value, byte_cls): raise TypeError(_pretty_message( ''' nonce must be a byte string, not %s ''', _type_name(value) )) self._nonce = value @_writer def certificate_issuer(self, value): """ An asn1crypto.x509.Certificate object of the issuer of the certificate. This should only be set if the OCSP responder is not the issuer of the certificate, but instead a special certificate only for OCSP responses. """ if value is not None: is_oscrypto = isinstance(value, asymmetric.Certificate) if not is_oscrypto and not isinstance(value, x509.Certificate): raise TypeError(_pretty_message( ''' certificate_issuer must be an instance of asn1crypto.x509.Certificate or oscrypto.asymmetric.Certificate, not %s ''', _type_name(value) )) if is_oscrypto: value = value.asn1 self._certificate_issuer = value @_writer def next_update(self, value): """ A datetime.datetime object of when the response may next change. This should only be set if responses are cached. If responses are generated fresh on every request, this should not be set. """ if not isinstance(value, datetime): raise TypeError(_pretty_message( ''' next_update must be an instance of datetime.datetime, not %s ''', _type_name(value) )) self._next_update = value def build(self, responder_private_key=None, responder_certificate=None): """ Validates the request information, constructs the ASN.1 structure and signs it. The responder_private_key and responder_certificate parameters are onlystr required if the response_status is "successful". :param responder_private_key: An asn1crypto.keys.PrivateKeyInfo or oscrypto.asymmetric.PrivateKey object for the private key to sign the response with :param responder_certificate: An asn1crypto.x509.Certificate or oscrypto.asymmetric.Certificate object of the certificate associated with the private key :return: An asn1crypto.ocsp.OCSPResponse object of the response """ if self._response_status != 'successful': return ocsp.OCSPResponse({ 'response_status': self._response_status }) is_oscrypto = isinstance(responder_private_key, asymmetric.PrivateKey) if not isinstance(responder_private_key, keys.PrivateKeyInfo) and not is_oscrypto: raise TypeError(_pretty_message( ''' responder_private_key must be an instance ofthe c asn1crypto.keys.PrivateKeyInfo or oscrypto.asymmetric.PrivateKey, not %s ''', _type_name(responder_private_key) )) cert_is_oscrypto = isinstance(responder_certificate, asymmetric.Certificate) if not isinstance(responder_certificate, x509.Certificate) and not cert_is_oscrypto: raise TypeError(_pretty_message( ''' responder_certificate must be an instance of asn1crypto.x509.Certificate or oscrypto.asymmetric.Certificate, not %s ''', _type_name(responder_certificate) )) if cert_is_oscrypto: responder_certificate = responder_certificate.asn1 if self._certificate_status_list is None: raise ValueError(_pretty_message( ''' certificate_status_list must be set if the response_status is "successful" ''' )) def _make_extension(name, value): return { 'extn_id': name, 'critical': False, 'extn_value': value } responses = [] for serial, status in self._certificate_status_list: response_data_extensions = [] single_response_extensions = [] for name, value in self._response_data_extensions.items(): response_data_extensions.append(_make_extension(name, value)) if self._nonce: response_data_extensions.append( _make_extension('nonce', self._nonce) ) if not response_data_extensions: response_data_extensions = None for name, value in self._single_response_extensions.items(): single_response_extensions.append(_make_extension(name, value)) if self._certificate_issuer: single_response_extensions.append( _make_extension( 'certificate_issuer', [ x509.GeneralName( name='directory_name', value=self._certificate_issuer.subject ) ] ) ) if not single_response_extensions: single_response_extensions = None responder_key_hash = getattr(responder_certificate.public_key, self._key_hash_algo) if status == 'good': cert_status = ocsp.CertStatus( name='good', value=core.Null() ) elif status == 'unknown': cert_status = ocsp.CertStatus( name='unknown', value=core.Null() ) else: reason = status if status != 'revoked' else 'unspecified' cert_status = ocsp.CertStatus( name='revoked', value={ 'revocation_time': self._revocation_date, 'revocation_reason': reason, } ) issuer = self._certificate_issuer if self._certificate_issuer else responder_certificate produced_at = datetime.now(timezone.utc).replace(microsecond=0) if self._this_update is None: self._this_update = produced_at if self._next_update is None: self._next_update = (self._this_update + timedelta(days=7)).replace(microsecond=0) response = { 'cert_id': { 'hash_algorithm': { 'algorithm': self._key_hash_algo }, 'issuer_name_hash': getattr(issuer.subject, self._key_hash_algo), 'issuer_key_hash': getattr(issuer.public_key, self._key_hash_algo), 'serial_number': serial, }, 'cert_status': cert_status, 'this_update': self._this_update, 'next_update': self._next_update, 'single_extensions': single_response_extensions } responses.append(response) response_data = ocsp.ResponseData({ 'responder_id': ocsp.ResponderId(name='by_key', value=responder_key_hash), 'produced_at': produced_at, 'responses': responses, 'response_extensions': response_data_extensions }) signature_algo = responder_private_key.algorithm if signature_algo == 'ec': signature_algo = 'ecdsa' signature_algorithm_id = '%s_%s' % (self._hash_algo, signature_algo) if responder_private_key.algorithm == 'rsa': sign_func = asymmetric.rsa_pkcs1v15_sign elif responder_private_key.algorithm == 'dsa': sign_func = asymmetric.dsa_sign elif responder_private_key.algorithm == 'ec': sign_func = asymmetric.ecdsa_sign if not is_oscrypto: responder_private_key = asymmetric.load_private_key(responder_private_key) signature_bytes = sign_func(responder_private_key, response_data.dump(), self._hash_algo) certs = None if self._certificate_issuer and getattr(self._certificate_issuer.public_key, self._key_hash_algo) != responder_key_hash: certs = [responder_certificate] return ocsp.OCSPResponse({ 'response_status': self._response_status, 'response_bytes': { 'response_type': 'basic_ocsp_response', 'response': { 'tbs_response_data': response_data, 'signature_algorithm': {'algorithm': signature_algorithm_id}, 'signature': signature_bytes, 'certs': certs, } } }) # Enums class ResponseStatus(enum.Enum): successful = 'successful' malformed_request = 'malformed_request' internal_error = 'internal_error' try_later = 'try_later' sign_required = 'sign_required' unauthorized = 'unauthorized' class CertificateStatus(enum.Enum): good = 'good' revoked = 'revoked' key_compromise = 'key_compromise' ca_compromise = 'ca_compromise' affiliation_changed = 'affiliation_changed' superseded = 'superseded' cessation_of_operation = 'cessation_of_operation' certificate_hold = 'certificate_hold' remove_from_crl = 'remove_from_crl' privilege_withdrawn = 'privilege_withdrawn' unknown = 'unknown' # API endpoints FAULT_REVOKED = "revoked" FAULT_UNKNOWN = "unknown" app = Flask(__name__) class OCSPResponder: def __init__(self, issuer_cert: str, responder_cert: str, responder_key: str, fault: str, next_update_seconds: int): """ Create a new OCSPResponder instance. :param issuer_cert: Path to the issuer certificate. :param responder_cert: Path to the certificate of the OCSP responder with the `OCSP Signing` extension. :param responder_key: Path to the private key belonging to the responder cert. :param validate_func: A function that - given a certificate serial - will return the appropriate :class:`CertificateStatus` and - depending on the status - a revocation datetime. :param cert_retrieve_func: A function that - given a certificate serial - will return the corresponding certificate as a string. :param next_update_seconds: The ``nextUpdate`` value that will be written into the response. Default: 9 hours. """ # Certs and keys self._issuer_cert = asymmetric.load_certificate(issuer_cert) self._responder_cert = asymmetric.load_certificate(responder_cert) self._responder_key = asymmetric.load_private_key(responder_key) # Next update self._next_update_seconds = next_update_seconds self._fault = fault def _fail(self, status: ResponseStatus) -> OCSPResponse: builder = OCSPResponseBuilder(response_status=status.value) return builder.build() def parse_ocsp_request(self, request_der: bytes) -> OCSPRequest: """ Parse the request bytes, return an ``OCSPRequest`` instance. """ return OCSPRequest.load(request_der) def validate(self): time = datetime(2018, 1, 1, 1, 00, 00, 00, timezone.utc) if self._fault == FAULT_REVOKED: return (CertificateStatus.revoked, time) elif self._fault == FAULT_UNKNOWN: return (CertificateStatus.unknown, None) elif self._fault != None: raise NotImplemented('Fault type could not be found') return (CertificateStatus.good, time) def _build_ocsp_response(self, ocsp_request: OCSPRequest) -> OCSPResponse: """ Create and return an OCSP response from an OCSP request. """ # Get the certificate serial tbs_request = ocsp_request['tbs_request'] request_list = tbs_request['request_list'] if len(request_list) < 1: logger.warning('Received OCSP request with no requests') raise NotImplemented('Empty requests not supported') single_request = request_list[0] # TODO: Support more than one request req_cert = single_request['req_cert'] serial = req_cert['serial_number'].native # Check certificate status try: certificate_status, revocation_date = self.validate() except Exception as e: logger.exception('Could not determine certificate status: %s', e) return self._fail(ResponseStatus.internal_error) certificate_status_list = [(serial, certificate_status.value)] # Build the response builder = OCSPResponseBuilder(**{ 'response_status': ResponseStatus.successful.value, 'certificate_status_list': certificate_status_list, 'revocation_date': revocation_date, }) # Parse extensions for extension in tbs_request['request_extensions']: extn_id = extension['extn_id'].native critical = extension['critical'].native value = extension['extn_value'].parsed # This variable tracks whether any unknown extensions were encountered unknown = False # Handle nonce extension if extn_id == 'nonce': builder.nonce = value.native # That's all we know else: unknown = True # If an unknown critical extension is encountered (which should not # usually happen, according to RFC 6960 4.1.2), we should throw our # hands up in despair and run. if unknown is True and critical is True: logger.warning('Could not parse unknown critical extension: %r', dict(extension.native)) return self._fail(ResponseStatus.internal_error) # If it's an unknown non-critical extension, we can safely ignore it. elif unknown is True: logger.info('Ignored unknown non-critical extension: %r', dict(extension.native)) # Set certificate issuer builder.certificate_issuer = self._issuer_cert # Set next update date now = datetime.now(timezone.utc) builder.next_update = (now + timedelta(seconds=self._next_update_seconds)).replace(microsecond=0) return builder.build(self._responder_key, self._responder_cert) def build_http_response(self, request_der: bytes) -> Response: global app response_der = self._build_ocsp_response(request_der).dump() resp = app.make_response((response_der, 200)) resp.headers['content_type'] = 'application/ocsp-response' return resp responder = None def init_responder(issuer_cert: str, responder_cert: str, responder_key: str, fault: str, next_update_seconds: int): global responder responder = OCSPResponder(issuer_cert=issuer_cert, responder_cert=responder_cert, responder_key=responder_key, fault=fault, next_update_seconds=next_update_seconds) def init(port=8080, debug=False): logger.info('Launching %sserver on port %d', 'debug' if debug else '', port) app.run(port=port, debug=debug) @app.route('/', methods=['GET']) def _handle_root(): return 'ocsp-responder' @app.route('/status/', defaults={'u_path': ''}, methods=['GET']) @app.route('/status/', methods=['GET']) def _handle_get(u_path): global responder """ An OCSP GET request contains the DER-in-base64 encoded OCSP request in the HTTP request URL. """ if "Host" not in request.headers: raise ValueError ("Required 'Host' header not present") der = base64.b64decode(u_path) ocsp_request = responder.parse_ocsp_request(der) return responder.build_http_response(ocsp_request) @app.route('/status', methods=['POST']) def _handle_post(): global responder """ An OCSP POST request contains the DER encoded OCSP request in the HTTP request body. """ if "Host" not in request.headers: raise ValueError ("Required 'Host' header not present") ocsp_request = responder.parse_ocsp_request(request.data) return responder.build_http_response(ocsp_request) mongo-c-driver-1.26.0/.evergreen/ocsp/ocsp_mock.py000077500000000000000000000034031456567454500220130ustar00rootroot00000000000000#! /usr/bin/env python3 """ Python script to interface as a mock OCSP responder. """ import argparse import logging import sys import os sys.path.append(os.path.join(os.getcwd() ,'src', 'third_party', 'mock_ocsp_responder')) import mock_ocsp_responder def main(): """Main entry point""" parser = argparse.ArgumentParser(description="MongoDB Mock OCSP Responder.") parser.add_argument('-p', '--port', type=int, default=8080, help="Port to listen on") parser.add_argument('--ca_file', type=str, required=True, help="CA file for OCSP responder") parser.add_argument('-v', '--verbose', action='count', help="Enable verbose tracing") parser.add_argument('--ocsp_responder_cert', type=str, required=True, help="OCSP Responder Certificate") parser.add_argument('--ocsp_responder_key', type=str, required=True, help="OCSP Responder Keyfile") parser.add_argument('--fault', choices=[mock_ocsp_responder.FAULT_REVOKED, mock_ocsp_responder.FAULT_UNKNOWN, None], default=None, type=str, help="Specify a specific fault to test") parser.add_argument('--next_update_seconds', type=int, default=32400, help="Specify how long the OCSP response should be valid for") args = parser.parse_args() if args.verbose: logging.basicConfig(level=logging.DEBUG) print('Initializing OCSP Responder') mock_ocsp_responder.init_responder(issuer_cert=args.ca_file, responder_cert=args.ocsp_responder_cert, responder_key=args.ocsp_responder_key, fault=args.fault, next_update_seconds=args.next_update_seconds) if args.verbose: mock_ocsp_responder.init(args.port, debug=True) else: mock_ocsp_responder.init(args.port) print('Mock OCSP Responder is running on port %s' % (str(args.port))) if __name__ == '__main__': main() mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/000077500000000000000000000000001456567454500202465ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/ca.crt000066400000000000000000000023611456567454500213450ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDeTCCAmGgAwIBAgIEZLtwgzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMjA2MjAxMzExWhcNNDAwMjA4MjAxMzExWjB0MQswCQYD VQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENp dHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwO S2VybmVsIFRlc3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0 D1mnIrh7RRrCUEocNYLMZ2azo6c6NUTqSAMQyDDvRUsezil2NCqKo0ptMRtmb8Ws yuaRUkjFhh9M69kiuj89GKRALXxExHjWX7e8iS1NTGL+Uakc1J23Z5FvlUyVLucC fcAZ6MvcC7n6qpzUxkqz1u/27Ze9nv2mleLYBVWbGpjSHAUDuZzMCBs5Q/QrUwL7 4cIxNsS0iHpYI3aee67cmFoK4guN9LBOtviyXUTP22kJLXe41HDjdWh01+FxcuwH rGmeGQwiSlw48wkdoC0M51SwpHEq+K91BqGsTboC5mshqKA88OPf5JK9ied/OsNX +K6p5v3RVHn89VaWiTorAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBAAd1jj1GECUEJMH00IX3VFgb2RpJ4Qi8TKAZgMMHdE7Cyv4M p4w/zvQC1F6i54n+TWucq3I+c33lEj63ybFdJO5HOWoGzC/f5qO7z0gYdP2Ltdxg My2uVZNQS+B8hF9MhGUeFnOpzAbKW2If3KN1fn/m2NDYGEK/Z2t7ZkpOcpEW5Lib vX+BBG/s4DeyhRXy+grs0ASU/z8VOhZYSJpgdbvXsY4RXXloTDcWIlNqra5K6+3T nVEkBDm0Qw97Y6FsqBVxk4kgWC6xNxQ4Sp+Sg4wthMQ70iFGlMin0kYRo7kAIUF9 M+v2vMwTFWkcl0BT5LobE39kWVbQKEVPH7nkItE= -----END CERTIFICATE----- mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/ca.key000066400000000000000000000032501456567454500213430ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC0D1mnIrh7RRrC UEocNYLMZ2azo6c6NUTqSAMQyDDvRUsezil2NCqKo0ptMRtmb8WsyuaRUkjFhh9M 69kiuj89GKRALXxExHjWX7e8iS1NTGL+Uakc1J23Z5FvlUyVLucCfcAZ6MvcC7n6 qpzUxkqz1u/27Ze9nv2mleLYBVWbGpjSHAUDuZzMCBs5Q/QrUwL74cIxNsS0iHpY I3aee67cmFoK4guN9LBOtviyXUTP22kJLXe41HDjdWh01+FxcuwHrGmeGQwiSlw4 8wkdoC0M51SwpHEq+K91BqGsTboC5mshqKA88OPf5JK9ied/OsNX+K6p5v3RVHn8 9VaWiTorAgMBAAECggEBAJ7umazMGdg80/TGF9Q0a2JutplDj5zyXgUJUSNkAMWB /V+Qi8pZG1/J6CzfVpche3McmU2WOsOWslQcLUnY6W7NLFW1kGXGof5e+HgDASik jxB6FfJrvVagpR+/wZxAjQmG46Q69o4hD6SxKcMpz9BTnPXxG6n1B2EeFd+lPb2r zf/C4uXBczWn5rFXkj0DZGq81ZXewcnUNnxjQnccVCuYW+hqYxznSxqWTCD6hsvg sGceqv0Ppp6TqMSECCIIJ+kVlbiAC2i6mnoertheFVrNUdwDb8nRn6fs8T+F0ShW PdxIfSvAaBKqvseJqqueVpuwVcdSl+moJYlCdMb4cUECgYEA30AIHvMQq/s33ipV 62xOKXcEZ7tKaJrAbJvG4cx934wNiQ0tLwRNlonGbuTjsUaPRvagVeJND/UPIsfH ZwoY1Uw25fZNaveoQtU8LQBAG53R5yaMiUH48JWVvKRdfG09zr6EFCM/k2loHS1W /CiDlaIl59B8REnihyn0wvkiaIsCgYEAznlZRhlruk+n2sWklierav4M8GEK22+/ A/UP1eUnlcHgSaFZoM0sukSrisZnj6zu/BAfFEVN5czra3ARrLClLQteFREr2BMF 9XymrjNG99QkBAall7BGpfkDW/D2DFZa4G5R6AMG+pYZHCU84U4QT5ZKyfdhTUbQ uTYx2F31COECgYAIUm+7D56AerXjbzqSsw/a1dfxMfcdHR+tLMVmJ2RNz/+1KyuT BBsMUIh4G8otEo9GuuzRJsVuodj1l/Lj8WlpkhS9z8elBCRekWpT1x2Mqf5oGnTE rRPli/3v8USW3c+fBFUSFxpImXZLGCSU88Gr80ZsdMYdGY/7L+Iy3myc7wKBgQC1 uHeqCpWV1KWXFnxU63UjJZWdussjdqZXhUf6qUS9uXT9WNTZgbrr9aRE73oWKc3s awPvg0+cAU7xsCDeLFoz2t1jDUnZUmTcOmk4yEidtkg8gt0bNDn5ucALG3hyQ06Y WIAeAwwRYCmZa+y5H0ubwFryhpdMvBbX66rTE16mAQKBgC5PJd9zLEzyLj/jUfZ0 xOwXubu9GejOuCiVwKMTn73nvdi57zFBOrDxSl9yVCRhve61L5fcJixRDiwx8qtd VGclRMxbVPKVfKpAyKjpsmZXk3IPHjXjJb3fYLXAnzRHk6v+yjVn4fy2Z93pW/cF wBgQNqXLNTGrBzrFi469oc1s -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/ca.pem000066400000000000000000000056311456567454500213410ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDeTCCAmGgAwIBAgIEZLtwgzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMjA2MjAxMzExWhcNNDAwMjA4MjAxMzExWjB0MQswCQYD VQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENp dHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwO S2VybmVsIFRlc3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0 D1mnIrh7RRrCUEocNYLMZ2azo6c6NUTqSAMQyDDvRUsezil2NCqKo0ptMRtmb8Ws yuaRUkjFhh9M69kiuj89GKRALXxExHjWX7e8iS1NTGL+Uakc1J23Z5FvlUyVLucC fcAZ6MvcC7n6qpzUxkqz1u/27Ze9nv2mleLYBVWbGpjSHAUDuZzMCBs5Q/QrUwL7 4cIxNsS0iHpYI3aee67cmFoK4guN9LBOtviyXUTP22kJLXe41HDjdWh01+FxcuwH rGmeGQwiSlw48wkdoC0M51SwpHEq+K91BqGsTboC5mshqKA88OPf5JK9ied/OsNX +K6p5v3RVHn89VaWiTorAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBAAd1jj1GECUEJMH00IX3VFgb2RpJ4Qi8TKAZgMMHdE7Cyv4M p4w/zvQC1F6i54n+TWucq3I+c33lEj63ybFdJO5HOWoGzC/f5qO7z0gYdP2Ltdxg My2uVZNQS+B8hF9MhGUeFnOpzAbKW2If3KN1fn/m2NDYGEK/Z2t7ZkpOcpEW5Lib vX+BBG/s4DeyhRXy+grs0ASU/z8VOhZYSJpgdbvXsY4RXXloTDcWIlNqra5K6+3T nVEkBDm0Qw97Y6FsqBVxk4kgWC6xNxQ4Sp+Sg4wthMQ70iFGlMin0kYRo7kAIUF9 M+v2vMwTFWkcl0BT5LobE39kWVbQKEVPH7nkItE= -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC0D1mnIrh7RRrC UEocNYLMZ2azo6c6NUTqSAMQyDDvRUsezil2NCqKo0ptMRtmb8WsyuaRUkjFhh9M 69kiuj89GKRALXxExHjWX7e8iS1NTGL+Uakc1J23Z5FvlUyVLucCfcAZ6MvcC7n6 qpzUxkqz1u/27Ze9nv2mleLYBVWbGpjSHAUDuZzMCBs5Q/QrUwL74cIxNsS0iHpY I3aee67cmFoK4guN9LBOtviyXUTP22kJLXe41HDjdWh01+FxcuwHrGmeGQwiSlw4 8wkdoC0M51SwpHEq+K91BqGsTboC5mshqKA88OPf5JK9ied/OsNX+K6p5v3RVHn8 9VaWiTorAgMBAAECggEBAJ7umazMGdg80/TGF9Q0a2JutplDj5zyXgUJUSNkAMWB /V+Qi8pZG1/J6CzfVpche3McmU2WOsOWslQcLUnY6W7NLFW1kGXGof5e+HgDASik jxB6FfJrvVagpR+/wZxAjQmG46Q69o4hD6SxKcMpz9BTnPXxG6n1B2EeFd+lPb2r zf/C4uXBczWn5rFXkj0DZGq81ZXewcnUNnxjQnccVCuYW+hqYxznSxqWTCD6hsvg sGceqv0Ppp6TqMSECCIIJ+kVlbiAC2i6mnoertheFVrNUdwDb8nRn6fs8T+F0ShW PdxIfSvAaBKqvseJqqueVpuwVcdSl+moJYlCdMb4cUECgYEA30AIHvMQq/s33ipV 62xOKXcEZ7tKaJrAbJvG4cx934wNiQ0tLwRNlonGbuTjsUaPRvagVeJND/UPIsfH ZwoY1Uw25fZNaveoQtU8LQBAG53R5yaMiUH48JWVvKRdfG09zr6EFCM/k2loHS1W /CiDlaIl59B8REnihyn0wvkiaIsCgYEAznlZRhlruk+n2sWklierav4M8GEK22+/ A/UP1eUnlcHgSaFZoM0sukSrisZnj6zu/BAfFEVN5czra3ARrLClLQteFREr2BMF 9XymrjNG99QkBAall7BGpfkDW/D2DFZa4G5R6AMG+pYZHCU84U4QT5ZKyfdhTUbQ uTYx2F31COECgYAIUm+7D56AerXjbzqSsw/a1dfxMfcdHR+tLMVmJ2RNz/+1KyuT BBsMUIh4G8otEo9GuuzRJsVuodj1l/Lj8WlpkhS9z8elBCRekWpT1x2Mqf5oGnTE rRPli/3v8USW3c+fBFUSFxpImXZLGCSU88Gr80ZsdMYdGY/7L+Iy3myc7wKBgQC1 uHeqCpWV1KWXFnxU63UjJZWdussjdqZXhUf6qUS9uXT9WNTZgbrr9aRE73oWKc3s awPvg0+cAU7xsCDeLFoz2t1jDUnZUmTcOmk4yEidtkg8gt0bNDn5ucALG3hyQ06Y WIAeAwwRYCmZa+y5H0ubwFryhpdMvBbX66rTE16mAQKBgC5PJd9zLEzyLj/jUfZ0 xOwXubu9GejOuCiVwKMTn73nvdi57zFBOrDxSl9yVCRhve61L5fcJixRDiwx8qtd VGclRMxbVPKVfKpAyKjpsmZXk3IPHjXjJb3fYLXAnzRHk6v+yjVn4fy2Z93pW/cF wBgQNqXLNTGrBzrFi469oc1s -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/mock-delegate-revoked.sh000077500000000000000000000003021456567454500247360ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ocsp_responder.crt \ --ocsp_responder_key ocsp_responder.key \ -p 8100 \ -v \ --fault revoked mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/mock-delegate-valid.sh000077500000000000000000000002551456567454500244050ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ocsp-responder.crt \ --ocsp_responder_key ocsp-responder.key \ -p 8100 \ -v mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/mock-revoked.sh000077500000000000000000000002521456567454500231720ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ca.crt \ --ocsp_responder_key ca.key \ -p 8100 \ -v \ --fault revoked mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/mock-valid.sh000077500000000000000000000002251456567454500226320ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ca.crt \ --ocsp_responder_key ca.key \ -p 8100 \ -v mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/ocsp-responder.crt000066400000000000000000000023751456567454500237320ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDgzCCAmugAwIBAgIEA0v5yzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMjA2MjMyMjU4WhcNNDAwMjA4MjMyMjU4WjBiMRAwDgYD VQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxEjAQBgNVBAMMCWxvY2FsaG9z dDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMQ8wDQYDVQQHDAZPQ1NQLTMwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDiHYXGCSOK3gxlEmNSLepoFJbv hfYxxaqAWEceiTQdRpN97YRr/ywPm0+932EsE6/gIjqVs8IOtsiFKK1lQ9sL/9f+ ckS5gj9AR+Cta+FLDRP5plE+aao5no0kA8qMx2HHd47XFnuxKtUztRmgmTBNYbYh PdY1kjBSRyuXXBn1V6TRaYhk6dsK56Zvhgo6Y3YqpjpldePa4E0XpUlBhY020QXt K3iWFauEYKcKR2JI2oVjY0tR60zf3GHkMLCe7SdbofCdwkBHcCctLSp4xYb44JGb JX1npM1mhxR4pnp80tbEXNvXQ4S3kmd7/QFUYE4IdXVkXNhkK6PtIdDKbLa9AgMB AAGjLzAtMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMBMGA1UdJQQMMAoGCCsGAQUF BwMJMA0GCSqGSIb3DQEBCwUAA4IBAQB5igUUQSzxzWvL+28TDYFuNnTB0hvqTnd7 ZVyk8RVBiUkudxEmt5uFRWT6GOc7Y1H6w4igtuhhqxAeG9bUob+VQkCyc4GxaHSO oBtl/Zu+ts+0gUUlm+Bs6wFnFsGhM0awV/vqigDADZT2jbqbHBm2lP99eq8fsi6L kpohhbuTVWjLuViARYIOJLoBnNRpVXqwD5A8uNqwZI2OVGh1cQYNZcmfLJ1u2j5C ycohoa+o8NGgkxEhG2QETdVodfHT2dUgzPDvO42CVa3MK7J0sovBU5DeuIDPV/hh j+v5A8L8gMiNpkLClqt2TEiFH2GItWDNQjTgrLq9iFUgJnbwuj4F -----END CERTIFICATE----- mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/ocsp-responder.key000066400000000000000000000032501456567454500237230ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDiHYXGCSOK3gxl EmNSLepoFJbvhfYxxaqAWEceiTQdRpN97YRr/ywPm0+932EsE6/gIjqVs8IOtsiF KK1lQ9sL/9f+ckS5gj9AR+Cta+FLDRP5plE+aao5no0kA8qMx2HHd47XFnuxKtUz tRmgmTBNYbYhPdY1kjBSRyuXXBn1V6TRaYhk6dsK56Zvhgo6Y3YqpjpldePa4E0X pUlBhY020QXtK3iWFauEYKcKR2JI2oVjY0tR60zf3GHkMLCe7SdbofCdwkBHcCct LSp4xYb44JGbJX1npM1mhxR4pnp80tbEXNvXQ4S3kmd7/QFUYE4IdXVkXNhkK6Pt IdDKbLa9AgMBAAECggEBAMMYOe4OwI323LbwUKX9W/0Flt1/tlZneJ9Yi7R7KW4B EQ1cPB96gafNl9X5wLvpGJzIq8ey28MaTpUl7cYr7/nAe7rdGRL+oFh0LBU1uaOp 2wxSRlMVlHw2owzqAH/LIECclbBbg8nvbRk6Lqx0wEpj/mNcGVELm4nCQohMPVGC 9/8GZ63r+tS35jry9SBG0X4R5jYKsNzgNgcjR+lgMv/2FfpuZDryk9TWIP9ApQoc 7/DpTfC6P34f/ermfo4f2GEmRJsTACphA0kkpQX/n88r35cUSGeO5M9jYICUeCFw IK4L6KNQcTRVOknFYeVJembVrj0RYKtWT+oU84a4XPkCgYEA+k7fcXhU2K+NX8RN 7HUPbxBE/TfLTNHdLTuWCUI77j+J3LUPNQ4BUyue+pUaFxI7Huc6x1zvvD27EqJ8 0ge5MkFNflTUdUotuU/FKg7GKOU7rfdEvthzU2MbAZrHc0SeF+9/YrpvWZ+ZMKQ5 IBQhiloFLsVGpGFzzF/MjpFdYo8CgYEA50HQxDDmfzmvNnURRZZV0lQ203m9I4KF DbL2x59q0DaJkUpFr3uyvghAoz4y/OD5vNIwbzHWbmDQEA06v7iFoJ6BcJFG1syc 7A7KTB3PNQK4+ASG6pC3tYJ78mWtJwK130hFpuVkS/VPhQZJ/21EcWj9V153SZpA RUqv/L+lx/MCgYEAs7E7p3IDNyuQClgauM2wrsK3RDFxuUxPw9Eq/KqX64mhptg0 epn7SYHfN3Uirb1gw+arw8NsN275hX8wrHbu9Kz8vNyZSTpfaNFjcbX5fBJUrab9 qyQoZoyXLqe214FDHVvJz06X8Xcpukmq2OSaz3+giNsGw6tSPj3n09F3gPECgYBI 1NGK+FufdetYm0X1RIOC2kLqF00aAeElj1dpRyu8p3Br8ZhAzBRfBPpWbyBfw/rj HM9kNa3y1Uqxw3jdKJ/tFf5uFVLaE1bYgU/06O55I4Jdmg9jkHBLGe0vShZeUtw0 le5ZwaT0xy1kF7b2WtNTZF1lRrsK0ymqqPsD/teXQQKBgBTyYVxPEHKr86kEQqL5 /OKByVpqAxA7LQ1lTLNV9lXMRawp848flv/Uc8pj43MitAIiYazfXkpeeC6gGntJ kkRT9jraOzy51tVAIh2KXm3l6KY/gnYTO3UXrxZOZU4IA7OttP3BG7xKq/9HP+kV 5P1bAkqo+n3XNxKoSSeJteCd -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/responder.logs000066400000000000000000000000741456567454500231360ustar00rootroot00000000000000INFO:mock_ocsp_responder:Launching debugserver on port 8100 mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/server-mustStaple.pem000066400000000000000000000062551456567454500244260ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIERjCCAy6gAwIBAgIEJ++lZzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMzE5MTU1NjIyWhcNNDAwMzIxMTU1NjIyWjBiMRAwDgYD VQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxEjAQBgNVBAMMCWxvY2FsaG9z dDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMQ8wDQYDVQQHDAZPQ1NQLTEwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDykV3fTFJgaqjfAgbAC7TGPk9V VVsRYRgLF8Zjh9GDRU/TQ6pGZG7qo64D11oQurW0WT2Zv/lqhXW4mWNFv8+qoS5L 9z2Dtmxr8CZbb6YftA0e22KPUuDCQ5nYhOY21A6SYFwqEZ6ZsrZAMkgfhx+TY1kZ 0jZM/jgkvRtpG9I8BbddHyF8eFATCJ41DnLOzjfNukd5zKSIdVxY6r+ZBOr29kii dcNHkCAck7+WXl9/KSqH7jF5asU0S3x/68G2R/qdKAxki9b2fe70N3XGZE0P2WHi lq2aJeE0eqjAv+hBGiEb4iJl0s8iheardrHFeL4EMbiiVfVdVCHKkp58wjB9AgMB AAGjgfEwge4wCQYDVR0TBAIwADALBgNVHQ8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB BQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTOLiS9HKGWpiVKx81nNuRlK+HAITBn BggrBgEFBQcBAQRbMFkwLQYIKwYBBQUHMAGGIWh0dHA6Ly9sb2NhbGhvc3Q6OTAw MS9wb3dlci9sZXZlbDAoBggrBgEFBQcwAYYcaHR0cDovL2xvY2FsaG9zdDo4MTAw L3N0YXR1czARBggrBgEFBQcBGAQFMAMCAQUwGgYDVR0RBBMwEYIJbG9jYWxob3N0 hwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQCg3NfTO8eCdhtmdDVF5WwP4/lXMYJY 5wn7PhYKMyUQI3rjUpQRIQwCVerHAJAiiflpgefxB8PD5spHPFq6RqAvH9SKpP5x nyhiRdo51BmijCIl7VNdqyM5ZgDAN2fm2m56mDxpo9xqeTWg83YK8YY1xvBHl3jl vQC+bBJzhaTp6SYXMc/70qIPcln0IElbuLN8vL4aG6xULkivtjiv7qBSZrNrBMSf QJan9En4wcNGFt5ozrgJthZHTTX9pXOGVZe4LXbPCQSrBxZiBD9bITUyhtbeYhYR 4yfXjr7IeuoX+0g6+EEtxqrbWfIkJ3D7UaxAorZEsCt18GC7fap9/fzv -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDykV3fTFJgaqjf AgbAC7TGPk9VVVsRYRgLF8Zjh9GDRU/TQ6pGZG7qo64D11oQurW0WT2Zv/lqhXW4 mWNFv8+qoS5L9z2Dtmxr8CZbb6YftA0e22KPUuDCQ5nYhOY21A6SYFwqEZ6ZsrZA Mkgfhx+TY1kZ0jZM/jgkvRtpG9I8BbddHyF8eFATCJ41DnLOzjfNukd5zKSIdVxY 6r+ZBOr29kiidcNHkCAck7+WXl9/KSqH7jF5asU0S3x/68G2R/qdKAxki9b2fe70 N3XGZE0P2WHilq2aJeE0eqjAv+hBGiEb4iJl0s8iheardrHFeL4EMbiiVfVdVCHK kp58wjB9AgMBAAECggEATA91Bf3insUTKspx32pMRxVmvvVC1xJA/cl4teDyu1zS iQZgsC3x8bVdbWrrnO9O5rxM6pcd2F786OOAE3Dv5ysfX0apjVF4cegdvvIlfy9w JcrY/uQYAhI8fX4+ydZ4s0Fv5OkdeEhniX26y9gM+KRgXg5iZIYaiLqbi7vjkloE NBIDWGj8PCNKUVc2PSbZFVMMTc+7qZeUR0WRKr9CsaXBiEkWKfuw4MH1YUL0HJOs uLd/oYg0l0eHPluUkKQW+KVq1GKsmr2sSc8NOcGtVTsUygSgX4hw36V7Vw3MfQRv sNIgKp3RDEyynoXRoG3laHrib1GdYwDKRsHB2znKQQKBgQD+NAOOqoEx0lmlg/Wf sNImv+3da0owE1TqTMHBWXriGo+DwqT+d9S+M5x3JMpmgH9vTEDlLOM2+qF8M3B3 TLlu1k7F8D1G7YCdIZwMLUNCekCSHsqQcU9HMHlQqXd2cxFqWbyATk9tvJzj7xC9 zMhaKGKvIS/EF0Ld8kIvrINmGQKBgQD0SExjk4yshv/DvWknxfJr8OupgQrriLHA Hrk+n84Iv/4vzupgKsXJQE6VN0xM6e/ANhGATuxiaA3UE4p6K9wJNryHrw/wdnyf I9AR0Cea9F4pa26BBCdLtQuyRqgl7dBZA1n3il7vKX6wB0MLoy/uYWYCedk4w+9d acqh7S0CBQKBgBl8x5qHV/rR13E0AO2pAfkmp0fbGQ4m8g2n8olbWmnPNfKFEpv9 EdScQiTkCHMskRpsr9kKniGGEajtU2pyw+jsDevkwZAaAho/I3FJHIRO06iS88Z1 xfgiUReYVkUHFojuRGss7uPW1Hg6IRiWrsPzZqmejzZ/CpJMVvyGtIoJAoGAXmo7 LBlxO5WJ8SuaIwc85T9etkrr35EbsnetfWjihzs9kVjV+YlOnLRAKygOU4PvaEj9 hqv6bSZugdNzqDifeOgxAfhFntkM3a1H1DqxtBBS/ItLUI48aeR1utfYUaCS8HR9 J1HR03okPwDvhuXxtp7qgHZ74JbKQz6KVP+Ib8kCgYEA7w0NnuOoZ0la17XuyQzA UeTZZavgm0tNqqT4JcPiUV9zkR8WJsFQE704KQ8BjDyeYMWwe8EpfJaqsGqdJKGo RnnxwNuwT4uSNb78MxXXVRG0fN/2iu70lNySKOl/DmA8siRc/weQj5JPsGbyZkjZ IsaTqaZQUdtbZ7vRukyPo8Q= -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/ocsp/rsa/server.pem000066400000000000000000000062251456567454500222640ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIET11AjzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMzE5MTU1NjI1WhcNNDAwMzIxMTU1NjI1WjBiMRAwDgYD VQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxEjAQBgNVBAMMCWxvY2FsaG9z dDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMQ8wDQYDVQQHDAZPQ1NQLTEwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0usokl3+yXDtLeYquHQyAkXIw lY4tukv8nEgLtUlK0kt9Q7P8EdZigzFUeJtL7piFCTIaLuv6e4UqLLDXbIANxD/J NXXQPtBasOSzdgZ2ToUj5ANPv0QegsFubpYGq5LXsMdKTRE8uTB91PJBvRzxY2Nx O1kdQcIrYpSYXqKsNgq/8iAPrmAdZ3y+S7OBuNyvlQJZqWoB1Y0ZWuR1QrcLMgdm q2SdBzZT/3P+r/dbHMKdDZ5JdJ9Nm4ylOG7mhZkfb38JfdvWedzXDMu6TzS2W67o yM90Cj9Lt+UyHLJ2jlcsZSZp4km6Oj5RBNVhd95SFckvPJxLzSyFlpjOIXsNAgMB AAGjgd4wgdswCQYDVR0TBAIwADALBgNVHQ8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB BQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTe7IMKaO1aQILcpoj5wLFgIRuPHzBn BggrBgEFBQcBAQRbMFkwLQYIKwYBBQUHMAGGIWh0dHA6Ly9sb2NhbGhvc3Q6OTAw MS9wb3dlci9sZXZlbDAoBggrBgEFBQcwAYYcaHR0cDovL2xvY2FsaG9zdDo4MTAw L3N0YXR1czAaBgNVHREEEzARgglsb2NhbGhvc3SHBH8AAAEwDQYJKoZIhvcNAQEL BQADggEBAFMVds6y5Qy7DlFsca0u8WE+ckoONa427bWBqNx8b/Hwaj3N3C58XQx/ EZRNt9XVy/LoEHr+NmOWsCl69fINeVpx8Ftot8XPbFG9YxL/xbJ3lvWesPR6bwpm PZqGiwfl1VrZvuobXADz0Rfru7B7LPkurpSxDiNBf/9JuLPYe9ffZwdFWQoehw07 b9FKVaJ7mSHno/5f4Z/uKau91sL0kiKKG9Lo2JEIEmpp8HJ3OKCFh7DFkeDlRCDl WyYxF4g/PfvJQm2Hd89cu8m3RX84rLa9jn1RGL/8bmxE0dxk4Di/t9gl5KGWIH9Q LBeVRSQmH9GbI/WmldMLkGkvARYYTp8= -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC0usokl3+yXDtL eYquHQyAkXIwlY4tukv8nEgLtUlK0kt9Q7P8EdZigzFUeJtL7piFCTIaLuv6e4Uq LLDXbIANxD/JNXXQPtBasOSzdgZ2ToUj5ANPv0QegsFubpYGq5LXsMdKTRE8uTB9 1PJBvRzxY2NxO1kdQcIrYpSYXqKsNgq/8iAPrmAdZ3y+S7OBuNyvlQJZqWoB1Y0Z WuR1QrcLMgdmq2SdBzZT/3P+r/dbHMKdDZ5JdJ9Nm4ylOG7mhZkfb38JfdvWedzX DMu6TzS2W67oyM90Cj9Lt+UyHLJ2jlcsZSZp4km6Oj5RBNVhd95SFckvPJxLzSyF lpjOIXsNAgMBAAECggEAIjNe4YHR5nzRs7yyY7SXkxTzGQKUP08L5ifk8mJCFmip ZHEVdFQjz8yn3yZbrQjfz/0ngBD1Exeg4ZRHetzLds92iqsVOm1InIDxJozlOCov w9T4U3UMfQGdfTpsJaL+TNblP8hJxMX+yTEtDwesnHmEbf8fJAw3pGIpYJQ4EIJv 1uPzyB8EsrTjj23a5NPF/FGdzzO+HP5fhNNIUmP83pqonXLUSy0v5rsRFNxNMBn3 SPRWq+Z779eLQXnRjW/6hKssSBFg6zAOi3Gc4oDbrDa2WEbZ0BEU+JW3XduN91bU SsO3yQ+VL+CQn5wvXGIsc4EHH6wO8Bs0vXfD7zeLgQKBgQDrHOzPymI0p0PnxL2+ 8LrSU1x0WdedPZJugwwfUYMfn7sjKx+FyVLvM+7wuJ8zsMOAab2AHv3S0Nxkovhb aa4lH9SUAHILcU+nb7M6E+mwSr65AemGspvGz4ZC6L52CGVzRfIcoBDD0T8OZGH0 4IeiqOluqtvgCoW4UV1dyw0nPQKBgQDEyQwcim5ghEQ7V2eDefE5yxNlkNEnSVnG DNubM8KURR8jehpDWkIlxQ4p2tLBWGB0YeOCG9NmwfLnQUStvSFE6/XjP5bBJlov jT66T98NgFRfUeVkcCAiVT/LlDzXWXXPLyZSY+bxtn8UA1NYNu0pLCLDR9TlH1dK FKwiomdgEQKBgEimcHqo4/23LeGBRsyooGH7hlchp+GbtBLYBbfrvSPZfL8aRSxX EHx/xLa3peIYHeEhS4A6k15AUcn7HdlJZ5lrI4n0NUlZ4y4u8ufgXVavUg3jDGEl 8cLWP3uPZcMdRxP+qhi0UVng36Y32JkNhHv7y935h+XL+pQA+GPSKadVAoGAPPvp SvcDmdmjo5hEthQWU8jBbBpjFv++WIgnjoON65E4QzBV70WLdlUJPKNZ6R1QVwD3 Fp00+IVml5A8jnMsWkWd4B0WxSjzjgUByY9zGqYIf7nLk0LEUp+Es7xu1nYc8mY0 RBg9u+7IlxUowQ/Uk4vgAhDCw3bhAE5Dwj/+NWECgYBWnBz5l+Uar9oT1ErRSbJW RVYx3iIsqka1lox/zw5nme1Q/dv2uTQy6uZRn9U9ikqGwePuMEexQTR1csnMqeMM 4i3pDFpGBfTZXJAvH790ak6eZ0eBXqzJlTyEjll4r4zXHk+slm/tAgpIg0Ps3J9j Sd+bTtG47gpb4sRbqEtQFQ== -----END PRIVATE KEY----- mongo-c-driver-1.26.0/.evergreen/scripts/000077500000000000000000000000001456567454500202045ustar00rootroot00000000000000mongo-c-driver-1.26.0/.evergreen/scripts/abi-compliance-check.sh000066400000000000000000000032671456567454500244660ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # create all needed directories mkdir abi-compliance mkdir abi-compliance/changes-install mkdir abi-compliance/latest-release-install mkdir abi-compliance/dumps python ./build/calc_release_version.py --next-minor >VERSION_CURRENT python ./build/calc_release_version.py --next-minor -p >VERSION_RELEASED declare newest current newest="$(cat VERSION_RELEASED)" current="$(cat VERSION_CURRENT)" # build the current changes env \ CFLAGS="-g -Og" \ EXTRA_CONFIGURE_FLAGS="-DCMAKE_INSTALL_PREFIX=./abi-compliance/changes-install" \ bash .evergreen/scripts/compile.sh # checkout the newest release git checkout "tags/${newest}" -f declare compile_script=".evergreen/scripts/compile.sh" if [[ ! -f "${compile_script}" ]]; then # Compatibility: remove once latest release contains relocated script. compile_script=".evergreen/compile.sh" fi # build the newest release env \ CFLAGS="-g -Og" \ EXTRA_CONFIGURE_FLAGS="-DCMAKE_INSTALL_PREFIX=./abi-compliance/latest-release-install" \ bash "${compile_script}" # check for abi compliance. Generates HTML Reports. cd abi-compliance cat >|old.xml <${newest} $(pwd)/latest-release-install/include/libmongoc-1.0/mongoc/mongoc.h $(pwd)/latest-release-install/include/libbson-1.0/bson/bson.h $(pwd)/latest-release-install/lib DOC cat >|new.xml <${current} $(pwd)/changes-install/include/libmongoc-1.0/mongoc/mongoc.h $(pwd)/changes-install/include/libbson-1.0/bson/bson.h $(pwd)/changes-install/lib DOC if ! abi-compliance-checker -lib mongo-c-driver -old old.xml -new new.xml; then touch ./abi-error.txt fi mongo-c-driver-1.26.0/.evergreen/scripts/add-build-dirs-to-paths.sh000066400000000000000000000023031456567454500250570ustar00rootroot00000000000000#!/usr/bin/env bash case "${OSTYPE}" in cygwin) export PATH PATH="$(pwd)/install-dir/bin:${PATH:-}" PATH="$(pwd)/src/libbson/Release:${PATH}" PATH="$(pwd)/src/libbson/Debug:${PATH}" chmod -f +x src/libmongoc/Debug/* || true chmod -f +x src/libbson/Debug/* || true chmod -f +x src/libmongoc/Release/* || true chmod -f +x src/libbson/Release/* || true chmod -f +x install-dir/bin/* || true ;; darwin*) export DYLD_LIBRARY_PATH DYLD_LIBRARY_PATH="${EXTRA_LIB_PATH:-}:${DYLD_LIBRARY_PATH:-}" DYLD_LIBRARY_PATH="$(pwd)/src/libmongoc:${DYLD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="$(pwd)/src/libbson:${DYLD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="$(pwd)/install-dir/lib64:${DYLD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="$(pwd)/install-dir/lib:${DYLD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="$(pwd):${DYLD_LIBRARY_PATH}" ;; *) export LD_LIBRARY_PATH LD_LIBRARY_PATH="${EXTRA_LIB_PATH:-}:${LD_LIBRARY_PATH:-}" LD_LIBRARY_PATH="$(pwd)/src/libmongoc:${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="$(pwd)/src/libbson:${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="$(pwd)/install-dir/lib64:${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="$(pwd)/install-dir/lib:${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="$(pwd):${LD_LIBRARY_PATH}" ;; esac mongo-c-driver-1.26.0/.evergreen/scripts/build-and-test-with-toolchain.sh000077500000000000000000000053631456567454500263150ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # Configure environment with toolchain components if [[ -d /opt/mongo-c-toolchain ]]; then sudo rm -r /opt/mongo-c-toolchain fi sudo mkdir /opt/mongo-c-toolchain declare toolchain_tar_gz toolchain_tar_gz=$(readlink -f ../mongo-c-toolchain.tar.gz) sudo tar -xf "${toolchain_tar_gz}" -C /opt/mongo-c-toolchain echo "--- TOOLCHAIN MANIFEST BEGIN ---" cat /opt/mongo-c-toolchain/MANIFEST.txt echo "--- TOOLCHAIN MANIFEST END ---" declare addl_path addl_path="$(readlink -f /opt/mongo-c-toolchain/bin):${PATH:-}" declare cmake_binary cmake_binary="$(readlink -f /opt/mongo-c-toolchain/bin/cmake)" if [[ ! -x "${cmake_binary}" ]]; then echo "CMake (${cmake_binary}) does not exist or is not executable" 1>&2 exit 1 fi declare toolchain_base_dir toolchain_base_dir="$(readlink -f /opt/mongo-c-toolchain)" declare toolchain_lib_dir="${toolchain_base_dir}/lib" declare -a ssl_vers=( "libressl-2.5" "libressl-3.0" "openssl-1.0.1" "openssl-1.0.1-fips" "openssl-1.0.2" "openssl-1.1.0" ) for ssl_ver in "${ssl_vers[@]}"; do echo "TESTING TOOLCHAIN COMPONENTS FOR ${ssl_ver}..." cp -a ../mongoc "../mongoc-${ssl_ver}" pushd "../mongoc-${ssl_ver}" declare new_path new_path="$(readlink -f "/opt/mongo-c-toolchain/${ssl_ver}/bin")" new_path+=":${addl_path}" declare ssl_base_dir ssl_base_dir="$(readlink -f "/opt/mongo-c-toolchain/${ssl_ver}")" # Output some information about our build environment "${cmake_binary}" --version declare ssl if [[ "${ssl_ver#*libressl}" != "${ssl_ver}" ]]; then ssl="LIBRESSL" else ssl="OPENSSL" fi declare output_file output_file="$(mktemp)" env \ BYPASS_FIND_CMAKE="ON" \ CFLAGS="-Wno-redundant-decls" \ EXTRA_CMAKE_PREFIX_PATH="${ssl_base_dir};${toolchain_base_dir}" \ EXTRA_CONFIGURE_FLAGS="-DCMAKE_VERBOSE_MAKEFILE=ON" \ LD_LIBRARY_PATH="${toolchain_lib_dir}" \ PATH="${new_path}" \ SSL="${ssl}" \ bash .evergreen/scripts/compile-unix.sh 2>&1 >|"${output_file}" # Verify that the toolchain components were used if grep -Ec "[-]I/opt/mongo-c-toolchain/include" "${output_file}" >/dev/null && grep -Ec "[-]isystem /opt/mongo-c-toolchain/${ssl_ver}/include" "${output_file}" >/dev/null && grep -Ec "[-]L/opt/mongo-c-toolchain/lib" "${output_file}" >/dev/null && grep -Ec "/opt/mongo-c-toolchain/${ssl_ver}/lib" "${output_file}" >/dev/null; then echo "TOOLCHAIN COMPONENTS FOR ${ssl_ver} DETECTED IN BUILD OUTPUT." else echo "TOOLCHAIN COMPONENTS FOR ${ssl_ver} NOT DETECTED IN BUILD OUTPUT! ABORTING!" 1>&2 echo "BUILD OUTPUT:" cat "${output_file}" exit 1 fi rm -f "${output_file}" popd # "mongoc-${ssl_ver}" echo "TESTING TOOLCHAIN COMPONENTS FOR ${ssl_ver}... DONE." done mongo-c-driver-1.26.0/.evergreen/scripts/build-docs.sh000066400000000000000000000014621456567454500225700ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # Exit the script with error if any of the commands fail . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths . "$(dirname "${BASH_SOURCE[0]}")/find-cmake-latest.sh" CMAKE=$(find_cmake_latest) # Check that a CLion user didn't accidentally convert NEWS from UTF-8 to ASCII grep "á" NEWS > /dev/null || (echo "NEWS file appears to have lost its UTF-8 encoding?" || exit 1) debug "Calculating release version..." python build/calc_release_version.py >VERSION_CURRENT python build/calc_release_version.py -p >VERSION_RELEASED build_dir=$MONGOC_DIR/_build/for-docs "$CMAKE" -S "$MONGOC_DIR" -B "$build_dir" \ -D ENABLE_MAN_PAGES=ON \ -D ENABLE_HTML_DOCS=ON \ -D ENABLE_ZLIB=BUNDLED "$CMAKE" --build "$build_dir" \ --parallel 8 \ --target bson-doc \ --target mongoc-doc mongo-c-driver-1.26.0/.evergreen/scripts/build_snapshot_rpm.sh000066400000000000000000000135231456567454500244400ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # # build_snapshot_rpm.sh # # # Copyright 2018 MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # for arg in "$@"; do if [ "$arg" = "-h" ]; then echo "Usage: ./.evergreen/scripts/build_snapshot_rpm.sh" echo "" echo " This script is used to build a .rpm package directly from a snapshot of the" echo " current repository." echo "" echo " This script must be called from the base directory of the repository, and" echo " requires utilities from these packages: rpm-build, mock" echo "" exit fi done package=mongo-c-driver spec_file=../mongo-c-driver.spec config=${MOCK_TARGET_CONFIG:=fedora-38-aarch64} if [ ! -x /usr/bin/rpmbuild -o ! -x /usr/bin/rpmspec ]; then echo "Missing the rpmbuild or rpmspec utility from the rpm-build package" exit 1 fi if [ ! -d .git ]; then echo "This script only works from within a repository" exit 1 fi if [ ! -x /usr/bin/mock ]; then echo "Missing mock" exit 1 fi if [ -f "${spec_file}" ]; then echo "Found old spec file (${spec_file})...removing" rm -f ${spec_file} fi cp "$(pwd)/.evergreen/etc/${package}.spec" .. if [ -f .evergreen/etc/spec.patch ]; then patch -d .. -p0 -i $(pwd)/.evergreen/etc/spec.patch fi changelog_package=$(rpmspec --srpm -q --qf "%{name}" ${spec_file}) if [ "${package}" != "${changelog_package}" ]; then echo "This script is configured to create snapshots for ${package} but you are trying to create a snapshot for ${changelog_package}" exit 1 fi build_dir=$(basename $(pwd)) sudo mock -r ${config} --use-bootstrap-image --isolation=simple --clean sudo mock -r ${config} --use-bootstrap-image --isolation=simple --init mock_root=$(sudo mock -r ${config} --use-bootstrap-image --isolation=simple --print-root-path) sudo mock -r ${config} --use-bootstrap-image --isolation=simple --install rpmdevtools git rpm-build cmake python gcc openssl-devel sudo mock -r ${config} --use-bootstrap-image --isolation=simple --copyin "$(pwd)" "$(pwd)/${spec_file}" /tmp sudo mock -r ${config} --use-bootstrap-image --isolation=simple --cwd "/tmp/${build_dir}" --chroot -- /bin/sh -c "( python build/calc_release_version.py | sed -E 's/([^-]+).*/\1/' > VERSION_CURRENT ; python build/calc_release_version.py -p > VERSION_RELEASED )" sudo mock -r ${config} --use-bootstrap-image --isolation=simple --copyout "/tmp/${build_dir}/VERSION_CURRENT" "/tmp/${build_dir}/VERSION_RELEASED" . bare_upstream_version=$(rpmspec --srpm -q --qf '%{version}' "$spec_file") # Upstream version in the .spec file cannot have hyphen (-); replace the current # version so that the dist tarball version does not have a pre-release component sudo sh -c "echo ${bare_upstream_version} > VERSION_CURRENT" echo "Found bare upstream version: ${bare_upstream_version}" git_rev="$(git rev-parse --short HEAD)" snapshot_version="${bare_upstream_version}-0.$(date +%Y%m%d)+git${git_rev}" echo "Upstream snapshot version: ${snapshot_version}" current_package_version=$(rpmspec --srpm -q --qf "%{version}-%{release}" ${spec_file}) if [ -n "${current_package_version##*${git_rev}*}" ]; then echo "Making RPM changelog entry" sudo mock -r ${config} --use-bootstrap-image --isolation=simple --cwd "/tmp/${build_dir}" --chroot -- rpmdev-bumpspec --comment="Built from Git Snapshot." --userstring="Test User " --new="${snapshot_version}%{?dist}" ${spec_file} fi sudo mock -r ${config} --use-bootstrap-image --isolation=simple --copyout "/tmp/${build_dir}/${spec_file}" .. [ -d ~/rpmbuild/SOURCES ] || mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} # Create a source archive for rpmbuild to use: expect_filename=$(rpmspec --srpm -q --qf '%{source}' "$spec_file") tar_filestem=$package-$bare_upstream_version tar_filename=$tar_filestem.tar tar_filepath="/tmp/$tar_filename" tgz_filepath="$HOME/rpmbuild/SOURCES/$expect_filename" echo "Creating source archive [$tgz_filepath]" # If Evergreen is running a patch build, changes have been git applied to the index. # Commit the changes to include them in the tarball. git commit -m "Include applied changes from a patch build" || true git archive --format=tar --output="$tar_filepath" --prefix="$tar_filestem/" HEAD mkdir -p "$tar_filestem" cp VERSION_CURRENT "$tar_filestem/." tar -rf "$tar_filepath" "$tar_filestem/" gzip --keep "$tar_filepath" --stdout > "$tgz_filepath" echo "Building source RPM ..." rpmbuild -bs ${spec_file} echo "Building binary RPMs ..." mock_result=$(readlink -f ../mock-result) sudo mock --resultdir="${mock_result}" --use-bootstrap-image --isolation=simple -r ${config} --no-clean --no-cleanup-after --rebuild ~/rpmbuild/SRPMS/${package}-${snapshot_version}*.src.rpm || ( cd "${mock_result}" ; cat *.log ; exit 1 ) sudo mock -r ${config} --use-bootstrap-image --isolation=simple --copyin "${mock_result}" /tmp sudo mock -r ${config} --use-bootstrap-image --isolation=simple --cwd "/tmp/${build_dir}" --chroot -- /bin/sh -c "( rpm -Uvh ../mock-result/*.rpm && gcc -I/usr/include/libmongoc-1.0 -I/usr/include/libbson-1.0 -o example-client src/libmongoc/examples/example-client.c -lmongoc-1.0 -lbson-1.0 )" if [ ! -e "${mock_root}/tmp/${build_dir}/example-client" ]; then echo "Example was not built!" sudo mock -r ${config} --use-bootstrap-image --isolation=simple --clean exit 1 fi sudo mock -r ${config} --use-bootstrap-image --isolation=simple --clean (cd "${mock_result}" ; tar zcvf ../rpm.tar.gz *.rpm) mongo-c-driver-1.26.0/.evergreen/scripts/bypass-dlclose.sh000066400000000000000000000025251456567454500234700ustar00rootroot00000000000000#!/usr/bin/env bash # bypass_dlclose # # Usage: # bypass_dlclose command args... # # Parameters: # "$CC": compiler to use to compile and link the bypass_dlclose library. # # Return 0 (true) if able to create a shared library to bypass calls to dlclose. # Return a non-zero (false) value otherwise. # # If successful, print paths to add to LD_PRELOAD to stdout (pipe 1). # Otherwise, no output is printed to stdout (pipe 1). # # Diagnostic messages may be printed to stderr (pipe 2). Redirect to /dev/null # with `2>/dev/null` to silence these messages. bypass_dlclose() ( : "${CC:?'bypass_dlclose expects environment variable CC to be defined!'}" declare ld_preload { declare tmp if ! tmp="$(mktemp -d)"; then echo "Could not create temporary directory for bypass_dlclose library!" 1>&2 return 1 fi echo "int dlclose (void *handle) {(void) handle; return 0; }" \ >|"${tmp}/bypass_dlclose.c" || return "${CC}" -o "${tmp}/bypass_dlclose.so" \ -shared "${tmp}/bypass_dlclose.c" || return ld_preload="${tmp}/bypass_dlclose.so" # Clang uses its own libasan.so; do not preload it! if [ "${CC}" != "clang" ]; then declare asan_path asan_path="$(${CC} -print-file-name=libasan.so)" || return ld_preload="${asan_path}:${ld_preload}" fi } 1>&2 printf "%s" "${ld_preload}" ) mongo-c-driver-1.26.0/.evergreen/scripts/check-files.py000066400000000000000000000041661456567454500227420ustar00rootroot00000000000000#!/usr/bin/env python3 # Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Check that there are no missing .c or .h files in the release tarball. """ import os import re import sys if len(sys.argv) != 3: print("Usage: python check_files.py" " " " ") sys.exit(1) REPO_SRC_DIR = sys.argv[1] TAR_SRC_DIR = sys.argv[2] pattern = re.compile(r".*\.(c|h)$") repo_src_files = set() tar_src_files = set() # Files that are generated by cmake are expected not to be in the repository. cmake_produced = [ "libbson/src/bson/bson-version.h", "libmongoc/src/mongoc/mongoc-version.h", "zlib-1.2.13/zconf.h", ] for root, dirs, files in os.walk(REPO_SRC_DIR): for file in files: relpath = os.path.relpath(os.path.join(root, file), REPO_SRC_DIR) if pattern.match(relpath): repo_src_files.add(relpath) for root, dirs, files in os.walk(TAR_SRC_DIR): for file in files: relpath = os.path.relpath(os.path.join(root, file), TAR_SRC_DIR) if relpath in cmake_produced: continue if pattern.match(relpath): tar_src_files.add(relpath) if tar_src_files != repo_src_files: print("Files produced from tarball differ from repository") print("Tarball produced the following files NOT in repository") for file in sorted(tar_src_files.difference(repo_src_files)): print(" " + file) print("Repository has the following files NOT in tarball") for file in sorted(repo_src_files.difference(tar_src_files)): print(" " + file) sys.exit(1) mongo-c-driver-1.26.0/.evergreen/scripts/check-installed-files-bson.bat000066400000000000000000000035021456567454500257650ustar00rootroot00000000000000rem Validations shared by link-sample-program-msvc-bson.bat and rem link-sample-program-mingw-bson.bat echo off rem Notice that the dll goes in "bin". set DLL=%INSTALL_DIR%\bin\bson-1.0.dll set LIB_DLL=%INSTALL_DIR%\bin\libbson-1.0.dll set LIB_LIB=%INSTALL_DIR%\lib\libbson-1.0.lib if "%MINGW%"=="1" ( if not exist %LIB_DLL% ( echo %LIB_DLL% is missing! exit /B 1 ) else ( echo libbson-1.0.dll check ok ) if exist %DLL% ( echo %DLL% is present and should not be! exit /B 1 ) ) else ( if not exist %DLL% ( echo %DLL% is missing! exit /B 1 ) else ( echo bson-1.0.dll check ok ) if exist %LIB_LIB% ( echo %LIB_LIB% is present and should not be! exit /B 1 ) else ( echo libbson-1.0.lib check ok ) ) if not exist %INSTALL_DIR%\lib\pkgconfig\libbson-1.0.pc ( echo libbson-1.0.pc missing! exit /B 1 ) else ( echo libbson-1.0.pc check ok ) if not exist %INSTALL_DIR%\lib\cmake\bson-1.0\bson-1.0-config.cmake ( echo bson-1.0-config.cmake missing! exit /B 1 ) else ( echo bson-1.0-config.cmake check ok ) if not exist %INSTALL_DIR%\lib\cmake\bson-1.0\bson-1.0-config-version.cmake ( echo bson-1.0-config-version.cmake missing! exit /B 1 ) else ( echo bson-1.0-config-version.cmake check ok ) if not exist %INSTALL_DIR%\lib\cmake\bson-1.0\bson-targets.cmake ( echo bson-targets.cmake missing! exit /B 1 ) else ( echo bson-targets.cmake check ok ) if "%LINK_STATIC%"=="1" ( if not exist %INSTALL_DIR%\lib\pkgconfig\libbson-static-1.0.pc ( echo libbson-static-1.0.pc missing! exit /B 1 ) else ( echo libbson-static-1.0.pc check ok ) ) else ( if exist %INSTALL_DIR%\lib\pkgconfig\libbson-static-1.0.pc ( echo libbson-static-1.0.pc should not have been installed! exit /B 1 ) else ( echo libbson-static-1.0.pc missing, as expected ) ) echo on mongo-c-driver-1.26.0/.evergreen/scripts/check-installed-files.bat000066400000000000000000000031471456567454500250330ustar00rootroot00000000000000rem Validations shared by link-sample-program-msvc.bat and rem link-sample-program-mingw.bat echo off rem Notice that the dll goes in "bin". set DLL=%INSTALL_DIR%\bin\mongoc-1.0.dll set LIB_DLL=%INSTALL_DIR%\bin\libmongoc-1.0.dll set LIB_LIB=%INSTALL_DIR%\lib\libmongoc-1.0.lib if "%MINGW%"=="1" ( if not exist %LIB_DLL% ( echo %LIB_DLL% is missing! exit /B 1 ) else ( echo libmongoc-1.0.dll check ok ) if exist %DLL% ( echo %DLL% is present and should not be! exit /B 1 ) ) else ( if not exist %DLL% ( echo %DLL% is missing! exit /B 1 ) else ( echo mongoc-1.0.dll check ok ) if exist %LIB_LIB% ( echo %LIB_LIB% is present and should not be! exit /B 1 ) else ( echo libmongoc-1.0.lib check ok ) ) if not exist %INSTALL_DIR%\lib\pkgconfig\libmongoc-1.0.pc ( echo libmongoc-1.0.pc missing! exit /B 1 ) else ( echo libmongoc-1.0.pc check ok ) if not exist %INSTALL_DIR%\lib\cmake\mongoc-1.0\mongoc-1.0-config.cmake ( echo mongoc-1.0-config.cmake missing! exit /B 1 ) else ( echo mongoc-1.0-config.cmake check ok ) if not exist %INSTALL_DIR%\lib\cmake\mongoc-1.0\mongoc-1.0-config-version.cmake ( echo mongoc-1.0-config-version.cmake missing! exit /B 1 ) else ( echo mongoc-1.0-config-version.cmake check ok ) if not exist %INSTALL_DIR%\lib\cmake\mongoc-1.0\mongoc-targets.cmake ( echo mongoc-targets.cmake missing! exit /B 1 ) else ( echo mongoc-targets.cmake check ok ) if not exist %INSTALL_DIR%\lib\pkgconfig\libmongoc-static-1.0.pc ( echo libmongoc-static-1.0.pc missing! exit /B 1 ) else ( echo libmongoc-static-1.0.pc check ok ) echo on mongo-c-driver-1.26.0/.evergreen/scripts/check-preludes.py000066400000000000000000000042251456567454500234570ustar00rootroot00000000000000#!/usr/bin/env python3 # # Copyright 2019-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Check that public libbson/libmongoc headers all include the prelude line. """ import sys from pathlib import Path if len(sys.argv) != 2: print("Usage: python check-preludes.py ") sys.exit(1) MONGOC_PREFIX = Path("src/libmongoc/src/mongoc") BSON_PREFIX = Path("src/libbson/src/bson") COMMON_PREFIX = Path("src/common") checks = [ { "name": "libmongoc", "headers": list(MONGOC_PREFIX.glob("mongoc-*.h")), "exclusions": [ MONGOC_PREFIX / "mongoc-prelude.h", MONGOC_PREFIX / "mongoc.h", ], "include": '#include "mongoc-prelude.h"', }, { "name": "libbson", "headers": list(BSON_PREFIX.glob("*.h")), "exclusions": [ BSON_PREFIX / "bson-dsl.h", BSON_PREFIX / "bson-prelude.h", BSON_PREFIX / "bson.h", ], "include": "#include ", }, { "name": "common", "headers": list(COMMON_PREFIX.glob("*.h")), "exclusions": [COMMON_PREFIX / "common-prelude.h"], "include": '#include "common-prelude.h"', }, ] for check in checks: NAME = check["name"] print(f"Checking headers for {NAME}") assert len(check["headers"]) > 0 for header in check["headers"]: if header in check["exclusions"]: continue lines = Path(header).read_text(encoding="utf-8").splitlines() if check["include"] not in lines: print(f"{header} did not include prelude") sys.exit(1) print("All checks passed") mongo-c-driver-1.26.0/.evergreen/scripts/check-public-decls.sh000077500000000000000000000016271456567454500241720ustar00rootroot00000000000000#!/usr/bin/env bash # regex to match public headers. declare pattern pattern="\.\/src\/libmongoc\/src\/mongoc\/mongoc.*[^private]\.h$" # public headers we expect not to have BSON_BEGIN_DECLS and BSON_END_DECLS. declare exclude exclude="\.\/src\/libmongoc\/src\/mongoc\/mongoc-macros.h|.\/src\/libmongoc\/src\/mongoc\/mongoc.h" # get all public headers. find ./src/libmongoc/src/mongoc -regex $pattern -regextype posix-extended -not -regex $exclude | sort >/tmp/public_headers.txt # get all public headers with BSON_BEGIN_DECLS. find ./src/libmongoc/src/mongoc -regex $pattern -regextype posix-extended -not -regex $exclude | xargs grep -l "BSON_BEGIN_DECLS" | sort >/tmp/public_headers_with_extern_c.txt echo "checking if any public headers are missing 'extern C' declaration" # check if there's any diff. diff -y /tmp/public_headers.txt /tmp/public_headers_with_extern_c.txt # use return status of diff exit $? mongo-c-driver-1.26.0/.evergreen/scripts/check-symlink.sh000066400000000000000000000011031456567454500232740ustar00rootroot00000000000000check_symlink() { SYMLINK="$INSTALL_DIR/lib/$1" EXPECTED_TARGET="$2" if test ! -L "$SYMLINK"; then echo "$SYMLINK should be a symlink" exit 1 fi TARGET=$(readlink "$SYMLINK") if test ! -f $INSTALL_DIR/lib/$TARGET; then echo "$SYMLINK target $INSTALL_DIR/lib/$TARGET is missing!" exit 1 else echo "$SYMLINK target $INSTALL_DIR/lib/$TARGET check ok" fi if [ "$TARGET" != "$EXPECTED_TARGET" ]; then echo "$SYMLINK should symlink to $EXPECTED_TARGET, not to $TARGET" exit 1 else echo "$SYMLINK links to correct filename" fi } mongo-c-driver-1.26.0/.evergreen/scripts/cmake.sh000077500000000000000000000001761456567454500216270ustar00rootroot00000000000000#!/usr/bin/env bash set -eu . "$(dirname "${BASH_SOURCE[0]}")/find-cmake-latest.sh" cmake=$(find_cmake_latest) $cmake "$@" mongo-c-driver-1.26.0/.evergreen/scripts/compile-libmongocrypt.sh000077500000000000000000000025561456567454500250710ustar00rootroot00000000000000#!/usr/bin/env bash compile_libmongocrypt() { declare -r cmake_binary="${1:?}" declare -r mongoc_dir="${2:?}" declare -r install_dir="${3:?}" # When updating libmongocrypt, consider also updating the copy of # libmongocrypt's kms-message in `src/kms-message`. Run # `.evergreen/scripts/kms-divergence-check.sh` to ensure that there is no # divergence in the copied files. # TODO: once 1.9.0 is released (containing MONGOCRYPT-605) replace the following with: # git clone -q --depth=1 https://github.com/mongodb/libmongocrypt --branch 1.9.0 || return { git clone -q https://github.com/mongodb/libmongocrypt || return # Check out commit containing MONGOCRYPT-605 git -C libmongocrypt checkout c87cc3489c9a68875ff7fab541154841469991fb } declare -a crypt_cmake_flags=( "-DMONGOCRYPT_MONGOC_DIR=${mongoc_dir}" "-DBUILD_TESTING=OFF" "-DENABLE_ONLINE_TESTS=OFF" "-DENABLE_MONGOC=OFF" "-DBUILD_VERSION=1.9.0-pre" ) DEBUG="0" \ CMAKE_EXE="${cmake_binary}" \ MONGOCRYPT_INSTALL_PREFIX=${install_dir} \ DEFAULT_BUILD_ONLY=true \ LIBMONGOCRYPT_EXTRA_CMAKE_FLAGS="${crypt_cmake_flags[*]}" \ ./libmongocrypt/.evergreen/compile.sh || return } : "${1:?"missing path to CMake binary"}" : "${2:?"missing path to mongoc directory"}" : "${3:?"missing path to install directory"}" compile_libmongocrypt "${1}" "${2}" "${3}" mongo-c-driver-1.26.0/.evergreen/scripts/compile-openssl-static.sh000077500000000000000000000053501456567454500251440ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt CC check_var_opt MARCH declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" declare cmake_prefix_path="${install_dir}" if [[ -n "${EXTRA_CMAKE_PREFIX_PATH:-}" ]]; then cmake_prefix_path+=";${EXTRA_CMAKE_PREFIX_PATH}" fi declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } configure_flags_append "-DCMAKE_SKIP_RPATH=TRUE" # Avoid hardcoding absolute paths to dependency libraries. configure_flags_append "-DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF" configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" configure_flags_append "-DENABLE_SSL=OPENSSL" configure_flags_append "-DOPENSSL_USE_STATIC_LIBS=ON" declare -a flags case "${MARCH}" in i686) flags+=("-m32" "-march=i386") ;; esac case "${HOSTTYPE}" in s390x) flags+=("-march=z196" "-mtune=zEC12") ;; x86_64) flags+=("-m64" "-march=x86-64") ;; powerpc64le) flags+=("-mcpu=power8" "-mtune=power8" "-mcmodel=medium") ;; esac # CMake and compiler environment variables. export CC export CXX export CFLAGS export CXXFLAGS CFLAGS+=" ${flags+${flags[*]}}" CXXFLAGS+=" ${flags+${flags[*]}}" if [[ "${OSTYPE}" == darwin* ]]; then CFLAGS+=" -Wno-unknown-pragmas" fi case "${CC}" in clang) CXX=clang++ ;; gcc) CXX=g++ ;; esac if [[ "${OSTYPE}" == darwin* && "${HOSTTYPE}" == "arm64" ]]; then configure_flags_append "-DCMAKE_OSX_ARCHITECTURES=arm64" fi # Ensure find-cmake-latest.sh is sourced *before* add-build-dirs-to-paths.sh # to avoid interfering with potential CMake build configuration. # shellcheck source=.evergreen/scripts/find-cmake-latest.sh . "${script_dir}/find-cmake-latest.sh" # ${CMAKE} CMAKE=$(find_cmake_latest) # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" export PKG_CONFIG_PATH PKG_CONFIG_PATH="${install_dir}/lib/pkgconfig:${PKG_CONFIG_PATH:-}" if [[ "${OSTYPE}" == darwin* ]]; then # MacOS does not have nproc. nproc() { sysctl -n hw.logicalcpu } fi # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$(pwd)" CCACHE_NOHASHDIR=1 "${CMAKE}" "${configure_flags[@]}" . "${CMAKE}" --build . -- -j "$(nproc)" mongo-c-driver-1.26.0/.evergreen/scripts/compile-scan-build.sh000066400000000000000000000125641456567454500242170ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" declare cmake_prefix_path="${install_dir}" declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } configure_flags_append "-DCMAKE_PREFIX_PATH=${cmake_prefix_path}" configure_flags_append "-DCMAKE_SKIP_RPATH=TRUE" # Avoid hardcoding absolute paths to dependency libraries. configure_flags_append "-DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF" configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=ON" configure_flags_append "-DENABLE_DEBUG_ASSERTIONS=ON" configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" configure_flags_append "-DENABLE_SASL=OFF" configure_flags_append "-DENABLE_SNAPPY=OFF" configure_flags_append "-DENABLE_SSL=AUTO" # For Client Side Encryption. configure_flags_append "-DENABLE_ZLIB=OFF" configure_flags_append "-DENABLE_ZSTD=OFF" if [[ "${OSTYPE:?}" == darwin* ]]; then # Prevent CMake from confusing custom LLVM linker with Apple LLVM linker: # ld64.lld: warning: ignoring unknown argument: -search_paths_first # ld64.lld: warning: ignoring unknown argument: -headerpad_max_install_names # ld64.lld: warning: -sdk_version is required when emitting min version load command configure_flags_append "-DMONGO_USE_LLD=OFF" fi declare -a flags case "${MARCH:-}" in i686) flags+=("-m32" "-march=i386") ;; esac case "${HOSTTYPE:-}" in s390x) flags+=("-march=z196" "-mtune=zEC12") ;; x86_64) flags+=("-m64" "-march=x86-64") ;; powerpc64le) flags+=("-mcpu=power8" "-mtune=power8" "-mcmodel=medium") ;; esac # CMake and compiler environment variables. export CC export CXX export CFLAGS export CXXFLAGS CFLAGS+=" ${flags+${flags[*]}}" CXXFLAGS+=" ${flags+${flags[*]}}" if [[ "${OSTYPE}" == darwin* ]]; then CFLAGS+=" -Wno-unknown-pragmas" fi if [[ "${OSTYPE}" == darwin* && "${HOSTTYPE}" == "arm64" ]]; then configure_flags_append "-DCMAKE_OSX_ARCHITECTURES=arm64" fi # Ensure find-cmake-latest.sh is sourced *before* add-build-dirs-to-paths.sh # to avoid interfering with potential CMake build configuration. # shellcheck source=.evergreen/scripts/find-cmake-latest.sh . "${script_dir}/find-cmake-latest.sh" cmake_binary="$(find_cmake_latest)" "${cmake_binary:?}" --version # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" export PKG_CONFIG_PATH PKG_CONFIG_PATH="${install_dir}/lib/pkgconfig:${PKG_CONFIG_PATH:-}" echo "Installing libmongocrypt..." # shellcheck source=.evergreen/scripts/compile-libmongocrypt.sh "${script_dir}/compile-libmongocrypt.sh" "${cmake_binary}" "${mongoc_dir}" "${install_dir}" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt... done." # scan-build binary is available in different locations depending on the distro. # Search for a match in order of preference as listed. declare -a scan_build_directories # Prioritize Apple LLVM on MacOS to avoid confusing CMake with inconsistent # compilers and linkers. if [[ -d /usr/local/Cellar/llvm ]]; then for dir in /opt/homebrew/Cellar/llvm /usr/local/Cellar/llvm; do # Max depth: llvm/bin/scan-build. Sort: prefer newer versions. for bin in $(find "${dir}" -maxdepth 3 -name 'scan-build' 2>/dev/null | sort -rV); do if command -v "${bin}"; then scan_build_directories+=("$(dirname "${bin}")") fi done done fi scan_build_directories+=( # Prefer toolchain scan-build if available. "/opt/mongodbtoolchain/v4/bin" "/opt/mongodbtoolchain/v3/bin" # Use system scan-build otherwise. "/usr/bin" ) declare scan_build_binary for dir in "${scan_build_directories[@]}"; do if command -v "${dir}/scan-build" && command -v "${dir}/clang" && command -v "${dir}/clang++"; then # Ensure compilers are consistent with scan-build binary. All three binaries # should be present in the same directory. scan_build_binary="${dir}/scan-build" CC="${dir}/clang" CXX="${dir}/clang++" break fi done : "${scan_build_binary:?"could not find a scan-build binary!"}" # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$(pwd)" CCACHE_NOHASHDIR=1 "${scan_build_binary}" --use-cc="${CC}" --use-c++="${CXX}" "${cmake_binary}" "${configure_flags[@]}" . if [[ "${OSTYPE}" == darwin* ]]; then # MacOS does not have nproc. nproc() { sysctl -n hw.logicalcpu; } fi # If scan-build emits warnings, continue the task and upload scan results before marking task as a failure. declare -r continue_command='{"status":"failed", "type":"test", "should_continue":true, "desc":"scan-build emitted one or more warnings or errors"}' # Put clang static analyzer results in scan/ and fail build if warnings found. "${scan_build_binary}" --use-cc="${CC}" --use-c++="${CXX}" -o scan --status-bugs "${cmake_binary}" --build . -- -j "$(nproc)" || curl -sS -d "${continue_command}" -H "Content-Type: application/json" -X POST localhost:2285/task_status mongo-c-driver-1.26.0/.evergreen/scripts/compile-std.sh000077500000000000000000000071661456567454500227750ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req CC check_var_opt C_STD_VERSION check_var_opt CFLAGS check_var_opt MARCH declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } configure_flags_append "-DCMAKE_PREFIX_PATH=${install_dir}" configure_flags_append "-DCMAKE_SKIP_RPATH=TRUE" # Avoid hardcoding absolute paths to dependency libraries. configure_flags_append "-DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF" configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=ON" configure_flags_append "-DENABLE_DEBUG_ASSERTIONS=ON" configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" configure_flags_append_if_not_null C_STD_VERSION "-DCMAKE_C_STANDARD=${C_STD_VERSION}" if [[ "${OSTYPE}" == darwin* && "${HOSTTYPE}" == "arm64" ]]; then configure_flags_append "-DCMAKE_OSX_ARCHITECTURES=arm64" fi if [[ "${CC}" =~ ^"Visual Studio " ]]; then # Avoid C standard conformance issues with Windows 10 SDK headers. # See: https://developercommunity.visualstudio.com/t/stdc17-generates-warning-compiling-windowsh/1249671#T-N1257345 configure_flags_append "-DCMAKE_SYSTEM_VERSION=10.0.20348.0" fi declare -a flags if [[ ! "${CC}" =~ ^"Visual Studio " ]]; then case "${MARCH}" in i686) flags+=("-m32" "-march=i386") ;; esac case "${HOSTTYPE}" in s390x) flags+=("-march=z196" "-mtune=zEC12") ;; x86_64) flags+=("-m64" "-march=x86-64") ;; powerpc64le) flags+=("-mcpu=power8" "-mtune=power8" "-mcmodel=medium") ;; esac fi if [[ "${CC}" =~ ^"Visual Studio " ]]; then # Even with -DCMAKE_SYSTEM_VERSION=10.0.20348.0, winbase.h emits conformance warnings. flags+=('/wd5105') fi # CMake and compiler environment variables. export CC export CXX export CFLAGS export CXXFLAGS CFLAGS+=" ${flags+${flags[*]}}" CXXFLAGS+=" ${flags+${flags[*]}}" if [[ "${OSTYPE}" == darwin* ]]; then CFLAGS+=" -Wno-unknown-pragmas" fi case "${CC}" in clang) CXX=clang++ ;; gcc) CXX=g++ ;; esac # Ensure find-cmake-latest.sh is sourced *before* add-build-dirs-to-paths.sh # to avoid interfering with potential CMake build configuration. # shellcheck source=.evergreen/scripts/find-cmake-latest.sh . "${script_dir}/find-cmake-latest.sh" declare cmake_binary cmake_binary="$(find_cmake_latest)" # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" export PKG_CONFIG_PATH PKG_CONFIG_PATH="${install_dir}/lib/pkgconfig:${PKG_CONFIG_PATH:-}" if [[ "${OSTYPE}" == darwin* ]]; then # MacOS does not have nproc. nproc() { sysctl -n hw.logicalcpu } fi echo "Installing libmongocrypt..." # shellcheck source=.evergreen/scripts/compile-libmongocrypt.sh "${script_dir}/compile-libmongocrypt.sh" "${cmake_binary}" "${mongoc_dir}" "${install_dir}" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt... done." echo "CFLAGS: ${CFLAGS}" echo "configure_flags: ${configure_flags[*]}" # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$(pwd)" CCACHE_NOHASHDIR=1 "${cmake_binary}" "${configure_flags[@]}" . "${cmake_binary}" --build . mongo-c-driver-1.26.0/.evergreen/scripts/compile-test-azurekms.sh000077500000000000000000000021401456567454500250040ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset # Working directory is expected to be mongo-c-driver repo. ROOT=$(pwd) INSTALL_DIR=$ROOT/install . .evergreen/scripts/find-cmake-latest.sh declare cmake_binary cmake_binary="$(find_cmake_latest)" echo "Installing libmongocrypt ... begin" .evergreen/scripts/compile-libmongocrypt.sh "${cmake_binary}" "$ROOT" "$INSTALL_DIR" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt ... end" # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$(pwd)" CCACHE_NOHASHDIR=1 echo "Compile test-azurekms ... begin" # Disable unnecessary dependencies. test-azurekms is copied to a remote host for testing, which may not have all dependent libraries. "${cmake_binary}" \ -DENABLE_SASL=OFF \ -DENABLE_SNAPPY=OFF \ -DENABLE_ZSTD=OFF \ -DENABLE_ZLIB=OFF \ -DENABLE_SRV=OFF \ -DENABLE_CLIENT_SIDE_ENCRYPTION=ON \ -DCMAKE_PREFIX_PATH="$INSTALL_DIR" \ . "${cmake_binary}" --build . --target test-azurekms echo "Compile test-azurekms ... end" mongo-c-driver-1.26.0/.evergreen/scripts/compile-test-gcpkms.sh000077500000000000000000000021301456567454500244260ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset # Working directory is expected to be mongo-c-driver repo. ROOT=$(pwd) INSTALL_DIR=$ROOT/install . .evergreen/scripts/find-cmake-latest.sh declare cmake_binary cmake_binary="$(find_cmake_latest)" echo "Installing libmongocrypt ... begin" .evergreen/scripts/compile-libmongocrypt.sh "${cmake_binary}" "$ROOT" "$INSTALL_DIR" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt ... end" # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$(pwd)" CCACHE_NOHASHDIR=1 echo "Compile test-gcpkms ... begin" # Disable unnecessary dependencies. test-gcpkms is copied to a remote host for testing, which may not have all dependent libraries. "${cmake_binary}" \ -DENABLE_SASL=OFF \ -DENABLE_SNAPPY=OFF \ -DENABLE_ZSTD=OFF \ -DENABLE_ZLIB=OFF \ -DENABLE_SRV=OFF \ -DENABLE_CLIENT_SIDE_ENCRYPTION=ON \ -DCMAKE_PREFIX_PATH="$INSTALL_DIR" \ . "${cmake_binary}" --build . --target test-gcpkms echo "Compile test-gcpkms ... end" mongo-c-driver-1.26.0/.evergreen/scripts/compile-unix.sh000077500000000000000000000146601456567454500231630ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt BYPASS_FIND_CMAKE "OFF" check_var_opt C_STD_VERSION # CMake default: 99. check_var_opt CC check_var_opt CFLAGS check_var_opt CHECK_LOG "OFF" check_var_opt COMPILE_LIBMONGOCRYPT "OFF" check_var_opt COVERAGE # CMake default: OFF. check_var_opt CXXFLAGS check_var_opt DEBUG "OFF" check_var_opt ENABLE_SHM_COUNTERS # CMake default: AUTO. check_var_opt EXTRA_CMAKE_PREFIX_PATH check_var_opt EXTRA_CONFIGURE_FLAGS check_var_opt ENABLE_RDTSCP "OFF" check_var_opt MARCH check_var_opt RELEASE "OFF" check_var_opt SANITIZE check_var_opt SASL "OFF" # CMake default: AUTO. check_var_opt SNAPPY # CMake default: AUTO. check_var_opt SRV # CMake default: AUTO. check_var_opt SSL "OFF" # CMake default: AUTO. check_var_opt TRACING # CMake default: OFF. check_var_opt ZLIB "BUNDLED" # CMake default: AUTO. check_var_opt ZSTD # CMake default: AUTO. declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" declare cmake_prefix_path="${install_dir}" if [[ -n "${EXTRA_CMAKE_PREFIX_PATH:-}" ]]; then cmake_prefix_path+=";${EXTRA_CMAKE_PREFIX_PATH}" fi declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } ## * Note: For additional configure-time context, the following lines can be ## * uncommented to enable CMake's debug output: # configure_flags_append --log-level=debug # configure_flags_append --log-context configure_flags_append "-DCMAKE_INSTALL_PREFIX=${install_dir}" configure_flags_append "-DCMAKE_PREFIX_PATH=${cmake_prefix_path}" configure_flags_append "-DCMAKE_SKIP_RPATH=TRUE" # Avoid hardcoding absolute paths to dependency libraries. configure_flags_append "-DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF" configure_flags_append "-DENABLE_HTML_DOCS=OFF" configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" configure_flags_append "-DENABLE_MAN_PAGES=OFF" configure_flags_append_if_not_null C_STD_VERSION "-DCMAKE_C_STANDARD=${C_STD_VERSION}" configure_flags_append_if_not_null ENABLE_RDTSCP "-DENABLE_RDTSCP=${ENABLE_RDTSCP}" configure_flags_append_if_not_null ENABLE_SHM_COUNTERS "-DENABLE_SHM_COUNTERS=${ENABLE_SHM_COUNTERS}" configure_flags_append_if_not_null SANITIZE "-DMONGO_SANITIZE=${SANITIZE}" configure_flags_append_if_not_null SASL "-DENABLE_SASL=${SASL}" configure_flags_append_if_not_null SNAPPY "-DENABLE_SNAPPY=${SNAPPY}" configure_flags_append_if_not_null SRV "-DENABLE_SRV=${SRV}" configure_flags_append_if_not_null TRACING "-DENABLE_TRACING=${TRACING}" configure_flags_append_if_not_null ZLIB "-DENABLE_ZLIB=${ZLIB}" if [[ "${DEBUG}" == "ON" ]]; then configure_flags_append "-DCMAKE_BUILD_TYPE=Debug" else configure_flags_append "-DCMAKE_BUILD_TYPE=RelWithDebInfo" fi if [[ "${SSL}" == "OPENSSL_STATIC" ]]; then configure_flags_append "-DENABLE_SSL=OPENSSL" "-DOPENSSL_USE_STATIC_LIBS=ON" else configure_flags_append_if_not_null SSL "-DENABLE_SSL=${SSL}" fi if [[ "${COVERAGE}" == "ON" ]]; then configure_flags_append "-DENABLE_COVERAGE=ON" "-DENABLE_EXAMPLES=OFF" fi if [[ "${RELEASE}" != "ON" ]]; then configure_flags_append "-DENABLE_DEBUG_ASSERTIONS=ON" fi declare -a flags case "${MARCH}" in i686) flags+=("-m32" "-march=i386") ;; esac case "${HOSTTYPE}" in s390x) flags+=("-march=z196" "-mtune=zEC12") ;; x86_64) flags+=("-m64" "-march=x86-64") ;; powerpc64le) flags+=("-mcpu=power8" "-mtune=power8" "-mcmodel=medium") ;; esac # CMake and compiler environment variables. export CC export CXX export CFLAGS export CXXFLAGS CFLAGS+=" ${flags+${flags[*]}}" CXXFLAGS+=" ${flags+${flags[*]}}" if [[ "${OSTYPE}" == darwin* ]]; then CFLAGS+=" -Wno-unknown-pragmas" fi if [[ "${OSTYPE}" == darwin* && "${HOSTTYPE}" == "arm64" ]]; then configure_flags_append "-DCMAKE_OSX_ARCHITECTURES=arm64" fi case "${CC}" in clang) CXX=clang++ ;; gcc) CXX=g++ ;; esac declare cmake_binary if [[ "${BYPASS_FIND_CMAKE}" == "OFF" ]]; then # Ensure find-cmake-latest.sh is sourced *before* add-build-dirs-to-paths.sh # to avoid interfering with potential CMake build configuration. # shellcheck source=.evergreen/scripts/find-cmake-latest.sh . "${script_dir}/find-cmake-latest.sh" cmake_binary="$(find_cmake_latest)" else cmake_binary="cmake" fi "${cmake_binary:?}" --version # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" export PKG_CONFIG_PATH PKG_CONFIG_PATH="${install_dir}/lib/pkgconfig:${PKG_CONFIG_PATH:-}" if [[ -d "${openssl_install_dir}" ]]; then # Use custom SSL library if present. configure_flags_append "-DOPENSSL_ROOT_DIR=${openssl_install_dir}" PKG_CONFIG_PATH="${openssl_install_dir}/lib/pkgconfig:${PKG_CONFIG_PATH:-}" fi echo "SSL Version: $(pkg-config --modversion libssl 2>/dev/null || echo "N/A")" if [[ "${OSTYPE}" == darwin* ]]; then # MacOS does not have nproc. nproc() { sysctl -n hw.logicalcpu } fi declare -a extra_configure_flags IFS=' ' read -ra extra_configure_flags <<<"${EXTRA_CONFIGURE_FLAGS:-}" if [[ "${COMPILE_LIBMONGOCRYPT}" == "ON" ]]; then echo "Installing libmongocrypt..." # shellcheck source=.evergreen/scripts/compile-libmongocrypt.sh "${script_dir}/compile-libmongocrypt.sh" "${cmake_binary}" "${mongoc_dir}" "${install_dir}" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt... done." # Fail if the C driver is unable to find the installed libmongocrypt. configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=ON" else # Avoid symbol collisions with libmongocrypt installed via apt/yum. # Note: may be overwritten by ${EXTRA_CONFIGURE_FLAGS}. configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=OFF" fi # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$(pwd)" CCACHE_NOHASHDIR=1 "${cmake_binary}" "${configure_flags[@]}" ${extra_configure_flags[@]+"${extra_configure_flags[@]}"} . "${cmake_binary}" --build . -- -j "$(nproc)" "${cmake_binary}" --build . --target install mongo-c-driver-1.26.0/.evergreen/scripts/compile-windows.sh000077500000000000000000000106331456567454500236660ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o igncr # Ignore CR in this script for Windows compatibility. # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt BYPASS_FIND_CMAKE "OFF" check_var_opt C_STD_VERSION # CMake default: 99. check_var_opt CC "Visual Studio 15 2017 Win64" check_var_opt COMPILE_LIBMONGOCRYPT "OFF" check_var_opt DEBUG "OFF" check_var_opt EXTRA_CONFIGURE_FLAGS check_var_opt RELEASE "OFF" check_var_opt SASL "SSPI" # CMake default: AUTO. check_var_opt SNAPPY # CMake default: AUTO. check_var_opt SRV # CMake default: AUTO. check_var_opt SSL "WINDOWS" # CMake default: OFF. check_var_opt ZSTD # CMake default: AUTO. check_var_opt ZLIB # CMake default: AUTO. declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } declare install_dir="${mongoc_dir}/install-dir" ## * Note: For additional configure-time context, the following lines can be ## * uncommented to enable CMake's debug output: # configure_flags_append --log-level=debug # configure_flags_append --log-context configure_flags_append "-DCMAKE_INSTALL_PREFIX=$(native-path "${install_dir}")" configure_flags_append "-DCMAKE_PREFIX_PATH=$(native-path "${install_dir}")" configure_flags_append "-DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF" configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" configure_flags_append_if_not_null C_STD_VERSION "-DCMAKE_C_STANDARD=${C_STD_VERSION:-}" configure_flags_append_if_not_null SASL "-DENABLE_SASL=${SASL:-}" configure_flags_append_if_not_null SNAPPY "-DENABLE_SNAPPY=${SNAPPY:-}" configure_flags_append_if_not_null SRV "-DENABLE_SRV=${SRV:-}" configure_flags_append_if_not_null ZLIB "-DENABLE_ZLIB=${ZLIB:-}" if [[ "${DEBUG}" == "ON" ]]; then configure_flags_append "-DCMAKE_BUILD_TYPE=Debug" else configure_flags_append "-DCMAKE_BUILD_TYPE=RelWithDebInfo" fi if [ "${SSL}" == "OPENSSL_STATIC" ]; then configure_flags_append "-DENABLE_SSL=OPENSSL" "-DOPENSSL_USE_STATIC_LIBS=ON" else configure_flags_append "-DENABLE_SSL=${SSL}" fi declare -a extra_configure_flags IFS=' ' read -ra extra_configure_flags <<<"${EXTRA_CONFIGURE_FLAGS:-}" declare build_config if [[ "${RELEASE}" == "ON" ]]; then build_config="RelWithDebInfo" else build_config="Debug" configure_flags_append "-DENABLE_DEBUG_ASSERTIONS=ON" fi declare cmake_binary if [[ "${BYPASS_FIND_CMAKE:-}" == "OFF" ]]; then # shellcheck source=.evergreen/scripts/find-cmake-version.sh . "${script_dir}/find-cmake-latest.sh" cmake_binary="$(find_cmake_latest)" else cmake_binary="cmake" fi "${cmake_binary:?}" --version if [[ "${CC}" =~ mingw ]]; then # MinGW has trouble compiling src/cpp-check.cpp without some assistance. configure_flags_append "-DCMAKE_CXX_STANDARD=11" cmake_binary=$(native-path "$cmake_binary") build_dir=$(native-path "$mongoc_dir") env \ "CC=gcc" \ "CXX=g++" \ "$cmake_binary" \ -G "MinGW Makefiles" \ -D CMAKE_PREFIX_PATH="$(native-path "$install_dir/lib/cmake")" \ "${configure_flags[@]}" \ "${extra_configure_flags[@]}" \ -B "$build_dir" \ -S "$(native-path "$mongoc_dir")" env "$cmake_binary" --build "$build_dir" --parallel "$(nproc)" exit 0 fi declare compile_flags=( "/m" # Number of concurrent processes. No value=# of cpus ) if [ "${COMPILE_LIBMONGOCRYPT}" = "ON" ]; then echo "Installing libmongocrypt..." # shellcheck source=.evergreen/scripts/compile-libmongocrypt.sh "${script_dir}/compile-libmongocrypt.sh" "${cmake_binary}" "$(native-path "${mongoc_dir}")" "${install_dir}" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt... done." # Fail if the C driver is unable to find the installed libmongocrypt. configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=ON" fi "${cmake_binary}" -G "$CC" "${configure_flags[@]}" "${extra_configure_flags[@]}" "${cmake_binary}" --build . --target ALL_BUILD --config "${build_config}" -- "${compile_flags[@]}" "${cmake_binary}" --build . --target INSTALL --config "${build_config}" -- "${compile_flags[@]}" mongo-c-driver-1.26.0/.evergreen/scripts/compile.sh000077500000000000000000000002331456567454500221710ustar00rootroot00000000000000#!/usr/bin/env bash if [[ "${OSTYPE}" == "cygwin" ]]; then bash .evergreen/scripts/compile-windows.sh else bash .evergreen/scripts/compile-unix.sh fi mongo-c-driver-1.26.0/.evergreen/scripts/debian_package_build.sh000066400000000000000000000104571456567454500246230ustar00rootroot00000000000000#!/bin/sh # # Test libmongoc's Debian packaging scripts. # # Supported/used environment variables: # IS_PATCH If "true", this is an Evergreen patch build. set -o errexit on_exit () { if [ -e ./unstable-chroot/debootstrap/debootstrap.log ]; then echo "Dumping debootstrap.log (64-bit)" cat ./unstable-chroot/debootstrap/debootstrap.log fi if [ -e ./unstable-i386-chroot/debootstrap/debootstrap.log ]; then echo "Dumping debootstrap.log (32-bit)" cat ./unstable-i386-chroot/debootstrap/debootstrap.log fi } trap on_exit EXIT if [ "${IS_PATCH}" = "true" ]; then git diff HEAD -- . ':!debian' > ../upstream.patch git diff HEAD -- debian > ../debian.patch git clean -fdx git reset --hard HEAD if [ -s ../upstream.patch ]; then [ -d debian/patches ] || mkdir debian/patches mv ../upstream.patch debian/patches/ echo upstream.patch >> debian/patches/series git add debian/patches/* git commit -m 'Evergreen patch build - upstream changes' git log -n1 -p fi if [ -s ../debian.patch ]; then git apply --index ../debian.patch git commit -m 'Evergreen patch build - Debian packaging changes' git log -n1 -p fi fi cd .. git clone https://salsa.debian.org/installer-team/debootstrap.git debootstrap.git export DEBOOTSTRAP_DIR=`pwd`/debootstrap.git sudo -E ./debootstrap.git/debootstrap unstable ./unstable-chroot/ http://cdn-aws.deb.debian.org/debian cp -a mongoc ./unstable-chroot/tmp/ sudo chroot ./unstable-chroot /bin/bash -c "(\ apt-get install -y build-essential git-buildpackage fakeroot debhelper cmake libssl-dev pkg-config python3-sphinx python3-sphinx-design zlib1g-dev libsasl2-dev libsnappy-dev libzstd-dev libmongocrypt-dev libjs-mathjax libutf8proc-dev furo && \ chown -R root:root /tmp/mongoc && \ cd /tmp/mongoc && \ git clean -fdx && \ git reset --hard HEAD && \ python3 build/calc_release_version.py > VERSION_CURRENT && \ python3 build/calc_release_version.py -p > VERSION_RELEASED && \ git add --force VERSION_CURRENT VERSION_RELEASED && \ git commit VERSION_CURRENT VERSION_RELEASED -m 'Set current/released versions' && \ LANG=C /bin/bash ./debian/build_snapshot.sh && \ debc ../*.changes && \ dpkg -i ../*.deb && \ gcc -I/usr/include/libmongoc-1.0 -I/usr/include/libbson-1.0 -o example-client src/libmongoc/examples/example-client.c -lmongoc-1.0 -lbson-1.0 )" [ -e ./unstable-chroot/tmp/mongoc/example-client ] || (echo "Example was not built!" ; exit 1) (cd ./unstable-chroot/tmp/ ; tar zcvf ../../deb.tar.gz *.dsc *.orig.tar.gz *.debian.tar.xz *.build *.deb) # Build a second time, to ensure a "double build" works sudo chroot ./unstable-chroot /bin/bash -c "(\ cd /tmp/mongoc && \ rm -f example-client && \ git status --ignored && \ dpkg-buildpackage -b && dpkg-buildpackage -S )" # And now do it all again for 32-bit sudo -E ./debootstrap.git/debootstrap --arch i386 unstable ./unstable-i386-chroot/ http://cdn-aws.deb.debian.org/debian cp -a mongoc ./unstable-i386-chroot/tmp/ sudo chroot ./unstable-i386-chroot /bin/bash -c "(\ apt-get install -y build-essential git-buildpackage fakeroot debhelper cmake libssl-dev pkg-config python3-sphinx python3-sphinx-design zlib1g-dev libsasl2-dev libsnappy-dev libzstd-dev libmongocrypt-dev libjs-mathjax libutf8proc-dev furo && \ chown -R root:root /tmp/mongoc && \ cd /tmp/mongoc && \ git clean -fdx && \ git reset --hard HEAD && \ python3 build/calc_release_version.py > VERSION_CURRENT && \ python3 build/calc_release_version.py -p > VERSION_RELEASED && \ git add --force VERSION_CURRENT VERSION_RELEASED && \ git commit VERSION_CURRENT VERSION_RELEASED -m 'Set current/released versions' && \ LANG=C /bin/bash ./debian/build_snapshot.sh && \ debc ../*.changes && \ dpkg -i ../*.deb && \ gcc -I/usr/include/libmongoc-1.0 -I/usr/include/libbson-1.0 -o example-client src/libmongoc/examples/example-client.c -lmongoc-1.0 -lbson-1.0 )" [ -e ./unstable-i386-chroot/tmp/mongoc/example-client ] || (echo "Example was not built!" ; exit 1) (cd ./unstable-i386-chroot/tmp/ ; tar zcvf ../../deb-i386.tar.gz *.dsc *.orig.tar.gz *.debian.tar.xz *.build *.deb) # Build a second time, to ensure a "double build" works sudo chroot ./unstable-i386-chroot /bin/bash -c "(\ cd /tmp/mongoc && \ rm -f example-client && \ git status --ignored && \ dpkg-buildpackage -b && dpkg-buildpackage -S )" mongo-c-driver-1.26.0/.evergreen/scripts/debug-core-evergreen.sh000077500000000000000000000011571456567454500245430ustar00rootroot00000000000000#!/usr/bin/env bash if [[ "${OSTYPE}" == "cygwin" ]]; then echo "Skipping debug-core-evergreen.sh" exit fi shopt -s nullglob for i in *.core; do echo $i echo "backtrace full" | gdb -q ./src/libmongoc/test-libmongoc $i done # If there is still a test-libmongoc process running (perhaps due to # deadlock, or very slow test) attach a debugger and print stacks. TEST_LIBMONGOC_PID="$(pgrep test-libmongoc)" if [ -n "$TEST_LIBMONGOC_PID" ]; then echo "test-libmongoc processes still running with PID=$TEST_LIBMONGOC_PID" echo "backtrace full" | gdb -q -p $TEST_LIBMONGOC_PID kill $TEST_LIBMONGOC_PID fi mongo-c-driver-1.26.0/.evergreen/scripts/env-var-utils.sh000066400000000000000000000010171456567454500232530ustar00rootroot00000000000000#!/usr/bin/env bash # Usage: # print_var X print_var() { printf "%s: %s\n" "${1:?"print_var requires a variable to print"}" "${!1:-}" } # Usage: # check_var_opt X # check_var_opt X "default value" check_var_opt() { : "${1:?"check_var_opt requires a variable to check"}" printf -v "${1}" "%s" "${!1:-"${2:-}"}" print_var "${1}" } # Usage: # check_var_req X check_var_req() { : "${1:?"check_var_req requires a variable to check"}" : "${!1:?"required variable ${1} is unset or null!"}" print_var "${1}" } mongo-c-driver-1.26.0/.evergreen/scripts/find-cmake-latest.sh000066400000000000000000000005371456567454500240350ustar00rootroot00000000000000#!/usr/bin/env bash find_cmake_latest() { . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths || return declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" || return # shellcheck source=.evergreen/scripts/find-cmake-version.sh . "${script_dir}/find-cmake-version.sh" || return find_cmake_version 3 25 3 } mongo-c-driver-1.26.0/.evergreen/scripts/find-cmake-version.sh000077500000000000000000000212251456567454500242260ustar00rootroot00000000000000#!/usr/bin/env bash # Used to workaround curl certificate validation failures on certain distros. . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" platform download # Create a temporary directory in the existing directory $1. make_tmpdir_in() { declare -r target_dir="${1:?"missing path to target directory"}" if [[ ! -d "${target_dir}" ]]; then echo "make_tmpdir_in: target directory ${target_dir} does not exist!" 1>&2 return 1 fi declare tmpdir { if [[ "${OSTYPE:?}" == darwin* ]]; then # mktemp on MacOS does not support -p. tmpdir="$(mktemp -d)" || return declare tmpbase tmpbase="$(basename "${tmpdir}")" || return mv -f "${tmpdir}" "${target_dir}" || return tmpdir="${target_dir}/${tmpbase}" || return else tmpdir="$(mktemp -d -p "${target_dir}")" || return fi } 1>&2 printf "%s" "${tmpdir}" } # Identify the cache directory to use on the current distro. local_cache_dir() { declare res case "${OSTYPE:?}" in cygwin) res="$(cygpath -au "${LOCALAPPDATA:?}")" || return ;; darwin*) res="${HOME:?}/Library/Caches" ;; linux*) res="${HOME:?}/.cache" ;; esac : "${res:?"unrecognized operating system ${OSTYPE:?}"}" printf "%s" "${res:?}" } # Ensure "good enough" atomicity when two or more tasks running on the same host # attempt to install a version of CMake. cmake_replace_version() { declare -r cache="${1:?"missing path to cache directory"}" declare -r root="${2:?"missing path to latest CMake root directory"}" declare -r version="${3:?"missing latest CMake version"}" declare -r cmake_cache="${cache}/cmake-${version}" # Doesn't matter who creates the cache directory. mkdir -p "${cache}" || return # Should not happen, but handle it anyways. [[ -L "${cmake_cache}" ]] || rm -rf "${cmake_cache}" || return # Temporary directory to create new symlink. declare tmpdir tmpdir="$(make_tmpdir_in "${cache}")" || return # Symlink to the new CMake root directory. ln -s "${root}" "${tmpdir}/cmake-${version}" || return # Atomic substitution of symlink from old to new CMake root directory. mv -f "${tmpdir}/cmake-${version}" "${cache}" || return # Be nice and clean up the now-empty temporary directory. rmdir "${tmpdir}" || return } # find_cmake_version # # Usage: # find_cmake_version 3 1 0 # cmake_binary="$(find_cmake_version 3 1 0)" # cmake_binary="$(find_cmake_version 3 25 0 2>/dev/null)" # BYPASS_CMAKE_CACHE=ON cmake_binary="$(find_cmake_version 3 25 0)" # # Return 0 (true) if a CMake binary matching the requested version is available # or successfully obtained from https://cmake.org/files. # Return a non-zero (false) value otherwise. # # If successful, print the name of the CMake binary to stdout (pipe 1). # Otherwise, no output is printed to stdout (pipe 1). # # Diagnostic messages may be printed to stderr (pipe 2). Redirect to /dev/null # with `2>/dev/null` to silence these messages. # # Example: # cmake_binary="$(find_cmake_version 3 25 0)" || exit # "${cmake_binary:?}" -S path-to-source -B path-to-build find_cmake_version() { # If the BYPASS_CMAKE_CACHE environment variable is set to "ON", the check for # an existing CMake binary in the mongo-c-driver CMake cache will be skipped # and the requested CMake binary will be unconditionally downloaded and # installed from scratch. : "${BYPASS_CMAKE_CACHE:="OFF"}" declare -r major="${1:?"missing CMake major version"}" declare -r minor="${2:?"missing CMake minor version"}" declare -r patch="${3:?"missing CMake patch version"}" declare -r version="${major}.${minor}.${patch}" declare cache_dir cache_dir="$(local_cache_dir)/mongo-c-driver" || return declare -r cmake_cache_dir="${cache_dir}/cmake-${version}" declare -r cmake_binary="${cmake_cache_dir}/bin/cmake" if [[ "${BYPASS_CMAKE_CACHE:?}" == "ON" ]]; then echo "Bypassing lookup of CMake ${version} in mongo-c-driver CMake cache" 1>&2 else if command -v "${cmake_binary}" >/dev/null; then if "${cmake_binary}" --version | grep -q "${version}"; then echo "Found CMake ${version} in mongo-c-driver CMake cache" 1>&2 printf "%s" "${cmake_binary}" return # No work to be done: required CMake binary already exists in cache. fi # Shouldn't happen, but log if it does. echo "Found inconsistent CMake version in mongo-c-driver CMake cache" 1>&2 else echo "CMake ${version} is not present in mongo-c-driver CMake cache" 1>&2 fi fi declare platform declare extension declare decompressor declare decompressor_args declare root_dir # This logic is only applicable to CMake 3.20 and newer. For CMake versions # earlier than 3.20 or CMake versions without prebuild binaries for certain # platforms fallback to building from source. case "${OSTYPE:?}-${HOSTTYPE:?}" in cygwin-*) platform="windows-${HOSTTYPE}" extension="zip" decompressor="unzip" decompressor_args=("-q") root_dir="cmake-${version}-${platform}" ;; darwin*-*) platform="macos-universal" extension="tar.gz" decompressor="tar" decompressor_args=("xzf") root_dir="cmake-${version}-${platform}/CMake.app/Contents" ;; linux*-s390x | linux*-powerpc64le) ;; # Build from source. linux*-*) platform="linux-${HOSTTYPE}" extension="tar.gz" decompressor="tar" decompressor_args=("xzf") root_dir="cmake-${version}-${platform}" ;; *) ;; # Build from source. esac { # Doesn't matter who creates the cache directory so long as it exists. mkdir -p "${cache_dir}" || return # Avoid polluting current working directory. declare tmp_cmake_dir tmp_cmake_dir="$(make_tmpdir_in "${cache_dir}")" || return } 1>&2 if [[ -n "${platform:-}" ]]; then cmake_download_binary() ( declare -r cmake_url="https://cmake.org/files/v${major}.${minor}/cmake-${version}-${platform}.${extension}" declare -a download_args download_args=( --out="cmake.${extension}" --uri="${cmake_url}" ) # TODO: remove once BUILD-16817 is resolved. # Workaround SSL certificate validation failures on certain distros. case "$OS_SHORTNAME-$ARCHNAME" in ubuntu14-* | ubuntu16-ppc | RedHat7-ppc) download_args+=(--no-tls-verify) ;; esac echo "Downloading cmake-${version}-${platform}..." cd "${tmp_cmake_dir}" || return # Allow download to fail and fallback to building from source. if download-file "${download_args[@]}"; then "${decompressor}" "${decompressor_args[@]}" "cmake.${extension}" || return cmake_replace_version "${cache_dir}" "$(pwd)/${root_dir}" "${version}" || return # Verify CMake binary works as expected. command -v "${cmake_binary}" || return echo "Downloading cmake-${version}-${platform}... done." else echo "Could not find prebuild binaries for cmake-${version}-${platform}." fi ) 1>&2 cmake_download_binary || return if command -v "${cmake_binary}" >/dev/null && "${cmake_binary}" --version | grep -q "${version}"; then # Successfully downloaded binaries. No more work to be done. printf "%s" "${cmake_binary}" return fi fi # Could not obtain a prebuild binary; build CMake from source instead. ( declare -r cmake_url="https://cmake.org/files/v${major}.${minor}/cmake-${version}.tar.gz" echo "Building cmake-${version} from source..." cd "${tmp_cmake_dir}" || return curl "${curl_args[@]}" "${cmake_url}" --output "cmake.tar.gz" || return tar xzf cmake.tar.gz || return if [[ "${OSTYPE}" == darwin* ]]; then nproc() { sysctl -n hw.logicalcpu; } # MacOS does not have nproc. fi declare -a bootstrap_args bootstrap_args=( "--prefix=$(pwd)/install-dir" "--parallel=$(nproc)" ) || return # Make an attempt to improve CMake build speed by opting into ccache. export PATH if command -v /opt/mongodbtoolchain/v4/bin/ccache; then PATH="${PATH}:/opt/mongodbtoolchain/v4/bin" bootstrap_args+=("--enable-ccache") elif command -v /opt/mongodbtoolchain/v3/bin/ccache; then PATH="${PATH}:/opt/mongodbtoolchain/v3/bin" bootstrap_args+=("--enable-ccache") fi pushd "cmake-${version}" || return { ./bootstrap "${bootstrap_args[@]}" || return make -j "$(nproc)" install || return } >/dev/null # Only interested in errors. popd || return # "cmake-${version}" cmake_replace_version "${cache_dir}" "$(pwd)/install-dir" "${version}" || return # Verify CMake binary works as expected. command -v "${cmake_binary}" || return echo "Building cmake-${version} from source... done." ) 1>&2 printf "%s" "${cmake_binary}" } mongo-c-driver-1.26.0/.evergreen/scripts/find-cmake.sh000077500000000000000000000033571456567454500225510ustar00rootroot00000000000000#!/bin/sh set -o errexit # Exit the script with error if any of the commands fail find_cmake () { CMAKE=${CMAKE:-} IGNORE_SYSTEM_CMAKE=${IGNORE_SYSTEM_CMAKE:-} if [ ! -z "$CMAKE" ]; then return 0 elif [ -f "/Applications/cmake-3.2.2-Darwin-x86_64/CMake.app/Contents/bin/cmake" ]; then CMAKE="/Applications/cmake-3.2.2-Darwin-x86_64/CMake.app/Contents/bin/cmake" elif [ -f "/Applications/Cmake.app/Contents/bin/cmake" ]; then CMAKE="/Applications/Cmake.app/Contents/bin/cmake" elif [ -f "/opt/cmake/bin/cmake" ]; then CMAKE="/opt/cmake/bin/cmake" elif [ -z "$IGNORE_SYSTEM_CMAKE" ] && command -v cmake 2>/dev/null; then CMAKE=cmake elif uname -a | grep -iq 'x86_64 GNU/Linux'; then if [ -f "$(pwd)/cmake-3.11.0/bin/cmake" ]; then CMAKE="$(pwd)/cmake-3.11.0/bin/cmake" return 0 fi curl --retry 5 https://cmake.org/files/v3.11/cmake-3.11.0-Linux-x86_64.tar.gz -sS --max-time 120 --fail --output cmake.tar.gz mkdir cmake-3.11.0 tar xzf cmake.tar.gz -C cmake-3.11.0 --strip-components=1 CMAKE=$(pwd)/cmake-3.11.0/bin/cmake elif [ -f "/cygdrive/c/cmake/bin/cmake" ]; then CMAKE="/cygdrive/c/cmake/bin/cmake" fi if [ -z "$CMAKE" -o -z "$( $CMAKE --version 2>/dev/null )" ]; then # Some images have no cmake yet, or a broken cmake (see: BUILD-8570) echo "-- MAKE CMAKE --" CMAKE_INSTALL_DIR=$(readlink -f cmake-install) curl --retry 5 https://cmake.org/files/v3.11/cmake-3.11.0.tar.gz -sS --max-time 120 --fail --output cmake.tar.gz tar xzf cmake.tar.gz cd cmake-3.11.0 ./bootstrap --prefix="${CMAKE_INSTALL_DIR}" make -j8 make install cd .. CMAKE="${CMAKE_INSTALL_DIR}/bin/cmake" echo "-- DONE MAKING CMAKE --" fi } find_cmake mongo-c-driver-1.26.0/.evergreen/scripts/install-libmongoc-after-libbson.sh000077500000000000000000000005141456567454500267050ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset # Install libbson only. EXTRA_CONFIGURE_FLAGS="-DENABLE_MONGOC=OFF" \ ./.evergreen/scripts/compile.sh # Install libmongoc using the system installed libbson. EXTRA_CONFIGURE_FLAGS="-DENABLE_MONGOC=ON -DUSE_SYSTEM_LIBBSON=ON" \ ./.evergreen/scripts/compile.sh mongo-c-driver-1.26.0/.evergreen/scripts/install-ssl.sh000066400000000000000000000056031456567454500230110ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt SSL "no" declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" # Install OpenSSL library to separate install directory from normal # "install-ssl" directory to avoid interfering with OpenSSL requirements by # system binaries when install-dir/bin is prepended to $PATH. declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" declare -a ssl_extra_flags if [[ "${OSTYPE}" == darwin* ]]; then # MacOS does not have nproc. nproc() { sysctl -n hw.logicalcpu } fi # OpenSSL prior to 1.1.0 complains about "jobserver unavailable" if explicit N # is given to `-j` then defaults to N=1. Prefer unbounded parallelism over # none instead. declare njobs njobs="$(nproc)" build_target_if_exists() { if make -n "${1:?}" 2>/dev/null; then make -s "${@}" fi } install_openssl() { declare ssl_version="${SSL##openssl-}" declare tmp tmp="$(echo "${ssl_version:?}" | tr . _)" curl -L --retry 5 -o ssl.tar.gz "https://github.com/openssl/openssl/archive/OpenSSL_${tmp}.tar.gz" tar zxf ssl.tar.gz pushd "openssl-OpenSSL_${tmp}" ( set -o xtrace ./config --prefix="${openssl_install_dir}" "${ssl_extra_flags[@]}" shared -fPIC make -j depend build_target_if_exists "build_crypto" # <1.1.0; parallel is broken. build_target_if_exists "build_engines" "-j" # <1.1.0 build_target_if_exists "build_ssl" "-j" # <1.1.0 build_target_if_exists "build_libs" "-j" # <1.1.0 make -j make install_sw ) >/dev/null popd # "openssl-OpenSSL_${tmp}" } install_openssl_fips() { curl --retry 5 -o fips.tar.gz https://www.openssl.org/source/openssl-fips-2.0.16.tar.gz tar zxf fips.tar.gz pushd openssl-fips-2.0.16 ( set -o xtrace ./config --prefix="${openssl_install_dir}" -fPIC make -j build_crypto make build_fips # Parallel is broken. make install_sw ) >/dev/null popd # openssl-fips-2.0.16 ssl_extra_flags=("--openssldir=${openssl_install_dir}" "--with-fipsdir=${openssl_install_dir}" "fips") SSL="${SSL%-fips}" install_openssl } install_libressl() { curl --retry 5 -o ssl.tar.gz "https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/${SSL}.tar.gz" tar zxf ssl.tar.gz pushd "${SSL}" ( set -o xtrace ./configure --prefix="${install_dir}" make -s -j "${njobs}" install ) >/dev/null popd # "${SSL}" } case "${SSL}" in openssl-*-fips) export LC_ALL LC_ALL="C" # Silence perl locale warnings. install_openssl_fips ;; openssl-*) export LC_ALL LC_ALL="C" # Silence perl locale warnings. install_openssl ;; libressl-*) install_libressl ;; esac mongo-c-driver-1.26.0/.evergreen/scripts/install-uninstall-check-windows.cmd000066400000000000000000000152151456567454500271150ustar00rootroot00000000000000REM Supported/used environment variables: REM CC Compiler, "mingw" or "Visual Studio 14 2015 Win64". REM BSON_ONLY Whether to build only the BSON library. rem Ensure Cygwin executables like sh.exe are not in PATH rem set PATH=C:\Windows\system32;C:\Windows echo on echo set SRCROOT=%CD% set TAR=C:\cygwin\bin\tar set CMAKE=C:\cmake\bin\cmake set CMAKE_MAKE_PROGRAM=C:\mingw-w64\x86_64-4.9.1-posix-seh-rt_v3-rev1\mingw64\bin\mingw32-make.exe rem Ensure Cygwin executables like sh.exe are not in PATH set PATH=C:\cygwin\bin;C:\Windows\system32;C:\Windows;C:\mingw-w64\x86_64-4.9.1-posix-seh-rt_v3-rev1\mingw64\bin;C:\mongoc;src\libbson;src\libmongoc if "%BSON_ONLY%"=="1" ( set BUILD_DIR=%CD%\build-dir-bson set INSTALL_DIR=%CD%\install-dir-bson ) else ( set BUILD_DIR=%CD%\build-dir-mongoc set INSTALL_DIR=%CD%\install-dir-mongoc ) rmdir /S /Q %BUILD_DIR% mkdir %BUILD_DIR% rmdir /S /Q %INSTALL_DIR% mkdir %INSTALL_DIR% set PATH=%PATH%;%INSTALL_DIR%\bin cd %BUILD_DIR% robocopy "%SRCROOT%" "%BUILD_DIR%" /E /XD ".git" "%BUILD_DIR%" "_build" "cmake-build" /NP /NFL /NDL if "%BSON_ONLY%"=="1" ( set BSON_ONLY_OPTION=-DENABLE_MONGOC=OFF ) else ( set BSON_ONLY_OPTION=-DENABLE_MONGOC=ON ) echo.%CC%| findstr /I "gcc">Nul && ( rem Build libmongoc, with flags that the downstream R driver mongolite uses %CMAKE% -G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM=%CMAKE_MAKE_PROGRAM% -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake %BSON_ONLY_OPTION% . %CMAKE% --build . if errorlevel 1 ( exit /B 1 ) %CMAKE% --build . --target install if errorlevel 1 ( exit /B 1 ) REM no kms-message components should be installed if exist %INSTALL_DIR%\include\kms_message\kms_message.h ( echo kms_message.h found! exit /B 1 ) else ( echo kms_message.h check ok ) if exist %INSTALL_DIR%\lib\libkms_message-static.a ( echo libkms_message-static.a found! exit /B 1 ) else ( echo libkms_message-static.a check ok ) if exist %INSTALL_DIR%\lib\cmake\kms_message\kms_message-config.cmake ( echo kms_message-config.cmake found! exit /B 1 ) else ( echo kms_message-config.cmake check ok ) echo > %INSTALL_DIR%\lib\canary.txt dir %INSTALL_DIR%\share\mongo-c-driver %CMAKE% --build . --target uninstall if errorlevel 1 ( exit /B 1 ) ) || ( %CMAKE% -G "%CC%" "-DCMAKE_INSTALL_PREFIX=%INSTALL_DIR%" "-DCMAKE_BUILD_TYPE=Debug" %BSON_ONLY_OPTION% . %CMAKE% --build . --config Debug if errorlevel 1 ( exit /B 1 ) %CMAKE% --build . --config Debug --target install if errorlevel 1 ( exit /B 1 ) echo > %INSTALL_DIR%\lib\canary.txt REM no kms-message components should be installed if exist %INSTALL_DIR%\include\kms_message\kms_message.h ( echo kms_message.h found! exit /B 1 ) else ( echo kms_message.h check ok ) if exist %INSTALL_DIR%\lib\libkms_message-static.a ( echo libkms_message-static.a found! exit /B 1 ) else ( echo libkms_message-static.a check ok ) if exist %INSTALL_DIR%\lib\cmake\kms_message\kms_message-config.cmake ( echo kms_message-config.cmake found! exit /B 1 ) else ( echo kms_message-config.cmake check ok ) dir %INSTALL_DIR%\share\mongo-c-driver %CMAKE% --build . --target uninstall if errorlevel 1 ( exit /B 1 ) ) if exist %INSTALL_DIR%\lib\pkgconfig\libbson-1.0.pc ( echo libbson-1.0.pc found! exit /B 1 ) else ( echo libbson-1.0.pc check ok ) if exist %INSTALL_DIR%\lib\cmake\bson-1.0\bson-1.0-config.cmake ( echo bson-1.0-config.cmake found! exit /B 1 ) else ( echo bson-1.0-config.cmake check ok ) if exist %INSTALL_DIR%\lib\cmake\bson-1.0\bson-1.0-config-version.cmake ( echo bson-1.0-config-version.cmake found! exit /B 1 ) else ( echo bson-1.0-config-version.cmake check ok ) if exist %INSTALL_DIR%\lib\cmake\bson-1.0\bson-targets.cmake ( echo bson-targets.cmake found! exit /B 1 ) else ( echo bson-targets.cmake check ok ) if not exist %INSTALL_DIR%\lib\canary.txt ( echo canary.txt not found! exit /B 1 ) else ( echo canary.txt check ok ) if not exist %INSTALL_DIR%\lib ( echo %INSTALL_DIR%\lib not found! exit /B 1 ) else ( echo %INSTALL_DIR%\lib check ok ) if "%BSON_ONLY%" NEQ "1" ( if exist %INSTALL_DIR%\lib\pkgconfig\libmongoc-1.0.pc ( echo libmongoc-1.0.pc found! exit /B 1 ) else ( echo libmongoc-1.0.pc check ok ) if exist %INSTALL_DIR%\lib\cmake\mongoc-1.0\mongoc-1.0-config.cmake ( echo mongoc-1.0-config.cmake found! exit /B 1 ) else ( echo mongoc-1.0-config.cmake check ok ) if exist %INSTALL_DIR%\lib\cmake\mongoc-1.0\mongoc-1.0-config-version.cmake ( echo mongoc-1.0-config-version.cmake found! exit /B 1 ) else ( echo mongoc-1.0-config-version.cmake check ok ) if exist %INSTALL_DIR%\lib\cmake\mongoc-1.0\mongoc-targets.cmake ( echo mongoc-targets.cmake found! exit /B 1 ) else ( echo mongoc-targets.cmake check ok ) ) if exist %INSTALL_DIR%\include\libbson-1.0\bson\bson.h ( echo bson\bson.h found! exit /B 1 ) else ( echo bson\bson.h check ok ) if exist %INSTALL_DIR%\include\libbson-1.0\bson.h ( echo bson.h found! exit /B 1 ) else ( echo bson.h check ok ) if exist %INSTALL_DIR%\include\libbson-1.0 ( echo $INSTALL_DIR\include\libbson-1.0 found! exit /B 1 ) else ( echo $INSTALL_DIR\include\libbson-1.0 check ok ) if "%BSON_ONLY%" NEQ "1" ( if exist %INSTALL_DIR%\include\libmongoc-1.0\mongoc\mongoc.h ( echo mongoc\mongoc.h found! exit /B 1 ) else ( echo mongoc\mongoc.h check ok ) if exist %INSTALL_DIR%\include\libmongoc-1.0\mongoc.h ( echo mongoc.h found! exit /B 1 ) else ( echo mongoc.h check ok ) if exist %INSTALL_DIR%\include\libmongoc-1.0 ( echo $INSTALL_DIR\include\libmongoc-1.0 found! exit /B 1 ) else ( echo $INSTALL_DIR\include\libmongoc-1.0 check ok ) ) if exist %INSTALL_DIR%\share\mongo-c-driver\uninstall-bson.cmd ( echo uninstall-bson.cmd found! exit /B 1 ) else ( echo uninstall-bson.cmd check ok ) if exist %INSTALL_DIR%\share\mongo-c-driver\uninstall.cmd ( echo uninstall.cmd found! exit /B 1 ) else ( echo uninstall.cmd check ok ) if exist %INSTALL_DIR%\share\mongo-c-driver\uninstall-bson.sh ( echo uninstall-bson.sh found! exit /B 1 ) else ( echo uninstall-bson.sh check ok ) if exist %INSTALL_DIR%\share\mongo-c-driver\uninstall.sh ( echo uninstall.sh found! exit /B 1 ) else ( echo uninstall.sh check ok ) if exist %INSTALL_DIR%\share\mongo-c-driver ( echo $INSTALL_DIR\share\mongo-c-driver found! exit /B 1 ) else ( echo $INSTALL_DIR\share\mongo-c-driver check ok ) mongo-c-driver-1.26.0/.evergreen/scripts/install-uninstall-check.sh000066400000000000000000000121421456567454500252700ustar00rootroot00000000000000#!/bin/sh set -o errexit # Exit the script with error if any of the commands fail # Supported/used environment variables: # CMAKE Path to cmake executable. # BSON_ONLY Whether to build only the BSON library. DIR=$(dirname $0) . $DIR/find-cmake-latest.sh CMAKE=$(find_cmake_latest) . $DIR/check-symlink.sh SRCROOT=$(pwd) SCRATCH_DIR=$(pwd)/.scratch rm -rf "$SCRATCH_DIR" mkdir -p "$SCRATCH_DIR" cp -vr -- "$SRCROOT"/* "$SCRATCH_DIR" if [ "$BSON_ONLY" ]; then BUILD_DIR=$SCRATCH_DIR/build-dir-bson INSTALL_PREFIX=$SCRATCH_DIR/install-dir-bson else BUILD_DIR=$SCRATCH_DIR/build-dir-mongoc INSTALL_PREFIX=$SCRATCH_DIR/install-dir-mongoc fi if [ "$DESTDIR" ]; then INSTALL_DIR="${DESTDIR}/${INSTALL_PREFIX}" else INSTALL_DIR=$INSTALL_PREFIX fi rm -rf $BUILD_DIR mkdir $BUILD_DIR rm -rf $INSTALL_DIR mkdir -p $INSTALL_DIR cd $BUILD_DIR cp -r -- "$SRCROOT"/* "$SCRATCH_DIR" if [ "$BSON_ONLY" ]; then BSON_ONLY_OPTION="-DENABLE_MONGOC=OFF" else BSON_ONLY_OPTION="-DENABLE_MONGOC=ON" fi # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$SCRATCH_DIR" CCACHE_NOHASHDIR=1 $CMAKE -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX -DCMAKE_PREFIX_PATH=$INSTALL_DIR/lib/cmake $BSON_ONLY_OPTION "$SCRATCH_DIR" $CMAKE --build . if [ "$DESTDIR" ]; then DESTDIR=$DESTDIR $CMAKE --build . --target install else $CMAKE --build . --target install fi touch $INSTALL_DIR/lib/canary.txt # no kms-message components should be installed if test -f $INSTALL_DIR/include/kms_message/kms_message.h; then echo "kms_message.h found!" exit 1 else echo "kms_message.h check ok" fi if test -f $INSTALL_DIR/lib/libkms_message-static.a; then echo "libkms_message-static.a found!" exit 1 else echo "libkms_message-static.a check ok" fi if test -f $INSTALL_DIR/lib/cmake/kms_message/kms_message-config.cmake; then echo "kms_message-config.cmake found!" exit 1 else echo "kms_message-config.cmake check ok" fi ls -l $INSTALL_DIR/share/mongo-c-driver $CMAKE --build . --target uninstall set +o xtrace if test -f $INSTALL_DIR/lib/pkgconfig/libbson-1.0.pc; then echo "libbson-1.0.pc found!" exit 1 else echo "libbson-1.0.pc check ok" fi if test -f $INSTALL_DIR/lib/cmake/bson-1.0/bson-1.0-config.cmake; then echo "bson-1.0-config.cmake found!" exit 1 else echo "bson-1.0-config.cmake check ok" fi if test -f $INSTALL_DIR/lib/cmake/bson-1.0/bson-1.0-config-version.cmake; then echo "bson-1.0-config-version.cmake found!" exit 1 else echo "bson-1.0-config-version.cmake check ok" fi if test -f $INSTALL_DIR/lib/cmake/bson-1.0/bson-targets.cmake; then echo "bson-targets.cmake found!" exit 1 else echo "bson-targets.cmake check ok" fi if test ! -f $INSTALL_DIR/lib/canary.txt; then echo "canary.txt not found!" exit 1 else echo "canary.txt check ok" fi if test ! -d $INSTALL_DIR/lib; then echo "$INSTALL_DIR/lib not found!" exit 1 else echo "$INSTALL_DIR/lib check ok" fi if [ -z "$BSON_ONLY" ]; then if test -f $INSTALL_DIR/lib/pkgconfig/libmongoc-1.0.pc; then echo "libmongoc-1.0.pc found!" exit 1 else echo "libmongoc-1.0.pc check ok" fi if test -f $INSTALL_DIR/lib/cmake/mongoc-1.0/mongoc-1.0-config.cmake; then echo "mongoc-1.0-config.cmake found!" exit 1 else echo "mongoc-1.0-config.cmake check ok" fi if test -f $INSTALL_DIR/lib/cmake/mongoc-1.0/mongoc-1.0-config-version.cmake; then echo "mongoc-1.0-config-version.cmake found!" exit 1 else echo "mongoc-1.0-config-version.cmake check ok" fi if test -f $INSTALL_DIR/lib/cmake/mongoc-1.0/mongoc-targets.cmake; then echo "mongoc-targets.cmake found!" exit 1 else echo "mongoc-targets.cmake check ok" fi fi if test -f $INSTALL_DIR/include/libbson-1.0/bson/bson.h; then echo "bson/bson.h found!" exit 1 else echo "bson/bson.h check ok" fi if test -f $INSTALL_DIR/include/libbson-1.0/bson.h; then echo "bson.h found!" exit 1 else echo "bson.h check ok" fi if test -d $INSTALL_DIR/include/libbson-1.0; then echo "$INSTALL_DIR/include/libbson-1.0 found!" exit 1 else echo "$INSTALL_DIR/include/libbson-1.0 check ok" fi if [ -z "$BSON_ONLY" ]; then if test -f $INSTALL_DIR/include/libmongoc-1.0/mongoc/mongoc.h; then echo "mongoc/mongoc.h found!" exit 1 else echo "mongoc/mongoc.h check ok" fi if test -f $INSTALL_DIR/include/libmongoc-1.0/mongoc.h; then echo "mongoc.h found!" exit 1 else echo "mongoc.h check ok" fi if test -d $INSTALL_DIR/include/libmongoc-1.0; then echo "$INSTALL_DIR/include/libmongoc-1.0 found!" exit 1 else echo "$INSTALL_DIR/include/libmongoc-1.0 check ok" fi fi if test -f $INSTALL_DIR/share/mongo-c-driver/uninstall-bson.sh; then echo "uninstall-bson.sh found!" exit 1 else echo "uninstall-bson.sh check ok" fi if test -f $INSTALL_DIR/share/mongo-c-driver/uninstall.sh; then echo "uninstall.sh found!" exit 1 else echo "uninstall.sh check ok" fi if test -d $INSTALL_DIR/share/mongo-c-driver; then echo "$INSTALL_DIR/share/mongo-c-driver found!" exit 1 else echo "$INSTALL_DIR/share/mongo-c-driver check ok" fi mongo-c-driver-1.26.0/.evergreen/scripts/integration-tests.sh000077500000000000000000000161221456567454500242300ustar00rootroot00000000000000#! /bin/bash # Start up mongo-orchestration (a server to spawn mongodb clusters) and set up a cluster. # # Specify the following environment variables: # # MONGODB_VERSION: latest, 4.2, 4.0, 3.6 # TOPOLOGY: server, replica_set, sharded_cluster # AUTH: auth, noauth # AUTHSOURCE # IPV4_ONLY: off, on # SSL: openssl, darwinssl, winssl, nossl # ORCHESTRATION_FILE: # If this is not set, the file name is constructed from other options. # OCSP: off, on # REQUIRE_API_VERSION: set to a non-empty string to set the requireApiVersion parameter # This is currently only supported for standalone servers # LOAD_BALANCER: off, on # # This script may be run locally. # set -o errexit # Exit the script with error if any of the commands fail : "${MONGODB_VERSION:="latest"}" : "${LOAD_BALANCER:="off"}" DIR=$(dirname $0) # mongoc/.evergreen/scripts -> drivers-evergreen-tools/.evergreen/download-mongodb.sh . $DIR/../../../drivers-evergreen-tools/.evergreen/download-mongodb.sh get_distro get_mongodb_download_url_for "$DISTRO" "$MONGODB_VERSION" DRIVERS_TOOLS=./ download_and_extract "$MONGODB_DOWNLOAD_URL" "$EXTRACT" "$MONGOSH_DOWNLOAD_URL" "$EXTRACT_MONGOSH" OS=$(uname -s | tr '[:upper:]' '[:lower:]') AUTH=${AUTH:-noauth} SSL=${SSL:-nossl} TOPOLOGY=${TOPOLOGY:-server} OCSP=${OCSP:-off} REQUIRE_API_VERSION=${REQUIRE_API_VERSION} # If caller of script specifies an ORCHESTRATION_FILE, do not attempt to modify it. Otherwise construct it. if [ -z "$ORCHESTRATION_FILE" ]; then ORCHESTRATION_FILE="basic" if [ "$AUTH" = "auth" ]; then ORCHESTRATION_FILE="auth" fi if [ "$IPV4_ONLY" = "on" ]; then ORCHESTRATION_FILE="${ORCHESTRATION_FILE}-ipv4-only" fi if [ -n "$AUTHSOURCE" ]; then ORCHESTRATION_FILE="${ORCHESTRATION_FILE}-${AUTHSOURCE}" fi if [ "$SSL" != "nossl" ]; then ORCHESTRATION_FILE="${ORCHESTRATION_FILE}-ssl" fi if [ "$LOAD_BALANCER" = "on" ]; then ORCHESTRATION_FILE="${ORCHESTRATION_FILE}-load-balancer" fi fi # Set up mongo orchestration home. case "$OS" in cygwin*) export MONGO_ORCHESTRATION_HOME="c:/data/MO" FULL_PATH=$(cygpath -m -a .) ;; *) export MONGO_ORCHESTRATION_HOME=$(pwd)"/MO" FULL_PATH=$(pwd) ;; esac rm -rf "$MONGO_ORCHESTRATION_HOME" mkdir -p "$MONGO_ORCHESTRATION_HOME/lib" mkdir -p "$MONGO_ORCHESTRATION_HOME/db" # Replace ABSOLUTE_PATH_REPLACEMENT_TOKEN with path to mongo-c-driver. find orchestration_configs -name \*.json | xargs perl -p -i -e "s|ABSOLUTE_PATH_REPLACEMENT_TOKEN|$FULL_PATH|g" # mongo-orchestration expects client.pem to be in MONGO_ORCHESTRATION_HOME. So always copy it. cp -f src/libmongoc/tests/x509gen/* $MONGO_ORCHESTRATION_HOME/lib/ # find print0 and xargs -0 not available on Solaris. Lets hope for good paths find orchestration_configs -name \*.json | xargs perl -p -i -e "s|/tmp/orchestration-home|$MONGO_ORCHESTRATION_HOME/lib|g" export ORCHESTRATION_FILE="orchestration_configs/${TOPOLOGY}s/${ORCHESTRATION_FILE}.json" export ORCHESTRATION_URL="http://localhost:8889/v1/${TOPOLOGY}s" export TMPDIR=$MONGO_ORCHESTRATION_HOME/db echo From shell `date` > $MONGO_ORCHESTRATION_HOME/server.log command -V "${PYTHON3_BINARY:?}" >/dev/null # shellcheck source=/dev/null . ../drivers-evergreen-tools/.evergreen/venv-utils.sh case "$OS" in cygwin*) # Python has problems with unix style paths in cygwin. Must use c:\\ paths rm -rf /cygdrive/c/mongodb cp -r mongodb /cygdrive/c/mongodb echo "{ \"releases\": { \"default\": \"c:\\\\mongodb\\\\bin\" }}" > orchestration.config # Make sure MO is running latest version venvcreate "${PYTHON3_BINARY}" venv cd venv rm -rf mongo-orchestration git clone --depth 1 git@github.com:10gen/mongo-orchestration.git cd mongo-orchestration python -m pip install . cd ../.. nohup mongo-orchestration -f orchestration.config -e default --socket-timeout-ms=60000 --bind=127.0.0.1 --enable-majority-read-concern -s wsgiref start > $MONGO_ORCHESTRATION_HOME/out.log 2> $MONGO_ORCHESTRATION_HOME/err.log < /dev/null & ;; *) echo "{ \"releases\": { \"default\": \"`pwd`/mongodb/bin\" } }" > orchestration.config venvcreate "${PYTHON3_BINARY}" venv cd venv rm -rf mongo-orchestration # Make sure MO is running latest version git clone --depth 1 git@github.com:10gen/mongo-orchestration.git cd mongo-orchestration # Our zSeries machines are static-provisioned, cache corruptions persist. if [ $(uname -m) = "s390x" ]; then echo "Disabling pip cache" PIP_PARAM="--no-cache-dir" fi python -m pip $PIP_PARAM install . cd ../.. mongo-orchestration -f orchestration.config -e default --socket-timeout-ms=60000 --bind=127.0.0.1 --enable-majority-read-concern start > $MONGO_ORCHESTRATION_HOME/out.log 2> $MONGO_ORCHESTRATION_HOME/err.log < /dev/null & ;; esac echo "Waiting for mongo-orchestration to start..." wait_for_mongo_orchestration() { for i in $(seq 300); do # Exit code 7: "Failed to connect to host". if curl -s "localhost:$1" 1>|curl_mo.txt; test $? -ne 7; then return 0 else sleep 1 fi done echo "Could not detect mongo-orchestration on port $1" return 1 } wait_for_mongo_orchestration 8889 echo "Waiting for mongo-orchestration to start... done." python -m json.tool curl_mo.txt sleep 5 pwd curl -s --data @"$ORCHESTRATION_FILE" "$ORCHESTRATION_URL" 1>|curl_mo.txt python -m json.tool curl_mo.txt sleep 15 if [ "$AUTH" = "auth" ]; then MONGO_SHELL_CONNECTION_FLAGS="--username bob --password pwd123" fi if [ -n "$AUTHSOURCE" ]; then MONGO_SHELL_CONNECTION_FLAGS="${MONGO_SHELL_CONNECTION_FLAGS} --authenticationDatabase ${AUTHSOURCE}" fi if [ "$OCSP" != "off" ]; then MONGO_SHELL_CONNECTION_FLAGS="${MONGO_SHELL_CONNECTION_FLAGS} --host localhost --tls --tlsAllowInvalidCertificates" elif [ "$SSL" != "nossl" ]; then MONGO_SHELL_CONNECTION_FLAGS="${MONGO_SHELL_CONNECTION_FLAGS} --host localhost --ssl --sslCAFile=$MONGO_ORCHESTRATION_HOME/lib/ca.pem --sslPEMKeyFile=$MONGO_ORCHESTRATION_HOME/lib/client.pem" fi if [ ! -z "$REQUIRE_API_VERSION" ]; then MONGO_SHELL_CONNECTION_FLAGS="${MONGO_SHELL_CONNECTION_FLAGS} --apiVersion=1" # Set the requireApiVersion parameter. ./mongodb/bin/mongosh $MONGO_SHELL_CONNECTION_FLAGS $DIR/../etc/require-api-version.js fi echo $MONGO_SHELL_CONNECTION_FLAGS # Create mo-expansion.yml. expansions.update expects the file to exist. touch mo-expansion.yml if [ -z "$MONGO_CRYPT_SHARED_DOWNLOAD_URL" ]; then echo "There is no crypt_shared library for distro='$DISTRO' and version='$MONGODB_VERSION'". else echo "Downloading crypt_shared package from $MONGO_CRYPT_SHARED_DOWNLOAD_URL" download_and_extract_crypt_shared "$MONGO_CRYPT_SHARED_DOWNLOAD_URL" "$EXTRACT" "CRYPT_SHARED_LIB_PATH" echo "CRYPT_SHARED_LIB_PATH: $CRYPT_SHARED_LIB_PATH" if [ -z "$CRYPT_SHARED_LIB_PATH" ]; then echo "CRYPT_SHARED_LIB_PATH must be assigned, but wasn't" 1>&2 # write to stderr" exit 1 fi cat >>mo-expansion.yml < libbson-1.0.so.0 # libbson-1.0.so.0 -> libbson-1.0.so.0.0.0 # libbson-1.0.so.0.0.0 if [ "$OS" != "darwin" ]; then # From check-symlink.sh check_symlink libbson-1.0.so libbson-1.0.so.0 check_symlink libbson-1.0.so.0 libbson-1.0.so.0.0.0 SONAME=$(objdump -p $INSTALL_DIR/lib/$LIB_SO|grep SONAME|awk '{print $2}') EXPECTED_SONAME="libbson-1.0.so.0" if [ "$SONAME" != "$EXPECTED_SONAME" ]; then echo "SONAME should be $EXPECTED_SONAME, not $SONAME" exit 1 else echo "library name check ok, SONAME=$SONAME" fi else # Just test that the shared lib was installed. if test ! -f $INSTALL_DIR/lib/$LIB_SO; then echo "$LIB_SO missing!" exit 1 else echo "$LIB_SO check ok" fi fi if test ! -f $INSTALL_DIR/lib/pkgconfig/libbson-1.0.pc; then echo "libbson-1.0.pc missing!" exit 1 else echo "libbson-1.0.pc check ok" fi if test ! -f $INSTALL_DIR/lib/cmake/bson-1.0/bson-1.0-config.cmake; then echo "bson-1.0-config.cmake missing!" exit 1 else echo "bson-1.0-config.cmake check ok" fi if test ! -f $INSTALL_DIR/lib/cmake/bson-1.0/bson-1.0-config-version.cmake; then echo "bson-1.0-config-version.cmake missing!" exit 1 else echo "bson-1.0-config-version.cmake check ok" fi if test ! -f $INSTALL_DIR/lib/cmake/bson-1.0/bson-targets.cmake; then echo "bson-targets.cmake missing!" exit 1 else echo "bson-targets.cmake check ok" fi if [ "$LINK_STATIC" ]; then if test ! -f $INSTALL_DIR/lib/libbson-static-1.0.a; then echo "libbson-static-1.0.a missing!" exit 1 else echo "libbson-static-1.0.a check ok" fi if test ! -f $INSTALL_DIR/lib/pkgconfig/libbson-static-1.0.pc; then echo "libbson-static-1.0.pc missing!" exit 1 else echo "libbson-static-1.0.pc check ok" fi fi cd $SRCROOT if [ "$BUILD_SAMPLE_WITH_CMAKE" ]; then # Test our CMake package config file with CMake's find_package command. if [ "$BUILD_SAMPLE_WITH_CMAKE_DEPRECATED" ]; then EXAMPLE_DIR=$SRCROOT/src/libbson/examples/cmake-deprecated/find_package else EXAMPLE_DIR=$SRCROOT/src/libbson/examples/cmake/find_package fi if [ "$LINK_STATIC" ]; then EXAMPLE_DIR="${EXAMPLE_DIR}_static" fi cd $EXAMPLE_DIR $CMAKE -DCMAKE_PREFIX_PATH=$INSTALL_DIR/lib/cmake . $CMAKE --build . --parallel else # Test our pkg-config file. export PKG_CONFIG_PATH=$INSTALL_DIR/lib/pkgconfig cd $SRCROOT/src/libbson/examples if [ "$LINK_STATIC" ]; then echo "pkg-config output:" echo $(pkg-config --libs --cflags libbson-static-1.0) sh compile-with-pkg-config-static.sh else echo "pkg-config output:" echo $(pkg-config --libs --cflags libbson-1.0) sh compile-with-pkg-config.sh fi fi if [ ! "$LINK_STATIC" ]; then if [ "$OS" = "darwin" ]; then export DYLD_LIBRARY_PATH=$INSTALL_DIR/lib else export LD_LIBRARY_PATH=$INSTALL_DIR/lib fi fi echo "ldd hello_bson:" $LDD hello_bson ./hello_bson mongo-c-driver-1.26.0/.evergreen/scripts/link-sample-program-mingw-bson.cmd000066400000000000000000000043131456567454500266310ustar00rootroot00000000000000echo on echo set TAR=C:\cygwin\bin\tar set CMAKE_MAKE_PROGRAM=C:\mingw-w64\x86_64-4.9.1-posix-seh-rt_v3-rev1\mingw64\bin\mingw32-make.exe set CC=C:\mingw-w64\x86_64-4.9.1-posix-seh-rt_v3-rev1\mingw64\bin\gcc.exe rem Ensure Cygwin executables like sh.exe are not in PATH set "PATH=C:\cygwin\bin;C:\Windows\system32;C:\Windows;C:\mingw-w64\x86_64-4.9.1-posix-seh-rt_v3-rev1\mingw64\bin;C:\mongoc;src\libbson;src\libmongoc;C:\Program Files\Git\cmd" set LINK_STATIC=1 set SRCROOT=%CD% set BUILD_DIR=%CD%\build-dir rmdir /S /Q %BUILD_DIR% mkdir %BUILD_DIR% set INSTALL_DIR=%CD%\install-dir rmdir /S /Q %INSTALL_DIR% mkdir %INSTALL_DIR% set PATH=%PATH%;%INSTALL_DIR%\bin cd %BUILD_DIR% robocopy "%SRCROOT%" "%BUILD_DIR%" /E /XD ".git" "%BUILD_DIR%" "_build" "cmake-build" /NP /NFL /NDL rem Build libmongoc, with flags that the downstream R driver mongolite uses %CMAKE% -G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM=%CMAKE_MAKE_PROGRAM% -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCMAKE_CFLAGS="-pedantic" -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake -DENABLE_STATIC=ON . %CMAKE% --build . --parallel if errorlevel 1 ( exit /B 1 ) %CMAKE% --build . --target install if errorlevel 1 ( exit /B 1 ) set MINGW=1 call ..\.evergreen\scripts\check-installed-files-bson.bat if errorlevel 1 ( exit /B 1 ) set MINGW= if not exist %INSTALL_DIR%\lib\libbson-static-1.0.a ( echo libbson-static-1.0.a missing! exit /B 1 ) else ( echo libbson-static-1.0.a check ok ) cd %SRCROOT% rem Test our pkg-config file set EXAMPLE_DIR=%SRCROOT%\src\libbson\examples\ cd %EXAMPLE_DIR% rem Proceed from here once we have pkg-config on Windows exit /B 0 set PKG_CONFIG_PATH=%INSTALL_DIR%\lib\pkgconfig rem http://stackoverflow.com/questions/2323292 for /f %%i in ('pkg-config --libs --cflags libbson-1.0') do set PKG_CONFIG_OUT=%%i echo PKG_CONFIG_OUT is %PKG_CONFIG_OUT% %CC% -o hello_bson hello_bson.c %PKG_CONFIG_OUT% rem Works on windows-64-vs2013-compile, VS 2013 is a.k.a. "Visual Studio 12" rem And yes, they should've named the flag "dependencies". "c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\dumpbin.exe" /dependents Debug\hello_bson.exe rem Add DLLs to PATH set PATH=%PATH%;%INSTALL_DIR%\bin Debug\hello_bson.exe %MONGODB_EXAMPLE_URI% mongo-c-driver-1.26.0/.evergreen/scripts/link-sample-program-mingw.cmd000066400000000000000000000043721456567454500256770ustar00rootroot00000000000000echo on echo set CMAKE_FLAGS=-DENABLE_SSL=OPENSSL -DENABLE_SASL=CYRUS set TAR=C:\cygwin\bin\tar set CMAKE_MAKE_PROGRAM=C:\mingw-w64\x86_64-4.9.1-posix-seh-rt_v3-rev1\mingw64\bin\mingw32-make.exe set CC=C:\mingw-w64\x86_64-4.9.1-posix-seh-rt_v3-rev1\mingw64\bin\gcc.exe rem Ensure Cygwin executables like sh.exe are not in PATH set "PATH=C:\cygwin\bin;C:\Windows\system32;C:\Windows;C:\mingw-w64\x86_64-4.9.1-posix-seh-rt_v3-rev1\mingw64\bin;C:\mongoc;src\libbson;src\libmongoc;C:\Program Files\Git\cmd" set SRCROOT=%CD% set BUILD_DIR=%CD%\build-dir rmdir /S /Q %BUILD_DIR% mkdir %BUILD_DIR% set INSTALL_DIR=%CD%\install-dir rmdir /S /Q %INSTALL_DIR% mkdir %INSTALL_DIR% set PATH=%PATH%;%INSTALL_DIR%\bin cd %BUILD_DIR% robocopy "%SRCROOT%" "%BUILD_DIR%" /E /XD ".git" "%BUILD_DIR%" "_build" "cmake-build" /NP /NFL /NDL rem Build libmongoc, with flags that the downstream R driver mongolite uses %CMAKE% -G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM=%CMAKE_MAKE_PROGRAM% -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCMAKE_CFLAGS="-pedantic" -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake %CMAKE_FLAGS% . %CMAKE% --build . --parallel if errorlevel 1 ( exit /B 1 ) %CMAKE% --build . --target install if errorlevel 1 ( exit /B 1 ) set MINGW=1 call ..\.evergreen\scripts\check-installed-files.bat if errorlevel 1 ( exit /B 1 ) set MINGW= if not exist %INSTALL_DIR%\lib\libmongoc-static-1.0.a ( echo libmongoc-static-1.0.a missing! exit /B 1 ) else ( echo libmongoc-static-1.0.a check ok ) cd %SRCROOT% rem Test our pkg-config file set EXAMPLE_DIR=%SRCROOT%\src\libmongoc\examples\ cd %EXAMPLE_DIR% rem Proceed from here once we have pkg-config on Windows exit /B 0 set PKG_CONFIG_PATH=%INSTALL_DIR%\lib\pkgconfig rem http://stackoverflow.com/questions/2323292 for /f %%i in ('pkg-config --libs --cflags libmongoc-1.0') do set PKG_CONFIG_OUT=%%i echo PKG_CONFIG_OUT is %PKG_CONFIG_OUT% %CC% -o hello_mongoc hello_mongoc.c %PKG_CONFIG_OUT% rem Works on windows-64-vs2013-compile, VS 2013 is a.k.a. "Visual Studio 12" rem And yes, they should've named the flag "dependencies". "c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\dumpbin.exe" /dependents Debug\hello_mongoc.exe rem Add DLLs to PATH set PATH=%PATH%;%INSTALL_DIR%\bin Debug\hello_mongoc.exe %MONGODB_EXAMPLE_URI% mongo-c-driver-1.26.0/.evergreen/scripts/link-sample-program-msvc-bson.cmd000066400000000000000000000032461456567454500264640ustar00rootroot00000000000000REM Supported/used environment variables: REM LINK_STATIC Whether to statically link to libbson rem Ensure Cygwin executables like sh.exe are not in PATH rem set PATH=C:\Windows\system32;C:\Windows echo on echo set TAR=C:\cygwin\bin\tar set SRCROOT=%CD% set BUILD_DIR=%CD%\build-dir rmdir /S /Q %BUILD_DIR% mkdir %BUILD_DIR% set INSTALL_DIR=%CD%\install-dir rmdir /S /Q %INSTALL_DIR% mkdir %INSTALL_DIR% set PATH=%PATH%;%INSTALL_DIR%\bin rem Set path to dumpbin.exe and other VS tools. call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars64.bat" cd %BUILD_DIR% robocopy "%SRCROOT%" "%BUILD_DIR%" /E /XD ".git" "%BUILD_DIR%" "_build" "cmake-build" /NP /NFL /NDL if "%LINK_STATIC%"=="1" ( %CMAKE% -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DENABLE_TESTS=OFF . ) else ( %CMAKE% -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DENABLE_TESTS=OFF -DENABLE_STATIC=OFF . ) %CMAKE% --build . --target ALL_BUILD --config "Debug" -- /m %CMAKE% --build . --target INSTALL --config "Debug" -- /m call ..\.evergreen\scripts\check-installed-files-bson.bat if errorlevel 1 ( exit /B %errorlevel% ) rem Test our CMake package config file with CMake's find_package command. set EXAMPLE_DIR=%SRCROOT%\src\libbson\examples\cmake\find_package if "%LINK_STATIC%"=="1" ( set EXAMPLE_DIR="%EXAMPLE_DIR%_static" ) cd %EXAMPLE_DIR% %CMAKE% -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake . %CMAKE% --build . --target ALL_BUILD --config "Debug" -- /m rem Yes, they should've named it "dependencies". dumpbin.exe /dependents Debug\hello_bson.exe Debug\hello_bson.exe mongo-c-driver-1.26.0/.evergreen/scripts/link-sample-program-msvc.cmd000066400000000000000000000060041456567454500255200ustar00rootroot00000000000000REM Supported/used environment variables: REM LINK_STATIC Whether to statically link to libmongoc REM ENABLE_SSL Enable SSL with Microsoft Secure Channel REM ENABLE_SNAPPY Enable Snappy compression rem Ensure Cygwin executables like sh.exe are not in PATH rem set PATH=C:\Windows\system32;C:\Windows echo on echo set TAR=C:\cygwin\bin\tar set SRCROOT=%CD% set BUILD_DIR=%CD%\build-dir rmdir /S /Q %BUILD_DIR% mkdir %BUILD_DIR% set INSTALL_DIR=%CD%\install-dir rmdir /S /Q %INSTALL_DIR% mkdir %INSTALL_DIR% set PATH=%PATH%;%INSTALL_DIR%\bin rem Set path to dumpbin.exe and other VS tools. call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat" cd %BUILD_DIR% robocopy "%SRCROOT%" "%BUILD_DIR%" /E /XD ".git" "%BUILD_DIR%" "_build" "cmake-build" /NP /NFL /NDL if "%ENABLE_SNAPPY%"=="1" ( rem Enable Snappy curl -sS --retry 5 -LO https://github.com/google/snappy/archive/1.1.7.tar.gz %TAR% xzf 1.1.7.tar.gz cd snappy-1.1.7 %CMAKE% -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% . %CMAKE% --build . --target ALL_BUILD --config "Debug" -- /m %CMAKE% --build . --target INSTALL --config "Debug" -- /m set SNAPPY_OPTION=-DENABLE_SNAPPY=ON ) else ( set SNAPPY_OPTION=-DENABLE_SNAPPY=OFF ) cd %BUILD_DIR% rem Build libmongoc if "%ENABLE_SSL%"=="1" ( %CMAKE% -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DENABLE_SSL=WINDOWS %ENABLE_SNAPPY_OPTION% . ) else ( %CMAKE% -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DENABLE_SSL=OFF %ENABLE_SNAPPY_OPTION% . ) %CMAKE% --build . --target ALL_BUILD --config "Debug" -- /m %CMAKE% --build . --target INSTALL --config "Debug" -- /m call ..\.evergreen\scripts\check-installed-files.bat if errorlevel 1 ( exit /B %errorlevel% ) rem Shim library around the DLL. set SHIM=%INSTALL_DIR%\lib\mongoc-1.0.lib if not exist %SHIM% ( echo %SHIM% is missing! exit /B 1 ) else ( echo %SHIM% check ok ) if not exist %INSTALL_DIR%\lib\mongoc-static-1.0.lib ( echo mongoc-static-1.0.lib missing! exit /B 1 ) else ( echo mongoc-static-1.0.lib check ok ) cd %SRCROOT% rem Test our CMake package config file with CMake's find_package command. set EXAMPLE_DIR=%SRCROOT%\src\libmongoc\examples\cmake\find_package if "%LINK_STATIC%"=="1" ( set EXAMPLE_DIR="%EXAMPLE_DIR%_static" ) cd %EXAMPLE_DIR% if "%ENABLE_SSL%"=="1" ( cp ..\..\..\tests\x509gen\client.pem . cp ..\..\..\tests\x509gen\ca.pem . set MONGODB_EXAMPLE_URI="mongodb://localhost/?ssl=true&sslclientcertificatekeyfile=client.pem&sslcertificateauthorityfile=ca.pem&sslallowinvalidhostnames=true" ) %CMAKE% -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake . %CMAKE% --build . --target ALL_BUILD --config "Debug" -- /m rem Yes, they should've named it "dependencies". dumpbin.exe /dependents Debug\hello_mongoc.exe Debug\hello_mongoc.exe %MONGODB_EXAMPLE_URI% mongo-c-driver-1.26.0/.evergreen/scripts/link-sample-program.sh000066400000000000000000000140271456567454500244250ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # Exit the script with error if any of the commands fail # Supported/used environment variables: # LINK_STATIC Whether to statically link to libmongoc # BUILD_SAMPLE_WITH_CMAKE Link program w/ CMake. Default: use pkg-config. # BUILD_SAMPLE_WITH_CMAKE_DEPRECATED If BUILD_SAMPLE_WITH_CMAKE is set, then use deprecated CMake scripts instead. # ENABLE_SSL Set -DENABLE_SSL # ENABLE_SNAPPY Set -DENABLE_SNAPPY # CMAKE Path to cmake executable. echo "LINK_STATIC=$LINK_STATIC BUILD_SAMPLE_WITH_CMAKE=$BUILD_SAMPLE_WITH_CMAKE BUILD_SAMPLE_WITH_CMAKE_DEPRECATED=$BUILD_SAMPLE_WITH_CMAKE_DEPRECATED" DIR=$(dirname $0) . $DIR/find-cmake-latest.sh CMAKE=$(find_cmake_latest) . $DIR/check-symlink.sh # Get the kernel name, lowercased OS=$(uname -s | tr '[:upper:]' '[:lower:]') echo "OS: $OS" if [ "$OS" = "darwin" ]; then SO=dylib LIB_SO=libmongoc-1.0.0.dylib LDD="otool -L" else SO=so LIB_SO=libmongoc-1.0.so.0 LDD=ldd fi SRCROOT=`pwd` SCRATCH_DIR=$(pwd)/.scratch rm -rf "$SCRATCH_DIR" mkdir -p "$SCRATCH_DIR" cp -r -- "$SRCROOT"/* "$SCRATCH_DIR" BUILD_DIR=$SCRATCH_DIR/build-dir rm -rf $BUILD_DIR mkdir $BUILD_DIR INSTALL_DIR=$SCRATCH_DIR/install-dir rm -rf $INSTALL_DIR mkdir -p $INSTALL_DIR cd $BUILD_DIR if [ "$ENABLE_SNAPPY" ]; then SNAPPY_CMAKE_OPTION="-DENABLE_SNAPPY=ON" else SNAPPY_CMAKE_OPTION="-DENABLE_SNAPPY=OFF" fi if [ "$ENABLE_SSL" ]; then if [ "$OS" = "darwin" ]; then SSL_CMAKE_OPTION="-DENABLE_SSL:BOOL=DARWIN" else SSL_CMAKE_OPTION="-DENABLE_SSL:BOOL=OPENSSL" fi else SSL_CMAKE_OPTION="-DENABLE_SSL:BOOL=OFF" fi if [ "$LINK_STATIC" ]; then STATIC_CMAKE_OPTION="-DENABLE_STATIC=ON -DENABLE_TESTS=ON" else STATIC_CMAKE_OPTION="-DENABLE_STATIC=OFF -DENABLE_TESTS=OFF" fi ZSTD="AUTO" # Allow reuse of ccache compilation results between different build directories. export CCACHE_BASEDIR CCACHE_NOHASHDIR CCACHE_BASEDIR="$SCRATCH_DIR" CCACHE_NOHASHDIR=1 $CMAKE -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DCMAKE_PREFIX_PATH=$INSTALL_DIR/lib/cmake $SSL_CMAKE_OPTION $SNAPPY_CMAKE_OPTION $STATIC_CMAKE_OPTION -DENABLE_ZSTD=$ZSTD "$SCRATCH_DIR" $CMAKE --build . --parallel $CMAKE --build . --parallel --target install # Revert ccache options, they no longer apply. unset CCACHE_BASEDIR CCACHE_NOHASHDIR ls -l $INSTALL_DIR/lib set +o xtrace # Check on Linux that libmongoc is installed into lib/ like: # libmongoc-1.0.so -> libmongoc-1.0.so.0 # libmongoc-1.0.so.0 -> libmongoc-1.0.so.0.0.0 # libmongoc-1.0.so.0.0.0 if [ "$OS" != "darwin" ]; then # From check-symlink.sh check_symlink libmongoc-1.0.so libmongoc-1.0.so.0 check_symlink libmongoc-1.0.so.0 libmongoc-1.0.so.0.0.0 SONAME=$(objdump -p $INSTALL_DIR/lib/$LIB_SO|grep SONAME|awk '{print $2}') EXPECTED_SONAME="libmongoc-1.0.so.0" if [ "$SONAME" != "$EXPECTED_SONAME" ]; then echo "SONAME should be $EXPECTED_SONAME, not $SONAME" exit 1 else echo "library name check ok, SONAME=$SONAME" fi else # Just test that the shared lib was installed. if test ! -f $INSTALL_DIR/lib/$LIB_SO; then echo "$LIB_SO missing!" exit 1 else echo "$LIB_SO check ok" fi fi if test ! -f $INSTALL_DIR/lib/pkgconfig/libmongoc-1.0.pc; then echo "libmongoc-1.0.pc missing!" exit 1 else echo "libmongoc-1.0.pc check ok" fi if test ! -f $INSTALL_DIR/lib/cmake/mongoc-1.0/mongoc-1.0-config.cmake; then echo "mongoc-1.0-config.cmake missing!" exit 1 else echo "mongoc-1.0-config.cmake check ok" fi if test ! -f $INSTALL_DIR/lib/cmake/mongoc-1.0/mongoc-1.0-config-version.cmake; then echo "mongoc-1.0-config-version.cmake missing!" exit 1 else echo "mongoc-1.0-config-version.cmake check ok" fi if test ! -f $INSTALL_DIR/lib/cmake/mongoc-1.0/mongoc-targets.cmake; then echo "mongoc-targets.cmake missing!" exit 1 else echo "mongoc-targets.cmake check ok" fi if [ "$LINK_STATIC" ]; then if test ! -f $INSTALL_DIR/lib/libmongoc-static-1.0.a; then echo "libmongoc-static-1.0.a missing!" exit 1 else echo "libmongoc-static-1.0.a check ok" fi if test ! -f $INSTALL_DIR/lib/pkgconfig/libmongoc-static-1.0.pc; then echo "libmongoc-static-1.0.pc missing!" exit 1 else echo "libmongoc-static-1.0.pc check ok" fi else if test -f $INSTALL_DIR/lib/libmongoc-static-1.0.a; then echo "libmongoc-static-1.0.a shouldn't have been installed" exit 1 fi if test -f $INSTALL_DIR/lib/libmongoc-1.0.a; then echo "libmongoc-1.0.a shouldn't have been installed" exit 1 fi if test -f $INSTALL_DIR/lib/pkgconfig/libmongoc-static-1.0.pc; then echo "libmongoc-static-1.0.pc shouldn't have been installed" exit 1 fi fi if [ "$OS" = "darwin" ]; then if test -f $INSTALL_DIR/bin/mongoc-stat; then echo "mongoc-stat shouldn't have been installed" exit 1 fi else if test ! -f $INSTALL_DIR/bin/mongoc-stat; then echo "mongoc-stat missing!" exit 1 else echo "mongoc-stat check ok" fi fi if [ "$BUILD_SAMPLE_WITH_CMAKE" ]; then # Test our CMake package config file with CMake's find_package command. if [ "$BUILD_SAMPLE_WITH_CMAKE_DEPRECATED" ]; then EXAMPLE_DIR=$SRCROOT/src/libmongoc/examples/cmake-deprecated/find_package else EXAMPLE_DIR=$SRCROOT/src/libmongoc/examples/cmake/find_package fi if [ "$LINK_STATIC" ]; then EXAMPLE_DIR="${EXAMPLE_DIR}_static" fi cd $EXAMPLE_DIR $CMAKE -DCMAKE_PREFIX_PATH=$INSTALL_DIR/lib/cmake . $CMAKE --build . else # Test our pkg-config file. export PKG_CONFIG_PATH=$INSTALL_DIR/lib/pkgconfig cd $SRCROOT/src/libmongoc/examples if [ "$LINK_STATIC" ]; then echo "pkg-config output:" echo $(pkg-config --libs --cflags libmongoc-static-1.0) sh compile-with-pkg-config-static.sh else echo "pkg-config output:" echo $(pkg-config --libs --cflags libmongoc-1.0) sh compile-with-pkg-config.sh fi fi if [ ! "$LINK_STATIC" ]; then if [ "$OS" = "darwin" ]; then export DYLD_LIBRARY_PATH=$INSTALL_DIR/lib else export LD_LIBRARY_PATH=$INSTALL_DIR/lib fi fi echo "ldd hello_mongoc:" $LDD hello_mongoc ./hello_mongoc mongo-c-driver-1.26.0/.evergreen/scripts/llvm-gcov.sh000077500000000000000000000000441456567454500224470ustar00rootroot00000000000000#!/bin/bash exec llvm-cov gcov "$@" mongo-c-driver-1.26.0/.evergreen/scripts/man-pages-to-html.sh000066400000000000000000000021031456567454500237660ustar00rootroot00000000000000#!/bin/sh # Make HTML page of all man pages so we can see them in Evergreen. # # Command-line positional parameters: # # LIBNAME bson or mongoc, for the page title # DIRECTORY path to .3 files # # Is the "aha" program in CWD or installed systemwide? if [ -e "aha" ]; then AHA="./aha" else AHA="aha" fi echo " $1 man pages
    "
    
    for doc in $2/*.3; do
      fullpath=`pwd`/$doc
      name=$(basename $doc)
    
      if [ ! -e "$fullpath" ]; then
        >&2 echo "No .3 files in $2!"
        exit 1
      fi
    
      echo "
    $name

    "
    
      # suppress man's warnings "cannot break line" or "cannot adjust line"
      MAN_KEEP_FORMATTING=1 COLUMNS=80 man "$fullpath" 2>/dev/null | ul -t xterm | "$AHA" --no-header
    
      echo "

    " done echo "
    " mongo-c-driver-1.26.0/.evergreen/scripts/run-auth-tests.sh000066400000000000000000000164051456567454500234510ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set +o xtrace # Don't echo commands # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" declare c_timeout="connectTimeoutMS=30000&serverSelectionTryOnce=false" declare sasl="OFF" if grep -q "#define MONGOC_ENABLE_SASL 1" src/libmongoc/src/mongoc/mongoc-config.h; then sasl="ON" fi declare ssl="OFF" if grep -q "#define MONGOC_ENABLE_SSL 1" src/libmongoc/src/mongoc/mongoc-config.h; then ssl="ON" fi # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" # shellcheck source=.evergreen/scripts/bypass-dlclose.sh . "${script_dir}/bypass-dlclose.sh" declare ping declare test_gssapi declare ip_addr case "${OSTYPE}" in cygwin) ping="./src/libmongoc/Debug/mongoc-ping.exe" test_gssapi="./src/libmongoc/Debug/test-mongoc-gssapi.exe" ip_addr="$(getent hosts "${auth_host:?}" | head -n 1 | awk '{print $1}')" ;; darwin*) ping="./src/libmongoc/mongoc-ping" test_gssapi="./src/libmongoc/test-mongoc-gssapi" ip_addr="$(dig "${auth_host:?}" +short | tail -1)" ;; *) ping="./src/libmongoc/mongoc-ping" test_gssapi="./src/libmongoc/test-mongoc-gssapi" ip_addr="$(getent hosts "${auth_host:?}" | head -n 1 | awk '{print $1}')" ;; esac : "${ping:?}" : "${test_gssapi:?}" : "${ip_addr:?}" if command -v kinit >/dev/null && [[ -f /tmp/drivers.keytab ]]; then kinit -k -t /tmp/drivers.keytab -p drivers@LDAPTEST.10GEN.CC || true fi # Archlinux (which we use for testing various self-installed OpenSSL versions) # stores their trust list under /etc/ca-certificates/extracted/. # We need to copy it to our custom installed OpenSSL/LibreSSL trust store. declare pem_file="/etc/ca-certificates/extracted/tls-ca-bundle.pem" if [[ -f "${pem_file}" ]]; then [[ ! -d "${install_dir}" ]] || cp -v "${pem_file}" "${install_dir}/cert.pem" [[ ! -d "${install_dir}/ssl" ]] || cp -v "${pem_file}" "${install_dir}/ssl/cert.pem" [[ ! -d "${openssl_install_dir}" ]] || cp -v "${pem_file}" "${openssl_install_dir}/cert.pem" [[ ! -d "${openssl_install_dir}/ssl" ]] || cp -v "${pem_file}" "${openssl_install_dir}/ssl/cert.pem" fi # Custom OpenSSL library may be installed. Only prepend to LD_LIBRARY_PATH when # necessary to avoid conflicting with system binary requirements. declare openssl_lib_prefix="${LD_LIBRARY_PATH:-}" if [[ -d "${openssl_install_dir}" ]]; then openssl_lib_prefix="${openssl_install_dir}/lib:${openssl_lib_prefix:-}" fi # There may be additional certs required by auth tests. Direct OpenSSL to use # the system cert directory if available. [[ ! -d /etc/ssl/certs ]] || export SSL_CERT_DIR=/etc/ssl/certs ulimit -c unlimited || true if command -v ldd >/dev/null; then LD_LIBRARY_PATH="${openssl_lib_prefix}" ldd "${ping}" | grep "libssl" || true LD_LIBRARY_PATH="${openssl_lib_prefix}" ldd "${test_gssapi}" | grep "libssl" || true elif command -v otool >/dev/null; then # Try using otool on MacOS if ldd is not available. LD_LIBRARY_PATH="${openssl_lib_prefix}" otool -L "${ping}" | grep "libssl" || true LD_LIBRARY_PATH="${openssl_lib_prefix}" otool -L "${test_gssapi}" | grep "libssl" || true fi if [[ "${ssl}" != "OFF" ]]; then # FIXME: CDRIVER-2008 for the cygwin check if [[ "${OSTYPE}" != "cygwin" ]]; then echo "Authenticating using X.509" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "mongodb://CN=client,OU=kerneluser,O=10Gen,L=New York City,ST=New York,C=US@${auth_host}/?ssl=true&authMechanism=MONGODB-X509&sslClientCertificateKeyFile=src/libmongoc/tests/x509gen/ldaptest-client-key-and-cert.pem&sslCertificateAuthorityFile=src/libmongoc/tests/x509gen/ldaptest-ca-cert.crt&sslAllowInvalidHostnames=true&${c_timeout}" fi echo "Connecting to Atlas Free Tier" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_free:?}&${c_timeout}" echo "Connecting to Atlas Free Tier with SRV" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_free_srv:?}&${c_timeout}" echo "Connecting to Atlas Replica Set" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_replset:?}&${c_timeout}" echo "Connecting to Atlas Replica Set with SRV" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_replset_srv:?}${c_timeout}" echo "Connecting to Atlas Sharded Cluster" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_shard:?}&${c_timeout}" echo "Connecting to Atlas Sharded Cluster with SRV" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_shard_srv:?}${c_timeout}" if [[ -z "${require_tls12:-}" ]]; then echo "Connecting to Atlas with only TLS 1.1 enabled" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_tls11:?}&${c_timeout}" echo "Connecting to Atlas with only TLS 1.1 enabled with SRV" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_tls11_srv:?}${c_timeout}" fi echo "Connecting to Atlas with only TLS 1.2 enabled" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_tls12:?}&${c_timeout}" echo "Connecting to Atlas with only TLS 1.2 enabled with SRV" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_tls12_srv:?}${c_timeout}" echo "Connecting to Atlas Serverless with SRV" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_serverless_srv:?}/?${c_timeout}" echo "Connecting to Atlas Serverless" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "${atlas_serverless:?}&${c_timeout}" fi echo "Authenticating using PLAIN" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "mongodb://${auth_plain:?}@${auth_host}/?authMechanism=PLAIN&${c_timeout}" echo "Authenticating using default auth mechanism" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "mongodb://${auth_mongodbcr:?}@${auth_host}/mongodb-cr?${c_timeout}" if [[ "${sasl}" != "OFF" ]]; then echo "Authenticating using GSSAPI" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "mongodb://${auth_gssapi:?}@${auth_host}/?authMechanism=GSSAPI&${c_timeout}" echo "Authenticating with CANONICALIZE_HOST_NAME" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "mongodb://${auth_gssapi:?}@${ip_addr}/?authMechanism=GSSAPI&authMechanismProperties=CANONICALIZE_HOST_NAME:true&${c_timeout}" declare ld_preload="${LD_PRELOAD:-}" if [[ "${ASAN:-}" == "on" ]]; then ld_preload="$(bypass_dlclose):${ld_preload}" fi echo "Test threaded GSSAPI auth" LD_LIBRARY_PATH="${openssl_lib_prefix}" MONGOC_TEST_GSSAPI_HOST="${auth_host}" MONGOC_TEST_GSSAPI_USER="${auth_gssapi}" LD_PRELOAD="${ld_preload:-}" "${test_gssapi}" echo "Threaded GSSAPI auth OK" if [[ "${OSTYPE}" == "cygwin" ]]; then echo "Authenticating using GSSAPI (service realm: LDAPTEST.10GEN.CC)" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "mongodb://${auth_crossrealm:?}@${auth_host}/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_REALM:LDAPTEST.10GEN.CC&${c_timeout}" echo "Authenticating using GSSAPI (UTF-8 credentials)" LD_LIBRARY_PATH="${openssl_lib_prefix}" "${ping}" "mongodb://${auth_gssapi_utf8:?}@${auth_host}/?authMechanism=GSSAPI&${c_timeout}" fi fi mongo-c-driver-1.26.0/.evergreen/scripts/run-aws-tests.sh000077500000000000000000000144371456567454500233100ustar00rootroot00000000000000#!/usr/bin/env bash # Test runner for AWS authentication. # # This script is meant to be run in parts (so to isolate the AWS tests). # Pass the desired test as the environment variable TESTCASE: (REGULAR, EC2, ECS, ASSUME_ROLE, LAMBDA) # # Example: # TESTCASE=EC2 run-aws-tests.sh set -o errexit set -o pipefail # Do not trace set +o xtrace # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" # shellcheck source=.evergreen/scripts/use-tools.sh . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req TESTCASE declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare drivers_tools_dir drivers_tools_dir="$(to_absolute "${mongoc_dir}/../drivers-evergreen-tools")" declare test_awsauth="${mongoc_dir}/src/libmongoc/test-awsauth" if [[ "${OSTYPE}" == "cygwin" ]]; then test_awsauth="${mongoc_dir}/src/libmongoc/Debug/test-awsauth.exe" fi expect_success() { echo "Should succeed:" "${test_awsauth}" "${1:?}" "EXPECT_SUCCESS" || exit } expect_failure() { echo "Should fail:" "${test_awsauth}" "${1:?}" "EXPECT_FAILURE" || exit } if [[ "${TESTCASE}" == "REGULAR" ]]; then echo "===== Testing regular auth via URI =====" # Create user on $external db. pushd "${drivers_tools_dir}/.evergreen/auth_aws" # shellcheck source=/dev/null . aws_setup.sh regular # Sets USER and PASS : "${USER:?}" "${PASS:?}" popd # "${drivers_tools_dir}/.evergreen/auth_aws" expect_success "mongodb://${USER:?}:${PASS:?}@localhost/?authMechanism=MONGODB-AWS" expect_failure "mongodb://${USER:?}:bad_password@localhost/?authMechanism=MONGODB-AWS" exit fi if [[ "${TESTCASE}" == "ASSUME_ROLE" ]]; then echo "===== Testing auth with session token via URI with AssumeRole =====" pushd "${drivers_tools_dir}/.evergreen/auth_aws" # shellcheck source=/dev/null . aws_setup.sh assume-role # Sets USER, PASS, and SESSION_TOKEN : "${USER:?}" "${PASS:?}" "${SESSION_TOKEN:?}" popd # "${drivers_tools_dir}/.evergreen/auth_aws" expect_success "mongodb://${USER}:${PASS}@localhost/aws?authMechanism=MONGODB-AWS&authSource=\$external&authMechanismProperties=AWS_SESSION_TOKEN:${SESSION_TOKEN}" expect_failure "mongodb://${USER}:${PASS}@localhost/aws?authMechanism=MONGODB-AWS&authSource=\$external&authMechanismProperties=AWS_SESSION_TOKEN:bad_token" exit fi if [[ "LAMBDA" = "$TESTCASE" ]]; then ( echo "===== Testing auth via environment variables without session token =====" pushd "${drivers_tools_dir}/.evergreen/auth_aws" # shellcheck source=/dev/null . aws_setup.sh env-creds # Sets AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY : "${AWS_ACCESS_KEY_ID:?}" "${AWS_SECRET_ACCESS_KEY:?}" popd # "${drivers_tools_dir}/.evergreen/auth_aws" expect_success "mongodb://localhost/?authMechanism=MONGODB-AWS" ) ( echo "===== Testing auth via environment variables with session token =====" pushd "${drivers_tools_dir}/.evergreen/auth_aws" # shellcheck source=/dev/null . aws_setup.sh session-creds # Sets AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_SESSION_TOKEN : "${AWS_ACCESS_KEY_ID:?}" "${AWS_SECRET_ACCESS_KEY:?}" "${AWS_SESSION_TOKEN:?}" popd # "${drivers_tools_dir}/.evergreen/auth_aws" expect_success "mongodb://localhost/?authMechanism=MONGODB-AWS" ) exit fi if [[ "${TESTCASE}" == "EC2" ]]; then echo "===== Testing auth via EC2 task metadata =====" # Do necessary setup for EC2 # Create user on $external db. pushd "${drivers_tools_dir}/.evergreen/auth_aws" # shellcheck source=/dev/null . aws_setup.sh ec2 popd # "${drivers_tools_dir}/.evergreen/auth_aws" echo "Valid credentials via EC2 - should succeed" expect_success "mongodb://localhost/?authMechanism=MONGODB-AWS" exit fi if [[ "${TESTCASE}" == "ECS" ]]; then echo "===== Testing auth via ECS task metadata =====" [[ -d "${drivers_tools_dir}" ]] # Set up the target directory. ECS_SRC_DIR=${drivers_tools_dir}/.evergreen/auth_aws/src mkdir -p "${ECS_SRC_DIR}/.evergreen" # Move the test script to the correct location. cp "${script_dir}/run-mongodb-aws-ecs-test.sh" "${ECS_SRC_DIR}/.evergreen" # Move artifacts needed for test to $ECS_SRC_DIR cp "${mongoc_dir}/src/libmongoc/test-awsauth" "${ECS_SRC_DIR}/" # Run the test pushd "${drivers_tools_dir}/.evergreen/auth_aws" PROJECT_DIRECTORY="$ECS_SRC_DIR" MONGODB_BINARIES=${mongoc_dir}/mongodb/bin ./aws_setup.sh ecs popd # "${drivers_tools_dir}/.evergreen/auth_aws" exit fi if [[ "${TESTCASE}" == "ASSUME_ROLE_WITH_WEB_IDENTITY" ]]; then echo "===== Testing auth via Web Identity =====" # Do necessary setup. # Create user on $external db. pushd "${drivers_tools_dir}/.evergreen/auth_aws" # shellcheck source=/dev/null . aws_setup.sh web-identity # Sets AWS_ROLE_ARN and AWS_WEB_IDENTITY_TOKEN_FILE : "${AWS_ROLE_ARN:?}" "${AWS_WEB_IDENTITY_TOKEN_FILE:?}" popd # "${drivers_tools_dir}/.evergreen/auth_aws" echo "Valid credentials via Web Identity - should succeed" AWS_ROLE_ARN="${AWS_ROLE_ARN}" \ AWS_WEB_IDENTITY_TOKEN_FILE="${AWS_WEB_IDENTITY_TOKEN_FILE}" \ expect_success "mongodb://localhost/?authMechanism=MONGODB-AWS" echo "Valid credentials via Web Identity with session name - should succeed" AWS_ROLE_ARN="${AWS_ROLE_ARN}" \ AWS_WEB_IDENTITY_TOKEN_FILE="${AWS_WEB_IDENTITY_TOKEN_FILE}" \ AWS_ROLE_SESSION_NAME=test \ expect_success "mongodb://localhost/?authMechanism=MONGODB-AWS" echo "Invalid AWS_ROLE_ARN via Web Identity with session name - should fail" AWS_ROLE_ARN="invalid_role_arn" \ AWS_WEB_IDENTITY_TOKEN_FILE="${AWS_WEB_IDENTITY_TOKEN_FILE}" \ expect_failure "mongodb://localhost/?authMechanism=MONGODB-AWS" echo "Invalid AWS_WEB_IDENTITY_TOKEN_FILE via Web Identity with session name - should fail" AWS_ROLE_ARN="${AWS_ROLE_ARN}" \ AWS_WEB_IDENTITY_TOKEN_FILE="/invalid/path" \ expect_failure "mongodb://localhost/?authMechanism=MONGODB-AWS" echo "Invalid AWS_ROLE_SESSION_NAME via Web Identity with session name - should fail" AWS_ROLE_ARN="${AWS_ROLE_ARN}" \ AWS_WEB_IDENTITY_TOKEN_FILE="${AWS_WEB_IDENTITY_TOKEN_FILE}" \ AWS_ROLE_SESSION_NAME="contains_invalid_character_^" \ expect_failure "mongodb://localhost/?authMechanism=MONGODB-AWS" exit fi echo "Unexpected testcase '${TESTCASE}'" 1>&2 exit 1 mongo-c-driver-1.26.0/.evergreen/scripts/run-mock-server-tests.sh000077500000000000000000000027371456567454500247530ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt ASAN "OFF" check_var_opt CC check_var_opt MARCH check_var_opt DNS "nodns" declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare -a test_args=( "-d" "-F" "test-results.json" "--skip-tests" ".evergreen/etc/skip-tests.txt" ) # AddressSanitizer configuration export ASAN_OPTIONS="detect_leaks=1 abort_on_error=1 symbolize=1" export ASAN_SYMBOLIZER_PATH="/usr/lib/llvm-3.4/bin/llvm-symbolizer" export MONGOC_TEST_FUTURE_TIMEOUT_MS=30000 export MONGOC_TEST_SERVER_LOG="json" export MONGOC_TEST_SKIP_MOCK="off" export MONGOC_TEST_SKIP_LIVE="on" export MONGOC_TEST_SKIP_SLOW="on" export MONGOC_TEST_IPV4_AND_IPV6_HOST="ipv4_and_ipv6.test.build.10gen.cc" # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" # shellcheck source=.evergreen/scripts/bypass-dlclose.sh . "${script_dir}/bypass-dlclose.sh" declare ld_preload="${LD_PRELOAD:-}" if [[ "${ASAN}" == "on" ]]; then ld_preload="$(bypass_dlclose):${ld_preload}" fi case "${OSTYPE}" in cygwin) LD_PRELOAD="${ld_preload:-}" ./src/libmongoc/test-libmongoc.exe "${test_args[@]}" ;; *) ulimit -c unlimited || true LD_PRELOAD="${ld_preload:-}" ./src/libmongoc/test-libmongoc --no-fork "${test_args[@]}" ;; esac mongo-c-driver-1.26.0/.evergreen/scripts/run-mongodb-aws-ecs-test.sh000066400000000000000000000007171456567454500253110ustar00rootroot00000000000000#!/usr/bin/env bash # run-mongodb-aws-ecs-test.sh is intended to run on a remote ECS host. # For a description of ECS tests, see: https://github.com/mongodb-labs/drivers-evergreen-tools/tree/b01493d57e6716cb6385afaa4dc06330e4f33e01/.evergreen/auth_aws#ecs-test-process # ECS tests have paths /root/src echo "run-mongodb-aws-ecs-test.sh" expect_success() { echo "Should succeed:" /root/src/test-awsauth "${1:?}" "EXPECT_SUCCESS" } expect_success "${1:?}" mongo-c-driver-1.26.0/.evergreen/scripts/run-ocsp-cache-test.sh000077500000000000000000000066441456567454500243410ustar00rootroot00000000000000#!/usr/bin/env bash # End-to-end test runner for OCSP cache. # # Assumptions: # Mongod: # The script assumes that a mongod is running with TLS enabled. It also assumes that the server certificate will NOT # staple a response. This will force the test binary to reach out to an OCSP responder to check the certificates' # revocation status. # Mock OCSP Responder: # This script assumes that a mock OCSP responder is running named "ocsp_mock". It also assumes that the OCSP # responder will respond with a certificate status of 'revoked'. # # Behavior: # This script first runs the test binary 'test-mongoc-cache' which sends a ping command to the mongod. It then waits for 5 # seconds to give the binary enough time to make the request, and receive and process the response. Since we soft-fail # if an OCSP responder is not reachable, receiving a certificate status of 'revoked' is the only way we can be certain # our binary reached out to an OCSP responder. We assert a certificate status of 'revoked' in the test binary for both # ping commands. # # The test binary will hang (it calls 'raise (SIGSTOP)') after the first ping. This gives us enough time to kill the # mock OCSP responder before sending the second ping command to the server. If the cache is used, the expected behavior, # then the binary will use the response cached from the first ping command and report a certificate status of 'revoked'. # However, if the cache is not used, then second ping command will attempt to reach out to an OCSP responder. Since the # only one available was killed by this script and we soft-fail if we cannot contact an OCSP responder the binary # will report a certificate status of "good". # # The aforementioned behavior is asserted in the test binary, i.e., both ping commands should fail. If they do, # test-mongoc-cache will return EXIT_SUCCESS, otherwise, it will return EXIT_FAILURE. # # Environment variables: # # CERT_TYPE # Required. Set to either RSA or ECDSA. set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req CERT_TYPE declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" if ! pgrep -nf mongod >/dev/null; then echo "Cannot find mongod. See file comments for help." 1>&2 exit 1 fi if ! pgrep -nf ocsp_mock >/dev/null; then echo "Cannot find mock OCSP responder. See file comments for help." 1>&2 exit 1 fi # Custom OpenSSL library may be installed. Only prepend to LD_LIBRARY_PATH when # necessary to avoid conflicting with system binary requirements. declare openssl_lib_prefix="${LD_LIBRARY_PATH:-}" if [[ -d "${openssl_install_dir}" ]]; then openssl_lib_prefix="${openssl_install_dir}/lib:${openssl_lib_prefix:-}" fi # This test will hang after the first ping. LD_LIBRARY_PATH="${openssl_lib_prefix}" "${mongoc_dir}/src/libmongoc/test-mongoc-cache" "${mongoc_dir}/.evergreen/ocsp/${CERT_TYPE}/ca.pem" & sleep 5 # Give the program time to contact the OCSP responder pkill -nf "ocsp_mock" # We assume that the mock OCSP responder is named "ocsp_mock" # Resume the test binary. This will cause it to send the second ping command. kill -s SIGCONT "$(pgrep -nf test-mongoc-cache)" mongo-c-driver-1.26.0/.evergreen/scripts/run-ocsp-responder.sh000066400000000000000000000047421456567454500243140ustar00rootroot00000000000000#!/usr/bin/env bash # Run an OCSP mock responder server if necessary. # # See the tests described in the specification for more info: # https://github.com/mongodb/specifications/tree/master/source/ocsp-support/tests#integration-tests-permutations-to-be-tested. # Precondition: mongod is NOT running. The responder should be started first. # # Environment variables: # # TEST_COLUMN # Required. Corresponds to a column of the test matrix. Set to one of the following: # TEST_1, TEST_2, TEST_3, TEST_4, SOFT_FAIL_TEST, MALICIOUS_SERVER_TEST_1, MALICIOUS_SERVER_TEST_2 # CERT_TYPE # Required. Set to either rsa or ecdsa. # USE_DELEGATE # Required. May be ON or OFF. If a test requires use of a responder, this decides whether # the responder uses a delegate certificate. Defaults to "OFF" # # Example: # TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF ./run-ocsp-test.sh # set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req TEST_COLUMN check_var_req CERT_TYPE check_var_req USE_DELEGATE declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare responder_required case "${TEST_COLUMN}" in TEST_1) responder_required="valid" ;; TEST_2) responder_required="invalid" ;; TEST_3) responder_required="valid" ;; TEST_4) responder_required="invalid" ;; MALICIOUS_SERVER_TEST_1) responder_required="invalid" ;; esac # Same responder is used for both server and client. So even stapling tests require a responder. if [[ -n "${responder_required:-}" ]]; then echo "Starting mock responder" pushd ../drivers-evergreen-tools/.evergreen/ocsp # shellcheck source=/dev/null . ./activate-ocspvenv.sh popd # ../drivers-evergreen-tools/.evergreen/ocsp pushd "${mongoc_dir}/.evergreen/ocsp/${CERT_TYPE}" declare -a fault_args if [ "${responder_required}" == "invalid" ]; then fault_args=("--fault" "revoked") fi declare responder_signer if [[ "${USE_DELEGATE}" == "ON" ]]; then responder_signer="ocsp-responder" else responder_signer="ca" fi python ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert "${responder_signer}.crt" \ --ocsp_responder_key "${responder_signer}.key" \ -p 8100 -v "${fault_args[@]}" \ >"${mongoc_dir}/responder.log" 2>&1 & popd # "${mongoc_dir}/.evergreen/ocsp/${CERT_TYPE}" fi mongo-c-driver-1.26.0/.evergreen/scripts/run-ocsp-test.sh000077500000000000000000000120551456567454500232710ustar00rootroot00000000000000#!/usr/bin/env bash # Test runner for OCSP revocation checking. # # Closely models the tests described in the specification: # https://github.com/mongodb/specifications/tree/master/source/ocsp-support/tests#integration-tests-permutations-to-be-tested. # Based on the test case, this may start a mock responder process. # Preconditions: # - A mock responder configured for the test case is running (use run-ocsp-responder.sh – before running mongod). # - mongod is running with the correct configuration. (use integration-tests.sh or spawn one manually). # # Environment variables: # # TEST_COLUMN # Required. Corresponds to a column of the test matrix. Set to one of the following: # TEST_1, TEST_2, TEST_3, TEST_4, SOFT_FAIL_TEST, MALICIOUS_SERVER_TEST_1, MALICIOUS_SERVER_TEST_2 # CERT_TYPE # Required. Set to either rsa or ecdsa. # MONGODB_PORT # Optional. A custom port to connect to. Defaults to 27017. # # Example: # TEST_COLUMN=TEST_1 CERT_TYPE=rsa ./run-ocsp-test.sh # set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req TEST_COLUMN check_var_req CERT_TYPE check_var_opt MONGODB_PORT "27017" declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" declare responder_required case "${TEST_COLUMN}" in TEST_1) responder_required="valid" ;; TEST_2) responder_required="invalid" ;; TEST_3) responder_required="valid" ;; TEST_4) responder_required="invalid" ;; MALICIOUS_SERVER_TEST_1) responder_required="invalid" ;; esac on_exit() { echo "Cleaning up" if [[ -n "${responder_required:-}" ]]; then echo "Responder logs:" cat "${mongoc_dir}/responder.log" pkill -f "ocsp_mock" || true fi } trap on_exit EXIT declare mongoc_ping="${mongoc_dir}/src/libmongoc/mongoc-ping" # Add libmongoc-1.0 and libbson-1.0 to library path, so mongoc-ping can find them at runtime. if [[ "${OSTYPE}" == "cygwin" ]]; then export PATH PATH+=":${mongoc_dir}/src/libmongoc/Debug" PATH+=":${mongoc_dir}/src/libbson/Debug" chmod -f +x src/libmongoc/Debug/* src/libbson/Debug/* || true mongoc_ping="${mongoc_dir}/src/libmongoc/Debug/mongoc-ping.exe" elif [[ "${OSTYPE}" == darwin* ]]; then export DYLD_LIBRARY_PATH DYLD_LIBRARY_PATH+=":${mongoc_dir}/src/libmongoc" DYLD_LIBRARY_PATH+=":${mongoc_dir}/src/libbson" else export LD_LIBRARY_PATH LD_LIBRARY_PATH+=":${mongoc_dir}/src/libmongoc" LD_LIBRARY_PATH+=":${mongoc_dir}/src/libbson" fi # Custom OpenSSL library may be installed. Only prepend to LD_LIBRARY_PATH when # necessary to avoid conflicting with system binary requirements. declare openssl_lib_prefix="${LD_LIBRARY_PATH:-}" if [[ -d "${openssl_install_dir}" ]]; then openssl_lib_prefix="${openssl_install_dir}/lib:${openssl_lib_prefix:-}" fi expect_success() { echo "Should succeed:" if ! LD_LIBRARY_PATH="${openssl_lib_prefix}" "${mongoc_ping}" "${MONGODB_URI}"; then echo "Unexpected failure" 1>&2 exit 1 fi } expect_failure() { echo "Should fail:" if LD_LIBRARY_PATH="${openssl_lib_prefix}" "${mongoc_ping}" "${MONGODB_URI}" >output.txt 2>&1; then echo "Unexpected - succeeded but it should not have" 1>&2 cat output.txt exit 1 else echo "failed as expected" fi # libmongoc really should give a better error message for a revocation failure... # It is not at all obvious what went wrong. if ! grep "No suitable servers found" output.txt >/dev/null; then echo "Unexpected error, expecting TLS handshake failure" 1>&2 cat output.txt exit 1 fi } echo "Clearing OCSP cache for macOS/Windows" case "${OSTYPE}" in darwin*) find ~/Library/Keychains -name 'ocspcache.sqlite3' -exec sqlite3 "{}" 'DELETE FROM responses' \; || true ;; cygwin) certutil -urlcache "*" delete || true ;; esac # Always add the tlsCAFile declare ca_path="${mongoc_dir}/.evergreen/ocsp/${CERT_TYPE}/ca.pem" declare base_uri="mongodb://localhost:${MONGODB_PORT}/?tls=true&tlsCAFile=${ca_path}" # Only a handful of cases are expected to fail. if [[ "${TEST_COLUMN}" == "TEST_1" ]]; then MONGODB_URI="${base_uri}" expect_success elif [[ "${TEST_COLUMN}" == "TEST_2" ]]; then MONGODB_URI="${base_uri}" expect_failure elif [[ "${TEST_COLUMN}" == "TEST_3" ]]; then MONGODB_URI="${base_uri}" expect_success elif [[ "${TEST_COLUMN}" == "TEST_4" ]]; then MONGODB_URI="${base_uri}" expect_failure elif [[ "${TEST_COLUMN}" == "SOFT_FAIL_TEST" ]]; then MONGODB_URI="${base_uri}" expect_success elif [[ "${TEST_COLUMN}" == "MALICIOUS_SERVER_TEST_1" ]]; then MONGODB_URI="${base_uri}" expect_failure elif [[ "${TEST_COLUMN}" == "MALICIOUS_SERVER_TEST_2" ]]; then MONGODB_URI="${base_uri}" expect_failure fi # With insecure options, connection should always succeed MONGODB_URI="${base_uri}&tlsInsecure=true" expect_success # With insecure options, connection should always succeed MONGODB_URI="${base_uri}&tlsAllowInvalidCertificates=true" expect_success mongo-c-driver-1.26.0/.evergreen/scripts/run-tests-mingw.bat000066400000000000000000000014201456567454500237540ustar00rootroot00000000000000set PATH=C:\Windows\system32;C:\Windows;C:\mingw-w64\x86_64-4.9.1-posix-seh-rt_v3-rev1\mingw64\bin;C:\mongo-c-driver\bin rem "make install" would work, except we run tests on different Evergreen hosts, rem in different working directories, than where the driver was built. This rem causes errors in "make install" like: rem CMake Error at cmake_install cannot find rem "C:/data/mci/d3ba3391950aca9119e841818a8884bc/mongoc/src/libbson/libbson-1.0.dll" rem rem So just copy files manually rmdir /Q /S C:\mongo-c-driver md C:\mongo-c-driver md C:\mongo-c-driver\bin copy /Y libmongoc-1.0.dll C:\mongo-c-driver\bin copy /Y src\libbson\libbson-1.0.dll C:\mongo-c-driver\bin .\src\libmongoc\test-libmongoc.exe --no-fork -d -F test-results.json --skip-tests .evergreen\etc\skip-tests.txt mongo-c-driver-1.26.0/.evergreen/scripts/run-tests.sh000077500000000000000000000242201456567454500225070ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt ASAN "OFF" check_var_opt AUTH "noauth" check_var_opt CC check_var_opt CLIENT_SIDE_ENCRYPTION check_var_opt COMPRESSORS "nocompressors" check_var_opt COVERAGE # CMake default: OFF. check_var_opt DNS "nodns" check_var_opt IPV4_ONLY check_var_opt LOADBALANCED "noloadbalanced" check_var_opt MARCH check_var_opt MONGODB_API_VERSION check_var_opt MULTI_MONGOS_LB_URI check_var_opt SINGLE_MONGOS_LB_URI check_var_opt SKIP_CRYPT_SHARED_LIB check_var_opt SSL "nossl" check_var_opt URI declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" if [[ "${COMPRESSORS}" != "nocompressors" ]]; then export MONGOC_TEST_COMPRESSORS="${COMPRESSORS}" fi if [[ "${AUTH}" != "noauth" ]]; then export MONGOC_TEST_USER="bob" export MONGOC_TEST_PASSWORD="pwd123" fi if [[ "${SSL}" != "nossl" ]]; then export MONGOC_TEST_SSL_WEAK_CERT_VALIDATION="off" export MONGOC_TEST_SSL_PEM_FILE="src/libmongoc/tests/x509gen/client.pem" export MONGOC_TEST_SSL_CA_FILE="src/libmongoc/tests/x509gen/ca.pem" fi export MONGOC_ENABLE_MAJORITY_READ_CONCERN=on export MONGOC_TEST_FUTURE_TIMEOUT_MS=30000 export MONGOC_TEST_URI="${URI}" export MONGOC_TEST_SERVER_LOG="json" export MONGOC_TEST_SKIP_MOCK="on" export MONGOC_TEST_IPV4_AND_IPV6_HOST="ipv4_and_ipv6.test.build.10gen.cc" if [[ "${IPV4_ONLY}" != "on" ]]; then export MONGOC_CHECK_IPV6="on" fi # Only set creds if testing with Client Side Encryption. # libmongoc may build with CSE enabled (if the host has libmongocrypt installed) # and will try to run those tests (which fail on ASAN unless spawning is bypassed). if [[ -n "${CLIENT_SIDE_ENCRYPTION}" ]]; then echo "Testing with Client Side Encryption enabled." echo "Setting temporary credentials..." pushd "${mongoc_dir}/../drivers-evergreen-tools/.evergreen/csfle" { export AWS_SECRET_ACCESS_KEY="${client_side_encryption_aws_secret_access_key:?}" export AWS_ACCESS_KEY_ID="${client_side_encryption_aws_access_key_id:?}" export AWS_DEFAULT_REGION="us-east-1" } &>/dev/null echo "Running activate-kmstlsvenv.sh..." # shellcheck source=/dev/null . ./activate-kmstlsvenv.sh echo "Running activate-kmstlsvenv.sh... done." echo "Running set-temp-creds.sh..." # shellcheck source=/dev/null . ./set-temp-creds.sh echo "Running set-temp-creds.sh... done." deactivate popd # "${mongoc_dir}/../drivers-evergreen-tools/.evergreen/csfle" echo "Setting temporary credentials... done." # Ensure temporary credentials were properly set. if [ -z "${CSFLE_AWS_TEMP_ACCESS_KEY_ID}" ]; then echo "Failed to set temporary credentials!" 1>&2 exit 1 fi echo "Setting KMS credentials from the environment..." { export MONGOC_TEST_AWS_TEMP_ACCESS_KEY_ID="${CSFLE_AWS_TEMP_ACCESS_KEY_ID:?}" export MONGOC_TEST_AWS_TEMP_SECRET_ACCESS_KEY="${CSFLE_AWS_TEMP_SECRET_ACCESS_KEY:?}" export MONGOC_TEST_AWS_TEMP_SESSION_TOKEN="${CSFLE_AWS_TEMP_SESSION_TOKEN:?}" export MONGOC_TEST_AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}" export MONGOC_TEST_AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}" export MONGOC_TEST_AWSNAME2_SECRET_ACCESS_KEY="${client_side_encryption_awsname2_secret_access_key}" export MONGOC_TEST_AWSNAME2_ACCESS_KEY_ID="${client_side_encryption_awsname2_access_key_id}" export MONGOC_TEST_AZURE_TENANT_ID="${client_side_encryption_azure_tenant_id:?}" export MONGOC_TEST_AZURE_CLIENT_ID="${client_side_encryption_azure_client_id:?}" export MONGOC_TEST_AZURE_CLIENT_SECRET="${client_side_encryption_azure_client_secret:?}" export MONGOC_TEST_GCP_EMAIL="${client_side_encryption_gcp_email:?}" export MONGOC_TEST_GCP_PRIVATEKEY="${client_side_encryption_gcp_privatekey:?}" } &>/dev/null echo "Setting KMS credentials from the environment... done." export MONGOC_TEST_CSFLE_TLS_CA_FILE="src/libmongoc/tests/x509gen/ca.pem" export MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE="src/libmongoc/tests/x509gen/client.pem" export SKIP_CRYPT_SHARED_LIB="${SKIP_CRYPT_SHARED_LIB}" fi # Sanitizer environment variables. export ASAN_OPTIONS="detect_leaks=1 abort_on_error=1 symbolize=1" export ASAN_SYMBOLIZER_PATH="/opt/mongodbtoolchain/v3/bin/llvm-symbolizer" export TSAN_OPTIONS="suppressions=./.tsan-suppressions" export UBSAN_OPTIONS="print_stacktrace=1 abort_on_error=1" declare -a test_args=( "-d" "-F" "test-results.json" "--skip-tests" ".evergreen/etc/skip-tests.txt" ) # TODO (CDRIVER-4045): consolidate DNS tests into regular test tasks. if [[ "${DNS}" != "nodns" ]]; then if [[ "${CC}" =~ mingw ]]; then echo "ERROR - DNS tests not implemented for MinGW yet" 1>&2 exit 1 fi test_args+=("-l" "/initial_dns_seedlist_discovery/*") if [[ "${DNS}" = "loadbalanced" ]]; then export MONGOC_TEST_DNS_LOADBALANCED=on else export MONGOC_TEST_DNS=on fi fi wait_for_server() { declare name="${1:?"wait_for_server requires a server name"}" declare port="${2:?"wait_for_server requires a server port"}" for _ in $(seq 300); do # Exit code 7: "Failed to connect to host". if curl -s --max-time 1 "localhost:${port}" >/dev/null test ${?} -ne 7 then return 0 else sleep 1 fi done echo "Could not detect ${name} server on port ${port}" 1>&2 return 1 } if [[ "${CC}" =~ mingw ]]; then echo "Waiting for simple HTTP server to start..." wait_for_server "simple HTTP" 8000 echo "Waiting for simple HTTP server to start... done." chmod -f +x ./src/libmongoc/test-libmongoc.exe cmd.exe /c "$(native-path "${script_dir}/run-tests-mingw.bat")" exit fi # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" # shellcheck source=.evergreen/scripts/bypass-dlclose.sh . "${script_dir}/bypass-dlclose.sh" check_mongocryptd() { if [[ "${CLIENT_SIDE_ENCRYPTION}" == "on" && "${ASAN}" == "on" ]]; then # ASAN does not play well with spawned processes. In addition to --no-fork, do not spawn mongocryptd # for client-side encryption tests. export MONGOC_TEST_MONGOCRYPTD_BYPASS_SPAWN="on" mongocryptd --logpath ./mongocryptd.logs --fork --pidfilepath="$(pwd)/mongocryptd.pid" fi } export MONGOC_TEST_MONITORING_VERBOSE=on # Limit tests to execute and ensure required servers are running. if [[ "${CLIENT_SIDE_ENCRYPTION}" == "on" ]]; then echo "Waiting for mock KMS servers to start..." wait_for_server "mock KMS" 8999 wait_for_server "mock KMS" 9000 wait_for_server "mock KMS" 9001 wait_for_server "mock KMS" 9002 wait_for_server "mock KMIP" 5698 echo "Waiting for mock KMS servers to start... done." # Check if tests should use the crypt_shared library. if [[ "${SKIP_CRYPT_SHARED_LIB}" == "on" ]]; then echo "crypt_shared library is skipped due to SKIP_CRYPT_SHARED_LIB=on" elif [[ -d /cygdrive/c ]]; then # We have trouble with this test on Windows. only set cryptSharedLibPath on other platforms echo "crypt_shared library is skipped due to running on Windows" else export MONGOC_TEST_CRYPT_SHARED_LIB_PATH="${CRYPT_SHARED_LIB_PATH}" echo "crypt_shared library will be loaded with cryptSharedLibPath: [${MONGOC_TEST_CRYPT_SHARED_LIB_PATH}]" fi # Limit tests executed to CSE tests. test_args+=("-l" "/client_side_encryption/*") fi if [[ "${LOADBALANCED}" != "noloadbalanced" ]]; then if [[ -z "${SINGLE_MONGOS_LB_URI}" || -z "${MULTI_MONGOS_LB_URI}" ]]; then echo "SINGLE_MONGOS_LB_URI and MULTI_MONGOS_LB_URI environment variables required." 1>&2 exit 1 fi # Limit tests executed to load balancer tests. export MONGOC_TEST_LOADBALANCED=ON # Limit tests executed to load balancer tests. test_args+=("-l" "/unified/*") test_args+=("-l" "/retryable_reads/*") test_args+=("-l" "/retryable_writes/*") test_args+=("-l" "/change_streams/*") test_args+=("-l" "/loadbalanced/*") test_args+=("-l" "/load_balancers/*") test_args+=("-l" "/crud/unified/*") test_args+=("-l" "/transactions/unified/*") test_args+=("-l" "/collection-management/*") test_args+=("-l" "/sessions/unified/*") test_args+=("-l" "/change_streams/unified/*") test_args+=("-l" "/versioned_api/*") test_args+=("-l" "/command_monitoring/unified/*") fi if [[ ! "${test_args[*]}" =~ "-l" ]]; then # /http tests are only run if the set of tests to execute were not limited. echo "Waiting for simple HTTP server to start..." wait_for_server "simple HTTP" 18000 echo "Waiting for simple HTTP server to start... done." fi declare ld_preload="${LD_PRELOAD:-}" if [[ "${ASAN}" == "on" ]]; then ld_preload="$(bypass_dlclose):${ld_preload}" fi case "${OSTYPE}" in cygwin) export PATH PATH+=":/cygdrive/c/mongodb/bin" PATH+=":/cygdrive/c/libmongocrypt/bin" check_mongocryptd chmod -f +x src/libmongoc/Debug/test-libmongoc.exe LD_PRELOAD="${ld_preload:-}" ./src/libmongoc/Debug/test-libmongoc.exe "${test_args[@]}" ;; *) ulimit -c unlimited || true # Need mongocryptd on the path. export PATH PATH+=":$(pwd)/mongodb/bin" check_mongocryptd # Custom OpenSSL library may be installed. Only prepend to LD_LIBRARY_PATH # when necessary to avoid conflicting with system binary requirements. declare openssl_lib_prefix="${LD_LIBRARY_PATH:-}" if [[ -d "${openssl_install_dir}" ]]; then openssl_lib_prefix="${openssl_install_dir}/lib:${openssl_lib_prefix:-}" fi LD_LIBRARY_PATH="${openssl_lib_prefix}" LD_PRELOAD="${ld_preload:-}" ./src/libmongoc/test-libmongoc --no-fork "${test_args[@]}" ;; esac if [[ "${COVERAGE}" == "ON" ]]; then declare -a coverage_args=( "--capture" "--derive-func-data" "--directory" "." "--output-file" ".coverage.lcov" "--no-external" ) { case "${CC}" in clang) lcov --gcov-tool "$(pwd)/.evergreen/scripts/llvm-gcov.sh" "${coverage_args[@]}" ;; *) lcov --gcov-tool gcov "${coverage_args[@]}" ;; esac genhtml .coverage.lcov --legend --title "mongoc code coverage" --output-directory coverage } | perl -lne 'print if not m|Processing |' fi mongo-c-driver-1.26.0/.evergreen/scripts/simple_http_server.py000077500000000000000000000014751456567454500245060ustar00rootroot00000000000000#!/usr/bin/env python3 # A simple HTTP server used by /http tests. import http from http.server import BaseHTTPRequestHandler, HTTPServer class Simple(BaseHTTPRequestHandler): def do_GET(self): self.send_response(http.HTTPStatus.OK) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write( 'Response to GET by simple HTTP server'.encode('utf-8')) def do_POST(self): self.send_response(http.HTTPStatus.OK) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write( 'Response to POST by simple HTTP server'.encode('utf-8')) def main(): HTTPServer(server_address=('', 18000), RequestHandlerClass=Simple).serve_forever() if __name__ == '__main__': main() mongo-c-driver-1.26.0/.evergreen/scripts/use-tools.sh000066400000000000000000000001601456567454500224670ustar00rootroot00000000000000#!/usr/bin/env bash # Call out to tools/use.sh source "$(dirname "${BASH_SOURCE[0]}")/../../tools/use.sh" "$@" mongo-c-driver-1.26.0/.gdbinit000066400000000000000000000106401456567454500160770ustar00rootroot00000000000000define printbson set $bson = $arg0 if $bson->flags & BSON_FLAG_INLINE print ((bson_impl_inline_t*) $bson)->data set $data = &(((bson_impl_inline_t*) $bson)->data) printf "INLINE" __printbson $data else set $impl = (bson_impl_alloc_t*) $bson printf "ALLOC [%p + %d]", $impl->buf, $impl->offset __printbson (*$impl->buf) + $impl->data end end define __printbson set $bson = ((uint32_t*)$arg0) printf " (len=%d)\n", $bson[0] printf "{\n" __printElements ($bson+1) 0 1 printf "\n}\n" end define __printElements set $data = ((uint8_t*)$arg0) set $isDocument = $arg1 set $depth = $arg2 set $addComma = 0 while $data != 0 set $type = (uint8_t)($data[0]) if $type == 0 loop_break end if $addComma == 1 printf ",\n" end set $addComma = 1 __printSpaces $depth printf "'%s' : ", (char*) ($data+1) # skip through C String while $data[0] != '\0' set $data = $data + 1 end set $data = $data + 1 if $type == 0x01 __printDouble $data end if $type == 0x02 __printString $data end if $type == 0x03 __printDocument $data $depth end if $type == 0x04 __printArray $data $depth end if $type == 0x05 __printBinary $data end if $type == 0x07 __printObjectID $data end if $type == 0x08 __printBool $data end if $type == 0x09 __printUtcDateTime $data end if $type == 0x0a __printNull end if $type == 0x0b __printRegex $data end if $type == 0x0d __printJavascript $data end if $type == 0x0e __printSymbol $data end if $type == 0x0f __printJavascriptWScope $data end if $type == 0x10 __printInt32 $data end if $type == 0x11 __printTimestamp $data end if $type == 0x12 __printInt64 $data end end end define __printSpaces set $i = 0 while $i < (4 * $arg0) printf " " set $i = $i + 1 end end define __printDocument set $value = ((uint8_t*) $arg0) set $depth = $arg1 printf "{\n" __printElements ($value+4) 1 ($depth+1) printf "\n" __printSpaces ($depth-1) printf "}" set $depth = $depth-1 set $data = $data + 1 end define __printArray set $value = ((uint8_t*) $arg0) set $depth = $arg1 printf "[\n" __printElements ($value+4) (0) ($depth+1) printf "\n" __printSpaces ($depth-1) printf "]" set $depth = $depth-1 set $data = $data + 1 end define __printDouble set $value = ((double*) $arg0) printf "%f", $value[0] set $data = $data + 8 end define __printString set $value = ((char*) $arg0) + 4 printf "\"%s\"", $value set $data = $data + 4 + ((uint32_t*)$data)[0] end define __printBinary set $value = ((uint8_t*) $arg0) set $length = ((int32_t*) $arg0)[0] printf "Binary(\"%02X\", \"", $value[4] set $i = 4 while $i < $length printf "%02X", $value[$i+5] set $i = $i + 1 end printf "\")" set $data = $data + 5 + ((uint32_t*)$data)[0] end define __printObjectID set $value = ((uint8_t*) $arg0) set $i = 0 printf "ObjectID(\"" while $i < 12 printf "%02X", $value[$i] set $i = $i + 1 end printf "\")" set $data = $data + 12 end define __printBool set $value = ((uint8_t*) $arg0) printf "%s", $value[0] ? "true" : "false" set $data = $data + 1 end define __printUtcDateTime set $value = ((uint64_t*) $arg0) printf "UTCDateTime(%ld)", $value[0] set $data = $data + 8 end define __printNull printf "null" end define __printRegex printf "Regex(\"%s\", \"", (char*) $data # skip through C String while $data[0] != '\0' set $data = $data + 1 end set $data = $data + 1 printf "%s\")", (char*) $data # skip through C String while $data[0] != '\0' set $data = $data + 1 end set $data = $data + 1 end define __printJavascript set $value = ((char*) $arg0) + 4 printf "JavaScript(\"%s\")", $value set $data = $data + 4 + ((uint32_t*)$data)[0] end define __printSymbol set $value = ((char*) $arg0) + 4 printf "Symbol(\"%s\")", $value set $data = $data + 4 + ((uint32_t*)$data)[0] end define __printJavascriptWScope set $value = ((char*) $arg0) + 8 printf "JavaScript(\"%s\") with scope: ", $value set $data = $data + 8 + ((uint32_t*)$data)[1] __printDocument $data $depth end define __printInt32 set $value = ((uint32_t*) $arg0) printf "NumberInt(\"%d\")", $value[0] set $data = $data + 4 end define __printTimestamp set $value = ((uint32_t*) $arg0) printf "Timestamp(%u, %u)", $value[0], $value[1] set $data = $data + 8 end define __printInt64 set $value = ((uint64_t*) $arg0) printf "NumberLong(\"%ld\")", $value[0] set $data = $data + 8 end mongo-c-driver-1.26.0/.gitattributes000066400000000000000000000000331456567454500173440ustar00rootroot00000000000000tests/binary/* text eol=lf mongo-c-driver-1.26.0/.gitignore000066400000000000000000000011161456567454500164440ustar00rootroot00000000000000*.a *.dylib *.gcda *.gcno *.gz *.o *.lo *.pc *.so *.so.* .githooks .scratch/ cmake-build cmake_install.cmake CMakeCache.txt CMakeFiles CPackConfig.cmake CPackSourceConfig.cmake CTestTestfile.cmake _build/ dist_manifest.txt test-results.json VERSION_RELEASED *.pyc # Windows things *.sdf *.sln *.vcxproj* .vs Debug install_manifest.txt x64 # "dist" is produced during the release process dist # `secrets-export.sh` is created by the drivers-evergreen-tools `setup_secrets.sh` script. # Ignore this file to reduce risk of committing credentials during local development. secrets-export.sh mongo-c-driver-1.26.0/.gitmodules000066400000000000000000000000001456567454500166200ustar00rootroot00000000000000mongo-c-driver-1.26.0/.lsan-suppressions000066400000000000000000000001531456567454500201650ustar00rootroot00000000000000leak:ccrng_cryptographic_init_once leak:ccrng_cryptographic_generate leak:res_9_ninit leak:SSLCreateContextmongo-c-driver-1.26.0/.tsan-suppressions000066400000000000000000000000631456567454500201750ustar00rootroot00000000000000race:mongoc_counter* race:_mongoc_handshake_freeze mongo-c-driver-1.26.0/CMakeLists.txt000066400000000000000000000554331456567454500172270ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.15) list (INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_LIST_DIR}/build/cmake") # Defines BUILD_VERSION, which we use throughout: include (BuildVersion) project ( mongo-c-driver LANGUAGES C # BUILD_VERSION_SIMPLE is a CMake-compatible version number that omits suffixes VERSION "${BUILD_VERSION_SIMPLE}" ) # Set MONGOC_MAJOR_VERSION, MONGOC_MINOR_VERSION, etc. include (ParseVersion) ParseVersion ("${BUILD_VERSION}" MONGOC) # Defines additional similar variables: include (LoadVersion) file (WRITE VERSION_CURRENT "${BUILD_VERSION}") LoadVersion (VERSION_CURRENT MONGOC) # Extended version attributes that CMake doesn't (yet) understand, which include # the prerelease tag. Named here to match the variables generated by project() set(mongo-c-driver_VERSION_PRERELEASE ${MONGOC_PRERELEASE_VERSION}) set(mongo-c-driver_VERSION_FULL ${MONGOC_VERSION}) include(FeatureSummary) include (MongoSettings) include (MongoPlatform) include (GeneratePkgConfig) # Subcomponents: mongo_bool_setting(ENABLE_MONGOC "Enable the build of libmongoc libraries (The MongoDB C database driver)") mongo_bool_setting( USE_SYSTEM_LIBBSON [[Use an existing libbson library (via find_package()) instead of building one from source]] DEFAULT VALUE OFF ADVANCED ) # Deprecated option "ENABLE_BSON" is gone, but old caches may rely on SYSTEM to # disable the libbson build. Allow ENABLE_BSON=SYSTEM only if USE_SYSTEM_LIBBSON # is also true, to allow both ENABLE_BSON=SYSTEM and USE_SYSTEM_LIBBSON=TRUE to # simplify downstream build scripts if(ENABLE_BSON STREQUAL "SYSTEM" AND NOT USE_SYSTEM_LIBBSON) # User set ENABLE_BSON=SYSTEM, so they intend for us to build against an external # libbson, but they didn't set USE_SYSTEM_LIBBSON=ON, so they are probably # unaware of this change. Rather than miscompile, stop what we're doing: message(FATAL_ERROR "ENABLE_BSON=SYSTEM is no longer supported. Use USE_SYSTEM_LIBBSON=ON for the same effect.") endif() # Toggle static libraries: mongo_setting( ENABLE_STATIC "Enable building and installing static library archive artifacts" OPTIONS ON OFF BUILD_ONLY DEFAULT VALUE "ON" ) # Toggle dynamic libraries: mongo_bool_setting(ENABLE_SHARED "Enable building and installing dynamic library artifacts") # Toggle PIC if(NOT WIN32) mongo_bool_setting(ENABLE_PIC "Enable position-independent code when building static libraries (Not applicable on Windows)") elseif(DEFINED ENABLE_PIC) # We are on Windows, and ENABLE_PIC is defined. message(STATUS "ENABLE_PIC=“${ENABLE_PIC}” has no effect on Windows (All Windows code is position-independent)") else() # We are on Windows, and ENABLE_PIC is not defined, which is normal endif() # Dev mode checks: mongo_bool_setting( ENABLE_MAINTAINER_FLAGS "Enable stricter build-time checks" DEFAULT VALUE OFF DEVEL EVAL [[ if(MSVC) set(DEFAULT OFF) else() set(DEFAULT ON) endif() ]]) # Toggle instrumentation: mongo_bool_setting(ENABLE_TRACING "Enable runtime tracing output in the built libmongoc (Very noisy!)" DEFAULT VALUE OFF) mongo_bool_setting(ENABLE_COVERAGE "Build code with coverage instrumentation" DEFAULT VALUE OFF DEVEL VALUE ON) mongo_bool_setting(ENABLE_DEBUG_ASSERTIONS "Build library with runtime debug assertions enabled" DEFAULT VALUE OFF DEVEL VALUE ON) # for MONGO_SANITIZE: include(Sanitizers) # Toggle optional components: mongo_bool_setting(ENABLE_TESTS "Build MongoDB C Driver tests") mongo_bool_setting(ENABLE_EXAMPLES "Build MongoDB C Driver examples") mongo_bool_setting(ENABLE_MAN_PAGES "Build the manual pages" DEFAULT VALUE OFF) mongo_bool_setting(ENABLE_HTML_DOCS "Build the HTML documentation" DEFAULT VALUE OFF) mongo_bool_setting(ENABLE_UNINSTALL "Generate an 'uninstall' script and an 'uninstall' build target") mongo_bool_setting(ENABLE_SRV "Enable support for mongodb+srv URIs.") # Optional features that are ENABLED when necessary dependencies are found: mongo_setting(ENABLE_SNAPPY "Enable Snappy compression support" OPTIONS ON OFF AUTO DEFAULT VALUE AUTO) mongo_setting(ENABLE_ZSTD "Enable zstd compression support" OPTIONS ON OFF AUTO DEFAULT VALUE AUTO) mongo_setting(ENABLE_ZLIB "Enable zlib compression support" OPTIONS BUNDLED SYSTEM OFF DEFAULT VALUE BUNDLED) mongo_bool_setting(USE_BUNDLED_UTF8PROC "Enable building with utf8proc. Needed for SCRAM-SHA-256 authentication with non-ASCII passwords" ADVANCED) mongo_setting( ENABLE_SSL [[Enable TLS connection and SCRAM authentication.]] OPTIONS WINDOWS DARWIN OPENSSL LIBRESSL OFF AUTO DEFAULT VALUE AUTO VALIDATE CODE [[ if(ENABLE_SSL STREQUAL "DARWIN" AND NOT APPLE) message(WARNING "ENABLE_SSL=DARWIN is only supported on Apple platforms") elseif(ENABLE_SSL STREQUAL "WINDOWS" AND NOT WIN32) message(WARNING "ENABLE_SSL=WINDOWS is only supported on Windows platforms") endif() ]] ) mongo_bool_setting( ENABLE_SHM_COUNTERS "Enable memory performance counters" DEFAULT EVAL [[ set(DEFAULT OFF) if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" OR (APPLE AND CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")) set(DEFAULT ON) endif() ]] VALIDATE CODE [[ if(ENABLE_SHM_COUNTERS AND NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND NOT (APPLE AND CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")) message(WARNING "ENABLE_SHM_COUNTERS=ON is only supported on Linux or ARM Darwin") endif() ]] ) mongo_setting( ENABLE_SASL "Enable SASL authentication (Kerberos)" OPTIONS CYRUS SSPI OFF AUTO DEFAULT VALUE AUTO VALIDATE CODE [[ if(ENABLE_SASL STREQUAL "SSPI" AND NOT WIN32) message(WARNING "ENABLE_SASL=SSPI is only supported on Windows platforms") endif() ]] ) mongo_setting(ENABLE_CLIENT_SIDE_ENCRYPTION "Enable In-Use Encryption support. Requires additional support libraries." OPTIONS ON OFF AUTO DEFAULT VALUE AUTO) mongo_setting(ENABLE_MONGODB_AWS_AUTH "Enable support for the MONGODB-AWS authentication mechanism" OPTIONS ON OFF AUTO DEFAULT VALUE AUTO VALIDATE CODE [[ if(NOT ENABLE_MONGODB_AWS_AUTH STREQUAL "ON") return() endif() if(MSVC AND MSVC_VERSION LESS 1900) message(FATAL_ERROR "Visual Studio 2015 or newer is required for ENABLE_MONGODB_AWS_AUTH=ON") elseif(ENABLE_SSL STREQUAL "OFF") message(FATAL_ERROR "ENABLE_MONGODB_AWS_AUTH=ON requires that ENABLE_SSL not be 'OFF'") endif() ]]) # Optional features that are DISABLED by default: mongo_bool_setting(ENABLE_RDTSCP "Enable fast performance counters using the Intel RDTSCP instruction" DEFAULT VALUE OFF) mongo_bool_setting(ENABLE_APPLE_FRAMEWORK "Build libraries as Apple Frameworks on Darwin platforms" DEFAULT VALUE OFF) mongo_bool_setting( ENABLE_CRYPTO_SYSTEM_PROFILE "Use system crypto profile" DEFAULT VALUE OFF VALIDATE CODE [[ if(ENABLE_CRYPTO_SYSTEM_PROFILE AND NOT ENABLE_SSL STREQUAL "OPENSSL") message(WARNING "ENABLE_CRYPTO_SYSTEM_PROFILE=TRUE is only applicable when ENABLE_SSL=OPENSSL") endif() ]] ) # Deprecated options: mongo_bool_setting( ENABLE_AUTOMATIC_INIT_AND_CLEANUP "[Deprecated] Enable automatic initialization of the C driver library" DEFAULT EVAL [[ set(DEFAULT OFF) if(CMAKE_C_COMPILER_ID STREQUAL "GNU") message(VERBOSE "For backwards compatibility, when using GCC the default of " "ENABLE_AUTOMATIC_INIT_AND_CLEANUP is ON") set(DEFAULT ON) endif() ]] DEVEL VALUE OFF VALIDATE CODE [[ if(ENABLE_AUTOMATIC_INIT_AND_CLEANUP) if(NOT CMAKE_C_COMPILER_ID STREQUAL "GNU") message(WARNING "ENABLE_AUTOMATIC_INIT_AND_CLEANUP is only supported on GCC.") endif() message(DEPRECATION "Enabling ENABLE_AUTOMATIC_INIT_AND_CLEANUP is deprecated and " "may be removed in a future release") endif() ]] ) mongo_bool_setting( ENABLE_EXTRA_ALIGNMENT "[Deprecated] Enable extra alignment on libbson types" DEFAULT VALUE ON DEVEL VALUE OFF VALIDATE CODE [[ if(ENABLE_EXTRA_ALIGNMENT AND MONGO_SANITIZE MATCHES "undefined") message(WARNING "ENABLE_EXTRA_ALIGNMENT=“${ENABLE_EXTRA_ALIGNMENT}” will create conflicts with UndefinedBehaviorSanitizer") endif() ]] ) if(ENABLE_COVERAGE) mongo_platform_link_options(--coverage) mongo_platform_compile_options($) endif() # Enable multi-threading: set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) mongo_platform_use_target(Threads::Threads) set_property(DIRECTORY APPEND PROPERTY pkg_config_LIBS ${CMAKE_THREAD_LIBS_INIT}) if(WIN32) # Required for gethostbyname on Windows: mongo_platform_link_libraries(ws2_32) endif() # librt needed on linux for clock_gettime find_library(RT_LIBRARY rt PATHS /usr/lib32) if(RT_LIBRARY) mongo_platform_link_libraries(${RT_LIBRARY}) # Set required libraries for CHECK_FUNCTION_EXISTS list(APPEND CMAKE_REQUIRED_LIBRARIES "${RT_LIBRARY}") # Export the rt linkage as a pkg-config property: get_filename_component(rt_dir "${RT_LIBRARY}" DIRECTORY) set_property(DIRECTORY APPEND PROPERTY pkg_config_LIBS "-L${rt_dir}" -lrt) endif() # On macOS Big Sur, libm resolves to the SDK's tbd file, like: # /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/libm.tbd # Not all consumers can easily link to a tbd file (notably golang will reject a tbd suffix by default) # macOS includes libm as part of libSystem (along with libc). # It does not need to be explicitly linked. if(NOT APPLE) find_library(M_LIBRARY m) if(M_LIBRARY) mongo_platform_link_libraries(${M_LIBRARY}) endif() endif() # Optionally enable C++ to do some C++-specific tests include (CheckLanguage) check_language (CXX) if (CMAKE_CXX_COMPILER) enable_language (CXX) if (NOT CMAKE_CXX_STANDARD) # Default to C++11 for purposes of testing. set (CMAKE_CXX_STANDARD 11) endif () else () message (STATUS "No CXX support") endif () if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set (CMAKE_BUILD_TYPE "RelWithDebInfo") message ( STATUS "No CMAKE_BUILD_TYPE selected, defaulting to ${CMAKE_BUILD_TYPE}" ) endif () include (InstallRequiredSystemLibraries) include (GNUInstallDirs) include (CMakeDependentOption) include(MongoC-Warnings) # Enable "maintainer flags," which are supplementary but not mandatory. # (As opposed to MongoC-Warnings.cmake, which defines "the code is broken" warnings) if(ENABLE_MAINTAINER_FLAGS) mongoc_add_warning_options( gnu-like:-Werror gnu-like:-pedantic gnu-like:-Wall gnu-like:-Wempty-body gnu:not-gcc-lt7:-Wexpansion-to-defined gnu-like:-Wformat gnu-like:-Wformat-nonliteral gnu-like:-Wformat-security gnu-like:-Winit-self gnu-like:-Wmissing-include-dirs gnu-like:-Wredundant-decls gnu-like:-Wshadow gnu-like:lang-c:-Wstrict-prototypes gnu-like:-Wswitch-default gnu-like:-Wswitch-enum gnu-like:-Wundef gnu-like:-Wuninitialized # Disabled, for now: gnu-like:-Wno-strict-aliasing ) endif() # Enable CCache, if possible include (CCache) # Link with LLD, if possible if (NOT MSVC) include (LLDLinker) endif () if ( (ENABLE_BUILD_DEPENDECIES STREQUAL OFF) AND (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) ) set (ENABLE_BUILD_DEPENDECIES ON) endif () mongo_pick(BSON_EXTRA_ALIGN 1 0 ENABLE_EXTRA_ALIGNMENT) mongo_pick(MONGOC_ENABLE_RDTSCP 1 0 ENABLE_RDTSCP) mongo_pick(MONGOC_ENABLE_STATIC_BUILD 1 0 ENABLE_STATIC) mongo_pick(MONGOC_ENABLE_STATIC_INSTALL 1 0 [[ENABLE_STATIC AND NOT ENABLE_STATIC STREQUAL "BUILD_ONLY"]]) if (USE_SYSTEM_LIBBSON) # The input variable BSON_ROOT_DIR is respected for backwards compatibility, # but you should use the standard CMAKE_PREFIX_PATH instead. message (STATUS "Searching for libbson CMake packages") find_package (bson-1.0 "${PROJECT_VERSION}" HINTS ${BSON_ROOT_DIR}) if (NOT bson-1.0_FOUND) message (FATAL_ERROR "System libbson not found") endif () message (STATUS "libbson found version \"${bson-1.0_VERSION}\"") message (STATUS "disabling test-libmongoc since using system libbson") SET (ENABLE_TESTS OFF) set (USING_SYSTEM_BSON TRUE) if (NOT TARGET mongo::bson_shared) message (FATAL_ERROR "System libbson built without shared library target") endif () set (BSON_LIBRARIES mongo::bson_shared) if (NOT TARGET mongo::bson_static) message (FATAL_ERROR "System libbson built without static library target") endif () set (BSON_STATIC_LIBRARIES mongo::bson_static) endif () set (BUILD_SOURCE_DIR ${CMAKE_BINARY_DIR}) # Enable CTest include (CTest) if (BUILD_TESTING) include (TestFixtures) endif () # Ensure the default behavior: don't ignore RPATH settings. set (CMAKE_SKIP_BUILD_RPATH OFF) # Ensure the default behavior: don't use the final install destination as the # temporary RPATH for executables (ensure we can run tests and programs from # the build directory). set (CMAKE_BUILD_WITH_INSTALL_RPATH OFF) # Include any custom library paths in the final RPATH. set (CMAKE_INSTALL_RPATH_USE_LINK_PATH ON) # Install libs with names like @rpath/libmongoc-1.0.0.dylib, not bare names. set (CMAKE_MACOSX_RPATH ON) # https://cmake.org/cmake/help/v3.11/policy/CMP0042.html # Enable a CMake 3.0+ policy that sets CMAKE_MACOSX_RPATH by default, and # silence a CMake 3.11 warning that the old behavior is deprecated. cmake_policy (SET CMP0042 NEW) # By default, ensure conformance with a minimum C standard. # Required extensions to the language (i.e. POSIX) are (re)enabled further below. if (NOT DEFINED CMAKE_C_STANDARD) set (CMAKE_C_STANDARD 99) endif () if (NOT DEFINED CMAKE_C_STANDARD_REQUIRED) set (CMAKE_C_STANDARD_REQUIRED ON) endif () if (NOT DEFINED CMAKE_C_EXTENSIONS) set (CMAKE_C_EXTENSIONS OFF) endif () # https://man7.org/linux/man-pages/man7/feature_test_macros.7.html # https://pubs.opengroup.org/onlinepubs/7908799/xsh/compilation.html # Enable POSIX features up to POSIX.1-2008 plus the XSI extension and BSD-derived definitions. # Both _BSD_SOURCE and _DEFAULT_SOURCE are defined for backwards-compatibility with glibc 2.19 and earlier. # _BSD_SOURCE and _DEFAULT_SOURCE are required by `getpagesize`, `h_errno`, etc. # _XOPEN_SOURCE=700 is required by `strnlen`, `strerror_l`, etc. add_definitions (-D_XOPEN_SOURCE=700 -D_BSD_SOURCE -D_DEFAULT_SOURCE) list (APPEND CMAKE_REQUIRED_DEFINITIONS -D_XOPEN_SOURCE=700 -D_BSD_SOURCE -D_DEFAULT_SOURCE) # Enable non-standard features on FreeBSD with __BSD_VISIBLE=1 if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") add_definitions (-D__BSD_VISIBLE=1) list (APPEND CMAKE_REQUIRED_DEFINITIONS -D__BSD_VISIBLE=1) endif () # https://opensource.apple.com/source/Libc/Libc-1439.40.11/gen/compat.5.auto.html # Non-POSIX extensions are required by `_SC_NPROCESSORS_ONLN`. if (CMAKE_SYSTEM_NAME MATCHES "Darwin") add_definitions (-D_DARWIN_C_SOURCE) list (APPEND CMAKE_REQUIRED_DEFINITIONS -D_DARWIN_C_SOURCE) endif () add_subdirectory (src/common) if (NOT USING_SYSTEM_BSON) message (STATUS "Using bundled libbson") add_subdirectory (src/libbson) # Defined in src/libbson/CMakeLists.txt set (BSON_STATIC_LIBRARIES bson_static) set (BSON_LIBRARIES bson_shared) set (BSON_STATIC_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src/libbson/src" "${PROJECT_BINARY_DIR}/src/libbson/src") set (BSON_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src/libbson/src" "${PROJECT_BINARY_DIR}/src/libbson/src") set (BSON_STATIC_PUBLIC_DEFINITIONS "BSON_STATIC") endif () if (MSVC) add_definitions (-D_CRT_SECURE_NO_WARNINGS) endif () if (ENABLE_MONGOC) if (ENABLE_TESTS AND NOT MONGOC_ENABLE_STATIC_BUILD) message (FATAL_ERROR "ENABLE_TESTS requires ENABLE_STATIC or ENABLE_STATIC_BUILD") endif () set (SOURCE_DIR "${PROJECT_SOURCE_DIR}/") set (UTF8PROC_SOURCES ${SOURCE_DIR}/src/utf8proc-2.8.0/utf8proc.c ) set (ZLIB_SOURCES ${SOURCE_DIR}/src/zlib-1.2.13/adler32.c ${SOURCE_DIR}/src/zlib-1.2.13/crc32.c ${SOURCE_DIR}/src/zlib-1.2.13/deflate.c ${SOURCE_DIR}/src/zlib-1.2.13/infback.c ${SOURCE_DIR}/src/zlib-1.2.13/inffast.c ${SOURCE_DIR}/src/zlib-1.2.13/inflate.c ${SOURCE_DIR}/src/zlib-1.2.13/inftrees.c ${SOURCE_DIR}/src/zlib-1.2.13/trees.c ${SOURCE_DIR}/src/zlib-1.2.13/zutil.c ${SOURCE_DIR}/src/zlib-1.2.13/compress.c ${SOURCE_DIR}/src/zlib-1.2.13/uncompr.c ${SOURCE_DIR}/src/zlib-1.2.13/gzclose.c ${SOURCE_DIR}/src/zlib-1.2.13/gzlib.c ${SOURCE_DIR}/src/zlib-1.2.13/gzread.c ${SOURCE_DIR}/src/zlib-1.2.13/gzwrite.c ) set (CPACK_RESOURCE_FILE_LICENSE "${SOURCE_DIR}/COPYING") include (CPack) # Ensure the default behavior: don't ignore RPATH settings. set (CMAKE_SKIP_BUILD_RPATH OFF) if (APPLE) # Until CDRIVER-520. add_definitions (-Wno-deprecated-declarations) endif () set (KMS_MSG_SOURCES ${SOURCE_DIR}/src/kms-message/src/hexlify.c ${SOURCE_DIR}/src/kms-message/src/kms_b64.c ${SOURCE_DIR}/src/kms-message/src/kms_caller_identity_request.c ${SOURCE_DIR}/src/kms-message/src/kms_crypto_apple.c ${SOURCE_DIR}/src/kms-message/src/kms_crypto_libcrypto.c ${SOURCE_DIR}/src/kms-message/src/kms_crypto_none.c ${SOURCE_DIR}/src/kms-message/src/kms_crypto_windows.c ${SOURCE_DIR}/src/kms-message/src/kms_decrypt_request.c ${SOURCE_DIR}/src/kms-message/src/kms_encrypt_request.c ${SOURCE_DIR}/src/kms-message/src/kms_kmip_response_parser.c ${SOURCE_DIR}/src/kms-message/src/kms_kv_list.c ${SOURCE_DIR}/src/kms-message/src/kms_message.c ${SOURCE_DIR}/src/kms-message/src/kms_port.c ${SOURCE_DIR}/src/kms-message/src/kms_request.c ${SOURCE_DIR}/src/kms-message/src/kms_request_opt.c ${SOURCE_DIR}/src/kms-message/src/kms_request_str.c ${SOURCE_DIR}/src/kms-message/src/kms_response.c ${SOURCE_DIR}/src/kms-message/src/kms_response_parser.c ${SOURCE_DIR}/src/kms-message/src/sort.c ) if (NOT ENABLE_MONGODB_AWS_AUTH MATCHES "ON|OFF|AUTO") message (FATAL_ERROR "ENABLE_MONGODB_AWS_AUTH option must be ON, AUTO, or OFF") endif () set (MONGOC_ENABLE_MONGODB_AWS_AUTH 0) if (ENABLE_MONGODB_AWS_AUTH STREQUAL "AUTO") if (MSVC AND MSVC_VERSION LESS 1900) message (WARNING "MS Visual Studio too old for ENABLE_MONGODB_AWS_AUTH") elseif (NOT ENABLE_SSL) message (WARNING "Option ENABLE_MONGODB_AWS_AUTH requires ENABLE_SSL not set to OFF" ) else () set (MONGOC_ENABLE_MONGODB_AWS_AUTH 1) endif () elseif (ENABLE_MONGODB_AWS_AUTH) if (MSVC AND MSVC_VERSION LESS 1900) message (FATAL_ERROR "Use Visual Studio 2015 or higher for ENABLE_MONGODB_AWS_AUTH") endif () if (NOT ENABLE_SSL) message (FATAL_ERROR "Option ENABLE_MONGODB_AWS_AUTH requires ENABLE_SSL not set to OFF" ) endif () set (MONGOC_ENABLE_MONGODB_AWS_AUTH 1) endif () add_subdirectory (src/libmongoc) if (MONGOC_ENABLE_MONGODB_AWS_AUTH) message (STATUS "Building with MONGODB-AWS auth support") endif () if (ENABLE_MAN_PAGES STREQUAL ON OR ENABLE_HTML_DOCS STREQUAL ON) find_package (Sphinx REQUIRED) add_custom_target (doc ALL DEPENDS $<$>:bson-doc> $<$:mongoc-doc> ) endif () # sub-directory 'doc' was already included above add_subdirectory (src) # 'src/libbson' was already included, so 'src' will not include it directly # 'src/kms-message' was already included if appropriate # 'src/libmongoc' was already included, so 'src' will not include it directly endif () install (FILES COPYING NEWS README.rst THIRD_PARTY_NOTICES DESTINATION ${CMAKE_INSTALL_DATADIR}/mongo-c-driver ) if (ENABLE_UNINSTALL) # Create uninstall program and associated uninstall target # # This needs to be last (after all other add_subdirectory calls) to ensure that # the generated uninstall program is complete and correct if (NOT ENABLE_MONGOC) # Generate a different script name for uninstalling libbson only: set (UNINSTALL_SCRIPT_NAME "uninstall-bson") endif () set (UNINSTALL_PROG_DIR "${CMAKE_INSTALL_DATADIR}/mongo-c-driver") include (GenerateUninstaller) endif () # Spit out some information regarding the generated build system message (STATUS "Build files generated for:") message (STATUS "\tbuild system: ${CMAKE_GENERATOR}") if (CMAKE_GENERATOR_INSTANCE) message (STATUS "\tinstance: ${CMAKE_GENERATOR_INSTANCE}") endif () if (CMAKE_GENERATOR_PLATFORM) message (STATUS "\tinstance: ${CMAKE_GENERATOR_PLATFORM}") endif () if (CMAKE_GENERATOR_TOOLSET) message (STATUS "\tinstance: ${CMAKE_GENERATOR_TOOLSET}") endif () if (TARGET test-libmongoc) # Generate a file that can be included by CTest to load and enumerate all of the # tests defined by the test-libmongoc executable. Generate one for each # configuration in case of multiconf generators. string (CONFIGURE [=[ set (TEST_LIBMONGOC_EXE [[$]]) set (SRC_ROOT [[@PROJECT_SOURCE_DIR@]]) set (IS_MULTICONF $) if (NOT IS_MULTICONF OR CTEST_CONFIGURATION_TYPE STREQUAL "$") # We are not in multi-conf, or the current config matches our config. include ("${SRC_ROOT}/build/cmake/LoadTests.cmake") elseif (NOT CTEST_CONFIGURATION_TYPE) # We are in multi-conf, but no '-C' config was specified message (WARNING "Specify a --build-config when using CTest with a multi-config build") else () # Do nothing. Not our config. endif () ]=] code @ONLY) file (GENERATE OUTPUT "${PROJECT_BINARY_DIR}/LoadTests-$.cmake" CONTENT "${code}") if (CMAKE_CONFIGURATION_TYPES) foreach (conf IN LISTS CMAKE_CONFIGURATION_TYPES) # Direct the generated CTest code to include() the file that loads the tests: set_property ( DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES "${PROJECT_BINARY_DIR}/LoadTests-${conf}.cmake") endforeach () else () set_property ( DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES "${PROJECT_BINARY_DIR}/LoadTests-${CMAKE_BUILD_TYPE}.cmake") endif () endif () if (CMAKE_GENERATOR STREQUAL "Ninja Multi-Config" AND PROJECT_IS_TOP_LEVEL) set (CMAKE_CROSS_CONFIGS "all") endif () feature_summary(WHAT ENABLED_FEATURES DISABLED_FEATURES) mongo-c-driver-1.26.0/CONTRIBUTING.md000066400000000000000000000312101456567454500167030ustar00rootroot00000000000000# Contributing to mongo-c-driver Thanks for considering contributing to the mongo-c-driver! This document intends to be a short guide to helping you contribute to the codebase. It expects a familiarity with the C programming language and writing portable software. Whenever in doubt, feel free to ask others that have contributed or look at the existing body of code. ## Guidelines The mongo-c-driver has a few guidelines that help direct the process. ### Portability mongo-c-driver is portable software. It needs to run on a multitude of [Supported Platforms](https://mongoc.org/libmongoc/current/installing.html#supported-platforms). ### Licensing Some of the mongo-c-driver users embed the library statically in their products. Therefore, the driver and all contributions must be liberally licensed. As a policy, we have chosen Apache 2.0 as the license for the project. ### Coding Style We try not to be pedantic with taking contributions that are not properly formatted, but we will likely perform a followup commit that cleans things up. The basics are, in vim: ``` : set ts=3 sw=3 et ``` 3 space tabs, insert spaces instead of tabs. For all the gory details, see [.clang-format](.clang-format) ### Commit Style Commit messages follow this pattern: ``` CDRIVER-#### lowercase commit message ``` There's no colon after the ticket number, and no period at the end of the subject line. If there's no related Jira ticket, then the message is simply all lowercase: ``` typos in NEWS ``` We follow [the widely adopted "50/72" rule](https://medium.com/@preslavrachev/what-s-with-the-50-72-rule-8a906f61f09c): the subject line is ideally only 50 characters, but definitely only 72 characters. This requires some thoughtful writing but it's worthwhile when you're scrolling through commits. The message body can be as large as you want, wrapped at 72 columns. ### Adding a new error code or domain When adding a new error code or domain, you must do the following. This is most applicable if you are adding a new symbol with a bson_error_t as a parameter, and the existing codes or domains are inappropriate. - Add the domain to `mongoc_error_domain_t` in `src/mongoc/mongoc-error.h` - Add the code to `mongoc_error_code_t` in `src/mongoc/mongoc-error.h` - Add documentation for the domain or code to the table in `doc/mongoc_errors.rst` ### Adding a new symbol This should be done rarely but there are several things that you need to do when adding a new symbol. - Add documentation for the new symbol in `doc/mongoc_your_new_symbol_name.rst` ### Documentation We strive to document all symbols. See doc/ for documentation examples. If you add a new public function, add a new .rst file describing the function so that we can generate man pages and HTML for it. For complex internal functions, comment above the function definition with a block comment like the following: ``` /*-------------------------------------------------------------------------- * * mongoc_cmd_parts_append_read_write -- * * Append user-supplied options to @parts->command_extra, taking the * selected server's max wire version into account. * * Return: * True if the options were successfully applied. If any options are * invalid, returns false and fills out @error. In that case @parts is * invalid and must not be used. * * Side effects: * May partly apply options before returning an error. * *-------------------------------------------------------------------------- */ ``` Public functions do not need these comment blocks, since they are documented in the .rst files. To build the documentation, it is recommended to use the Poetry-managed Python project to ensure that the exact tooling versions match. If you do not have Poetry installed, you can use the `poetry.sh` or `poetry.ps1` scripts in the `tools/` directory. First, install dependencies: ```sh ./tools/poetry.sh install --with=docs ``` Then, execute `sphinx-build` in the Python environment, using the paths to the documentation to be generated: ```sh ./tools/poetry.sh run sphinx-build -WEn -bhtml src/libmongoc/doc/ src/libmongoc/doc/html ``` ### Testing To run the entire test suite, including authentication and support for the `configureFailPoint` command, start `mongod` with security and test commands enabled: ``` $ mkdir db $ mongod --auth --setParameter enableTestCommands=1 --dbpath db/ ``` In another terminal, use the `mongosh` shell to create a user: ``` $ mongosh --eval "db.createUser({user: 'admin', pwd: 'pass', roles: ['root']})" admin ``` Authentication in MongoDB 3.0 and later uses SCRAM-SHA-1, which in turn requires a driver built with SSL. Set the user and password environment variables, then build and run the tests: ``` $ export MONGOC_TEST_USER=admin $ export MONGOC_TEST_PASSWORD=pass $ ./test-libmongoc ``` Additional environment variables: * `MONGOC_TEST_HOST`: default `localhost`, the host running MongoDB. * `MONGOC_TEST_PORT`: default 27017, MongoDB's listening port. * `MONGOC_TEST_URI`: override both host and port with a full connection string, like "mongodb://server1,server2". * `MONGOC_TEST_SERVER_LOG`: set to `stdout` or `stderr` for wire protocol logging from tests that use `mock_server_t`. Set to `json` to include these logs in the test framework's JSON output, in a format compatible with [Evergreen](https://github.com/evergreen-ci/evergreen). * `MONGOC_TEST_MONITORING_VERBOSE`: set to `on` for verbose output from Application Performance Monitoring tests. * `MONGOC_TEST_COMPRESSORS=snappy,zlib`: wire protocol compressors to use * `MONGOC_TEST_IS_SERVERLESS` (bool): defaults to `false`. Used to indicate that tests are run against a serverless cluster. If you start `mongod` with SSL, set these variables to configure how `test-libmongoc` connects to it: * `MONGOC_TEST_SSL`: set to `on` to connect to the server with SSL. * `MONGOC_TEST_SSL_PEM_FILE`: path to a client PEM file. * `MONGOC_TEST_SSL_PEM_PWD`: the PEM file's password. * `MONGOC_TEST_SSL_CA_FILE`: path to a certificate authority file. * `MONGOC_TEST_SSL_CA_DIR`: path to a certificate authority directory. * `MONGOC_TEST_SSL_CRL_FILE`: path to a certificate revocation list. * `MONGOC_TEST_SSL_WEAK_CERT_VALIDATION`: set to `on` to relax the client's validation of the server's certificate. The SASL / GSSAPI / Kerberos tests are skipped by default. To run them, set up a separate `mongod` with Kerberos and set its host and Kerberos principal name as environment variables: * `MONGOC_TEST_GSSAPI_HOST` * `MONGOC_TEST_GSSAPI_USER` URI-escape the username, for example write "user@realm" as "user%40realm". The user must be authorized to query `kerberos.test`. MongoDB 3.2 adds support for readConcern, but does not enable support for read concern majority by default. mongod must be launched using `--enableMajorityReadConcern`. The test framework does not (and can't) automatically discover if this option was provided to MongoDB, so an additional variable must be set to enable these tests: * `MONGOC_ENABLE_MAJORITY_READ_CONCERN` Set this environment variable to `on` if MongoDB has enabled majority read concern. Some tests require Internet access, e.g. to check the error message when failing to open a MongoDB connection to example.com. Skip them with: * `MONGOC_TEST_OFFLINE=on` Some tests require a running MongoDB server. Skip them with: * `MONGOC_TEST_SKIP_LIVE=on` For quick checks during development, disable long-running tests: * `MONGOC_TEST_SKIP_SLOW=on` Some tests run against a local mock server, these can be skipped with: * `MONGOC_TEST_SKIP_MOCK=on` If you have started with MongoDB with `--ipv6`, you can test IPv6 with: * `MONGOC_CHECK_IPV6=on` The tests for mongodb+srv:// connection strings require some setup, see the Initial DNS Seedlist Discovery Spec. By default these connection strings are NOT tested, enable them with: * `MONGOC_TEST_DNS=on` assumes a replica set is running with TLS enabled on ports 27017, 27018, and 27019. * `MONGOC_TEST_DNS_LOADBALANCED=on` assumes a load balanced sharded cluster is running with mongoses on ports 27017 and 27018 and TLS enabled. The load balancer can be listening on any port. * `MONGOC_TEST_DNS_SRV_POLLING=on` assumes a sharded cluster is running with mongoses on ports 27017, 27018, 27019, and 27020 and TLS enabled. The mock server timeout threshold for future functions can be set with: * `MONGOC_TEST_FUTURE_TIMEOUT_MS=` This is useful for debugging, so future calls don't timeout when stepping through code. Tests of Client-Side Field Level Encryption require credentials to external KMS providers. For AWS: * `MONGOC_TEST_AWS_SECRET_ACCESS_KEY=` * `MONGOC_TEST_AWS_ACCESS_KEY_ID=` * `MONGOC_TEST_AWSNAME2_SECRET_ACCESS_KEY=` * `MONGOC_TEST_AWSNAME2_ACCESS_KEY_ID=` An Azure: * `MONGOC_TEST_AZURE_TENANT_ID=` * `MONGOC_TEST_AZURE_CLIENT_ID=` * `MONGOC_TEST_AZURE_CLIENT_SECRET=` For GCP: * `MONGOC_TEST_GCP_EMAIL=` * `MONGOC_TEST_GCP_PRIVATEKEY=` Tests of Client-Side Field Level Encryption also require temporary credentials to external KMS providers. For AWS: * `MONGOC_TEST_AWS_TEMP_SECRET_ACCESS_KEY=` * `MONGOC_TEST_AWS_TEMP_ACCESS_KEY_ID=` * `MONGOC_TEST_AWS_TEMP_SESSION_TOKEN=` Tests of Client-Side Field Level Encryption spawn an extra process, "mongocryptd", by default. To bypass this spawning, start mongocryptd on port 27020 and set the following: * `MONGOC_TEST_MONGOCRYPTD_BYPASS_SPAWN=on` KMS TLS tests for Client-Side Field Level Encryption require mock KMS servers to be running in the background. The [Setup instructions](https://github.com/mongodb/specifications/tree/master/source/client-side-encryption/tests#setup-3) given in the Client Side Encryption Tests specification provide additional information. The mock server scripts are located in the [mongodb-labs/drivers-evergreen-tools](https://github.com/mongodb-labs/drivers-evergreen-tools) in the [csfle directory](https://github.com/mongodb-labs/drivers-evergreen-tools/tree/master/.evergreen/csfle). The mock servers use certificates located in the [x509gen](https://github.com/mongodb-labs/drivers-evergreen-tools/tree/master/.evergreen/x509gen) directory. The set of mock KMS servers running in the background and their corresponding invocation command must be as follows: | Port | CA File | Cert File | Command | | --- | --- | --- | --- | | 8999 | ca.pem | server.pem | python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --port 8999 | 9000 | ca.pem | expired.pem | python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/expired.pem --port 9000 | 9001 | ca.pem | wrong-host.pem | python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/wrong-host.pem --port 9001 | 9002 | ca.pem | server.pem | python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --port --require_client_cert 9002 | 5698 | ca.pem | server.pem | python -u kms_kmip_server.py The path to `ca.pem` and `client.pem` must be passed through the following environment variables: * `MONGOC_TEST_CSFLE_TLS_CA_FILE=` * `MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE=` Specification tests may be filtered by their description: * `MONGOC_JSON_SUBTEST=` This can be useful in debugging a specific test case in a spec test file with multiple tests. Example: ```sh MONGOC_JSON_SUBTEST="Insert with randomized encryption, then find it" \ ./cmake-build/src/libmongoc/test-libmongoc -l "/client_side_encryption/legacy/basic" ``` To test with a declared API version, you can pass the API version using an environment variable: * `MONGODB_API_VERSION=` This will ensure that all tests declare the indicated API version when connecting to a server. To test a load balanced deployment, set the following environment variables: * `MONGOC_TEST_LOADBALANCED=on` * `SINGLE_MONGOS_LB_URI=` to a MongoDB URI with a host of a load balancer fronting one mongos. * `MULTI_MONGOS_LB_URI=` to a MongoDB URI with a host of a load balancer fronting multiple mongos processes. All tests should pass before submitting a patch. ## Configuring the test runner The test runner can be configured with command-line options. Run `test-libmongoc --help` for details. To run just a specific portion of the test suite use the -l option like so: ``` $ ./test-libmongoc -l "/server_selection/*" ``` The full list of tests is shown in the help. mongo-c-driver-1.26.0/COPYING000066400000000000000000000236761456567454500155260ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS mongo-c-driver-1.26.0/Earthfile000066400000000000000000000245161456567454500163130ustar00rootroot00000000000000VERSION --arg-scope-and-set --pass-args 0.7 LOCALLY # For target names, descriptions, and build parameters, run the "doc" Earthly subcommand. # Injects utilities into the environment INIT: COMMAND COPY --chmod=755 tools/str.sh /usr/local/bin/str # PREP_CMAKE "warms up" the CMake installation cache for the current environment PREP_CMAKE: COMMAND LET scratch=/opt/mongoc-cmake # Copy the minimal amount that we need, as to avoid cache invalidation COPY tools/use.sh tools/platform.sh tools/paths.sh tools/base.sh tools/download.sh \ $scratch/tools/ COPY .evergreen/scripts/find-cmake-version.sh \ .evergreen/scripts/use-tools.sh \ .evergreen/scripts/find-cmake-latest.sh \ .evergreen/scripts/cmake.sh \ $scratch/.evergreen/scripts/ # "Install" a shim that runs our managed CMake executable: RUN printf '#!/bin/sh\n /opt/mongoc-cmake/.evergreen/scripts/cmake.sh "$@"\n' \ > /usr/local/bin/cmake && \ chmod +x /usr/local/bin/cmake # Executing any CMake command will warm the cache: RUN cmake --version # version-current : # Create the VERSION_CURRENT file using Git. This file is exported as an artifact at / version-current: # Run on Alpine, which does this work the fastest FROM alpine:3.18 # Install Python and Git, the only things required for this job: RUN apk add git python3 COPY --dir .git/ build/calc_release_version.py /s/ # Calculate it: RUN cd /s/ && \ python calc_release_version.py --next-minor > VERSION_CURRENT SAVE ARTIFACT /s/VERSION_CURRENT # BUILD_AND_INSTALL executes the mongo-c-driver build and installs it to a prefix BUILD_AND_INSTALL: COMMAND # The configuration to be built ARG config=RelWithDebInfo # The prefix at which to install the built result ARG install_prefix=/opt/mongo-c-driver # Build configuration parameters. Will be case-normalized for CMake usage. ARG --required sasl ARG --required tls LET source_dir=/opt/mongoc/source LET build_dir=/opt/mongoc/build COPY --dir \ src/ \ build/ \ COPYING \ CMakeLists.txt \ README.rst \ THIRD_PARTY_NOTICES \ NEWS \ "$source_dir" COPY +version-current/ $source_dir ENV CCACHE_HOME=/root/.cache/ccache RUN cmake -S "$source_dir" -B "$build_dir" -G "Ninja Multi-Config" \ -D ENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF \ -D ENABLE_MAINTAINER_FLAGS=ON \ -D ENABLE_SHM_COUNTERS=ON \ -D ENABLE_EXTRA_ALIGNMENT=OFF \ -D ENABLE_SASL=$(echo $sasl | str upper) \ -D ENABLE_SNAPPY=ON \ -D ENABLE_SRV=ON \ -D ENABLE_ZLIB=BUNDLED \ -D ENABLE_SSL=$(echo $tls | str upper) \ -D ENABLE_COVERAGE=ON \ -D ENABLE_DEBUG_ASSERTIONS=ON \ -Werror RUN --mount=type=cache,target=$CCACHE_HOME \ env CCACHE_BASE="$source_dir" \ cmake --build $build_dir --config $config RUN cmake --install $build_dir --prefix="$install_prefix" --config $config alpine-base: ARG --required version FROM alpine:$version # XXX: On Alpine, we just use the system's CMake. At time of writing, it is # very up-to-date and much faster than building our own from source (since # Kitware does not (yet) provide libmuslc builds of CMake) RUN apk add cmake ninja-is-really-ninja gcc musl-dev g++ DO +INIT ARG --required tls ARG --required sasl IF str test "$sasl" -ieq "Cyrus" RUN apk add cyrus-sasl-dev END IF str test "$tls" -ieq "LibreSSL" || str test $tls -ieq auto RUN apk add libressl-dev ELSE IF str test "$tls" -ieq "OpenSSL" RUN apk add openssl-dev END alpine-build-env-base: ARG --required version FROM +alpine-base --version=$version RUN apk add snappy-dev ccache alpine-test-env-base: ARG --required version FROM +alpine-base --version=$version RUN apk add snappy # alpine3.18-build-env : # A build environment based on Alpine Linux version 3.18 alpine3.18-build-env: FROM +alpine-build-env-base --version=3.18 alpine3.18-test-env: FROM +alpine-test-env-base --version=3.18 archlinux-base: FROM archlinux RUN pacman --sync --refresh --sysupgrade --noconfirm --quiet ninja gcc snappy DO +INIT ARG tls # We don't install libsasl2 here, because it's pre-installed on Arch IF str test "$tls" -ieq "LibreSSL" || str test $tls -ieq auto RUN pacman --sync --refresh --sysupgrade --noconfirm --quiet libressl END IF str test "$tls" -ieq "OpenSSL" || str test $tls -ieq auto RUN pacman --sync --refresh --sysupgrade --noconfirm --quiet openssl END # archlinux-build-env : # A build environment based on Arch Linux archlinux-build-env: FROM +archlinux-base DO +PREP_CMAKE RUN pacman --sync --refresh --sysupgrade --noconfirm --quiet ccache archlinux-test-env: FROM +archlinux-base DO +PREP_CMAKE ubuntu-base: ARG --required version FROM ubuntu:$version RUN apt-get update && apt-get -y install curl build-essential DO +INIT ARG --required sasl ARG --required tls IF str test "$sasl" -ieq Cyrus RUN apt-get update && apt-get -y install libsasl2-dev END IF str test "$tls" -ieq LibreSSL RUN echo "Ubuntu does not support LibreSSL" && exit 1 ELSE IF str test $tls -ieq OpenSSL || str test $tls -ieq auto RUN apt-get update && apt-get -y install libssl-dev END # u22-build-env : # A build environment based on Ubuntu 22.04 u22-build-env: FROM +ubuntu-base --version=22.04 # Build dependencies: RUN apt-get update && apt-get -y install \ ninja-build gcc ccache libsnappy-dev zlib1g-dev DO +PREP_CMAKE u22-test-env: FROM +ubuntu-base --version=22.04 RUN apt-get update && apt-get -y install libsnappy1v5 libsasl2-2 ninja-build DO +PREP_CMAKE env-warmup: ARG --required env BUILD +$env-build-env BUILD +$env-test-env # build : # Build libmongoc and libbson using the specified environment. # # The --env argument specifies the build environment, using “+${env}-build-env” # as the build environment target. Refer to the list of targets for a list of # available environments. build: # env is an argument ARG --required env FROM +$env-build-env DO --pass-args +BUILD_AND_INSTALL SAVE ARTIFACT /opt/mongoc/build/* /build-tree/ SAVE ARTIFACT /opt/mongo-c-driver/* /root/ # test-example will build one of the libmongoc example projects using the build # that comes from the +build target. test-example: ARG --required env FROM +$env-test-env # Grab the built COPY +build/root /opt/mongo-c-driver COPY --dir \ src/libmongoc/examples/cmake \ src/libmongoc/examples/cmake-deprecated \ src/libmongoc/examples/hello_mongoc.c \ /opt/mongoc-test/ RUN cmake \ -S /opt/mongoc-test/cmake/find_package \ -B /bld \ -G Ninja \ -D CMAKE_PREFIX_PATH=/opt/mongo-c-driver RUN cmake --build /bld # test-cxx-driver : # Clone and build the mongo-cxx-driver project, using the current mongo-c-driver # for the build. # # The “--test_mongocxx_ref” argument must be a clone-able Git ref. The driver source # will be cloned at this point and built. # # The “--cxx_version_current” argument will be inserted into the VERSION_CURRENT # file for the cxx-driver build. test-cxx-driver: ARG --required env ARG --required test_mongocxx_ref ARG cxx_version_current=0.0.0 FROM +$env-build-env COPY +build/root /opt/mongo-c-driver LET source=/opt/mongo-cxx-driver/src LET build=/opt/mongo-cxx-driver/bld GIT CLONE --branch=$test_mongocxx_ref https://github.com/mongodb/mongo-cxx-driver.git $source RUN echo $cxx_version_current > $source/build/VERSION_CURRENT RUN cmake -S $source -B $build -G Ninja -D CMAKE_PREFIX_PATH=/opt/mongo-c-driver -D CMAKE_CXX_STANDARD=17 ENV CCACHE_HOME=/root/.cache/ccache ENV CCACHE_BASE=$source RUN --mount=type=cache,target=$CCACHE_HOME cmake --build $build # Simultaneously builds and tests multiple different platforms multibuild: BUILD +test-example --env=u22 --env=archlinux --env=alpine3.18 \ --sasl=Cyrus --sasl=off \ --tls=OpenSSL --tls=off # Note: At time of writing, Ubuntu does not support LibreSSL, so run those # tests on a separate BUILD line that does not include Ubuntu: BUILD +test-example --env=archlinux --env=alpine3.18 \ --sasl=Cyrus --sasl=off \ --tls=LibreSSL # test-vcpkg-classic : # Builds src/libmongoc/examples/cmake/vcpkg by using vcpkg to download and # install a mongo-c-driver build in "classic mode". *Does not* use the local # mongo-c-driver repository. test-vcpkg-classic: FROM +vcpkg-base RUN vcpkg install mongo-c-driver RUN rm -rf _build && \ make test-classic # test-vcpkg-manifest-mode : # Builds src/libmongoc/examples/cmake/vcpkg by using vcpkg to download and # install a mongo-c-driver package based on the content of a vcpkg.json manifest # that is injected into the project. test-vcpkg-manifest-mode: FROM +vcpkg-base RUN apk add jq RUN jq -n ' { \ name: "test-app", \ version: "1.2.3", \ dependencies: ["mongo-c-driver"], \ }' > vcpkg.json && \ cat vcpkg.json RUN rm -rf _build && \ make test-manifest-mode vcpkg-base: FROM alpine:3.18 RUN apk add cmake curl gcc g++ musl-dev ninja-is-really-ninja zip unzip tar \ build-base git pkgconf perl bash linux-headers ENV VCPKG_ROOT=/opt/vcpkg-git ENV VCPKG_FORCE_SYSTEM_BINARIES=1 GIT CLONE --branch=2023.06.20 https://github.com/microsoft/vcpkg $VCPKG_ROOT RUN sh $VCPKG_ROOT/bootstrap-vcpkg.sh -disableMetrics && \ install -spD -m 755 $VCPKG_ROOT/vcpkg /usr/local/bin/ LET src_dir=/opt/mongoc-vcpkg-example COPY src/libmongoc/examples/cmake/vcpkg/ $src_dir WORKDIR $src_dir # run : # Run one or more targets simultaneously. # # The “--targets” argument should be a single-string space-separated list of # target names (not including a leading ‘+’) identifying targets to mark for # execution. Targets will be executed concurrently. Other build arguments # will be forwarded to the executed targets. run: LOCALLY ARG --required targets FOR __target IN $targets BUILD +$__target END mongo-c-driver-1.26.0/NEWS000066400000000000000000003362701456567454500151670ustar00rootroot00000000000000libmongoc 1.26.0 ================ New Features: * Support named KMS providers. * Redirect retries in sharded clusters to another mongos if possible. Improvements: * Add `VERSION_CURRENT` file in source to ease building. * Consider more errors retryable. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Adrian Dole * Kyle Kloberdanz * Ezra Chung * MongoCaleb * Roberto C. Sánchez * itrofimow libmongoc 1.25.4 ================ Fixes: * Restore support for Sphinx 1.7.6 for man page build. libmongoc 1.25.3 ================ Fixes: * Disable shared libmongoc targets if `ENABLE_SHARED=OFF` * Fix documentation build with Python 3.9. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.25.2 ================ Fixes: * Fix data race in `mongoc_cursor_get_host`. * Accept discouraged timeout values for backwards compatibility. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Kyle Kloberdanz * Roberto C. Sánchez libmongoc 1.25.1 ================ Fixes: * Add back support for `BUILD_VERSION` CMake option. `BUILD_VERSION` was unintentionally removed in 1.25.0. libmongoc 1.25.0 ================ Fixes: * Send `recoveryToken` in transactions when connected to a load balancer. Improvements: * Remove optional dependency of libicu. * Use OP_MSG exhaust for mongod >= 4.2. Enable exhaust cursors for mongos >= 7.1. * Share cached credentials for SCRAM authentication among all clients to improve performance. * Use polling monitoring in FaaS environments. Build Configuration: * Remove `ENABLE_SRV=AUTO`. Only support boolean values for `ENABLE_SRV`. Platform Support: * Support for macOS 10.14 is dropped. * Support for Ubuntu 14.04 is dropped. * Support for Debian 8.1 is dropped. Other: * The constructed source-distribution archive is no longer available as a release artifact. Please instead use the per-release repository archive attached to a GitHub release, or clone the repository at the desired release tag. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike * Adrian Dole * Roberto C. Sánchez * Ezra Chung * Joshua Siegel * Kyle Kloberdanz * Jeremy Mikola libmongoc 1.24.4 ================ Fixes: * Fix build failure caused by missing `bson-dsl.h` install in libbson. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.24.3 ================ Fixes: * Fix possible memory leak on SCRAM authentication failure. * Fix possible recursive lock on network error in single-threaded client. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Roberto C. Sánchez libmongoc 1.24.2 ================ Fixes: * Fix possible crash if thread creation fails. * Fix possible assertion if `mongoc_cursor_new_from_command_reply_with_opts` is called with open cursor and no `serverId` option. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.24.1 ================ Fixes: * Remove unnecessary assert in bulk API. May result in an abort when creating bulk operations with the `mongoc_bulk_operation_new` API intended for wrapping drivers. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.24.0 ================ New Features: * Support MongoDB server version 7.0. * Support updated Queryable Encryption protocol. * Introduces backwards breaking changes to the Queryable Encryption protocol. Using Queryable Encryption now requires MongoDB server version 7.0+. * Support new Queryable Encryption features. * Add `mongoc_client_encryption_create_encrypted_collection` to automatically create data encryption keys when creating a new encrypted collection. * Support new security features. * Add ability to fetch KMS credentials automatically from Azure, GCP, and AWS environments. * Support authentication with KMS AWS temporary credentials. * Cache fetched AWS credentials. * Support AWS IAM Roles for service accounts, EKS in particular. * Retry operations if the connection handshake fails. * Add index creation helper: `mongoc_collection_create_indexes_with_opts`. Fixes: * Fix default applied credentials for Kerberos with SSPI on Windows. * Fix possible overcounting in Performance Counters used by `mongoc-stat`. Language Standard Support: * C89 support has been dropped. C99 is the default tested C standard. Platform Support: * Support for macOS 10.14 will be dropped in an upcoming release. * Support for Ubuntu 14.04 will be dropped in an upcoming release. * Support for Debian 8.1 will be dropped in an upcoming release. Build Configuration: * The `ENABLE_BSON` configure-time option has been removed. Build scripts that used `ENABLE_BSON=SYSTEM` should be updated to use `USE_SYSTEM_LIBBSON=TRUE`. If the build script needs to support building arbitrary versions of the C driver, add both `ENABLE_BSON=SYSTEM` and `USE_SYSTEM_LIBBSON=TRUE`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Colby Pike * Gil Alon * Kyle Kloberdanz * Jeremy Mikola * Andreas Braun * Kondaiah Valagonda * Joshua Siegel * Roberto C. Sánchez * Romain Geissler @ Amadeus * bisht2050 * Adrian Dole libmongoc 1.23.5 ================ Fixes: * Fix potential crash due to insufficient memory when allocating performance counters. * Fix compilation error on Android platforms due to missing `aligned_alloc`. * Return an error if `RewrapManyDataKey` is invoked without a `provider` when a `masterKey` is given. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Romain Geissler @ Amadeus libmongoc 1.23.4 ================ Fixes: * Fix possible failure to authenticate with MONGODB-X509 after network error. Thanks to everyone who contributed to the development of this release. * Andreas Braun * Kevin Albertson * Kyle Kloberdanz libmongoc 1.23.3 ================ Fixes: * Better handle malformed `hello` responses * Handle `connectionId` of type `double`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Gil Alon * Kondaiah Valagonda libmongoc 1.23.2 ================ Bug fixes: * Fix compile on M1 macOS fails due to undeclared function (getpagesize) Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Kyle Kloberdanz libmongoc 1.22.2 ================ * Fix connectivity to Atlas Data Lake * Additional bugfixes from libbson 1.22.2 Thanks to everyone who contributed to the development of this release. * Andreas Braun * Kevin Albertson * Roberto C. Sánchez libmongoc 1.23.1 ================ Bug fixes: * Fix connectivity to Atlas Data Lake * Fix crash when dropping a malformed Queryable Encryption collection. Thanks to everyone who contributed to the development of this release. * Andreas Braun * Kevin Albertson libmongoc 1.23.0 ================ Features: * Add on-demand Credentials Callback for CSFLE * Support obtaining AWS credentials for CSFLE in the same way as for MONGODB-AWS Improvements: * Reducing Warnings of Misaligned Address of Over-Aligned Types Bug fixes: * Do not spawn mongocryptd if mongo_shared shared library is loaded. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Colby Pike * Kevin Albertson * Roberto C. Sánchez libmongoc 1.22.1 ================ Bug fixes: * Fix documentation build when using Sphinx 5.0 or newer * Update patch release of libmongocrypt to 1.5.2: Fix a potential data corruption bug in RewrapManyDataKey when rotating encrypted data encryption keys backed by GCP or Azure key services. The following conditions will trigger this bug: A GCP-backed or Azure-backed data encryption key being rewrapped requires fetching an access token for decryption of the data encryption key. The result of this bug is that the key material for all data encryption keys being rewrapped is replaced by new randomly generated material, destroying the original key material. To mitigate potential data corruption, upgrade to this version or higher before using RewrapManyDataKey to rotate Azure-backed or GCP-backed data encryption keys. A backup of the key vault collection should always be taken before key rotation. Other: * Update to Fedora 37 for RPM builds * Dependency build of libmongocrypt re-uses the libbson of the depending libmongoc Thanks to everyone who contributed to the development of this release. * Ezra Chung * Roberto C. Sánchez * Kevin Albertson libmongoc 1.21.2 ================ Bug Fixes: * Address vulnerability in bundled zlib by updating to 1.1.12. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike libmongoc 1.22.0 ================ Bug fixes: * Do not auto decrypt before emitting CommandSucceeded events. Improvements: * Use OP_MSG if a server API version is requested. Features: * Add server connectionId to command monitoring events. * Add support for the comment field to all helpers. * Support mongo_shared shared library. * Support pre-point-in-time change stream events. * Support Queryable Encryption. * Support 'let' option for multiple CRUD commands. * Add Key Management API functions. Notes: * The 5.0-compat release (1.18.0) accidentally broke estimatedDocumentCount on views by changing its implementation to use aggregate and a $collStats stage instead of the count command. * The new release is fixing estimatedDocumentCount on views by reverting back to using count in its implementation. * Due to an oversight, the count command was omitted from the Stable API in server versions 5.0.0 - 5.0.8 and 5.1.0 - 5.3.1, so users of the Stable API with estimatedDocumentCount are recommended to upgrade their MongoDB clusters to 5.0.9 or 5.3.2 (if on Atlas) or set apiStrict: false when constructing their MongoClients. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Colby Pike * Ezra Chung * Roberto C. Sánchez * Jake Molnar * Jesse Williamson * Remi Collet libmongoc 1.21.1 ================ Bug Fixes: * Use static decls for OpenSSL 1.1 polyfills * Prevent possible crash in _mongoc_cursor_fetch_stream Thanks to everyone who contributed to the development of this release. * Jeremy Mikola * Remi Collet libmongoc 1.21.0 ================ Bug Fixes: * Addressed VS 2013 build failures due to missing C99 features. Features: * Support conditional $merge and $out aggregation on secondaries. * Bump minimum wire protocol version from 3 (MongoDB 3.0) to 6 (MongoDB 3.6). * Bump maximum wire protocol version from 14 (MongoDB 5.1) to 15 (MongODB 5.2). Improvements: * Update algorithm used for generation of OID values to reduce collisions. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Colby Pike * Kevin Albertson * Roberto C. Sánchez * David CARLIER * Jeremy Mikola libmongoc 1.20.1 ================ Bug fixes: * Fix bug where first hello command on a single-threaded client may not include full handshake. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.20.0 ================ Features: * Improve multi-threaded performance of client pool. * Support KMIP as a provider for Client-Side Field Level Encryption (CSFLE). Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Colby Pike * Jesse Williamson * Jeremy Mikola * Kaitlin Mahar mongo-c-driver 1.19.2 ===================== Announcing libmongoc 1.19.2. Bug fixes: * Fix assert on invalid URI options in client pools connected to load balanced clusters when a topology closed callback is registered. Thanks to everyone who contributed to the development of this release. --Kevin Albertson libmongoc 1.19.1 ================ It is my pleasure to announce libmongoc 1.19.1. Bug fixes: * Permit NULL platform argument in mongoc_handshake_data_append. * Fix wire version check in server selection when maxStalenessSeconds is specified in read preferences. * Fix assert on invalid URI options in client pools connected to load balanced clusters. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung --Kevin Albertson mongo-c-driver 1.19.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.19.0 release. This release adds full support for MongoDB 5.0 servers and MongoDB Atlas Serverless Instances. Features: * Add full support to connect to MongoDB Atlas Serverless Instances. * Add support for snapshot reads on a session with mongoc_session_opts_set_snapshot. * Support the new URI option loadBalanced to connect to a MongoDB cluster behind a TCP load balancer. Bug fixes: * Fix the uploadDate set on newly created GridFS files in the mongoc_gridfs_bucket_t API. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Benjamin Rewis * Andreas Braun * Colby Pike * Ezra Chung * Roberto C. Sánchez * Jesse Williamson --Kevin Albertson mongo-c-driver 1.18.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.18.0 release. This release adds partial support for MongoDB 5.0 servers. Features: * Introduces support to select an API version when connecting to a MongoDB instance. * Supports Azure and Google Cloud Platform as Key Management Service (KMS) providers in Client-Side Field Level Encryption (CSFLE). * Support "let" option in aggregate command. * Support time series collections. * Relax validation for insert and replace documents to support fields containing dots and dollars. * Expose the reason operations fail document validation. Bug fixes: * Forward opts from mongoc_gridfs_bucket_find to underlying find operation. * Fixes a possible hang when a limited size client pool is waiting for a client to become available in mongoc_client_pool_pop. Improvements * Deprecate API containing deprecated terminology. * Use "hello" command for monitoring servers. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Andreas Braun * Clyde Bazile * Benjamin Rewis * Jeremy Mikola * Andrew Witten * Samantha Ritter * samantharitter * Fermín Galán Márquez * David Carlier * Colby Pike * Josh Weinstein * Pierre Mickael Gonzalo mongo-c-driver 1.18.0-alpha =========================== It is my pleasure to announce the MongoDB C Driver 1.18.0-alpha. This is an unstable prerelease and is unsuitable for production applications. Features: * Introduces support to select an API version when connecting to a MongoDB instance. * Supports Azure and Google Cloud Platform as Key Management Service (KMS) providers in Client-Side Field Level Encryption (CSFLE) Bug fixes: * Fixes a possible hang when a limited size client pool is waiting for a client to become available in mongoc_client_pool_pop. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Clyde Bazile * Andreas Braun * Andrew Witten * Samantha Ritter * Benjamin Rewis * Fermín Galán Márquez * David Carlier * Josh Weinstein * Pierre Mickael Gonzalo mongo-c-driver 1.17.7 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.7. - Print correct error message when DNS resolution fails - Mix time to avoid duplicate RAND_bytes for the same PIDs Thanks to everyone who contributed to the development of this release. * Andreas Braun * Jeremy Mikola --Kevin Albertson mongo-c-driver 1.17.6 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.6. Bug fixes: * Fix possible crash when speculative authentication fails with network error. Thanks to everyone who contributed to the development of this release. * Andreas Braun --Kevin Albertson mongo-c-driver 1.17.5 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.5. Improvements: * Fix documentation regarding when to call mongoc_log_set_handler Thanks to everyone who contributed to the development of this release. * Clyde Bazile * Fermín Galán Márquez --Kevin Albertson mongo-c-driver 1.17.4 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.4. Bug fixes: * Fix crash on macOS on client pool shutdown. * Fix spacing in extended JSON output for numberLong. * Clear error in mongoc_collection_find_and_modify_with_opts on a successful retry. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Samantha Ritter -- Kevin Albertson mongo-c-driver 1.17.3 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.3. Bug fixes: * Do not send session ID on GSSAPI auth commands. * Fix build against zlib when zlib is installed in non-standard location. * Fix build when source directory path contains a space. * Fix a platform-specific bug causing mongoc_client_pool_pop to block indefinitely if all clients are checked out. * Fix a possible buffer overflow with hostnames resolving to IPv6 addresses on OpenSSL. Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * Kevin Albertson * Andrew Witten * gonzalo -- Kevin Albertson mongo-c-driver 1.17.2 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.2. Bug fixes: * Stop the SRV polling thread when an SRV URI is used to connect to a deployment other than a sharded cluster. Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * Kevin Albertson -- Kevin Albertson mongo-c-driver 1.17.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.1. Bug fixes: * Fix SRV/TXT record lookup for DNS records exceeding 1024 bytes. -- Kevin Albertson mongo-c-driver 1.17.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.0 release. This release adds support for MongoDB 4.4 servers. Features: * Support streamable server monitoring to reduce recovery time when the server topology changes. * Support the MONGODB-AWS authentication mechanism. * Support Online Certificate Status Protocol (OCSP). * Support configuring hedged reads in read preferences. * Reduce the number of round trips necessary for SCRAM and X509 authentication. * Monitor servers in parallel when using a mongoc_client_pool_t instead of doing serial scans. * Support the "hint" option in operations using the update, replace, delete, and findAndModify commands. * Improve behavior for retryable writes. * Improve resuming behavior of change streams on server errors. * Remove restriction of 255 character collection namespaces. Bug fixes: * Fix criteria for resumable errors in change streams. * Fix rare crashes when server is invalidated during authentication. * Reject client session for mongoc_collection_estimated_document_count. * Fix behavior of a SecondaryPreferred read preference for exhaust cursor operations against a sharded cluster. Prior to the fix, a nonzero maxStalenessSeconds would not trigger sending the read preference. * Fix SRV polling. Prior to the fix, SRV polling did not properly apply newly discovered results. * Fix checks for existing GridFS indexes to handle indexes created by the MongoDB shell. * Fix possible use of invalidated streams during an unordered OP_QUERY bulk write, and when ending many pooled sessions at client destruction. * Fix a crash when setting the crl_file TLS option for Secure Channel. * Avoid emitting duplicate ServerChanged events when no change is observed during monitoring. * Properly handle large SASL messages instead of erroring. Notes: * Deprecated "lib" prefixed artifacts are no longer produced when building on Windows. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Andrew Witten * Andreas Braun * Clyde Bazile * Josh Weinstein -- Kevin Albertson mongo-c-driver 1.17.0 rc0 ========================= It is my pleasure to announce the MongoDB C Driver 1.17.0 rc0 release. This release adds support for MongoDB 4.4 servers. Features: * Support streamable server monitoring to reduce recovery time when the server topology changes. * Support tlsDisableCertificateRevocationCheck when built with Secure Channel. Bug fixes: * Fix criteria for resumable errors in change streams. * Fix rare crashes when server is invalidated during authentication. * Improve behavior when reaching out to OCSP responders for certificate revocation checking. * Reject client session for mongoc_collection_estimated_document_count. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Andrew Witten * Roberto C. Sánchez * Clyde Bazile -- Kevin Albertson mongo-c-driver 1.17.0 beta2 =========================== It is my pleasure to announce the MongoDB C Driver 1.17.0 beta2 release. Features: * Support Online Certificate Status Protocol (OCSP) response caching. * Support configuring hedged reads in read preferences. * Reduce the number of round trips necessary for SCRAM and X509 authentication. * Monitor servers in parallel when using a mongoc_client_pool_t instead of doing serial scans. * Support OCSP on older versions of OpenSSL (1.0.1+). Bug fixes: * Fix behavior of a SecondaryPreferred read preference for exhaust cursor operations against a sharded cluster. Prior to the fix, a nonzero maxStalenessSeconds would not trigger sending the read preference. * Fix SRV polling. Prior to the fix, SRV polling did not properly apply newly discovered results. * Fix checks for existing GridFS indexes to handle indexes created by the MongoDB shell. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Andreas Braun * Clyde Bazile * Josh Weinstein -- Kevin Albertson mongo-c-driver 1.17.0 beta ========================== It is my pleasure to announce the MongoDB C Driver 1.17.0 beta release. Features: * Support the MONGODB-AWS authentication mechanism. * Support the Online Certificate Status Protocol (OCSP) for OpenSSL 1.1.0+, Secure Transport, and Secure Channel. * Support the "hint" option in operations using the update, replace, delete, and findAndModify commands. * Improve behavior for retryable writes. * Improve resuming behavior of change streams on server errors. * Remove an extra round trip for SCRAM authentication. * Remove restriction of 255 character collection namespaces. Bug fixes: * Fix possible use of invalidated streams during an unordered OP_QUERY bulk write, and when ending many pooled sessions at client destruction. * Fix a crash when setting the crl_file TLS option for Secure Channel. * Avoid emitting duplicate ServerChanged events when no change is observed during monitoring. * Properly handle large SASL messages instead of erroring. Notes: * Deprecated "lib" prefixed artifacts are no longer produced when building on Windows. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Andreas Braun * Clyde Bazile * Jeremy Mikola * Sara Golemon -- Kevin Albertson mongo-c-driver 1.16.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.16.1. Bug fixes: * Fix listed library dependency on mongoc_static target when building with libmongocrypt. * Replace a call of free to bson_free. * Vendor Sphinx basic theme and correctly list static files for docs. * Fix a compilation warning introduced in 1.16.0. Thanks to everyone who contributed to the development of this release. * Kevin Albertson Peace, Kevin Albertson mongo-c-driver 1.16.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.16.0. Features: * Support Client-side Field Level Encryption. * Support ability to pass an index hint to update operations. * Add cmake export targets. Bug fixes: * Fix a bug with Windows SSPI failing to authenticate with GSSAPI when using pooled clients for certain operations. * Fix behavior for bulk writes that retry to keep track of the successful server. * Remove hard limit of 1024 characters for SRV response. * Fix racy crash when using client pool against a sharded cluster if a server is invalidated shortly before a new socket is opened against it. * Remove unnecessary library dependencies causing overlinking. * Ensure server proof has been validated during SCRAM conversation. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Clyde Bazile * Andreas Braun * Roberto C. Sánchez * Samantha Ritter * Isabel Atkinson * Kaitlin Mahar * Diego Barrios Romero * Sara Golemon * Vasil Velichkov * EGuesnet Peace, Kevin Albertson mongo-c-driver 1.15.3 ===================== It is my pleasure to announce the MongoDB C Driver 1.15.3. Bug fixes: * Fix a hang on macOS when connecting to a server over TLS * Add zstd as a dependency when libmongoc static library is compiled with zstd support * Fix compilation on AIX 6.1 Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Samantha Ritter * EGuesnet mongo-c-driver 1.15.2 ===================== It is my pleasure to announce the MongoDB C Driver 1.15.2. Bug fixes: * Prevent mongoc_transaction_opts_set_max_commit_time_ms from applying to subsequent transactions that should be using the default. * Do not report the initial error if a retry for a change stream function (mongoc_collection_watch, mongoc_database_watch, or mongoc_client_watch) succeeds Thanks to everyone who contributed to the development of this release. * Andreas Braun * Clyde Bazile Peace, Kevin Albertson mongo-c-driver 1.15.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.15.1. Bug fixes: * Fix change stream resume logic when no documents received * Reduce the required cmake version to build with zstd support * Minor fixes to mongos pinning logic * Do not resume a change stream on NonResumableChangeStreamError Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Clyde Bazile Peace, Clyde Bazile mongo-c-driver 1.15.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.15.0. This release adds support for MongoDB 4.2 features. Features: * Support for sharded transactions on MongoDB sharded clusters 4.2+. * Add convenient transaction runner (mongoc_client_session_with_transaction), which accepts a callback and performs appropriate retry logic. * Add a new transaction option to specify maximum time to wait for a commit, mongoc_transaction_opts_set_max_commit_time_ms. * Add URI option "retryReads=true" safely and automatically retries certain read operations if the server is a MongoDB 3.6+. * Poll SRV records to mongos servers periodically. * Keep connections alive after a primary stepdown detected. * Standardizes URI options supported across all spec-compliant MongoDB drivers. * "retryWrites" URI option now defaults to true (requires crypto for session support). * Send any aggregate with $out or $merge stage to a primary. * Add the ability to specify an aggregate pipeline as an update document. * Add a database aggregate helper, mongoc_database_aggregate. * Add option for change streams, "startAfter". * Add mongoc_change_stream_get_resume_token, which returns the resume token which should be used to resume a change stream. * Add support for zstd compression. Bug fixes: * Correctly report an error in mongoc_change_stream_next if the resume token (_id) is not a document. Previously, an error was only reported if the field was missing. * Fix mongoc_collection_update with MONGOC_UPDATE_MULTI_UPDATE, mongoc_collection_remove, and mongoc_collection_delete when retryWrites was enabled. They would fail previously. * Command options are now correctly taken into account when batching bulk writes for OP_QUERY. It was possible to exceed the maximum document size before. * Fix a crash if a multi-batch bulk write with OP_MSG errored on a batch. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Haris Sheikh * Samantha Ritter * Isabel Atkinson * Sara Golemon * Clyde Bazile * Roberto C. Sánchez * Lior Kaplan * pasniak Peace, Kevin Albertson mongo-c-driver 1.14.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.14.1. Bug fixes: * Prohibit starting a transaction for pre-4.0 MongoDB servers. * Prohibit starting a sharded transaction for pre-4.2 MongoDB servers. Thanks to everyone who contributed to the development of this release. * Jeremy Mikola * Clyde Bazile Peace, Kevin Albertson mongo-c-driver 1.14.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.14.0. Features: * Support for OpenSSL 1.1.1 and its implementation of TLS v1.3. * New function mongoc_stream_should_retry. * New accessor mongoc_server_description_last_update_time. * New method mongoc_client_reset to be called after forking. Bug fixes: * OP_MSG with unacknowledged writes (write concern of w:0) would serialize incorrectly on big-endian platforms, causing writes to use the default write concern of w:1. * mongoc_collection_update_many and mongoc_collection_delete_many would fail with the URI option retryWrites=true. * In a transaction, the driver now properly ignores the readConcern configured on a client, database, or collection: only the mongoc_transaction_opt_t's readConcern is used. * Remove timestamp from uninstall scripts to permit reproducible build. * Setting mongoc_ssl_opt_t.pem_file or ca_file to a bad file path caused a hang with Darwin SSL. * Fix the ENABLE_SASL cmake option: * Remove unnecessary GSSAPI value. It was equivalent to specifying ENABLE_SASL=CYRUS. * ENABLE_SASL=AUTO now correctly chooses SSPI on Windows instead of CYRUS. * The client pool failed to set proper apm callbacks for clients created via try_pop(). Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Roberto C. Sánchez * Kevin Albertson * Samantha Ritter * Spencer McKenney * Henrik Edin * Jeremy Mikola * Evgeni Dobranov * Derick Rethans * 平民·寻梦(Pingmin Fenlly Liu) * David Carlier * Gustaf Neumann * Jeroen * Jeroen Ooms * Kaitlin Mahar * Tomas Mozes * Clyde Bazile Peace, Samantha Ritter mongo-c-driver 1.13.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.13.1. Bug fixes: * mongoc_collection_update_many and mongoc_collection_delete_many would fail with the URI option retryWrites=true. * Remove timestamp from uninstall scripts to permit reproducible build. * Add missing header files to the release tarball to fix compilation when configuring with ENABLE_SASL=GSSAPI. * Separate libmongoc and libbson uninstall scripts so they do not overwrite each other. * Fix running make install with DESTDIR. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * A. Jesse Jiryu Davis * Henrik Edin Peace, Kevin Albertson mongo-c-driver 1.13.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.13.0. Features: * Report a new error code, MONGOC_ERROR_GRIDFS_CORRUPT, when a chunk larger than chunkSize is detected. Before, the driver had crashed with an assert. * Restructure of install directory. All mongoc headers are under mongoc/ and all bson headers are under bson/. The preferred way of including the headers are mongoc/mongoc.h and bson/bson.h respectively. Forwarding headers in the root are provided for backwards compatibility. * The default CMake build type had been unspecified, now it is RelWithDebInfo. * Support LibreSSL 2.7+. Bug fixes: * mongoc_collection_replace_one is now a correctly exported symbol. * Fix multiple issues with readConcern and writeConcern inheritance. * Fix rare crash with mongodb+srv URIs on Windows. * mongoc_gridfs_create_file_from_stream ignored errors while writing chunks to the server. * The following functions should not have taken a "bypassDocumentValidation" option in bson_t *opts, the option is now prohibited: - mongoc_bulk_operation_insert_with_opts - mongoc_bulk_operation_update_one_with_opts - mongoc_bulk_operation_update_many_with_opts - mongoc_bulk_operation_replace_one_with_opts * The heartbeat-succeeded and heartbeat-failed events (part of SDAM Monitoring) had uninitialized "duration" fields, they are now set correctly. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Roberto C. Sánchez * Kevin Albertson * Henrik Edin * Spencer McKenney * Jeremy Mikola * Evgeni Dobranov * Tomas Mozes * Derick Rethans * Gustaf Neumann * Jeroen Ooms * Kaitlin Mahar Peace, Kevin Albertson mongo-c-driver 1.12.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.12.0. Features: * New function mongoc_client_session_in_transaction to check if a multi- document transaction is started. * New examples for change streams and transactions, improved guide for migrating from mongoc_collection_count to mongoc_collection_count_documents Bug fixes: * Fix occasional crash in sharded queries * Retry all retryable write concern errors * mongoc_client_session_commit_transaction sets the correct error label when the primary is unavailable * mongoc_collection_find_with_opts had prohibited read preference "primary" in a transaction * mongoc_collection_aggregate had not inherited its mongoc_collection_t's read preference; only an explicitly provided read preference was used. * Allow unencoded delimiters in username/password if unambiguous Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * A. Jesse Jiryu Davis * Kevin Albertson * Spencer McKenney * Evgeni Dobranov * Jeremy Mikola * 平民·寻梦(Pingmin Fenlly Liu) Peace, A. Jesse Jiryu Davis mongo-c-driver 1.11.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.11.0. This release adds support for MongoDB 4.0 features. It includes the following additions and improvements: * Multi-document transactions, see mongoc_client_session_start_transaction * New function mongoc_error_has_label to check for specific error labels such as "TransientTransactionError" or "UnknownTransactionCommitResult" in error replies. * New functions to subscribe to changes on an entire client or database: - mongoc_client_watch - mongoc_database_watch * New option for change streams, "startAtOperationTime". * mongoc_collection_count_with_opts is deprecated for two new functions: - mongoc_collection_count_documents - mongoc_collection_estimated_document_count * Support for SCRAM-SHA-256 authentication, including support for non-ASCII passwords using libicu is an optional dependency. * Faster mongoc_database_get_collection_names_with_opts fetches only names, not the entire collection metadata. Additional changes not specific to MongoDB 4.0: * All "destroy" functions such as mongoc_collection_destroy now ignore a NULL argument. * The driver now returns an error if you attempt to use "arrayFilters" in an update with a MongoDB server older than 3.6. * Update functions include a new "upsertedCount" field in the reply document. * Replace MD5 with FNV-1a hash to generate ObjectIds (for FIPS compliance). Bug fixes: * Functions incorrectly marked with the "const" compiler attribute are now marked as "pure", fixes build error when link-time optimization is enabled. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson * Evgeni Dobranov * Spencer McKenney * Jeremy Mikola * Roberto C. Sánchez * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.10.3 ===================== No change since 1.10.2; released to keep pace with libbson's version. -- A. Jesse Jiryu Davis mongo-c-driver 1.10.2 ===================== It is my pleasure to announce the MongoDB C Driver 1.10.2. This release fixes the libbson and libmongoc installed library filenames and SONAMEs on Linux. They had changed unintentionally with the switch to CMake in 1.10.0; they are now consistent with 1.9.x and previous releases. Thanks to Roberto C. Sánchez for the fix. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.10.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.10.1. This release fixes the following bugs introduced in version 1.10.0: * Client sessions were not prohibited with unacknowledged write concern and mongoc_bulk_operation_execute; now they are prohibited. Client sessions have been prohibited with all other unacknowledged writes since 1.10. * The "arrayFilters" update option, new in MongoDB 3.6 and supported since libmongoc 1.9.0, was inadvertently prohibited by mongoc_bulk_operation_update_one_with_opts and mongoc_bulk_operation_update_many_with_opts in 1.10. The option is now permitted again. * The mongoc-stat tool for displaying shared counters was disabled on Linux and not installed; it is now restored. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Jeremy Mikola * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.10.0 ===================== It is my pleasure to announce MongoDB C Driver 1.10.0. This version drops support for MongoDB 2.6 and adds the following features and bugfixes: * libbson and libmongoc are now maintained in the mongo-c-driver repository, although they are still built as separate libraries, and libbson can still be used without libmongoc. * Building libbson and libmongoc now requires CMake on all platforms. The Autotools build scripts ("configure" and related scripts) have been deleted. See the "installing" page for updated instructions, including the new ENABLE_MONGOC option and changes to the ENABLE_BSON option. * IPv6 is now fully supported and conforms to RFC-6555. If a hostname has both IPv4 and IPv6 DNS records, the driver tries connecting with IPv6 first. If a connection can't be established after 250ms then IPv4 is tried in parallel. Whichever succeeds connection first cancels the other. The successful DNS result is cached for 10 minutes. * If CMake is configured with ENABLE_SSL=AUTO (the default), libmongoc now uses native TLS libraries on Mac and Windows, and OpenSSL everywhere else. Before, it would search for OpenSSL on all platforms and only use native TLS on Mac and Windows as a fallback. * The driver now handshakes SSL connections to multiple servers in a replica set or sharded cluster in parallel, so long as it uses OpenSSL or Windows SChannel. (SSL handshakes with Apple's Secure Transport are still serial.) A larger receive buffer with SChannel increases performance over slow connections. * All functions that accept read concern now prohibit it, if MongoDB is too old to support it (MongoDB 3.0). * Client sessions are now prohibited with unacknowledged writes. * mongoc_collection_find_and_modify_with_opts now prohibits write concern if MongoDB is too old to support it (MongoDB 3.0). * Other helper functions for commands that write, now prohibit write concern if MongoDB is too old to support it (pre-3.4): mongoc_client_read_write_command_with_opts mongoc_client_write_command_with_opts mongoc_collection_read_write_command_with_opts mongoc_collection_write_command_with_opts mongoc_database_read_write_command_with_opts mongoc_database_write_command_with_opts mongoc_collection_aggregate with $out mongoc_collection_drop_index_with_opts mongoc_collection_drop_with_opts mongoc_collection_rename_with_opts mongoc_database_drop_with_opts Write concern behavior is unchanged for regular CRUD functions. * Setting a negative writeConcern level of -2 or smaller, via the "opts" parameter to functions that accept BSON options, is now prohibited. The special "w" values -2 through -4 are only used internally. The deprecated "w=-1" is still allowed, as a synonym for "w=0". * The Kerberos URI option authMechanismProperties=CANONICALIZE_HOST_NAME:true is now implemented with the Windows Kerberos provider, SSPI. * This repository now includes GDB and LLDB customizations for pretty-printing bson_t structs as JSON while debugging. See the "debugging" page. * The internal preprocessor symbol HAVE_STRINGS_H has been renamed BSON_HAVE_STRINGS_H. If you maintain a handwritten bson-config.h you must rename this symbol. * The following helper functions do not work with mongoc_client_session_t, they are deprecated in favor of running MongoDB commands directly with a function like mongoc_client_read_command_with_opts: mongoc_client_get_server_status mongoc_collection_stats mongoc_collection_validate * mongoc_cursor_is_alive is now deprecated for mongoc_cursor_more, which is functionally equivalent. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson * Roberto C. Sánchez * Jeremy Mikola * Xiangyu Yao * Jeroen Ooms * Derick Rethans * Kaitlin Mahar * Pavithra Vetriselvan * NotSpooky * Iulian Rotaru * Katherine Walker Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.5 ==================== It is my pleasure to announce mongo-c-driver 1.9.5. This release fixes the following bugs: * New change streams API functions were not marked extern "C" * mongoc_collection_watch now accepts a pipeline argument as a BSON array, in addition to accepting a BSON document with a "pipeline" array field * Crashes in several change stream error handling paths * Commands could return false with an empty bson_error_t after a replica set reconfig * Network error messages omitted the command name when using OP_MSG Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.4 ==================== It is my pleasure to announce mongo-c-driver 1.9.4. This release offers compatibility with Sphinx 1.7.0 and above and fixes two bugs: * Ensure a change stream uses the proper session id while iterating * Fix a rare crash in pooled mode when a replica set member was disconnected Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.3 ==================== It is my pleasure to announce mongo-c-driver 1.9.3. This version fixes a session-management bug that could cause an authentication error while connected to MongoDB 3.6+ and iterating a cursor, and it permits the $gleStats modifier with mongoc_collection_aggregate. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.2 ==================== No change since 1.9.1; released to keep pace with libbson's version number. -- A. Jesse Jiryu Davis mongo-c-driver 1.9.1 ==================== It is my pleasure to announce mongo-c-driver 1.9.1. This release fixes a bug that caused session ID to be included in authentication and server monitoring commands. Thanks to Jeremy Mikola for finding and fixing the issue. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.0 ==================== It is my pleasure to announce mongo-c-driver 1.9.0. This version drops support for MongoDB 2.4 and adds support for MongoDB 3.6 features: * New struct mongoc_change_stream_t to watch a collection for changes. * New struct mongoc_client_session_t represents a MongoDB 3.6 session, which supports causal consistency: you are guaranteed to read your writes and to perform monotonic reads, even when reading from secondaries or in a sharded cluster. * New functions that accept flexible options as a BSON document. These accept a "sessionId" option and any future options. In addition, the two new "update" functions accept the "arrayFilters" option that is new in MongoDB 3.6: mongoc_collection_insert_one mongoc_collection_insert_many mongoc_collection_update_one mongoc_collection_update_many mongoc_collection_replace_one mongoc_collection_delete_one mongoc_collection_delete_many mongoc_client_command_with_opts mongoc_database_command_with_opts mongoc_collection_command_with_opts mongoc_client_find_databases_with_opts mongoc_client_get_database_names_with_opts mongoc_collection_create_bulk_operation_with_opts mongoc_collection_find_indexes_with_opts mongoc_database_find_collections_with_opts mongoc_database_get_collection_names_with_opts * New URI option "retryWrites=true" safely and automatically retries certain write operations if the server is a MongoDB 3.6 replica set or sharded cluster. * Support for MongoDB OP_MSG wire protocol. Additional changes not specific to MongoDB 3.6: * Support for mongodb+srv URIs to query DNS for SRV and TXT records that configure the connection to MongoDB. * Support LibreSSL with CMake build * The "minPoolSize" URI option is deprecated: it's confusing and not useful. Bug fixes: * mongoc_bulk_operation_execute did not always initialize "reply". * Fix C99 pedantic warnings. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeremy Mikola * Kevin Albertson * Jeroen Ooms * Iulian Rotaru * Derick Rethans * Graham Whitted * Brian Moss * Alex Masterov * Michael Kuhn * Sriharsha Vardhan Peace, A. Jesse Jiryu Davis mongo-c-driver 1.8.2 ==================== It is my pleasure to announce mongo-c-driver 1.8.2. This release fixes the following bugs: * Remove option to bundle the Snappy compression library, it caused issues for programs linking to libmongoc * Fix pkg-config and CMake config file flags for programs that statically link to libmongoc when libmongoc is statically linked to zLib * The configure flag "--with-zlib=no" was ignored Crash in authentication when username is NULL Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Derick Rethans * Hannes Magnusson * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.8.1 ==================== It is my pleasure to announce mongo-c-driver 1.8.1. This release fixes the following bugs: * Remove a syntax error in the configure script that affects some shells. * The configure script respects --with-zlib=system and --with-snappy=system. * The internal mongoc_server_description_t struct is properly reinitialized after a network error. * Fix the encoding of this NEWS file. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.8.0 ==================== * The zLib and Snappy compression libraries are bundled if not available. Wire protocol compression is enabled on Windows. * mongoc_collection_find_and_modify_with_opts now respects a "writeConcern" field in the "extra" BSON document in its mongoc_find_and_modify_opts_t. * The command functions mongoc_client_read_write_command_with_opts, mongoc_database_read_write_command_with_opts, and mongoc_collection_read_write_command_with_opts now ignore the "read_prefs" parameter. * mongoc_collection_create_index and mongoc_collection_create_index_with_opts are both now deprecated. Use mongoc_database_write_command_with_opts instead; a guide to creating an index using that function has been added. * Use select, not WSAPoll, on Windows. * Always mark a server "Unknown" after a network error (besides a timeout). * mongoc_client_pool_t sends platform metadata to the server; before, only a single mongoc_client_t did. * New stream method mongoc_stream_timed_out. * Wire version checks introduced in 1.8.0 will prevent the driver from connecting to a future MongoDB server version if its wire protocol is incompatible. * New CMake option ENABLE_MAINTAINER_FLAGS. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.7.0 ==================== It is my pleasure to announce mongo-c-driver 1.7.0. New features and bug fixes: * CMake build now installs .pc files for programs that link to libmongoc using pkg-config. Both the CMake and Autotools build systems now install .cmake files for programs that link to libmongoc using CMake. Linking to libmongoc statically or dynamically is now much more convenient. See the new tutorial section "Include and link libmongoc in your C program". * New CMake option ENABLE_STATIC can be ON, OFF, or AUTO (the default) * Minimum required CMake version has been increased to 3.1. * CMake remains experimental on non-Windows platforms and issues a warning now * Support for wire compression. * Support for snappy and zlib. MongoDB 3.4 only supports snappy, while zlib support is expected in MongoDB 3.6. The enable, configure mongoc like so: ./configure --with-snappy --with-zlib * New functions: mongoc_uri_get_compressors & mongoc_uri_set_compressors, to get and set compressor configuration on mongoc_uri_t * Added support for comma separated "compressors" connection string option (e.g. mongodb://localhost/?compressors=snappy,zlib) * Added support for configuring zlib compression level in the connection string (e.g. mongodb://localhost/?compressors=zlib&zlibcompressionlevel=8) * Now requires the use of CMake config files for libbson to build libmongoc with CMake * Added pkg-config support for libressl. * New function mongoc_uri_set_auth_mechanism to update the authentication mechanism of a mongoc_uri_t after it is created from a string. * New function mongoc_bulk_operation_insert_with_opts provides immediate error checking. * New function mongoc_uri_new_with_error provides a way to parse a connection string, and retrieve the failure reason, if any. * Support for MongoDB Connection String specification * All connection string options are now represented by MONGOC_URI_xxx macros * Paths to Unix Domain Sockets must be url encoded * Repeated options now issue warnings * Special characters in username, password and other values must be url encoded * Unsupported connection string options now issue warnings * Boolean values can now be represented as true/yes/y/t/1 and false/no/n/f/0. * Case is now preserved in Unix domain paths. * New function mongoc_cursor_error_document provides access to server's error reply if a query or command fails. * New function mongoc_write_concern_is_default determines whether any write concern options have been set, and mongoc_read_concern_is_default checks if read concern options are set. * mongoc_gridfs_find_one_with_opts optimized to use limit 1. Thanks to everyone who contributed to the development of this release. * Hannes Magnusson * A. Jesse Jiryu Davis * David Golden * Jeremy Mikola * Bernard Spil * Aleksander Melnikov * Adam Seering * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.6.0 ==================== It is my pleasure to announce mongo-c-driver 1.6.0. New features and bug fixes: * Enterprise authentication on Windows now uses the native GSSAPI library; Cyrus SASL is no longer required for enterprise auth on Windows. * BSON documents are more thoroughly validated before insert or update. * New function mongoc_uri_set_mechanism_properties to replace all the authMechanismProperties on an existing URI. * mongoc_uri_get_mechanism_properties asserts its inputs are not NULL. * For consistency with other MongoDB drivers, mongoc_collection_save is deprecated in favor of mongoc_collection_insert or mongoc_collection_update. * The driver is now built and continuously tested with MinGW-W64 on Windows. * Experimental support for HPUX. * The correct operation ids are now passed to Command Monitoring callbacks. * Fix a crash if the driver couldn't connect to the server to create an index. * The documentation is ported from Mallard XML to ReStructured Text, the HTML documentation is restyled, and numerous man page syntax errors fixed. * Getter functions for options in mongoc_find_and_modify_opts_t: * mongoc_find_and_modify_opts_get_bypass_document_validation * mongoc_find_and_modify_opts_get_fields * mongoc_find_and_modify_opts_get_flags * mongoc_find_and_modify_opts_get_max_time_ms * mongoc_find_and_modify_opts_get_sort * mongoc_find_and_modify_opts_get_update * All public functions now have the __cdecl calling convention on Windows. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Aleksander Melnikov * Jeroen Ooms * Brian McCarthy * Jonathan Wang * Peter Beckman * Remi Collet * Rockford Wei * Alexey Ponomarev * Christopher Wang * David Golden * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.5 ==================== It is my pleasure to announce mongo-c-driver 1.5.5. This release fixes bugs parsing the localThresholdMS option from the MongoDB URI, and a crash in mongoc_cursor_destroy if "query" or "filter" are invalid. Thanks to Jeremy Mikola. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.4 ==================== It is my pleasure to announce mongo-c-driver 1.5.4. This release fixes an error in cursor iteration when a readConcern is set. Thanks to Jeremy Mikola and Hannes Magnusson. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.3 ==================== This release fixes a bug that prevented connecting to IPv4-only MongoDB servers by hostname. https://jira.mongodb.org/browse/CDRIVER-1988 The driver has reverted to its 1.5.1 behavior: it connects to MongoDB over IPv6 if given an IPv6 connection string like "mongodb://[::1]", and requires an IPv4 connection when given a hostname like "mongodb://localhost". Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.2 ==================== It is my pleasure to announce mongo-c-driver 1.5.2. Thanks to everyone who contributed to the development of this release. New bug fixes: * CDRIVER-1975 allow mixed $ and non-$ query ops. * CDRIVER-1972 Support for ipv6 hostnames. * CDRIVER-1971 Missing exports of mongoc_gridfs_file_set_*() functions. * CDRIVER-1970 update define constants for "find" opts to be unique. * CDRIVER-1964 Windows CA stores should be opened with read-only flag. Thanks to everyone who contributed to the development of this release. * Hannes Magnusson * A. Jesse Jiryu Davis * Alexey Ponomarev * Peter Beckman * Rockford Wei Peace, Hannes Magnusson mongo-c-driver 1.5.1 ==================== It is my pleasure to announce mongo-c-driver 1.5.1. This is a bugfix release: * Fix SEGFAULT with performance counters on NUMA (thanks to Jonathan Wang). * Prevent rare assertion error in mongoc_cluster_stream_for_server. * Improve error messages from auth failure. * Escape quotes when appending CFLAGS to handshake metadata. * Fix OpenSSL header lookups in non-default paths. * Fix build failure with LibreSSL. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeroen Ooms * Jonathan Wang Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.0 ==================== It is my pleasure to announce mongo-c-driver 1.5.0. New features and bug fixes: * MongoDB 3.4 Support * New URI and read preference option, "maxStalenessSeconds" * MongoDB Handshake * writeConcern and readConcern enhancements * Collation allows users to specify language-specific rules for string comparison when sorting documents. See the code examples for mongoc_client_read_command_with_opts, mongoc_collection_count_with_opts, mongoc_collection_find_with_opts, and mongoc_index_opt_t, as well as the "Setting Collation Order" section of the "Bulk Write Operations" guide. * mongoc_collection_count_with_opts uses the collection's read preference if none is passed in * Improved TLS support * Fixed LibreSSL (libssl) support * Added LibreSSL (libtls) support * Fixed Secure Channel build on VS 2010 * OpenSSL now supports SNI (all others already do) * Additional features for Application Performance Monitoring: * mongoc_topology_description_has_writable_server * mongoc_topology_description_has_readable_server * New functions accept flexible options as a BSON document: * mongoc_collection_find_with_opts * mongoc_client_read_command_with_opts * mongoc_client_write_command_with_opts * mongoc_client_read_write_command_with_opts * mongoc_database_read_command_with_opts * mongoc_database_write_command_with_opts * mongoc_database_read_write_command_with_opts * mongoc_collection_read_command_with_opts * mongoc_collection_write_command_with_opts * mongoc_collection_read_write_command_with_opts * mongoc_gridfs_find_with_opts * mongoc_gridfs_find_one_with_opts * mongoc_collection_find is now deprecated in favor of mongoc_collection_find_with_opts. * New helper function to include read concern in one of the above function's options parameter: mongoc_read_concern_append. * mongoc_client_command no longer applies the client's read preference and read concern by default. Same change for mongoc_database_command and mongoc_collection_command. * mongoc_collection_count_with_opts now applies the collection's read preference if no read preference is provided * mongoc_collection_create_index and mongoc_collection_drop_index now apply the collection's write concern. * connectTimeoutMS timer now begins after DNS resolution, and resets for each interface attempted (e.g., if the driver first tries IPv6, then IPv4). * New error code MONGOC_ERROR_DUPLICATE_KEY. * mongoc_collection_find no longer treats the "filter" key specially in queries - querying for a document with a key named "filter" is the same now as any other key. * The server description parameter to the following functions is "const": * mongoc_server_description_host * mongoc_server_description_id * mongoc_server_description_ismaster * mongoc_server_description_round_trip_time * mongoc_server_description_type * Exported symbols are no longer declared in separate export files. This could break ABI with applications using clang, which previously exported symbols from the internal private ABI. * mongoc no longer crashes when multi roundtrip bulk operation fails. * Added support for the new readConcernLevel "linearizable". * Clients now check for misformatted "readPreferenceTags" in URI. * New CMake option ENABLE_TRACING allows debug output, which before had only been available with "configure --enable-tracing". * Bugfix: "PossiblePrimary"-type replicas could be selected for reads * Bugfixes: The random number generator used to select servers is now properly seeded, and secondary queries are now properly distributed according to localThresholdMS, not just to the lowest-latency secondary. * mongoc_collection_insert, mongoc_collection_update, mongoc_collection_remove consistently use domain MONGOC_ERROR_BSON, code MONGOC_ERROR_BSON_INVALID if passed oversized BSON, and MONGOC_ERROR_COLLECTION for other errors. mongoc_bulk_operation_execute continues to use MONGOC_ERROR_COMMAND for all errors. * If mongoc_client_pool_t fails to start its scanner thread in the background, it logs and aborts instead of silently continuing, then failing to connect. * The driver now updates its view of the whole topology with information from each new connection handshake. * mongoc_client_set_apm_callbacks can be used repeatedly to change or clear the list of monitoring callbacks. * Improved error reporting when the driver fails to reach the server. Deprecations: * mongoc_collection_find is deprecated for mongoc_collection_find_with_opts. Removed configure flags: * --enable-experimental has been removed. All previously experimental features are now always on. * The configure option "--enable-hardening" had had no effect. It is removed in favor of system-wide compiler configuration. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Fiona Rowan * Ian Boros * Remi Collet * Brian McCarthy * Jeroen Ooms * J. Rassi * Christoph Schwarz * Alexey Vorobeyev Peace, A. Jesse Jiryu Davis mongo-c-driver 1.4.2 ==================== It is my pleasure to announce mongo-c-driver 1.4.2. This release fixes bugs in "minPoolSize" logic, see CDRIVER-1558 for details. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.4.1 ==================== It is my pleasure to announce mongo-c-driver 1.4.1. This is a bugfix release: * mongoc_client_get_server_descriptions could return a list including NULLs * Tailable cursors on MongoDB 3.2 only worked with MONGOC_QUERY_AWAIT_DATA * Spurious warnings with MONGOC_DISABLE_SHM Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.4.0 ==================== It is my pleasure to announce the release of mongo-c-driver 1.4.0. TLS --- The driver can now use the native TLS and crypto functions included in macOS and Windows. OpenSSL is no longer required for TLS or authentication on Mac or Windows. By default, OpenSSL is used if available, the default will switch in version 2.0 to prefer native TLS. For native TLS on Mac: ./configure --enable-ssl=darwin For Windows: cmake "-DENABLE_SSL=WINDOWS" -G "Visual Studio 10 Win64" "-DCMAKE_INSTALL_PREFIX=C:\mongo-c-driver" All of the TLS implementations now load the native default certificate store, with OpenSSL on Windows falling back on the Windows native certificate store if no other can be found. The "ca_dir" field on mongoc_ssl_opt_t is only supported by OpenSSL. All other fields, including "pem_file", are supported by all implementations. A new field, "allow_invalid_hostname", has been added to mongoc_ssl_opt_t and is preferred over the existing "allow_invalid_certificate" to disable hostname verification. The driver now supports the latest OpenSSL 1.1 in addition to past versions. Application Performance Monitoring ---------------------------------- The driver implements the MongoDB Command Monitoring Spec. Applications can record the duration and other details of every operation the driver performs on the server. See "Introduction to Application Performance Monitoring" in the docs. Error API --------- New functions mongoc_client_set_error_api and mongoc_client_pool_set_error_api allow applications to distinguish client and server errors. See the "Error Reporting" doc. Unacknowledged Write Results ---------------------------- Unacknowledged writes (writes whose mongoc_write_concern_t "w" value is zero) now reply with an empty document instead of one with nInserted: 0, nUpdated: 0, and so on. Command functions now ignore the read preferences set on a client, database, or collection. Instead, they use the mongoc_read_prefs_t passed in explicitly, or default to "primary". This change was made to bring them in line with the Server Selection Spec. These are the affected functions: * mongoc_client_command * mongoc_client_command_simple * mongoc_database_command * mongoc_database_command_simple * mongoc_collection_command * mongoc_collection_command_simple On the other hand, the following command-specific helper functions now use the collection's read preference: * mongoc_collection_count * mongoc_collection_stats New functions to send maxTimeMS or any arbitrary options with findAndModify: * mongoc_find_and_modify_opts_set_max_time_ms * mongoc_find_and_modify_opts_append New function to include a write concern with a generic command function like mongoc_client_command_simple: * mongoc_write_concern_append Public API For Higher-Level Drivers ----------------------------------- New functions support language drivers (specifically the PHP and HHVM drivers) using only the libmongoc public API: * mongoc_bulk_operation_get_hint * mongoc_client_command_simple_with_server_id * mongoc_client_get_server_description * mongoc_client_get_server_description_by_id * mongoc_client_get_server_descriptions * mongoc_client_select_server * mongoc_cursor_get_limit * mongoc_cursor_new_from_command_reply * mongoc_cursor_set_hint * mongoc_cursor_set_limit * mongoc_log_trace_disable * mongoc_log_trace_enable * mongoc_server_description_ismaster * mongoc_server_description_round_trip_time * mongoc_server_description_type * mongoc_server_descriptions_destroy_all * mongoc_uri_get_option_as_bool * mongoc_uri_get_option_as_int32 * mongoc_uri_get_option_as_utf8 * mongoc_uri_option_is_bool * mongoc_uri_option_is_int32 * mongoc_uri_option_is_utf8 * mongoc_uri_set_auth_source * mongoc_uri_set_database * mongoc_uri_set_option_as_bool * mongoc_uri_set_option_as_int32 * mongoc_uri_set_option_as_utf8 * mongoc_uri_set_password * mongoc_uri_set_read_concern * mongoc_uri_set_read_prefs_t * mongoc_uri_set_username * mongoc_uri_set_write_concern * mongoc_write_concern_is_acknowledged * mongoc_write_concern_is_valid * mongoc_write_concern_journal_is_set Now that these public APIs are available, the PHP drivers no longer define the MONGOC_I_AM_A_DRIVER preprocessor symbol to access private APIs. The symbol is removed from C Driver headers, and libmongoc-priv.so is no longer installed. Other Features -------------- * New connection string option "localThresholdMS". * zSeries and POWER8 platform support. * Performance enhancements, reduce allocation and copying in command code. * All man page names now begin with "mongoc_" to avoid install conflicts. * New function mongoc_gridfs_file_set_id. Deprecations ------------ Automatically calling mongoc_init and mongoc_cleanup is a GCC-specific feature that is now deprecated, and will be removed in version 2. The driver should be built with: ./configure --disable-automatic-init-and-cleanup Or: cmake "-DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF" -G "Visual Studio 10 Win64" "-DCMAKE_INSTALL_PREFIX=C:\mongo-c-driver" In this configuration, applications must explicitly init and cleanup libmongoc. Deprecated functions: * mongoc_write_concern_get_fsync * mongoc_write_concern_set_fsync Notable Bug Fixes ----------------- * Logic bugs using tag sets to select replica set members with complex configs * mongoc_client_get_database_names no longer filters out a replica set member's "local" database. * mongoc_client_get_gridfs now ensures the proper indexes on the files and chunks collections. * SecondaryPreferred fails if primary matches tags but secondaries don't. * mongoc_collection_find_and_modify_with_opts can return true on writeConcernError. * mongoc_collection_validate doesn't always init "reply". * The strings referred to by mongoc_ssl_opt_t, like pem_file and ca_file, are now copied into the client or client pool by mongoc_client_set_ssl_opts or mongoc_client_pool_set_ssl_opts, and need not be kept valid afterward. * mongoc_collection_count_with_opts ignored flags and read_prefs. * minPoolSize of 0 should mean "no minimum". * mongoc_database_create_collection should always use the primary. * The GSSAPI properties SERVICE_NAME and CANONICALIZE_HOST_NAME are now properly parsed from the URI, see the "Authentication" doc for details. * Comprehensive compatibility with various C standards and compilers. Acknowledgements ---------------- Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Ian Boros * Fiona Rowan * Jeremy Mikola * Christoph Schwarz * Mike Lloyd * Remi Collet * Jean-Bernard Jansen * David Hatch * Derick Rethans * Brian Samek Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.5 ==================== It is my pleasure to announce mongo-c-driver 1.3.5. This release fixes a crash in mongoc_cleanup when an allocator had been set with bson_mem_set_vtable, and introduces a configure option MONGOC_NO_AUTOMATIC_GLOBALS which prevents code built with GCC from automatically calling mongoc_init and mongoc_cleanup when your code does not. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.4 ==================== It is my pleasure to announce the MongoDB C Driver 1.3.4. This release fixes a security vulnerability: when a mongoc_client_t uses SSL and is disconnected, it failed to re-verify the server certificate after reconnecting. This flaw affects single clients, not pooled ones. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.3 ==================== It is my pleasure to announce MongoDB C Driver 1.3.3. This fixes a bug where a slightly-oversized bulk write operation was not split into batches; instead, it was sent whole to the server, which rejected it. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.2 ==================== It is my pleasure to announce MongoDB C Driver 1.3.2. This is a bugfix release: * A socket is properly discarded after a network error from a command. * mongoc_database_get_collection now copies the database's read preferences, read concern, and write concern, instead of copying the client's. * mongoc_cursor_t's private struct now allows a negative limit. Thanks to everyone who contributed to this release. * A. Jesse Jiryu Davis * Jeremy Mikola * Hannes Magnusson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.1 ==================== It is my pleasure to announce MongoDB C Driver 1.3.1. This is a bugfix release: * mongoc_client_get_gridfs now copies the client's read preferences, read concern, and write concern to the newly created mongoc_gridfs_t. Before this fix, GridFS operations were always executed with the default config: data was read from the primary, with the read concern level "local", and written with write concern "acknowledged". Now, if you have configured any of these options on the mongoc_client_t, they are respected by the mongoc_gridfs_t. * CMakeLists.txt now includes and installs the pkg-config files. Thanks to everyone who contributed to this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Christopher Wang * Jean-Bernard Jansen * Jeremy Mikola * Jeroen Ooms Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.0 ==================== It is my pleasure to announce to you the release of the MongoDB C Driver 1.3.0. Changes since the release candidate 1.3.0-rc0: * Fix a cursor bug introduced on big-endian platforms in 1.3.0-beta0. * Improve documentation for mongoc_host_list_t. * Move private mongoc_host_list_t functions from public header. * Refactor the build system to declare library version in one place. All new features and changes since the previous stable release, 1.2.1: * If the driver is compiled without SSL support but a URI with "ssl=true" is passed to mongoc_client_new, mongoc_client_new_from_uri, or mongoc_client_pool_new, the function logs an error and returns NULL. Before, the driver would attempt a non-SSL connection. * mongoc_collection_find_and_modify will now apply the mongoc_collection_t's write_concern_t when talking to MongoDB 3.2. * Support for MongoDB 3.2's "readConcern" feature for queries, counts, and aggregations. The option "readConcernLevel" is now accepted in the MongoDB URI. New struct mongoc_read_concern_t, and functions operating on it: - mongoc_client_get_read_concern - mongoc_client_set_read_concern - mongoc_database_get_read_concern - mongoc_database_set_read_concern - mongoc_collection_get_read_concern - mongoc_collection_set_read_concern - mongoc_read_concern_copy - mongoc_read_concern_destroy - mongoc_read_concern_get_level - mongoc_read_concern_new - mongoc_read_concern_set_level - mongoc_uri_get_read_concern * Support for MongoDB 3.2's "bypassDocumentValidation" option for writes. * New struct mongoc_bulk_write_flags_t and related functions: - mongoc_bulk_operation_set_bypass_document_validation * New struct mongoc_find_and_modify_opts_t and related functions: - mongoc_find_and_modify_opts_new - mongoc_find_and_modify_opts_destroy - mongoc_find_and_modify_opts_set_sort - mongoc_find_and_modify_opts_set_update - mongoc_find_and_modify_opts_set_fields - mongoc_find_and_modify_opts_set_flags - mongoc_find_and_modify_opts_set_bypass_document_validation - mongoc_collection_find_and_modify_with_opts * New functions to copy database and collection handles: - mongoc_collection_copy - mongoc_database_copy * Support for MongoDB 3.2 wire protocol: use commands in place of OP_QUERY, OP_GETMORE, and OP_KILLCURSORS messages. * To explain a query plan with MongoDB 3.2, you must now call the "explain" command, instead of including the "$explain" key in a mongoc_collection_find query. See the mongoc_collection_find documentation page for details. * Configurable wait time on tailable cursors with MongoDB 3.2: - mongoc_cursor_get_max_await_time_ms - mongoc_cursor_set_max_await_time_ms * Use electionId to detect a stale replica set primary during a network split. * Disconnect from replica set members whose "me" field does not match the connection address. * The client side matching feature, mongoc_matcher_t and related functions, are deprecated and scheduled for removal in version 2.0. * New CMake options ENABLE_SSL, ENABLE_SASL, ENABLE_TESTS, and ENABLE_EXAMPLES. * Use constant-time comparison when verifying credentials. * Combine environment's CFLAGS with configure options when building. * Improved man page output and "whatis" entries. There are extensive bugfixes and improvements in GridFS since 1.2.1, including: * Handle seeking, reading, and writing past the end of a GridFS file. * If a GridFS chunk is missing, mongoc_gridfs_file_readv sets file->error to domain MONGOC_ERROR_GRIDFS and a new code MONGOC_ERROR_GRIDFS_CHUNK_MISSING. * Optimization for long seeks forward with mongoc_gridfs_file_seek. Other fixes since 1.2.1: * Memory leaks in mongoc_database_has_collection and mongoc_cursor_next. * Report writeConcern failures from findAndModify and from legacy writes. * Memory leak in mongoc_database_find_collections. * Set OP_QUERY's nToReturn from the provided limit. * Fix compiler warnings and errors, especially with Visual Studio 2015, GCC 4.8, and IBM XL C. * Bugs and typos in tutorial examples. Thanks to everyone who contributed to this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * Jose Sebastian Battig * Matt Cotter * Claudio Canella * alexeyvo * Christopher Wang * Flavio Medeiros * Iago Rubio * Jeremy Mikola * Victor Leschuk * Jason Carey Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.0-rc0 ======================== It is my pleasure to announce to you the first release candidate of MongoDB C driver 1.3.0. It includes additive ABI changes and bugfixes, and support for the upcoming MongoDB 3.2. It is compatible with MongoDB 2.4 and later. New features and changes since 1.3.0-beta0: * If the driver is compiled without SSL support but a URI with "ssl=true" is passed to mongoc_client_new, mongoc_client_new_from_uri, or mongoc_client_pool_new, the function logs an error and returns NULL. Before, the driver would attempt a non-SSL connection. * New functions to copy database and collection handles: - mongoc_collection_copy - mongoc_database_copy * If a GridFS chunk is missing, mongoc_gridfs_file_readv sets file->error to domain MONGOC_ERROR_GRIDFS and a new code MONGOC_ERROR_GRIDFS_CHUNK_MISSING. * Use electionId to detect a stale replica set primary during a network split. * Disconnect from replica set members whose "me" field does not match the connection address. * The client side matching feature, mongoc_matcher_t and related functions, are deprecated and scheduled for removal in version 2.0. * New CMake options ENABLE_SSL, ENABLE_SASL, ENABLE_TESTS, and ENABLE_EXAMPLES. * The build system is refactored to declare the current version and latest release in one place. Other fixes: * Memory leaks in mongoc_database_has_collection and mongoc_cursor_next. * Report writeConcern failures from findAndModify and from legacy writes. Thanks to everyone who contributed to this release candidate. * A. Jesse Jiryu Davis * Hannes Magnusson * Matt Cotter * Claudio Canella * Victor Leschuk * Flavio Medeiros * Christopher Wang Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.0-beta0 ========================== It is my pleasure to announce to you the beta of MongoDB C driver 1.3.0. This beta includes additive ABI changes and bugfixes, and support for the upcoming MongoDB 3.2. It is compatible with MongoDB 2.4 and later. New features and changes: * mongoc_collection_find_and_modify will now apply the mongoc_collection_t's write_concern_t when talking to MongoDB 3.2. * Support for MongoDB 3.2's "readConcern" feature for queries, counts, and aggregations. The option "readConcernLevel" is now accepted in the MongoDB URI. New struct mongoc_read_concern_t, and functions operating on it: - mongoc_client_get_read_concern - mongoc_client_set_read_concern - mongoc_database_get_read_concern - mongoc_database_set_read_concern - mongoc_collection_get_read_concern - mongoc_collection_set_read_concern - mongoc_read_concern_copy - mongoc_read_concern_destroy - mongoc_read_concern_get_level - mongoc_read_concern_new - mongoc_read_concern_set_level - mongoc_uri_get_read_concern * Support for MongoDB 3.2's "bypassDocumentValidation" option for writes. * New struct mongoc_bulk_write_flags_t and related functions: - mongoc_bulk_operation_set_bypass_document_validation * New struct mongoc_find_and_modify_opts_t and related functions: - mongoc_find_and_modify_opts_new - mongoc_find_and_modify_opts_destroy - mongoc_find_and_modify_opts_set_sort - mongoc_find_and_modify_opts_set_update - mongoc_find_and_modify_opts_set_fields - mongoc_find_and_modify_opts_set_flags - mongoc_find_and_modify_opts_set_bypass_document_validation - mongoc_collection_find_and_modify_with_opts * Configurable wait time on tailable cursors with MongoDB 3.2: - mongoc_cursor_get_max_await_time_ms - mongoc_cursor_set_max_await_time_ms * Support for MongoDB 3.2 wire protocol: use commands in place of OP_QUERY, OP_GETMORE, and OP_KILLCURSORS messages. * To explain a query plan with MongoDB 3.2, you must now call the "explain" command, instead of including the "$explain" key in a mongoc_collection_find query. See the mongoc_collection_find documentation page for details. * Use constant-time comparison when verifying credentials. * Combine environment's CFLAGS with configure options when building. * Improved man page output and "whatis" entries. Extensive bugfixes and improvements in GridFS, including: * Handle seeking, reading, and writing past the end of a GridFS file. * Optimization for long seeks forward with mongoc_gridfs_file_seek. Other fixes: * Memory leak in mongoc_database_find_collections. * Set OP_QUERY's nToReturn from the provided limit. * Fix compiler warnings and errors, especially with Visual Studio 2015, GCC 4.8, and IBM XL C. * Bugs and typos in tutorial examples Thanks to everyone who contributed to this beta release. * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * Jose Sebastian Battig * Jeremy Mikola * Iago Rubio * Matt Cotter * alexeyvo Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.2 ==================== It is my pleasure to announce to you the MongoDB C driver 1.2.2. This release fixes a rare bug where the driver can direct reads to hidden secondaries unintentionally. It also includes fixes and improvements to the build system. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.1 ==================== It is my pleasure to announce to you the MongoDB C driver 1.2.1. This release includes critical bugfixes for SSL connections with mongoc_client_pool_t, and for Unix domain socket connections. The documentation is updated for a change introduced in version 1.2.0: mongoc_client_set_ssl_opts and mongoc_client_pool_set_ssl_opts now configure the driver to require an SSL connection to the server, even if "ssl=true" is omitted from the MongoDB URI. Before, SSL options were ignored unless "ssl=true" was included in the URI. The build instructions are improved, including the steps to build with OpenSSL on OS X El Capitan. Build errors and warnings are fixed for clang in gnu99 mode and MinGW. Thanks to everyone who contributed to this version of libmongoc. * A. Jesse Jiryu Davis * Hannes Magnusson * Tamas Nagy Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.0 ==================== It is my pleasure to announce to you the MongoDB C driver 1.2.0. This is a stable release with additive ABI changes and bugfixes. It is compatible with MongoDB version 2.4 and later. The following notes summarize changes since the previous stable release, 1.1.11, including changes in the 1.2.0 betas and release candidate. This version rewrites mongoc_client_t's internals to match two important new specs for MongoDB drivers: the Server Discovery And Monitoring Spec and the Server Selection Spec. The rewritten client has many advantages: * All replica set members or mongos servers are discovered and periodically checked in parallel. The driver's performance is dramatically better and more predictable with multi-server deployments, or with a flaky network, or when some servers are slow or down. * Clients from the same mongoc_client_pool_t share a background thread that discovers and monitors all servers in parallel. * Unnecessary round trips for server checks and pings are eliminated. * Behavior is documented in the specs, and consistent with other drivers, even in complex or unusual scenarios. * The URI's "replicaSet" option is enforced: the driver now refuses to connect to a server unless it is a member of a replica set with the correct setName. * Many race conditions related to changing deployment conditions are fixed. To conform to the new specs, the client now accepts these options in the MongoDB URI; see the mongoc_uri_t documentation for details: * heartbeatFrequencyMS * serverSelectionTimeoutMS * serverSelectionTryOnce * socketCheckIntervalMS Other features: * All timeouts that can be configured in the URI now interpret 0 to mean "use the default value for this timeout". * The client's read preference can be configured in the URI with the new options "readPreference" and "readPreferenceTags"; see the mongoc_uri_t documentation. * The new mongoc_uri_get_read_prefs_t function retrieves both the read mode and tags from a mongoc_uri_t. * New accessors mongoc_gridfs_file_get_id, mongoc_client_get_default_database, and mongoc_bulk_operation_get_write_concern. * Debug tracing can be controlled at runtime with mongoc_log_trace_enable and mongoc_log_trace_disable. * Set mongoc_client_pool_t's size with mongoc_client_pool_min_size() and mongoc_client_pool_max_size(). Other changes: * Enable runtime asserts in release build. * The libbson submodule's URL now uses the recommended https://, not git:// * mongoc_client_kill_cursor is now deprecated and will be removed in 2.0. * The write concern "w=-1" is documented as obsolete. These notable bugs have been fixed since 1.1.11: * The driver now uses the server's maxWireVersion to avoid an error and extra round-trip when executing aggregations on MongoDB 2.4 and older. * Much improved reporting of network errors, unavailable servers, and authentication failure * Off-by-one error in mongoc_gridfs_file_seek with mode SEEK_END * The writeConcernErrors field of bulk results is properly formatted. * A cursor with a server "hint" sets slaveOkay and / or $readPreference. * Destroying an exhaust cursor must close its socket * "wtimeoutms" was ignored for write concerns besides "majority". * Bulk write operations might fail in mixed-version sharded clusters with some pre-2.6 mongos servers. * A variety of bugs and incorrect results in mongoc_bulk_operation_execute. * Numerous compiler warnings and build failures on various platforms. * Copious refinements to the documentation. Thanks to everyone who contributed to this version of libmongoc. * Jason Carey * Samantha Ritter * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * Jeremy Mikola * Remi Collet * Jose Sebastian Battig * Derick Rethans * Yuchen Xie * Manuel Schoenlaub * Sujan Dutta * Lloyd Zhou * rubicks * Pawel Szczurko * Yuval Hager Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.0-rc0 ======================== It is my pleasure to announce the release candidate of the MongoDB C driver 1.2.0. It includes features and bugfixes developed since 1.2.0-beta1. Notable bugs fixed: * Much improved reporting of network errors, unavailable servers, and authentication failure * Destroying an exhaust cursor must close its socket * Various bugs in server reconnection logic * mongoc_collection_aggregate returned invalid cursor after failure * Wrong error message after failed network write on Sparc * Missing JSON test files in release tarball Other changes: * Enable runtime asserts in release build. * mongoc_client_kill_cursor is now deprecated and will be removed in version 2.0. This release candidate also includes all bugfixes from 1.1.11. Version 1.2.0 final will be a stable release with additive ABI changes and bugfixes. It is compatible with MongoDB version 2.4 and later. Thanks to everyone who contributed to this version of libmongoc. * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * rubicks * Jose Sebastian Battig * Jason Carey * Remi Collet * Yuval Hager Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.0-beta1 ========================== It is my pleasure to announce the second beta release of the MongoDB C driver 1.2.0. It includes features and bugfixes developed since 1.2.0-beta. New features: * Set mongoc_client_pool_t's size with mongoc_client_pool_min_size() and mongoc_client_pool_max_size(). * The write concern "w=-1" is now documented as obsolete. * Abundant fixes and additions to the documentation, beyond those in the previous beta. Notable bugs fixed: * Crashes and races in several replica set scenarios. * The driver now uses the server's maxWireVersion to avoid an error and extra round-trip when executing aggregations on MongoDB 2.4 and older. * Fixed network error handling in multiple code paths. * connectTimeoutMS limits the time the driver can spend reconnecting to servers in single-threaded (non-pooled) mode with serverSelectionTryOnce. Version 1.2.0 final will be a stable release with additive ABI changes and bugfixes. It is compatible with MongoDB version 2.4 and later. Thanks to everyone who contributed to this version of libmongoc. * A. Jesse Jiryu Davis * Hannes Magnusson * Manuel Schoenlaub * Kyle Suarez * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.0-beta ========================= It is my pleasure to announce to you the first beta release of the MongoDB C driver 1.2.0. This release is a stable release with additive ABI changes and bugfixes. It is compatible with MongoDB version 2.4 and later. Version 1.2.0 rewrites mongoc_client_t's internals to match two important new specs for MongoDB drivers: the Server Discovery And Monitoring Spec and the Server Selection Spec. The rewritten client has many advantages: * All replica set members or mongoses are discovered and periodically checked in parallel. The driver's performance is dramatically better and more predictable with multi-server deployments, or with a flaky network, or when some servers are slow or down. * Clients from the same mongoc_client_pool_t share a background thread that discovers and monitors all servers in parallel. * Unnecessary round trips for server checks and pings are eliminated. * Behavior is documented in the specs, and consistent with other drivers, even in complex or unusual scenarios. * The URI's "replicaSet" option is enforced: the driver now refuses to connect to a server unless it is a member of a replica set with the right setName. * Many race conditions related to changing deployment conditions are fixed. To conform to the new specs, the client now accepts these options in the MongoDB URI; see the mongoc_uri_t documentation for details: * heartbeatFrequencyMS * serverSelectionTimeoutMS * serverSelectionTryOnce * socketCheckIntervalMS Other features: * All timeouts that can be configured in the URI now interpret 0 to mean "use the default value for this timeout". * The client's read preference can be configured in the URI with the new options "readPreference" and "readPreferenceTags", see the mongoc_uri_t documentation. * The new mongoc_uri_get_read_prefs_t function retrieves both the read mode and tags from a mongoc_uri_t. * New accessors mongoc_gridfs_file_get_id, mongoc_client_get_default_database, and mongoc_bulk_operation_get_write_concern. * Debug tracing can be controlled at runtime with mongoc_log_trace_enable and mongoc_log_trace_disable. Notable bugs fixed: * "wtimeoutms" was ignored for write concerns besides "majority". * Bulk write operations might fail in mixed-version sharded clusters with some pre-2.6 mongos servers. * Normal operations were logged during startup and could not be silenced. * A variety of bugs and incorrect results in mongoc_bulk_operation_execute. * Numerous compiler warnings and build failures on various platforms. * Copious refinements to the documentation. Thanks to everyone who contributed to this version of libmongoc. * A. Jesse Jiryu Davis * Sujan Dutta * Jason Carey * Hannes Magnusson * Jeremy Mikola * Derick Rethans * Samantha Ritter * Yuchen Xie * Lloyd Zhou Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.11 ===================== It is my pleasure to announce to you the MongoDB C driver 1.1.11. This is a patch release with bug fixes: * Undetected network errors when sending messages to the server * Off-by-one error in mongoc_gridfs_file_seek with mode SEEK_END * Memory leak parsing a URI that contains an invalid option * The libbson submodule's URL now uses the recommended https://, not git:// Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Hannes Magnusson * Jason Carey * Jose Sebastian Battig * rubicks Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.10 ===================== It is my pleasure to announce to you the MongoDB C driver 1.1.10. This is a patch release with bug fixes: * Occasional crash reconnecting to replica set. * Queries sent to recovering replica set members. * Memory leak when calling ismaster on replica set members. Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Daniil Zaitsev * Jason Carey * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.9 ==================== It is my pleasure to announce to you the MongoDB C driver 1.1.9. This release fixes a common crash in 1.1.8, which itself was introduced while fixing a rare crash in 1.1.7. For further details: https://jira.mongodb.org/browse/CDRIVER-721 https://jira.mongodb.org/browse/CDRIVER-695 Thanks to everyone who contributed to the development of this point release for libmongoc. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.8 ==================== UPDATE: 1.1.8 suffered a severe new bug so I removed the release from GitHub: https://jira.mongodb.org/browse/CDRIVER-721 This is a patch release with bug fixes: * Crash freeing client after a replica set auth error. * Compile error strict C89 mode. mongo-c-driver 1.1.7 ==================== It is my pleasure to announce to you the 1.1.7 release of the MongoDB C driver. This is a patch release with bug fixes: * Thread-safe use of Cyrus SASL library. * Experimental support for building with CMake and SASL. * Faster reconnection to replica set with some hosts down. * Crash iterating a cursor after reconnecting to a replica set. * Unchecked errors decoding invalid UTF-8 in MongoDB URIs. * Fix error reporting from mongoc_client_get_database_names. Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Jason Carey * Hannes Magnusson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.6 ==================== It is my pleasure to announce to you the 1.1.6 release of the MongoDB C driver. This is a patch release with performance enhancements and bug fixes: * mongoc_bulk_operation_execute now coalesces consecutive update operations into a single message to a MongoDB 2.6+ server, yielding huge performance gains. Same for remove operations. (Inserts were always coalesced.) * Large numbers of insert operations are now properly batched according to number of documents and total data size. * GSSAPI / Kerberos auth now works. * The driver no longer tries three times in vain to reconnect to a primary, so socketTimeoutMS and connectTimeoutMS now behave *closer* to what you expect for replica sets with down members. A full fix awaits 1.2.0. I snuck in a feature: * mongoc_matcher_t now supports basic subdocument and array matching Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Jason Carey * Kai Mast * Matt Cotter Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.5 ==================== It is my pleasure to announce to you the 1.1.5 release of the MongoDB C driver. This is a patch release with performance enhancements and bug fixes: * The fsync and j write concern flags now imply acknowledged writes * Prevent using fsync or j with conflicting w=0 write concern * Obey socket timeout consistently in TLS/SSL mode * Return an error promptly after a network hangup in TLS mode * Prevent crash using SSL in FIPS mode * Always return NULL from mongoc_database_get_collection_names on error * Fix version check for GCC 5 and future versions of Clang * Fix warnings and errors building on various platforms * Add configure flag to enable/disable shared memory performance counters * Minor docs improvements and fix links from C Driver docs to Libbson docs With this release, Libbson abandons the convention that odd-numbered patch versions indicate unstable releases. We switch to simple semantic versioning: 1.1.5 is a stable release with bug fixes since 1.1.4. During subsequent development the version will be "1.1.6-dev". Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Christian Hergert * Jason Carey * Jeremy Mikola * Jeroen Ooms * Hannes Magnusson Enjoy! -- A. Jesse Jiryu Davis mongo-c-driver 1.1.4 ==================== It is my pleasure to announce to you the 1.1.4 release of the MongoDB C driver. This release is a stable release with performance enhancements and bugfixes. Changes include: * Fixed client pool concurrency issues * Fixed some scenarios where replica sets would fail to reconnect on primary step down. * Improved write concern handling * Validate port number in URI * Various other fixes Thanks to everyone who contributed to the development of this point release for libmongoc. * Jason Carey * Andrew Clayton * A. Jesse Jiryu Davis * Jeremy Mikola Enjoy! -- Jason Carey mongo-c-driver 1.1.2 ==================== It is my pleasure to announce to you the 1.1.2 release of the MongoDB C driver. This release is a stable release with performance enhancements and bugfixes. Changes include: * Process connectTimeoutMS cast insensitively * Addition of missing trace macros * Improvement of internal error messages * Fix a segfault in OpenSSL cleanup routines * Fix for IPv6 support for replica sets * Coalesce small vectorized TLS writes * MinGW fixups * Fix for a memory leak in get_database_names() * Fixes for patching write concern through the bulk api * Fix to normalize hostnames in uri parsing * Fix for managing connections in the client pool * Various other fixes Thanks to everyone who contributed to the development of this point release for libmongoc. * Andrew Clayton * Denis Gladkikh * Hannes Magnusson * Jason Carey * Jeremy Mikola * mschoenlaub * Samantha Ritter * Tyler Brock Enjoy! -- Jason Carey mongo-c-driver 1.1.0 ==================== It is my pleasure to announce to you the 1.1.0 release of the MongoDB C driver. This release is a stable release with additive ABI changes and bugfixes. The below changes include some carried over from RC0. Changes include: * RC0 * ABI versioning for 1.1 versus 1.0 symbols * additional geo index options * authMechanismProperties in URI * fixes for OS X Yosemite * removal of replica set member limit * SCRAM-SHA-1 SASL mechanism * updated dependency on libbson 1.1 abi * validation for bulk insert * various memory leak fixes * Fixes to documentation typos * "How to Ask For Help" in the README * Removed dependency on sasl for PLAIN authentication * Use provided username, if available, for X.509 auth * Fixed WriteConcern error reporting for some writes * Check for closed sockets before attempting RPCs * Fixes for gridfs file seek * Fixes for mongoc_cursor_clone() * Fixes for unix domain socket support * Fixes for polling on win32 * Improved warnings on failure to connect * Addition of wired tiger options * Fixes for examples Additions to the ABI include: * support for extra option in count - mongoc_collection_count_with_opts * additional index options - mongoc_index_opt_geo_get_default - mongoc_index_opt_geo_init - mongoc_index_opt_wt_get_default - mongoc_index_opt_wt_init * rand interface to seed and verify the strong random number generation needed by some auth mechanisms - mongoc_rand_seed - mongoc_rand_add - mongoc_rand_status * URI additions to support more complicated auth credentials - mongoc_uri_get_credentials - mongoc_uri_get_mechanism_properties * Support for cursor returning metadata crud operations - mongoc_client_find_databases - mongoc_collection_find_indexes - mongoc_database_find_collections * Kill cursor support - mongoc_client_kill_cursor * Various get/setters on cursor - mongoc_cursor_get_batch_size - mongoc_cursor_get_id - mongoc_cursor_set_batch_size * More socket/stream options - mongoc_socket_check_closed - mongoc_socket_inet_ntop - mongoc_stream_check_closed - mongoc_stream_write Additional Notes: Existing complex index names may contain a zero instead of a type due to a bug in mongoc_collection_keys_to_index_string. As a result those indexes may be hard to drop from the driver as they have a name you would not expect. Thanks to everyone who contributed to the development of this point release for libmongoc. * Adam Midvidy * aherlihy * alexeyvo * Christian Hergert * Hannes Magnusson * Jason Carey * Jérôme Lebel * Jesse Jiryu Davis * lloydzhou * Mark Benevenuto * Paul Melnikow * Samantha Ritter * Shraya Ramani * Spencer Jackson * Tyler Brock Enjoy! -- Jason Carey mongo-c-driver 1.1.0-rc0 ======================== It is my pleasure to announce to you the 1.1.0-rc0 release of the MongoDB C driver. This release is a release candidate with additive ABI changes and bugfixes. Changes include: * ABI versioning for 1.1 versus 1.0 symbols * additional geo index options * authMechanismProperties in URI * fixes for OS X Yosemite * removal of replica set member limit * SCRAM-SHA-1 SASL mechanism * updated dependency on libbson 1.1 abi * validation for bulk insert * various memory leak fixes Additions to the ABI include: * support for extra option in count - mongoc_collection_count_with_opts * extra index and collection info - mongoc_collection_get_index_info - mongoc_database_get_collection_info * additional geo options - mongoc_index_opt_geo_get_default - mongoc_index_opt_geo_init * rand interface to seed and verify the strong random number generation needed by some auth mechanisms - mongoc_rand_seed - mongoc_rand_add - mongoc_rand_status * URI additions to support more complicated auth credentials - mongoc_uri_get_credentials - mongoc_uri_get_mechanism_properties Additional Notes: Existing complex index names may contain a zero instead of a type due to a bug in mongoc_collection_keys_to_index_string. As a result those indexes may be hard to drop from the driver as they have a name you would not expect. Thanks to everyone who contributed to the development of this point release for libmongoc. * Adam Midvidy * aherlihy * alexeyvo * Christian Hergert * Jason Carey * Jérôme Lebel * Samantha Ritter * Spencer Jackson * Tyler Brock Enjoy! -- Jason Carey mongo-c-driver 1.0.2 ==================== It is my pleasure to announce to you the 1.0.2 release of the MongoDB C driver. This release is a minor point release with no ABI changes and mostly small bugfixes. Changes include: * A variety of fixes for read preference based node selection * Avoided inclusion of getLastError in 2.6 writeConcern * Correct handling of pass through params for collection_aggregate * Improved error reporting in socket connect * Public MONGOC_DEFAULT_CONNECTTIMEOUTMS Thanks to everyone who contributed to the development of this point release for libmongoc. * Adam Midvidy * Christian Hergert * Denis Gladkikh * Jason Carey * Jeremy Mikola * Jérôme Lebel * Tyler Brock * Wisdom Omuya -- Jason Carey mongo-c-driver 1.0.0 ==================== It is my very distinct pleasure to announce to you the 1.0 release of the MongoDB C driver! This is the culmination of just over a year of work and could not have been done without the help of our wonderful community. Thanks to everyone who contributed to the development of this driver! * Christian Hergert * Jason Carey * Gary Murakami * Christian Heckl * Frank Watson Song * Hannes Magnusson * Jérôme Lebel * Kyle Suarez * Maga Napanga * Michael Kuhn * Vincent Giersch * essentia44 * yuqing Happy Hacking! -- Christian Hergert mongo-c-driver 0.98.2 ===================== One final step before our journey to 1.0! This is a relatively small release, adding some features needed for drivers building on top of the C driver. A new libmongoc-priv.so library is installed that does not have symbols hidden. You can access private headers via the -private.h variants. This means you will need to recompile your project every time the library is changed (if you use those private headers, as they are subject to change). A special thanks to Hannes Magnusson for patches in this release. See `git shortlog 0.98.0..0.98.2` for a list of all the changes. -- Christian Hergert mongo-c-driver 0.98.0 ===================== Another step in the rapidly approaching path to 1.0! This release is primarily a bugfix release and stablization effort as we approach 1.0 of the MongoDB C driver. This release requires 0.98.0 of Libbson for improvements to the memory management system. You can now setup custom memory allocators at the start of the process. This is a RC release that with a few improvements will likely become 1.0. A special thanks to the following for patches in this cycle: * Kyle Suarez * yuqing See `git shortlog 0.96.4..0.98.0` for a list of all the changes. -- Christian Hergert mongo-c-driver 0.96.4 ===================== Another incremental feature update and bugfix release! In this release, you will find the following changes: * build/mci.sh script for automatically building Debian packages, RPMs, and Solaris packaging based on the host operating system. * Various libbson improvements, now depending on 0.8.4. * Alignment fixes for Solaris Studio C compiler via libbson. * Addition of mongoc_gridfs_remove_by_filename() for removing a file from gridfs by filename. * client command functions can now take a fully qualified namespace. * collections can now support names that indicate a command namespace. * Commands will no longer fail if they do not contain an "ok" field. * OP_QUERY will now set the slaveOk bit in the wire protocol if * readPreferences are set to non-PRIMARY. * Various documentation and build fixes. Thanks again to all the contributors, and happy hacking! mongo-c-driver 0.96.2 ===================== Hot on the heels of 0.96.0 we would like to present mongo-c-driver 0.96.2! This is primarily a bugfix release. Included in this release are: * Ensure batchSize is used in cursor GETMORE operations with `aggregate`. * Ensure enough buffer space is allocated for incoming RPC when buffering from a stream. * Require libbson 0.8.2 for more robust `bson_next_power_of_two()` when using `size_t` and BCON compilation fix with C++. * Handle cursor id's that are not 64-bit values in response from `aggregate` command. * Handle upsert on MongoDB < 2.6 when _id does not contain an `ObjectId`. * Use 100 for default batchSize in `aggregate` command. Happy Hacking! mongo-c-driver 0.96.0 ===================== It's that time again, time for another mongo-c-driver release! This release includes much new documentation, which can be found at https://www.mongodb.com/docs/ecosystem/drivers/c/. Additionally, this release improves support for various exotic systems. Solaris 10 is supported much better on SPARC and x86_64 based systems. Some workarounds for mixed-mode sharded-clusters have been added to improve resiliency when rolling upgrades are performed. Build improvements have been added to help us detect SASL and SSL implementations on platforms that do not support pkg-config. This should simplify building for some of you. We've added some more logging to SASL authentication to help debug authentication failures. A bug causing an abort() when SSL is used and a server is down has been fixed. We've renamed various _delete() functions to _remove() to provide consistency with other MongoDB drivers. You can now specify SSL options for client pools. -D_REENTRANT is always defined now on Solaris to help with errno detection. This may not have been done before if using a non-GCC platform with pthreads. A bug was fixed where timeouts could have been 1000x longer than expected due to failure to convert from microseconds to milliseconds. A bug was fixed with authentication in sharded cluster and replica set scenarios. Happy Hacking! mongo-c-driver 0.94.2 ===================== Hot on the heels of 0.94.0 is 0.94.2, a bugfix release. A bug has been fixed when using TLS streams and large result sets. In this release, we added support for Sun's C compiler (Sun Pro C) on Solaris. This allows for builds on Solaris 10 with SPARC using the native toolchain. This release contains a couple of fixes in libbson as well. Keep those bug reports coming, and as always, Happy Hacking! mongo-c-driver 0.94.0 ===================== The mongo-c-driver team is proud to announce the release of 0.94.0. This release is a followup to the previous release adding more features to be found in MongoDB 2.6. You will find some new API's, bug fixes, and more documentation. Under the hood, 0.94.0 uses the new write-commands as part of MongoDB 2.6 when it discovers it is communicating with a MongoDB server. There is now a bulk operation API (See `mongoc-bulk-operation.h`). Helpers for common server commands have been added. You can find most of them `mongoc-collection.h`. To simply using mongo-c-driver from Windows, we've included pre-built binaries on the release page. Thanks to all of the contributors this release! Happy Hacking! mongo-c-driver 0.92.0 ===================== The mongo-c-driver team is proud to announce the release of 0.92.0. This release is the culimation of a few months work and has many bug fixes and new features. It contains over 350 commits from 4 authors since the 0.90.0 release. The mongo-c-driver release tarballs now contain a bundled copy of libbson. If you do not have libbson installed or the system installed libbson is too old, the bundled copy of libbson will be installed. * Revamped build system to simplify installation. * Windows Vista and newer support. * Various GridFS fixes and features. * Kerberos support via cyrus-sasl. * Various SSL improvements. * Support for Solaris 11, FreeBSD 10, RHEL 5+, and SmartOS. * A new client side expression matcher to perform basic query processing. It can perform queries such as {'field': {'$in': [1,2,3]}}. See mongoc_matcher_t for more information. * A new socket abstraction for platform independent network sockets. * A new mongoc-dump example for how to write a simple mongodump replacement. * Counters can use rdtscp instruction on Core iX systems for very fast counters. * configure has new options. If in doubt, the defaults are sensible. * --enable-coverage=yes|no * --enable-debug=yes|no * --enable-debug-symbols=yes|no * --enable-hardening=yes|no * --enable-optimizations=yes|no * --enable-ssl=yes|no * --enable-sasl=yes|no * --enable-tracing=yes|no * --with-libbson=auto|system|bundled mongo-c-driver 0.92.0 requires libbson 0.6.4 or newer. Happy Hacking! Libmongoc 0.90.0 ================ This is the initial release of the new Libmongoc. We chose 0.90.0 for the release version to differentiate ourselves from the, now legacy, version of libmongoc. We will rapidly work towards reaching an API/ABI stable library fit for a 1.0.0 release. Libmongoc is Apache licensed so it can be embedded in a multitude of scenarios. The API of 0.90.0 is completely different from the previous versions. We think this allowed us to create a high-quality library that you will enjoy using in your applications. Many outstanding bugs were closed in the process of creating Libbson 0.90.0. So if you had a pet issue, please take a look to see if it was resolved as part of this effort! Thanks, and enjoy developing your applications with libmongoc! mongo-c-driver-1.26.0/README.rst000066400000000000000000000077351456567454500161600ustar00rootroot00000000000000============== mongo-c-driver ============== About ===== mongo-c-driver is a project that includes two libraries: - libmongoc, a client library written in C for MongoDB. - libbson, a library providing useful routines related to building, parsing, and iterating BSON documents. If libmongoc is not needed, it is possible to build and install only libbson. Documentation / Support / Feedback ================================== The documentation is available at `MongoDB C Driver Docs `_ and https://www.mongoc.org. For issues with, questions about, or feedback for libmongoc, please look into our `support channels `_. Please do not email any of the libmongoc developers directly with issues or questions - you're more likely to get an answer on the `MongoDB Community Forums`_ or `StackOverflow `_. Bugs / Feature Requests ======================= Think you’ve found a bug? Want to see a new feature in libmongoc? Please open a case in our issue management tool, JIRA: - `Create an account and login `_. - Navigate to `the CDRIVER project `_. - Click **Create Issue** - Please provide as much information as possible about the issue type and how to reproduce it. Bug reports in JIRA for all driver projects (i.e. CDRIVER, CSHARP, JAVA) and the Core Server (i.e. SERVER) project are **public**. How To Ask For Help ------------------- If you are having difficulty building the driver after reading the below instructions, please post on the `MongoDB Community Forums`_ to ask for help. Please include in your post all of the following information: - The version of the driver you are trying to build (branch or tag). - Examples: ``r1.17`` (branch), ``1.9.5`` (tag) - Host OS, version, and architecture. - Examples: Windows 10 64-bit x86, Ubuntu 16.04 64-bit x86, macOS 11.0 - C Compiler and version. - Examples: GCC 7.3.0, Visual Studio Community 2017, clang 3.9, XCode 9.3 - Run CMake with ``--log-level=debug`` and ``--log-context`` for more verbose output. - The output of any ``cmake``, ``make``, or other commands executed during the build. - The text of the error you encountered. Failure to include the relevant information will delay a useful response. Here is a made-up example of a help request that provides the relevant information: Hello, I'm trying to build the C driver with Kerberos support, from mongo-c-driver-1.9.5.tar.gz. I'm on Ubuntu 16.04, 64-bit Intel, with gcc 5.4.0. I run CMake like:: $ cmake . -- The C compiler identification is ;GNU 5.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works ... SNIPPED OUTPUT, but when you ask for help, include full output without any omissions ... -- Searching for libsasl2 -- Not found (specify -DCMAKE_LIBRARY_PATH=/path/to/sasl/lib for SASL support) CMake Error at CMakeLists.txt:10 (_message): SASL not found Can you tell me what I need to install? Thanks! .. _MongoDB Community Forums: https://community.mongodb.com/tags/c/drivers-odms-connectors/7/c-driver Security Vulnerabilities ------------------------ If you’ve identified a security vulnerability in a driver or any other MongoDB project, please report it according to the `instructions here `_. Installation ============ Detailed installation instructions are in the manual: https://www.mongoc.org/libmongoc/current/installing.html Resources ============ * `Getting Started Tutorial `_. * `MongoDB C Driver Examples `_. * Tutorials, videos, and code examples using the MongoDB C Driver can also be found in the `MongoDB Developer Center `_.mongo-c-driver-1.26.0/THIRD_PARTY_NOTICES000066400000000000000000000170361456567454500174240ustar00rootroot00000000000000The MongoDB C Driver uses third-party code distributed under different licenses. License notice for common-b64.c ------------------------------------------------------------------------------- ISC License Copyright: 1996, 1998 Internet Software Consortium 1995 International Business Machines, Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Portions Copyright (c) 1995 by International Business Machines, Inc. International Business Machines, Inc. (hereinafter called IBM) grants permission under its copyrights to use, copy, modify, and distribute this Software with or without fee, provided that the above copyright notice and all paragraphs of this notice appear in all copies, and that the name of IBM not be used in connection with the marketing of any product incorporating the Software or modifications thereof, without specific, written prior permission. To the extent it has a right to do so, IBM grants an immunity from suit under its patents, if any, for the use, sale or manufacture of products to the extent that such products are used for performing Domain Name System dynamic updates in TCP/IP networks by means of the Software. No immunity is granted for any product per se or for any other function of any product. THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. License notice for mongoc.css_t ------------------------------------------------------------------------------- MIT License Portions Copyright 2013 by Ignacy Sokolowski. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. License notice for zlib ------------------------------------------------------------------------------- /* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.11, January 15th, 2017 Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ License notice for common-md5.c ------------------------------------------------------------------------------- ZLib License Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com License notice for utf8proc ------------------------------------------------------------------------------- **utf8proc** is a software package originally developed by Jan Behrens and the rest of the Public Software Group, who deserve nearly all of the credit for this library, that is now maintained by the Julia-language developers. Like the original utf8proc, whose copyright and license statements are reproduced below, all new work on the utf8proc library is licensed under the [MIT "expat" license](http://opensource.org/licenses/MIT): *Copyright © 2014-2021 by Steven G. Johnson, Jiahao Chen, Tony Kelman, Jonas Fonseca, and other contributors listed in the git history.* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mongo-c-driver-1.26.0/VERSION_CURRENT000066400000000000000000000000071456567454500167240ustar00rootroot000000000000001.26.0 mongo-c-driver-1.26.0/build/000077500000000000000000000000001456567454500155545ustar00rootroot00000000000000mongo-c-driver-1.26.0/build/.gitignore000066400000000000000000000000101456567454500175330ustar00rootroot00000000000000version mongo-c-driver-1.26.0/build/bottle.py000066400000000000000000004504171456567454500174320ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """ Bottle is a fast and simple micro-framework for small web applications. It offers request dispatching (Routes) with url parameter support, templates, a built-in HTTP Server and adapters for many third party WSGI/HTTP-server and template engines - all in a single file and with no dependencies other than the Python Standard Library. Homepage and documentation: http://bottlepy.org/ Copyright (c) 2016, Marcel Hellkamp. License: MIT (see LICENSE for details) """ from __future__ import with_statement __author__ = 'Marcel Hellkamp' __version__ = '0.12.23' __license__ = 'MIT' # The gevent server adapter needs to patch some modules before they are imported # This is why we parse the commandline parameters here but handle them later if __name__ == '__main__': from optparse import OptionParser _cmd_parser = OptionParser(usage="usage: %prog [options] package.module:app") _opt = _cmd_parser.add_option _opt("--version", action="store_true", help="show version number.") _opt("-b", "--bind", metavar="ADDRESS", help="bind socket to ADDRESS.") _opt("-s", "--server", default='wsgiref', help="use SERVER as backend.") _opt("-p", "--plugin", action="append", help="install additional plugin/s.") _opt("--debug", action="store_true", help="start server in debug mode.") _opt("--reload", action="store_true", help="auto-reload on file changes.") _cmd_options, _cmd_args = _cmd_parser.parse_args() if _cmd_options.server and _cmd_options.server.startswith('gevent'): import gevent.monkey; gevent.monkey.patch_all() import base64, cgi, email.utils, functools, hmac, itertools, mimetypes,\ os, re, subprocess, sys, tempfile, threading, time, warnings, hashlib from datetime import date as datedate, datetime, timedelta from tempfile import TemporaryFile from traceback import format_exc, print_exc from unicodedata import normalize try: from simplejson import dumps as json_dumps, loads as json_lds except ImportError: # pragma: no cover try: from json import dumps as json_dumps, loads as json_lds except ImportError: try: from django.utils.simplejson import dumps as json_dumps, loads as json_lds except ImportError: def json_dumps(data): raise ImportError("JSON support requires Python 2.6 or simplejson.") json_lds = json_dumps # We now try to fix 2.5/2.6/3.1/3.2 incompatibilities. # It ain't pretty but it works... Sorry for the mess. py = sys.version_info py3k = py >= (3, 0, 0) py25 = py < (2, 6, 0) py31 = (3, 1, 0) <= py < (3, 2, 0) # Workaround for the missing "as" keyword in py3k. def _e(): return sys.exc_info()[1] # Workaround for the "print is a keyword/function" Python 2/3 dilemma # and a fallback for mod_wsgi (resticts stdout/err attribute access) try: _stdout, _stderr = sys.stdout.write, sys.stderr.write except IOError: _stdout = lambda x: sys.stdout.write(x) _stderr = lambda x: sys.stderr.write(x) # Lots of stdlib and builtin differences. if py3k: import http.client as httplib import _thread as thread from urllib.parse import urljoin, SplitResult as UrlSplitResult from urllib.parse import urlencode, quote as urlquote, unquote as urlunquote urlunquote = functools.partial(urlunquote, encoding='latin1') from http.cookies import SimpleCookie if py >= (3, 3, 0): from collections.abc import MutableMapping as DictMixin from types import ModuleType as new_module else: from collections import MutableMapping as DictMixin from imp import new_module import pickle from io import BytesIO from configparser import ConfigParser from inspect import getfullargspec def getargspec(func): spec = getfullargspec(func) kwargs = makelist(spec[0]) + makelist(spec.kwonlyargs) return kwargs, spec[1], spec[2], spec[3] basestring = str unicode = str json_loads = lambda s: json_lds(touni(s)) callable = lambda x: hasattr(x, '__call__') imap = map def _raise(*a): raise a[0](a[1]).with_traceback(a[2]) else: # 2.x import httplib import thread from urlparse import urljoin, SplitResult as UrlSplitResult from urllib import urlencode, quote as urlquote, unquote as urlunquote from Cookie import SimpleCookie from itertools import imap import cPickle as pickle from imp import new_module from StringIO import StringIO as BytesIO from ConfigParser import SafeConfigParser as ConfigParser from inspect import getargspec if py25: msg = "Python 2.5 support may be dropped in future versions of Bottle." warnings.warn(msg, DeprecationWarning) from UserDict import DictMixin def next(it): return it.next() bytes = str else: # 2.6, 2.7 from collections import MutableMapping as DictMixin unicode = unicode json_loads = json_lds eval(compile('def _raise(*a): raise a[0], a[1], a[2]', '', 'exec')) # Some helpers for string/byte handling def tob(s, enc='utf8'): return s.encode(enc) if isinstance(s, unicode) else bytes(s) def touni(s, enc='utf8', err='strict'): return s.decode(enc, err) if isinstance(s, bytes) else unicode(s) tonat = touni if py3k else tob # 3.2 fixes cgi.FieldStorage to accept bytes (which makes a lot of sense). # 3.1 needs a workaround. if py31: from io import TextIOWrapper class NCTextIOWrapper(TextIOWrapper): def close(self): pass # Keep wrapped buffer open. # A bug in functools causes it to break if the wrapper is an instance method def update_wrapper(wrapper, wrapped, *a, **ka): try: functools.update_wrapper(wrapper, wrapped, *a, **ka) except AttributeError: pass # These helpers are used at module level and need to be defined first. # And yes, I know PEP-8, but sometimes a lower-case classname makes more sense. def depr(message, hard=False): warnings.warn(message, DeprecationWarning, stacklevel=3) def makelist(data): # This is just to handy if isinstance(data, (tuple, list, set, dict)): return list(data) elif data: return [data] else: return [] class DictProperty(object): ''' Property that maps to a key in a local dict-like attribute. ''' def __init__(self, attr, key=None, read_only=False): self.attr, self.key, self.read_only = attr, key, read_only def __call__(self, func): functools.update_wrapper(self, func, updated=[]) self.getter, self.key = func, self.key or func.__name__ return self def __get__(self, obj, cls): if obj is None: return self key, storage = self.key, getattr(obj, self.attr) if key not in storage: storage[key] = self.getter(obj) return storage[key] def __set__(self, obj, value): if self.read_only: raise AttributeError("Read-Only property.") getattr(obj, self.attr)[self.key] = value def __delete__(self, obj): if self.read_only: raise AttributeError("Read-Only property.") del getattr(obj, self.attr)[self.key] class cached_property(object): ''' A property that is only computed once per instance and then replaces itself with an ordinary attribute. Deleting the attribute resets the property. ''' def __init__(self, func): self.__doc__ = getattr(func, '__doc__') self.func = func def __get__(self, obj, cls): if obj is None: return self value = obj.__dict__[self.func.__name__] = self.func(obj) return value class lazy_attribute(object): ''' A property that caches itself to the class object. ''' def __init__(self, func): functools.update_wrapper(self, func, updated=[]) self.getter = func def __get__(self, obj, cls): value = self.getter(cls) setattr(cls, self.__name__, value) return value ############################################################################### # Exceptions and Events ######################################################## ############################################################################### class BottleException(Exception): """ A base class for exceptions used by bottle. """ pass ############################################################################### # Routing ###################################################################### ############################################################################### class RouteError(BottleException): """ This is a base class for all routing related exceptions """ class RouteReset(BottleException): """ If raised by a plugin or request handler, the route is reset and all plugins are re-applied. """ class RouterUnknownModeError(RouteError): pass class RouteSyntaxError(RouteError): """ The route parser found something not supported by this router. """ class RouteBuildError(RouteError): """ The route could not be built. """ def _re_flatten(p): ''' Turn all capturing groups in a regular expression pattern into non-capturing groups. ''' if '(' not in p: return p return re.sub(r'(\\*)(\(\?P<[^>]+>|\((?!\?))', lambda m: m.group(0) if len(m.group(1)) % 2 else m.group(1) + '(?:', p) class Router(object): ''' A Router is an ordered collection of route->target pairs. It is used to efficiently match WSGI requests against a number of routes and return the first target that satisfies the request. The target may be anything, usually a string, ID or callable object. A route consists of a path-rule and a HTTP method. The path-rule is either a static path (e.g. `/contact`) or a dynamic path that contains wildcards (e.g. `/wiki/`). The wildcard syntax and details on the matching order are described in docs:`routing`. ''' default_pattern = '[^/]+' default_filter = 're' #: The current CPython regexp implementation does not allow more #: than 99 matching groups per regular expression. _MAX_GROUPS_PER_PATTERN = 99 def __init__(self, strict=False): self.rules = [] # All rules in order self._groups = {} # index of regexes to find them in dyna_routes self.builder = {} # Data structure for the url builder self.static = {} # Search structure for static routes self.dyna_routes = {} self.dyna_regexes = {} # Search structure for dynamic routes #: If true, static routes are no longer checked first. self.strict_order = strict self.filters = { 're': lambda conf: (_re_flatten(conf or self.default_pattern), None, None), 'int': lambda conf: (r'-?\d+', int, lambda x: str(int(x))), 'float': lambda conf: (r'-?[\d.]+', float, lambda x: str(float(x))), 'path': lambda conf: (r'.+?', None, None)} def add_filter(self, name, func): ''' Add a filter. The provided function is called with the configuration string as parameter and must return a (regexp, to_python, to_url) tuple. The first element is a string, the last two are callables or None. ''' self.filters[name] = func rule_syntax = re.compile('(\\\\*)'\ '(?:(?::([a-zA-Z_][a-zA-Z_0-9]*)?()(?:#(.*?)#)?)'\ '|(?:<([a-zA-Z_][a-zA-Z_0-9]*)?(?::([a-zA-Z_]*)'\ '(?::((?:\\\\.|[^\\\\>]+)+)?)?)?>))') def _itertokens(self, rule): offset, prefix = 0, '' for match in self.rule_syntax.finditer(rule): prefix += rule[offset:match.start()] g = match.groups() if len(g[0])%2: # Escaped wildcard prefix += match.group(0)[len(g[0]):] offset = match.end() continue if prefix: yield prefix, None, None name, filtr, conf = g[4:7] if g[2] is None else g[1:4] yield name, filtr or 'default', conf or None offset, prefix = match.end(), '' if offset <= len(rule) or prefix: yield prefix+rule[offset:], None, None def add(self, rule, method, target, name=None): ''' Add a new rule or replace the target for an existing rule. ''' anons = 0 # Number of anonymous wildcards found keys = [] # Names of keys pattern = '' # Regular expression pattern with named groups filters = [] # Lists of wildcard input filters builder = [] # Data structure for the URL builder is_static = True for key, mode, conf in self._itertokens(rule): if mode: is_static = False if mode == 'default': mode = self.default_filter mask, in_filter, out_filter = self.filters[mode](conf) if not key: pattern += '(?:%s)' % mask key = 'anon%d' % anons anons += 1 else: pattern += '(?P<%s>%s)' % (key, mask) keys.append(key) if in_filter: filters.append((key, in_filter)) builder.append((key, out_filter or str)) elif key: pattern += re.escape(key) builder.append((None, key)) self.builder[rule] = builder if name: self.builder[name] = builder if is_static and not self.strict_order: self.static.setdefault(method, {}) self.static[method][self.build(rule)] = (target, None) return try: re_pattern = re.compile('^(%s)$' % pattern) re_match = re_pattern.match except re.error: raise RouteSyntaxError("Could not add Route: %s (%s)" % (rule, _e())) if filters: def getargs(path): url_args = re_match(path).groupdict() for name, wildcard_filter in filters: try: url_args[name] = wildcard_filter(url_args[name]) except ValueError: raise HTTPError(400, 'Path has wrong format.') return url_args elif re_pattern.groupindex: def getargs(path): return re_match(path).groupdict() else: getargs = None flatpat = _re_flatten(pattern) whole_rule = (rule, flatpat, target, getargs) if (flatpat, method) in self._groups: if DEBUG: msg = 'Route <%s %s> overwrites a previously defined route' warnings.warn(msg % (method, rule), RuntimeWarning) self.dyna_routes[method][self._groups[flatpat, method]] = whole_rule else: self.dyna_routes.setdefault(method, []).append(whole_rule) self._groups[flatpat, method] = len(self.dyna_routes[method]) - 1 self._compile(method) def _compile(self, method): all_rules = self.dyna_routes[method] comborules = self.dyna_regexes[method] = [] maxgroups = self._MAX_GROUPS_PER_PATTERN for x in range(0, len(all_rules), maxgroups): some = all_rules[x:x+maxgroups] combined = (flatpat for (_, flatpat, _, _) in some) combined = '|'.join('(^%s$)' % flatpat for flatpat in combined) combined = re.compile(combined).match rules = [(target, getargs) for (_, _, target, getargs) in some] comborules.append((combined, rules)) def build(self, _name, *anons, **query): ''' Build an URL by filling the wildcards in a rule. ''' builder = self.builder.get(_name) if not builder: raise RouteBuildError("No route with that name.", _name) try: for i, value in enumerate(anons): query['anon%d'%i] = value url = ''.join([f(query.pop(n)) if n else f for (n,f) in builder]) return url if not query else url+'?'+urlencode(query) except KeyError: raise RouteBuildError('Missing URL argument: %r' % _e().args[0]) def match(self, environ): ''' Return a (target, url_agrs) tuple or raise HTTPError(400/404/405). ''' verb = environ['REQUEST_METHOD'].upper() path = environ['PATH_INFO'] or '/' target = None if verb == 'HEAD': methods = ['PROXY', verb, 'GET', 'ANY'] else: methods = ['PROXY', verb, 'ANY'] for method in methods: if method in self.static and path in self.static[method]: target, getargs = self.static[method][path] return target, getargs(path) if getargs else {} elif method in self.dyna_regexes: for combined, rules in self.dyna_regexes[method]: match = combined(path) if match: target, getargs = rules[match.lastindex - 1] return target, getargs(path) if getargs else {} # No matching route found. Collect alternative methods for 405 response allowed = set([]) nocheck = set(methods) for method in set(self.static) - nocheck: if path in self.static[method]: allowed.add(method) for method in set(self.dyna_regexes) - allowed - nocheck: for combined, rules in self.dyna_regexes[method]: match = combined(path) if match: allowed.add(method) if allowed: allow_header = ",".join(sorted(allowed)) raise HTTPError(405, "Method not allowed.", Allow=allow_header) # No matching route and no alternative method found. We give up raise HTTPError(404, "Not found: " + repr(path)) class Route(object): ''' This class wraps a route callback along with route specific metadata and configuration and applies Plugins on demand. It is also responsible for turing an URL path rule into a regular expression usable by the Router. ''' def __init__(self, app, rule, method, callback, name=None, plugins=None, skiplist=None, **config): #: The application this route is installed to. self.app = app #: The path-rule string (e.g. ``/wiki/:page``). self.rule = rule #: The HTTP method as a string (e.g. ``GET``). self.method = method #: The original callback with no plugins applied. Useful for introspection. self.callback = callback #: The name of the route (if specified) or ``None``. self.name = name or None #: A list of route-specific plugins (see :meth:`Bottle.route`). self.plugins = plugins or [] #: A list of plugins to not apply to this route (see :meth:`Bottle.route`). self.skiplist = skiplist or [] #: Additional keyword arguments passed to the :meth:`Bottle.route` #: decorator are stored in this dictionary. Used for route-specific #: plugin configuration and meta-data. self.config = ConfigDict().load_dict(config, make_namespaces=True) def __call__(self, *a, **ka): depr("Some APIs changed to return Route() instances instead of"\ " callables. Make sure to use the Route.call method and not to"\ " call Route instances directly.") #0.12 return self.call(*a, **ka) @cached_property def call(self): ''' The route callback with all plugins applied. This property is created on demand and then cached to speed up subsequent requests.''' return self._make_callback() def reset(self): ''' Forget any cached values. The next time :attr:`call` is accessed, all plugins are re-applied. ''' self.__dict__.pop('call', None) def prepare(self): ''' Do all on-demand work immediately (useful for debugging).''' self.call @property def _context(self): depr('Switch to Plugin API v2 and access the Route object directly.') #0.12 return dict(rule=self.rule, method=self.method, callback=self.callback, name=self.name, app=self.app, config=self.config, apply=self.plugins, skip=self.skiplist) def all_plugins(self): ''' Yield all Plugins affecting this route. ''' unique = set() for p in reversed(self.app.plugins + self.plugins): if True in self.skiplist: break name = getattr(p, 'name', False) if name and (name in self.skiplist or name in unique): continue if p in self.skiplist or type(p) in self.skiplist: continue if name: unique.add(name) yield p def _make_callback(self): callback = self.callback for plugin in self.all_plugins(): try: if hasattr(plugin, 'apply'): api = getattr(plugin, 'api', 1) context = self if api > 1 else self._context callback = plugin.apply(callback, context) else: callback = plugin(callback) except RouteReset: # Try again with changed configuration. return self._make_callback() if not callback is self.callback: update_wrapper(callback, self.callback) return callback def get_undecorated_callback(self): ''' Return the callback. If the callback is a decorated function, try to recover the original function. ''' func = self.callback func = getattr(func, '__func__' if py3k else 'im_func', func) closure_attr = '__closure__' if py3k else 'func_closure' while hasattr(func, closure_attr) and getattr(func, closure_attr): func = getattr(func, closure_attr)[0].cell_contents return func def get_callback_args(self): ''' Return a list of argument names the callback (most likely) accepts as keyword arguments. If the callback is a decorated function, try to recover the original function before inspection. ''' return getargspec(self.get_undecorated_callback())[0] def get_config(self, key, default=None): ''' Lookup a config field and return its value, first checking the route.config, then route.app.config.''' for conf in (self.config, self.app.conifg): if key in conf: return conf[key] return default def __repr__(self): cb = self.get_undecorated_callback() return '<%s %r %r>' % (self.method, self.rule, cb) ############################################################################### # Application Object ########################################################### ############################################################################### class Bottle(object): """ Each Bottle object represents a single, distinct web application and consists of routes, callbacks, plugins, resources and configuration. Instances are callable WSGI applications. :param catchall: If true (default), handle all exceptions. Turn off to let debugging middleware handle exceptions. """ def __init__(self, catchall=True, autojson=True): #: A :class:`ConfigDict` for app specific configuration. self.config = ConfigDict() self.config._on_change = functools.partial(self.trigger_hook, 'config') self.config.meta_set('autojson', 'validate', bool) self.config.meta_set('catchall', 'validate', bool) self.config['catchall'] = catchall self.config['autojson'] = autojson #: A :class:`ResourceManager` for application files self.resources = ResourceManager() self.routes = [] # List of installed :class:`Route` instances. self.router = Router() # Maps requests to :class:`Route` instances. self.error_handler = {} # Core plugins self.plugins = [] # List of installed plugins. if self.config['autojson']: self.install(JSONPlugin()) self.install(TemplatePlugin()) #: If true, most exceptions are caught and returned as :exc:`HTTPError` catchall = DictProperty('config', 'catchall') __hook_names = 'before_request', 'after_request', 'app_reset', 'config' __hook_reversed = 'after_request' @cached_property def _hooks(self): return dict((name, []) for name in self.__hook_names) def add_hook(self, name, func): ''' Attach a callback to a hook. Three hooks are currently implemented: before_request Executed once before each request. The request context is available, but no routing has happened yet. after_request Executed once after each request regardless of its outcome. app_reset Called whenever :meth:`Bottle.reset` is called. ''' if name in self.__hook_reversed: self._hooks[name].insert(0, func) else: self._hooks[name].append(func) def remove_hook(self, name, func): ''' Remove a callback from a hook. ''' if name in self._hooks and func in self._hooks[name]: self._hooks[name].remove(func) return True def trigger_hook(self, __name, *args, **kwargs): ''' Trigger a hook and return a list of results. ''' return [hook(*args, **kwargs) for hook in self._hooks[__name][:]] def hook(self, name): """ Return a decorator that attaches a callback to a hook. See :meth:`add_hook` for details.""" def decorator(func): self.add_hook(name, func) return func return decorator def mount(self, prefix, app, **options): ''' Mount an application (:class:`Bottle` or plain WSGI) to a specific URL prefix. Example:: root_app.mount('/admin/', admin_app) :param prefix: path prefix or `mount-point`. If it ends in a slash, that slash is mandatory. :param app: an instance of :class:`Bottle` or a WSGI application. All other parameters are passed to the underlying :meth:`route` call. ''' if isinstance(app, basestring): depr('Parameter order of Bottle.mount() changed.', True) # 0.10 segments = [p for p in prefix.split('/') if p] if not segments: raise ValueError('Empty path prefix.') path_depth = len(segments) def mountpoint_wrapper(): try: request.path_shift(path_depth) rs = HTTPResponse([]) def start_response(status, headerlist, exc_info=None): if exc_info: try: _raise(*exc_info) finally: exc_info = None rs.status = status for name, value in headerlist: rs.add_header(name, value) return rs.body.append body = app(request.environ, start_response) if body and rs.body: body = itertools.chain(rs.body, body) rs.body = body or rs.body return rs finally: request.path_shift(-path_depth) options.setdefault('skip', True) options.setdefault('method', 'PROXY') options.setdefault('mountpoint', {'prefix': prefix, 'target': app}) options['callback'] = mountpoint_wrapper self.route('/%s/<:re:.*>' % '/'.join(segments), **options) if not prefix.endswith('/'): self.route('/' + '/'.join(segments), **options) def merge(self, routes): ''' Merge the routes of another :class:`Bottle` application or a list of :class:`Route` objects into this application. The routes keep their 'owner', meaning that the :data:`Route.app` attribute is not changed. ''' if isinstance(routes, Bottle): routes = routes.routes for route in routes: self.add_route(route) def install(self, plugin): ''' Add a plugin to the list of plugins and prepare it for being applied to all routes of this application. A plugin may be a simple decorator or an object that implements the :class:`Plugin` API. ''' if hasattr(plugin, 'setup'): plugin.setup(self) if not callable(plugin) and not hasattr(plugin, 'apply'): raise TypeError("Plugins must be callable or implement .apply()") self.plugins.append(plugin) self.reset() return plugin def uninstall(self, plugin): ''' Uninstall plugins. Pass an instance to remove a specific plugin, a type object to remove all plugins that match that type, a string to remove all plugins with a matching ``name`` attribute or ``True`` to remove all plugins. Return the list of removed plugins. ''' removed, remove = [], plugin for i, plugin in list(enumerate(self.plugins))[::-1]: if remove is True or remove is plugin or remove is type(plugin) \ or getattr(plugin, 'name', True) == remove: removed.append(plugin) del self.plugins[i] if hasattr(plugin, 'close'): plugin.close() if removed: self.reset() return removed def reset(self, route=None): ''' Reset all routes (force plugins to be re-applied) and clear all caches. If an ID or route object is given, only that specific route is affected. ''' if route is None: routes = self.routes elif isinstance(route, Route): routes = [route] else: routes = [self.routes[route]] for route in routes: route.reset() if DEBUG: for route in routes: route.prepare() self.trigger_hook('app_reset') def close(self): ''' Close the application and all installed plugins. ''' for plugin in self.plugins: if hasattr(plugin, 'close'): plugin.close() self.stopped = True def run(self, **kwargs): ''' Calls :func:`run` with the same parameters. ''' run(self, **kwargs) def match(self, environ): """ Search for a matching route and return a (:class:`Route` , urlargs) tuple. The second value is a dictionary with parameters extracted from the URL. Raise :exc:`HTTPError` (404/405) on a non-match.""" return self.router.match(environ) def get_url(self, routename, **kargs): """ Return a string that matches a named route """ scriptname = request.environ.get('SCRIPT_NAME', '').strip('/') + '/' location = self.router.build(routename, **kargs).lstrip('/') return urljoin(urljoin('/', scriptname), location) def add_route(self, route): ''' Add a route object, but do not change the :data:`Route.app` attribute.''' self.routes.append(route) self.router.add(route.rule, route.method, route, name=route.name) if DEBUG: route.prepare() def route(self, path=None, method='GET', callback=None, name=None, apply=None, skip=None, **config): """ A decorator to bind a function to a request URL. Example:: @app.route('/hello/:name') def hello(name): return 'Hello %s' % name The ``:name`` part is a wildcard. See :class:`Router` for syntax details. :param path: Request path or a list of paths to listen to. If no path is specified, it is automatically generated from the signature of the function. :param method: HTTP method (`GET`, `POST`, `PUT`, ...) or a list of methods to listen to. (default: `GET`) :param callback: An optional shortcut to avoid the decorator syntax. ``route(..., callback=func)`` equals ``route(...)(func)`` :param name: The name for this route. (default: None) :param apply: A decorator or plugin or a list of plugins. These are applied to the route callback in addition to installed plugins. :param skip: A list of plugins, plugin classes or names. Matching plugins are not installed to this route. ``True`` skips all. Any additional keyword arguments are stored as route-specific configuration and passed to plugins (see :meth:`Plugin.apply`). """ if callable(path): path, callback = None, path plugins = makelist(apply) skiplist = makelist(skip) def decorator(callback): # TODO: Documentation and tests if isinstance(callback, basestring): callback = load(callback) for rule in makelist(path) or yieldroutes(callback): for verb in makelist(method): verb = verb.upper() route = Route(self, rule, verb, callback, name=name, plugins=plugins, skiplist=skiplist, **config) self.add_route(route) return callback return decorator(callback) if callback else decorator def get(self, path=None, method='GET', **options): """ Equals :meth:`route`. """ return self.route(path, method, **options) def post(self, path=None, method='POST', **options): """ Equals :meth:`route` with a ``POST`` method parameter. """ return self.route(path, method, **options) def put(self, path=None, method='PUT', **options): """ Equals :meth:`route` with a ``PUT`` method parameter. """ return self.route(path, method, **options) def delete(self, path=None, method='DELETE', **options): """ Equals :meth:`route` with a ``DELETE`` method parameter. """ return self.route(path, method, **options) def error(self, code=500): """ Decorator: Register an output handler for a HTTP error code""" def wrapper(handler): self.error_handler[int(code)] = handler return handler return wrapper def default_error_handler(self, res): return tob(template(ERROR_PAGE_TEMPLATE, e=res)) def _handle(self, environ): try: environ['bottle.app'] = self request.bind(environ) response.bind() path = environ['bottle.raw_path'] = environ['PATH_INFO'] if py3k: try: environ['PATH_INFO'] = path.encode('latin1').decode('utf8') except UnicodeError: return HTTPError(400, 'Invalid path string. Expected UTF-8') try: self.trigger_hook('before_request') route, args = self.router.match(environ) environ['route.handle'] = route environ['bottle.route'] = route environ['route.url_args'] = args return route.call(**args) finally: self.trigger_hook('after_request') except HTTPResponse: return _e() except RouteReset: route.reset() return self._handle(environ) except (KeyboardInterrupt, SystemExit, MemoryError): raise except Exception: if not self.catchall: raise stacktrace = format_exc() environ['wsgi.errors'].write(stacktrace) return HTTPError(500, "Internal Server Error", _e(), stacktrace) def _cast(self, out, peek=None): """ Try to convert the parameter into something WSGI compatible and set correct HTTP headers when possible. Support: False, str, unicode, dict, HTTPResponse, HTTPError, file-like, iterable of strings and iterable of unicodes """ # Empty output is done here if not out: if 'Content-Length' not in response: response['Content-Length'] = 0 return [] # Join lists of byte or unicode strings. Mixed lists are NOT supported if isinstance(out, (tuple, list))\ and isinstance(out[0], (bytes, unicode)): out = out[0][0:0].join(out) # b'abc'[0:0] -> b'' # Encode unicode strings if isinstance(out, unicode): out = out.encode(response.charset) # Byte Strings are just returned if isinstance(out, bytes): if 'Content-Length' not in response: response['Content-Length'] = len(out) return [out] # HTTPError or HTTPException (recursive, because they may wrap anything) # TODO: Handle these explicitly in handle() or make them iterable. if isinstance(out, HTTPError): out.apply(response) out = self.error_handler.get(out.status_code, self.default_error_handler)(out) return self._cast(out) if isinstance(out, HTTPResponse): out.apply(response) return self._cast(out.body) # File-like objects. if hasattr(out, 'read'): if 'wsgi.file_wrapper' in request.environ: return request.environ['wsgi.file_wrapper'](out) elif hasattr(out, 'close') or not hasattr(out, '__iter__'): return WSGIFileWrapper(out) # Handle Iterables. We peek into them to detect their inner type. try: iout = iter(out) first = next(iout) while not first: first = next(iout) except StopIteration: return self._cast('') except HTTPResponse: first = _e() except (KeyboardInterrupt, SystemExit, MemoryError): raise except Exception: if not self.catchall: raise first = HTTPError(500, 'Unhandled exception', _e(), format_exc()) # These are the inner types allowed in iterator or generator objects. if isinstance(first, HTTPResponse): return self._cast(first) elif isinstance(first, bytes): new_iter = itertools.chain([first], iout) elif isinstance(first, unicode): encoder = lambda x: x.encode(response.charset) new_iter = imap(encoder, itertools.chain([first], iout)) else: msg = 'Unsupported response type: %s' % type(first) return self._cast(HTTPError(500, msg)) if hasattr(out, 'close'): new_iter = _closeiter(new_iter, out.close) return new_iter def wsgi(self, environ, start_response): """ The bottle WSGI-interface. """ try: out = self._cast(self._handle(environ)) # rfc2616 section 4.3 if response._status_code in (100, 101, 204, 304)\ or environ['REQUEST_METHOD'] == 'HEAD': if hasattr(out, 'close'): out.close() out = [] start_response(response._status_line, response.headerlist) return out except (KeyboardInterrupt, SystemExit, MemoryError): raise except Exception: if not self.catchall: raise err = '

    Critical error while processing request: %s

    ' \ % html_escape(environ.get('PATH_INFO', '/')) if DEBUG: err += '

    Error:

    \n
    \n%s\n
    \n' \ '

    Traceback:

    \n
    \n%s\n
    \n' \ % (html_escape(repr(_e())), html_escape(format_exc())) environ['wsgi.errors'].write(err) headers = [('Content-Type', 'text/html; charset=UTF-8')] start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info()) return [tob(err)] def __call__(self, environ, start_response): ''' Each instance of :class:'Bottle' is a WSGI application. ''' return self.wsgi(environ, start_response) ############################################################################### # HTTP and WSGI Tools ########################################################## ############################################################################### class BaseRequest(object): """ A wrapper for WSGI environment dictionaries that adds a lot of convenient access methods and properties. Most of them are read-only. Adding new attributes to a request actually adds them to the environ dictionary (as 'bottle.request.ext.'). This is the recommended way to store and access request-specific data. """ __slots__ = ('environ') #: Maximum size of memory buffer for :attr:`body` in bytes. MEMFILE_MAX = 102400 def __init__(self, environ=None): """ Wrap a WSGI environ dictionary. """ #: The wrapped WSGI environ dictionary. This is the only real attribute. #: All other attributes actually are read-only properties. self.environ = {} if environ is None else environ self.environ['bottle.request'] = self @DictProperty('environ', 'bottle.app', read_only=True) def app(self): ''' Bottle application handling this request. ''' raise RuntimeError('This request is not connected to an application.') @DictProperty('environ', 'bottle.route', read_only=True) def route(self): """ The bottle :class:`Route` object that matches this request. """ raise RuntimeError('This request is not connected to a route.') @DictProperty('environ', 'route.url_args', read_only=True) def url_args(self): """ The arguments extracted from the URL. """ raise RuntimeError('This request is not connected to a route.') @property def path(self): ''' The value of ``PATH_INFO`` with exactly one prefixed slash (to fix broken clients and avoid the "empty path" edge case). ''' return '/' + self.environ.get('PATH_INFO','').lstrip('/') @property def method(self): ''' The ``REQUEST_METHOD`` value as an uppercase string. ''' return self.environ.get('REQUEST_METHOD', 'GET').upper() @DictProperty('environ', 'bottle.request.headers', read_only=True) def headers(self): ''' A :class:`WSGIHeaderDict` that provides case-insensitive access to HTTP request headers. ''' return WSGIHeaderDict(self.environ) def get_header(self, name, default=None): ''' Return the value of a request header, or a given default value. ''' return self.headers.get(name, default) @DictProperty('environ', 'bottle.request.cookies', read_only=True) def cookies(self): """ Cookies parsed into a :class:`FormsDict`. Signed cookies are NOT decoded. Use :meth:`get_cookie` if you expect signed cookies. """ cookies = SimpleCookie(self.environ.get('HTTP_COOKIE','')).values() return FormsDict((c.key, c.value) for c in cookies) def get_cookie(self, key, default=None, secret=None): """ Return the content of a cookie. To read a `Signed Cookie`, the `secret` must match the one used to create the cookie (see :meth:`BaseResponse.set_cookie`). If anything goes wrong (missing cookie or wrong signature), return a default value. """ value = self.cookies.get(key) if secret and value: dec = cookie_decode(value, secret) # (key, value) tuple or None return dec[1] if dec and dec[0] == key else default return value or default @DictProperty('environ', 'bottle.request.query', read_only=True) def query(self): ''' The :attr:`query_string` parsed into a :class:`FormsDict`. These values are sometimes called "URL arguments" or "GET parameters", but not to be confused with "URL wildcards" as they are provided by the :class:`Router`. ''' get = self.environ['bottle.get'] = FormsDict() pairs = _parse_qsl(self.environ.get('QUERY_STRING', '')) for key, value in pairs: get[key] = value return get @DictProperty('environ', 'bottle.request.forms', read_only=True) def forms(self): """ Form values parsed from an `url-encoded` or `multipart/form-data` encoded POST or PUT request body. The result is returned as a :class:`FormsDict`. All keys and values are strings. File uploads are stored separately in :attr:`files`. """ forms = FormsDict() for name, item in self.POST.allitems(): if not isinstance(item, FileUpload): forms[name] = item return forms @DictProperty('environ', 'bottle.request.params', read_only=True) def params(self): """ A :class:`FormsDict` with the combined values of :attr:`query` and :attr:`forms`. File uploads are stored in :attr:`files`. """ params = FormsDict() for key, value in self.query.allitems(): params[key] = value for key, value in self.forms.allitems(): params[key] = value return params @DictProperty('environ', 'bottle.request.files', read_only=True) def files(self): """ File uploads parsed from `multipart/form-data` encoded POST or PUT request body. The values are instances of :class:`FileUpload`. """ files = FormsDict() for name, item in self.POST.allitems(): if isinstance(item, FileUpload): files[name] = item return files @DictProperty('environ', 'bottle.request.json', read_only=True) def json(self): ''' If the ``Content-Type`` header is ``application/json``, this property holds the parsed content of the request body. Only requests smaller than :attr:`MEMFILE_MAX` are processed to avoid memory exhaustion. ''' ctype = self.environ.get('CONTENT_TYPE', '').lower().split(';')[0] if ctype == 'application/json': b = self._get_body_string() if not b: return None return json_loads(b) return None def _iter_body(self, read, bufsize): maxread = max(0, self.content_length) while maxread: part = read(min(maxread, bufsize)) if not part: break yield part maxread -= len(part) def _iter_chunked(self, read, bufsize): err = HTTPError(400, 'Error while parsing chunked transfer body.') rn, sem, bs = tob('\r\n'), tob(';'), tob('') while True: header = read(1) while header[-2:] != rn: c = read(1) header += c if not c: raise err if len(header) > bufsize: raise err size, _, _ = header.partition(sem) try: maxread = int(tonat(size.strip()), 16) except ValueError: raise err if maxread == 0: break buff = bs while maxread > 0: if not buff: buff = read(min(maxread, bufsize)) part, buff = buff[:maxread], buff[maxread:] if not part: raise err yield part maxread -= len(part) if read(2) != rn: raise err @DictProperty('environ', 'bottle.request.body', read_only=True) def _body(self): body_iter = self._iter_chunked if self.chunked else self._iter_body read_func = self.environ['wsgi.input'].read body, body_size, is_temp_file = BytesIO(), 0, False for part in body_iter(read_func, self.MEMFILE_MAX): body.write(part) body_size += len(part) if not is_temp_file and body_size > self.MEMFILE_MAX: body, tmp = TemporaryFile(mode='w+b'), body body.write(tmp.getvalue()) del tmp is_temp_file = True self.environ['wsgi.input'] = body body.seek(0) return body def _get_body_string(self): ''' read body until content-length or MEMFILE_MAX into a string. Raise HTTPError(413) on requests that are to large. ''' clen = self.content_length if clen > self.MEMFILE_MAX: raise HTTPError(413, 'Request to large') if clen < 0: clen = self.MEMFILE_MAX + 1 data = self.body.read(clen) if len(data) > self.MEMFILE_MAX: # Fail fast raise HTTPError(413, 'Request to large') return data @property def body(self): """ The HTTP request body as a seek-able file-like object. Depending on :attr:`MEMFILE_MAX`, this is either a temporary file or a :class:`io.BytesIO` instance. Accessing this property for the first time reads and replaces the ``wsgi.input`` environ variable. Subsequent accesses just do a `seek(0)` on the file object. """ self._body.seek(0) return self._body @property def chunked(self): ''' True if Chunked transfer encoding was. ''' return 'chunked' in self.environ.get('HTTP_TRANSFER_ENCODING', '').lower() #: An alias for :attr:`query`. GET = query @DictProperty('environ', 'bottle.request.post', read_only=True) def POST(self): """ The values of :attr:`forms` and :attr:`files` combined into a single :class:`FormsDict`. Values are either strings (form values) or instances of :class:`cgi.FieldStorage` (file uploads). """ post = FormsDict() # We default to application/x-www-form-urlencoded for everything that # is not multipart and take the fast path (also: 3.1 workaround) if not self.content_type.startswith('multipart/'): pairs = _parse_qsl(tonat(self._get_body_string(), 'latin1')) for key, value in pairs: post[key] = value return post safe_env = {'QUERY_STRING':''} # Build a safe environment for cgi for key in ('REQUEST_METHOD', 'CONTENT_TYPE', 'CONTENT_LENGTH'): if key in self.environ: safe_env[key] = self.environ[key] args = dict(fp=self.body, environ=safe_env, keep_blank_values=True) if py31: args['fp'] = NCTextIOWrapper(args['fp'], encoding='utf8', newline='\n') elif py3k: args['encoding'] = 'utf8' data = cgi.FieldStorage(**args) self['_cgi.FieldStorage'] = data #http://bugs.python.org/issue18394#msg207958 data = data.list or [] for item in data: if item.filename is None: post[item.name] = item.value else: post[item.name] = FileUpload(item.file, item.name, item.filename, item.headers) return post @property def url(self): """ The full request URI including hostname and scheme. If your app lives behind a reverse proxy or load balancer and you get confusing results, make sure that the ``X-Forwarded-Host`` header is set correctly. """ return self.urlparts.geturl() @DictProperty('environ', 'bottle.request.urlparts', read_only=True) def urlparts(self): ''' The :attr:`url` string as an :class:`urlparse.SplitResult` tuple. The tuple contains (scheme, host, path, query_string and fragment), but the fragment is always empty because it is not visible to the server. ''' env = self.environ http = env.get('HTTP_X_FORWARDED_PROTO') or env.get('wsgi.url_scheme', 'http') host = env.get('HTTP_X_FORWARDED_HOST') or env.get('HTTP_HOST') if not host: # HTTP 1.1 requires a Host-header. This is for HTTP/1.0 clients. host = env.get('SERVER_NAME', '127.0.0.1') port = env.get('SERVER_PORT') if port and port != ('80' if http == 'http' else '443'): host += ':' + port path = urlquote(self.fullpath) return UrlSplitResult(http, host, path, env.get('QUERY_STRING'), '') @property def fullpath(self): """ Request path including :attr:`script_name` (if present). """ return urljoin(self.script_name, self.path.lstrip('/')) @property def query_string(self): """ The raw :attr:`query` part of the URL (everything in between ``?`` and ``#``) as a string. """ return self.environ.get('QUERY_STRING', '') @property def script_name(self): ''' The initial portion of the URL's `path` that was removed by a higher level (server or routing middleware) before the application was called. This script path is returned with leading and tailing slashes. ''' script_name = self.environ.get('SCRIPT_NAME', '').strip('/') return '/' + script_name + '/' if script_name else '/' def path_shift(self, shift=1): ''' Shift path segments from :attr:`path` to :attr:`script_name` and vice versa. :param shift: The number of path segments to shift. May be negative to change the shift direction. (default: 1) ''' script = self.environ.get('SCRIPT_NAME','/') self['SCRIPT_NAME'], self['PATH_INFO'] = path_shift(script, self.path, shift) @property def content_length(self): ''' The request body length as an integer. The client is responsible to set this header. Otherwise, the real length of the body is unknown and -1 is returned. In this case, :attr:`body` will be empty. ''' return int(self.environ.get('CONTENT_LENGTH') or -1) @property def content_type(self): ''' The Content-Type header as a lowercase-string (default: empty). ''' return self.environ.get('CONTENT_TYPE', '').lower() @property def is_xhr(self): ''' True if the request was triggered by a XMLHttpRequest. This only works with JavaScript libraries that support the `X-Requested-With` header (most of the popular libraries do). ''' requested_with = self.environ.get('HTTP_X_REQUESTED_WITH','') return requested_with.lower() == 'xmlhttprequest' @property def is_ajax(self): ''' Alias for :attr:`is_xhr`. "Ajax" is not the right term. ''' return self.is_xhr @property def auth(self): """ HTTP authentication data as a (user, password) tuple. This implementation currently supports basic (not digest) authentication only. If the authentication happened at a higher level (e.g. in the front web-server or a middleware), the password field is None, but the user field is looked up from the ``REMOTE_USER`` environ variable. On any errors, None is returned. """ basic = parse_auth(self.environ.get('HTTP_AUTHORIZATION','')) if basic: return basic ruser = self.environ.get('REMOTE_USER') if ruser: return (ruser, None) return None @property def remote_route(self): """ A list of all IPs that were involved in this request, starting with the client IP and followed by zero or more proxies. This does only work if all proxies support the ```X-Forwarded-For`` header. Note that this information can be forged by malicious clients. """ proxy = self.environ.get('HTTP_X_FORWARDED_FOR') if proxy: return [ip.strip() for ip in proxy.split(',')] remote = self.environ.get('REMOTE_ADDR') return [remote] if remote else [] @property def remote_addr(self): """ The client IP as a string. Note that this information can be forged by malicious clients. """ route = self.remote_route return route[0] if route else None def copy(self): """ Return a new :class:`Request` with a shallow :attr:`environ` copy. """ return Request(self.environ.copy()) def get(self, value, default=None): return self.environ.get(value, default) def __getitem__(self, key): return self.environ[key] def __delitem__(self, key): self[key] = ""; del(self.environ[key]) def __iter__(self): return iter(self.environ) def __len__(self): return len(self.environ) def keys(self): return self.environ.keys() def __setitem__(self, key, value): """ Change an environ value and clear all caches that depend on it. """ if self.environ.get('bottle.request.readonly'): raise KeyError('The environ dictionary is read-only.') self.environ[key] = value todelete = () if key == 'wsgi.input': todelete = ('body', 'forms', 'files', 'params', 'post', 'json') elif key == 'QUERY_STRING': todelete = ('query', 'params') elif key.startswith('HTTP_'): todelete = ('headers', 'cookies') for key in todelete: self.environ.pop('bottle.request.'+key, None) def __repr__(self): return '<%s: %s %s>' % (self.__class__.__name__, self.method, self.url) def __getattr__(self, name): ''' Search in self.environ for additional user defined attributes. ''' try: var = self.environ['bottle.request.ext.%s'%name] return var.__get__(self) if hasattr(var, '__get__') else var except KeyError: raise AttributeError('Attribute %r not defined.' % name) def __setattr__(self, name, value): if name == 'environ': return object.__setattr__(self, name, value) self.environ['bottle.request.ext.%s'%name] = value def _hkey(key): if '\n' in key or '\r' in key or '\0' in key: raise ValueError("Header names must not contain control characters: %r" % key) return key.title().replace('_', '-') def _hval(value): value = tonat(value) if '\n' in value or '\r' in value or '\0' in value: raise ValueError("Header value must not contain control characters: %r" % value) return value class HeaderProperty(object): def __init__(self, name, reader=None, writer=None, default=''): self.name, self.default = name, default self.reader, self.writer = reader, writer self.__doc__ = 'Current value of the %r header.' % name.title() def __get__(self, obj, cls): if obj is None: return self value = obj.get_header(self.name, self.default) return self.reader(value) if self.reader else value def __set__(self, obj, value): obj[self.name] = self.writer(value) if self.writer else value def __delete__(self, obj): del obj[self.name] class BaseResponse(object): """ Storage class for a response body as well as headers and cookies. This class does support dict-like case-insensitive item-access to headers, but is NOT a dict. Most notably, iterating over a response yields parts of the body and not the headers. :param body: The response body as one of the supported types. :param status: Either an HTTP status code (e.g. 200) or a status line including the reason phrase (e.g. '200 OK'). :param headers: A dictionary or a list of name-value pairs. Additional keyword arguments are added to the list of headers. Underscores in the header name are replaced with dashes. """ default_status = 200 default_content_type = 'text/html; charset=UTF-8' # Header blacklist for specific response codes # (rfc2616 section 10.2.3 and 10.3.5) bad_headers = { 204: set(('Content-Type',)), 304: set(('Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-Range', 'Content-Type', 'Content-Md5', 'Last-Modified'))} def __init__(self, body='', status=None, headers=None, **more_headers): self._cookies = None self._headers = {} self.body = body self.status = status or self.default_status if headers: if isinstance(headers, dict): headers = headers.items() for name, value in headers: self.add_header(name, value) if more_headers: for name, value in more_headers.items(): self.add_header(name, value) def copy(self, cls=None): ''' Returns a copy of self. ''' cls = cls or BaseResponse assert issubclass(cls, BaseResponse) copy = cls() copy.status = self.status copy._headers = dict((k, v[:]) for (k, v) in self._headers.items()) if self._cookies: copy._cookies = SimpleCookie() copy._cookies.load(self._cookies.output(header='')) return copy def __iter__(self): return iter(self.body) def close(self): if hasattr(self.body, 'close'): self.body.close() @property def status_line(self): ''' The HTTP status line as a string (e.g. ``404 Not Found``).''' return self._status_line @property def status_code(self): ''' The HTTP status code as an integer (e.g. 404).''' return self._status_code def _set_status(self, status): if isinstance(status, int): code, status = status, _HTTP_STATUS_LINES.get(status) elif ' ' in status: status = status.strip() code = int(status.split()[0]) else: raise ValueError('String status line without a reason phrase.') if not 100 <= code <= 999: raise ValueError('Status code out of range.') self._status_code = code self._status_line = str(status or ('%d Unknown' % code)) def _get_status(self): return self._status_line status = property(_get_status, _set_status, None, ''' A writeable property to change the HTTP response status. It accepts either a numeric code (100-999) or a string with a custom reason phrase (e.g. "404 Brain not found"). Both :data:`status_line` and :data:`status_code` are updated accordingly. The return value is always a status string. ''') del _get_status, _set_status @property def headers(self): ''' An instance of :class:`HeaderDict`, a case-insensitive dict-like view on the response headers. ''' hdict = HeaderDict() hdict.dict = self._headers return hdict def __contains__(self, name): return _hkey(name) in self._headers def __delitem__(self, name): del self._headers[_hkey(name)] def __getitem__(self, name): return self._headers[_hkey(name)][-1] def __setitem__(self, name, value): self._headers[_hkey(name)] = [_hval(value)] def get_header(self, name, default=None): ''' Return the value of a previously defined header. If there is no header with that name, return a default value. ''' return self._headers.get(_hkey(name), [default])[-1] def set_header(self, name, value): ''' Create a new response header, replacing any previously defined headers with the same name. ''' self._headers[_hkey(name)] = [_hval(value)] def add_header(self, name, value): ''' Add an additional response header, not removing duplicates. ''' self._headers.setdefault(_hkey(name), []).append(_hval(value)) def iter_headers(self): ''' Yield (header, value) tuples, skipping headers that are not allowed with the current response status code. ''' return self.headerlist @property def headerlist(self): """ WSGI conform list of (header, value) tuples. """ out = [] headers = list(self._headers.items()) if 'Content-Type' not in self._headers: headers.append(('Content-Type', [self.default_content_type])) if self._status_code in self.bad_headers: bad_headers = self.bad_headers[self._status_code] headers = [h for h in headers if h[0] not in bad_headers] out += [(name, val) for (name, vals) in headers for val in vals] if self._cookies: for c in self._cookies.values(): out.append(('Set-Cookie', _hval(c.OutputString()))) if py3k: out = [(k, v.encode('utf8').decode('latin1')) for (k, v) in out] return out content_type = HeaderProperty('Content-Type') content_length = HeaderProperty('Content-Length', reader=int) expires = HeaderProperty('Expires', reader=lambda x: datetime.utcfromtimestamp(parse_date(x)), writer=lambda x: http_date(x)) @property def charset(self, default='UTF-8'): """ Return the charset specified in the content-type header (default: utf8). """ if 'charset=' in self.content_type: return self.content_type.split('charset=')[-1].split(';')[0].strip() return default def set_cookie(self, name, value, secret=None, **options): ''' Create a new cookie or replace an old one. If the `secret` parameter is set, create a `Signed Cookie` (described below). :param name: the name of the cookie. :param value: the value of the cookie. :param secret: a signature key required for signed cookies. Additionally, this method accepts all RFC 2109 attributes that are supported by :class:`cookie.Morsel`, including: :param max_age: maximum age in seconds. (default: None) :param expires: a datetime object or UNIX timestamp. (default: None) :param domain: the domain that is allowed to read the cookie. (default: current domain) :param path: limits the cookie to a given path (default: current path) :param secure: limit the cookie to HTTPS connections (default: off). :param httponly: prevents client-side javascript to read this cookie (default: off, requires Python 2.6 or newer). If neither `expires` nor `max_age` is set (default), the cookie will expire at the end of the browser session (as soon as the browser window is closed). Signed cookies may store any pickle-able object and are cryptographically signed to prevent manipulation. Keep in mind that cookies are limited to 4kb in most browsers. Warning: Signed cookies are not encrypted (the client can still see the content) and not copy-protected (the client can restore an old cookie). The main intention is to make pickling and unpickling save, not to store secret information at client side. ''' if not self._cookies: self._cookies = SimpleCookie() if secret: value = touni(cookie_encode((name, value), secret)) elif not isinstance(value, basestring): raise TypeError('Secret key missing for non-string Cookie.') if len(value) > 4096: raise ValueError('Cookie value to long.') self._cookies[name] = value for key, value in options.items(): if key == 'max_age': if isinstance(value, timedelta): value = value.seconds + value.days * 24 * 3600 if key == 'expires': if isinstance(value, (datedate, datetime)): value = value.timetuple() elif isinstance(value, (int, float)): value = time.gmtime(value) value = time.strftime("%a, %d %b %Y %H:%M:%S GMT", value) self._cookies[name][key.replace('_', '-')] = value def delete_cookie(self, key, **kwargs): ''' Delete a cookie. Be sure to use the same `domain` and `path` settings as used to create the cookie. ''' kwargs['max_age'] = -1 kwargs['expires'] = 0 self.set_cookie(key, '', **kwargs) def __repr__(self): out = '' for name, value in self.headerlist: out += '%s: %s\n' % (name.title(), value.strip()) return out def local_property(name=None): if name: depr('local_property() is deprecated and will be removed.') #0.12 ls = threading.local() def fget(self): try: return ls.var except AttributeError: raise RuntimeError("Request context not initialized.") def fset(self, value): ls.var = value def fdel(self): del ls.var return property(fget, fset, fdel, 'Thread-local property') class LocalRequest(BaseRequest): ''' A thread-local subclass of :class:`BaseRequest` with a different set of attributes for each thread. There is usually only one global instance of this class (:data:`request`). If accessed during a request/response cycle, this instance always refers to the *current* request (even on a multithreaded server). ''' bind = BaseRequest.__init__ environ = local_property() class LocalResponse(BaseResponse): ''' A thread-local subclass of :class:`BaseResponse` with a different set of attributes for each thread. There is usually only one global instance of this class (:data:`response`). Its attributes are used to build the HTTP response at the end of the request/response cycle. ''' bind = BaseResponse.__init__ _status_line = local_property() _status_code = local_property() _cookies = local_property() _headers = local_property() body = local_property() Request = BaseRequest Response = BaseResponse class HTTPResponse(Response, BottleException): def __init__(self, body='', status=None, headers=None, **more_headers): super(HTTPResponse, self).__init__(body, status, headers, **more_headers) def apply(self, response): response._status_code = self._status_code response._status_line = self._status_line response._headers = self._headers response._cookies = self._cookies response.body = self.body class HTTPError(HTTPResponse): default_status = 500 def __init__(self, status=None, body=None, exception=None, traceback=None, **options): self.exception = exception self.traceback = traceback super(HTTPError, self).__init__(body, status, **options) ############################################################################### # Plugins ###################################################################### ############################################################################### class PluginError(BottleException): pass class JSONPlugin(object): name = 'json' api = 2 def __init__(self, json_dumps=json_dumps): self.json_dumps = json_dumps def apply(self, callback, route): dumps = self.json_dumps if not dumps: return callback def wrapper(*a, **ka): try: rv = callback(*a, **ka) except HTTPError: rv = _e() if isinstance(rv, dict): #Attempt to serialize, raises exception on failure json_response = dumps(rv) #Set content type only if serialization succesful response.content_type = 'application/json' return json_response elif isinstance(rv, HTTPResponse) and isinstance(rv.body, dict): rv.body = dumps(rv.body) rv.content_type = 'application/json' return rv return wrapper class TemplatePlugin(object): ''' This plugin applies the :func:`view` decorator to all routes with a `template` config parameter. If the parameter is a tuple, the second element must be a dict with additional options (e.g. `template_engine`) or default variables for the template. ''' name = 'template' api = 2 def apply(self, callback, route): conf = route.config.get('template') if isinstance(conf, (tuple, list)) and len(conf) == 2: return view(conf[0], **conf[1])(callback) elif isinstance(conf, str): return view(conf)(callback) else: return callback #: Not a plugin, but part of the plugin API. TODO: Find a better place. class _ImportRedirect(object): def __init__(self, name, impmask): ''' Create a virtual package that redirects imports (see PEP 302). ''' self.name = name self.impmask = impmask self.module = sys.modules.setdefault(name, new_module(name)) self.module.__dict__.update({'__file__': __file__, '__path__': [], '__all__': [], '__loader__': self}) sys.meta_path.append(self) def find_module(self, fullname, path=None): if '.' not in fullname: return packname = fullname.rsplit('.', 1)[0] if packname != self.name: return return self def load_module(self, fullname): if fullname in sys.modules: return sys.modules[fullname] modname = fullname.rsplit('.', 1)[1] realname = self.impmask % modname __import__(realname) module = sys.modules[fullname] = sys.modules[realname] setattr(self.module, modname, module) module.__loader__ = self return module ############################################################################### # Common Utilities ############################################################# ############################################################################### class MultiDict(DictMixin): """ This dict stores multiple values per key, but behaves exactly like a normal dict in that it returns only the newest value for any given key. There are special methods available to access the full list of values. """ def __init__(self, *a, **k): self.dict = dict((k, [v]) for (k, v) in dict(*a, **k).items()) def __len__(self): return len(self.dict) def __iter__(self): return iter(self.dict) def __contains__(self, key): return key in self.dict def __delitem__(self, key): del self.dict[key] def __getitem__(self, key): return self.dict[key][-1] def __setitem__(self, key, value): self.append(key, value) def keys(self): return self.dict.keys() if py3k: def values(self): return (v[-1] for v in self.dict.values()) def items(self): return ((k, v[-1]) for k, v in self.dict.items()) def allitems(self): return ((k, v) for k, vl in self.dict.items() for v in vl) iterkeys = keys itervalues = values iteritems = items iterallitems = allitems else: def values(self): return [v[-1] for v in self.dict.values()] def items(self): return [(k, v[-1]) for k, v in self.dict.items()] def iterkeys(self): return self.dict.iterkeys() def itervalues(self): return (v[-1] for v in self.dict.itervalues()) def iteritems(self): return ((k, v[-1]) for k, v in self.dict.iteritems()) def iterallitems(self): return ((k, v) for k, vl in self.dict.iteritems() for v in vl) def allitems(self): return [(k, v) for k, vl in self.dict.iteritems() for v in vl] def get(self, key, default=None, index=-1, type=None): ''' Return the most recent value for a key. :param default: The default value to be returned if the key is not present or the type conversion fails. :param index: An index for the list of available values. :param type: If defined, this callable is used to cast the value into a specific type. Exception are suppressed and result in the default value to be returned. ''' try: val = self.dict[key][index] return type(val) if type else val except Exception: pass return default def append(self, key, value): ''' Add a new value to the list of values for this key. ''' self.dict.setdefault(key, []).append(value) def replace(self, key, value): ''' Replace the list of values with a single value. ''' self.dict[key] = [value] def getall(self, key): ''' Return a (possibly empty) list of values for a key. ''' return self.dict.get(key) or [] #: Aliases for WTForms to mimic other multi-dict APIs (Django) getone = get getlist = getall class FormsDict(MultiDict): ''' This :class:`MultiDict` subclass is used to store request form data. Additionally to the normal dict-like item access methods (which return unmodified data as native strings), this container also supports attribute-like access to its values. Attributes are automatically de- or recoded to match :attr:`input_encoding` (default: 'utf8'). Missing attributes default to an empty string. ''' #: Encoding used for attribute values. input_encoding = 'utf8' #: If true (default), unicode strings are first encoded with `latin1` #: and then decoded to match :attr:`input_encoding`. recode_unicode = True def _fix(self, s, encoding=None): if isinstance(s, unicode) and self.recode_unicode: # Python 3 WSGI return s.encode('latin1').decode(encoding or self.input_encoding) elif isinstance(s, bytes): # Python 2 WSGI return s.decode(encoding or self.input_encoding) else: return s def decode(self, encoding=None): ''' Returns a copy with all keys and values de- or recoded to match :attr:`input_encoding`. Some libraries (e.g. WTForms) want a unicode dictionary. ''' copy = FormsDict() enc = copy.input_encoding = encoding or self.input_encoding copy.recode_unicode = False for key, value in self.allitems(): copy.append(self._fix(key, enc), self._fix(value, enc)) return copy def getunicode(self, name, default=None, encoding=None): ''' Return the value as a unicode string, or the default. ''' try: return self._fix(self[name], encoding) except (UnicodeError, KeyError): return default def __getattr__(self, name, default=unicode()): # Without this guard, pickle generates a cryptic TypeError: if name.startswith('__') and name.endswith('__'): return super(FormsDict, self).__getattr__(name) return self.getunicode(name, default=default) class HeaderDict(MultiDict): """ A case-insensitive version of :class:`MultiDict` that defaults to replace the old value instead of appending it. """ def __init__(self, *a, **ka): self.dict = {} if a or ka: self.update(*a, **ka) def __contains__(self, key): return _hkey(key) in self.dict def __delitem__(self, key): del self.dict[_hkey(key)] def __getitem__(self, key): return self.dict[_hkey(key)][-1] def __setitem__(self, key, value): self.dict[_hkey(key)] = [_hval(value)] def append(self, key, value): self.dict.setdefault(_hkey(key), []).append(_hval(value)) def replace(self, key, value): self.dict[_hkey(key)] = [_hval(value)] def getall(self, key): return self.dict.get(_hkey(key)) or [] def get(self, key, default=None, index=-1): return MultiDict.get(self, _hkey(key), default, index) def filter(self, names): for name in (_hkey(n) for n in names): if name in self.dict: del self.dict[name] class WSGIHeaderDict(DictMixin): ''' This dict-like class wraps a WSGI environ dict and provides convenient access to HTTP_* fields. Keys and values are native strings (2.x bytes or 3.x unicode) and keys are case-insensitive. If the WSGI environment contains non-native string values, these are de- or encoded using a lossless 'latin1' character set. The API will remain stable even on changes to the relevant PEPs. Currently PEP 333, 444 and 3333 are supported. (PEP 444 is the only one that uses non-native strings.) ''' #: List of keys that do not have a ``HTTP_`` prefix. cgikeys = ('CONTENT_TYPE', 'CONTENT_LENGTH') def __init__(self, environ): self.environ = environ def _ekey(self, key): ''' Translate header field name to CGI/WSGI environ key. ''' key = key.replace('-','_').upper() if key in self.cgikeys: return key return 'HTTP_' + key def raw(self, key, default=None): ''' Return the header value as is (may be bytes or unicode). ''' return self.environ.get(self._ekey(key), default) def __getitem__(self, key): return tonat(self.environ[self._ekey(key)], 'latin1') def __setitem__(self, key, value): raise TypeError("%s is read-only." % self.__class__) def __delitem__(self, key): raise TypeError("%s is read-only." % self.__class__) def __iter__(self): for key in self.environ: if key[:5] == 'HTTP_': yield key[5:].replace('_', '-').title() elif key in self.cgikeys: yield key.replace('_', '-').title() def keys(self): return [x for x in self] def __len__(self): return len(self.keys()) def __contains__(self, key): return self._ekey(key) in self.environ class ConfigDict(dict): ''' A dict-like configuration storage with additional support for namespaces, validators, meta-data, on_change listeners and more. This storage is optimized for fast read access. Retrieving a key or using non-altering dict methods (e.g. `dict.get()`) has no overhead compared to a native dict. ''' __slots__ = ('_meta', '_on_change') class Namespace(DictMixin): def __init__(self, config, namespace): self._config = config self._prefix = namespace def __getitem__(self, key): depr('Accessing namespaces as dicts is discouraged. ' 'Only use flat item access: ' 'cfg["names"]["pace"]["key"] -> cfg["name.space.key"]') #0.12 return self._config[self._prefix + '.' + key] def __setitem__(self, key, value): self._config[self._prefix + '.' + key] = value def __delitem__(self, key): del self._config[self._prefix + '.' + key] def __iter__(self): ns_prefix = self._prefix + '.' for key in self._config: ns, dot, name = key.rpartition('.') if ns == self._prefix and name: yield name def keys(self): return [x for x in self] def __len__(self): return len(self.keys()) def __contains__(self, key): return self._prefix + '.' + key in self._config def __repr__(self): return '' % self._prefix def __str__(self): return '' % self._prefix # Deprecated ConfigDict features def __getattr__(self, key): depr('Attribute access is deprecated.') #0.12 if key not in self and key[0].isupper(): self[key] = ConfigDict.Namespace(self._config, self._prefix + '.' + key) if key not in self and key.startswith('__'): raise AttributeError(key) return self.get(key) def __setattr__(self, key, value): if key in ('_config', '_prefix'): self.__dict__[key] = value return depr('Attribute assignment is deprecated.') #0.12 if hasattr(DictMixin, key): raise AttributeError('Read-only attribute.') if key in self and self[key] and isinstance(self[key], self.__class__): raise AttributeError('Non-empty namespace attribute.') self[key] = value def __delattr__(self, key): if key in self: val = self.pop(key) if isinstance(val, self.__class__): prefix = key + '.' for key in self: if key.startswith(prefix): del self[prefix+key] def __call__(self, *a, **ka): depr('Calling ConfDict is deprecated. Use the update() method.') #0.12 self.update(*a, **ka) return self def __init__(self, *a, **ka): self._meta = {} self._on_change = lambda name, value: None if a or ka: depr('Constructor does no longer accept parameters.') #0.12 self.update(*a, **ka) def load_config(self, filename): ''' Load values from an *.ini style config file. If the config file contains sections, their names are used as namespaces for the values within. The two special sections ``DEFAULT`` and ``bottle`` refer to the root namespace (no prefix). ''' conf = ConfigParser() conf.read(filename) for section in conf.sections(): for key, value in conf.items(section): if section not in ('DEFAULT', 'bottle'): key = section + '.' + key self[key] = value return self def load_dict(self, source, namespace='', make_namespaces=False): ''' Import values from a dictionary structure. Nesting can be used to represent namespaces. >>> ConfigDict().load_dict({'name': {'space': {'key': 'value'}}}) {'name.space.key': 'value'} ''' stack = [(namespace, source)] while stack: prefix, source = stack.pop() if not isinstance(source, dict): raise TypeError('Source is not a dict (r)' % type(key)) for key, value in source.items(): if not isinstance(key, basestring): raise TypeError('Key is not a string (%r)' % type(key)) full_key = prefix + '.' + key if prefix else key if isinstance(value, dict): stack.append((full_key, value)) if make_namespaces: self[full_key] = self.Namespace(self, full_key) else: self[full_key] = value return self def update(self, *a, **ka): ''' If the first parameter is a string, all keys are prefixed with this namespace. Apart from that it works just as the usual dict.update(). Example: ``update('some.namespace', key='value')`` ''' prefix = '' if a and isinstance(a[0], basestring): prefix = a[0].strip('.') + '.' a = a[1:] for key, value in dict(*a, **ka).items(): self[prefix+key] = value def setdefault(self, key, value): if key not in self: self[key] = value return self[key] def __setitem__(self, key, value): if not isinstance(key, basestring): raise TypeError('Key has type %r (not a string)' % type(key)) value = self.meta_get(key, 'filter', lambda x: x)(value) if key in self and self[key] is value: return self._on_change(key, value) dict.__setitem__(self, key, value) def __delitem__(self, key): dict.__delitem__(self, key) def clear(self): for key in self: del self[key] def meta_get(self, key, metafield, default=None): ''' Return the value of a meta field for a key. ''' return self._meta.get(key, {}).get(metafield, default) def meta_set(self, key, metafield, value): ''' Set the meta field for a key to a new value. This triggers the on-change handler for existing keys. ''' self._meta.setdefault(key, {})[metafield] = value if key in self: self[key] = self[key] def meta_list(self, key): ''' Return an iterable of meta field names defined for a key. ''' return self._meta.get(key, {}).keys() # Deprecated ConfigDict features def __getattr__(self, key): depr('Attribute access is deprecated.') #0.12 if key not in self and key[0].isupper(): self[key] = self.Namespace(self, key) if key not in self and key.startswith('__'): raise AttributeError(key) return self.get(key) def __setattr__(self, key, value): if key in self.__slots__: return dict.__setattr__(self, key, value) depr('Attribute assignment is deprecated.') #0.12 if hasattr(dict, key): raise AttributeError('Read-only attribute.') if key in self and self[key] and isinstance(self[key], self.Namespace): raise AttributeError('Non-empty namespace attribute.') self[key] = value def __delattr__(self, key): if key in self: val = self.pop(key) if isinstance(val, self.Namespace): prefix = key + '.' for key in self: if key.startswith(prefix): del self[prefix+key] def __call__(self, *a, **ka): depr('Calling ConfDict is deprecated. Use the update() method.') #0.12 self.update(*a, **ka) return self class AppStack(list): """ A stack-like list. Calling it returns the head of the stack. """ def __call__(self): """ Return the current default application. """ return self[-1] def push(self, value=None): """ Add a new :class:`Bottle` instance to the stack """ if not isinstance(value, Bottle): value = Bottle() self.append(value) return value class WSGIFileWrapper(object): def __init__(self, fp, buffer_size=1024*64): self.fp, self.buffer_size = fp, buffer_size for attr in ('fileno', 'close', 'read', 'readlines', 'tell', 'seek'): if hasattr(fp, attr): setattr(self, attr, getattr(fp, attr)) def __iter__(self): buff, read = self.buffer_size, self.read while True: part = read(buff) if not part: return yield part class _closeiter(object): ''' This only exists to be able to attach a .close method to iterators that do not support attribute assignment (most of itertools). ''' def __init__(self, iterator, close=None): self.iterator = iterator self.close_callbacks = makelist(close) def __iter__(self): return iter(self.iterator) def close(self): for func in self.close_callbacks: func() class ResourceManager(object): ''' This class manages a list of search paths and helps to find and open application-bound resources (files). :param base: default value for :meth:`add_path` calls. :param opener: callable used to open resources. :param cachemode: controls which lookups are cached. One of 'all', 'found' or 'none'. ''' def __init__(self, base='./', opener=open, cachemode='all'): self.opener = open self.base = base self.cachemode = cachemode #: A list of search paths. See :meth:`add_path` for details. self.path = [] #: A cache for resolved paths. ``res.cache.clear()`` clears the cache. self.cache = {} def add_path(self, path, base=None, index=None, create=False): ''' Add a new path to the list of search paths. Return False if the path does not exist. :param path: The new search path. Relative paths are turned into an absolute and normalized form. If the path looks like a file (not ending in `/`), the filename is stripped off. :param base: Path used to absolutize relative search paths. Defaults to :attr:`base` which defaults to ``os.getcwd()``. :param index: Position within the list of search paths. Defaults to last index (appends to the list). The `base` parameter makes it easy to reference files installed along with a python module or package:: res.add_path('./resources/', __file__) ''' base = os.path.abspath(os.path.dirname(base or self.base)) path = os.path.abspath(os.path.join(base, os.path.dirname(path))) path += os.sep if path in self.path: self.path.remove(path) if create and not os.path.isdir(path): os.makedirs(path) if index is None: self.path.append(path) else: self.path.insert(index, path) self.cache.clear() return os.path.exists(path) def __iter__(self): ''' Iterate over all existing files in all registered paths. ''' search = self.path[:] while search: path = search.pop() if not os.path.isdir(path): continue for name in os.listdir(path): full = os.path.join(path, name) if os.path.isdir(full): search.append(full) else: yield full def lookup(self, name): ''' Search for a resource and return an absolute file path, or `None`. The :attr:`path` list is searched in order. The first match is returend. Symlinks are followed. The result is cached to speed up future lookups. ''' if name not in self.cache or DEBUG: for path in self.path: fpath = os.path.join(path, name) if os.path.isfile(fpath): if self.cachemode in ('all', 'found'): self.cache[name] = fpath return fpath if self.cachemode == 'all': self.cache[name] = None return self.cache[name] def open(self, name, mode='r', *args, **kwargs): ''' Find a resource and return a file object, or raise IOError. ''' fname = self.lookup(name) if not fname: raise IOError("Resource %r not found." % name) return self.opener(fname, mode=mode, *args, **kwargs) class FileUpload(object): def __init__(self, fileobj, name, filename, headers=None): ''' Wrapper for file uploads. ''' #: Open file(-like) object (BytesIO buffer or temporary file) self.file = fileobj #: Name of the upload form field self.name = name #: Raw filename as sent by the client (may contain unsafe characters) self.raw_filename = filename #: A :class:`HeaderDict` with additional headers (e.g. content-type) self.headers = HeaderDict(headers) if headers else HeaderDict() content_type = HeaderProperty('Content-Type') content_length = HeaderProperty('Content-Length', reader=int, default=-1) def get_header(self, name, default=None): """ Return the value of a header within the mulripart part. """ return self.headers.get(name, default) @cached_property def filename(self): ''' Name of the file on the client file system, but normalized to ensure file system compatibility. An empty filename is returned as 'empty'. Only ASCII letters, digits, dashes, underscores and dots are allowed in the final filename. Accents are removed, if possible. Whitespace is replaced by a single dash. Leading or tailing dots or dashes are removed. The filename is limited to 255 characters. ''' fname = self.raw_filename if not isinstance(fname, unicode): fname = fname.decode('utf8', 'ignore') fname = normalize('NFKD', fname).encode('ASCII', 'ignore').decode('ASCII') fname = os.path.basename(fname.replace('\\', os.path.sep)) fname = re.sub(r'[^a-zA-Z0-9-_.\s]', '', fname).strip() fname = re.sub(r'[-\s]+', '-', fname).strip('.-') return fname[:255] or 'empty' def _copy_file(self, fp, chunk_size=2**16): read, write, offset = self.file.read, fp.write, self.file.tell() while 1: buf = read(chunk_size) if not buf: break write(buf) self.file.seek(offset) def save(self, destination, overwrite=False, chunk_size=2**16): ''' Save file to disk or copy its content to an open file(-like) object. If *destination* is a directory, :attr:`filename` is added to the path. Existing files are not overwritten by default (IOError). :param destination: File path, directory or file(-like) object. :param overwrite: If True, replace existing files. (default: False) :param chunk_size: Bytes to read at a time. (default: 64kb) ''' if isinstance(destination, basestring): # Except file-likes here if os.path.isdir(destination): destination = os.path.join(destination, self.filename) if not overwrite and os.path.exists(destination): raise IOError('File exists.') with open(destination, 'wb') as fp: self._copy_file(fp, chunk_size) else: self._copy_file(destination, chunk_size) ############################################################################### # Application Helper ########################################################### ############################################################################### def abort(code=500, text='Unknown Error.'): """ Aborts execution and causes a HTTP error. """ raise HTTPError(code, text) def redirect(url, code=None): """ Aborts execution and causes a 303 or 302 redirect, depending on the HTTP protocol version. """ if not code: code = 303 if request.get('SERVER_PROTOCOL') == "HTTP/1.1" else 302 res = response.copy(cls=HTTPResponse) res.status = code res.body = "" res.set_header('Location', urljoin(request.url, url)) raise res def _file_iter_range(fp, offset, bytes, maxread=1024*1024): ''' Yield chunks from a range in a file. No chunk is bigger than maxread.''' fp.seek(offset) while bytes > 0: part = fp.read(min(bytes, maxread)) if not part: break bytes -= len(part) yield part def static_file(filename, root, mimetype='auto', download=False, charset='UTF-8'): """ Open a file in a safe way and return :exc:`HTTPResponse` with status code 200, 305, 403 or 404. The ``Content-Type``, ``Content-Encoding``, ``Content-Length`` and ``Last-Modified`` headers are set if possible. Special support for ``If-Modified-Since``, ``Range`` and ``HEAD`` requests. :param filename: Name or path of the file to send. :param root: Root path for file lookups. Should be an absolute directory path. :param mimetype: Defines the content-type header (default: guess from file extension) :param download: If True, ask the browser to open a `Save as...` dialog instead of opening the file with the associated program. You can specify a custom filename as a string. If not specified, the original filename is used (default: False). :param charset: The charset to use for files with a ``text/*`` mime-type. (default: UTF-8) """ root = os.path.abspath(root) + os.sep filename = os.path.abspath(os.path.join(root, filename.strip('/\\'))) headers = dict() if not filename.startswith(root): return HTTPError(403, "Access denied.") if not os.path.exists(filename) or not os.path.isfile(filename): return HTTPError(404, "File does not exist.") if not os.access(filename, os.R_OK): return HTTPError(403, "You do not have permission to access this file.") if mimetype == 'auto': mimetype, encoding = mimetypes.guess_type(filename) if encoding: headers['Content-Encoding'] = encoding if mimetype: if mimetype[:5] == 'text/' and charset and 'charset' not in mimetype: mimetype += '; charset=%s' % charset headers['Content-Type'] = mimetype if download: download = os.path.basename(filename if download == True else download) headers['Content-Disposition'] = 'attachment; filename="%s"' % download stats = os.stat(filename) headers['Content-Length'] = clen = stats.st_size lm = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(stats.st_mtime)) headers['Last-Modified'] = lm ims = request.environ.get('HTTP_IF_MODIFIED_SINCE') if ims: ims = parse_date(ims.split(";")[0].strip()) if ims is not None and ims >= int(stats.st_mtime): headers['Date'] = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime()) return HTTPResponse(status=304, **headers) body = '' if request.method == 'HEAD' else open(filename, 'rb') headers["Accept-Ranges"] = "bytes" ranges = request.environ.get('HTTP_RANGE') if 'HTTP_RANGE' in request.environ: ranges = list(parse_range_header(request.environ['HTTP_RANGE'], clen)) if not ranges: return HTTPError(416, "Requested Range Not Satisfiable") offset, end = ranges[0] headers["Content-Range"] = "bytes %d-%d/%d" % (offset, end-1, clen) headers["Content-Length"] = str(end-offset) if body: body = _file_iter_range(body, offset, end-offset) return HTTPResponse(body, status=206, **headers) return HTTPResponse(body, **headers) ############################################################################### # HTTP Utilities and MISC (TODO) ############################################### ############################################################################### def debug(mode=True): """ Change the debug level. There is only one debug level supported at the moment.""" global DEBUG if mode: warnings.simplefilter('default') DEBUG = bool(mode) def http_date(value): if isinstance(value, (datedate, datetime)): value = value.utctimetuple() elif isinstance(value, (int, float)): value = time.gmtime(value) if not isinstance(value, basestring): value = time.strftime("%a, %d %b %Y %H:%M:%S GMT", value) return value def parse_date(ims): """ Parse rfc1123, rfc850 and asctime timestamps and return UTC epoch. """ try: ts = email.utils.parsedate_tz(ims) return time.mktime(ts[:8] + (0,)) - (ts[9] or 0) - time.timezone except (TypeError, ValueError, IndexError, OverflowError): return None def parse_auth(header): """ Parse rfc2617 HTTP authentication header string (basic) and return (user,pass) tuple or None""" try: method, data = header.split(None, 1) if method.lower() == 'basic': user, pwd = touni(base64.b64decode(tob(data))).split(':',1) return user, pwd except (KeyError, ValueError): return None def parse_range_header(header, maxlen=0): ''' Yield (start, end) ranges parsed from a HTTP Range header. Skip unsatisfiable ranges. The end index is non-inclusive.''' if not header or header[:6] != 'bytes=': return ranges = [r.split('-', 1) for r in header[6:].split(',') if '-' in r] for start, end in ranges: try: if not start: # bytes=-100 -> last 100 bytes start, end = max(0, maxlen-int(end)), maxlen elif not end: # bytes=100- -> all but the first 99 bytes start, end = int(start), maxlen else: # bytes=100-200 -> bytes 100-200 (inclusive) start, end = int(start), min(int(end)+1, maxlen) if 0 <= start < end <= maxlen: yield start, end except ValueError: pass def _parse_qsl(qs): r = [] for pair in qs.split('&'): if not pair: continue nv = pair.split('=', 1) if len(nv) != 2: nv.append('') key = urlunquote(nv[0].replace('+', ' ')) value = urlunquote(nv[1].replace('+', ' ')) r.append((key, value)) return r def _lscmp(a, b): ''' Compares two strings in a cryptographically safe way: Runtime is not affected by length of common prefix. ''' return not sum(0 if x==y else 1 for x, y in zip(a, b)) and len(a) == len(b) def cookie_encode(data, key): ''' Encode and sign a pickle-able object. Return a (byte) string ''' msg = base64.b64encode(pickle.dumps(data, -1)) sig = base64.b64encode(hmac.new(tob(key), msg, digestmod=hashlib.md5).digest()) return tob('!') + sig + tob('?') + msg def cookie_decode(data, key): ''' Verify and decode an encoded string. Return an object or None.''' data = tob(data) if cookie_is_encoded(data): sig, msg = data.split(tob('?'), 1) if _lscmp(sig[1:], base64.b64encode(hmac.new(tob(key), msg, digestmod=hashlib.md5).digest())): return pickle.loads(base64.b64decode(msg)) return None def cookie_is_encoded(data): ''' Return True if the argument looks like a encoded cookie.''' return bool(data.startswith(tob('!')) and tob('?') in data) def html_escape(string): ''' Escape HTML special characters ``&<>`` and quotes ``'"``. ''' return string.replace('&','&').replace('<','<').replace('>','>')\ .replace('"','"').replace("'",''') def html_quote(string): ''' Escape and quote a string to be used as an HTTP attribute.''' return '"%s"' % html_escape(string).replace('\n',' ')\ .replace('\r',' ').replace('\t',' ') def yieldroutes(func): """ Return a generator for routes that match the signature (name, args) of the func parameter. This may yield more than one route if the function takes optional keyword arguments. The output is best described by example:: a() -> '/a' b(x, y) -> '/b//' c(x, y=5) -> '/c/' and '/c//' d(x=5, y=6) -> '/d' and '/d/' and '/d//' """ path = '/' + func.__name__.replace('__','/').lstrip('/') spec = getargspec(func) argc = len(spec[0]) - len(spec[3] or []) path += ('/<%s>' * argc) % tuple(spec[0][:argc]) yield path for arg in spec[0][argc:]: path += '/<%s>' % arg yield path def path_shift(script_name, path_info, shift=1): ''' Shift path fragments from PATH_INFO to SCRIPT_NAME and vice versa. :return: The modified paths. :param script_name: The SCRIPT_NAME path. :param script_name: The PATH_INFO path. :param shift: The number of path fragments to shift. May be negative to change the shift direction. (default: 1) ''' if shift == 0: return script_name, path_info pathlist = path_info.strip('/').split('/') scriptlist = script_name.strip('/').split('/') if pathlist and pathlist[0] == '': pathlist = [] if scriptlist and scriptlist[0] == '': scriptlist = [] if shift > 0 and shift <= len(pathlist): moved = pathlist[:shift] scriptlist = scriptlist + moved pathlist = pathlist[shift:] elif shift < 0 and shift >= -len(scriptlist): moved = scriptlist[shift:] pathlist = moved + pathlist scriptlist = scriptlist[:shift] else: empty = 'SCRIPT_NAME' if shift < 0 else 'PATH_INFO' raise AssertionError("Cannot shift. Nothing left from %s" % empty) new_script_name = '/' + '/'.join(scriptlist) new_path_info = '/' + '/'.join(pathlist) if path_info.endswith('/') and pathlist: new_path_info += '/' return new_script_name, new_path_info def auth_basic(check, realm="private", text="Access denied"): ''' Callback decorator to require HTTP auth (basic). TODO: Add route(check_auth=...) parameter. ''' def decorator(func): @functools.wraps(func) def wrapper(*a, **ka): user, password = request.auth or (None, None) if user is None or not check(user, password): err = HTTPError(401, text) err.add_header('WWW-Authenticate', 'Basic realm="%s"' % realm) return err return func(*a, **ka) return wrapper return decorator # Shortcuts for common Bottle methods. # They all refer to the current default application. def make_default_app_wrapper(name): ''' Return a callable that relays calls to the current default app. ''' @functools.wraps(getattr(Bottle, name)) def wrapper(*a, **ka): return getattr(app(), name)(*a, **ka) return wrapper route = make_default_app_wrapper('route') get = make_default_app_wrapper('get') post = make_default_app_wrapper('post') put = make_default_app_wrapper('put') delete = make_default_app_wrapper('delete') error = make_default_app_wrapper('error') mount = make_default_app_wrapper('mount') hook = make_default_app_wrapper('hook') install = make_default_app_wrapper('install') uninstall = make_default_app_wrapper('uninstall') url = make_default_app_wrapper('get_url') ############################################################################### # Server Adapter ############################################################### ############################################################################### class ServerAdapter(object): quiet = False def __init__(self, host='127.0.0.1', port=8080, **options): self.options = options self.host = host self.port = int(port) def run(self, handler): # pragma: no cover pass def __repr__(self): args = ', '.join(['%s=%s'%(k,repr(v)) for k, v in self.options.items()]) return "%s(%s)" % (self.__class__.__name__, args) class CGIServer(ServerAdapter): quiet = True def run(self, handler): # pragma: no cover from wsgiref.handlers import CGIHandler def fixed_environ(environ, start_response): environ.setdefault('PATH_INFO', '') return handler(environ, start_response) CGIHandler().run(fixed_environ) class FlupFCGIServer(ServerAdapter): def run(self, handler): # pragma: no cover import flup.server.fcgi self.options.setdefault('bindAddress', (self.host, self.port)) flup.server.fcgi.WSGIServer(handler, **self.options).run() class WSGIRefServer(ServerAdapter): def run(self, app): # pragma: no cover from wsgiref.simple_server import WSGIRequestHandler, WSGIServer from wsgiref.simple_server import make_server import socket class FixedHandler(WSGIRequestHandler): def address_string(self): # Prevent reverse DNS lookups please. return self.client_address[0] def log_request(*args, **kw): if not self.quiet: return WSGIRequestHandler.log_request(*args, **kw) handler_cls = self.options.get('handler_class', FixedHandler) server_cls = self.options.get('server_class', WSGIServer) if ':' in self.host: # Fix wsgiref for IPv6 addresses. if getattr(server_cls, 'address_family') == socket.AF_INET: class server_cls(server_cls): address_family = socket.AF_INET6 srv = make_server(self.host, self.port, app, server_cls, handler_cls) srv.serve_forever() class CherryPyServer(ServerAdapter): def run(self, handler): # pragma: no cover depr("The wsgi server part of cherrypy was split into a new " "project called 'cheroot'. Use the 'cheroot' server " "adapter instead of cherrypy.") from cherrypy import wsgiserver # This will fail for CherryPy >= 9 self.options['bind_addr'] = (self.host, self.port) self.options['wsgi_app'] = handler certfile = self.options.get('certfile') if certfile: del self.options['certfile'] keyfile = self.options.get('keyfile') if keyfile: del self.options['keyfile'] server = wsgiserver.CherryPyWSGIServer(**self.options) if certfile: server.ssl_certificate = certfile if keyfile: server.ssl_private_key = keyfile try: server.start() finally: server.stop() class CherootServer(ServerAdapter): def run(self, handler): # pragma: no cover from cheroot import wsgi from cheroot.ssl import builtin self.options['bind_addr'] = (self.host, self.port) self.options['wsgi_app'] = handler certfile = self.options.pop('certfile', None) keyfile = self.options.pop('keyfile', None) chainfile = self.options.pop('chainfile', None) server = wsgi.Server(**self.options) if certfile and keyfile: server.ssl_adapter = builtin.BuiltinSSLAdapter( certfile, keyfile, chainfile) try: server.start() finally: server.stop() class WaitressServer(ServerAdapter): def run(self, handler): from waitress import serve serve(handler, host=self.host, port=self.port) class PasteServer(ServerAdapter): def run(self, handler): # pragma: no cover from paste import httpserver from paste.translogger import TransLogger handler = TransLogger(handler, setup_console_handler=(not self.quiet)) httpserver.serve(handler, host=self.host, port=str(self.port), **self.options) class MeinheldServer(ServerAdapter): def run(self, handler): from meinheld import server server.listen((self.host, self.port)) server.run(handler) class FapwsServer(ServerAdapter): """ Extremely fast webserver using libev. See http://www.fapws.org/ """ def run(self, handler): # pragma: no cover import fapws._evwsgi as evwsgi from fapws import base, config port = self.port if float(config.SERVER_IDENT[-2:]) > 0.4: # fapws3 silently changed its API in 0.5 port = str(port) evwsgi.start(self.host, port) # fapws3 never releases the GIL. Complain upstream. I tried. No luck. if 'BOTTLE_CHILD' in os.environ and not self.quiet: _stderr("WARNING: Auto-reloading does not work with Fapws3.\n") _stderr(" (Fapws3 breaks python thread support)\n") evwsgi.set_base_module(base) def app(environ, start_response): environ['wsgi.multiprocess'] = False return handler(environ, start_response) evwsgi.wsgi_cb(('', app)) evwsgi.run() class TornadoServer(ServerAdapter): """ The super hyped asynchronous server by facebook. Untested. """ def run(self, handler): # pragma: no cover import tornado.wsgi, tornado.httpserver, tornado.ioloop container = tornado.wsgi.WSGIContainer(handler) server = tornado.httpserver.HTTPServer(container) server.listen(port=self.port,address=self.host) tornado.ioloop.IOLoop.instance().start() class AppEngineServer(ServerAdapter): """ Adapter for Google App Engine. """ quiet = True def run(self, handler): from google.appengine.ext.webapp import util # A main() function in the handler script enables 'App Caching'. # Lets makes sure it is there. This _really_ improves performance. module = sys.modules.get('__main__') if module and not hasattr(module, 'main'): module.main = lambda: util.run_wsgi_app(handler) util.run_wsgi_app(handler) class TwistedServer(ServerAdapter): """ Untested. """ def run(self, handler): from twisted.web import server, wsgi from twisted.python.threadpool import ThreadPool from twisted.internet import reactor thread_pool = ThreadPool() thread_pool.start() reactor.addSystemEventTrigger('after', 'shutdown', thread_pool.stop) factory = server.Site(wsgi.WSGIResource(reactor, thread_pool, handler)) reactor.listenTCP(self.port, factory, interface=self.host) reactor.run() class DieselServer(ServerAdapter): """ Untested. """ def run(self, handler): from diesel.protocols.wsgi import WSGIApplication app = WSGIApplication(handler, port=self.port) app.run() class GeventServer(ServerAdapter): """ Untested. Options: * `fast` (default: False) uses libevent's http server, but has some issues: No streaming, no pipelining, no SSL. * See gevent.wsgi.WSGIServer() documentation for more options. """ def run(self, handler): from gevent import pywsgi, local if not isinstance(threading.local(), local.local): msg = "Bottle requires gevent.monkey.patch_all() (before import)" raise RuntimeError(msg) if self.options.pop('fast', None): depr('The "fast" option has been deprecated and removed by Gevent.') if self.quiet: self.options['log'] = None address = (self.host, self.port) server = pywsgi.WSGIServer(address, handler, **self.options) if 'BOTTLE_CHILD' in os.environ: import signal signal.signal(signal.SIGINT, lambda s, f: server.stop()) server.serve_forever() class GeventSocketIOServer(ServerAdapter): def run(self,handler): from socketio import server address = (self.host, self.port) server.SocketIOServer(address, handler, **self.options).serve_forever() class GunicornServer(ServerAdapter): """ Untested. See http://gunicorn.org/configure.html for options. """ def run(self, handler): from gunicorn.app.base import Application config = {'bind': "%s:%d" % (self.host, int(self.port))} config.update(self.options) class GunicornApplication(Application): def init(self, parser, opts, args): return config def load(self): return handler GunicornApplication().run() class EventletServer(ServerAdapter): """ Untested """ def run(self, handler): from eventlet import wsgi, listen try: wsgi.server(listen((self.host, self.port)), handler, log_output=(not self.quiet)) except TypeError: # Fallback, if we have old version of eventlet wsgi.server(listen((self.host, self.port)), handler) class RocketServer(ServerAdapter): """ Untested. """ def run(self, handler): from rocket import Rocket server = Rocket((self.host, self.port), 'wsgi', { 'wsgi_app' : handler }) server.start() class BjoernServer(ServerAdapter): """ Fast server written in C: https://github.com/jonashaag/bjoern """ def run(self, handler): from bjoern import run run(handler, self.host, self.port) class AutoServer(ServerAdapter): """ Untested. """ adapters = [WaitressServer, PasteServer, TwistedServer, CherryPyServer, CherootServer, WSGIRefServer] def run(self, handler): for sa in self.adapters: try: return sa(self.host, self.port, **self.options).run(handler) except ImportError: pass server_names = { 'cgi': CGIServer, 'flup': FlupFCGIServer, 'wsgiref': WSGIRefServer, 'waitress': WaitressServer, 'cherrypy': CherryPyServer, 'cheroot': CherootServer, 'paste': PasteServer, 'fapws3': FapwsServer, 'tornado': TornadoServer, 'gae': AppEngineServer, 'twisted': TwistedServer, 'diesel': DieselServer, 'meinheld': MeinheldServer, 'gunicorn': GunicornServer, 'eventlet': EventletServer, 'gevent': GeventServer, 'geventSocketIO':GeventSocketIOServer, 'rocket': RocketServer, 'bjoern' : BjoernServer, 'auto': AutoServer, } ############################################################################### # Application Control ########################################################## ############################################################################### def load(target, **namespace): """ Import a module or fetch an object from a module. * ``package.module`` returns `module` as a module object. * ``pack.mod:name`` returns the module variable `name` from `pack.mod`. * ``pack.mod:func()`` calls `pack.mod.func()` and returns the result. The last form accepts not only function calls, but any type of expression. Keyword arguments passed to this function are available as local variables. Example: ``import_string('re:compile(x)', x='[a-z]')`` """ module, target = target.split(":", 1) if ':' in target else (target, None) if module not in sys.modules: __import__(module) if not target: return sys.modules[module] if target.isalnum(): return getattr(sys.modules[module], target) package_name = module.split('.')[0] namespace[package_name] = sys.modules[package_name] return eval('%s.%s' % (module, target), namespace) def load_app(target): """ Load a bottle application from a module and make sure that the import does not affect the current default application, but returns a separate application object. See :func:`load` for the target parameter. """ global NORUN; NORUN, nr_old = True, NORUN try: tmp = default_app.push() # Create a new "default application" rv = load(target) # Import the target module return rv if callable(rv) else tmp finally: default_app.remove(tmp) # Remove the temporary added default application NORUN = nr_old _debug = debug def run(app=None, server='wsgiref', host='127.0.0.1', port=8080, interval=1, reloader=False, quiet=False, plugins=None, debug=None, **kargs): """ Start a server instance. This method blocks until the server terminates. :param app: WSGI application or target string supported by :func:`load_app`. (default: :func:`default_app`) :param server: Server adapter to use. See :data:`server_names` keys for valid names or pass a :class:`ServerAdapter` subclass. (default: `wsgiref`) :param host: Server address to bind to. Pass ``0.0.0.0`` to listens on all interfaces including the external one. (default: 127.0.0.1) :param port: Server port to bind to. Values below 1024 require root privileges. (default: 8080) :param reloader: Start auto-reloading server? (default: False) :param interval: Auto-reloader interval in seconds (default: 1) :param quiet: Suppress output to stdout and stderr? (default: False) :param options: Options passed to the server adapter. """ if NORUN: return if reloader and not os.environ.get('BOTTLE_CHILD'): try: lockfile = None fd, lockfile = tempfile.mkstemp(prefix='bottle.', suffix='.lock') os.close(fd) # We only need this file to exist. We never write to it while os.path.exists(lockfile): args = [sys.executable] + sys.argv environ = os.environ.copy() environ['BOTTLE_CHILD'] = 'true' environ['BOTTLE_LOCKFILE'] = lockfile p = subprocess.Popen(args, env=environ) while p.poll() is None: # Busy wait... os.utime(lockfile, None) # I am alive! time.sleep(interval) if p.poll() != 3: if os.path.exists(lockfile): os.unlink(lockfile) sys.exit(p.poll()) except KeyboardInterrupt: pass finally: if os.path.exists(lockfile): os.unlink(lockfile) return try: if debug is not None: _debug(debug) app = app or default_app() if isinstance(app, basestring): app = load_app(app) if not callable(app): raise ValueError("Application is not callable: %r" % app) for plugin in plugins or []: app.install(plugin) if server in server_names: server = server_names.get(server) if isinstance(server, basestring): server = load(server) if isinstance(server, type): server = server(host=host, port=port, **kargs) if not isinstance(server, ServerAdapter): raise ValueError("Unknown or unsupported server: %r" % server) server.quiet = server.quiet or quiet if not server.quiet: _stderr("Bottle v%s server starting up (using %s)...\n" % (__version__, repr(server))) _stderr("Listening on http://%s:%d/\n" % (server.host, server.port)) _stderr("Hit Ctrl-C to quit.\n\n") if reloader: lockfile = os.environ.get('BOTTLE_LOCKFILE') bgcheck = FileCheckerThread(lockfile, interval) with bgcheck: server.run(app) if bgcheck.status == 'reload': sys.exit(3) else: server.run(app) except KeyboardInterrupt: pass except (SystemExit, MemoryError): raise except: if not reloader: raise if not getattr(server, 'quiet', quiet): print_exc() time.sleep(interval) sys.exit(3) class FileCheckerThread(threading.Thread): ''' Interrupt main-thread as soon as a changed module file is detected, the lockfile gets deleted or gets to old. ''' def __init__(self, lockfile, interval): threading.Thread.__init__(self) self.lockfile, self.interval = lockfile, interval #: Is one of 'reload', 'error' or 'exit' self.status = None def run(self): exists = os.path.exists mtime = lambda path: os.stat(path).st_mtime files = dict() for module in list(sys.modules.values()): path = getattr(module, '__file__', '') or '' if path[-4:] in ('.pyo', '.pyc'): path = path[:-1] if path and exists(path): files[path] = mtime(path) while not self.status: if not exists(self.lockfile)\ or mtime(self.lockfile) < time.time() - self.interval - 5: self.status = 'error' thread.interrupt_main() for path, lmtime in list(files.items()): if not exists(path) or mtime(path) > lmtime: self.status = 'reload' thread.interrupt_main() break time.sleep(self.interval) def __enter__(self): self.start() def __exit__(self, exc_type, exc_val, exc_tb): if not self.status: self.status = 'exit' # silent exit self.join() return exc_type is not None and issubclass(exc_type, KeyboardInterrupt) ############################################################################### # Template Adapters ############################################################ ############################################################################### class TemplateError(HTTPError): def __init__(self, message): HTTPError.__init__(self, 500, message) class BaseTemplate(object): """ Base class and minimal API for template adapters """ extensions = ['tpl','html','thtml','stpl'] settings = {} #used in prepare() defaults = {} #used in render() def __init__(self, source=None, name=None, lookup=[], encoding='utf8', **settings): """ Create a new template. If the source parameter (str or buffer) is missing, the name argument is used to guess a template filename. Subclasses can assume that self.source and/or self.filename are set. Both are strings. The lookup, encoding and settings parameters are stored as instance variables. The lookup parameter stores a list containing directory paths. The encoding parameter should be used to decode byte strings or files. The settings parameter contains a dict for engine-specific settings. """ self.name = name self.source = source.read() if hasattr(source, 'read') else source self.filename = source.filename if hasattr(source, 'filename') else None self.lookup = [os.path.abspath(x) for x in lookup] self.encoding = encoding self.settings = self.settings.copy() # Copy from class variable self.settings.update(settings) # Apply if not self.source and self.name: self.filename = self.search(self.name, self.lookup) if not self.filename: raise TemplateError('Template %s not found.' % repr(name)) if not self.source and not self.filename: raise TemplateError('No template specified.') self.prepare(**self.settings) @classmethod def search(cls, name, lookup=[]): """ Search name in all directories specified in lookup. First without, then with common extensions. Return first hit. """ if not lookup: depr('The template lookup path list should not be empty.') #0.12 lookup = ['.'] if os.path.isabs(name) and os.path.isfile(name): depr('Absolute template path names are deprecated.') #0.12 return os.path.abspath(name) for spath in lookup: spath = os.path.abspath(spath) + os.sep fname = os.path.abspath(os.path.join(spath, name)) if not fname.startswith(spath): continue if os.path.isfile(fname): return fname for ext in cls.extensions: if os.path.isfile('%s.%s' % (fname, ext)): return '%s.%s' % (fname, ext) @classmethod def global_config(cls, key, *args): ''' This reads or sets the global settings stored in class.settings. ''' if args: cls.settings = cls.settings.copy() # Make settings local to class cls.settings[key] = args[0] else: return cls.settings[key] def prepare(self, **options): """ Run preparations (parsing, caching, ...). It should be possible to call this again to refresh a template or to update settings. """ raise NotImplementedError def render(self, *args, **kwargs): """ Render the template with the specified local variables and return a single byte or unicode string. If it is a byte string, the encoding must match self.encoding. This method must be thread-safe! Local variables may be provided in dictionaries (args) or directly, as keywords (kwargs). """ raise NotImplementedError class MakoTemplate(BaseTemplate): def prepare(self, **options): from mako.template import Template from mako.lookup import TemplateLookup options.update({'input_encoding':self.encoding}) options.setdefault('format_exceptions', bool(DEBUG)) lookup = TemplateLookup(directories=self.lookup, **options) if self.source: self.tpl = Template(self.source, lookup=lookup, **options) else: self.tpl = Template(uri=self.name, filename=self.filename, lookup=lookup, **options) def render(self, *args, **kwargs): for dictarg in args: kwargs.update(dictarg) _defaults = self.defaults.copy() _defaults.update(kwargs) return self.tpl.render(**_defaults) class CheetahTemplate(BaseTemplate): def prepare(self, **options): from Cheetah.Template import Template self.context = threading.local() self.context.vars = {} options['searchList'] = [self.context.vars] if self.source: self.tpl = Template(source=self.source, **options) else: self.tpl = Template(file=self.filename, **options) def render(self, *args, **kwargs): for dictarg in args: kwargs.update(dictarg) self.context.vars.update(self.defaults) self.context.vars.update(kwargs) out = str(self.tpl) self.context.vars.clear() return out class Jinja2Template(BaseTemplate): def prepare(self, filters=None, tests=None, globals={}, **kwargs): from jinja2 import Environment, FunctionLoader if 'prefix' in kwargs: # TODO: to be removed after a while raise RuntimeError('The keyword argument `prefix` has been removed. ' 'Use the full jinja2 environment name line_statement_prefix instead.') self.env = Environment(loader=FunctionLoader(self.loader), **kwargs) if filters: self.env.filters.update(filters) if tests: self.env.tests.update(tests) if globals: self.env.globals.update(globals) if self.source: self.tpl = self.env.from_string(self.source) else: self.tpl = self.env.get_template(self.filename) def render(self, *args, **kwargs): for dictarg in args: kwargs.update(dictarg) _defaults = self.defaults.copy() _defaults.update(kwargs) return self.tpl.render(**_defaults) def loader(self, name): fname = self.search(name, self.lookup) if not fname: return with open(fname, "rb") as f: return f.read().decode(self.encoding) class SimpleTemplate(BaseTemplate): def prepare(self, escape_func=html_escape, noescape=False, syntax=None, **ka): self.cache = {} enc = self.encoding self._str = lambda x: touni(x, enc) self._escape = lambda x: escape_func(touni(x, enc)) self.syntax = syntax if noescape: self._str, self._escape = self._escape, self._str @cached_property def co(self): return compile(self.code, self.filename or '', 'exec') @cached_property def code(self): source = self.source if not source: with open(self.filename, 'rb') as f: source = f.read() try: source, encoding = touni(source), 'utf8' except UnicodeError: depr('Template encodings other than utf8 are no longer supported.') #0.11 source, encoding = touni(source, 'latin1'), 'latin1' parser = StplParser(source, encoding=encoding, syntax=self.syntax) code = parser.translate() self.encoding = parser.encoding return code def _rebase(self, _env, _name=None, **kwargs): if _name is None: depr('Rebase function called without arguments.' ' You were probably looking for {{base}}?', True) #0.12 _env['_rebase'] = (_name, kwargs) def _include(self, _env, _name=None, **kwargs): if _name is None: depr('Rebase function called without arguments.' ' You were probably looking for {{base}}?', True) #0.12 env = _env.copy() env.update(kwargs) if _name not in self.cache: self.cache[_name] = self.__class__(name=_name, lookup=self.lookup) return self.cache[_name].execute(env['_stdout'], env) def execute(self, _stdout, kwargs): env = self.defaults.copy() env.update(kwargs) env.update({'_stdout': _stdout, '_printlist': _stdout.extend, 'include': functools.partial(self._include, env), 'rebase': functools.partial(self._rebase, env), '_rebase': None, '_str': self._str, '_escape': self._escape, 'get': env.get, 'setdefault': env.setdefault, 'defined': env.__contains__ }) eval(self.co, env) if env.get('_rebase'): subtpl, rargs = env.pop('_rebase') rargs['base'] = ''.join(_stdout) #copy stdout del _stdout[:] # clear stdout return self._include(env, subtpl, **rargs) return env def render(self, *args, **kwargs): """ Render the template using keyword arguments as local variables. """ env = {}; stdout = [] for dictarg in args: env.update(dictarg) env.update(kwargs) self.execute(stdout, env) return ''.join(stdout) class StplSyntaxError(TemplateError): pass class StplParser(object): ''' Parser for stpl templates. ''' _re_cache = {} #: Cache for compiled re patterns # This huge pile of voodoo magic splits python code into 8 different tokens. # 1: All kinds of python strings (trust me, it works) _re_tok = '([urbURB]?(?:\'\'(?!\')|""(?!")|\'{6}|"{6}' \ '|\'(?:[^\\\\\']|\\\\.)+?\'|"(?:[^\\\\"]|\\\\.)+?"' \ '|\'{3}(?:[^\\\\]|\\\\.|\\n)+?\'{3}' \ '|"{3}(?:[^\\\\]|\\\\.|\\n)+?"{3}))' _re_inl = _re_tok.replace('|\\n','') # We re-use this string pattern later # 2: Comments (until end of line, but not the newline itself) _re_tok += '|(#.*)' # 3,4: Open and close grouping tokens _re_tok += '|([\\[\\{\\(])' _re_tok += '|([\\]\\}\\)])' # 5,6: Keywords that start or continue a python block (only start of line) _re_tok += '|^([ \\t]*(?:if|for|while|with|try|def|class)\\b)' \ '|^([ \\t]*(?:elif|else|except|finally)\\b)' # 7: Our special 'end' keyword (but only if it stands alone) _re_tok += '|((?:^|;)[ \\t]*end[ \\t]*(?=(?:%(block_close)s[ \\t]*)?\\r?$|;|#))' # 8: A customizable end-of-code-block template token (only end of line) _re_tok += '|(%(block_close)s[ \\t]*(?=\\r?$))' # 9: And finally, a single newline. The 10th token is 'everything else' _re_tok += '|(\\r?\\n)' # Match the start tokens of code areas in a template _re_split = '(?m)^[ \t]*(\\\\?)((%(line_start)s)|(%(block_start)s))(%%?)' # Match inline statements (may contain python strings) _re_inl = '(?m)%%(inline_start)s((?:%s|[^\'"\n]*?)+)%%(inline_end)s' % _re_inl _re_tok = '(?m)' + _re_tok default_syntax = '<% %> % {{ }}' def __init__(self, source, syntax=None, encoding='utf8'): self.source, self.encoding = touni(source, encoding), encoding self.set_syntax(syntax or self.default_syntax) self.code_buffer, self.text_buffer = [], [] self.lineno, self.offset = 1, 0 self.indent, self.indent_mod = 0, 0 self.paren_depth = 0 def get_syntax(self): ''' Tokens as a space separated string (default: <% %> % {{ }}) ''' return self._syntax def set_syntax(self, syntax): self._syntax = syntax self._tokens = syntax.split() if not syntax in self._re_cache: names = 'block_start block_close line_start inline_start inline_end' etokens = map(re.escape, self._tokens) pattern_vars = dict(zip(names.split(), etokens)) patterns = (self._re_split, self._re_tok, self._re_inl) patterns = [re.compile(p%pattern_vars) for p in patterns] self._re_cache[syntax] = patterns self.re_split, self.re_tok, self.re_inl = self._re_cache[syntax] syntax = property(get_syntax, set_syntax) def translate(self): if self.offset: raise RuntimeError('Parser is a one time instance.') while True: m = self.re_split.search(self.source[self.offset:]) if m: text = self.source[self.offset:self.offset+m.start()] self.text_buffer.append(text) self.offset += m.end() if m.group(1): # New escape syntax line, sep, _ = self.source[self.offset:].partition('\n') self.text_buffer.append(m.group(2)+m.group(5)+line+sep) self.offset += len(line+sep)+1 continue elif m.group(5): # Old escape syntax depr('Escape code lines with a backslash.') #0.12 line, sep, _ = self.source[self.offset:].partition('\n') self.text_buffer.append(m.group(2)+line+sep) self.offset += len(line+sep)+1 continue self.flush_text() self.read_code(multiline=bool(m.group(4))) else: break self.text_buffer.append(self.source[self.offset:]) self.flush_text() return ''.join(self.code_buffer) def read_code(self, multiline): code_line, comment = '', '' while True: m = self.re_tok.search(self.source[self.offset:]) if not m: code_line += self.source[self.offset:] self.offset = len(self.source) self.write_code(code_line.strip(), comment) return code_line += self.source[self.offset:self.offset+m.start()] self.offset += m.end() _str, _com, _po, _pc, _blk1, _blk2, _end, _cend, _nl = m.groups() if (code_line or self.paren_depth > 0) and (_blk1 or _blk2): # a if b else c code_line += _blk1 or _blk2 continue if _str: # Python string code_line += _str elif _com: # Python comment (up to EOL) comment = _com if multiline and _com.strip().endswith(self._tokens[1]): multiline = False # Allow end-of-block in comments elif _po: # open parenthesis self.paren_depth += 1 code_line += _po elif _pc: # close parenthesis if self.paren_depth > 0: # we could check for matching parentheses here, but it's # easier to leave that to python - just check counts self.paren_depth -= 1 code_line += _pc elif _blk1: # Start-block keyword (if/for/while/def/try/...) code_line, self.indent_mod = _blk1, -1 self.indent += 1 elif _blk2: # Continue-block keyword (else/elif/except/...) code_line, self.indent_mod = _blk2, -1 elif _end: # The non-standard 'end'-keyword (ends a block) self.indent -= 1 elif _cend: # The end-code-block template token (usually '%>') if multiline: multiline = False else: code_line += _cend else: # \n self.write_code(code_line.strip(), comment) self.lineno += 1 code_line, comment, self.indent_mod = '', '', 0 if not multiline: break def flush_text(self): text = ''.join(self.text_buffer) del self.text_buffer[:] if not text: return parts, pos, nl = [], 0, '\\\n'+' '*self.indent for m in self.re_inl.finditer(text): prefix, pos = text[pos:m.start()], m.end() if prefix: parts.append(nl.join(map(repr, prefix.splitlines(True)))) if prefix.endswith('\n'): parts[-1] += nl parts.append(self.process_inline(m.group(1).strip())) if pos < len(text): prefix = text[pos:] lines = prefix.splitlines(True) if lines[-1].endswith('\\\\\n'): lines[-1] = lines[-1][:-3] elif lines[-1].endswith('\\\\\r\n'): lines[-1] = lines[-1][:-4] parts.append(nl.join(map(repr, lines))) code = '_printlist((%s,))' % ', '.join(parts) self.lineno += code.count('\n')+1 self.write_code(code) def process_inline(self, chunk): if chunk[0] == '!': return '_str(%s)' % chunk[1:] return '_escape(%s)' % chunk def write_code(self, line, comment=''): line, comment = self.fix_backward_compatibility(line, comment) code = ' ' * (self.indent+self.indent_mod) code += line.lstrip() + comment + '\n' self.code_buffer.append(code) def fix_backward_compatibility(self, line, comment): parts = line.strip().split(None, 2) if parts and parts[0] in ('include', 'rebase'): depr('The include and rebase keywords are functions now.') #0.12 if len(parts) == 1: return "_printlist([base])", comment elif len(parts) == 2: return "_=%s(%r)" % tuple(parts), comment else: return "_=%s(%r, %s)" % tuple(parts), comment if self.lineno <= 2 and not line.strip() and 'coding' in comment: m = re.match(r"#.*coding[:=]\s*([-\w.]+)", comment) if m: depr('PEP263 encoding strings in templates are deprecated.') #0.12 enc = m.group(1) self.source = self.source.encode(self.encoding).decode(enc) self.encoding = enc return line, comment.replace('coding','coding*') return line, comment def template(*args, **kwargs): ''' Get a rendered template as a string iterator. You can use a name, a filename or a template string as first parameter. Template rendering arguments can be passed as dictionaries or directly (as keyword arguments). ''' tpl = args[0] if args else None adapter = kwargs.pop('template_adapter', SimpleTemplate) lookup = kwargs.pop('template_lookup', TEMPLATE_PATH) tplid = (id(lookup), tpl) if tplid not in TEMPLATES or DEBUG: settings = kwargs.pop('template_settings', {}) if isinstance(tpl, adapter): TEMPLATES[tplid] = tpl if settings: TEMPLATES[tplid].prepare(**settings) elif "\n" in tpl or "{" in tpl or "%" in tpl or '$' in tpl: TEMPLATES[tplid] = adapter(source=tpl, lookup=lookup, **settings) else: TEMPLATES[tplid] = adapter(name=tpl, lookup=lookup, **settings) if not TEMPLATES[tplid]: abort(500, 'Template (%s) not found' % tpl) for dictarg in args[1:]: kwargs.update(dictarg) return TEMPLATES[tplid].render(kwargs) mako_template = functools.partial(template, template_adapter=MakoTemplate) cheetah_template = functools.partial(template, template_adapter=CheetahTemplate) jinja2_template = functools.partial(template, template_adapter=Jinja2Template) def view(tpl_name, **defaults): ''' Decorator: renders a template for a handler. The handler can control its behavior like that: - return a dict of template vars to fill out the template - return something other than a dict and the view decorator will not process the template, but return the handler result as is. This includes returning a HTTPResponse(dict) to get, for instance, JSON with autojson or other castfilters. ''' def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): result = func(*args, **kwargs) if isinstance(result, (dict, DictMixin)): tplvars = defaults.copy() tplvars.update(result) return template(tpl_name, **tplvars) elif result is None: return template(tpl_name, **defaults) return result return wrapper return decorator mako_view = functools.partial(view, template_adapter=MakoTemplate) cheetah_view = functools.partial(view, template_adapter=CheetahTemplate) jinja2_view = functools.partial(view, template_adapter=Jinja2Template) ############################################################################### # Constants and Globals ######################################################## ############################################################################### TEMPLATE_PATH = ['./', './views/'] TEMPLATES = {} DEBUG = False NORUN = False # If set, run() does nothing. Used by load_app() #: A dict to map HTTP status codes (e.g. 404) to phrases (e.g. 'Not Found') HTTP_CODES = httplib.responses HTTP_CODES[418] = "I'm a teapot" # RFC 2324 HTTP_CODES[422] = "Unprocessable Entity" # RFC 4918 HTTP_CODES[428] = "Precondition Required" HTTP_CODES[429] = "Too Many Requests" HTTP_CODES[431] = "Request Header Fields Too Large" HTTP_CODES[511] = "Network Authentication Required" _HTTP_STATUS_LINES = dict((k, '%d %s'%(k,v)) for (k,v) in HTTP_CODES.items()) #: The default template used for error pages. Override with @error() ERROR_PAGE_TEMPLATE = """ %%try: %%from %s import DEBUG, HTTP_CODES, request, touni Error: {{e.status}}

    Error: {{e.status}}

    Sorry, the requested URL {{repr(request.url)}} caused an error:

    {{e.body}}
    %%if DEBUG and e.exception:

    Exception:

    {{repr(e.exception)}}
    %%end %%if DEBUG and e.traceback:

    Traceback:

    {{e.traceback}}
    %%end %%except ImportError: ImportError: Could not generate the error page. Please add bottle to the import path. %%end """ % __name__ #: A thread-safe instance of :class:`LocalRequest`. If accessed from within a #: request callback, this instance always refers to the *current* request #: (even on a multithreaded server). request = LocalRequest() #: A thread-safe instance of :class:`LocalResponse`. It is used to change the #: HTTP response for the *current* request. response = LocalResponse() #: A thread-safe namespace. Not used by Bottle. local = threading.local() # Initialize app stack (create first empty Bottle app) # BC: 0.6.4 and needed for run() app = default_app = AppStack() app.push() #: A virtual package that redirects import statements. #: Example: ``import bottle.ext.sqlite`` actually imports `bottle_sqlite`. ext = _ImportRedirect('bottle.ext' if __name__ == '__main__' else __name__+".ext", 'bottle_%s').module if __name__ == '__main__': opt, args, parser = _cmd_options, _cmd_args, _cmd_parser if opt.version: _stdout('Bottle %s\n'%__version__) sys.exit(0) if not args: parser.print_help() _stderr('\nError: No application specified.\n') sys.exit(1) sys.path.insert(0, '.') sys.modules.setdefault('bottle', sys.modules['__main__']) host, port = (opt.bind or 'localhost'), 8080 if ':' in host and host.rfind(']') < host.rfind(':'): host, port = host.rsplit(':', 1) host = host.strip('[]') run(args[0], host=host, port=int(port), server=opt.server, reloader=opt.reload, plugins=opt.plugin, debug=opt.debug) # THE END mongo-c-driver-1.26.0/build/calc_release_version.py000066400000000000000000000374221456567454500223050ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2018-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # """ A script that calculates the release version number (based on the current Git branch and/or recent tags in history) to assign to a tarball generated from the current Git commit. This script needs to remain compatible with its target platforms, which currently includes RHEL 6, which uses Python 2.6! """ # XXX NOTE XXX NOTE XXX NOTE XXX # After modifying this script it is advisable to execute the self-tests in this directory: # - calc_release_version_selftest.sh # - calc_release_version_selftest.py # XXX NOTE XXX NOTE XXX NOTE XXX # pyright: reportTypeCommentUsage=false import datetime import errno import re import subprocess import optparse # No 'argparse' on Python 2.6 import sys class Version: def __init__(self, s): pat = r'(\d+)\.(\d+)\.(\d+)(\-\S+)?' match = re.match(pat, s) assert match, "Unrecognized version string %s" % s self.major, self.minor, self.micro = ( map(int, (match.group(1), match.group(2), match.group(3)))) if match.group(4): self.prerelease = match.group(4)[1:] else: self.prerelease = '' def __lt__(self, other): if self.major != other.major: return self.major < other.major if self.minor != other.minor: return self.minor < other.minor if self.micro != other.micro: return self.micro < other.micro if self.prerelease != other.prerelease: if self.prerelease != '' and other.prerelease == '': # Consider a prerelease less than non-prerelease. return True # For simplicity, compare prerelease versions lexicographically. return self.prerelease < other.prerelease # Versions are equal. return False def __eq__(self, other): self_tuple = self.major, self.minor, self.micro, self.prerelease other_tuple = other.major, other.minor, other.micro, other.prerelease return self_tuple == other_tuple def parse_version(ver): return Version(ver) parser = optparse.OptionParser(description=__doc__) parser.add_option("--debug", "-d", action="store_true", help="Enable debug output") parser.add_option("--previous", "-p", action="store_true", help="Calculate the previous version instead of the current") parser.add_option("--next-minor", action="store_true", help="Calculate the next minor version instead of the current") args, pos = parser.parse_args() assert not pos, "No positional arguments are expected" _DEBUG = args.debug # type: bool def debug(msg): # type: (str) -> None if _DEBUG: sys.stderr.write(msg) sys.stderr.write("\n") sys.stderr.flush() debug("Debugging output enabled.") # This option indicates we are to determine the previous release version PREVIOUS = args.previous # type: bool # This options indicates to output the next minor release version NEXT_MINOR = args.next_minor # type: bool # fmt: off PREVIOUS_TAG_RE = re.compile('(?P(?P[0-9]+)\\.(?P[0-9]+)' '\\.(?P[0-9]+)(?:-(?P.*))?)') RELEASE_TAG_RE = re.compile('(?P(?P[0-9]+)\\.(?P[0-9]+)' '\\.(?P[0-9]+)(?:-(?P.*))?)') RELEASE_BRANCH_RE = re.compile('(?:(?:refs/remotes/)?origin/)?(?Pr' '(?P[0-9]+)\\.(?P[0-9]+))') def check_output(args): # type: (list[str]) -> str """ Delegates to subprocess.check_output() if it is available, otherwise provides a reasonable facsimile. """ debug('Run command: {0}'.format(args)) try: proc = subprocess.Popen(args, stdout=subprocess.PIPE) except OSError as e: suppl = '' if e.errno == errno.ENOENT: suppl = 'Does the executable “{0}” not exist?'.format(args[0]) raise RuntimeError("Failed to execute subprocess {0}: {1} [{2}]".format(args, e, suppl)) out = proc.communicate()[0] ret = proc.poll() if ret: raise subprocess.CalledProcessError(ret, args[0]) # git isn't guaranteed to always return UTF-8, but for our purposes # this should be fine as tags and hashes should be ASCII only. out = out.decode('utf-8') return out def check_head_tag(): # type: () -> str | None """ Checks the current HEAD to see if it has been tagged with a tag that matches the pattern for a release tag. Returns release version calculated from the tag, or None if there is no matching tag associated with HEAD. """ found_tag = False version_str = '0.0.0' version_parsed = parse_version(version_str) # have git tell us if any tags that look like release tags point at HEAD; # based on our policy, a commit should never have more than one release tag tags = check_output(['git', 'tag', '--points-at', 'HEAD', '--list', '1.*']).split() tag = '' if len(tags) == 1: tag = tags[0] elif len(tags) > 1: raise Exception('Expected 1 or 0 tags on HEAD, got: {}'.format(tags)) release_tag_match = RELEASE_TAG_RE.match(tag) if release_tag_match: new_version_str = release_tag_match.group('ver') new_version_parsed = parse_version(new_version_str) if new_version_parsed > version_parsed: # type: ignore debug('HEAD release tag: ' + new_version_str) version_str = new_version_str version_parsed = new_version_parsed found_tag = True if found_tag: debug('Calculated version: ' + version_str) return version_str return None def get_next_minor(prerelease_marker): # type: (str) -> str """ get_next_minor does the following: - Inspect the branches that fit the convention for a release branch. - Choose the latest and increment the minor version. - Append .0 to form the new version (e.g., r1.21 becomes 1.22.0) - Append a pre-release marker. (e.g. 1.22.0 becomes 1.22.0-20220201+gitf6e6a7025d) """ version_str = '0.0.0' version_parsed = parse_version(version_str) version_new = {} # Use refs (not branches) to get local branches plus remote branches refs = check_output(['git', 'show-ref']).splitlines() for ref in refs: release_branch_match = RELEASE_BRANCH_RE.match(ref.split()[1]) if release_branch_match: # Construct a candidate version from this branch name version_new['major'] = int(release_branch_match.group('vermaj')) version_new['minor'] = int(release_branch_match.group('vermin')) + 1 version_new['patch'] = 0 version_new['prerelease'] = prerelease_marker new_version_str = str(version_new['major']) + '.' + \ str(version_new['minor']) + '.' + \ str(version_new['patch']) + '-' + \ version_new['prerelease'] new_version_parsed = parse_version(new_version_str) if new_version_parsed > version_parsed: # type: ignore version_str = new_version_str version_parsed = new_version_parsed debug('Found new best version "' + version_str \ + '" based on branch "' \ + release_branch_match.group('brname') + '"') return version_str def get_branch_tags(active_branch_name): # type: (str) -> list[str] """ Returns a list of tags corresponding to the current branch, which must not be master. If the specified branch is a release branch then return all tags based on the major/minor X.Y release version. If the specified branch is neither master nor a release branch, then walk backwards in history until the first tag matching the glob '1.*' and return that tag. """ if active_branch_name == 'master': raise Exception('this method is not meant to be called while on "master"') release_branch_match = RELEASE_BRANCH_RE.match(active_branch_name) if release_branch_match: # This is a release branch, so look for tags only on this branch tag_glob = release_branch_match.group('vermaj') + '.' \ + release_branch_match.group('vermin') + '.*' return check_output(['git', 'tag', '--list', tag_glob]).splitlines() # Not a release branch, so look for the most recent tag in history commits = check_output(['git', 'log', '--pretty=format:%H', '--no-merges']) tags_by_obj = get_object_tags() for commit in commits.splitlines(): got = tags_by_obj.get(commit) if got: return got # No tags return [] def iter_tag_lines(): """ Generate a list of pairs of strings, where the first is a commit hash, and the second is a tag that is associated with that commit. Duplicate commits are possible. """ output = check_output(['git', 'tag', '--list', '1.*', '--format=%(*objectname)|%(tag)']) lines = output.splitlines() for l in lines: obj, tag = l.split('|', 1) if tag: yield obj, tag def get_object_tags(): # type: () -> dict[str, list[str]] """ Obtain a mapping between commit hashes and a list of tags that point to that commit. Untagged commits will not be included in the resulting map. """ ret = {} # type: dict[str, list[str]] for obj, tag in iter_tag_lines(): ret.setdefault(obj, []).append(tag) return ret def process_and_sort_tags(tags): # type: (list[str]) -> list[str] """ Given a string (as returned from get_branch_tags), return a sorted list of zero or more tags (sorted based on the Version comparison) which meet the following criteria: - a final release tag (i.e., 1.x.y without any pre-release suffix) - a pre-release tag which is not superseded by a release tag (i.e., 1.x.y-preX iff 1.x.y does not already exist) """ processed_and_sorted_tags = [] # type: list[str] if not tags or len(tags) == 0: return processed_and_sorted_tags # find all the final release tags for tag in tags: release_tag_match = RELEASE_TAG_RE.match(tag) if release_tag_match and not release_tag_match.group('verpre'): processed_and_sorted_tags.append(tag) # collect together final release tags and pre-release tags for # versions that have not yet had a final release for tag in tags: tag_parts = tag.split('-') if len(tag_parts) >= 2 and tag_parts[0] not in processed_and_sorted_tags: processed_and_sorted_tags.append(tag) processed_and_sorted_tags.sort(key=Version) # type: ignore return processed_and_sorted_tags def main(): """ The algorithm is roughly: - Is the --next-minor flag passed? If "yes", then return the next minor release with a pre-release marker. - Is the current HEAD associated with a tag that looks like a release version? - If "yes" then use that as the version - If "no" then is the current branch master? - If "yes" the current branch is master, then return the next minor release with a pre-release marker. - If "no" the current branch is not master, then determine the most recent tag in history; strip any pre-release marker, increment the patch version, and append a new pre-release marker """ version_str = '0.0.0' version_parsed = parse_version(version_str) head_commit_short = check_output(['git', 'rev-parse', '--revs-only', '--short=10', 'HEAD^{commit}']).strip() prerelease_marker = datetime.date.today().strftime('%Y%m%d') \ + '+git' + head_commit_short if NEXT_MINOR: debug('Calculating next minor release') return get_next_minor(prerelease_marker) head_tag_ver = check_head_tag() if head_tag_ver: return head_tag_ver active_branch_name = check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).strip() debug('Calculating release version for branch: ' + active_branch_name) if active_branch_name == 'master': return get_next_minor(prerelease_marker) branch_tags = get_branch_tags(active_branch_name) tags = process_and_sort_tags(branch_tags) tag = tags[-1] if len(tags) > 0 else '' # at this point the RE match is redundant, but convenient for accessing # the components of the version string release_tag_match = RELEASE_TAG_RE.match(tag) if release_tag_match: version_new = {} version_new['major'] = int(release_tag_match.group('vermaj')) version_new['minor'] = int(release_tag_match.group('vermin')) version_new['patch'] = int(release_tag_match.group('verpatch')) + 1 version_new['prerelease'] = prerelease_marker new_version_str = str(version_new['major']) + '.' + \ str(version_new['minor']) + '.' + \ str(version_new['patch']) + '-' + \ version_new['prerelease'] new_version_parsed = parse_version(new_version_str) if new_version_parsed > version_parsed: # type: ignore version_str = new_version_str version_parsed = new_version_parsed debug('Found new best version "' + version_str \ + '" from tag "' + release_tag_match.group('ver') + '"') return version_str def previous(rel_ver): # type: (str) -> str """ Given a release version, find the previous version based on the latest Git tag that is strictly a lower version than the given release version. """ debug('Calculating previous release version (option -p was specified).') version_str = '0.0.0' version_parsed = parse_version(version_str) rel_ver_str = rel_ver rel_ver_parsed = parse_version(rel_ver_str) tags = check_output(['git', 'tag', '--list', '1.*']).splitlines() processed_and_sorted_tags = process_and_sort_tags(tags) for tag in processed_and_sorted_tags: previous_tag_match = PREVIOUS_TAG_RE.match(tag) if previous_tag_match: version_new = {} version_new['major'] = int(previous_tag_match.group('vermaj')) version_new['minor'] = int(previous_tag_match.group('vermin')) version_new['patch'] = int(previous_tag_match.group('verpatch')) version_new['prerelease'] = previous_tag_match.group('verpre') new_version_str = str(version_new['major']) + '.' + \ str(version_new['minor']) + '.' + \ str(version_new['patch']) if version_new['prerelease'] is not None: new_version_str += '-' + version_new['prerelease'] new_version_parsed = parse_version(new_version_str) if new_version_parsed < rel_ver_parsed and new_version_parsed > version_parsed: # type: ignore version_str = new_version_str version_parsed = new_version_parsed debug('Found new best version "' + version_str \ + '" from tag "' + tag + '"') return version_str if __name__ == "__main__": RELEASE_VER = previous(main()) if PREVIOUS else main() debug('Final calculated release version:') print(RELEASE_VER) mongo-c-driver-1.26.0/build/calc_release_version_selftest.py000066400000000000000000000062141456567454500242110ustar00rootroot00000000000000import unittest import calc_release_version class TestVersionSort(unittest.TestCase): def test_version_sort(self): # At time of writing, `input_tags` is the output of `git tag -l "1.*"`: input_tags = ["1.0.0", "1.0.2", "1.1.0", "1.1.0-rc0", "1.1.10", "1.1.11", "1.1.2", "1.1.4", "1.1.5", "1.1.6", "1.1.7", "1.1.8", "1.1.9", "1.10.0", "1.10.1", "1.10.2", "1.10.3", "1.11.0", "1.12.0", "1.13.0", "1.13.1", "1.14.0", "1.14.1", "1.15.0", "1.15.1", "1.15.2", "1.15.3", "1.16.0", "1.16.1", "1.16.2", "1.17.0", "1.17.0-beta", "1.17.0-beta2", "1.17.0-rc0", "1.17.1", "1.17.2", "1.17.3", "1.17.4", "1.17.5", "1.17.6", "1.17.7", "1.18.0", "1.18.0-alpha", "1.18.0-alpha2", "1.19.0", "1.19.1", "1.19.2", "1.2.0", "1.2.0-beta", "1.2.0-beta1", "1.2.0-rc0", "1.2.1", "1.2.2", "1.2.3", "1.2.4", "1.20.0", "1.20.1", "1.21.0", "1.21.1", "1.21.2", "1.22.0", "1.22.0-beta0", "1.22.1", "1.22.2", "1.23.0", "1.23.1", "1.23.2", "1.23.3", "1.23.4", "1.23.5", "1.24.0", "1.24.1", "1.24.2", "1.24.3", "1.24.4", "1.3.0", "1.3.0-beta0", "1.3.0-rc0", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.4.0", "1.4.0-beta0", "1.4.0-beta1", "1.4.1", "1.4.2", "1.4.3", "1.5.0", "1.5.0-rc0", "1.5.0-rc1", "1.5.0-rc2", "1.5.0-rc3", "1.5.0-rc4", "1.5.0-rc6", "1.5.1", "1.5.2", "1.5.3", "1.5.4", "1.5.5", "1.6.0", "1.6.0-rc0", "1.6.1", "1.6.2", "1.6.3", "1.7.0", "1.7.0-rc0", "1.7.0-rc1", "1.7.0-rc2", "1.8.0", "1.8.0-rc0", "1.8.0-rc1", "1.8.1", "1.8.2", "1.9.0", "1.9.0+dfsg", "1.9.0-rc0", "1.9.0-rc1", "1.9.1", "1.9.2", "1.9.2+dfsg", "1.9.3", "1.9.3+dfsg", "1.9.4", "1.9.4+dfsg", "1.9.5", "1.9.5+dfsg"] expected_tags = ['1.0.0', '1.0.2', '1.1.0-rc0', '1.1.0', '1.1.2', '1.1.4', '1.1.5', '1.1.6', '1.1.7', '1.1.8', '1.1.9', '1.1.10', '1.1.11', '1.2.0-beta', '1.2.0-beta1', '1.2.0-rc0', '1.2.0', '1.2.1', '1.2.2', '1.2.3', '1.2.4', '1.3.0-beta0', '1.3.0-rc0', '1.3.0', '1.3.1', '1.3.2', '1.3.3', '1.3.4', '1.3.5', '1.3.6', '1.4.0-beta0', '1.4.0-beta1', '1.4.0', '1.4.1', '1.4.2', '1.4.3', '1.5.0-rc0', '1.5.0-rc1', '1.5.0-rc2', '1.5.0-rc3', '1.5.0-rc4', '1.5.0-rc6', '1.5.0', '1.5.1', '1.5.2', '1.5.3', '1.5.4', '1.5.5', '1.6.0-rc0', '1.6.0', '1.6.1', '1.6.2', '1.6.3', '1.7.0-rc0', '1.7.0-rc1', '1.7.0-rc2', '1.7.0', '1.8.0-rc0', '1.8.0-rc1', '1.8.0', '1.8.1', '1.8.2', '1.9.0-rc0', '1.9.0-rc1', '1.9.0', '1.9.0+dfsg', '1.9.1', '1.9.2', '1.9.2+dfsg', '1.9.3', '1.9.3+dfsg', '1.9.4', '1.9.4+dfsg', '1.9.5', '1.9.5+dfsg', '1.10.0', '1.10.1', '1.10.2', '1.10.3', '1.11.0', '1.12.0', '1.13.0', '1.13.1', '1.14.0', '1.14.1', '1.15.0', '1.15.1', '1.15.2', '1.15.3', '1.16.0', '1.16.1', '1.16.2', '1.17.0-beta', '1.17.0-beta2', '1.17.0-rc0', '1.17.0', '1.17.1', '1.17.2', '1.17.3', '1.17.4', '1.17.5', '1.17.6', '1.17.7', '1.18.0-alpha', '1.18.0-alpha2', '1.18.0', '1.19.0', '1.19.1', '1.19.2', '1.20.0', '1.20.1', '1.21.0', '1.21.1', '1.21.2', '1.22.0-beta0', '1.22.0', '1.22.1', '1.22.2', '1.23.0', '1.23.1', '1.23.2', '1.23.3', '1.23.4', '1.23.5', '1.24.0', '1.24.1', '1.24.2', '1.24.3', '1.24.4'] got_tags = sorted(input_tags, key=calc_release_version.Version) self.assertEqual(got_tags, expected_tags) if __name__ == "__main__": unittest.main() mongo-c-driver-1.26.0/build/calc_release_version_selftest.sh000077500000000000000000000053271456567454500242020ustar00rootroot00000000000000#!/bin/bash # calc_release_version_selftest.sh is used to test output of calc_release_version.py. # run with: # cd build # ./calc_release_version_selftest.sh set -o errexit set -o pipefail function assert_eq () { a="$1" b="$2" if [[ "$a" != "$b" ]]; then echo "Assertion failed: $a != $b" # Print caller caller exit 1 fi } SAVED_REF=$(git rev-parse HEAD) function cleanup () { [[ -e calc_release_version_test.py ]] && rm calc_release_version_test.py git checkout $SAVED_REF --quiet } trap cleanup EXIT : ${PYTHON_INTERP:=python} if [[ -z $(command -v "${PYTHON_INTERP}") ]]; then echo "Python interpreter '${PYTHON_INTERP}' is not valid." echo "Set the PYTHON_INTERP environment variable to a valid interpreter." exit 1 fi # copy calc_release_version.py to a separate file not tracked by git so it does not change on `git checkout` cp calc_release_version.py calc_release_version_test.py echo "Test a tagged commit ... begin" { git checkout 1.23.4 --quiet got=$("${PYTHON_INTERP}" calc_release_version_test.py --debug) assert_eq "$got" "1.23.4" got=$("${PYTHON_INTERP}" calc_release_version_test.py --debug -p) assert_eq "$got" "1.23.3" git checkout - --quiet } echo "Test a tagged commit ... end" DATE=$(date +%Y%m%d) echo "Test an untagged commit ... begin" { # 42a818429d6d586a6abf22367ac6fea1e9ce3f2c is commit before 1.23.4 git checkout 42a818429d6d586a6abf22367ac6fea1e9ce3f2c --quiet got=$("${PYTHON_INTERP}" calc_release_version_test.py --debug) assert_eq "$got" "1.23.4-$DATE+git42a818429d" got=$("${PYTHON_INTERP}" calc_release_version_test.py --debug -p) assert_eq "$got" "1.23.4" git checkout - --quiet } echo "Test an untagged commit ... end" echo "Test next minor version ... begin" { CURRENT_SHORTREF=$(git rev-parse --revs-only --short=10 HEAD) got=$("${PYTHON_INTERP}" calc_release_version_test.py --debug --next-minor) # XXX NOTE XXX NOTE XXX # If you find yourself looking at this line because the assertion below # failed, then it is probably because a new major/minor release was made. # Update the expected output to represent the correct next version. # XXX NOTE XXX NOTE XXX assert_eq "$got" "1.25.0-$DATE+git$CURRENT_SHORTREF" got=$("${PYTHON_INTERP}" calc_release_version_test.py --debug --next-minor -p) # XXX NOTE XXX NOTE XXX # If you find yourself looking at this line because the assertion below # failed, then it is probably because a new major/minor release was made. # Update the expected output to represent the correct next version. # XXX NOTE XXX NOTE XXX assert_eq "$got" "1.24.4" } echo "Test next minor version ... end" echo "All tests passed" mongo-c-driver-1.26.0/build/cmake/000077500000000000000000000000001456567454500166345ustar00rootroot00000000000000mongo-c-driver-1.26.0/build/cmake/.gitignore000066400000000000000000000002121456567454500206170ustar00rootroot00000000000000libmongoc-1.0-config.cmake libmongoc-1.0-config-version.cmake libmongoc-static-1.0-config.cmake libmongoc-static-1.0-config-version.cmake mongo-c-driver-1.26.0/build/cmake/BuildVersion.cmake000066400000000000000000000042401456567454500222430ustar00rootroot00000000000000include_guard(GLOBAL) include(MongoSettings) # We use Python to calculate the BUILD_VERSION value find_package(Python COMPONENTS Interpreter) set(_CALC_VERSION_PY "${CMAKE_CURRENT_LIST_DIR}/../calc_release_version.py") #[[ Attempts to find the current build version string. If VERSION_CURRENT exists in the current source directory, uses that. Otherwise, runs calc_release_version.py to compute the version from the Git history. The computed build version is set in the parent scope according to `outvar`. ]] function(compute_build_version outvar) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) # If it is present, defer to the VERSION_CURRENT file: set(ver_cur_file "${CMAKE_CURRENT_SOURCE_DIR}/VERSION_CURRENT") if(EXISTS "${ver_cur_file}") message(DEBUG "Using existing VERSION_CURRENT file as BUILD_VERSION [${ver_cur_file}]") file(READ "${ver_cur_file}" version) set("${outvar}" "${version}" PARENT_SCOPE) return() endif() # Otherwise, we require Python: if(NOT TARGET Python::Interpreter) message(WARNING "No default build version could be calculated (Python was not found)") set("${outvar}" "0.0.0-unknown+no-python-found") return() endif() get_target_property(py Python::Interpreter IMPORTED_LOCATION) message(STATUS "Computing the current release version...") execute_process( COMMAND "${py}" "${_CALC_VERSION_PY}" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE output RESULT_VARIABLE retc OUTPUT_STRIP_TRAILING_WHITESPACE ) if(retc) message(FATAL_ERROR "Computing the build version failed! [${retc}]:\n${out}") endif() message(DEBUG "calc_release_version.py returned output: “${output}”") set("${outvar}" "${output}" PARENT_SCOPE) endfunction() # Compute the BUILD_VERSION if it is not already defined: if(NOT DEFINED BUILD_VERSION) compute_build_version(BUILD_VERSION) endif() # Set a BUILD_VERSION_SIMPLE, which is just a three-number-triple that CMake understands string (REGEX REPLACE "([0-9]+\\.[0-9]+\\.[0-9]+).*$" "\\1" BUILD_VERSION_SIMPLE "${BUILD_VERSION}") mongo-c-driver-1.26.0/build/cmake/CCache.cmake000066400000000000000000000036161456567454500207520ustar00rootroot00000000000000#[[ This module enables Ccache support by inserting a ccache executable as the compiler launcher for C and C++ if there is a ccache executable availbale on the system. Ccache support will be automatically enabled if it is found on the system. Ccache can be forced on or off by setting the MONGO_USE_CCACHE CMake option to ON or OFF. ]] # Find and enable ccache for compiling find_program (CCACHE_EXECUTABLE ccache) if (CCACHE_EXECUTABLE AND NOT DEFINED MONGO_USE_CCACHE) message (STATUS "Found Ccache: ${CCACHE_EXECUTABLE}") execute_process( COMMAND "${CCACHE_EXECUTABLE}" --version OUTPUT_VARIABLE _out OUTPUT_STRIP_TRAILING_WHITESPACE ) set (_enable TRUE) # Avoid spurious "ccache.conf: No such file or directory" errors due to # ccache being invoked in parallel, which was patched in ccache version 3.4.3. if (_out MATCHES "^ccache version ([0-9]+\\.[0-9]+\\.[0-9]+)") set (_version "${CMAKE_MATCH_1}") message (STATUS "Detected Ccache version: ${_version}") if (_version VERSION_LESS "3.4.3") message (STATUS "Not using Ccache: Detected Ccache version ${_version} " "is less than 3.4.3, which may lead to spurious failures " "when run in parallel. See https://github.com/ccache/ccache/issues/260 " "for more information.") set (_enable FALSE) endif () else () message (STATUS "Note: Unable to automatically detect Ccache from from output: [[${_out}]]") endif () option (MONGO_USE_CCACHE "Use Ccache when compiling" "${_enable}") endif () if (MONGO_USE_CCACHE) message (STATUS "Compiling with Ccache enabled. Disable by setting MONGO_USE_CCACHE to OFF") set (CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_EXECUTABLE}") set (CMAKE_C_COMPILER_LAUNCHER "${CCACHE_EXECUTABLE}") endif () mongo-c-driver-1.26.0/build/cmake/CheckSchedGetCPU.cmake000066400000000000000000000003121456567454500226260ustar00rootroot00000000000000include (CheckSymbolExists) check_symbol_exists (sched_getcpu sched.h HAVE_SCHED_GETCPU) if (HAVE_SCHED_GETCPU) set (MONGOC_HAVE_SCHED_GETCPU 1) else () set (MONGOC_HAVE_SCHED_GETCPU 0) endif () mongo-c-driver-1.26.0/build/cmake/FindLibreSSL.cmake000066400000000000000000000157211456567454500220640ustar00rootroot00000000000000#[=======================================================================[ Copyright (c) 2019 John Norrbin Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. FindLibreSSL ------------ Find the LibreSSL encryption library. Optional Components ^^^^^^^^^^^^^^^^^^^ This module supports two optional components: SSL and TLS. Both components have associated imported targets, as described below. Imported Targets ^^^^^^^^^^^^^^^^ This module defines the following imported targets: LibreSSL::Crypto The LibreSSL crypto library, if found. LibreSSL::SSL The LibreSSL ssl library, if found. Requires and includes LibreSSL::Crypto automatically. LibreSSL::TLS The LibreSSL tls library, if found. Requires and includes LibreSSL::SSL and LibreSSL::Crypto automatically. Result Variables ^^^^^^^^^^^^^^^^ This module will set the following variables in your project: LIBRESSL_FOUND System has the LibreSSL library. If no components are requested it only requires the crypto library. LIBRESSL_INCLUDE_DIR The LibreSSL include directory. LIBRESSL_CRYPTO_LIBRARY The LibreSSL crypto library. LIBRESSL_SSL_LIBRARY The LibreSSL SSL library. LIBRESSL_TLS_LIBRARY The LibreSSL TLS library. LIBRESSL_LIBRARIES All LibreSSL libraries. LIBRESSL_VERSION This is set to $major.$minor.$revision (e.g. 2.6.8). Hints ^^^^^ Set LIBRESSL_ROOT_DIR to the root directory of an LibreSSL installation. XXX: Note! This file differs somewhat from the upstream FindLibreSSL and has been modified with fixes used by mongo-c-driver. Such differences are noted where they appear. ]=======================================================================] INCLUDE(FindPackageHandleStandardArgs) # Set Hints set(_LIBRESSL_ROOT_HINTS ${LIBRESSL_ROOT_DIR} ENV LIBRESSL_ROOT_DIR ) # Set Paths if (WIN32) file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles) set(_LIBRESSL_ROOT_PATHS "${_programfiles}/LibreSSL" ) unset(_programfiles) else() set(_LIBRESSL_ROOT_PATHS "/usr/local/" ) endif() # Combine set(_LIBRESSL_ROOT_HINTS_AND_PATHS HINTS ${_LIBRESSL_ROOT_HINTS} PATHS ${_LIBRESSL_ROOT_PATHS} # XXX: Changed from upstream FindLibreSSL: # Some platforms (e.g. Arch) install LibreSSL in a qualified path so as not to # collide with OpenSSL. Add path suffixies that match such distributions PATH_SUFFIXES include lib libressl libressl/include libressl/lib ) # Find Include Path find_path(LIBRESSL_INCLUDE_DIR NAMES tls.h ${_LIBRESSL_ROOT_HINTS_AND_PATHS} ) # Find Crypto Library find_library(LIBRESSL_CRYPTO_LIBRARY NAMES libcrypto crypto NAMES_PER_DIR ${_LIBRESSL_ROOT_HINTS_AND_PATHS} ) # Find SSL Library find_library(LIBRESSL_SSL_LIBRARY NAMES libssl ssl NAMES_PER_DIR ${_LIBRESSL_ROOT_HINTS_AND_PATHS} ) # Find TLS Library find_library(LIBRESSL_TLS_LIBRARY NAMES libtls tls NAMES_PER_DIR ${_LIBRESSL_ROOT_HINTS_AND_PATHS} ) # Set Libraries set(LIBRESSL_LIBRARIES ${LIBRESSL_CRYPTO_LIBRARY} ${LIBRESSL_SSL_LIBRARY} ${LIBRESSL_TLS_LIBRARY}) # Mark Variables As Advanced mark_as_advanced(LIBRESSL_INCLUDE_DIR LIBRESSL_LIBRARIES LIBRESSL_CRYPTO_LIBRARY LIBRESSL_SSL_LIBRARY LIBRESSL_TLS_LIBRARY) # Find Version File if(LIBRESSL_INCLUDE_DIR AND EXISTS "${LIBRESSL_INCLUDE_DIR}/openssl/opensslv.h") # Get Version From File file(STRINGS "${LIBRESSL_INCLUDE_DIR}/openssl/opensslv.h" OPENSSLV.H REGEX "#define LIBRESSL_VERSION_TEXT[ \t]+\".*\"") # XXX: The above line differs from upstream FindLibreSSL, which does not contain the "\t" regex element. # Newer LibreSSL uses a tab character at this point in the file, which otherwise causes the above # regex to fail. Newer LibreSSL versions ship full config-file packages, with will remove the # need to use this file. # Match Version String string(REGEX REPLACE ".*\".*([0-9]+)\\.([0-9]+)\\.([0-9]+)\"" "\\1;\\2;\\3" LIBRESSL_VERSION_LIST "${OPENSSLV.H}") # Split Parts list(GET LIBRESSL_VERSION_LIST 0 LIBRESSL_VERSION_MAJOR) list(GET LIBRESSL_VERSION_LIST 1 LIBRESSL_VERSION_MINOR) list(GET LIBRESSL_VERSION_LIST 2 LIBRESSL_VERSION_REVISION) # Set Version String set(LIBRESSL_VERSION "${LIBRESSL_VERSION_MAJOR}.${LIBRESSL_VERSION_MINOR}.${LIBRESSL_VERSION_REVISION}") endif() # Set Find Package Arguments find_package_handle_standard_args(LibreSSL REQUIRED_VARS LIBRESSL_CRYPTO_LIBRARY LIBRESSL_INCLUDE_DIR VERSION_VAR LIBRESSL_VERSION HANDLE_COMPONENTS FAIL_MESSAGE "Could NOT find LibreSSL, try setting the path to LibreSSL using the LIBRESSL_ROOT_DIR environment variable" ) # LibreSSL Found if(LIBRESSL_FOUND) # Set LibreSSL::Crypto if(NOT TARGET LibreSSL::Crypto AND EXISTS "${LIBRESSL_CRYPTO_LIBRARY}") # Add Library add_library(LibreSSL::Crypto UNKNOWN IMPORTED) # Set Properties set_target_properties( LibreSSL::Crypto PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBRESSL_INCLUDE_DIR}" IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION "${LIBRESSL_CRYPTO_LIBRARY}" ) endif() # LibreSSL::Crypto # Set LibreSSL::SSL if(NOT TARGET LibreSSL::SSL AND EXISTS "${LIBRESSL_SSL_LIBRARY}") # Add Library add_library(LibreSSL::SSL UNKNOWN IMPORTED) # Set Properties set_target_properties( LibreSSL::SSL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBRESSL_INCLUDE_DIR}" IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION "${LIBRESSL_SSL_LIBRARY}" INTERFACE_LINK_LIBRARIES LibreSSL::Crypto ) endif() # LibreSSL::SSL # Set LibreSSL::TLS if(NOT TARGET LibreSSL::TLS AND EXISTS "${LIBRESSL_TLS_LIBRARY}") add_library(LibreSSL::TLS UNKNOWN IMPORTED) set_target_properties( LibreSSL::TLS PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBRESSL_INCLUDE_DIR}" IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION "${LIBRESSL_TLS_LIBRARY}" INTERFACE_LINK_LIBRARIES LibreSSL::SSL ) endif() # LibreSSL::TLS endif(LIBRESSL_FOUND) mongo-c-driver-1.26.0/build/cmake/FindSASL2.cmake000066400000000000000000000055341456567454500212720ustar00rootroot00000000000000#[[ Searches for a Cyrus "libsasl2" library available on the system. Upon success, Defines an imported target `SASL2::SASL2` that can be linked into other targts. ]] include(FindPackageHandleStandardArgs) # Upon early return, tell the caller that we don't have it: set(SASL2_FOUND FALSE) if(SASL2_FIND_COMPONENTS) message(FATAL_ERROR "This find_package(SASL2) does not support package components (Got “${SASL2_FIND_COMPONENTS}”)") endif() list(APPEND SASL2_PATHS C:/sasl) # Search for the proper qualified path , not sasl.h find_path( SASL2_INCLUDE_DIR "sasl/sasl.h" DOC "Header include-directory for Cyrus libsasl2" HINTS ${SASL2_HINTS} PATHS ${SASL2_PREFIX} ${SASL2_ROOT_DIR} ${SASL2_PATHS} PATH_SUFFIXES include ) # Use the header path as a hint for the library path: unset(_hint) if(SASL2_INCLUDE_DIR) get_filename_component(_hint "${SASL2_INCLUDE_DIR}" DIRECTORY) endif() # The library filename is libsasl2.so, libsasl.dylib, etc. find_library( SASL2_LIBRARY sasl2 DOC "Library file for Cyrus libsasl2" HINTS ${_hint} ${SASL2_HINTS} PATHS ${SASL2_PREFIX} ${SASL2_ROOT_DIR} ${SASL2_PATHS} PATH_SUFFIXES lib ) if(SASL2_INCLUDE_DIR) message(DEBUG "Found SASL2 include-dir: ${SASL2_INCLUDE_DIR}") # Extract the library version from the sasl.h header file: file(READ "${SASL2_INCLUDE_DIR}/sasl/sasl.h" _sasl_h) # It is defined via three macro definitions: string(CONCAT _version_regex "define[ \t]+SASL_VERSION_MAJOR[ \t]+([0-9]+).+" "define[ \t]+SASL_VERSION_MINOR[ \t]+([0-9]+).+" "define[ \t]+SASL_VERSION_STEP[ \t]+([0-9]+)" ) if(NOT _sasl_h MATCHES "${_version_regex}") # Very strange... set(SASL2_NOT_FOUND_MESSAGE [[A sasl/sasl.h file was found, but we could not extract version information]]) else() set(SASL2_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") message(DEBUG "Found libsasl2 version from sasl.h: ${SASL2_VERSION}") endif() endif() find_package_handle_standard_args(SASL2 REQUIRED_VARS SASL2_VERSION SASL2_INCLUDE_DIR SASL2_LIBRARY VERSION_VAR SASL2_VERSION ) if(NOT SASL2_FOUND) return() endif() message(DEBUG "Found SASL2 library: ${SASL2_LIBRARY}") # Generate an imported target based on the paths that we found. if(NOT TARGET SASL2::SASL2) # (Guard against double-import) add_library(SASL2::SASL2 IMPORTED UNKNOWN GLOBAL) endif() set_target_properties(SASL2::SASL2 PROPERTIES IMPORTED_LOCATION "${SASL2_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${SASL2_INCLUDE_DIR}" INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${SASL2_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "" # Clear this property in case of double-import VERSION "${SASL2_VERSION}" ) # libsasl2 requires dlopen(): set_property(TARGET SASL2::SASL2 APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${CMAKE_DL_LIBS}) mongo-c-driver-1.26.0/build/cmake/FindSnappy.cmake000066400000000000000000000036641456567454500217220ustar00rootroot00000000000000include (CheckSymbolExists) # Allow old "SYSTEM" option but prefer ON/AUTO/OFF. if (NOT ENABLE_SNAPPY MATCHES "ON|SYSTEM|AUTO|OFF") message (FATAL_ERROR "ENABLE_SNAPPY option must be ON, AUTO, or OFF") endif () if (NOT ENABLE_SNAPPY STREQUAL OFF) message (STATUS "Searching for compression library header snappy-c.h") find_path ( SNAPPY_INCLUDE_DIRS NAMES snappy-c.h PATHS /include /usr/include /usr/local/include /usr/share/include /opt/include c:/snappy/include DOC "Searching for snappy-c.h") if (NOT SNAPPY_INCLUDE_DIRS) if (ENABLE_SNAPPY MATCHES "ON|SYSTEM") message (FATAL_ERROR " Not found (specify -DCMAKE_INCLUDE_PATH=/path/to/snappy/include for Snappy compression)") else () message (STATUS " Not found (specify -DCMAKE_INCLUDE_PATH=/path/to/snappy/include for Snappy compression)") endif () else () message (STATUS " Found in ${SNAPPY_INCLUDE_DIRS}") message (STATUS "Searching for libsnappy") find_library ( SNAPPY_LIBRARIES NAMES snappy PATHS /usr/lib /lib /usr/local/lib /usr/share/lib /opt/lib /opt/share/lib /var/lib c:/snappy/lib DOC "Searching for libsnappy") if (SNAPPY_LIBRARIES) message (STATUS " Found ${SNAPPY_LIBRARIES}") else () if (ENABLE_SNAPPY MATCHES "ON|SYSTEM") message (FATAL_ERROR " Not found (specify -DCMAKE_LIBRARY_PATH=/path/to/snappy/lib for Snappy compression)") else () message (STATUS " Not found (specify -DCMAKE_LIBRARY_PATH=/path/to/snappy/lib for Snappy compression)") endif () endif () endif () if (SNAPPY_INCLUDE_DIRS AND SNAPPY_LIBRARIES) set (MONGOC_ENABLE_COMPRESSION_SNAPPY 1) set (MONGOC_ENABLE_COMPRESSION 1) endif () endif () if (NOT SNAPPY_INCLUDE_DIRS OR NOT SNAPPY_LIBRARIES) set (SNAPPY_INCLUDE_DIRS "") set (SNAPPY_LIBRARIES "") set (MONGOC_ENABLE_COMPRESSION_SNAPPY 0) endif () mongo-c-driver-1.26.0/build/cmake/FindSphinx.cmake000066400000000000000000000004541456567454500217130ustar00rootroot00000000000000find_program (SPHINX_EXECUTABLE NAMES sphinx-build HINTS $ENV{SPHINX_DIR} PATH_SUFFIXES bin DOC "Sphinx documentation generator" ) include (FindPackageHandleStandardArgs) find_package_handle_standard_args (Sphinx DEFAULT_MSG SPHINX_EXECUTABLE ) mark_as_advanced (SPHINX_EXECUTABLE) mongo-c-driver-1.26.0/build/cmake/FindUtf8Proc.cmake000066400000000000000000000007571456567454500221220ustar00rootroot00000000000000if(USE_BUNDLED_UTF8PROC) message (STATUS "Enabling utf8proc (bundled)") add_library (utf8proc_obj OBJECT "${UTF8PROC_SOURCES}") set_property (TARGET utf8proc_obj PROPERTY POSITION_INDEPENDENT_CODE TRUE) target_compile_definitions (utf8proc_obj PUBLIC UTF8PROC_STATIC) else () message (STATUS "Searching for utf8proc on system") find_package(PkgConfig) pkg_check_modules(PC_UTF8PROC REQUIRED libutf8proc IMPORTED_TARGET) add_library(utf8proc ALIAS PkgConfig::PC_UTF8PROC) endif() mongo-c-driver-1.26.0/build/cmake/GeneratePkgConfig.cmake000066400000000000000000000317351456567454500231710ustar00rootroot00000000000000include_guard(GLOBAL) include(GNUInstallDirs) define_property( TARGET PROPERTY pkg_config_REQUIRES INHERITED BRIEF_DOCS "pkg-config 'Requires:' items" FULL_DOCS "Specify 'Requires:' items for the targets' pkg-config file" ) define_property( TARGET PROPERTY pkg_config_NAME INHERITED BRIEF_DOCS "The 'Name' for pkg-config" FULL_DOCS "The 'Name' of the pkg-config target" ) define_property( TARGET PROPERTY pkg_config_DESCRIPTION INHERITED BRIEF_DOCS "The 'Description' pkg-config property" FULL_DOCS "The 'Description' property to add to a target's pkg-config file" ) define_property( TARGET PROPERTY pkg_config_VERSION INHERITED BRIEF_DOCS "The 'Version' pkg-config property" FULL_DOCS "The 'Version' property to add to a target's pkg-config file" ) define_property( TARGET PROPERTY pkg_config_CFLAGS INHERITED BRIEF_DOCS "The 'Cflags' pkg-config property" FULL_DOCS "Set a list of options to add to a target's pkg-config file 'Cflags' field" ) define_property( TARGET PROPERTY pkg_config_INCLUDE_DIRECTORIES INHERITED BRIEF_DOCS "Add -I options to the 'Cflags' pkg-config property" FULL_DOCS "Set a list of directories that will be added using -I for the 'Cflags' pkg-config field" ) define_property( TARGET PROPERTY pkg_config_LIBS INHERITED BRIEF_DOCS "Add linker options to the 'Libs' pkg-config field" FULL_DOCS "Set a list of linker options that will joined in a string for the 'Libs' pkg-config field" ) # Given a string, escape any generator-expression-special characters function(_genex_escape out in) # Escape '>' string(REPLACE ">" "$" str "${in}") # Escape "$" string(REPLACE "$" "$<1:$>" str "${str}") # Undo the escaping of the dollar for $ string(REPLACE "$<1:$>" "$" str "${str}") # Escape "," string(REPLACE "," "$" str "${str}") # Escape ";" string(REPLACE ";" "$" str "${str}") set("${out}" "${str}" PARENT_SCOPE) endfunction() # Create a generator expression that ensures the given input generator expression # is evaluated within the context of the named target. function(_bind_genex_to_target out target genex) _genex_escape(escaped "${genex}") set("${out}" $ PARENT_SCOPE) endfunction() #[==[ Generate a pkg-config .pc file for the Given CMake target, and optionally a rule to install it:: generate_pkg_config( [FILENAME ] [LIBDIR ] [INSTALL [DESTINATION ] [RENAME ]] [CONDITION ] ) The `` must name an existing target. The following options are accepted: FILENAME - The generated .pc file will have the given ``. This name *must* be only the filename, and not a qualified path. If omitted, the default filename is generated based on the target name. If using a multi-config generator, the default filename will include the name of the configuration for which it was generated. LIBDIR - Specify the subdirectory of the install prefix in which the target binary will live. If unspecified, uses `CMAKE_INSTALL_LIBDIR`, which comes from the GNUInstallDirs module, which has a default of `lib`. INSTALL [DESTINATION ] [RENAME ] - Generate a rule to install the generated pkg-config file. This is better than using a `file(INSTALL)` on the generated file directly, since it ensures that the installed .pc file will have the correct install prefix value. The following additional arguments are also accepted: DESTINATION - If provided, specify the *directory* (relative to the install-prefix) in which the generated file will be installed. If unspecified, the default destination is `/pkgconfig` RENAME - If provided, set the filename of the installed pkg-config file. If unspecified, the top-level `` will be used. (Note that the default top-level `` will include the configuration type when built/installed using a multi-config generator!) CONDITION - The file will only be generated/installed if the condition `` results in the string "1" after evaluating generator expressions. All named parameters accept generator expressions. ]==] function(mongo_generate_pkg_config target) list(APPEND CMAKE_MESSAGE_CONTEXT "mongo_generate_pkg_config" "${target}") # Collect some target properties: # The name: _genex_escape(proj_name "${PROJECT_NAME}") _genex_escape(proj_desc "${PROJECT_DESCRIPTION}") set(tgt_name $) set(tgt_version $) set(tgt_desc $) string(CONCAT gx_name $, ${proj_name}, ${tgt_name}>) # Version: string(CONCAT gx_version $, ${PROJECT_VERSION}, ${tgt_version}>) # Description: string(CONCAT gx_desc $, ${proj_desc}, ${tgt_desc}>) # Parse and validate arguments: cmake_parse_arguments(PARSE_ARGV 1 ARG "" "FILENAME;LIBDIR;CONDITION" "INSTALL") # Compute the default FILENAME if(NOT DEFINED ARG_FILENAME) # No filename given. Pick a default: if(DEFINED CMAKE_CONFIGURATION_TYPES) # Multi-conf: We may want to generate more than one, so qualify the # filename with the configuration type: set(ARG_FILENAME "$-$>.pc") else() # Just generate a file based on the basename of the target: set(ARG_FILENAME "$.pc") endif() endif() message(DEBUG "FILENAME: ${ARG_FILENAME}") # The defalut CONDITION is just "1" (true) if(NOT DEFINED ARG_CONDITION) set(ARG_CONDITION 1) endif() message(DEBUG "CONDITION: ${ARG_CONDITION}") _bind_genex_to_target(gx_cond ${target} "${ARG_CONDITION}") # The default LIBDIR comes from GNUInstallDirs.cmake if(NOT ARG_LIBDIR) set(ARG_LIBDIR "${CMAKE_INSTALL_LIBDIR}") endif() message(DEBUG "LIBDIR: ${ARG_LIBDIR}") _bind_genex_to_target(gx_libdir ${target} "${ARG_LIBDIR}") # Evaluate the filename genex in the context of the target: _bind_genex_to_target(gx_filename ${target} "${ARG_FILENAME}") if(IS_ABSOLUTE "${ARG_FILENAME}") set(gx_output "${gx_filename}") else() get_filename_component(gx_output "${CMAKE_CURRENT_BINARY_DIR}/${gx_filename}" ABSOLUTE) endif() message(DEBUG "Generating build-tree file: ${gx_output}") # Generate the content of the file: _generate_pkg_config_content(content NAME "${gx_name}" VERSION "${gx_version}" DESCRIPTION "${gx_desc}" PREFIX "%INSTALL_PLACEHOLDER%" LIBDIR "${gx_libdir}" GENEX_TARGET "${target}" ) _bind_genex_to_target(gx_content ${target} "${content}") string(REPLACE "%INSTALL_PLACEHOLDER%" "${CMAKE_INSTALL_PREFIX}" gx_with_prefix "${gx_content}") # Now, generate the file: file(GENERATE OUTPUT "${gx_output}" CONTENT "${gx_with_prefix}" CONDITION "${gx_cond}") if(NOT "INSTALL" IN_LIST ARGN) # Nothing more to do here. message(DEBUG "(Not installing)") return() endif() # Installation handling: # Use file(GENERATE) to generate a temporary file to be picked up at install-time. # (For some reason, injecting the content directly into install(CODE) fails in corner cases) set(gx_tmpfile "${CMAKE_CURRENT_BINARY_DIR}/_pkgconfig/${target}-$>-for-install.txt") message(DEBUG "Generate for-install: ${gx_tmpfile}") file(GENERATE OUTPUT "${gx_tmpfile}" CONTENT "${gx_content}" CONDITION "${gx_cond}") # Parse the install args that we will inspect: cmake_parse_arguments(inst "" "DESTINATION;RENAME" "" ${ARG_INSTALL}) if(NOT DEFINED inst_DESTINATION) # Install based on the libdir: set(inst_DESTINATION "${gx_libdir}/pkgconfig") endif() if(NOT DEFINED inst_RENAME) set(inst_RENAME "${ARG_FILENAME}") endif() message(DEBUG "INSTALL DESTINATION: ${inst_DESTINATION}") message(DEBUG "INSTALL RENAME: ${inst_RENAME}") # install(CODE) will write a simple temporary file: set(inst_tmp "${CMAKE_CURRENT_BINARY_DIR}/${target}-pkg-config-tmp.txt") _genex_escape(esc_cond "${ARG_CONDITION}") string(CONFIGURE [==[ $<@gx_cond@: # Installation of pkg-config for target @target@ message(STATUS "Generating pkg-config file: @inst_RENAME@") file(READ [[@gx_tmpfile@]] content) # Insert the install prefix: string(REPLACE "%INSTALL_PLACEHOLDER%" "${CMAKE_INSTALL_PREFIX}" content "${content}") # Write it before installing again: file(WRITE [[@inst_tmp@]] "${content}") > $<$: # Installation was disabled for this generation. message(STATUS "Skipping install of file [@inst_RENAME@]: Disabled by CONDITION “@esc_cond@”") > ]==] code @ONLY) install(CODE "${code}") _bind_genex_to_target(gx_dest ${target} "${inst_DESTINATION}") if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") _bind_genex_to_target(gx_rename ${target} "${inst_RENAME}") else() # Note: CMake 3.20 is required for using generator expresssions in install(RENAME). # if we are older than that, just treat RENAME as a plain value. set(gx_rename "${inst_RENAME}") endif() # Wrap the filename to install with the same condition used to generate it. If the condition # is not met, then the FILES list will be empty, and nothing will be installed. install(FILES "$<${gx_cond}:${inst_tmp}>" DESTINATION ${gx_dest} RENAME ${gx_rename} ${inst_UNPARSED_ARGUMENTS}) endfunction() # Generates the actual content of a .pc file. function(_generate_pkg_config_content out) cmake_parse_arguments(PARSE_ARGV 1 ARG "" "PREFIX;NAME;VERSION;DESCRIPTION;GENEX_TARGET;LIBDIR" "") if(ARG_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unknown arguments: ${ARG_UNPARSED_ARGUMENTS}") endif() set(content) string(APPEND content "# pkg-config .pc file generated by CMake ${CMAKE_VERSION} for ${ARG_NAME}-${ARG_VERSION}. DO NOT EDIT!\n" "prefix=${ARG_PREFIX}\n" "exec_prefix=\${prefix}\n" "libdir=\${exec_prefix}/${gx_libdir}\n" "\n" "Name: ${ARG_NAME}\n" "Description: ${ARG_DESCRIPTION}\n" "Version: ${ARG_VERSION}" ) # Add Requires: set(requires_joiner "\nRequires: ") set(gx_requires $>) set(has_requires $>) string(APPEND content "$<${has_requires}:${requires_joiner}$>\n") string(APPEND content "\n") # Add "Libs:" set(libs) # Link options: set(gx_libs "-L\${libdir}" "-l$" $> $> ) # XXX: Could we define a genex that can transform the INTERFACE_LINK_LIBRARIES to a list of # pkg-config-compatible "-l"-flags? That would remove the need to populate pkg_config_LIBS # manually, and instead rely on target properties to handle transitive dependencies. string(APPEND libs "$") # Cflags: set(cflags) set(gx_flags $>> $> ) string(APPEND cflags "$") # Definitions: set(gx_defs $>) set(has_defs $>) set(def_joiner " -D") string(APPEND cflags $<${has_defs}:${def_joiner}$>) # Includes: set(gx_inc $>) set(gx_inc "$") set(gx_abs_inc "$") set(gx_rel_inc "$") set(has_abs_inc $>) set(has_rel_inc $>) string(APPEND cflags $<${has_rel_inc}: " -I\${prefix}/" $> $<${has_abs_inc}: " -I" $>) string(APPEND content "Libs: ${libs}\n") string(APPEND content "Cflags: ${cflags}\n") set("${out}" "${content}" PARENT_SCOPE) endfunction() mongo-c-driver-1.26.0/build/cmake/GenerateUninstaller.cmake000066400000000000000000000177341456567454500236250ustar00rootroot00000000000000cmake_policy(VERSION 3.15) if(NOT CMAKE_SCRIPT_MODE_FILE) # We are being included from within a project, so we should generate the install rules # The script name is "uninstall" by default: if(NOT DEFINED UNINSTALL_SCRIPT_NAME) set(UNINSTALL_SCRIPT_NAME "uninstall") endif() # We need a directory where we should install the script: if(NOT UNINSTALL_PROG_DIR) message(SEND_ERROR "We require an UNINSTALL_PROG_DIR to be defined") endif() # Platform dependent values: if(WIN32) set(_script_ext "cmd") set(_script_runner cmd.exe /c) else() set(_script_ext "sh") set(_script_runner sh -e -u) endif() # The script filename and path: set(_script_filename "${UNINSTALL_SCRIPT_NAME}.${_script_ext}") get_filename_component(_uninstaller_script "${CMAKE_CURRENT_BINARY_DIR}/${_script_filename}" ABSOLUTE) # Code that will do the work at install-time: string(CONFIGURE [==[ function(__generate_uninstall) set(UNINSTALL_IS_WIN32 "@WIN32@") set(UNINSTALL_WRITE_FILE "@_uninstaller_script@") set(UNINSTALL_SCRIPT_SELF "@UNINSTALL_PROG_DIR@/@_script_filename@") include("@CMAKE_CURRENT_LIST_FILE@") endfunction() __generate_uninstall() ]==] code @ONLY ESCAPE_QUOTES) install(CODE "${code}") # Add a rule to install that file: install( FILES "${_uninstaller_script}" DESTINATION "${UNINSTALL_PROG_DIR}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) # If applicable, generate an "uninstall" target to run the uninstaller: if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR OR PROJECT_IS_TOP_LEVEL) add_custom_target( uninstall COMMAND ${_script_runner} "${_uninstaller_script}" COMMENT Uninstalling... ) endif() # Stop here: The rest of the file is for install-time return() endif() # We get here if running in script mode (e.g. at CMake install-time) if(NOT DEFINED CMAKE_INSTALL_MANIFEST_FILES) message(FATAL_ERROR "This file is only for use with CMake's install(CODE/SCRIPT) command") endif() if(NOT DEFINED UNINSTALL_WRITE_FILE) message(FATAL_ERROR "Expected a variable “UNINSTALL_WRITE_FILE” to be defined") endif() # Clear out the uninstall script before we begin writing: file(WRITE "${UNINSTALL_WRITE_FILE}" "") # Append a line to the uninstall script file. Single quotes will be replaced with doubles, # and an appropriate newline will be added. function(append_line line) string(REPLACE "'" "\"" line "${line}") file(APPEND "${UNINSTALL_WRITE_FILE}" "${line}\n") endfunction() # The copyright header: set(header [[ Mongo C Driver uninstall program, generated with CMake Copyright 2018-present MongoDB, Inc. Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ]]) string(STRIP header "${header}") string(REPLACE "\n" ";" header_lines "${header}") # Prefix for the Batch script: set(bat_preamble [[ call :init :print nul if ERRORLEVEL 0 ( call :print "- ok" ) else ( call :print "- skipped (non-empty?)" ) ) else ( call :print " - skipped: not present" ) echo( exit /b :init setlocal EnableDelayedExpansion setlocal EnableExtensions if /i "%~dp0" NEQ "%TEMP%\" ( set tmpfile=%TEMP%\mongoc-%~nx0 copy "%~f0" "!tmpfile!" >nul call "!tmpfile!" & del "!tmpfile!" exit /b ) ]]) # Prefix for the shell script: set(sh_preamble [[ set -eu __rmfile() { set -eu abs=$__prefix/$1 printf "Remove file %s: " "$abs" if test -f "$abs" || test -L "$abs" then rm -- "$abs" echo "ok" else echo "skipped: not present" fi } __rmdir() { set -eu abs=$__prefix/$1 printf "Remove directory %s: " "$abs" if test -d "$abs" then list=$(ls --almost-all "$abs") if test "$list" = "" then rmdir -- "$abs" echo "ok" else echo "skipped: not empty" fi else echo "skipped: not present" fi } ]]) # Convert the install prefix to an absolute path with the native path format: get_filename_component(install_prefix "${CMAKE_INSTALL_PREFIX}" ABSOLUTE) file(TO_NATIVE_PATH "${install_prefix}" install_prefix) # Handling DESTDIR requires careful handling of root path redirection: set(root_path) set(relative_prefix "${install_prefix}") if(COMMAND cmake_path) cmake_path(GET install_prefix ROOT_PATH root_path) cmake_path(GET install_prefix RELATIVE_PART relative_prefix) endif() # The first lines that will be written to the script: set(init_lines) if(UNINSTALL_IS_WIN32) # Comment the header: list(TRANSFORM header_lines PREPEND "rem ") # Add the preamble list(APPEND init_lines "@echo off" "${header_lines}" "${bat_preamble}" "if \"%DESTDIR%\"==\"\" (" " set __prefix=${install_prefix}" ") else (" " set __prefix=!DESTDIR!\\${relative_prefix}" ")" "") set(__rmfile "call :rmfile") set(__rmdir "call :rmdir") else() # Comment the header: list(TRANSFORM header_lines PREPEND "# * ") # Add the preamble list(APPEND init_lines "#!/bin/sh" "${header_lines}" "${sh_preamble}" "__prefix=\${DESTDIR:-}${install_prefix}" "") set(__rmfile "__rmfile") set(__rmdir "__rmdir") endif() # Add the first lines to the file: string(REPLACE ";" "\n" init "${init_lines}") append_line("${init}") # Generate a "remove a file" command function(add_rmfile filename) file(TO_NATIVE_PATH "${filename}" native) append_line("${__rmfile} '${native}'") endfunction() # Generate a "remove a directory" command function(add_rmdir dirname) file(TO_NATIVE_PATH "${dirname}" native) append_line("${__rmdir} '${native}'") endfunction() set(script_self "${install_prefix}/${UNINSTALL_SCRIPT_SELF}") set(dirs_to_remove) foreach(installed IN LISTS CMAKE_INSTALL_MANIFEST_FILES script_self) # Get the relative path from the prefix (the uninstaller will fix it up later) file(RELATIVE_PATH relpath "${install_prefix}" "${installed}") # Add a removal: add_rmfile("${relpath}") # Climb the path and collect directories: while("1") get_filename_component(installed "${installed}" DIRECTORY) file(TO_NATIVE_PATH "${installed}" installed) get_filename_component(parent "${installed}" DIRECTORY) file(TO_NATIVE_PATH "${parent}" parent) # Don't account for the prefix or direct children of the prefix: if(installed STREQUAL install_prefix OR parent STREQUAL install_prefix) break() endif() # Keep track of this directory for later: list(APPEND dirs_to_remove "${installed}") endwhile() endforeach() # Now generate commands to remove (empty) directories: list(REMOVE_DUPLICATES dirs_to_remove) # Order them by depth so that we remove subdirectories before their parents: list(SORT dirs_to_remove ORDER DESCENDING) foreach(dir IN LISTS dirs_to_remove) file(RELATIVE_PATH relpath "${install_prefix}" "${dir}") add_rmdir("${relpath}") endforeach() message(STATUS "Generated uninstaller: ${UNINSTALL_WRITE_FILE}") mongo-c-driver-1.26.0/build/cmake/LLDLinker.cmake000066400000000000000000000050751456567454500214250ustar00rootroot00000000000000#[[ This module conditionally enables -fuse-ld=lld if it is supported by the compiler. This is purely for build performance, and has no apparent effect on the generated code. LLD is *significantly* faster to link and produces significantly better link-time error diagnostics. LLD linking will be automatically enabled if it is supported, but can be forced on or off by setting the MONGO_USE_LLD CMake option to ON or OFF. ]] if (NOT COMMAND add_link_options) # This only works on new-enough versions of CMake that support LINK_OPTIONS as # a separate configuration entity return () endif () include (CMakePushCheckState) include (CheckCSourceCompiles) cmake_push_check_state (RESET) # Newer GNU compilers support lld with the '-fuse-ld=lld' flag. set (CMAKE_REQUIRED_FLAGS "-fuse-ld=lld") set (CMAKE_REQUIRED_LINK_OPTIONS "-fuse-ld=lld") check_c_source_compiles ([[ #include int main (void) { puts ("Hello, world!"); return 0; } ]] HAVE_LLD_LINKER_SUPPORT) cmake_pop_check_state () if (HAVE_LLD_LINKER_SUPPORT) # Expose an option to toggle usage of lld option (MONGO_USE_LLD "Link runtime binaries using LLVM's lld linker" ON) elseif (NOT DEFINED _MONGO_LD_LLD_LINKER) # We don't have -fuse-lld support, but that might be because of a misconfig in # the environment. Issue a *one-time* diagnostic telling the user if they *almost* # have LLD support. This branch is only for diagnostic purposes. find_program (_MONGO_LD_LLD_LINKER NAMES ld.lld ld.lld-13 ld.lld-12 ld.lld-11 ld.lld-10 ld.lld-9 ld.lld-8 ld.lld-7 ld.lld-6 ld.lld-5 ) mark_as_advanced (_MONGO_LD_LLD_LINKER) # If we found one, we are compiling with GCC, *and* the found lld has a version suffix, issue a message # telling the user how they might be able to get lld work. if (_MONGO_LD_LLD_LINKER AND CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT _MONGO_LD_LLD_LINKER MATCHES "ld.lld$") message (STATUS "NOTE: A GNU-compatible lld linker was found (${_MONGO_LD_LLD_LINKER}), but support from GCC requires that") message (STATUS " the 'ld.lld' binary be named *exactly* 'ld.lld' (without a version suffix!)") message (STATUS " To enable 'lld' support, try creating a symlink of 'ld.lld' somewhere on your PATH that points") message (STATUS " to '${_MONGO_LD_LLD_LINKER}'") endif () endif () if (MONGO_USE_LLD) message (STATUS "Linking using LLVM lld. Disable by setting MONGO_USE_LLD to OFF") add_link_options (-fuse-ld=lld) endif () mongo-c-driver-1.26.0/build/cmake/LegacyPackage.cmake000066400000000000000000000021751456567454500223230ustar00rootroot00000000000000include (CMakePackageConfigHelpers) # These aren't pkg-config files, they're CMake package configuration files. function (install_package_config_file prefix) foreach (suffix "config.cmake") configure_package_config_file ( ${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}-${prefix}-${suffix}.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-${prefix}-${suffix} INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${prefix} ) install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-${prefix}-${suffix} DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${prefix} ) endforeach () write_basic_package_version_file( ${PROJECT_NAME}-${prefix}-config-version.cmake VERSION "${PROJECT_VERSION}" COMPATIBILITY SameMajorVersion ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-${prefix}-config-version.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${prefix}) endfunction () install_package_config_file ("1.0") if (ENABLE_STATIC) install_package_config_file ("static-1.0") endif () mongo-c-driver-1.26.0/build/cmake/LoadTests.cmake000066400000000000000000000041231456567454500215400ustar00rootroot00000000000000# This file is include()'d by CTest. It executes test-libmongoc to get a list # of all tests that are registered. Each test is then defined as a CTest test, # allowing CTest to control the execution, parallelization, and collection of # test results. if (NOT EXISTS "${TEST_LIBMONGOC_EXE}") # This will fail if 'test-libmongoc' is not compiled yet. message (WARNING "The test executable ${TEST_LIBMONGOC_EXE} is not present. " "Its tests will not be registered") add_test (mongoc/not-found NOT_FOUND) return () endif () # Get the list of tests execute_process ( COMMAND "${TEST_LIBMONGOC_EXE}" --list-tests --no-fork OUTPUT_VARIABLE tests_out WORKING_DIRECTORY "${SRC_ROOT}" RESULT_VARIABLE retc ) if (retc) # Failed to list the tests. That's bad. message (FATAL_ERROR "Failed to run test-libmongoc to discover tests [${retc}]:\n${tests_out}") endif () # Split lines on newlines string (REPLACE "\n" ";" lines "${tests_out}") # TODO: Allow individual test cases to specify the fixtures they want. set (all_fixtures "mongoc/fixtures/fake_kms_provider_server") set (all_env TEST_KMS_PROVIDER_HOST=localhost:14987 # Refer: Fixtures.cmake ) # Generate the test definitions foreach (line IN LISTS lines) if (NOT line MATCHES "^/") # Only generate if the line begins with `/`, which all tests should. continue () endif () # The new test name is prefixed with 'mongoc' set (test "mongoc${line}") # Define the test. Use `--ctest-run` to tell it that CTest is in control. add_test ("${test}" "${TEST_LIBMONGOC_EXE}" --ctest-run "${line}") set_tests_properties ("${test}" PROPERTIES # test-libmongoc expects to execute in the root of the source directory WORKING_DIRECTORY "${SRC_ROOT}" # If a test emits '@@ctest-skipped@@', this tells us that the test is # skipped. SKIP_REGULAR_EXPRESSION "@@ctest-skipped@@" # 45 seconds of timeout on each test. TIMEOUT 45 FIXTURES_REQUIRED "${all_fixtures}" ENVIRONMENT "${all_env}" ) endforeach () mongo-c-driver-1.26.0/build/cmake/LoadVersion.cmake000066400000000000000000000040061456567454500220630ustar00rootroot00000000000000function (LoadVersion FILEPATH PREFIX) # E.g., "MONGOC_VERSION". string (REPLACE ";" "" VERSION_NAME ${PREFIX} _VERSION) string (REPLACE ";" "" DIST_VERSION_NAME ${PREFIX} _DIST_VERSION) file (STRINGS ${FILEPATH} VERSION_CONTENTS) # A list of version components separated by dots and dashes: "1.3.0-[prerelease-marker]" string (REGEX MATCHALL "[^.-]+" VERSION ${VERSION_CONTENTS}) list (GET VERSION 0 MAJOR_VERSION) string (REPLACE ";" "" MAJOR_VERSION_NAME ${PREFIX} _MAJOR_VERSION) set (${MAJOR_VERSION_NAME} ${MAJOR_VERSION} PARENT_SCOPE) list (GET VERSION 1 MINOR_VERSION) string (REPLACE ";" "" MINOR_VERSION_NAME ${PREFIX} _MINOR_VERSION) set (${MINOR_VERSION_NAME} ${MINOR_VERSION} PARENT_SCOPE) list (GET VERSION 2 MICRO_VERSION) string (REPLACE ";" "" MICRO_VERSION_NAME ${PREFIX} _MICRO_VERSION) set (${MICRO_VERSION_NAME} ${MICRO_VERSION} PARENT_SCOPE) string (REPLACE ";" "" PRERELEASE_VERSION_NAME ${PREFIX} _PRERELEASE_VERSION) string (REPLACE ";" "" PRERELEASE_DIST_VERSION_NAME ${PREFIX} _PRERELEASE_DIST_VERSION) list (LENGTH VERSION VERSION_LENGTH) if (VERSION_LENGTH GREATER 3) list (GET VERSION 3 PRERELEASE_VERSION) set (${PRERELEASE_DIST_VERSION_NAME} ${PRERELEASE_VERSION} PARENT_SCOPE) set (${PRERELEASE_VERSION_NAME} "pre" PARENT_SCOPE) set (${VERSION_NAME} "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}-pre" PARENT_SCOPE) set (${DIST_VERSION_NAME} "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}-${PRERELEASE_VERSION}" PARENT_SCOPE) else () set (${PRERELEASE_DIST_VERSION_NAME} "" PARENT_SCOPE) set (${PRERELEASE_VERSION_NAME} "" PARENT_SCOPE) set (${VERSION_NAME} "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}" PARENT_SCOPE) set (${DIST_VERSION_NAME} "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}" PARENT_SCOPE) endif () endfunction (LoadVersion) mongo-c-driver-1.26.0/build/cmake/MongoC-Warnings.cmake000066400000000000000000000064261456567454500226160ustar00rootroot00000000000000#[[ This file sets warning options for the directories in which it is include()'d These warnings are intended to be ported to each supported platform, and especially for high-value warnings that are very likely to catch latent bugs early in the process before the code is even run. ]] #[[ Define additional compile options, conditional on the compiler being used. Each option should be prefixed by `gnu:`, `clang:`, `msvc:`, or `gnu-like:`. Those options will be conditionally enabled for GCC, Clang, or MSVC. These options are attached to the source directory and its children. ]] function (mongoc_add_warning_options) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) # Conditional prefixes: set(cond/gnu $) set(cond/llvm-clang $) set(cond/apple-clang $) set(cond/clang $) set(cond/gnu-like $) set(cond/msvc $) set(cond/lang-c $) # "Old" GNU is GCC < 5, which is missing several warning options set(cond/gcc-lt5 $,5>>) set(cond/gcc-lt7 $,7>>) # Process options: foreach (opt IN LISTS ARGV) # Replace prefixes. Matches right-most first: while (opt MATCHES "(.*)(^|:)([a-z0-9-]+):(.*)") set(before "${CMAKE_MATCH_1}${CMAKE_MATCH_2}") set(prefix "${CMAKE_MATCH_3}") set(suffix "${CMAKE_MATCH_4}") message(TRACE "Substitution: prefix “${prefix}” in “${opt}”, suffix is “${suffix}”") set(cond "cond/${prefix}") set(not 0) if(prefix MATCHES "^not-(.*)") set(cond "cond/${CMAKE_MATCH_1}") set(not 1) endif() if(DEFINED "${cond}") set(expr "${${cond}}") if(not) set(expr "$") endif() set(opt "$<${expr}:${suffix}>") else () message (SEND_ERROR "Unknown option prefix to ${CMAKE_CURRENT_FUNCTION}(): “${prefix}” in “${opt}”") break() endif () set(opt "${before}${opt}") message(TRACE "Become: ${opt}") endwhile () add_compile_options("${opt}") endforeach () endfunction () set (is_c_lang "$") # These below warnings should always be unconditional hard errors, as the code is # almost definitely broken mongoc_add_warning_options ( # Implicit function or variable declarations gnu-like:lang-c:-Werror=implicit msvc:/we4013 msvc:/we4431 # Missing return types/statements gnu-like:-Werror=return-type msvc:/we4716 # Incompatible pointer types gnu-like:lang-c:not-gcc-lt5:-Werror=incompatible-pointer-types msvc:/we4113 # Integral/pointer conversions gnu-like:lang-c:not-gcc-lt5:-Werror=int-conversion msvc:/we4047 # Discarding qualifiers gnu:lang-c:not-gcc-lt5:-Werror=discarded-qualifiers clang:lang-c:-Werror=ignored-qualifiers msvc:/we4090 # Definite use of uninitialized value gnu-like:-Werror=uninitialized msvc:/we4700 # Aside: Disable CRT insecurity warnings msvc:/D_CRT_SECURE_NO_WARNINGS ) mongo-c-driver-1.26.0/build/cmake/MongoPlatform.cmake000066400000000000000000000065721456567454500224340ustar00rootroot00000000000000#[[ Defines a target mongo::detail::c_platform (alias of _mongo-platform), which exposes system-level supporting compile and link usage requirements. All targets should link to this target with level PUBLIC. Use mongo_platform_compile_options and mongo_platform_link_options to add usage requirements to this library. The mongo::detail::c_platform library is installed and exported with the bson-targets export set as an implementation detail. It is installed with this export set so that it is available to both libbson and libmongoc (attempting to install this target in both bson-targets and mongoc-targets export sets would lead to duplicate definitions of mongo::detail::c_platform for downstream users). ]] add_library(_mongo-platform INTERFACE) if (NOT USE_SYSTEM_LIBBSON) add_library(mongo::detail::c_platform ALIAS _mongo-platform) else () # The system libbson exports the `mongo::detail::c_platform` target. # Do not define the `mongo::detail::c_platform` target, to prevent an "already defined" error. endif () set_property(TARGET _mongo-platform PROPERTY EXPORT_NAME detail::c_platform) install(TARGETS _mongo-platform EXPORT bson-targets) #[[ Define additional platform-support compile options These options are added to the mongo::detail::c_platform INTERFACE library. ]] function (mongo_platform_compile_options) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) message(DEBUG "Add platform-support compilation options: ${ARGN}") target_compile_options(_mongo-platform INTERFACE ${ARGN}) endfunction () #[[ Define additional platform-support link options. These options are added to the mongo::detail::c_platform INTERFACE library. ]] function(mongo_platform_link_options) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) message(DEBUG "Add platform-support runtime linking options: ${ARGN}") target_link_options(_mongo-platform INTERFACE ${ARGN}) endfunction() #[[ Add targets to the usage requirements for the current platform. All of the named items must be the names of existing targets. Note that these targets will also need to be available at import-time for consumers (unless wrapped in $). ]] function(mongo_platform_use_target) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) message(DEBUG "Add platform-support usage of targets: ${ARGN}") foreach(item IN LISTS ARGN) if(item MATCHES "::") # CMake will enforce that this link names an existing target target_link_libraries(_mongo-platform INTERFACE "${item}") else() # Generate a configure-time-error if the named item is not the name of a target target_link_libraries(_mongo-platform INTERFACE $,${item},NO_SUCH_TARGET::${item}>) endif() endforeach() endfunction() #[[ Add non-target link library as usage requirements for the current platform. This is intended for adding libraries that need to be linked. To add targets as usage requirements, use mongo_platform_use_target. For adding link options, use mongo_platform_link_options. ]] function(mongo_platform_link_libraries) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) foreach(item IN LISTS ARGN) message(DEBUG "Add platform-support link library: ${item}") target_link_libraries(_mongo-platform INTERFACE "${item}") endforeach() endfunction() mongo-c-driver-1.26.0/build/cmake/MongoSettings.cmake000066400000000000000000000336411456567454500224450ustar00rootroot00000000000000include_guard(DIRECTORY) #[[ Bool: Set to TRUE if the environment variable MONGODB_DEVELOPER is a true value ]] set(MONGODB_DEVELOPER FALSE) # Detect developer mode: set(_is_dev "$ENV{MONGODB_DEVELOPER}") if(_is_dev) message(STATUS "Enabling MONGODB_DEVELOPER 🍃") set(MONGODB_DEVELOPER TRUE) endif() #[==[ Define a new configure-time build setting:: mongo_setting( [TYPE ] [DEFAULT [[DEVEL] [VALUE | EVAL ]] ...] [OPTIONS [ ...]] [VALIDATE [CODE ]] [VISIBLE_IF ] [ADVANCED] ) The `` will be the name of the setting, while `` will be the documentation string shown to the user. Newlines in the doc string will be replaced with single spaces. If no other arguments are provided, the default `TYPE` will be `STRING`, and the DEFAULT value will be an empty string. If the previous cached value is AUTO, and AUTO is not listed in OPTIONS, then the cache value will be cleared and reset to the default value. Package maintainers Note: Setting a variable `-FORCE` to TRUE will make this function a no-op. TYPE - Sets the type for the generated cache variable. If the type is BOOL, this call will validate that the setting is a valid boolean value. OPTIONS [ [...]] - Specify the valid set of values available for this setting. This will set the STRINGS property on the cache variable and add an information message to the doc string. This call will also validate that the setting's value is one of these options, failing with an error if it is not. DEFAULT [[DEVEL] [VALUE | EVAL ]] [...] - Specify the default value(s) of the generated variable. If given VALUE, then `` will be used as the default, otherwise if given EVAL, `` will be executed and is expected to define a variable DEFAULT that will contain the default value. An optional DEVEL qualifier may be given before a default value specifier. If both qualified and unqualified defaults are given, the unqualified default must appear first in the argument list. - If MONGODB_DEVELOPER is not true, then the non-qualified default will be used. (If no non-qualified defaults are provided, then the default value is an empty string.) - Otherwise, If DEVEL defaults are provided and MONGODB_DEVELOPER is true, then the DEVEL defaults will be used. VALIDATE [CODE ] - If specified, then `` will be evaluated after the setting value is defined. `` may issue warnings and errors about the value of the setting. ADVANCED - If specified, the cache variable will be marked as an advanced setting VISIBLE_IF - If specified, then `` should be a quoted CMake condition (e.g. [[FOO AND NOT BAR]]). If the condition evaluates to a false value, then the setting will be hidden from the user. NOTE that the setting will still retain its original value and be available as a variable in the CMake code! ]==] function(mongo_setting setting_NAME setting_DOC) list(APPEND CMAKE_MESSAGE_CONTEXT mongo setting "${setting_NAME}") # Allow bypassing this code: set(force "${${setting_NAME}-FORCE}") if(force) return() endif() cmake_parse_arguments( PARSE_ARGV 2 setting "ADVANCED" "TYPE;VISIBLE_IF" "OPTIONS;DEFAULT;VALIDATE") # Check for unknown arguments: foreach(arg IN LISTS setting_UNPARSED_ARGUMENTS) message(SEND_ERROR "Unrecognized argument: “${arg}”") endforeach() if(setting_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unrecognized arguments (see above)") endif() # By default, settings are strings: if(NOT DEFINED setting_TYPE) set(setting_TYPE STRING) endif() # More arg validation: if(setting_TYPE STREQUAL "BOOL") if(DEFINED setting_OPTIONS) message(FATAL_ERROR [["OPTIONS" cannot be specified with type "BOOL"]]) endif() endif() # Normalize the doc string for easier writing of doc strings at call sites: string(REGEX REPLACE "\n[ ]*" " " doc "${setting_DOC}") # Update the doc string with options: if(DEFINED setting_OPTIONS) string(REPLACE ";" ", " opts "${setting_OPTIONS}") string(APPEND doc " (Options: ${opts})") endif() # Get the default option value: unset(DEFAULT) if(DEFINED setting_DEFAULT) _mongo_compute_default(DEFAULT "${setting_DEFAULT}") endif() if(DEFINED DEFAULT) # Add that to the doc message: string(APPEND doc " (Default is “${DEFAULT}”)") # Check that the default is actually a valid option: if(DEFINED setting_OPTIONS AND NOT DEFAULT IN_LIST setting_OPTIONS) message(AUTHOR_WARNING "${setting_NAME}: Setting's default value is “${DEFAULT}”, which is not one of the provided setting options (${opts})") endif() # Reset "AUTO" values to the default if(NOT "AUTO" IN_LIST setting_OPTIONS AND "$CACHE{${setting_NAME}}" STREQUAL "AUTO") message(WARNING "Replacing old ${setting_NAME}=“AUTO” with the new default value ${setting_NAME}=“${DEFAULT}”") unset("${setting_NAME}" CACHE) endif() endif() # Detect the previous value unset(prev_val) if(DEFINED "CACHE{${setting_NAME}-PREV}") set(prev_val "$CACHE{${setting_NAME}-PREV}") message(DEBUG "Detected previous value was “${prev_val}”") elseif(DEFINED "CACHE{${setting_NAME}}") message(DEBUG "Externally defined to be “${${setting_NAME}}”") else() message(DEBUG "No previous value detected") endif() # Actually define it now: set("${setting_NAME}" "${DEFAULT}" CACHE "${setting_TYPE}" "${doc}") # Variable properties: set_property(CACHE "${setting_NAME}" PROPERTY HELPSTRING "${doc}") set_property(CACHE "${setting_NAME}" PROPERTY TYPE "${setting_TYPE}") set_property(CACHE "${setting_NAME}" PROPERTY ADVANCED "${setting_ADVANCED}") if(setting_OPTIONS) set_property(CACHE "${setting_NAME}" PROPERTY STRINGS "${setting_OPTIONS}") endif() # Report what we set: if(NOT DEFINED prev_val) message(VERBOSE "Setting: ${setting_NAME} := “${${setting_NAME}}”") elseif("${${setting_NAME}}" STREQUAL prev_val) message(DEBUG "Setting: ${setting_NAME} := “${${setting_NAME}}” (Unchanged)") else() message(VERBOSE "Setting: ${setting_NAME} := “${${setting_NAME}}” (Old value was “${prev_val}”)") endif() set("${setting_NAME}-PREV" "${${setting_NAME}}" CACHE INTERNAL "Prior value of ${setting_NAME}") # Validation of options: if((DEFINED setting_OPTIONS) AND (NOT ("${${setting_NAME}}" IN_LIST setting_OPTIONS))) message(FATAL_ERROR "The value of “${setting_NAME}” must be one of [${opts}] (Got ${setting_NAME}=“${${setting_NAME}}”)") endif() string(TOUPPER "${${setting_NAME}}" curval) if(setting_TYPE STREQUAL "BOOL" AND NOT curval MATCHES "^(1|0|ON|OFF|YES|NO|TRUE|FALSE|Y|N|IGNORE)$") message(WARNING "The value of ${setting_NAME}=“${${setting_NAME}}” is not a regular boolean value") endif() # Custom validation: if(DEFINED setting_VALIDATE) cmake_parse_arguments(validate "" "CODE" "" ${setting_VALIDATE}) if(DEFINED validate_CODE) _mongo_eval_cmake("" "${validate_CODE}") endif() if(validate_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unrecognized VALIDATE options: ${validate_UNPARSED_ARGUMENTS}") endif() endif() if(DEFINED setting_VISIBLE_IF) string(JOIN "\n" code "set(avail FALSE)" "if(${setting_VISIBLE_IF})" " set(avail TRUE)" "endif()") _mongo_eval_cmake(avail "${code}") if(NOT avail) # Hide the option by making it INTERNAL set_property(CACHE "${setting_NAME}" PROPERTY TYPE INTERNAL) endif() endif() endfunction() #[[ Implements DEFAULT setting value logic ]] function(_mongo_compute_default outvar arglist) list(APPEND CMAKE_MESSAGE_CONTEXT default) # Clear the value in the caller: unset("${outvar}" PARENT_SCOPE) # Parse arguments: cmake_parse_arguments(dflt "" "" "DEVEL" ${arglist}) # Developer-mode options: if(DEFINED dflt_DEVEL AND MONGODB_DEVELOPER) list(APPEND CMAKE_MESSAGE_CONTEXT "devel") _mongo_compute_default(tmp "${dflt_DEVEL}") message(DEBUG "Detected MONGODB_DEVELOPER: Default of ${setting_NAME} is “${tmp}”") set("${outvar}" "${tmp}" PARENT_SCOPE) return() endif() # Parse everything else: set(other_args "${dflt_UNPARSED_ARGUMENTS}") cmake_parse_arguments(dflt "" "VALUE;EVAL" "" ${other_args}) if(DEFINED dflt_VALUE) # Simple value for the default if(DEFINED dflt_EVAL) message(FATAL_ERROR "Only one of VALUE or EVAL may be specified for a DEFAULT") endif() set("${outvar}" "${dflt_VALUE}" PARENT_SCOPE) elseif(DEFINED dflt_EVAL) # Evaluate some code to determine the default _mongo_eval_cmake(DEFAULT "${dflt_EVAL}") set("${outvar}" "${DEFAULT}" PARENT_SCOPE) if(DEFINED DEFAULT) message(DEBUG "Computed default ${setting_NAME} value to be “${DEFAULT}”") else() message(DEBUG "No default for ${setting_NAME} was computed. Default will be an empty string.") endif() elseif(dflt_UNPARSED_ARGUMENTS) message(FATAL_ERROR "${setting_NAME}: " "DEFAULT got unexpected arguments: ${dflt_UNPARSED_ARGUMENTS}") endif() endfunction() #[==[ Define a new boolean build setting:: mongo_bool_setting( [DEFAULT [[DEVEL] [VALUE | EVAL ]] ...] [VALIDATE [CODE ]] [ADVANCED] ) This is a shorthand for defining a boolean setting. See mongo_setting() for more option information. The TYPE of the setting will be BOOL, and the implicit default value for the setting will be ON if no DEFAULT is provided. ]==] function(mongo_bool_setting name doc) set(args ${ARGN}) # Inject "ON" as a default: if(NOT "DEFAULT" IN_LIST args) list(APPEND args DEFAULT VALUE ON) endif() mongo_setting("${name}" "${doc}" TYPE BOOL ${args}) endfunction() # Set the variable named by 'out' to the 'if_true' or 'if_false' value based on 'cond' function(mongo_pick out if_true if_false cond) string(REPLACE "'" "\"" cond "${cond}") mongo_bool01(b "${cond}") if(b) set("${out}" "${if_true}" PARENT_SCOPE) else() set("${out}" "${if_false}" PARENT_SCOPE) endif() endfunction() # Evaluate CMake code , and lift the given variables into the caller's scope. function(_mongo_eval_cmake get_variables code) # Set a name that is unlikely to collide: set(__eval_liftvars "${get_variables}") # Clear the values before we evaluate the code: foreach(__varname IN LISTS __eval_liftvars) unset("${__varname}" PARENT_SCOPE) unset("${__varname}") endforeach() # We do the "eval" the old fashion way, since we can't yet use cmake_language() message(TRACE "Evaluating CMake code:\n\n${code}") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/_eval.tmp.cmake" "${code}") include("${CMAKE_CURRENT_BINARY_DIR}/_eval.tmp.cmake") # Lift the variables into the caller's scope foreach(__varname IN LISTS __eval_liftvars) if(DEFINED "${__varname}") message(TRACE "Eval variable result: ${__varname}=${${__varname}}") set("${__varname}" "${${__varname}}" PARENT_SCOPE) endif() endforeach() endfunction() #[==[ mongo_bool01( ) Evaluate a condition and store the boolean result as a "0" or a "1". Parameters: - The name of the variable to define in the caller's scope. - `...cond` The condition to evaluate. It must be a single string that contains wraps the syntax of a CMake `if()` command Example: Evaluate Boolean Logic ############################### mongo_bool01(is_mingw [[WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU"]]) Note the quoting and use of [[]]-bracket strings ]==] function(mongo_bool01 var code) if(ARGN) message(FATAL_ERROR "Too many arguments passed to mongo_bool01") endif() string(CONCAT fullcode "if(${code})\n" " set(bool 1)\n" "else()\n" " set(bool 0)\n" "endif()\n") _mongo_eval_cmake(bool "${fullcode}") set("${var}" "${bool}" PARENT_SCOPE) endfunction() #[==[ Append usage requirement properties to a set of targets. mongo_target_requirements( [ [...]] [INCLUDE_DIRECTORIES [spec...]] [LINK_LIBRARIES [spec...]] [COMPILE_DEFINITIONS [spec...]] [COMPILE_OPTIONS [spec...]] [LINK_OPTIONS [spec...]] [SOURCES [spec...]] ) ]==] function(mongo_target_requirements) set(properties INCLUDE_DIRECTORIES LINK_LIBRARIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS SOURCES ) cmake_parse_arguments(PARSE_ARGV 0 ARG "" "" "${properties}") foreach(target IN LISTS ARG_UNPARSED_ARGUMENTS) if(ARG_INCLUDE_DIRECTORIES) target_include_directories("${target}" ${ARG_INCLUDE_DIRECTORIES}) endif() if(ARG_LINK_LIBRARIES) target_link_libraries("${target}" ${ARG_LINK_LIBRARIES}) endif() if(ARG_COMPILE_DEFINITIONS) target_compile_definitions("${target}" ${ARG_COMPILE_DEFINITIONS}) endif() if(ARG_COMPILE_OPTIONS) target_compile_options("${target}" ${ARG_COMPILE_OPTIONS}) endif() if(ARG_LINK_OPTIONS) target_link_options("${target}" ${ARG_LINK_OPTIONS}) endif() if(ARG_SOURCES) target_sources("${target}" ${ARG_SOURCES}) endif() endforeach() endfunction() mongo-c-driver-1.26.0/build/cmake/ParseVersion.cmake000066400000000000000000000036531456567454500222650ustar00rootroot00000000000000function (ParseVersion VERSION_CONTENTS PREFIX) # E.g., "MONGOC_VERSION". string (REPLACE ";" "" VERSION_NAME ${PREFIX} _VERSION) string (REPLACE ";" "" DIST_VERSION_NAME ${PREFIX} _DIST_VERSION) # A list of version components separated by dots and dashes: "1.3.0-[prerelease-marker]" string (REGEX MATCHALL "[^.-]+" VERSION ${VERSION_CONTENTS}) list (GET VERSION 0 VERSION_MAJOR) string (REPLACE ";" "" VERSION_MAJOR_NAME ${PREFIX} _VERSION_MAJOR) set (${VERSION_MAJOR_NAME} ${VERSION_MAJOR} PARENT_SCOPE) list (GET VERSION 1 VERSION_MINOR) string (REPLACE ";" "" VERSION_MINOR_NAME ${PREFIX} _VERSION_MINOR) set (${VERSION_MINOR_NAME} ${VERSION_MINOR} PARENT_SCOPE) list (GET VERSION 2 VERSION_PATCH) string (REPLACE ";" "" VERSION_PATCH_NAME ${PREFIX} _VERSION_PATCH) set (${VERSION_PATCH_NAME} ${VERSION_PATCH} PARENT_SCOPE) string (REPLACE ";" "" VERSION_EXTRA_NAME ${PREFIX} _VERSION_EXTRA) string (REPLACE ";" "" VERSION_DIST_EXTRA_NAME ${PREFIX} _VERSION_DIST_EXTRA) list (LENGTH VERSION VERSION_LENGTH) if (VERSION_LENGTH GREATER 3) list (GET VERSION 3 VERSION_EXTRA) set (${VERSION_DIST_EXTRA_NAME} "-${VERSION_EXTRA}" PARENT_SCOPE) set (${VERSION_EXTRA_NAME} "-pre" PARENT_SCOPE) set (${VERSION_NAME} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-pre" PARENT_SCOPE) set (${DIST_VERSION_NAME} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_EXTRA}" PARENT_SCOPE) else () set (${VERSION_DIST_EXTRA_NAME} "" PARENT_SCOPE) set (${VERSION_EXTRA_NAME} "" PARENT_SCOPE) set (${VERSION_NAME} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" PARENT_SCOPE) set (${DIST_VERSION_NAME} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" PARENT_SCOPE) endif () endfunction (ParseVersion) mongo-c-driver-1.26.0/build/cmake/ResSearch.cmake000066400000000000000000000056431456567454500215250ustar00rootroot00000000000000include(CheckSymbolExists) include(CMakePushCheckState) cmake_push_check_state() # The name of the library that performs name resolution, suitable for giving to the "-l" link flag set(RESOLVE_LIB_NAME) # If TRUE, then the C runtime provides the name resolution that we need set(resolve_is_libc FALSE) if(WIN32) set(RESOLVE_LIB_NAME Dnsapi) set(_MONGOC_HAVE_DNSAPI 1) else() # Try to find the search functions for various configurations. # Headers required by minimum on the strictest system: (Tested on FreeBSD 13) set(resolve_headers netinet/in.h sys/types.h arpa/nameser.h resolv.h) set(CMAKE_REQUIRED_LIBRARIES resolv) check_symbol_exists(res_nsearch "${resolve_headers}" _MONGOC_HAVE_RES_NSEARCH_RESOLV) check_symbol_exists(res_search "${resolve_headers}" _MONGOC_HAVE_RES_SEARCH_RESOLV) check_symbol_exists(res_ndestroy "${resolve_headers}" _MONGOC_HAVE_RES_NDESTROY_RESOLV) check_symbol_exists(res_nclose "${resolve_headers}" _MONGOC_HAVE_RES_NCLOSE_RESOLV) if( (_MONGOC_HAVE_RES_NSEARCH_RESOLV AND (_MONGOC_HAVE_RES_NDESTROY_RESOLV OR _MONGOC_HAVE_RES_NCLOSE_RESOLV)) OR _MONGOC_HAVE_RES_SEARCH_RESOLV ) set(RESOLVE_LIB_NAME resolv) else() # Can we use name resolution with just libc? unset(CMAKE_REQUIRED_LIBRARIES) check_symbol_exists(res_nsearch "${resolve_headers}" _MONGOC_HAVE_RES_NSEARCH_NOLINK) check_symbol_exists(res_search "${resolve_headers}" _MONGOC_HAVE_RES_SEARCH_NOLINK) check_symbol_exists(res_ndestroy "${resolve_headers}" _MONGOC_HAVE_RES_NDESTROY_NOLINK) check_symbol_exists(res_nclose "${resolve_headers}" _MONGOC_HAVE_RES_NCLOSE_NOLINK) if( (_MONGOC_HAVE_RES_NSEARCH_NOLINK AND (_MONGOC_HAVE_RES_NDESTROY_NOLINK OR _MONGOC_HAVE_RES_NCLOSE_NOLINK)) OR _MONGOC_HAVE_RES_SEARCH_NOLINK ) set(resolve_is_libc TRUE) message(VERBOSE "Name resolution is provided by the C runtime") endif() endif() endif() mongo_pick(MONGOC_HAVE_DNSAPI 1 0 _MONGOC_HAVE_DNSAPI) mongo_pick(MONGOC_HAVE_RES_NSEARCH 1 0 [[_MONGOC_HAVE_RES_NSEARCH_NOLINK OR _MONGOC_HAVE_RES_NSEARCH_RESOLV]]) mongo_pick(MONGOC_HAVE_RES_SEARCH 1 0 [[_MONGOC_HAVE_RES_SEARCH_NOLINK OR _MONGOC_HAVE_RES_SEARCH_RESOLV]]) mongo_pick(MONGOC_HAVE_RES_NDESTROY 1 0 [[_MONGOC_HAVE_RES_NDESTROY_NOLINK OR _MONGOC_HAVE_RES_NDESTROY_RESOLV]]) mongo_pick(MONGOC_HAVE_RES_NCLOSE 1 0 [[_MONGOC_HAVE_RES_NCLOSE_NOLINK OR _MONGOC_HAVE_RES_NCLOSE_RESOLV]]) if(RESOLVE_LIB_NAME OR resolve_is_libc) # Define the resolver interface: add_library(_mongoc-resolve INTERFACE) add_library(mongo::detail::c_resolve ALIAS _mongoc-resolve) set_target_properties(_mongoc-resolve PROPERTIES INTERFACE_LINK_LIBRARIES "${RESOLVE_LIB_NAME}" EXPORT_NAME detail::c_resolve) install(TARGETS _mongoc-resolve EXPORT mongoc-targets) endif() cmake_pop_check_state() mongo-c-driver-1.26.0/build/cmake/Sanitizers.cmake000066400000000000000000000023771456567454500220020ustar00rootroot00000000000000include (CheckCSourceCompiles) include (CMakePushCheckState) include (MongoSettings) mongo_setting ( MONGO_SANITIZE "Semicolon/comma-separated list of sanitizers to apply when building" DEFAULT DEVEL EVAL [[ if(NOT MSVC) set(DEFAULT "address,undefined") endif() ]]) # Replace commas with semicolons for the genex string(REPLACE ";" "," _sanitize "${MONGO_SANITIZE}") if (_sanitize) string (MAKE_C_IDENTIFIER "HAVE_SANITIZE_${_sanitize}" ident) string (TOUPPER "${ident}" varname) set (flag "-fsanitize=${_sanitize}") cmake_push_check_state () set (CMAKE_REQUIRED_FLAGS "${flag}") set (CMAKE_REQUIRED_LIBRARIES "${flag}") check_c_source_compiles ([[ #include int main (void) { puts ("Hello, world!"); return 0; } ]] "${varname}") cmake_pop_check_state () if (NOT "${${varname}}") message (SEND_ERROR "Requested sanitizer option '${flag}' is not supported by the compiler+linker") else () message (STATUS "Enabling sanitizers: ${flag}") mongo_platform_compile_options ($) mongo_platform_link_options (${flag}) endif () endif () mongo-c-driver-1.26.0/build/cmake/SphinxBuild.cmake000066400000000000000000000131621456567454500220720ustar00rootroot00000000000000# function (sphinx_build_html) # # Parameters: # # target_name - name of the generated custom target (e.g., bson-html) # doc_dir - name of the destination directory for HTML documentation; is used # to construct a target path: ${CMAKE_INSTALL_PREFIX}/share/doc/${doc_dir}/html # # Description: # # Process the list of .rst files in the current source directory and: # - build up a list of target/output .html files # - create the custom Sphinx command that produces the HTML output # - add install rules for: # + source static content (e.g., images) # + each output file # + additional Sphinx-generated content # - create the custom target that depends on the output files and calls sphinx function (sphinx_build_html target_name doc_dir) include (ProcessorCount) ProcessorCount (NPROCS) set (SPHINX_HTML_DIR "${CMAKE_CURRENT_BINARY_DIR}/html") set (doctrees_dir "${SPHINX_HTML_DIR}.doctrees") file (GLOB_RECURSE doc_rsts RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS *.rst) # Select a builder: The Sphinx `dirhtml` builder will result in "prettier" URLs, # as each page is an `index.html` within a directory. This relies on "autoindex"-style # static file URL resolution in the HTTP server, which is extremely common. For # EVG, however, we host build results on a server that does not support this, # so instead use the traditional HTML builder so that the built documentation # artifact can be easily viewed in a web browser set(is_evg_docs_build "$ENV{EVG_DOCS_BUILD}") if(NOT is_evg_docs_build) set (builder dirhtml) # We have an extension in place that generates stub page redirects for # old HTML file URLs that now point to the auto-index URL for the # corresponding page. As such, every .rst builds two corresponding .html # files: list (TRANSFORM doc_rsts REPLACE "^(.+)\\.rst$" "html/\\1.html;html/\\1/index.html" OUTPUT_VARIABLE doc_htmls) else() set (builder html) # We use the regular html builder in this case, which generates exactly # one HTML page for each input rST file list (TRANSFORM doc_rsts REPLACE "^(.+)\\.rst$" "html/\\1.html" OUTPUT_VARIABLE doc_htmls) endif() # Set PYTHONDONTWRITEBYTECODE to prevent .pyc clutter in the source directory add_custom_command (OUTPUT ${doc_htmls} ${SPHINX_HTML_DIR}/.nojekyll ${SPHINX_HTML_DIR}/objects.inv COMMAND ${CMAKE_COMMAND} -E env "PYTHONDONTWRITEBYTECODE=1" ${SPHINX_EXECUTABLE} -qnW -b "${builder}" -j "${NPROCS}" -c "${CMAKE_CURRENT_SOURCE_DIR}" -d "${doctrees_dir}" "${CMAKE_CURRENT_SOURCE_DIR}" "${SPHINX_HTML_DIR}" DEPENDS ${doc_rsts} COMMENT "Building HTML documentation with Sphinx" ) # Install all HTML files install (DIRECTORY "${SPHINX_HTML_DIR}/" DESTINATION "${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html" FILES_MATCHING PATTERN "*.html") # Ensure additional Sphinx-generated content gets installed install (FILES ${SPHINX_HTML_DIR}/search.html ${SPHINX_HTML_DIR}/objects.inv ${SPHINX_HTML_DIR}/searchindex.js DESTINATION ${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html ) install (DIRECTORY ${SPHINX_HTML_DIR}/_static DESTINATION ${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html ) if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/static) install (DIRECTORY ${SPHINX_HTML_DIR}/_images DESTINATION ${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html ) endif () add_custom_target (${target_name} DEPENDS ${doc_htmls}) endfunction () # function (sphinx_build_man) # # Parameters: # # target_name - name of the generated custom target (e.g., mongoc-man) # # Description: # # Process the list of .rst files in the current source directory and: # - build up a list of target/output .3 files (i.e., man pages) # - create the custom Sphinx command that produces the man page output # - add install rules for each output file # - create the custom target that depends on the output files and calls sphinx # function (sphinx_build_man target_name) include (ProcessorCount) ProcessorCount (NPROCS) set (SPHINX_MAN_DIR "${CMAKE_CURRENT_BINARY_DIR}/man") set (doctrees_dir "${SPHINX_MAN_DIR}.doctrees") file (GLOB_RECURSE doc_rsts RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS *.rst) set (doc_mans) foreach (rst IN LISTS doc_rsts) # Only those with the :man_page: tag at the beginning build man pages file (READ "${rst}" rst_head LIMIT 256) string (FIND "${rst_head}" ":man_page: " man_tag_pos) if (man_tag_pos GREATER_EQUAL "0") list (APPEND man_doc_rsts "${rst}") string (REGEX REPLACE "^.*:man_page: +([a-z0-9_]+).*$" "man\/\\1.3" man ${rst_head} ) list (APPEND doc_mans ${man}) endif () endforeach () # Set PYTHONDONTWRITEBYTECODE to prevent .pyc clutter in the source directory add_custom_command (OUTPUT ${doc_mans} COMMAND ${CMAKE_COMMAND} -E env "PYTHONDONTWRITEBYTECODE=1" ${SPHINX_EXECUTABLE} -qW -b man -c "${CMAKE_CURRENT_SOURCE_DIR}" -d "${doctrees_dir}" "${CMAKE_CURRENT_SOURCE_DIR}" "${SPHINX_MAN_DIR}" DEPENDS ${doc_rsts} COMMENT "Building manual pages with Sphinx" ) foreach (man IN LISTS doc_mans) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${man} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3 ) endforeach () add_custom_target (${target_name} DEPENDS ${doc_mans}) endfunction () mongo-c-driver-1.26.0/build/cmake/TestFixtures.cmake000066400000000000000000000037271456567454500223200ustar00rootroot00000000000000find_package (Python3 COMPONENTS Interpreter) if (NOT TARGET Python3::Interpreter) message (STATUS "Python3 was not found, so test fixtures will not be defined") return () endif () get_filename_component(_MONGOC_BUILD_SCRIPT_DIR "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY) set (_MONGOC_PROC_CTL_COMMAND "$" -u -- "${_MONGOC_BUILD_SCRIPT_DIR}/proc-ctl.py") function (mongo_define_subprocess_fixture name) cmake_parse_arguments(PARSE_ARGV 1 ARG "" "SPAWN_WAIT;STOP_WAIT;WORKING_DIRECTORY" "COMMAND") string (MAKE_C_IDENTIFIER ident "${name}") if (NOT ARG_SPAWN_WAIT) set (ARG_SPAWN_WAIT 1) endif () if (NOT ARG_STOP_WAIT) set (ARG_STOP_WAIT 5) endif () if (NOT ARG_WORKING_DIRECTORY) set (ARG_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") endif () if (NOT ARG_COMMAND) message (SEND_ERROR "mongo_define_subprocess_fixture(${name}) requires a COMMAND") return () endif () get_filename_component (ctl_dir "${CMAKE_CURRENT_BINARY_DIR}/${ident}.ctl" ABSOLUTE) add_test (NAME "${name}/start" COMMAND ${_MONGOC_PROC_CTL_COMMAND} start "--ctl-dir=${ctl_dir}" "--cwd=${ARG_WORKING_DIRECTORY}" "--spawn-wait=${ARG_SPAWN_WAIT}" -- ${ARG_COMMAND}) add_test (NAME "${name}/stop" COMMAND ${_MONGOC_PROC_CTL_COMMAND} stop "--ctl-dir=${ctl_dir}" --if-not-running=ignore) set_property (TEST "${name}/start" PROPERTY FIXTURES_SETUP "${name}") set_property (TEST "${name}/stop" PROPERTY FIXTURES_CLEANUP "${name}") endfunction () # Create a fixture that runs a fake Azure IMDS server mongo_define_subprocess_fixture( mongoc/fixtures/fake_imds SPAWN_WAIT 0.2 COMMAND "$" -u -- "${_MONGOC_BUILD_SCRIPT_DIR}/bottle.py" fake_kms_provider_server:kms_provider --bind localhost:14987 # Port 14987 chosen arbitrarily ) mongo-c-driver-1.26.0/build/cmake/libbson-1.0-config.cmake.in000066400000000000000000000021421456567454500234310ustar00rootroot00000000000000# Copyright 2017 MongoDB Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. if(NOT libbson-1.0_FIND_QUIETLY) message(WARNING "This CMake package is deprecated. Prefer instead to use the \"bson-1.0\" package and link to mongo::bson_shared.") endif() set (BSON_MAJOR_VERSION @libbson_VERSION_MAJOR@) set (BSON_MINOR_VERSION @libbson_VERSION_MINOR@) set (BSON_MICRO_VERSION @libbson_VERSION_PATCH@) set (BSON_VERSION @libbson_VERSION@) set (BSON_VERSION_FULL @libbson_VERSION_FULL@) include(CMakeFindDependencyMacro) find_dependency(bson-1.0) set (BSON_LIBRARY mongo::bson_shared) set (BSON_LIBRARIES mongo::bson_shared) mongo-c-driver-1.26.0/build/cmake/libbson-static-1.0-config.cmake.in000066400000000000000000000022321456567454500247160ustar00rootroot00000000000000# Copyright 2017 MongoDB Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. if(NOT libbson-static-1.0_FIND_QUIETLY) message(WARNING "This CMake package is deprecated. Prefer instead to use the \"bson-1.0\" package and link to mongo::bson_static.") endif() set (BSON_STATIC_MAJOR_VERSION @libbson_VERSION_MAJOR@) set (BSON_STATIC_MINOR_VERSION @libbson_VERSION_MINOR@) set (BSON_STATIC_MICRO_VERSION @libbson_VERSION_PATCH@) set (BSON_STATIC_VERSION @libbson_VERSION@) set (BSON_STATIC_VERSION_FULL @libbson_VERSION_FULL@) include(CMakeFindDependencyMacro) find_dependency(bson-1.0) set (BSON_STATIC_LIBRARY mongo::bson_static) set (BSON_STATIC_LIBRARIES mongo::bson_static) mongo-c-driver-1.26.0/build/cmake/libmongoc-1.0-config.cmake.in000066400000000000000000000022051456567454500237520ustar00rootroot00000000000000# Copyright 2017 MongoDB Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. if(NOT libmongoc-1.0_FIND_QUIETLY) message(WARNING "This CMake package is deprecated. Prefer instead to use the \"mongoc-1.0\" package and link to mongo::mongoc_shared.") endif() set (MONGOC_MAJOR_VERSION @libmongoc_VERSION_MAJOR@) set (MONGOC_MINOR_VERSION @libmongoc_VERSION_MINOR@) set (MONGOC_MICRO_VERSION @libmongoc_VERSION_PATCH@) set (MONGOC_VERSION @libmongoc_VERSION@) set (MONGOC_VERSION_FULL @libmongoc_VERSION_FULL@) include(CMakeFindDependencyMacro) find_dependency (mongoc-1.0) set(MONGOC_LIBRARY mongo::mongoc_shared) set(MONGOC_LIBRARIES mongo::mongoc_shared) mongo-c-driver-1.26.0/build/cmake/libmongoc-hidden-symbols.map000066400000000000000000000000451456567454500242220ustar00rootroot00000000000000mongoc { local: kms*; }; mongo-c-driver-1.26.0/build/cmake/libmongoc-hidden-symbols.txt000066400000000000000000000000061456567454500242610ustar00rootroot00000000000000_kms* mongo-c-driver-1.26.0/build/cmake/libmongoc-static-1.0-config.cmake.in000066400000000000000000000022751456567454500252460ustar00rootroot00000000000000# Copyright 2017 MongoDB Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. if(NOT libmongoc-static-1.0_FIND_QUIETLY) message(WARNING "This CMake package is deprecated. Prefer instead to use the \"mongoc-1.0\" package and link to mongo::mongoc_static.") endif() set (MONGOC_STATIC_MAJOR_VERSION @libmongoc_VERSION_MAJOR@) set (MONGOC_STATIC_MINOR_VERSION @libmongoc_VERSION_MINOR@) set (MONGOC_STATIC_MICRO_VERSION @libmongoc_VERSION_PATCH@) set (MONGOC_STATIC_VERSION @libmongoc_VERSION@) set (MONGOC_STATIC_VERSION_FULL @libmongoc_VERSION_FULL@) include(CMakeFindDependencyMacro) find_dependency (mongoc-1.0) set(MONGOC_STATIC_LIBRARY mongo::mongoc_static) set(MONGOC_STATIC_LIBRARIES mongo::mongoc_static) mongo-c-driver-1.26.0/build/fake_kms_provider_server.py000066400000000000000000000111211456567454500232020ustar00rootroot00000000000000import functools import json import sys import time import traceback from pathlib import Path import bottle from bottle import Bottle, HTTPResponse kms_provider = Bottle(autojson=True) """A mock server for Azure IMDS and GCP metadata""" from typing import TYPE_CHECKING, Any, Callable, Iterable, cast, overload if not TYPE_CHECKING: from bottle import request else: from typing import Protocol class _RequestParams(Protocol): def __getitem__(self, key: str) -> str: ... @overload def get(self, key: str) -> 'str | None': ... @overload def get(self, key: str, default: str) -> str: ... class _HeadersDict(dict[str, str]): def raw(self, key: str) -> 'bytes | None': ... class _Request(Protocol): @property def query(self) -> _RequestParams: ... @property def params(self) -> _RequestParams: ... @property def headers(self) -> _HeadersDict: ... request = cast('_Request', None) def parse_qs(qs: str) -> 'dict[str, str]': # Re-use the bottle.py query string parser. It's a private function, but # we're using a fixed version of Bottle. return dict(bottle._parse_qsl(qs)) # type: ignore _HandlerFuncT = Callable[ [], 'None|str|bytes|dict[str, Any]|bottle.BaseResponse|Iterable[bytes|str]'] def handle_asserts(fn: _HandlerFuncT) -> _HandlerFuncT: "Convert assertion failures into HTTP 400s" @functools.wraps(fn) def wrapped(): try: return fn() except AssertionError as e: traceback.print_exc() return bottle.HTTPResponse(status=400, body=json.dumps({'error': list(e.args)})) return wrapped def test_params() -> 'dict[str, str]': return parse_qs(request.headers.get('X-MongoDB-HTTP-TestParams', '')) @kms_provider.get('/computeMetadata/v1/instance/service-accounts/default/token') @handle_asserts def get_gcp_token(): metadata_header = request.headers.get("Metadata-Flavor") assert metadata_header == 'Google' case = test_params().get('case') print('Case is:', case) if case == '404': return HTTPResponse(status=404) if case == 'bad-json': return b'{"access-token": }' if case == 'empty-json': return b'{}' if case == 'giant': return _gen_giant() if case == 'slow': return _slow() assert case in (None, ''), 'Unknown HTTP test case "{}"'.format(case) return { 'access_token' : 'google-cookie', 'token_type' : 'Bearer' } @kms_provider.get('/metadata/identity/oauth2/token') @handle_asserts def get_oauth2_token(): api_version = request.query['api-version'] assert api_version == '2018-02-01', 'Only api-version=2018-02-01 is supported' resource = request.query['resource'] assert resource == 'https://vault.azure.net', 'Only https://vault.azure.net is supported' case = test_params().get('case') print('Case is:', case) if case == '404': return HTTPResponse(status=404) if case == '500': return HTTPResponse(status=500) if case == 'bad-json': return b'{"key": }' if case == 'empty-json': return b'{}' if case == 'giant': return _gen_giant() if case == 'slow': return _slow() assert case in (None, ''), 'Unknown HTTP test case "{}"'.format(case) return { 'access_token': 'magic-cookie', 'expires_in': '70', 'token_type': 'Bearer', 'resource': 'https://vault.azure.net', } def _gen_giant() -> Iterable[bytes]: "Generate a giant message" yield b'{ "item": [' for _ in range(1024 * 256): yield (b'null, null, null, null, null, null, null, null, null, null, ' b'null, null, null, null, null, null, null, null, null, null, ' b'null, null, null, null, null, null, null, null, null, null, ' b'null, null, null, null, null, null, null, null, null, null, ') yield b' null ] }' yield b'\n' def _slow() -> Iterable[bytes]: "Generate a very slow message" yield b'{ "item": [' for _ in range(1000): yield b'null, ' time.sleep(1) yield b' null ] }' if __name__ == '__main__': print( 'RECOMMENDED: Run this script using bottle.py (e.g. [{} {}/bottle.py fake_kms_provider_server:kms_provider])' .format(sys.executable, Path(__file__).resolve().parent)) kms_provider.run() mongo-c-driver-1.26.0/build/future_function_templates/000077500000000000000000000000001456567454500230515ustar00rootroot00000000000000mongo-c-driver-1.26.0/build/future_function_templates/future-functions.c.template000066400000000000000000000035641456567454500303570ustar00rootroot00000000000000{{ header_comment }} /* * Define two sets of functions: background functions and future functions. * A background function like background_mongoc_cursor_next runs a driver * operation on a thread. * A future function like future_mongoc_cursor_next launches the background * operation and returns a future_t that will resolve when the operation * finishes. * * These are used with mock_server_t so you can run the driver on a thread while * controlling the server from the main thread. */ #include "mongoc/mongoc-topology-private.h" #include "future-functions.h" {% for F in future_functions %} static BSON_THREAD_FUN (background_{{ F.name }}, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_{{ F.ret_type }}_type; {% if F.ret_type == 'void' %} {{ F.name }} ({% for P in F.params %} future_value_get_{{ P.type_name }} (future_get_param (future, {{ loop.index0 }})){% if not loop.last %},{% endif %}{% endfor %}); {% else %} future_value_set_{{ F.ret_type }} ( &return_value, {{ F.name }} ({% for P in F.params %} future_value_get_{{ P.type_name }} (future_get_param (future, {{ loop.index0 }})){% if not loop.last %},{% endif %}{% endfor %} )); {% endif %} future_resolve (future, return_value); BSON_THREAD_RETURN; } {% endfor %} {% for F in future_functions %} future_t * {{ F|future_function_name }} ({% for P in F.params %} {{ P.type_name }} {{ P.name }}{% if not loop.last %},{% endif %}{% endfor %}) { future_t *future = future_new (future_value_{{ F.ret_type }}_type, {{ F.params | length }}); {% for P in F.params %} future_value_set_{{ P.type_name }} ( future_get_param (future, {{ loop.index0 }}), {{ P.name }}); {% endfor %} future_start (future, background_{{ F.name }}); return future; } {% endfor %} mongo-c-driver-1.26.0/build/future_function_templates/future-functions.h.template000066400000000000000000000006121456567454500303530ustar00rootroot00000000000000#ifndef FUTURE_FUNCTIONS_H #define FUTURE_FUNCTIONS_H #include "future-value.h" #include "future.h" #include "mongoc/mongoc-bulk-operation.h" {{ header_comment }} {% for F in future_functions %} future_t * {{ F|future_function_name }} ( {% for P in F.params %} {{ P.type_name }} {{ P.name }}{% if not loop.last %},{% endif %}{% endfor %} ); {% endfor %} #endif /* FUTURE_FUNCTIONS_H */ mongo-c-driver-1.26.0/build/future_function_templates/future-value.c.template000066400000000000000000000014341456567454500274550ustar00rootroot00000000000000#include "future-value.h" {{ header_comment }} future_value_t * future_value_new (void) { return (future_value_t *) bson_malloc0 (sizeof (future_value_t)); } void future_value_set_void (future_value_t *future_value) { future_value->type = future_value_void_type; } void future_value_get_void (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_void_type); } {% for T in type_list %} void future_value_set_{{ T }} (future_value_t *future_value, {{ T }} value) { future_value->type = future_value_{{ T }}_type; future_value->value.{{ T }}_value = value; } {{ T }} future_value_get_{{ T }} (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_{{ T }}_type); return future_value->value.{{ T }}_value; } {% endfor %} mongo-c-driver-1.26.0/build/future_function_templates/future-value.h.template000066400000000000000000000022021456567454500274540ustar00rootroot00000000000000#ifndef FUTURE_VALUE_H #define FUTURE_VALUE_H #include #include "mongoc/mongoc-cluster-private.h" #include "mongoc/mongoc-topology-private.h" {{ header_comment }} {% for T in typedef_list %}{% if T.typedef %} typedef {{ T.typedef }} {{ T.name }};{% endif %}{% endfor %} typedef enum { future_value_no_type = 0, {% for T in type_list_with_void %} future_value_{{ T }}_type, {% endfor %} } future_value_type_t; typedef struct _future_value_t { future_value_type_t type; union { {% for T in type_list %} {{ T }} {{ T }}_value; {% endfor %} } value; } future_value_t; future_value_t *future_value_new (void); #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-function" #endif void future_value_set_void (future_value_t *future_value); void future_value_get_void (future_value_t *future_value); {% for T in type_list %} void future_value_set_{{ T }}( future_value_t *future_value, {{ T }} value); {{ T }} future_value_get_{{ T }} ( future_value_t *future_value); {% endfor %} #ifdef __clang__ #pragma clang diagnostic pop #endif #endif /* FUTURE_VALUE_H */ mongo-c-driver-1.26.0/build/future_function_templates/future.c.template000066400000000000000000000057341456567454500263520ustar00rootroot00000000000000#include #include "mongoc/mongoc-array-private.h" #include "mongoc/mongoc-thread-private.h" #include "future.h" #include "../test-libmongoc.h" {{ header_comment }} #define FUTURE_TIMEOUT_ABORT \ if (1) { \ fflush (stdout); \ fprintf (stderr, "%s timed out\n", BSON_FUNC); \ fflush (stderr); \ abort (); \ } else \ ((void) 0) void future_get_void (future_t *future) { if (future_wait (future)) { return; } FUTURE_TIMEOUT_ABORT; } {% for T in type_list %} {{ T }} future_get_{{ T }} (future_t *future) { if (future_wait (future)) { return future_value_get_{{ T }} (&future->return_value); } FUTURE_TIMEOUT_ABORT; } {% endfor %} future_t * future_new (future_value_type_t return_type, int argc) { future_t *future; future = (future_t *)bson_malloc0 (sizeof *future); future->return_value.type = return_type; future->argc = argc; future->argv = (future_value_t *)bson_malloc0 ((size_t) argc * sizeof(future_value_t)); mongoc_cond_init (&future->cond); bson_mutex_init (&future->mutex); return future; } future_value_t * future_get_param (future_t *future, int i) { return &future->argv[i]; } void future_start (future_t *future, BSON_THREAD_FUN_TYPE (start_routine)) { int r = mcommon_thread_create (&future->thread, start_routine, (void *) future); BSON_ASSERT (!r); } void future_resolve (future_t *future, future_value_t return_value) { bson_mutex_lock (&future->mutex); BSON_ASSERT (!future->resolved); BSON_ASSERT (future->return_value.type == return_value.type); future->return_value = return_value; future->resolved = true; mongoc_cond_signal (&future->cond); bson_mutex_unlock (&future->mutex); } bool future_wait_max (future_t *future, int64_t timeout_ms) { int64_t remaining_usec = timeout_ms * 1000; int64_t deadline = bson_get_monotonic_time () + timeout_ms * 1000; bool resolved; bson_mutex_lock (&future->mutex); while (!future->resolved && remaining_usec > 0) { mongoc_cond_timedwait (&future->cond, &future->mutex, remaining_usec / 1000); remaining_usec = deadline - bson_get_monotonic_time (); } resolved = future->resolved; bson_mutex_unlock (&future->mutex); if (resolved) { future->awaited = true; /* free memory */ mcommon_thread_join (future->thread); } return resolved; } bool future_wait (future_t *future) { return future_wait_max (future, get_future_timeout_ms ()); } void future_destroy (future_t *future) { BSON_ASSERT (future->awaited); bson_free (future->argv); mongoc_cond_destroy (&future->cond); bson_mutex_destroy (&future->mutex); bson_free (future); } mongo-c-driver-1.26.0/build/future_function_templates/future.h.template000066400000000000000000000017371456567454500263560ustar00rootroot00000000000000#ifndef FUTURE_H #define FUTURE_H #include #include "future-value.h" #include "mongoc/mongoc-thread-private.h" {{ header_comment }} typedef struct { bool resolved; bool awaited; future_value_t return_value; int argc; future_value_t *argv; mongoc_cond_t cond; bson_mutex_t mutex; bson_thread_t thread; } future_t; future_t *future_new (future_value_type_t return_type, int argc); future_value_t *future_get_param (future_t *future, int i); void future_start (future_t *future, BSON_THREAD_FUN_TYPE (start_routine)); void future_resolve (future_t *future, future_value_t return_value); bool future_wait (future_t *future); bool future_wait_max (future_t *future, int64_t timeout_ms); void future_get_void (future_t *future); {% for T in type_list %} {{ T }} future_get_{{ T }} (future_t *future); {% endfor %} void future_destroy (future_t *future); #endif /* FUTURE_H */ mongo-c-driver-1.26.0/build/generate-future-functions.py000066400000000000000000000630461456567454500232470ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2015 MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Generate test functions for use with mock_server_t. Defines functions like future_cursor_next in future-functions.h and future-functions.c, which defer a libmongoc operation to a background thread via functions like background_cursor_next. Also defines functions like future_value_set_bson_ptr and future_value_get_bson_ptr which support the future / background functions, and functions like future_get_bson_ptr which wait for a future to resolve, then return its value. These future functions are used in conjunction with mock_server_t to conveniently test libmongoc wire protocol operations. Written for Python 2.6+, requires Jinja 2 for templating. """ from collections import namedtuple from os.path import basename, dirname, join as joinpath, normpath # Please "pip install jinja2". from jinja2 import Environment, FileSystemLoader this_dir = dirname(__file__) template_dir = joinpath(this_dir, 'future_function_templates') mock_server_dir = normpath( joinpath(this_dir, '../src/libmongoc/tests/mock_server')) # Add additional types here. Use typedefs for derived types so they can # be named with one symbol. typedef = namedtuple("typedef", ["name", "typedef"]) # These are typedef'ed if necessary in future-value.h, and added to the union # of possible future_value_t.value types. future_value_t getters and setters # are generated for all types, as well as future_t getters. typedef_list = [ # Fundamental. typedef("bool", None), typedef("char_ptr", "char *"), typedef("char_ptr_ptr", "char **"), typedef("int", None), typedef("int64_t", None), typedef("size_t", None), typedef("ssize_t", None), typedef("uint32_t", None), typedef("void_ptr", "void *"), # Const fundamental. typedef("const_char_ptr", "const char *"), typedef("bool_ptr", "bool *"), # libbson. typedef("bson_error_ptr", "bson_error_t *"), typedef("bson_ptr", "bson_t *"), # Const libbson. typedef("const_bson_ptr", "const bson_t *"), typedef("const_bson_ptr_ptr", "const bson_t **"), # libmongoc. typedef("mongoc_async_ptr", "mongoc_async_t *"), typedef("mongoc_bulk_operation_ptr", "mongoc_bulk_operation_t *"), typedef("mongoc_client_ptr", "mongoc_client_t *"), typedef("mongoc_client_pool_ptr", "mongoc_client_pool_t *"), typedef("mongoc_collection_ptr", "mongoc_collection_t *"), typedef("mongoc_cluster_ptr", "mongoc_cluster_t *"), typedef("mongoc_cmd_parts_ptr", "mongoc_cmd_parts_t *"), typedef("mongoc_cursor_ptr", "mongoc_cursor_t *"), typedef("mongoc_database_ptr", "mongoc_database_t *"), typedef("mongoc_gridfs_file_ptr", "mongoc_gridfs_file_t *"), typedef("mongoc_gridfs_ptr", "mongoc_gridfs_t *"), typedef("mongoc_insert_flags_t", None), typedef("mongoc_iovec_ptr", "mongoc_iovec_t *"), typedef("mongoc_server_stream_ptr", "mongoc_server_stream_t *"), typedef("mongoc_query_flags_t", None), typedef("const_mongoc_index_opt_t", "const mongoc_index_opt_t *"), typedef("mongoc_server_description_ptr", "mongoc_server_description_t *"), typedef("mongoc_ss_optype_t", None), typedef("mongoc_topology_ptr", "mongoc_topology_t *"), typedef("mongoc_write_concern_ptr", "mongoc_write_concern_t *"), typedef("mongoc_change_stream_ptr", "mongoc_change_stream_t *"), typedef("mongoc_remove_flags_t", None), # Const libmongoc. typedef("const_mongoc_find_and_modify_opts_ptr", "const mongoc_find_and_modify_opts_t *"), typedef("const_mongoc_iovec_ptr", "const mongoc_iovec_t *"), typedef("const_mongoc_read_prefs_ptr", "const mongoc_read_prefs_t *"), typedef("const_mongoc_write_concern_ptr", "const mongoc_write_concern_t *"), ] type_list = [T.name for T in typedef_list] type_list_with_void = type_list + ['void'] param = namedtuple("param", ["type_name", "name"]) future_function = namedtuple("future_function", ["ret_type", "name", "params"]) # Add additional functions to be tested here. For a name like "cursor_next", we # generate two functions: future_cursor_next to prepare the future_t and launch # a background thread, and background_cursor_next to run on the thread and # resolve the future. future_functions = [ future_function("void", "mongoc_async_run", [param("mongoc_async_ptr", "async")]), future_function("uint32_t", "mongoc_bulk_operation_execute", [param("mongoc_bulk_operation_ptr", "bulk"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_database_read_command_with_opts", [param("mongoc_database_ptr", "database"), param("const_bson_ptr", "command"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_database_read_write_command_with_opts", [param("mongoc_database_ptr", "database"), param("const_bson_ptr", "command"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_database_write_command_with_opts", [param("mongoc_database_ptr", "database"), param("const_bson_ptr", "command"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_client_command_simple", [param("mongoc_client_ptr", "client"), param("const_char_ptr", "db_name"), param("const_bson_ptr", "command"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_client_command_with_opts", [param("mongoc_client_ptr", "client"), param("const_char_ptr", "db_name"), param("const_bson_ptr", "command"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_client_read_command_with_opts", [param("mongoc_client_ptr", "client"), param("const_char_ptr", "db_name"), param("const_bson_ptr", "command"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_client_write_command_with_opts", [param("mongoc_client_ptr", "client"), param("const_char_ptr", "db_name"), param("const_bson_ptr", "command"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_client_read_write_command_with_opts", [param("mongoc_client_ptr", "client"), param("const_char_ptr", "db_name"), param("const_bson_ptr", "command"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("void", "mongoc_client_kill_cursor", [param("mongoc_client_ptr", "client"), param("int64_t", "cursor_id")]), future_function("mongoc_change_stream_ptr", "mongoc_client_watch", [param("mongoc_client_ptr", "client"), param("const_bson_ptr", "pipeline"), param("const_bson_ptr", "opts")]), future_function("mongoc_cursor_ptr", "mongoc_collection_aggregate", [param("mongoc_collection_ptr", "collection"), param("mongoc_query_flags_t", "flags"), param("const_bson_ptr", "pipeline"), param("const_bson_ptr", "options"), param("const_mongoc_read_prefs_ptr", "read_prefs")]), future_function("int64_t", "mongoc_collection_count", [param("mongoc_collection_ptr", "collection"), param("mongoc_query_flags_t", "flags"), param("const_bson_ptr", "query"), param("int64_t", "skip"), param("int64_t", "limit"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("bson_error_ptr", "error")]), future_function("int64_t", "mongoc_collection_count_with_opts", [param("mongoc_collection_ptr", "collection"), param("mongoc_query_flags_t", "flags"), param("const_bson_ptr", "query"), param("int64_t", "skip"), param("int64_t", "limit"), param("const_bson_ptr", "opts"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_create_index_with_opts", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "keys"), param("const_mongoc_index_opt_t", "opt"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_drop_index_with_opts", [param("mongoc_collection_ptr", "collection"), param("const_char_ptr", "index_name"), param("const_bson_ptr", "opts"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_drop_with_opts", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "opts"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_find_and_modify_with_opts", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "query"), param("const_mongoc_find_and_modify_opts_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_find_and_modify", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "query"), param("const_bson_ptr", "sort"), param("const_bson_ptr", "update"), param("const_bson_ptr", "fields"), param("bool", "_remove"), param("bool", "upsert"), param("bool", "_new"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("mongoc_cursor_ptr", "mongoc_collection_find_indexes_with_opts", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "opts")]), future_function("bool", "mongoc_collection_stats", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "options"), param("bson_ptr", "stats"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_insert_many", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr_ptr", "documents"), param("size_t", "n_documents"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_insert_one", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "document"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_read_command_with_opts", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "command"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_read_write_command_with_opts", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "command"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_write_command_with_opts", [param("mongoc_collection_ptr", "collection"), param("const_bson_ptr", "command"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_insert_bulk", [param("mongoc_collection_ptr", "collection"), param("mongoc_insert_flags_t", "flags"), param("const_bson_ptr_ptr", "documents"), param("uint32_t", "n_documents"), param("const_mongoc_write_concern_ptr", "write_concern"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_cluster_run_command_parts", [param("mongoc_cluster_ptr", "cluster"), param("mongoc_server_stream_ptr", "server_stream"), param("mongoc_cmd_parts_ptr", "parts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("void", "mongoc_cursor_destroy", [param("mongoc_cursor_ptr", "cursor")]), future_function("bool", "mongoc_cursor_next", [param("mongoc_cursor_ptr", "cursor"), param("const_bson_ptr_ptr", "doc")]), future_function("char_ptr_ptr", "mongoc_client_get_database_names_with_opts", [param("mongoc_client_ptr", "client"), param("const_bson_ptr", "opts"), param("bson_error_ptr", "error")]), future_function("mongoc_server_description_ptr", "mongoc_client_select_server", [param("mongoc_client_ptr", "client"), param("bool", "for_writes"), param("const_mongoc_read_prefs_ptr", "prefs"), param("bson_error_ptr", "error")]), future_function("void", "mongoc_client_destroy", [param("mongoc_client_ptr", "client")]), future_function("void", "mongoc_client_pool_destroy", [param("mongoc_client_pool_ptr", "pool")]), future_function("bool", "mongoc_database_command_simple", [param("mongoc_database_ptr", "database"), param("bson_ptr", "command"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_database_drop_with_opts", [param("mongoc_database_ptr", "database"), param("const_bson_ptr", "opts"), param("bson_error_ptr", "error")]), future_function("char_ptr_ptr", "mongoc_database_get_collection_names_with_opts", [param("mongoc_database_ptr", "database"), param("const_bson_ptr", "opts"), param("bson_error_ptr", "error")]), future_function("mongoc_change_stream_ptr", "mongoc_database_watch", [param("mongoc_database_ptr", "database"), param("const_bson_ptr", "pipeline"), param("const_bson_ptr", "opts")]), future_function("ssize_t", "mongoc_gridfs_file_readv", [param("mongoc_gridfs_file_ptr", "file"), param("mongoc_iovec_ptr", "iov"), param("size_t", "iovcnt"), param("size_t", "min_bytes"), param("uint32_t", "timeout_msec")]), future_function("mongoc_gridfs_file_ptr", "mongoc_gridfs_find_one", [param("mongoc_gridfs_ptr", "gridfs"), param("const_bson_ptr", "query"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_gridfs_file_remove", [param("mongoc_gridfs_file_ptr", "file"), param("bson_error_ptr", "error")]), future_function("int", "mongoc_gridfs_file_seek", [param("mongoc_gridfs_file_ptr", "file"), param("int64_t", "delta"), param("int", "whence")]), future_function("ssize_t", "mongoc_gridfs_file_writev", [param("mongoc_gridfs_file_ptr", "file"), param("const_mongoc_iovec_ptr", "iov"), param("size_t", "iovcnt"), param("uint32_t", "timeout_msec")]), future_function("mongoc_gridfs_file_ptr", "mongoc_gridfs_find_one_with_opts", [param("mongoc_gridfs_ptr", "gridfs"), param("const_bson_ptr", "filter"), param("const_bson_ptr", "opts"), param("bson_error_ptr", "error")]), future_function("mongoc_server_description_ptr", "mongoc_topology_select", [param("mongoc_topology_ptr", "topology"), param("mongoc_ss_optype_t", "optype"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("bool_ptr", "must_use_primary"), param("bson_error_ptr", "error")]), future_function("mongoc_gridfs_ptr", "mongoc_client_get_gridfs", [param("mongoc_client_ptr", "client"), param("const_char_ptr", "db"), param("const_char_ptr", "prefix"), param("bson_error_ptr", "error")]), future_function("mongoc_change_stream_ptr", "mongoc_collection_watch", [param("mongoc_collection_ptr", "coll"), param("const_bson_ptr", "pipeline"), param("const_bson_ptr", "opts")]), future_function("bool", "mongoc_change_stream_next", [param("mongoc_change_stream_ptr", "stream"), param("const_bson_ptr_ptr", "bson")]), future_function("void", "mongoc_change_stream_destroy", [param("mongoc_change_stream_ptr", "stream")]), future_function("bool", "mongoc_collection_delete_one", [param("mongoc_collection_ptr", "coll"), param("const_bson_ptr", "selector"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_delete_many", [param("mongoc_collection_ptr", "coll"), param("const_bson_ptr", "selector"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_remove", [param("mongoc_collection_ptr", "coll"), param("mongoc_remove_flags_t", "flags"), param("const_bson_ptr", "selector"), param("const_mongoc_write_concern_ptr", "write_concern"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_update_one", [param("mongoc_collection_ptr", "coll"), param("const_bson_ptr", "selector"), param("const_bson_ptr", "update"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_update_many", [param("mongoc_collection_ptr", "coll"), param("const_bson_ptr", "selector"), param("const_bson_ptr", "update"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("bool", "mongoc_collection_replace_one", [param("mongoc_collection_ptr", "coll"), param("const_bson_ptr", "selector"), param("const_bson_ptr", "replacement"), param("const_bson_ptr", "opts"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("int64_t", "mongoc_collection_count_documents", [param("mongoc_collection_ptr", "coll"), param("const_bson_ptr", "filter"), param("const_bson_ptr", "opts"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), future_function("int64_t", "mongoc_collection_estimated_document_count", [param("mongoc_collection_ptr", "coll"), param("const_bson_ptr", "opts"), param("const_mongoc_read_prefs_ptr", "read_prefs"), param("bson_ptr", "reply"), param("bson_error_ptr", "error")]), ] for fn in future_functions: if fn.ret_type not in type_list_with_void: raise Exception('bad type "%s"\n\nin %s' % (fn.ret_type, fn)) for p in fn.params: if p.type_name not in type_list: raise Exception('bad type "%s"\n\nin %s' % (p.type_name, fn)) header_comment = """/************************************************** * * Generated by build/%s. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */""" % basename(__file__) def future_function_name(fn): if fn.name.startswith('mongoc'): # E.g. future_cursor_next(). return 'future' + fn.name[len('mongoc'):] else: # E.g. future__mongoc_client_kill_cursor(). return 'future_' + fn.name env = Environment(loader=FileSystemLoader(template_dir)) env.filters['future_function_name'] = future_function_name files = ["future.h", "future.c", "future-value.h", "future-value.c", "future-functions.h", "future-functions.c"] for file_name in files: print(file_name) with open(joinpath(mock_server_dir, file_name), 'w+') as f: t = env.get_template(file_name + ".template") f.write(t.render(globals())) f.write('\n') mongo-c-driver-1.26.0/build/generate-opts.py000066400000000000000000000454001456567454500207060ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2017-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """IDL for functions that take flexible options as a bson_t. Defines the options accepted by functions that receive a const bson_t *opts, for example mongoc_collection_find_with_opts, mongoc_collection_insert_one, and many others. Generates struct types, options parsing code, and RST documentation. Written for Python 2.6+, requires Jinja 2 for templating. """ # yapf: disable from collections import OrderedDict from os.path import basename, dirname, join as joinpath, normpath import re from jinja2 import Environment, FileSystemLoader # Please "pip install jinja2". this_dir = dirname(__file__) template_dir = joinpath(this_dir, 'opts_templates') src_dir = normpath(joinpath(this_dir, '../src/libmongoc/src/mongoc')) doc_includes = normpath(joinpath(this_dir, '../src/libmongoc/doc/includes')) def flatten(items): for item in items: if isinstance(item, list): # "yield from". for subitem in flatten(item): yield subitem else: yield item class Struct(OrderedDict): def __init__(self, items, opts_name='opts', generate_rst=True, generate_code=True, allow_extra=True, **defaults): """Define an options struct. - items: List of pairs: (optionName, info) - opts_name: Name of the const bson_t *opts parameter - allow_extra: Whether to allow unrecognized options - defaults: Initial values for options """ OrderedDict.__init__(self, list(flatten(items))) self.is_shared = False self.opts_name = opts_name self.generate_rst = generate_rst self.generate_code = generate_code self.allow_extra = allow_extra self.defaults = defaults def default(self, item, fallback): return self.defaults.get(item, fallback) class Shared(Struct): def __init__(self, items, **defaults): """Define a struct that is shared by others.""" super(Shared, self).__init__(items, **defaults) self.is_shared = True self.generate_rst = False read_concern_help = 'Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned.' read_concern_document_option = ('readConcern', { 'type': 'document', 'help': read_concern_help }) read_concern_option = ('readConcern', { 'type': 'mongoc_read_concern_t *', 'help': read_concern_help, 'convert': '_mongoc_convert_read_concern' }) write_concern_option = [ ('writeConcern', { 'type': 'mongoc_write_concern_t *', 'convert': '_mongoc_convert_write_concern', 'help': 'Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`.' }), ('write_concern_owned', { 'type': 'bool', 'internal': True, }) ] session_option = ('sessionId', { 'type': 'mongoc_client_session_t *', 'convert': '_mongoc_convert_session_id', 'field': 'client_session', 'help': 'First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`.' }) ordered_option = ('ordered', { 'type': 'bool', 'help': 'set to ``false`` to attempt to insert all documents, continuing after errors.' }) validate_option = ('validate', { 'type': 'bson_validate_flags_t', 'convert': '_mongoc_convert_validate_flags', 'help': 'Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents.' }) collation_option = ('collation', { 'type': 'document', 'help': 'Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned.' }) array_filters_option = ('arrayFilters', { 'type': 'array', 'help': 'An array of filters specifying to which array elements an update should apply.', }) upsert_option = ('upsert', { 'type': 'bool', 'help': 'When true, creates a new document if no document matches the query.' }) bypass_option = ('bypassDocumentValidation', { 'type': 'bool', 'field': 'bypass', 'help': 'Set to ``true`` to skip server-side schema validation of the provided BSON documents.' }) server_option = ('serverId', { 'type': 'uint32_t', 'convert': '_mongoc_convert_server_id', 'help': 'To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value.' }) hint_option = ('hint', { 'type': 'bson_value_t', 'convert': '_mongoc_convert_hint', 'help': 'A document or string that specifies the index to use to support the query predicate.' }) let_option = ('let', { 'type': 'document', 'help': 'A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language.' }) comment_option_since_4_4 = ('comment', { 'type': 'bson_value_t', 'convert': '_mongoc_convert_bson_value_t', 'help': 'A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later.' }) comment_option_string_pre_4_4 = ('comment', { 'type': 'bson_value_t', 'convert': '_mongoc_convert_bson_value_t', 'help': 'A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Only string values are supported prior to MongoDB 4.4.' }) opts_structs = OrderedDict([ ('mongoc_crud_opts_t', Shared([ write_concern_option, session_option, validate_option, comment_option_since_4_4, ])), ('mongoc_update_opts_t', Shared([ ('crud', {'type': 'mongoc_crud_opts_t'}), bypass_option, collation_option, hint_option, upsert_option, let_option, ])), ('mongoc_insert_one_opts_t', Struct([ ('crud', {'type': 'mongoc_crud_opts_t'}), bypass_option ], validate='_mongoc_default_insert_vflags')), ('mongoc_insert_many_opts_t', Struct([ ('crud', {'type': 'mongoc_crud_opts_t'}), ordered_option, bypass_option, ], validate='_mongoc_default_insert_vflags', ordered='true')), ('mongoc_delete_opts_t', Shared([ ('crud', {'type': 'mongoc_crud_opts_t'}), collation_option, hint_option, let_option, ])), ('mongoc_delete_one_opts_t', Struct([ ('delete', {'type': 'mongoc_delete_opts_t'}), ])), ('mongoc_delete_many_opts_t', Struct([ ('delete', {'type': 'mongoc_delete_opts_t'}), ])), ('mongoc_update_one_opts_t', Struct([ ('update', {'type': 'mongoc_update_opts_t'}), array_filters_option, ], validate='_mongoc_default_update_vflags')), ('mongoc_update_many_opts_t', Struct([ ('update', {'type': 'mongoc_update_opts_t'}), array_filters_option, ], validate='_mongoc_default_update_vflags')), ('mongoc_replace_one_opts_t', Struct([ ('update', {'type': 'mongoc_update_opts_t'}), ], validate='_mongoc_default_replace_vflags')), ('mongoc_bulk_opts_t', Struct([ write_concern_option, ordered_option, session_option, let_option, comment_option_since_4_4, ], allow_extra=False, ordered='true')), ('mongoc_bulk_insert_opts_t', Struct([ validate_option, ], validate='_mongoc_default_insert_vflags', allow_extra=False)), ('mongoc_bulk_update_opts_t', Shared([ validate_option, collation_option, hint_option, ('upsert', { 'type': 'bool', 'help': 'If true, insert a document if none match ``selector``.' }), ('multi', {'type': 'bool', 'hidden': True}) ])), ('mongoc_bulk_update_one_opts_t', Struct( [ ('update', {'type': 'mongoc_bulk_update_opts_t'}), array_filters_option, ], multi='false', validate='_mongoc_default_update_vflags', allow_extra=False)), ('mongoc_bulk_update_many_opts_t', Struct( [ ('update', {'type': 'mongoc_bulk_update_opts_t'}), array_filters_option, ], multi='true', validate='_mongoc_default_update_vflags', allow_extra=False)), ('mongoc_bulk_replace_one_opts_t', Struct( [('update', {'type': 'mongoc_bulk_update_opts_t'})], multi='false', validate='_mongoc_default_replace_vflags', allow_extra=False)), ('mongoc_bulk_remove_opts_t', Shared([ collation_option, hint_option, ('limit', {'type': 'int32_t', 'hidden': True}) ])), ('mongoc_bulk_remove_one_opts_t', Struct([ ('remove', {'type': 'mongoc_bulk_remove_opts_t'}), ], limit=1, allow_extra=False)), ('mongoc_bulk_remove_many_opts_t', Struct([ ('remove', {'type': 'mongoc_bulk_remove_opts_t'}), ], limit=0, allow_extra=False)), ('mongoc_change_stream_opts_t', Struct([ ('batchSize', {'type': 'int32_t', 'help': 'An ``int32`` representing number of documents requested to be returned on each call to :symbol:`mongoc_change_stream_next`'}), ('resumeAfter', {'type': 'document', 'help': 'A ``Document`` representing the logical starting point of the change stream. The result of :symbol:`mongoc_change_stream_get_resume_token()` or the ``_id`` field of any change received from a change stream can be used here. This option is mutually exclusive with ``startAfter`` and ``startAtOperationTime``.'}), ('startAfter', {'type': 'document', 'help': 'A ``Document`` representing the logical starting point of the change stream. Unlike ``resumeAfter``, this can resume notifications after an "invalidate" event. The result of :symbol:`mongoc_change_stream_get_resume_token()` or the ``_id`` field of any change received from a change stream can be used here. This option is mutually exclusive with ``resumeAfter`` and ``startAtOperationTime``.'}), ('startAtOperationTime', {'type': 'timestamp', 'help': 'A ``Timestamp``. The change stream only provides changes that occurred at or after the specified timestamp. Any command run against the server will return an operation time that can be used here. This option is mutually exclusive with ``resumeAfter`` and ``startAfter``.'}), ('maxAwaitTimeMS', {'type': 'int64_t', 'convert': '_mongoc_convert_int64_positive', 'help': 'An ``int64`` representing the maximum amount of time a call to :symbol:`mongoc_change_stream_next` will block waiting for data'}), ('fullDocument', { 'type': 'utf8', 'help': 'An optional UTF-8 string. Set this option to "default", ' '"updateLookup", "whenAvailable", or "required", If unset, ' 'The string "default" is assumed. Set this option to ' '"updateLookup" to direct the change stream cursor to ' 'lookup the most current majority-committed version of the ' 'document associated to an update change stream event.' }), ('fullDocumentBeforeChange', { 'type': 'utf8', 'help': 'An optional UTF-8 string. Set this option to ' '"whenAvailable", "required", or "off". When unset, the ' 'default value is "off". Similar to "fullDocument", but ' 'returns the value of the document before the associated ' 'change.', }), ('showExpandedEvents', { 'type': 'bool', 'help': 'Set to ``true`` to return an expanded list of change stream events. Available only on MongoDB versions >=6.0'}), comment_option_string_pre_4_4, ], fullDocument=None, fullDocumentBeforeChange=None)), ('mongoc_create_index_opts_t', Struct([ write_concern_option, session_option, ], opts_name='command_opts')), ('mongoc_read_write_opts_t', Struct([ read_concern_document_option, write_concern_option, session_option, collation_option, server_option, ])), # Only for documentation - we use mongoc_read_write_opts_t for real parsing. ('mongoc_read_opts_t', Struct([ read_concern_document_option, session_option, collation_option, server_option, ], generate_code=False)), ('mongoc_write_opts_t', Struct([ write_concern_option, session_option, collation_option, server_option, ], generate_code=False)), ('mongoc_gridfs_bucket_opts_t', Struct([ ('bucketName', {'type': 'utf8', 'help': 'A UTF-8 string used as the prefix to the GridFS "chunks" and "files" collections. Defaults to "fs". The bucket name, together with the database and suffix collections must not exceed 120 characters. See the manual for `the max namespace length `_.'}), ('chunkSizeBytes', {'type': 'int32_t', 'convert': '_mongoc_convert_int32_positive', 'help': 'An ``int32`` representing the chunk size. Defaults to 255KB.'}), write_concern_option, read_concern_option ], bucketName="fs", chunkSizeBytes=(255 * 1024))), ('mongoc_gridfs_bucket_upload_opts_t', Struct([ ('chunkSizeBytes', {'type': 'int32_t', 'convert': '_mongoc_convert_int32_positive', 'help': 'An ``int32`` chunk size to use for this file. Overrides the ``chunkSizeBytes`` set on ``bucket``.'}), ('metadata', {'type': 'document', 'help': 'A :symbol:`bson_t` representing metadata to include with the file.'}) ])), ('mongoc_aggregate_opts_t', Struct([ read_concern_option, write_concern_option, session_option, bypass_option, collation_option, server_option, ('batchSize', {'type': 'int32_t', 'help': 'An ``int32`` representing number of documents requested to be returned on each call to :symbol:`mongoc_cursor_next`', 'check_set': True}), let_option, comment_option_string_pre_4_4, hint_option, ])), ('mongoc_find_and_modify_appended_opts_t', Struct([ write_concern_option, session_option, hint_option, let_option, comment_option_since_4_4, ], opts_name='extra')), ('mongoc_count_document_opts_t', Struct([ read_concern_document_option, session_option, collation_option, server_option, # The CRUD spec specifies `skip` and `limit` as int64_t. The server appears to accept int32 and double. The C driver accepts any bson_value_t and relies on the server to return an error for an invalid type. ('skip', {'type': 'bson_value_t', 'help': 'An int specifying how many documents matching the ``query`` should be skipped before counting.'}), ('limit', {'type': 'bson_value_t', 'help': 'An int specifying the maximum number of documents to count.'}), comment_option_string_pre_4_4, hint_option ])), ]) header_comment = """/************************************************** * * Generated by build/%s. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */""" % basename(__file__) def paths(struct): """Sequence of path, option name, option info.""" for option_name, info in struct.items(): the_type = info['type'] the_field = info.get('field', option_name) if the_type in opts_structs: # E.g., the type is mongoc_crud_opts_t. Recurse. sub_struct = opts_structs[the_type] for path, sub_option_name, sub_info in paths(sub_struct): yield ('%s.%s' % (the_field, path), sub_option_name, sub_info) else: yield the_field, option_name, info def path_to(the_type, the_field): """Like "mongoc_update_one_opts->update.crud.write_concern_owned".""" for path, name, info in paths(opts_structs[the_type]): if name == the_field: return path raise ValueError( "No field '%s' in '%s'" % (the_field, the_type)) env = Environment(loader=FileSystemLoader(template_dir), trim_blocks=True, extensions=['jinja2.ext.loopcontrols']) files = ["mongoc-opts-private.h", "mongoc-opts.c"] for file_name in files: print(file_name) with open(joinpath(src_dir, file_name), 'w+') as f: t = env.get_template(file_name + ".template") f.write(t.render(globals())) f.write('\n') def document_opts(struct, f): for option_name, info in struct.items(): if info.get('internal') or info.get('hidden'): continue the_type = info['type'] if the_type in opts_structs: # E.g., the type is mongoc_crud_opts_t. Recurse. document_opts(opts_structs[the_type], f) continue assert 'help' in info, "No 'help' for '%s'" % option_name f.write("* ``{option_name}``: {info[help]}\n".format(**locals())) disclaimer = """ .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE """ for struct_name, struct in opts_structs.items(): if not struct.generate_rst: continue name = re.sub(r'mongoc_(\w+)_t', r'\1', struct_name).replace('_', '-') file_name = name + '.txt' print(file_name) f = open(joinpath(doc_includes, file_name), 'w') f.write (disclaimer) f.write( "``%s`` may be NULL or a BSON document with additional" " command options:\n\n" % struct.opts_name) document_opts(struct, f) f.close() mongo-c-driver-1.26.0/build/mongodl.py000066400000000000000000000564421456567454500176000ustar00rootroot00000000000000""" Download and extract MongoDB components. Use '--help' for more information. """ import argparse import enum import hashlib import json import os import platform import re import shutil import sqlite3 import sys import tarfile import tempfile import textwrap import urllib.error import urllib.request import zipfile from collections import namedtuple from contextlib import contextmanager from fnmatch import fnmatch from pathlib import Path, PurePath, PurePosixPath DISTRO_ID_MAP = { 'elementary': 'ubuntu', 'fedora': 'rhel', 'centos': 'rhel', 'mint': 'ubuntu', 'linuxmint': 'ubuntu', 'opensuse-leap': 'sles', 'opensuse': 'sles', 'redhat': 'rhel', 'rocky': 'rhel', 'ol': 'rhel', } DISTRO_VERSION_MAP = { 'elementary': { '6': '20.04' }, 'fedora': { '32': '8', '33': '8', '34': '8', '35': '8', '36': '8' }, 'linuxmint': { '19': '18.04', '19.1': '18.04', '19.2': '18.04', '19.3': '18.04', '20': '20.04', '20.1': '20.04', '20.2': '20.04', '20.3': '20.04', '21': '22.04' }, } DISTRO_ID_TO_TARGET = { 'ubuntu': { '22.*': 'ubuntu2204', '20.*': 'ubuntu2004', '18.*': 'ubuntu1804', '16.*': 'ubuntu1604', '14.*': 'ubuntu1404', }, 'debian': { '9': 'debian92', '10': 'debian10', '11': 'debian11', }, 'rhel': { '6': 'rhel60', '6.*': 'rhel60', '7': 'rhel70', '7.*': 'rhel70', '8': 'rhel80', '8.*': 'rhel80', }, 'sles': { '10.*': 'suse10', '11.*': 'suse11', '12.*': 'suse12', '13.*': 'suse13', '15.*': 'suse15', }, 'amzn': { '2018.*': 'amzn64', '2': 'amazon2', }, } def infer_target(): if sys.platform == 'win32': return 'windows' if sys.platform == 'darwin': return 'macos' # Now the tricky bit cands = map(Path, ['/etc/os-release', '/usr/lib/os-release']) for c in cands: if c.is_file(): return _infer_target_os_rel(c) raise RuntimeError("We don't know how to find the default '--target'" " option for this system. Please contribute!") def _infer_target_os_rel(os_rel_path: Path): with Path(os_rel_path).open('r', encoding='utf-8') as f: content = f.read() id_re = re.compile(r'\bID=("?)(.*)\1') mat = id_re.search(content) assert mat, 'Unable to detect ID from [{}] content:\n{}'.format( os_rel_path, content) os_id = mat.group(2) if os_id == 'arch': # There are no Archlinux-specific MongoDB downloads, so we'll just use # the build for RHEL8, which is reasonably compatible with other modern # distributions (including Arch). return 'rhel80' ver_id_re = re.compile(r'VERSION_ID=("?)(.*)\1') mat = ver_id_re.search(content) assert mat, 'Unable to detect VERSION_ID from [{}] content:\n{}'.format( os_rel_path, content) ver_id = mat.group(2) mapped_id = DISTRO_ID_MAP.get(os_id) if mapped_id: print('Mapping distro "{}" to "{}"'.format(os_id, mapped_id)) ver_mapper = DISTRO_VERSION_MAP.get(os_id) if ver_mapper: mapped_version = ver_mapper[ver_id] print('Mapping version "{}" to "{}"'.format( ver_id, mapped_version)) ver_id = mapped_version os_id = mapped_id os_id = os_id.lower() if os_id not in DISTRO_ID_TO_TARGET: raise RuntimeError("We don't know how to map '{}' to a distribution " "download target. Please contribute!".format(os_id)) ver_table = DISTRO_ID_TO_TARGET[os_id] for pattern, target in ver_table.items(): if fnmatch(ver_id, pattern): return target raise RuntimeError( "We don't know how to map '{}' version '{}' to a distribution " "download target. Please contribute!".format(os_id, ver_id)) def caches_root(): if sys.platform == 'win32': return Path(os.environ['LocalAppData']) if sys.platform == 'darwin': return Path(os.environ['HOME'] + '/Library/Caches') xdg_cache = os.getenv('XDG_CACHE_HOME') if xdg_cache: return Path(xdg_cache) return Path(os.environ['HOME'] + '/.cache') def cache_dir(): return caches_root().joinpath('mongodl').absolute() @contextmanager def tmp_dir(): tdir = tempfile.mkdtemp() try: yield Path(tdir) finally: shutil.rmtree(tdir) def _import_json_data(db, json_file): db.execute('DELETE FROM meta') db.execute('DROP TABLE IF EXISTS components') db.execute('DROP TABLE IF EXISTS downloads') db.execute('DROP TABLE IF EXISTS versions') db.execute(r''' CREATE TABLE versions ( version_id INTEGER PRIMARY KEY, date TEXT NOT NULL, version TEXT NOT NULL, githash TEXT NOT NULL ) ''') db.execute(r''' CREATE TABLE downloads ( download_id INTEGER PRIMARY KEY, version_id INTEGER NOT NULL REFERENCES versions, target TEXT NOT NULL, arch TEXT NOT NULL, edition TEXT NOT NULL, ar_url TEST NOT NULL, data TEXT NOT NULL ) ''') db.execute(r''' CREATE TABLE components ( component_id INTEGER PRIMARY KEY, key TEXT NOT NULL, download_id INTEGER NOT NULL REFERENCES downloads, data TEXT NOT NULL, UNIQUE(key, download_id) ) ''') with json_file.open('r') as f: data = json.load(f) for ver in data['versions']: version = ver['version'] githash = ver['githash'] date = ver['date'] db.execute( r''' INSERT INTO versions (date, version, githash) VALUES (?, ?, ?) ''', (date, version, githash), ) version_id = db.lastrowid for dl in ver['downloads']: arch = dl.get('arch', 'null') target = dl.get('target', 'null') edition = dl['edition'] ar_url = dl['archive']['url'] db.execute( r''' INSERT INTO downloads (version_id, target, arch, edition, ar_url, data) VALUES (?, ?, ?, ?, ?, ?) ''', (version_id, target, arch, edition, ar_url, json.dumps(dl)), ) dl_id = db.lastrowid for key, data in dl.items(): if 'url' not in data: continue db.execute( r''' INSERT INTO components (key, download_id, data) VALUES (?, ?, ?) ''', (key, dl_id, json.dumps(data)), ) def _mkdir(dirpath): """ Ensure a directory at ``dirpath``, and all parent directories thereof. Cannot using Path.mkdir(parents, exist_ok) on some Python versions that we need to support. """ if dirpath.is_dir(): return par = dirpath.parent if par != dirpath: _mkdir(par) try: dirpath.mkdir() except FileExistsError: pass def get_dl_db(): caches = cache_dir() _mkdir(caches) db = sqlite3.connect(str(caches / 'downloads.db'), isolation_level=None) db.executescript(r''' CREATE TABLE IF NOT EXISTS meta ( etag TEXT, last_modified TEXT ) ''') db.executescript(r''' CREATE TABLE IF NOT EXISTS past_downloads ( url TEXT NOT NULL UNIQUE, etag TEXT, last_modified TEXT ) ''') changed, full_json = _download_file( db, 'https://downloads.mongodb.org/full.json') if not changed: return db with db: print('Refreshing downloads manifest ...') cur = db.cursor() cur.execute("begin") _import_json_data(cur, full_json) return db def _print_list(db, version, target, arch, edition, component): if version or target or arch or edition or component: matching = db.execute( r''' SELECT version, target, arch, edition, key, components.data FROM components, downloads USING(download_id), versions USING(version_id) WHERE (:component IS NULL OR key=:component) AND (:target IS NULL OR target=:target) AND (:arch IS NULL OR arch=:arch) AND (:edition IS NULL OR edition=:edition) AND (:version IS NULL OR version=:version) ''', dict(version=version, target=target, arch=arch, edition=edition, component=component), ) for version, target, arch, edition, comp_key, comp_data in matching: print('Download: {}\n\n' ' Version: {}\n\n' ' Target: {}\n\n' ' Arch: {}\n\n' ' Edition: {}\n\n' ' Info: {}\n\n'.format(comp_key, version, target, arch, edition, comp_data)) print('(Omit filter arguments for a list of available filters)') return arches, targets, editions, versions, components = next( iter( db.execute(r''' VALUES( (select group_concat(arch, ', ') from (select distinct arch from downloads)), (select group_concat(target, ', ') from (select distinct target from downloads)), (select group_concat(edition, ', ') from (select distinct edition from downloads)), (select group_concat(version, ', ') from (select distinct version from versions)), (select group_concat(key, ', ') from (select distinct key from components)) ) '''))) versions = '\n'.join( textwrap.wrap(versions, width=78, initial_indent=' ', subsequent_indent=' ')) targets = '\n'.join( textwrap.wrap(targets, width=78, initial_indent=' ', subsequent_indent=' ')) print('Architectures:\n' ' {}\n' 'Targets:\n' '{}\n' 'Editions:\n' ' {}\n' 'Versions:\n' '{}\n' 'Components:\n' ' {}\n'.format(arches, targets, editions, versions, components)) def infer_arch(): a = platform.machine() or platform.processor() # Remap platform names to the names used for downloads return { 'AMD64': 'x86_64', }.get(a, a) DLRes = namedtuple('DLRes', ['is_changed', 'path']) def _download_file(db, url): caches = cache_dir() info = list( db.execute( 'SELECT etag, last_modified FROM past_downloads WHERE url=?', [url])) etag = None modtime = None if info: etag, modtime = info[0] headers = {} if etag: headers['If-None-Match'] = etag if modtime: headers['If-Modified-Since'] = modtime req = urllib.request.Request(url, headers=headers) digest = hashlib.md5(url.encode("utf-8")).hexdigest()[:4] dest = caches / 'files' / digest / PurePosixPath(url).name try: resp = urllib.request.urlopen(req) except urllib.error.HTTPError as e: if e.code != 304: raise return DLRes(False, dest) else: print('Downloading [{}] ...'.format(url)) _mkdir(dest.parent) got_etag = resp.getheader("ETag") got_modtime = resp.getheader('Last-Modified') with dest.open('wb') as of: buf = resp.read(1024 * 1024 * 4) while buf: of.write(buf) buf = resp.read(1024 * 1024 * 4) db.execute( 'INSERT OR REPLACE INTO past_downloads (url, etag, last_modified) VALUES (?, ?, ?)', (url, got_etag, got_modtime)) return DLRes(True, dest) def _dl_component(db, out_dir, version, target, arch, edition, component, pattern, strip_components, test): print('Download {} v{}-{} for {}-{}'.format(component, version, edition, target, arch)) matching = db.execute( r''' SELECT components.data FROM components, downloads USING(download_id), versions USING(version_id) WHERE target=:target AND arch=:arch AND edition=:edition AND version=:version AND key=:component ''', dict(version=version, target=target, arch=arch, edition=edition, component=component), ) found = list(matching) if not found: raise ValueError( 'No download for "{}" was found for ' 'the requested version+target+architecture+edition'.format( component)) data = json.loads(found[0][0]) cached = _download_file(db, data['url']).path return _expand_archive(cached, out_dir, pattern, strip_components, test=test) def pathjoin(items): """ Return a path formed by joining the given path components """ return PurePath('/'.join(items)) def _test_pattern(path, pattern): """ Test whether the given 'path' string matches the globbing pattern 'pattern'. Supports the '**' pattern to match any number of intermediate directories. """ if pattern is None: return True # Convert to path objects path = PurePath(path) pattern = PurePath(pattern) # Split pattern into parts pattern_parts = pattern.parts if not pattern_parts: # An empty pattern always matches return True path_parts = path.parts if not path_parts: # Non-empty pattern requires more path components return False pattern_head = pattern_parts[0] pattern_tail = pathjoin(pattern_parts[1:]) if pattern_head == '**': # Special "**" pattern matches and suffix of the path # Generate each suffix: tails = (path_parts[i:] for i in range(len(path_parts))) # Test if any of the suffixes match the remainder of the pattern: return any(_test_pattern(pathjoin(t), pattern_tail) for t in tails) if not fnmatch(path.parts[0], pattern_head): # Leading path component cannot match return False # The first component matches. Test the remainder: return _test_pattern(pathjoin(path_parts[1:]), pattern_tail) class ExpandResult(enum.Enum): Empty = 0 Okay = 1 def _expand_archive(ar, dest, pattern, strip_components, test): ''' Expand the archive members from 'ar' into 'dest'. If 'pattern' is not-None, only extracts members that match the pattern. ''' print('Extract from: [{}]'.format(ar.name)) print(' into: [{}]'.format(dest)) if ar.suffix == '.zip': n_extracted = _expand_zip(ar, dest, pattern, strip_components, test=test) elif ar.suffix == '.tgz': n_extracted = _expand_tgz(ar, dest, pattern, strip_components, test=test) else: raise RuntimeError('Unknown archive file extension: ' + ar.suffix) verb = 'would be' if test else 'were' if n_extracted == 0: if pattern and strip_components: print('NOTE: No files {verb} extracted. Likely all files {verb} ' 'excluded by "--only={p}" and/or "--strip-components={s}"'. format(p=pattern, s=strip_components, verb=verb)) elif pattern: print('NOTE: No files {verb} extracted. Likely all files {verb} ' 'excluded by the "--only={p}" filter'.format(p=pattern, verb=verb)) elif strip_components: print('NOTE: No files {verb} extracted. Likely all files {verb} ' 'excluded by "--strip-components={s}"'.format( s=strip_components, verb=verb)) else: print('NOTE: No files {verb} extracted. Empty archive?'.format( verb=verb)) return ExpandResult.Empty elif n_extracted == 1: print('One file {v} extracted'.format(v='would be' if test else 'was')) return ExpandResult.Okay else: print('{n} files {verb} extracted'.format(n=n_extracted, verb=verb)) return ExpandResult.Okay def _expand_tgz(ar, dest, pattern, strip_components, test): 'Expand a tar.gz archive' n_extracted = 0 with tarfile.open(str(ar), 'r:*') as tf: for mem in tf.getmembers(): n_extracted += _maybe_extract_member( dest, mem.name, pattern, strip_components, mem.isdir(), lambda: tf.extractfile(mem), mem.mode, test=test, ) return n_extracted def _expand_zip(ar, dest, pattern, strip_components, test): 'Expand a .zip archive.' n_extracted = 0 with zipfile.ZipFile(ar, 'r') as zf: for item in zf.infolist(): n_extracted += _maybe_extract_member( dest, item.filename, pattern, strip_components, item.is_dir(), lambda: zf.open(item, 'r'), 0o655, test=test, ) return n_extracted def _maybe_extract_member(out, relpath, pattern, strip, is_dir, opener, modebits, test): """ Try to extract an archive member according to the given arguments. :return: Zero if the file was excluded by filters, one otherwise. """ relpath = PurePath(relpath) print(' | {:-<65} |'.format(str(relpath) + ' '), end='') if len(relpath.parts) <= strip: # Not enough path components print(' (Excluded by --strip-components)') return 0 if not _test_pattern(relpath, pattern): # Doesn't match our pattern print(' (excluded by pattern)') return 0 stripped = pathjoin(relpath.parts[strip:]) dest = Path(out) / stripped print('\n -> [{}]'.format(dest)) if test: # We are running in test-only mode: Do not do anything return 1 if is_dir: _mkdir(dest) return 1 with opener() as infile: _mkdir(dest.parent) with dest.open('wb') as outfile: shutil.copyfileobj(infile, outfile) os.chmod(str(dest), modebits) return 1 def main(): parser = argparse.ArgumentParser(description=__doc__) grp = parser.add_argument_group('List arguments') grp.add_argument('--list', action='store_true', help='List available components, targets, editions, and ' 'architectures. Download arguments will act as filters.') dl_grp = parser.add_argument_group( 'Download arguments', description='Select what to download and extract. ' 'Non-required arguments will be inferred ' 'based on the host system.') dl_grp.add_argument('--target', '-T', help='The target platform for which to download. ' 'Use "--list" to list available targets.') dl_grp.add_argument('--arch', '-A', help='The architecture for which to download') dl_grp.add_argument( '--edition', '-E', help='The edition of the product to download (Default is "enterprise"). ' 'Use "--list" to list available editions.') dl_grp.add_argument( '--out', '-o', help='The directory in which to download components. (Required)', type=Path) dl_grp.add_argument('--version', '-V', help='The product version to download (Required). ' 'Use "--list" to list available versions.') dl_grp.add_argument('--component', '-C', help='The component to download (Required). ' 'Use "--list" to list available components.') dl_grp.add_argument( '--only', help= 'Restrict extraction to items that match the given globbing expression. ' 'The full archive member path is matched, so a pattern like "*.exe" ' 'will only match "*.exe" at the top level of the archive. To match ' 'recursively, use the "**" pattern to match any number of ' 'intermediate directories.') dl_grp.add_argument( '--strip-path-components', '-p', dest='strip_components', metavar='N', default=0, type=int, help= 'Strip the given number of path components from archive members before ' 'extracting into the destination. The relative path of the archive ' 'member will be used to form the destination path. For example, a ' 'member named [bin/mongod.exe] will be extracted to [/bin/mongod.exe]. ' 'Using --strip-components=1 will remove the first path component, extracting ' 'such an item to [/mongod.exe]. If the path has fewer than N components, ' 'that archive member will be ignored.') dl_grp.add_argument( '--test', action='store_true', help='Do not extract or place any files/directories. ' 'Only print what will be extracted without placing any files.') dl_grp.add_argument('--empty-is-error', action='store_true', help='If all files are excluded by other filters, ' 'treat that situation as an error and exit non-zero.') args = parser.parse_args() db = get_dl_db() if args.list: _print_list(db, args.version, args.target, args.arch, args.edition, args.component) return if args.version is None: raise argparse.ArgumentError(None, 'A "--version" is required') if args.component is None: raise argparse.ArgumentError( None, 'A "--component" name should be provided') if args.out is None: raise argparse.ArgumentError(None, 'A "--out" directory should be provided') target = args.target or infer_target() arch = args.arch or infer_arch() edition = args.edition or 'enterprise' out = args.out or Path.cwd() out = out.absolute() result = _dl_component(db, out, version=args.version, target=target, arch=arch, edition=edition, component=args.component, pattern=args.only, strip_components=args.strip_components, test=args.test) if result is ExpandResult.Empty: return 1 return 0 if __name__ == '__main__': sys.exit(main()) mongo-c-driver-1.26.0/build/opts_templates/000077500000000000000000000000001456567454500206175ustar00rootroot00000000000000mongo-c-driver-1.26.0/build/opts_templates/mongoc-opts-private.h.template000066400000000000000000000027661456567454500265320ustar00rootroot00000000000000#include "mongoc-prelude.h" #ifndef MONGOC_OPTS_H #define MONGOC_OPTS_H #include #include "mongoc-client-session.h" #include "mongoc-bulk-operation-private.h" #include "mongoc-opts-helpers-private.h" {{ header_comment }} {% for struct_type, description in opts_structs.items() %} {% if not description.generate_code %}{% continue %}{% endif %} typedef struct _{{ struct_type }} { {% for opt_name, info in description.items() %} {% if info['type'] == 'utf8' %} {% set the_type = 'const char *' %} {% elif info['type'] in ('document', 'array') %} {% set the_type = 'bson_t' %} {% elif info['type'] == 'timestamp' %} {% set the_type = 'mongoc_timestamp_t' %} {% else %} {% set the_type = info['type'] %} {% endif %} {% set the_name = info.get('field', opt_name) %} {% set space = '' if the_type.endswith('*') else ' ' %} {{ the_type }}{{ space }}{{ the_name }}; {% if info.check_set %} bool {{ the_name }}_is_set; {% endif %} {% endfor %} {% if not description.is_shared %} bson_t extra; {% endif %} } {{ struct_type }}; {% endfor %} {% for struct_type, description in opts_structs.items() %} {% if description.is_shared or not description.generate_code %}{% continue %}{% endif %} {% set struct_name = struct_type.split('_t', -1)[0] %} bool _{{ struct_name }}_parse ( mongoc_client_t *client, const bson_t *opts, {{ struct_type }} *{{ struct_name }}, bson_error_t *error); void _{{ struct_name }}_cleanup ({{ struct_type }} *{{ struct_name }}); {% endfor %} #endif /* MONGOC_OPTS_H */ mongo-c-driver-1.26.0/build/opts_templates/mongoc-opts.c.template000066400000000000000000000114301456567454500250410ustar00rootroot00000000000000#include "mongoc-opts-helpers-private.h" #include "mongoc-opts-private.h" #include "mongoc-error.h" #include "mongoc-util-private.h" #include "mongoc-client-private.h" {{ header_comment }} {% for struct_type, description in opts_structs.items() %} {% if description.is_shared or not description.generate_code %}{% continue %}{% endif %} {% set struct_name = struct_type.split('_t', -1)[0] %} bool _{{ struct_name }}_parse ( mongoc_client_t *client, const bson_t *opts, {{ struct_type }} *{{ struct_name }}, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. {% for path, opt_name, info in paths(description) %} {% if info['type'] == 'bool' %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 'false') }}; {% elif info['type'].startswith('int') or info['type'].startswith('uint') %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 0) }}; {% elif info['type'] == 'bson_validate_flags_t' %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 'BSON_VALIDATE_NONE') }}; {% elif info['type'] == 'mongoc_write_bypass_document_validation_t' %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 'MONGOC_BYPASS_DOCUMENT_VALIDATION_DEFAULT') }}; {% elif info['type'] == 'bson_value_t' %} memset (&{{ struct_name }}->{{ path }}, 0, sizeof (bson_value_t)); {% elif info['type'] in ('document', 'array') %} bson_init (&{{ struct_name }}->{{ path }}); {% elif info['type'] == 'utf8' %} {% set dflt = description.default(opt_name, "") -%} {{ struct_name }}->{{ path }} = {{ "NULL" if dflt is none else (dflt|tojson) }}; {% elif info['type'] == 'timestamp' %} memset (&{{ struct_name }}->{{ path }}, 0, sizeof (mongoc_timestamp_t)); {% else %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 'NULL') }}; {% endif %} {% if info['check_set'] %} {{ struct_name }}->{{ opt_name }}_is_set = false; {% endif %} {% endfor %} bson_init (&{{ struct_name }}->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { bson_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { {% for path, opt_name, info in paths(description) %} {% if info.get('internal') %} {% continue %} {% endif %} {% if info['type'] == 'utf8' %} {% set the_type = 'const char *' %} {% elif info['type'] in ('document', 'array') %} {% set the_type = 'bson_t' %} {% else %} {% set the_type = info['type'] %} {% endif %} {% set the_name = info.get('field', opt_name) %} {% set the_converter = info.get('convert', '_mongoc_convert_' + info['type'] ) %} {% if loop.index > 1 %}else {% endif %}if (!strcmp (bson_iter_key (&iter), "{{ opt_name }}")) { if (!{{ the_converter }} ( client, &iter, &{{ struct_name }}->{{ path }}, error)) { return false; } {% if the_converter == '_mongoc_convert_write_concern' %} {{ struct_name }}->{{ path_to(struct_type, "write_concern_owned") }} = true; {% endif %} {% if info['check_set'] %} {{ struct_name }}->{{ the_name }}_is_set = true; {% endif %} } {% endfor %} else { {% if description.allow_extra %} /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &{{ struct_name }}->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { bson_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } {% else %} bson_set_error (error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option '%s'", bson_iter_key (&iter)); return false; {% endif %} } } return true; } void _{{ struct_name }}_cleanup ({{ struct_type }} *{{ struct_name }}) { {% for path, opt_name, info in paths(description) %} {% if info['type'] == 'mongoc_write_concern_t *' %} if ({{ struct_name }}->{{ path_to(struct_type, "write_concern_owned") }}) { mongoc_write_concern_destroy ({{ struct_name }}->{{ path }}); } {% elif info['type'] == 'bson_value_t' %} bson_value_destroy (&{{ struct_name }}->{{ path }}); {% elif info['type'] in ('document', 'array') %} bson_destroy (&{{ struct_name }}->{{ path }}); {% elif info['type'] == 'mongoc_read_concern_t *' %} mongoc_read_concern_destroy ({{ struct_name }}->{{ path }}); {% endif %} {% endfor %} bson_destroy (&{{struct_name }}->extra); }{% endfor %} mongo-c-driver-1.26.0/build/proc-ctl.py000066400000000000000000000214011456567454500176470ustar00rootroot00000000000000""" Extremely basic subprocess control """ import argparse import json import os import random import signal import subprocess import sys import time import traceback from datetime import datetime, timedelta from pathlib import Path from typing import TYPE_CHECKING, NoReturn, Sequence, Union, cast if TYPE_CHECKING: from typing import (Literal, NamedTuple, TypedDict) INTERUPT_SIGNAL = signal.SIGINT if os.name != 'nt' else signal.CTRL_C_SIGNAL def create_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser('proc-ctl') grp = parser.add_subparsers(title='Commands', dest='command', metavar='') start = grp.add_parser('start', help='Start a new subprocess') start.add_argument('--ctl-dir', help='The control directory for the subprocess', required=True, type=Path) start.add_argument('--cwd', help='The new subdirectory of the spawned process', type=Path) start.add_argument( '--spawn-wait', help='Number of seconds to wait for child to be running', type=float, default=3) start.add_argument('child_command', nargs='+', help='The command to execute', metavar=' [args...]') stop = grp.add_parser('stop', help='Stop a running subprocess') stop.add_argument('--ctl-dir', help='The control directory for the subprocess', required=True, type=Path) stop.add_argument('--stop-wait', help='Number of seconds to wait for stopping', type=float, default=5) stop.add_argument('--if-not-running', help='Action to take if the child is not running', choices=['fail', 'ignore'], default='fail') ll_run = grp.add_parser('__run') ll_run.add_argument('--ctl-dir', type=Path, required=True) ll_run.add_argument('child_command', nargs='+') return parser if TYPE_CHECKING: StartCommandArgs = NamedTuple('StartCommandArgs', [ ('command', Literal['start']), ('ctl_dir', Path), ('cwd', Path), ('child_command', Sequence[str]), ('spawn_wait', float), ]) StopCommandArgs = NamedTuple('StopCommandArgs', [ ('command', Literal['stop']), ('ctl_dir', Path), ('stop_wait', float), ('if_not_running', Literal['fail', 'ignore']), ]) _RunCommandArgs = NamedTuple('_RunCommandArgs', [ ('command', Literal['__run']), ('child_command', Sequence[str]), ('ctl_dir', Path), ]) CommandArgs = Union[StartCommandArgs, StopCommandArgs, _RunCommandArgs] _ResultType = TypedDict('_ResultType', { 'exit': 'str | int | None', 'error': 'str | None' }) def parse_argv(argv: 'Sequence[str]') -> 'CommandArgs': parser = create_parser() args = parser.parse_args(argv) return cast('CommandArgs', args) class _ChildControl: def __init__(self, ctl_dir: Path) -> None: self._ctl_dir = ctl_dir @property def pid_file(self): """The file containing the child PID""" return self._ctl_dir / 'pid.txt' @property def result_file(self): """The file containing the exit result""" return self._ctl_dir / 'exit.json' def set_pid(self, pid: int): write_text(self.pid_file, str(pid)) def get_pid(self) -> 'int | None': try: txt = self.pid_file.read_text() except FileNotFoundError: return None return int(txt) def set_exit(self, exit: 'str | int | None', error: 'str | None') -> None: write_text(self.result_file, json.dumps({ 'exit': exit, 'error': error })) remove_file(self.pid_file) def get_result(self) -> 'None | _ResultType': try: txt = self.result_file.read_text() except FileNotFoundError: return None return json.loads(txt) def clear_result(self) -> None: remove_file(self.result_file) def _start(args: 'StartCommandArgs') -> int: ll_run_cmd = [ sys.executable, '-u', '--', __file__, '__run', '--ctl-dir={}'.format(args.ctl_dir), '--', *args.child_command, ] args.ctl_dir.mkdir(exist_ok=True, parents=True) child = _ChildControl(args.ctl_dir) if child.get_pid() is not None: raise RuntimeError('Child process is already running [PID {}]'.format( child.get_pid())) child.clear_result() # Spawn the child controller subprocess.Popen( ll_run_cmd, cwd=args.cwd, stderr=subprocess.STDOUT, stdout=args.ctl_dir.joinpath('runner-output.txt').open('wb'), stdin=subprocess.DEVNULL) expire = datetime.now() + timedelta(seconds=args.spawn_wait) # Wait for the PID to appear while child.get_pid() is None and child.get_result() is None: if expire < datetime.now(): break time.sleep(0.1) # Check that it actually spawned if child.get_pid() is None: result = child.get_result() if result is None: raise RuntimeError('Failed to spawn child runner?') if result['error']: print(result['error'], file=sys.stderr) raise RuntimeError('Child exited immediately [Exited {}]'.format( result['exit'])) # Wait to see that it is still running after --spawn-wait seconds while child.get_result() is None: if expire < datetime.now(): break time.sleep(0.1) # A final check to see if it is running result = child.get_result() if result is not None: if result['error']: print(result['error'], file=sys.stderr) raise RuntimeError('Child exited prematurely [Exited {}]'.format( result['exit'])) return 0 def _stop(args: 'StopCommandArgs') -> int: child = _ChildControl(args.ctl_dir) pid = child.get_pid() if pid is None: if args.if_not_running == 'fail': raise RuntimeError('Child process is not running') elif args.if_not_running == 'ignore': # Nothing to do return 0 else: assert False os.kill(pid, INTERUPT_SIGNAL) expire_at = datetime.now() + timedelta(seconds=args.stop_wait) while expire_at > datetime.now() and child.get_result() is None: time.sleep(0.1) result = child.get_result() if result is None: raise RuntimeError( 'Child process did not exit within the grace period') return 0 def __run(args: '_RunCommandArgs') -> int: this = _ChildControl(args.ctl_dir) try: pipe = subprocess.Popen( args.child_command, stdout=args.ctl_dir.joinpath('child-output.txt').open('wb'), stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL) except: this.set_exit('spawn-failed', traceback.format_exc()) raise this.set_pid(pipe.pid) retc = None try: while 1: try: retc = pipe.wait(0.5) except subprocess.TimeoutExpired: pass except KeyboardInterrupt: pipe.send_signal(INTERUPT_SIGNAL) if retc is not None: break finally: this.set_exit(retc, None) return 0 def write_text(fpath: Path, content: str): """ "Atomically" write a new file. This writes the given ``content`` into a temporary file, then renames that file into place. This prevents readers from seeing a partial read. """ tmp = fpath.with_name(fpath.name + '.tmp') remove_file(tmp) tmp.write_text(content) os.sync() remove_file(fpath) tmp.rename(fpath) def remove_file(fpath: Path): """ Safely remove a file. Because Win32, deletes are asynchronous, so we rename to a random filename, then delete that file. This ensures the file is "out of the way", even if it takes some time to delete. """ delname = fpath.with_name(fpath.name + '.delete-' + str(random.randint(0, 999999))) try: fpath.rename(delname) except FileNotFoundError: return delname.unlink() def main(argv: 'Sequence[str]') -> int: args = parse_argv(argv) if args.command == 'start': return _start(args) if args.command == '__run': return __run(args) if args.command == 'stop': return _stop(args) return 0 def start_main() -> NoReturn: sys.exit(main(sys.argv[1:])) if __name__ == '__main__': start_main() mongo-c-driver-1.26.0/build/requirements.txt000066400000000000000000000002121456567454500210330ustar00rootroot00000000000000jinja2 git+https://github.com/mongodb-labs/drivers-evergreen-tools#subdirectory=evergreen_config_generator&egg=evergreen_config_generator mongo-c-driver-1.26.0/build/sphinx/000077500000000000000000000000001456567454500170655ustar00rootroot00000000000000mongo-c-driver-1.26.0/build/sphinx/homepage-config/000077500000000000000000000000001456567454500221155ustar00rootroot00000000000000mongo-c-driver-1.26.0/build/sphinx/homepage-config/.gitignore000066400000000000000000000000451456567454500241040ustar00rootroot00000000000000__pycache__/ *.py[cod] _build/ html/ mongo-c-driver-1.26.0/build/sphinx/homepage-config/conf.py000066400000000000000000000037621456567454500234240ustar00rootroot00000000000000# -*- coding: utf-8 -*- from docutils import nodes import os import sys # Import common docs config. this_path = os.path.dirname(__file__) sys.path.append(os.path.normpath(os.path.join(this_path, '../'))) from mongoc_common import * version = release = os.environ.get('VERSION_RELEASED') if not release: raise RuntimeError('Set the "VERSION_RELEASED" environment variable') # -- General configuration ------------------------------------------------ templates_path = ['_templates'] source_suffix = '.rst' master_doc = 'index' # General information about the project. project = u'mongoc.org' copyright = u'2017, MongoDB, Inc' author = u'MongoDB, Inc' exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # Support :download-link:`bson` or :download-link:`mongoc`. def download_link(typ, rawtext, text, lineno, inliner, options={}, content=[]): if text == "mongoc": lib = "mongo-c-driver" else: raise ValueError( "download link must be mongoc, not \"%s\"" % text) title = "%s-%s" % (lib, version) url = ("https://github.com/mongodb/mongo-c-driver/releases/tag/%(version)s") % { "version": version } pnode = nodes.reference(title, title, internal=False, refuri=url) return [pnode], [] def setup(app): mongoc_common_setup(app) app.add_role('download-link', download_link) # -- Options for HTML output ---------------------------------------------- html_theme = 'furo' html_title = html_shorttitle = 'MongoDB C Driver %s' % version # html_favicon = None html_use_smartypants = False html_show_sourcelink = False html_use_index = False html_sidebars = { '**': [] } # Note: http://www.sphinx-doc.org/en/1.5.1/config.html#confval-html_copy_source # This will degrade the Javascript quicksearch if we ever use it. html_copy_source = False mongo-c-driver-1.26.0/build/sphinx/homepage-config/index.rst000066400000000000000000000021011456567454500237500ustar00rootroot00000000000000MongoDB C Driver ================ **A Cross Platform MongoDB Client Library for C** The MongoDB C Driver, also known as "libmongoc", is a library for using MongoDB from C applications, and for writing MongoDB drivers in higher-level languages. It depends on `libbson `_ to generate and parse BSON documents, the native data format of MongoDB. Download -------- Latest release: :download-link:`mongoc` Documentation ------------- `Installation `_ `Tutorial `_ `libmongoc reference `_ `libbson reference `_ How To Ask For Help ------------------- For help using the driver: `MongoDB Community Forums `_. To file a bug or feature request: `MongoDB Jira Issue Tracker `_. Documentation for Older Versions -------------------------------- .. toctree:: :titlesonly: libmongoc-releases libbson-releases mongo-c-driver-1.26.0/build/sphinx/homepage-config/libbson-releases.rst000066400000000000000000000002321456567454500260750ustar00rootroot00000000000000.. After rendering to html, this gets copied to the gh-pages branch under /libbson/index.html libbson Releases ---------------- .. versionlist:: libbsonmongo-c-driver-1.26.0/build/sphinx/homepage-config/libmongoc-releases.rst000066400000000000000000000002421456567454500264170ustar00rootroot00000000000000.. After rendering to html, this gets copied to the gh-pages branch under /libmongoc/index.html libmongoc Releases ------------------ .. versionlist:: libmongocmongo-c-driver-1.26.0/build/sphinx/mongoc/000077500000000000000000000000001456567454500203475ustar00rootroot00000000000000mongo-c-driver-1.26.0/build/sphinx/mongoc/__init__.py000066400000000000000000000031431456567454500224610ustar00rootroot00000000000000from docutils.nodes import literal, Text from docutils.parsers.rst import roles from sphinx.roles import XRefRole from sphinx import version_info as sphinx_version_info class SymbolRole(XRefRole): def __call__(self, *args, **kwargs): nodes, messages = XRefRole.__call__(self, *args, **kwargs) for node in nodes: attrs = node.attributes target = attrs['reftarget'] parens = '' if target.endswith('()'): # Function call, :symbol:`mongoc_init()` target = target[:-2] parens = '()' if ':' in target: # E.g., 'bson:bson_t' has domain 'bson', target 'bson_t' attrs['domain'], name = target.split(':', 1) attrs['reftarget'] = name old = node.children[0].children[0] assert isinstance(old, Text) new = Text(name + parens, name + parens) # Ensure setup_child is called. node.children[0].replace(old, new) else: attrs['reftarget'] = target attrs['reftype'] = 'doc' attrs['classes'].append('symbol') if sphinx_version_info >= (1, 6): # https://github.com/sphinx-doc/sphinx/issues/3698 attrs['refdomain'] = 'std' return nodes, messages def setup(app): roles.register_local_role( 'symbol', SymbolRole(warn_dangling=True, innernodeclass=literal)) return { 'version': '1.0', 'parallel_read_safe': True, 'parallel_write_safe': True, } mongo-c-driver-1.26.0/build/sphinx/mongoc_common.py000066400000000000000000000156121456567454500222760ustar00rootroot00000000000000from __future__ import annotations import os import re from pathlib import Path from typing import Any, Iterable, Sequence, Union, List, Tuple, Dict from docutils import nodes from docutils.nodes import Node, document from sphinx.application import Sphinx from sphinx.application import logger as sphinx_log try: from sphinx.builders.dirhtml import DirectoryHTMLBuilder except ImportError: # Try importing from older Sphinx version path. from sphinx.builders.html import DirectoryHTMLBuilder from sphinx.config import Config from docutils.parsers.rst import Directive needs_sphinx = "1.7" # Do not require newer sphinx. EPEL packages build man pages with Sphinx 1.7.6. Refer: CDRIVER-4767 author = "MongoDB, Inc" # -- Options for HTML output ---------------------------------------------- smart_quotes = False html_show_sourcelink = False # Note: http://www.sphinx-doc.org/en/1.5.1/config.html#confval-html_copy_source # This will degrade the Javascript quicksearch if we ever use it. html_copy_source = False def _file_man_page_name(fpath: Path) -> Union[str, None]: "Given an rST file input, find the :man_page: frontmatter value, if present" lines = fpath.read_text().splitlines() for line in lines: mat = re.match(r":man_page:\s+(.+)", line) if not mat: continue return mat[1] def _collect_man (app: Sphinx): # Note: 'app' is partially-formed, as this is called from the Sphinx.__init__ docdir = Path(app.srcdir) # Find everything: children = docdir.rglob("*") # Find only regular files: files = filter(Path.is_file, children) # Find files that have a .rst extension: rst_files = (f for f in files if f.suffix == ".rst") # Pair each file with its :man_page: frontmatter, if present: with_man_name = ((f, _file_man_page_name(f)) for f in rst_files) # Filter out pages that do not have a :man_page: item:s pairs: Iterable[tuple[Path, str]] = ((f, m) for f, m in with_man_name if m) # Populate the man_pages: for filepath, man_name in pairs: # Generate the docname. relative_path = filepath.relative_to(app.srcdir) # The docname is relative to the source directory, and excludes the suffix. docname = str(relative_path.parent / filepath.stem) assert docname, filepath man_pages.append((docname, man_name, "", [author], 3)) # -- Options for manual page output --------------------------------------- # NOTE: This starts empty, but we populate it in `setup` in _collect_man() (see above) man_pages: List[Tuple[str, str, str, List[str], int]] = [] # If true, show URL addresses after external links. # # man_show_urls = False # -- Sphinx customization --------------------------------------- def add_ga_javascript(app: Sphinx, pagename: str, templatename: str, context: Dict[str, Any], doctree: document): if not app.env.config.analytics: return # Add google analytics and NPS survey. context["metatags"] = ( context.get("metatags", "") + """ """ ) class VersionList(Directive): """Custom directive to generate the version list from an environment variable""" option_spec = {} has_content = True def run(self) -> Sequence[Node]: if self.content[0] != "libmongoc" and self.content[0] != "libbson": print("versionlist must be libmongoc or libbson") return [] libname = self.content[0] env_name = libname.upper() + "_VERSION_LIST" if env_name not in os.environ: print(env_name + " not set, not generating version list") return [] versions = os.environ[env_name].split(",") header = nodes.paragraph("", "") p = nodes.paragraph("", "") uri = "https://www.mongoc.org/%s/%s/index.html" % (libname, versions[0]) p += nodes.reference("", "Latest Release (%s)" % versions[0], internal=False, refuri=uri) header += p p = nodes.paragraph("", "") uri = "https://s3.amazonaws.com/mciuploads/mongo-c-driver/docs/%s/latest/index.html" % (libname) p += nodes.reference("", "Current Development (master)", internal=False, refuri=uri) header += p blist = nodes.bullet_list() for v in versions: item = nodes.list_item() p = nodes.paragraph("", "") uri = "https://www.mongoc.org/%s/%s/index.html" % (libname, v) p += nodes.reference("", v, internal=False, refuri=uri) item += p blist += item return [header, blist] def generate_html_redirs(app: Sphinx, page: str, templatename: str, context: Dict[str, Any], doctree: Any) -> None: builder = app.builder if not isinstance(builder, DirectoryHTMLBuilder) or "writing-redirect" in context: return if page == "index" or page.endswith(".index"): return path = app.project.doc2path(page, absolute=True) out_index_html = Path(builder.get_outfilename(page)) slug = out_index_html.parent.name redirect_file = out_index_html.parent.parent / f"{slug}.html" # HACK: handle_page() is not properly reentrant. Save and restore state for # this page while we generate our redirects page: prev_scripts = builder.script_files[:] prev_css = builder.css_files[:] builder.handle_page( f"redirect-for-{page}", {"target": page, "writing-redirect": 1}, str(Path(__file__).parent.resolve() / "redirect.t.html"), str(redirect_file), ) # Restore prior state: builder.script_files[:] = prev_scripts builder.css_files[:] = prev_css sphinx_log.debug("Wrote redirect: %r -> %r", path, page) def mongoc_common_setup(app: Sphinx): _collect_man(app) app.connect("html-page-context", generate_html_redirs) app.connect("html-page-context", add_ga_javascript) # Run sphinx-build -D analytics=1 to enable Google Analytics. app.add_config_value("analytics", False, "html") app.add_directive("versionlist", VersionList) mongo-c-driver-1.26.0/build/sphinx/redirect.t.html000066400000000000000000000005201456567454500220130ustar00rootroot00000000000000{%- extends "!page.html" %} {% block extrahead -%} {%- endblock %} {% block content %}

    This page has been migrated to

    {{ pathto(target) | e }}
    . You should be redirected to this location automatically in a few seconds.

    {% endblock %} mongo-c-driver-1.26.0/lldb.pyi000066400000000000000000000141421456567454500161170ustar00rootroot00000000000000""" This Python type stubs file is only here to support checking of lldb_bson.py. The type/member/constant listings in here are incomplete, as only those that are used in lldb_bson have been transcribed from the LLDB Python API documentation. Refer: https://lldb.llvm.org/python_api.html """ from typing import IO, Any, Sequence, TypeAlias, NoReturn _Pointer: TypeAlias = int _Size: TypeAlias = int _Offset: TypeAlias = int _InternalDict: TypeAlias = dict[str, Any] class SBError: def __init__(self) -> None: ... @property def success(self) -> bool: ... @property def fail(self) -> bool: ... @property def description(self) -> str: ... class SBDebugger: def __init__(self, _: NoReturn) -> None: ... def HandleCommand(self, command: str) -> None: ... def GetErrorFileHandle(self) -> IO[str]: ... def GetSelectedTarget(self) -> SBTarget | None: ... class SBAddress: def __init__(self) -> None: ... @property def offset(self) -> type: ... @property def load_addr(self) -> _Pointer: ... def SetLoadAddress(self, addr: _Pointer, tgt: SBTarget) -> None: ... class SBData: def GetSignedInt32(self, err: SBError, off: _Offset) -> int: ... @staticmethod def CreateDataFromUInt64Array(endian: ByteOrderType, size: _Size, dat: Sequence[int]) -> SBData: ... @staticmethod def CreateDataFromCString(endian: ByteOrderType, size: _Size, s: str) -> SBData: ... byte_order: ByteOrderType @property def uint8(self) -> Sequence[int]: ... @property def uint32(self) -> Sequence[int]: ... @property def uint64(self) -> Sequence[int]: ... @property def size(self) -> int: ... def ReadRawData(self, err: SBError, off: _Offset, size: _Size) -> bytes: ... def GetAddress(self, err: SBError, off: _Offset) -> _Pointer: ... def GetUnsignedInt32(self, err: SBError, off: _Offset) -> int: ... def GetUnsignedInt64(self, err: SBError, off: _Offset) -> int: ... class SBValue: def Dereference(self) -> SBValue: ... def TypeIsPointerType(self) -> bool: ... def GetChildMemberWithName(self, name: str) -> SBValue: ... def GetValueAsUnsigned(self) -> int: ... def Cast(self, type: SBType) -> SBValue: ... def GetAddress(self) -> SBAddress: ... def GetData(self) -> SBData: ... def GetNonSyntheticValue(self) -> SBValue: ... def CreateChildAtOffset(self, name: str, offset: _Offset, type: SBType) -> SBValue: ... def CreateValueFromData(self, name: str, data: SBData, type: SBType) -> SBValue: ... def CreateValueFromAddress(self, name: str, addr: _Pointer, type: SBType) -> SBValue: ... def CreateValueFromExpression(self, name: str, expr: str) -> SBValue: ... def synthetic_child_from_address(self, name: str, addr: _Pointer, type: SBType) -> SBValue: ... def synthetic_child_from_expression(self, name: str, expr: str) -> SBValue: ... @property def addr(self) -> SBAddress: ... @property def frame(self) -> SBFrame: ... @property def type(self) -> SBType: ... @property def name(self) -> str: ... @property def target(self) -> SBTarget: ... @property def load_addr(self) -> _Pointer: ... @property def size(self) -> int: ... @property def unsigned(self) -> int: ... @property def data(self) -> SBData: ... @property def deref(self) -> SBValue: ... @property def process(self) -> SBProcess: ... @property def error(self) -> SBError: ... @property def changed(self) -> bool: ... @property def children(self) -> Sequence[SBValue]: ... value: str format: ValueFormatType class SBFrame: def FindVariable(self, var_name: str) -> SBValue: ... def EvaluateExpression(self, expr: str) -> SBValue: ... @property def locals(self) -> Sequence[SBValue]: ... @property def thread(self) -> SBThread: ... class SBThread: @property def frames(self) -> Sequence[SBFrame]: ... @property def process(self) -> SBProcess: ... class SBProcess: def ReadMemory(self, addr: _Pointer, size: int, err: SBError) -> bytes: ... def ReadCStringFromMemory(self, addr: _Pointer, max: int, err: SBError) -> bytes: ... @property def selected_thread(self) -> SBThread: ... @property def id(self) -> int: ... class SBCommandReturnObject: def AppendMessage(self, s: str) -> None: ... class SBTarget: def FindFirstType(self, type: str) -> SBType: ... def CreateValueFromData(self, name: str, data: SBData, type: SBType) -> SBValue: ... def CreateValueFromExpression(self, name: str, expr: str) -> SBValue: ... def CreateValueFromAddress(self, name: str, addr: SBAddress, type: SBType) -> SBValue: ... def GetBasicType(self, type: BasicType) -> SBType: ... @property def process(self) -> SBProcess: ... class SBType: def GetDisplayTypeName(self) -> str: ... def GetPointerType(self) -> SBType: ... def GetArrayType(self, size: int) -> SBType: ... @property def name(self) -> str: ... def IsValid(self) -> bool: ... @property def fields(self) -> Sequence[SBTypeMember]: ... @property def size(self) -> int: ... class SBTypeMember: @property def name(self) -> str: ... @property def byte_offset(self) -> int: ... class SBSyntheticValueProvider: def __init__(self, valobj: SBValue, internal_dict: _InternalDict) -> None: ... def num_children(self) -> int: ... def get_child_at_index(self, pos: int) -> SBValue: ... def has_children(self) -> bool: ... def get_value(self) -> SBValue: ... def update(self) -> bool | None: ... # Types not present in lldb, but represent the types of top-level constants: # (These may only be used in unevaluated contexts) class ByteOrderType: ... class ValueFormatType: ... class BasicType: ... eBasicTypeNullPtr: BasicType eBasicTypeUnsignedChar: BasicType eBasicTypeDouble: BasicType eBasicTypeBool: BasicType eBasicTypeChar: BasicType eBasicTypeUnsignedChar: BasicType eBasicTypeVoid: BasicType eFormatDefault: ValueFormatType eFormatHex: ValueFormatType eFormatBinary: ValueFormatType eFormatPointer: ValueFormatType eFormatInvalid: ValueFormatType debugger: SBDebugger mongo-c-driver-1.26.0/lldb_bson.py000066400000000000000000001454021456567454500167730ustar00rootroot00000000000000""" This Python module is intended for use with the LLDB debugger. To import using this module in an LLDB session, execute the following command in LLDB:: command script import This may be useful to add as a "startup/init" command for an LLDB executor such as VSCode. From this point, all ``bson_t`` variables will show their full contents recursively. - Bonus: If using CodeLLDB, it is possible to add watch expressions to elements within a (nested) BSON document. To add a Python watch expression, prefix the watch string with ``/py``, and the remainder of the string will be evaluated in the LLDB Python interpreter rather than the LLDB evaluator. For example: /py 'hello, ' + 'world' will evaluate to a string "Hello, world". To reference a bson_t object, use the ``$variable_name`` syntax. Then, use the ``@`` operator with the special global ``bson`` object to walk through the document as if it were a regular Python object:: /py $my_bson_t @ bson.topElement.path["string key"].array[3].name Only the leading ``bson`` is required in the path, since it provides the "magic" necessary to perform document traversal. For example, with the given document ``userdata``:: { users: [ {username: "joe", age: 41}, {username: "alex", age: 33}, {username: "jane', age: 29} ] } the "age" of "alex" can be watched with the following watch expression: /py $userdata @bson.users[1].age """ from __future__ import annotations import enum import functools import hashlib import json import shlex import struct import traceback from datetime import datetime from typing import ( TYPE_CHECKING, Any, Callable, ClassVar, Dict, Generator, Generic, Iterable, NamedTuple, Sequence, Tuple, Type, TypeVar, Union, cast, ) import lldb # pyright: ignore from lldb import ( # pyright: ignore SBAddress, SBDebugger, SBError, SBFrame, SBProcess, SBSyntheticValueProvider, SBType, SBValue, ) if TYPE_CHECKING: from typing_extensions import override else: def override(f: T) -> T: return f def print_errors(fn: FuncT) -> FuncT: """Exceptions from the decorated function will be printed, then re-raised""" @functools.wraps(fn) def _wrap(*args: Any, **kwargs: Any) -> Any: try: return fn(*args, **kwargs) except: e = traceback.format_exc() print(e) raise return cast("FuncT", _wrap) @print_errors def __lldb_init_module(debugger: SBDebugger, internal_dict: InternalDict): # Inject the global magic document traverser: internal_dict["bson"] = _BSONWalker() # Register types: for cls in _SyntheticMeta.synthetics: # The (regex of) the type that is handled by this class: ty = shlex.quote(cls.__typename__) if cls.__enable_synthetic__: # Register a synthetic child provider, generating the trees that can be expanded cmd = f"type synthetic add -l lldb_bson.{cls.__name__} -x '^{ty}$'" debugger.HandleCommand(cmd) if cls.__summary_str__ is not None: # Generate a simple summary string for this object quoted = cls.__summary_str__.replace("'", "\\'") cmd = f"type summary add --summary-string '{quoted}' -x '^{ty}$'" debugger.HandleCommand(cmd) if hasattr(cls, "__summary__"): # More complex: Call a Python function that will create the summary cmd = f"type summary add -F lldb_bson.{cls.__name__}.__summary__ -x '^{ty}$'" debugger.HandleCommand(cmd) # Render __bson_byte__ as "bytes with ASCII." __bson_byte__ is a # debug-only type generated on-the-fly in LLDB debugger.HandleCommand("type format add -f Y __bson_byte__") # Arrays of bytes as a sequence of hex values: debugger.HandleCommand(r"type summary add -s '${var[]%x}' -x '__bson_byte__\[[0-9]+\]'") print("lldb_bson is ready") _ = __lldb_init_module # Silence "unused function" warnings FuncT = TypeVar("FuncT", bound=Callable[..., Any]) "Type of functions" T = TypeVar("T") "Unbounded invariant type parameter" InternalDict = Dict[str, Any] "Type of internal dictionaries, provided by LLDB" ValueFactory = Callable[[], SBValue] ChildItem = Union[ Tuple[str, "str | int"], ValueFactory, Tuple[str, "str | int", "lldb.ValueFormatType|None", "SBType|None"] ] class _SyntheticMeta(type): """ Metaclass that handles subclassing of SyntheticDisplayBase. Does basic checks and collects definitions into a list of display types """ synthetics: list[Type[SyntheticDisplayBase[Any]]] = [] "The display type classes that have been defined" @override def __new__( cls: Type[_SyntheticMeta], name: str, bases: tuple[type, ...], namespace: dict[str, Any] ) -> Type[SyntheticDisplayBase[Any]]: new_class: Type[SyntheticDisplayBase[Any]] = type.__new__(cast(type, cls), name, bases, namespace) if namespace.get("__abstract__"): return new_class # Check for the required __typename__ and __parse__ if not hasattr(new_class, "__typename__"): raise TypeError(f'Type "{new_class}" is missing a "__typename__" attribute') if not hasattr(new_class, "__parse__"): raise TypeError(f'Type "{new_class}" has no "__parse__" method') # Remember this new class: cls.synthetics.append(new_class) return new_class class SyntheticDisplayBase(Generic[T], SBSyntheticValueProvider, metaclass=_SyntheticMeta): __abstract__: ClassVar[bool] = True "If true, disables metaclass checks" __summary_str__: ClassVar[str | None] = None "Set to an LLDB '--summary-string' formatting string for rendering the inline value summary" __enable_synthetic__: ClassVar[bool] = True "If False, do not generate synthetic children (used for primitive values)" if TYPE_CHECKING: __typename__: ClassVar[str] """ The (regular expression) name of the type that is handled by this class. This is a required class attribute. """ @classmethod def __summary__(cls, value: SBValue, idict: InternalDict) -> str: """ If provided, supplies the Python function that will dynamically generate a summary string from the SBValue. """ ... @classmethod def __parse__(cls, value: SBValue) -> T: """ Required method: Parse the data that lives at the given SBValue into a representation that will be useful for later display. """ ... @classmethod @print_errors def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: """ Obtain the SBType for this class. Can be overriden in subclasses, and the type may consider the value that lives at the address. """ return generate_or_get_type(f"struct {cls.__typename__} {{}}", frame) @print_errors def __init__(self, val: SBValue, idict: InternalDict | None = None) -> None: self.__sbvalue = val "The SBValue given for this object" self.__children: list[ChildItem] = [] "The synthetic children associated with the value" self.__value: T | None = None "The decoded value, or ``None`` if it has not yet been decoded" @property def sbvalue(self) -> SBValue: """Obtain the SBValue associated with this display object""" return self.__sbvalue @property def value(self) -> T: """Obtain the decoded BSON value""" if self.__value is None: self.__value = self.__parse__(self.sbvalue) return self.__value @property def address(self) -> int: """Obtain the memory address of the associated object""" return self.sbvalue.load_addr @print_errors @override def update(self) -> bool | None: """Update the parsed value and the child objects""" self.__value = None # Clear the value so it will be re-read self.__children = list(self.get_children()) def get_children(self) -> Iterable[ChildItem]: """ Subclasses must provide this method such that it returns an iterable object of ``ChildItem`` types. These will be used to generate the synthetic children that are displayed by LLDB. """ raise NotImplementedError @override def num_children(self) -> int: """Called by LLDB to know how many children exist""" n = len(self.__children) return n @override def has_children(self) -> bool: """Optimization opportunity for LLDB if it knows it doesn't need to ask""" return self.__enable_synthetic__ and self.num_children() != 0 @print_errors @override def get_child_at_index(self, pos: int) -> SBValue: """ Obtain the synthetic child of this value at index 'pos'. """ # LLDB sometimes calls us with a child that we don't have? if pos >= len(self.__children): print(f"NOTE: lldb called get_child_at_index({pos}), but we only have {len(self.__children)} children") return SBValue() # Get the child: nth = self.__children[pos] # If not a tuple: if not isinstance(nth, tuple): # The type is a ValueFactory, which will return a new SBValue val = nth() assert val.error.success, f"{val.error=}, {nth=}, {pos=}" return val # Otherwise, they yielded a tuple: if len(nth) == 4: # A four-tuple of key, value, an LLDB value format, and an LLDB value type key, val, fmt, ty = nth sbval = self.create_value(key, val, format=fmt, cast_to=ty) else: # Just a key and a value key, val = nth sbval = self.create_value(key, val) assert sbval.error.success, (sbval.error, key, val) return sbval def create_value( self, name: str, value: str | int | float, cast_to: SBType | None = None, format: lldb.ValueFormatType | None = None, ) -> SBValue: """Cast a Python primitive into an LLDB SBValue.""" # Encode the value in a JSON string, which will coincidentally be a valid # C expression that LLDB can parse: encoded = json.dumps(value) val = self.__sbvalue.CreateValueFromExpression(name, encoded) if cast_to: val = val.Cast(cast_to) if format is not None: val.format = format return val class PrimitiveDisplay(Generic[T], SyntheticDisplayBase[T]): """ Displays a primitive type. We can't use LLDB's basic types directly, since we must force a little-endian encoding. Set the __struct_format__ class variable to a Python struct format string. """ __abstract__ = True __enable_synthetic__: ClassVar[bool] = False __struct_format__: ClassVar[str] "The struct format string that will be used to extract the value from memory" @classmethod @override @print_errors def __summary__(cls, value: SBValue, idict: InternalDict) -> str: return json.dumps(cls.__parse__(value)) @classmethod @override def __parse__(cls, value: SBValue) -> T: unpack = struct.Struct(cls.__struct_format__) buf = memcache.get_cached(value.load_addr)[: unpack.size] val: T = unpack.unpack(buf)[0] return val class DoubleDisplay(PrimitiveDisplay[float]): """Displays BSON doubles""" __typename__ = "__bson_double__" __struct_format__: ClassVar[str] = " bytes: buf = memcache.get_cached(value.load_addr) size = read_i32le(buf) return bytes(buf[4:][:size]) @override def get_children(self) -> Iterable[ChildItem]: strlen = len(self.value) yield "size (bytes)", strlen # Create a char[] type to represent the string content: array_t = self.sbvalue.target.GetBasicType(lldb.eBasicTypeChar).GetArrayType(strlen) yield lambda: self.sbvalue.synthetic_child_from_address("[content]", self.address + 4, array_t) try: # Attempt a UTF-8 decode. We don't actually show this, we just want to # check if there are encoding errors, which we will display in the output self.value.decode("utf-8") except UnicodeDecodeError as e: yield "decode error", str(e) class DocumentInfo(NamedTuple): """A decoded document""" elements: Sequence[DocumentElement | DocumentError] "Existing elements or errors found while parsing the data" class DocumentElement(NamedTuple): """Represents an element within a document""" type: BSONType key: str value_offset: int "Offset from the beginning of the document data where the element's value appears" value_size: int "The size of the element's value (in bytes)" class DocumentError(NamedTuple): """Represents an error while decoding a document""" message: str error_offset: int class DocumentDisplay(SyntheticDisplayBase["DocumentInfo | DocumentError"]): """ Main display of BSON document elements. This parses a document/array, and generates the child elements that can be further expanded and inspected. This type does not refer to the _MemCache, since this object is usually the top-level object and is the one responsible for filling the cache. """ __typename__ = "__bson_document_[0-9]+__" __qualifier__: ClassVar[str] = "document" "The 'qualifier' of this type. Overriden by ArrayDisplay." @classmethod @override @print_errors def __summary__(cls, value: SBValue, idict: InternalDict) -> str: prefix = cls.__qualifier__ doc = cls.__parse__(value) if isinstance(doc, DocumentError): return f"Error parsing {prefix} at byte {doc.error_offset}: {doc.message}" if len(doc.elements) == 0: return f"{prefix} (empty)" if len(doc.elements) == 1: return f"{prefix} (1 element)" return f"{prefix} ({len(doc.elements)} elements)" @classmethod @override def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: """Generate a unique type for the length of the document, allowing for byte-wise inspection""" # Read the size prefix: err = SBError() header = frame.thread.process.ReadMemory(addr, 4, err) assert err.success, f"{err=}, {frame=}, {addr=}" size = read_i32le(header) # Generate the type: typename = f"__bson_{cls.__qualifier__}_{size}__" doc_t = generate_or_get_type( f""" enum __bson_byte__ : unsigned char {{}}; struct {typename} {{ __bson_byte__ bytes[{size}]; }} """, frame, ) return doc_t @classmethod @override def __parse__(cls, value: SBValue) -> DocumentInfo | DocumentError: try: # Read from memory and refresh the segment in the memory cache. All # child element displays will re-use the same memory segment that # will be pulled here: buf = memcache.read(value)[1] except LookupError as e: return DocumentError(f"Failed to read memory: {e}", value.load_addr) return cls.parse_bytes(buf) @classmethod def parse_bytes(cls, buf: bytes) -> DocumentInfo | DocumentError: """Parse a document from the given data buffer""" elems = list(cls._parse_elems(buf)) return DocumentInfo(elems) @classmethod def _parse_elems(cls, buf: bytes) -> Iterable[DocumentElement | DocumentError]: """Iteratively yield elements, or an error if parsing fails""" cur_offset = 4 array_idx = 0 while buf: elem = yield from cls._parse_one(buf[cur_offset:], cur_offset) if isinstance(elem, DocumentError): # An error ocurred, so we can't reliably continue parsing yield elem return if elem.type == BSONType.EOD: # This is the end. break # Yield this one, and then advance to the next element: yield elem elem_size = 1 + len(elem.key) + 1 + elem.value_size if cls.__qualifier__ == "array": # Validate that array keys are increasing integers: expect_key = str(array_idx) if elem.key != expect_key: yield DocumentError( f"Array element must have incrementing integer keys " f'(Expected "{expect_key}", got "{elem.key}")', cur_offset, ) array_idx += 1 cur_offset += elem_size # Check that we actually consumed the whole buffer: remain = len(buf) - cur_offset if remain > 1: yield DocumentError(f"Extra {len(buf)} bytes in document data", cur_offset) @classmethod def _parse_one( cls, buf: bytes, elem_offset: int ) -> Generator[DocumentError, None, DocumentElement | DocumentError]: try: # Read the tag type type_tag = BSONType(buf[0]) except ValueError: # The tag byte is not a valid tag value return DocumentError(f"Invalid element type tag 0x{buf[0]:x}", elem_offset) except IndexError: # 'buf' was empty return DocumentError(f"Unexpected end-of-data", elem_offset) # Stop if this is the end: if type_tag == BSONType.EOD: return DocumentElement(type_tag, "", 0, 0) # Find the null terminator on the key: try: key_nulpos = buf.index(0, 1) except ValueError: return DocumentError(f"Unexpected end-of-data while parsing the element key", elem_offset) key_bytes = buf[1:key_nulpos] try: key = key_bytes.decode("utf-8") except UnicodeDecodeError as e: yield DocumentError(f"Element key {key_bytes} is not valid UTF-8 ({e})", elem_offset) key = key_bytes.decode("utf-8", errors="replace") # The offset of the value within the element: inner_offset = key_nulpos + 1 # The buffer that starts at the value: value_bytes = buf[inner_offset:] # Get the fixed size of the element: fixed_size = { BSONType.Double: 8, BSONType.Bool: 1, BSONType.Undefined: 0, BSONType.Null: 0, BSONType.MinKey: 0, BSONType.MaxKey: 0, BSONType.Datetime: 8, BSONType.ObjectID: 12, BSONType.Int32: 4, BSONType.Timestamp: 8, BSONType.Int64: 8, BSONType.Decimal128: 16, } value_size = fixed_size.get(BSONType(type_tag)) if value_size is not None: pass # This element has a fixed size elif type_tag in (BSONType.Code, BSONType.Symbol, BSONType.UTF8): # Size is 4 + a length prefix value_size = read_i32le(value_bytes) + 4 elif type_tag in (BSONType.Array, BSONType.Document, BSONType.CodeWithScope): # Size is given by the length prefix value_size = read_i32le(value_bytes) elif type_tag == BSONType.DBPointer: # Size is a length prefix, plus four, plus 12 bytes for the OID value_size = read_i32le(value_bytes) + 4 + 12 elif type_tag == BSONType.Regex: # Size is dynamic and given as two C strings: nul1 = value_bytes.index(0) nul2 = value_bytes.index(0, nul1 + 1) value_size = nul2 + 1 elif type_tag == BSONType.Binary: # Size is a length prefix, plus four, plus one for the subtype value_size = read_i32le(value_bytes) + 4 + 1 else: assert False, f"Unhandled value tag? {type_tag=} {buf=} {key=}" # The absolute offset of the element within the parent document: value_offset = elem_offset + inner_offset return DocumentElement(type_tag, key, value_offset, value_size) @override def get_children(self) -> Iterable[ChildItem]: doc = self.value if isinstance(doc, DocumentError): # The entire document failed to parse. Just generate one error: yield "[error]", f"Parsing error at byte {doc.error_offset}: {doc.message}" return for elem in doc.elements: if isinstance(elem, DocumentError): # There was an error at this location. yield "[error]", f"Data error at offset {elem.error_offset}: {elem.message}" else: # Create a ValueFactory for each element: yield functools.partial(self.create_child, self.sbvalue, elem) @classmethod def create_child(cls, parent: SBValue, elem: DocumentElement) -> SBValue: """Generate the child elements for LLDB to walk through""" if cls.__qualifier__ == "array": # Don't quote the integer keys name = f"[{elem.key}]" else: name = f"['{elem.key}']" value_addr = parent.load_addr + elem.value_offset frame = parent.frame # Create a new SBType to represent the element value. For each type tag, we # want a function that maps an SBFrame and an address to a new SBType: by_type: dict[BSONType, Callable[[SBFrame, int], SBType]] = { BSONType.Double: DoubleDisplay.__get_sbtype__, BSONType.UTF8: UTF8Display.__get_sbtype__, BSONType.Document: DocumentDisplay.__get_sbtype__, BSONType.Binary: BinaryDisplay.__get_sbtype__, BSONType.Array: ArrayDisplay.__get_sbtype__, # For bool, we can just use LLDB's basic type: BSONType.Bool: lambda _fr, _addr: parent.target.GetBasicType(lldb.eBasicTypeBool), BSONType.Code: CodeDisplay.__get_sbtype__, BSONType.CodeWithScope: CodeWithScopeDisplay.__get_sbtype__, BSONType.Int32: Int32Display.__get_sbtype__, BSONType.Int64: Int64Display.__get_sbtype__, BSONType.ObjectID: ObjectIDDisplay.__get_sbtype__, BSONType.DBPointer: DBPointerDisplay.__get_sbtype__, BSONType.Regex: RegexDisplay.__get_sbtype__, BSONType.Symbol: SymbolDisplay.__get_sbtype__, BSONType.Datetime: DatetimeDisplay.__get_sbtype__, BSONType.Timestamp: TimestampDisplay.__get_sbtype__, BSONType.Decimal128: Decimal128Display.__get_sbtype__, BSONType.Null: NullDisplay.__get_sbtype__, BSONType.Undefined: UndefinedDisplay.__get_sbtype__, BSONType.MaxKey: MaxKeyDisplay.__get_sbtype__, BSONType.MinKey: MinKeyDisplay.__get_sbtype__, } get_type = by_type.get(elem.type) assert get_type is not None, f"Unhandled type tag? {elem=}" # Create the SBType: type = get_type(frame, value_addr) # Create a synthetic child of that type at the address of the element's value: val = parent.synthetic_child_from_address(name, value_addr, type) assert val.error.success, f"{elem=}, {val.error=}" return val class ArrayDisplay(DocumentDisplay): """Display for arrays. Most logic is implemented in the DocumentDisplay base.""" __typename__ = "__bson_array_[0-9]+__" __qualifier__: ClassVar[str] = "array" class BinaryInfo(NamedTuple): subtype: int data: bytes class BinaryDisplay(SyntheticDisplayBase[BinaryInfo]): """Display for a BSON binary value""" __typename__ = "__bson_binary__" @classmethod @override def __parse__(cls, value: SBValue) -> BinaryInfo: buf = memcache.get_cached(value.load_addr) # Size prefix: data_size = read_i32le(buf) # Type tag: type = buf[4] # The remainder of the data: data = buf[5:][:data_size] return BinaryInfo(type, data) @override def get_children(self) -> Iterable[ChildItem]: yield "size", len(self.value.data) byte_t = generate_or_get_type("enum __bson_byte__ : char {}", self.sbvalue.frame) yield "subtype", self.value.subtype, lldb.eFormatHex, byte_t array_t = byte_t.GetArrayType(len(self.value.data)) yield lambda: self.sbvalue.synthetic_child_from_address("data", self.address + 5, array_t) class UndefinedDisplay(SyntheticDisplayBase[None]): """ Display type for 'undefined' values. Also derived from for other unit types. """ __typename__ = "__bson_undefined__" __summary_str__ = "undefined" __enable_synthetic__: ClassVar[bool] = False @classmethod @override def __parse__(cls, value: SBValue) -> None: return None class ObjectIDDisplay(SyntheticDisplayBase[bytes]): """Display type for ObjectIDs""" __typename__ = "__bson_objectid__" @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: val = cls.__parse__(value) return f'ObjectID("{val.hex()}")' @classmethod @override def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: return generate_or_get_type( r""" enum __bson_byte__ : char {}; struct __bson_objectid__ { __bson_byte__ bytes[12]; } """, frame, ) @classmethod @override def __parse__(cls, value: SBValue) -> bytes: buf = memcache.get_cached(value.load_addr) return buf[:12] @override def get_children(self) -> Iterable[ChildItem]: yield "spelling", self.value.hex() class DatetimeDisplay(SyntheticDisplayBase[int]): """Display for BSON Datetime objects""" __typename__ = "__bson_datetime__" __summary_str__: ClassVar[str] = "datetime: ${var[0]}" @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: dt = datetime.fromtimestamp(cls.__parse__(value) / 1000) s = f"{dt:%a %b %m %Y %H:%M:%S +%fμs}" return f'Date("{s}")' @classmethod @override def __parse__(cls, val: SBValue) -> int: buf = memcache.get_cached(val.load_addr) buf = buf[:8] value: int = struct.unpack(" Iterable[ChildItem]: # We can create a rich display using Python's datetime parsing: dt = datetime.fromtimestamp(self.value / 1000) # Adjusted to the local time zone: adjusted = dt.astimezone() yield from { "[isoformat]": dt.isoformat(), "[date]": f"{dt:%B %d, %Y}", "[time]": dt.strftime("%H:%M:%S +%fμs"), "[local]": adjusted.strftime("%c"), "Year": dt.year, "Month": dt.month, "Day": dt.day, "Hour": dt.hour, "Minute": dt.minute, "Second": dt.second, "+μs": dt.microsecond, }.items() class NullDisplay(UndefinedDisplay): """Display for the BSON 'null' type""" __typename__ = "__bson_null__" __summary_str__ = "null" class RegexDisplay(SyntheticDisplayBase[Tuple[bytes, bytes]]): """Display type for BSON regular expressions""" __typename__ = "__bson_regex_[0-9]+_[0-9]+__" __enable_synthetic__: ClassVar[bool] = False @classmethod @override def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: regex, opts = cls.parse_at(addr) regex_len = len(regex) + 1 opts_len = len(opts) + 1 # Synthesize a struct with two char[] matching the strings: return generate_or_get_type( rf""" struct __bson_regex_{regex_len}_{opts_len}__ {{ char regex[{regex_len}]; char options[{opts_len}]; }} """, frame, ) @classmethod @override def __parse__(cls, value: SBValue) -> tuple[bytes, bytes]: return cls.parse_at(value.load_addr) @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: # Create a JS-style regex literal: pair = cls.__parse__(value) regex, options = cls.decode_pair(pair) regex = regex.replace("/", "\\/").replace("\n", "\\n") return f"/{regex}/{options}" @classmethod def parse_at(cls, addr: int) -> tuple[bytes, bytes]: buf = memcache.get_cached(addr) # A regex is encoded with two C-strings. Find the nulls: nulpos_1 = buf.index(0) nulpos_2 = buf.index(0, nulpos_1 + 1) # Split them up: regex = buf[:nulpos_1] options = buf[nulpos_1 + 1 : nulpos_2] # Decode and return: return regex, options @classmethod def decode_pair(cls, value: tuple[bytes, bytes]) -> tuple[str, str]: regex, options = value regex = regex.decode("utf-8", errors="replace") options = options.decode("utf-8", errors="replace") return regex, options class DBPointerDisplay(SyntheticDisplayBase[Tuple[bytes, int]]): """Display type for DBPointers""" __typename__ = "__bson_dbpointer__" __summary_str__: ClassVar[str | None] = "DBPointer(${var[0]}, ${var[1]})" @classmethod @override def __parse__(cls, value: SBValue) -> tuple[bytes, int]: buf = memcache.get_cached(value.load_addr) # Grab the string and the OID position strlen = read_i32le(buf) size = strlen + 4 + 12 return buf[:size], strlen + 4 @override def get_children(self) -> Iterable[ChildItem]: utf8_t = UTF8Display.__get_sbtype__(self.sbvalue.frame, self.address) oid_offset = self.value[1] oid_t = ObjectIDDisplay.__get_sbtype__(self.sbvalue.frame, self.address + oid_offset) yield lambda: self.sbvalue.synthetic_child_from_address("collection", self.sbvalue.load_addr, utf8_t) yield lambda: self.sbvalue.synthetic_child_from_address("object", self.sbvalue.load_addr + oid_offset, oid_t) class CodeDisplay(UTF8Display): """Display type for BSON code""" __typename__ = "__bson_code__" __summary_str__ = "Code(${var[1]})" class SymbolDisplay(UTF8Display): """Display type for BSON symbols""" __typename__ = "__bson_symbol__" @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: spell = cls.__parse__(value) dec = spell.decode("utf-8", errors="replace").rstrip("\x00") return f"Symbol({dec})" class CodeWithScopeDisplay(SyntheticDisplayBase[int]): """Display type for BSON 'Code w/ Scope'""" __typename__ = "__code_with_scope__" __summary_str__: ClassVar[str | None] = "Code(${var[0][1]}, ${var[1]})" @classmethod @override def __parse__(cls, value: SBValue) -> int: buf = memcache.get_cached(value.load_addr) # Find the end position of the string: strlen = read_i32le(buf[4:]) str_end = 4 + strlen + 4 return str_end @override def get_children(self) -> Iterable[ChildItem]: code_t = CodeDisplay.__get_sbtype__(self.sbvalue.frame, self.address) scope_doc_offset = self.value doc_t = DocumentDisplay.__get_sbtype__(self.sbvalue.frame, self.address + scope_doc_offset) yield lambda: checked(self.sbvalue.synthetic_child_from_address("code", self.address + 4, code_t)) yield lambda: checked( self.sbvalue.synthetic_child_from_address("scope", self.address + scope_doc_offset, doc_t) ) class Int32Display(PrimitiveDisplay[int]): """Display for 32-bit BSON integers""" __typename__ = "__bson_int32__" __struct_format__: ClassVar[str] = " str: return f"NumberInt({cls.__parse__(value)})" class Int64Display(PrimitiveDisplay[int]): """Display for 64-bit BSON integers""" __typename__ = "__bson_int64__" __struct_format__: ClassVar[str] = " str: return f"NumberLong({cls.__parse__(value)})" class TimestampDisplay(SyntheticDisplayBase[Tuple[int, int]]): """Display type for BSON timestamps""" __typename__ = "__bson_timestamp__" __summary_str__ = "Timestamp(${var[0]}, ${var[1]})" @classmethod @override def __parse__(cls, value: SBValue) -> tuple[int, int]: buf = memcache.get_cached(value.load_addr)[:8] # Just two 32bit integers: timestamp, increment = struct.unpack(" Iterable[ChildItem]: yield "timestamp", self.value[0] yield "increment", self.value[1] class Decimal128Value(NamedTuple): """Represents a parsed Decimal128 value""" sign: int combination: int exponent: int significand: int spelling: str class Decimal128Display(SyntheticDisplayBase[Decimal128Value]): """The display type for BSON's Decimal128 type""" __typename__ = "__bson_decimal128__" @classmethod @override def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: """Generate a type for byte-wise introspection""" return generate_or_get_type( r""" struct __bson_decimal128__ { unsigned char bytes[16]; } """, frame, ) @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: val = cls.__parse__(value) return f'NumberDecimal("{val.spelling}")' @classmethod @override def __parse__(cls, value: SBValue) -> Decimal128Value: dat = bytes(value.data.uint8) # The value is little-endian encoded, so we manually read it in that encoding d1 = read_i32le(dat) d2 = read_i32le(dat[4:]) d3 = read_i32le(dat[8:]) d4 = read_i32le(dat[12:]) # Combin the parts: low_word = (d2 << 32) | d1 hi_word = (d4 << 32) | d3 d128_tetra = (hi_word << 64) | low_word # Create an array of individual bits (high bits first): bits = tuple(((d128_tetra >> n) & 1) for n in range(127, -1, -1)) # Recombine a sequence of bits into an int (high bits first) mergebits: Callable[[tuple[int, ...]], int] = lambda bs: functools.reduce(lambda a, b: (a << 1) | b, bs, 0) # Sign bit: sign = bits[0] # BID uses the first two combo bits to indicate that the exponent is shifted if bits[1] and bits[2]: shifted = True else: shifted = False spelling = None if not shifted: # Regular bit positions: exponent = bits[1:15] coeff = bits[15:] else: # Bit positions are shifted over exponent = bits[3:17] # The significand has an implicit '0b100' prepended as the highest bits: coeff = (1, 0, 0) + bits[17:] # Check for special values in the remainder of the combination: more = bits[3:6] if more == (1, 0, 0) or more == (1, 0, 1): spelling = "Infinity" elif more == (1, 1, 0): spelling = "NaN (quiet)" elif more == (1, 1, 1): spelling = "NaN (signaling)" coeff = mergebits(coeff) exponent = mergebits(exponent) if spelling is None: spelling = str(coeff) e = exponent - 6176 if e == 0: pass elif e < 0: spelling = spelling.zfill(abs(e)) split = len(spelling) + e w, fr = spelling[:split], spelling[split:] spelling = f"{w}.{fr}" else: spelling = spelling + "0" * e if sign: spelling = f"-{spelling}" # The "combination" bits combination = mergebits(bits[1:18]) return Decimal128Value(sign, combination, exponent, coeff, spelling) @override def get_children(self) -> Iterable[ChildItem]: yield "sign", self.value.sign yield "combination", self.value.combination, lldb.eFormatBinary, None yield "exponent (biased)", self.value.exponent yield "exponent (actual)", self.value.exponent - 6176 yield "significand", str(self.value.significand) yield "value", self.value.spelling class MaxKeyDisplay(NullDisplay): """The display type for BSON's 'max key' type""" __typename__ = "__bson_maxkey__" __summary_str__ = "max key" class MinKeyDisplay(NullDisplay): """The display type for BSON's 'min key' type""" __typename__ = "__bson_minkey__" __summary_str__ = "min key" class BSONTInfo(NamedTuple): """Information about a bson_t object""" addr: int "The address of the pointer to the beginning of the BSON data managed by this object" size: int "The size of the BSON data managed/referenced by this object" flags: int "Flags of the bson_t object" class BSONTError(NamedTuple): """Represents an error while reading a bson_t object""" reason: str "A description of the error that ocurred" class BSONTDisplay(SyntheticDisplayBase["BSONTInfo | BSONTError"]): """ Implements inspection logic for bson_t """ __typename__ = "bson_t" @classmethod @override def __parse__(cls, value: SBValue) -> BSONTInfo | BSONTError: # Dereference pointers: if value.TypeIsPointerType(): value = value.deref # Unwrap the wrapped object value = value.GetNonSyntheticValue() dat = value.data # We know the location of the flags and size without debug info: err = SBError() flags = dat.GetUnsignedInt32(err, 0) if err.fail: return BSONTError(f"Failed to read memory at 0x{value.load_addr:x}: {err.description}") length = dat.GetUnsignedInt32(err, 4) if err.fail: return BSONTError(f"Failed to read memory at 0x{value.load_addr:x}: {err.description}") # Check bogus values: MAX_SIZE = 16 * 1024 * 1024 ALL_FLAGS = (1 << 6) - 1 if flags & ~ALL_FLAGS or length < 5 or length > MAX_SIZE: return BSONTError(f"bson_t appears uninitialized/invalid [a] {flags=} {length=}") is_inline = bool(flags & 1) if is_inline: # Inline objects may only occupy 120 bytes, at most if length > 120: return BSONTError("bson_t appears uninitialized/invalid [b]") # Look for debug info for the inline impl inline_t = value.target.FindFirstType("bson_impl_inline_t") if inline_t: as_inline = value.Cast(inline_t) ptr = as_inline.GetChildMemberWithName("data").load_addr else: # No debug info? Guess its location as the default ptr = value.load_addr + 4 + 4 if not err.success: return BSONTError(f"Failed to read inline bson_t data: {err}") return BSONTInfo(ptr, length, flags) # Look for impl_alloc_t alloc_t = value.target.FindFirstType("bson_impl_alloc_t") if alloc_t: alloc = value.Cast(alloc_t) # Walk to the buffer for this value: offset = alloc.GetChildMemberWithName("offset").unsigned buf = alloc.GetChildMemberWithName("buf").deref.deref ptr = buf.load_addr + offset return BSONTInfo(ptr, length, flags) # No debug info, we have to calc the offset ourself u8_t = value.target.GetBasicType(lldb.eBasicTypeUnsignedChar) u8ptr_t = u8_t.GetPointerType() ptr_size = u8ptr_t.size u32_size = 4 buf_off = (u32_size * 2) + ptr_size + u32_size if u32_size < ptr_size: # Adjust for alignment buf_off += u32_size offset_off = buf_off + (ptr_size * 2) offset = dat.GetUnsignedInt32(err, offset_off) if not err.success: return BSONTError(f"Failed to read offset of buffer: {err}") bufptr = value.CreateChildAtOffset("buf", buf_off, u8ptr_t.GetPointerType()).deref if not bufptr.error.success: return BSONTError(f"Failed to read the alloc buf: {bufptr.error} {offset=} {buf_off=}") ptr = bufptr.data.GetUnsignedInt64(err, 0) assert err.success, err u32_t = value.target.FindFirstType("uint32_t") addr = SBAddress() addr.SetLoadAddress(ptr, value.target) u32 = value.target.CreateValueFromAddress("tmp", addr, u32_t) assert u32.error.success, u32 if u32.unsigned != length or length < 5: return BSONTError(f"bson_t appears uninitialized/invalid [c] {flags=} {length=} {u32.unsigned=}") return BSONTInfo(ptr, length, flags) @override def get_children(self) -> Iterable[ChildItem]: val = self.value if isinstance(val, BSONTError): yield "[error]", val.reason return # Imbue the flags with the possible debug info to give it a nice rendering flags_t = self.sbvalue.target.FindFirstType("bson_flags_t") if flags_t.IsValid(): yield "flags", val.flags, None, flags_t else: yield "flags", val.flags yield "data size", val.size ptr_t = self.sbvalue.target.GetBasicType(lldb.eBasicTypeVoid).GetPointerType() yield "data address", val.addr, lldb.eFormatPointer, ptr_t # Generate the __bson_document_xxx__ that will allow walking the document: doc_t = DocumentDisplay.__get_sbtype__(self.sbvalue.frame, val.addr) yield lambda: checked(self.sbvalue.synthetic_child_from_address("[content]", val.addr, doc_t)) def checked(val: SBValue) -> SBValue: """Assert that ``val`` is valid. Returns ``val``""" assert val.error.success, f"{val=} {val.error=}" return val def read_i32le(dat: bytes) -> int: """Read a 32-bit integer from the given data.""" # Truncate before the read: buf = dat[0:4] return struct.unpack(" SBType: """ This is the big magic in this module: LLDB doesn't have a "simple" API to generate new datatypes (which we need in order to inspect element contents!), so we instead generate them on-the-fly using the expression evaluator. If we evaluate an expression like: struct some_struct { int a, b, c; }; some_struct x; x LLDB will give us a handle to ``x``. We can then ask for the type of ``x``, which gives us a handle to `some_struct`, from which we can now synthesize new values and use as if it were part of the target's debug information all along. This needs to be done carefully, since it is an expensive operation and we do not want to declare the same type more than once. For this reason, we cache. """ # The cache key cachekey = frame.thread.process.id, expr_prefix existing = _types_cache.get(cachekey) if existing is not None: # We've already generated this type before return existing # Create a new temporary object. Give it a unique name to prevent it from # colliding with any possible temporaries we may have generated previously. hash = hashlib.md5(expr_prefix.encode()).hexdigest() varname = f"__bson_lldb_tmp_{hash}" full_expr = f"{expr_prefix} {varname}; {varname}" tmp = frame.EvaluateExpression(full_expr) existing = tmp.type _types_cache[cachekey] = existing return existing class BSONType(enum.Enum): """The values for each bson element type tag""" EOD = 0 Double = 0x1 UTF8 = 0x2 Document = 0x3 Array = 0x4 Binary = 0x5 Undefined = 0x6 ObjectID = 0x7 Bool = 0x8 Datetime = 0x9 Null = 0xA Regex = 0xB DBPointer = 0xC Code = 0xD Symbol = 0xE CodeWithScope = 0xF Int32 = 0x10 Timestamp = 0x11 Int64 = 0x12 Decimal128 = 0x13 MinKey = 255 MaxKey = 127 class _BSONWalker: """ This implement document traversal in a Python expression evaluator. It uses __getattr__ and __getitem__ to provide simple semantics for accessing subelements, and uses the matmul infix operator ``@`` to resolve the path against a given SBValue that refers to a ``bson_t`` """ def __init__(self, path: Iterable[str | int] = ()) -> None: self._path = tuple(path) "The path that we will resolve when '@' is applied." def __rmatmul__(self, lhs: Any) -> SBValue | str: """Implement the actual path resolution. This is the '@' operator.""" if isinstance(lhs, str): # Evaluate the left-hand string as an expression within the target target = lldb.debugger.GetSelectedTarget() if target is None: raise RuntimeError("Not attached to a debug target") frame = target.process.selected_thread.frames[0] lhs = frame.EvaluateExpression(lhs) val: SBValue if hasattr(lhs.__class__, "unwrap"): # CodeLLDB gives us a wrapper around SBValue, but we want the unwrapped # version: val = lhs.__class__.unwrap(lhs) else: val = lhs if val.TypeIsPointerType(): # Dereference pointers val = val.deref # Drop the synthetic wrapper that was wrapped around bson_t val = val.GetNonSyntheticValue() # Parse it: as_bson = BSONTDisplay.__parse__(val) if isinstance(as_bson, BSONTError): raise ValueError(as_bson.reason) # Create the synthetic __bson_document_xxx__ object for this doc doc_t = DocumentDisplay.__get_sbtype__(val.frame, as_bson.addr) # Obtain a value reference to the document data: retval = val.CreateValueFromAddress("[root]", as_bson.addr, doc_t) # Now resolve the path: for part in self._path: if isinstance(part, str): # Access via ``p['foo']`` or ``p.foo``, requires our current node # to be a document: if not retval.type.name.startswith("__bson_document_"): raise AttributeError( f'Element of type {retval.type.name} cannot be accessed as a document (looking for element "{part}")' ) # We are accessing the synthetic children generated by DocumentDisplay. # The keys are of the following format based on the element keys in the document: want_child_name = f"['{part}']" else: # Access via indexing ``p[42]``, requires an array if not retval.type.name.startswith("__bson_array_"): raise AttributeError( f"Element of type {retval.type.name} cannot be accessed as an array (looking for element {part})" ) # Array keys are bracketed, but not quoted want_child_name = f"[{part}]" # Find all children that match the key (usually only one) matching = (c for c in retval.children if c.name == want_child_name) # Get it: got = next(iter(matching), None) if got is None: # Didn't get it... if isinstance(part, str): raise KeyError(f'Document has no element "{part}"') else: raise IndexError(f"Array index [{part}] is out-of-bounds") # Set this as our current node, which we may step in further, or # we may be done retval = got return retval def __getattr__(self, key: str) -> _BSONWalker: """Generate a new traversal for the given key""" return _BSONWalker(self._path + (key,)) def __getitem__(self, key: str | int) -> _BSONWalker: """Generate a new traversal for the given key or index""" return _BSONWalker(self._path + (key,)) class _MemoryCache: """ Reading process memory is an extremely slow operation, and we don't want to re-read memory multiple times. Because parsing a document's elements requires reading the entire document into memory, we are guaranteed that the top-level DocumentDisplay object will perform a ReadMemory() of the entire object, and thus all child elements can reuse that buffer when they parse and render their own contents. This class implements that cache of memory segments """ def __init__(self): self._segments: dict[int, bytes] = {} "Segments of memory keyed by the base address of the read operation" def get_cached(self, addr: int) -> bytes: """ Find and return a chunk of memory that was previously read from the process. The ``addr`` must be an address within a BSON document that was previously read by a DocumentDisplay. The returned buffer begins at exactly ``addr``, and contains the full remainder of the cached segment, which may be much longer than the caller actually needs. We don't need additional granularity for our purposes, though. """ segment = self.segment_containing(addr) if not segment: # Memory does not exist? print(f"lldb_bson: Note: Attempted read of uncached address 0x{addr:x}") print("".join(traceback.format_stack())) return b"\0" * 512 base_addr, data = segment inner_offset = addr - base_addr return data[inner_offset:] def segment_containing(self, addr: int) -> tuple[int, bytes] | None: """Find the segment that contains ``addr``, or returns None""" for base_addr, data in self._segments.items(): end_addr = base_addr + len(data) if addr > end_addr or addr < base_addr: continue return base_addr, data return None def read(self, val: SBValue) -> tuple[int, bytes]: """ Read the memory segment referenced by the given SBValue """ return self.read_at(val.process, val.load_addr, val.size) def read_at(self, proc: SBProcess, addr: int, size: int) -> tuple[int, bytes]: """ Read from ``proc`` a chunk of memory beginning at ``addr`` and continuing for ``size`` bytes. """ err = SBError() buf = proc.ReadMemory(addr, size, err) if err.fail: raise LookupError(err.description) self._segments[addr] = buf return addr, buf memcache = _MemoryCache() "A module-wide memory segment cache." mongo-c-driver-1.26.0/orchestration_configs/000077500000000000000000000000001456567454500210515ustar00rootroot00000000000000mongo-c-driver-1.26.0/orchestration_configs/replica_sets/000077500000000000000000000000001456567454500235265ustar00rootroot00000000000000mongo-c-driver-1.26.0/orchestration_configs/replica_sets/auth-ssl.json000066400000000000000000000022071456567454500261620ustar00rootroot00000000000000{ "auth_key": "secret", "id": "repl0", "login": "bob", "password": "pwd123", "members": [ { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27017, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "one", "dc": "ny" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27018, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "two", "dc": "pa" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27019, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "arbiterOnly": true } } ], "sslParams": { "sslMode": "requireSSL", "sslPEMKeyFile": "/tmp/orchestration-home/server.pem", "sslCAFile": "/tmp/orchestration-home/ca.pem", "sslAllowInvalidCertificates": true, "sslWeakCertificateValidation" : true } } mongo-c-driver-1.26.0/orchestration_configs/replica_sets/auth-thisDB-ssl.json000066400000000000000000000022271456567454500273370ustar00rootroot00000000000000{ "auth_key": "secret", "id": "repl0", "login": "bob", "password": "pwd123", "authSource": "thisDB", "members": [ { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27017, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "one", "dc": "ny" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27018, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "two", "dc": "pa" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27019, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "arbiterOnly": true } } ], "sslParams": { "sslMode": "requireSSL", "sslPEMKeyFile": "/tmp/orchestration-home/server.pem", "sslCAFile": "/tmp/orchestration-home/ca.pem", "sslAllowInvalidCertificates": true, "sslWeakCertificateValidation" : true } } mongo-c-driver-1.26.0/orchestration_configs/replica_sets/auth.json000066400000000000000000000016111456567454500253610ustar00rootroot00000000000000{ "auth_key": "secret", "id": "repl0", "login": "bob", "members": [ { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27017, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "one", "dc": "ny" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27018, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "two", "dc": "pa" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27019, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "arbiterOnly": true } } ], "password": "pwd123" } mongo-c-driver-1.26.0/orchestration_configs/replica_sets/basic-ssl.json000066400000000000000000000021051456567454500262770ustar00rootroot00000000000000{ "id": "repl0", "members": [ { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27017, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "one", "dc": "ny" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27018, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "two", "dc": "pa" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27019, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "arbiterOnly": true } } ], "sslParams": { "sslMode": "requireSSL", "sslPEMKeyFile": "/tmp/orchestration-home/server.pem", "sslCAFile": "/tmp/orchestration-home/ca.pem", "sslAllowInvalidCertificates": true, "sslWeakCertificateValidation" : true } } mongo-c-driver-1.26.0/orchestration_configs/replica_sets/basic.json000066400000000000000000000015071456567454500255050ustar00rootroot00000000000000{ "id": "repl0", "members": [ { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27017, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "one", "dc": "ny" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27018, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "tags": { "ordinal": "two", "dc": "pa" } } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27019, "setParameter" : { "enableTestCommands": 1 } }, "rsParams": { "arbiterOnly": true } } ] } mongo-c-driver-1.26.0/orchestration_configs/servers/000077500000000000000000000000001456567454500225425ustar00rootroot00000000000000mongo-c-driver-1.26.0/orchestration_configs/servers/auth-aws.json000066400000000000000000000005301456567454500251640ustar00rootroot00000000000000{ "id": "standalone-aws", "auth_key": "secret", "login": "bob", "name": "mongod", "password": "pwd123", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017, "setParameter": {"enableTestCommands": 1, "authenticationMechanisms": "MONGODB-AWS,SCRAM-SHA-256,SCRAM-SHA-1"} } }mongo-c-driver-1.26.0/orchestration_configs/servers/auth-ssl.json000066400000000000000000000007601456567454500252000ustar00rootroot00000000000000{ "id" : "standalonessl", "name": "mongod", "login": "bob", "password": "pwd123", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017 }, "sslParams": { "sslMode": "requireSSL", "sslPEMKeyFile": "/tmp/orchestration-home/server.pem", "sslCAFile": "/tmp/orchestration-home/ca.pem", "sslAllowInvalidCertificates": true, "sslWeakCertificateValidation" : true } } mongo-c-driver-1.26.0/orchestration_configs/servers/auth.json000066400000000000000000000003411456567454500243740ustar00rootroot00000000000000{ "id": "standalone", "auth_key": "secret", "login": "bob", "name": "mongod", "password": "pwd123", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017 } } mongo-c-driver-1.26.0/orchestration_configs/servers/basic-ipv4-only.json000066400000000000000000000001521456567454500263530ustar00rootroot00000000000000{ "name": "mongod", "procParams": { "ipv6": false, "logappend": true, "port": 27017 } } mongo-c-driver-1.26.0/orchestration_configs/servers/basic-ssl.json000066400000000000000000000006651456567454500253240ustar00rootroot00000000000000{ "id" : "standalonenoauthssl", "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017 }, "sslParams": { "sslMode": "requireSSL", "sslPEMKeyFile": "/tmp/orchestration-home/server.pem", "sslCAFile": "/tmp/orchestration-home/ca.pem", "sslAllowInvalidCertificates": true, "sslWeakCertificateValidation" : true } } mongo-c-driver-1.26.0/orchestration_configs/servers/basic.json000066400000000000000000000002111456567454500245100ustar00rootroot00000000000000{ "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017 } } mongo-c-driver-1.26.0/orchestration_configs/servers/ecdsa-basic-tls-ocsp-disableStapling.json000066400000000000000000000011021456567454500324320ustar00rootroot00000000000000{ "id" : "standalonenoauthssl", "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017, "setParameter": {"failpoint.disableStapling":"{\"mode\":\"alwaysOn\"}}"} }, "sslParams": { "sslOnNormalPorts": true, "sslPEMKeyFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/ecdsa/server.pem", "sslCAFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/ecdsa/ca.pem", "sslWeakCertificateValidation" : true, "sslAllowInvalidCertificates": true } } ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json000066400000000000000000000011151456567454500345160ustar00rootroot00000000000000mongo-c-driver-1.26.0/orchestration_configs/servers{ "id" : "standalonenoauthssl", "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017, "setParameter": {"failpoint.disableStapling":"{\"mode\":\"alwaysOn\"}}"} }, "sslParams": { "sslOnNormalPorts": true, "sslPEMKeyFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/ecdsa/server-mustStaple.pem", "sslCAFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/ecdsa/ca.pem", "sslWeakCertificateValidation" : true, "sslAllowInvalidCertificates": true } } mongo-c-driver-1.26.0/orchestration_configs/servers/ecdsa-basic-tls-ocsp-mustStaple.json000066400000000000000000000010521456567454500314720ustar00rootroot00000000000000{ "id" : "standalonenoauthssl", "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017, "setParameter": {"ocspEnabled": true} }, "sslParams": { "sslOnNormalPorts": true, "sslPEMKeyFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/ecdsa/server-mustStaple.pem", "sslCAFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/ecdsa/ca.pem", "sslWeakCertificateValidation" : true, "sslAllowInvalidCertificates": true } } mongo-c-driver-1.26.0/orchestration_configs/servers/mmapv1.json000066400000000000000000000003021456567454500246310ustar00rootroot00000000000000{ "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "storageEngine": "mmapv1", "port": 27017 } } mongo-c-driver-1.26.0/orchestration_configs/servers/rsa-basic-tls-ocsp-disableStapling.json000066400000000000000000000010761456567454500321520ustar00rootroot00000000000000{ "id" : "standalonenoauthssl", "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017, "setParameter": {"failpoint.disableStapling":"{\"mode\":\"alwaysOn\"}}"} }, "sslParams": { "sslOnNormalPorts": true, "sslPEMKeyFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/rsa/server.pem", "sslCAFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/rsa/ca.pem", "sslWeakCertificateValidation" : true, "sslAllowInvalidCertificates": true } } rsa-basic-tls-ocsp-mustStaple-disableStapling.json000066400000000000000000000011111456567454500342200ustar00rootroot00000000000000mongo-c-driver-1.26.0/orchestration_configs/servers{ "id" : "standalonenoauthssl", "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017, "setParameter": {"failpoint.disableStapling":"{\"mode\":\"alwaysOn\"}}"} }, "sslParams": { "sslOnNormalPorts": true, "sslPEMKeyFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/rsa/server-mustStaple.pem", "sslCAFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/rsa/ca.pem", "sslWeakCertificateValidation" : true, "sslAllowInvalidCertificates": true } } mongo-c-driver-1.26.0/orchestration_configs/servers/rsa-basic-tls-ocsp-mustStaple.json000066400000000000000000000010461456567454500312030ustar00rootroot00000000000000{ "id" : "standalonenoauthssl", "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017, "setParameter": {"ocspEnabled": true} }, "sslParams": { "sslOnNormalPorts": true, "sslPEMKeyFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/rsa/server-mustStaple.pem", "sslCAFile": "ABSOLUTE_PATH_REPLACEMENT_TOKEN/.evergreen/ocsp/rsa/ca.pem", "sslWeakCertificateValidation" : true, "sslAllowInvalidCertificates": true } } mongo-c-driver-1.26.0/orchestration_configs/servers/snappy-zlib-zstd.json000066400000000000000000000002761456567454500266740ustar00rootroot00000000000000{ "name": "mongod", "procParams": { "networkMessageCompressors": "snappy,zlib,zstd", "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017 } } mongo-c-driver-1.26.0/orchestration_configs/servers/snappy.json000066400000000000000000000002641456567454500247510ustar00rootroot00000000000000{ "name": "mongod", "procParams": { "networkMessageCompressors": "snappy", "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017 } } mongo-c-driver-1.26.0/orchestration_configs/servers/versioned-api-testing.json000066400000000000000000000004021456567454500276510ustar00rootroot00000000000000{ "id": "versioned-api-testing", "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017, "setParameter": { "enableTestCommands": 1, "acceptApiVersion2": 1 } } }mongo-c-driver-1.26.0/orchestration_configs/servers/wiredtiger.json000066400000000000000000000003061456567454500256010ustar00rootroot00000000000000{ "name": "mongod", "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "storageEngine": "wiredTiger", "port": 27017 } } mongo-c-driver-1.26.0/orchestration_configs/servers/zlib.json000066400000000000000000000002621456567454500243750ustar00rootroot00000000000000{ "name": "mongod", "procParams": { "networkMessageCompressors": "zlib", "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017 } } mongo-c-driver-1.26.0/orchestration_configs/servers/zstd.json000066400000000000000000000003061456567454500244200ustar00rootroot00000000000000{ "name": "mongod", "procParams": { "networkMessageCompressors": "zstd", "ipv6": true, "bind_ip": "127.0.0.1,::1", "logappend": true, "port": 27017 } } mongo-c-driver-1.26.0/orchestration_configs/sharded_clusters/000077500000000000000000000000001456567454500244075ustar00rootroot00000000000000mongo-c-driver-1.26.0/orchestration_configs/sharded_clusters/auth-load-balancer.json000066400000000000000000000021461456567454500307300ustar00rootroot00000000000000{ "id": "shard_cluster_1", "login": "bob", "password": "pwd123", "auth_key": "secret", "shards": [ { "id": "sh01", "shardParams": { "members": [ { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27217 } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27218 } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27219 } } ] } } ], "routers": [ { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27017, "setParameter": { "loadBalancerPort": 27050 } }, { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27018, "setParameter": { "loadBalancerPort": 27051 } } ] } mongo-c-driver-1.26.0/orchestration_configs/sharded_clusters/auth-ssl-load-balancer.json000066400000000000000000000024721456567454500315310ustar00rootroot00000000000000{ "id": "shard_cluster_1", "login": "bob", "password": "pwd123", "auth_key": "secret", "shards": [ { "id": "sh01", "shardParams": { "members": [ { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27217 } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27218 } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27219 } } ] } } ], "routers": [ { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27017, "setParameter": { "loadBalancerPort": 27050 } }, { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27018, "setParameter": { "loadBalancerPort": 27051 } } ], "sslParams": { "sslOnNormalPorts": true, "sslPEMKeyFile": "/tmp/orchestration-home/server.pem", "sslCAFile": "/tmp/orchestration-home/ca.pem", "sslWeakCertificateValidation" : true } } mongo-c-driver-1.26.0/orchestration_configs/sharded_clusters/auth-ssl.json000066400000000000000000000023351456567454500270450ustar00rootroot00000000000000{ "id": "shard_cluster_1", "login": "bob", "password": "pwd123", "auth_key": "secret", "shards": [ { "id": "sh01", "shardParams": { "members": [{ "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "setParameter" : { "enableTestCommands": 1 }, "port": 27217 } }] } }, { "id": "sh02", "shardParams": { "members": [{ "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "setParameter" : { "enableTestCommands": 1 }, "port": 27218 } }] } } ], "routers": [ { "ipv6": true, "bind_ip": "127.0.0.1,::1", "setParameter" : { "enableTestCommands": 1 }, "port": 27017 }, { "ipv6": true, "bind_ip": "127.0.0.1,::1", "setParameter" : { "enableTestCommands": 1 }, "port": 27018 } ], "sslParams": { "sslOnNormalPorts": true, "sslPEMKeyFile": "/tmp/orchestration-home/server.pem", "sslCAFile": "/tmp/orchestration-home/ca.pem", "sslWeakCertificateValidation" : true } } mongo-c-driver-1.26.0/orchestration_configs/sharded_clusters/auth.json000066400000000000000000000017531456567454500262510ustar00rootroot00000000000000{ "id": "shard_cluster_1", "login": "bob", "password": "pwd123", "auth_key": "secret", "shards": [ { "id": "sh01", "shardParams": { "members": [ { "procParams": { "shardsvr": true, "port": 27217 } }, { "procParams": { "shardsvr": true, "port": 27218 } } ] } }, { "id": "sh02", "shardParams": { "members": [ { "procParams": { "shardsvr": true, "port": 27219 } }, { "procParams": { "shardsvr": true, "port": 27220 } } ] } } ], "routers": [ { "port": 27017, "ipv6": true, "bind_ip": "127.0.0.1,::1" }, { "port": 27018, "ipv6": true, "bind_ip": "127.0.0.1,::1" } ] } mongo-c-driver-1.26.0/orchestration_configs/sharded_clusters/basic-load-balancer.json000066400000000000000000000020441456567454500310450ustar00rootroot00000000000000{ "id": "shard_cluster_1", "shards": [ { "id": "sh01", "shardParams": { "members": [ { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27217 } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27218 } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27219 } } ] } } ], "routers": [ { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27017, "setParameter": { "loadBalancerPort": 27050 } }, { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27018, "setParameter": { "loadBalancerPort": 27051 } } ] } mongo-c-driver-1.26.0/orchestration_configs/sharded_clusters/basic-ssl-load-balancer.json000066400000000000000000000023701456567454500316460ustar00rootroot00000000000000{ "id": "shard_cluster_1", "shards": [ { "id": "sh01", "shardParams": { "members": [ { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27217 } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27218 } }, { "procParams": { "ipv6": true, "bind_ip": "127.0.0.1,::1", "shardsvr": true, "port": 27219 } } ] } } ], "routers": [ { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27017, "setParameter": { "loadBalancerPort": 27050 } }, { "ipv6": true, "bind_ip": "127.0.0.1,::1", "port": 27018, "setParameter": { "loadBalancerPort": 27051 } } ], "sslParams": { "sslOnNormalPorts": true, "sslPEMKeyFile": "/tmp/orchestration-home/server.pem", "sslCAFile": "/tmp/orchestration-home/ca.pem", "sslWeakCertificateValidation" : true } } mongo-c-driver-1.26.0/orchestration_configs/sharded_clusters/basic-ssl.json000066400000000000000000000022471456567454500271670ustar00rootroot00000000000000{ "id": "shard_cluster_1", "shards": [ { "id": "sh01", "shardParams": { "members": [ { "procParams": { "shardsvr": true, "port": 27217 } }, { "procParams": { "shardsvr": true, "port": 27218 } } ] } }, { "id": "sh02", "shardParams": { "members": [ { "procParams": { "shardsvr": true, "port": 27219 } }, { "procParams": { "shardsvr": true, "port": 27220 } } ] } } ], "routers": [ { "port": 27017, "ipv6": true, "bind_ip": "127.0.0.1,::1" }, { "port": 27018, "ipv6": true, "bind_ip": "127.0.0.1,::1" } ], "sslParams": { "sslMode": "requireSSL", "sslPEMKeyFile": "/tmp/orchestration-home/server.pem", "sslCAFile": "/tmp/orchestration-home/ca.pem", "sslAllowInvalidCertificates": true, "sslWeakCertificateValidation" : true } } mongo-c-driver-1.26.0/orchestration_configs/sharded_clusters/basic.json000066400000000000000000000016511456567454500263660ustar00rootroot00000000000000{ "id": "shard_cluster_1", "shards": [ { "id": "sh01", "shardParams": { "members": [ { "procParams": { "shardsvr": true, "port": 27217 } }, { "procParams": { "shardsvr": true, "port": 27218 } } ] } }, { "id": "sh02", "shardParams": { "members": [ { "procParams": { "shardsvr": true, "port": 27219 } }, { "procParams": { "shardsvr": true, "port": 27220 } } ] } } ], "routers": [ { "port": 27017, "ipv6": true, "bind_ip": "127.0.0.1,::1" }, { "port": 27018, "ipv6": true, "bind_ip": "127.0.0.1,::1" } ] } mongo-c-driver-1.26.0/poetry.lock000066400000000000000000001502501456567454500166540ustar00rootroot00000000000000# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" optional = false python-versions = ">=3.6" files = [ {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] [[package]] name = "babel" version = "2.12.1" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, ] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [[package]] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "charset-normalizer" version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] [[package]] name = "clang-format" version = "16.0.0" description = "Clang-Format is an LLVM-based code formatting tool" optional = false python-versions = "*" files = [ {file = "clang-format-16.0.0.tar.gz", hash = "sha256:f8dd028e10e1fe18d3598fcdf04b265d46c07d695c43504ea2fba9e74287766e"}, {file = "clang_format-16.0.0-py2.py3-none-macosx_10_9_universal2.whl", hash = "sha256:f887f8c8ab6975e4cd6f414512277fcd7f3fe8a3d21292010164c4ae31654c91"}, {file = "clang_format-16.0.0-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d32ca4a847e9e25c935fb187097ba4943ce52515688a85c8a745699db4991505"}, {file = "clang_format-16.0.0-py2.py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47a1d563305ba6317706b9ab47e53144d807c261ae7a861db624435b499d709f"}, {file = "clang_format-16.0.0-py2.py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9878cd8ad0b831b4126f027241f677a24f76c821780d449c35c81f5ad5273a3e"}, {file = "clang_format-16.0.0-py2.py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eab6bed7e26d4fbcba39ea828ebde417a9f24839dc0f9d4dab49e63e7c962bb"}, {file = "clang_format-16.0.0-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36302cacb9cfcc5032e4f60df454c35e2bd214ef7e65070ccda8d17373b33012"}, {file = "clang_format-16.0.0-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:55e7f4869fb720e6adf8ccb65867d0256f4fdad65152c05b0268bf4204636574"}, {file = "clang_format-16.0.0-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:e0edd52e64a100aa7e88c56099ff5754a2b3a61ea6e53148fe41866de0383dd1"}, {file = "clang_format-16.0.0-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:ace775ea2a77e73952039bd4defa5de909f47d7a3b8fd4e8281b5f266597bb71"}, {file = "clang_format-16.0.0-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:40c0aafde1c2dc3ae4227695017df436fc4fd693f63e897a4d14195d148da4a6"}, {file = "clang_format-16.0.0-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:d8bb97f027179638c1913b0a0cb59ce250fce8750c8588d971a160f1c70a3969"}, {file = "clang_format-16.0.0-py2.py3-none-win32.whl", hash = "sha256:8c345961090b2471d9d9c66fefee7084d4665189909a2d875f7279a3a68a09fb"}, {file = "clang_format-16.0.0-py2.py3-none-win_amd64.whl", hash = "sha256:e43113f7fcd25c1de4ccb81658748e4b4edcea74b66b73ffb18d6d5d018ab623"}, ] [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] name = "docutils" version = "0.19" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.7" files = [ {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, ] [[package]] name = "furo" version = "2023.7.26" description = "A clean customisable Sphinx documentation theme." optional = false python-versions = ">=3.7" files = [ {file = "furo-2023.7.26-py3-none-any.whl", hash = "sha256:1c7936929ec57c5ddecc7c85f07fa8b2ce536b5c89137764cca508be90e11efd"}, {file = "furo-2023.7.26.tar.gz", hash = "sha256:257f63bab97aa85213a1fa24303837a3c3f30be92901ec732fea74290800f59e"}, ] [package.dependencies] beautifulsoup4 = "*" pygments = ">=2.7" sphinx = ">=6.0,<8.0" sphinx-basic-ng = "*" [[package]] name = "git-url-parse" version = "1.2.2" description = "git-url-parse - A simple GIT URL parser." optional = false python-versions = "*" files = [ {file = "git-url-parse-1.2.2.tar.gz", hash = "sha256:7b5f4e3aeb1d693afeee67a3bd4ac063f7206c2e8e46e559f0da0da98445f117"}, {file = "git_url_parse-1.2.2-py2-none-any.whl", hash = "sha256:9353ff40d69488ff2299b27f40e0350ad87bd5348ea6ea09a1895eda9e5733de"}, {file = "git_url_parse-1.2.2-py3-none-any.whl", hash = "sha256:4655ee22f1d8bf7a1eb1066c1da16529b186966c6d8331f7f55686a76a9f7aef"}, ] [package.dependencies] pbr = "*" [[package]] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] [[package]] name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] [[package]] name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] [package.dependencies] MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] [[package]] name = "livereload" version = "2.6.3" description = "Python LiveReload is an awesome tool for web developers" optional = false python-versions = "*" files = [ {file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"}, {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, ] [package.dependencies] six = "*" tornado = {version = "*", markers = "python_version > \"2.7\""} [[package]] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] name = "packaging" version = "23.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] name = "pbr" version = "5.11.1" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" files = [ {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, ] [[package]] name = "pydantic" version = "1.10.7" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, ] [package.dependencies] typing-extensions = ">=4.2.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] plugins = ["importlib-metadata"] [[package]] name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] [[package]] name = "pyyaml" version = "5.3.1" description = "YAML parser and emitter for Python" optional = false python-versions = "*" files = [ {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." optional = false python-versions = ">=3.7" files = [ {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "shrub-py" version = "3.0.4" description = "Library for creating evergreen configurations" optional = false python-versions = ">3.6.1" files = [ {file = "shrub.py-3.0.4-py3-none-any.whl", hash = "sha256:57d783e3cfe85573906c330a7612ade7eadca8b7c41006bdc75d0faf0b835300"}, {file = "shrub.py-3.0.4.tar.gz", hash = "sha256:17890e04c4c05437708247b13d70a7d9a8c80de1b159e757889787eed3919b41"}, ] [package.dependencies] git-url-parse = ">=1,<2" pydantic = ">=1.8,<2.0" PyYaml = ">=5.1,<6.0" typing-extensions = ">=4,<5" [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] [[package]] name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." optional = false python-versions = "*" files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] [[package]] name = "soupsieve" version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.7" files = [ {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, ] [[package]] name = "sphinx" version = "7.1.1" description = "Python documentation generator" optional = false python-versions = ">=3.8" files = [ {file = "sphinx-7.1.1-py3-none-any.whl", hash = "sha256:4e6c5ea477afa0fb90815210fd1312012e1d7542589ab251ac9b53b7c0751bce"}, {file = "sphinx-7.1.1.tar.gz", hash = "sha256:59b8e391f0768a96cd233e8300fe7f0a8dc2f64f83dc2a54336a9a84f428ff4e"}, ] [package.dependencies] alabaster = ">=0.7,<0.8" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} docutils = ">=0.18.1,<0.21" imagesize = ">=1.3" importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} Jinja2 = ">=3.0" packaging = ">=21.0" Pygments = ">=2.13" requests = ">=2.25.0" snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] docs = ["sphinxcontrib-websupport"] lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] [[package]] name = "sphinx-autobuild" version = "2021.3.14" description = "Rebuild Sphinx documentation on changes, with live-reload in the browser." optional = false python-versions = ">=3.6" files = [ {file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"}, {file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"}, ] [package.dependencies] colorama = "*" livereload = "*" sphinx = "*" [package.extras] test = ["pytest", "pytest-cov"] [[package]] name = "sphinx-basic-ng" version = "1.0.0b2" description = "A modern skeleton for Sphinx themes." optional = false python-versions = ">=3.7" files = [ {file = "sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b"}, {file = "sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9"}, ] [package.dependencies] sphinx = ">=4.0" [package.extras] docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"] [[package]] name = "sphinx-design" version = "0.5.0" description = "A sphinx extension for designing beautiful, view size responsive web components." optional = false python-versions = ">=3.8" files = [ {file = "sphinx_design-0.5.0-py3-none-any.whl", hash = "sha256:1af1267b4cea2eedd6724614f19dcc88fe2e15aff65d06b2f6252cee9c4f4c1e"}, {file = "sphinx_design-0.5.0.tar.gz", hash = "sha256:e8e513acea6f92d15c6de3b34e954458f245b8e761b45b63950f65373352ab00"}, ] [package.dependencies] sphinx = ">=5,<8" [package.extras] code-style = ["pre-commit (>=3,<4)"] rtd = ["myst-parser (>=1,<3)"] testing = ["myst-parser (>=1,<3)", "pytest (>=7.1,<8.0)", "pytest-cov", "pytest-regressions"] theme-furo = ["furo (>=2023.7.0,<2023.8.0)"] theme-pydata = ["pydata-sphinx-theme (>=0.13.0,<0.14.0)"] theme-rtd = ["sphinx-rtd-theme (>=1.0,<2.0)"] theme-sbt = ["sphinx-book-theme (>=1.0,<2.0)"] [[package]] name = "sphinxcontrib-applehelp" version = "1.0.4" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.8" files = [ {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." optional = false python-versions = ">=3.5" files = [ {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.8" files = [ {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" optional = false python-versions = ">=3.5" files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] [package.extras] test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." optional = false python-versions = ">=3.5" files = [ {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." optional = false python-versions = ">=3.5" files = [ {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "tornado" version = "6.3.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">= 3.8" files = [ {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, ] [[package]] name = "types-docutils" version = "0.20.0.1" description = "Typing stubs for docutils" optional = false python-versions = "*" files = [ {file = "types-docutils-0.20.0.1.tar.gz", hash = "sha256:f682b5459a1e6e28208742adb0be8573d1ecbddd442f00d202b0278c1c4418a2"}, {file = "types_docutils-0.20.0.1-py3-none-any.whl", hash = "sha256:6b17cbe57cb282158feb41d154cddaeabc16f1d6cff3c7308bd3056f42aa7cd2"}, ] [[package]] name = "typing-extensions" version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" optional = false python-versions = ">=3.7" files = [ {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, ] [[package]] name = "urllib3" version = "2.0.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.7" files = [ {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "yamlordereddictloader" version = "0.4.0" description = "YAML loader and dump for PyYAML allowing to keep keys order." optional = false python-versions = "*" files = [ {file = "yamlordereddictloader-0.4.0.tar.gz", hash = "sha256:7f30f0b99ea3f877f7cb340c570921fa9d639b7f69cba18be051e27f8de2080e"}, ] [package.dependencies] pyyaml = "*" [[package]] name = "zipp" version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" python-versions = "^3.8" content-hash = "988ecd1a64ead7772507ce3b2b42abd56d088d0752babb8458b3f7de67594e48" mongo-c-driver-1.26.0/pyproject.toml000066400000000000000000000016721456567454500173770ustar00rootroot00000000000000[tool.poetry] name = "mongo-c-driver" version = "0.0.0" description = "A Python project for mongo-c-driver codebase development" authors = [] packages = [ { include = "config_generator", from = ".evergreen/" } ] [tool.poetry.dependencies] python = "^3.8" [tool.poetry.scripts] "mc-evg-generate" = "config_generator.generate:main" [tool.poetry.group.docs] optional = true [tool.poetry.group.docs.dependencies] sphinx = "^7.1.1" furo = "^2023.5.20" sphinx-design = "^0.5.0" [tool.poetry.group.dev] optional = true [tool.poetry.group.dev.dependencies] clang-format = "16" sphinx-autobuild = "^2021.3.14" shrub-py = "3.0.4" yamlordereddictloader = "^0.4.0" types-docutils = "^0.20.0.1" # XXX: These dependencies are only to force certain versions of transitive requirements, # but are not required otherwise. [tool.poetry.group.ext.dependencies] pyyaml = "<5.4" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" mongo-c-driver-1.26.0/src/000077500000000000000000000000001456567454500152445ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/CMakeLists.txt000066400000000000000000000014501456567454500200040ustar00rootroot00000000000000# sub-directory 'libbson' was already included at the top-level # sub-directory 'libmongoc' was already included at the top-level # sub-directory 'kms-message' was already included at the top-level # Copy zconf.h.in to zconf.h, used by zlib configure_file ( "${SOURCE_DIR}/src/zlib-1.2.13/zconf.h.in" "${CMAKE_BINARY_DIR}/src/zlib-1.2.13/zconf.h" COPYONLY ) if (CMAKE_CXX_COMPILER) # Add a C++ source file that will #include the main C headers. This "library" # does nothing other than validate that the C headers are valid C++ headers. add_library (mongoc-cxx-check STATIC cpp-check.cpp) if (TARGET mongoc_static) target_link_libraries (mongoc-cxx-check PRIVATE mongoc_static) else () target_link_libraries (mongoc-cxx-check PRIVATE mongoc_shared) endif () endif () mongo-c-driver-1.26.0/src/common/000077500000000000000000000000001456567454500165345ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/common/.gitignore000066400000000000000000000000201456567454500205140ustar00rootroot00000000000000common-config.h mongo-c-driver-1.26.0/src/common/CMakeLists.txt000066400000000000000000000004421456567454500212740ustar00rootroot00000000000000 set (MONGOC_ENABLE_DEBUG_ASSERTIONS 0) if (ENABLE_DEBUG_ASSERTIONS) set (MONGOC_ENABLE_DEBUG_ASSERTIONS 1) endif () include (MongoC-Warnings) configure_file ( "${PROJECT_SOURCE_DIR}/src/common/common-config.h.in" "${PROJECT_BINARY_DIR}/src/common/common-config.h" ) mongo-c-driver-1.26.0/src/common/bson-dsl.h000066400000000000000000001760421456567454500204400ustar00rootroot00000000000000#include "common-prelude.h" #ifndef BSON_BSON_DSL_H_INCLUDED #define BSON_BSON_DSL_H_INCLUDED /** * @file bson-dsl.h * @brief Define a C-preprocessor DSL for working with BSON objects * * This file defines an embedded DSL for working with BSON objects consisely and * correctly. * * For more information about using this DSL, refer to `bson-dsl.md`. */ #include "bson/bson.h" enum { /// Toggle this value to enable/disable debug output for all bsonDSL /// operations (printed to stderr). You can also set a constant /// BSON_DSL_DEBUG within the scope of a DSL command to selectively debug /// only the commands within that scope. BSON_DSL_DEBUG = 0 }; #define _bson_thread_local \ BSON_IF_GNU_LIKE (__thread) BSON_IF_MSVC (__declspec (thread)) #define _bson_comdat \ BSON_IF_WINDOWS (__declspec (selectany)) \ BSON_IF_POSIX (__attribute__ ((weak))) #ifdef __GNUC__ // GCC has a bug handling pragma statements that disable warnings within complex // nested macro expansions. If we're GCC, just disable -Wshadow outright: BSON_IF_GNU_LIKE (_Pragma ("GCC diagnostic ignored \"-Wshadow\"")) #endif #define _bsonDSL_disableWarnings() \ if (1) { \ BSON_IF_GNU_LIKE (_Pragma ("GCC diagnostic push");) \ BSON_IF_GNU_LIKE (_Pragma ("GCC diagnostic ignored \"-Wshadow\"");) \ } else \ ((void) 0) #define _bsonDSL_restoreWarnings() \ if (1) { \ BSON_IF_GNU_LIKE (_Pragma ("GCC diagnostic pop");) \ } else \ ((void) 0) /** * @brief Parse the given BSON document. * * @param doc A bson_t object to walk. (Not a pointer) */ #define bsonParse(Document, ...) \ _bsonDSL_begin ("bsonParse(%s)", _bsonDSL_str (Document)); \ _bsonDSL_disableWarnings (); \ bsonParseError = NULL; \ BSON_MAYBE_UNUSED bool _bvHalt = false; \ BSON_MAYBE_UNUSED const bool _bvContinue = false; \ BSON_MAYBE_UNUSED const bool _bvBreak = false; \ _bsonDSL_eval (_bsonParse ((Document), __VA_ARGS__)); \ _bsonDSL_restoreWarnings (); \ _bsonDSL_end /** * @brief Visit each element of a BSON document */ #define bsonVisitEach(Document, ...) \ _bsonDSL_begin ("bsonVisitEach(%s)", _bsonDSL_str (Document)); \ _bsonDSL_disableWarnings (); \ BSON_MAYBE_UNUSED bool _bvHalt = false; \ _bsonDSL_eval (_bsonVisitEach ((Document), __VA_ARGS__)); \ _bsonDSL_restoreWarnings (); \ _bsonDSL_end #define bsonBuildContext (*_bsonBuildContextThreadLocalPtr) #define bsonVisitContext (*_bsonVisitContextThreadLocalPtr) #define bsonVisitIter (bsonVisitContext.iter) /// Begin any function-like macro by opening a new scope and writing a debug /// message. #define _bsonDSL_begin(Str, ...) \ if (true) { \ _bsonDSLDebug (Str, __VA_ARGS__); \ ++_bson_dsl_indent /// End a function-like macro scope. #define _bsonDSL_end \ --_bson_dsl_indent; \ } \ else ((void) 0) /** * @brief Expands to a call to bson_append_{Kind}, with the three first * arguments filled in by the DSL context variables. */ #define _bsonBuildAppendArgs \ bsonBuildContext.doc, bsonBuildContext.key, bsonBuildContext.key_len /** * The _bsonDocOperation_XYZ macros handle the top-level bsonBuild() * items, and any nested doc() items, with XYZ being the doc-building * subcommand. */ #define _bsonDocOperation(Command, _ignore, _count) \ if (!bsonBuildError) { \ _bsonDocOperation_##Command; \ if (bsonBuildError) { \ _bsonDSLDebug ("Stopping doc() due to bsonBuildError: [%s]", \ bsonBuildError); \ } \ } #define _bsonValueOperation(P) _bsonValueOperation_##P /// key-value pair with explicit key length #define _bsonDocOperation_kvl(String, Len, Element) \ _bsonDSL_begin ("\"%s\" => [%s]", String, _bsonDSL_strElide (30, Element)); \ const char *_bbString = (String); \ const uint64_t length = (Len); \ if (bson_in_range_unsigned (int, length)) { \ _bbCtx.key = _bbString; \ _bbCtx.key_len = (int) length; \ _bsonValueOperation (Element); \ } else { \ bsonBuildError = "Out-of-range key string length value"; \ } \ _bsonDSL_end /// Key-value pair with a C-string #define _bsonDocOperation_kv(String, Element) \ _bsonDocOperation_kvl ((String), strlen ((String)), Element) /// Execute arbitrary code #define _bsonDocOperation_do(...) \ _bsonDSL_begin ("do(%s)", _bsonDSL_strElide (30, __VA_ARGS__)); \ do { \ __VA_ARGS__; \ } while (0); \ if (bsonBuildError) { \ _bsonDSLDebug ("do() set bsonBuildError: [%s]", bsonBuildError); \ } \ _bsonDSL_end /// We must defer expansion of the nested doc() to allow "recursive" evaluation #define _bsonValueOperation_doc \ _bsonValueOperationDeferred_doc _bsonDSL_nothing () #define _bsonArrayOperation_doc(...) _bsonArrayAppendValue (doc (__VA_ARGS__)) #define _bsonValueOperationDeferred_doc(...) \ _bsonDSL_begin ("doc(%s)", _bsonDSL_strElide (30, __VA_ARGS__)); \ /* Write to this variable as the child: */ \ bson_t _bbChildDoc = BSON_INITIALIZER; \ if (!bson_append_document_begin (_bsonBuildAppendArgs, &_bbChildDoc)) { \ bsonBuildError = \ "Error while initializing child document: " _bsonDSL_str ( \ __VA_ARGS__); \ } else { \ _bsonBuildAppend (_bbChildDoc, __VA_ARGS__); \ if (!bsonBuildError) { \ if (!bson_append_document_end (bsonBuildContext.doc, &_bbChildDoc)) { \ bsonBuildError = \ "Error while finalizing document: " _bsonDSL_str (__VA_ARGS__); \ } \ } \ } \ _bsonDSL_end /// We must defer expansion of the nested array() to allow "recursive" /// evaluation #define _bsonValueOperation_array \ _bsonValueOperationDeferred_array _bsonDSL_nothing () #define _bsonArrayOperation_array(...) \ _bsonArrayAppendValue (array (__VA_ARGS__)) #define _bsonValueOperationDeferred_array(...) \ _bsonDSL_begin ("array(%s)", _bsonDSL_strElide (30, __VA_ARGS__)); \ /* Write to this variable as the child array: */ \ bson_t _bbArray = BSON_INITIALIZER; \ if (!bson_append_array_begin (_bsonBuildAppendArgs, &_bbArray)) { \ bsonBuildError = \ "Error while initializing child array: " _bsonDSL_str (__VA_ARGS__); \ } else { \ _bsonBuildArray (_bbArray, __VA_ARGS__); \ if (!bsonBuildError) { \ if (!bson_append_array_end (bsonBuildContext.doc, &_bbArray)) { \ bsonBuildError = \ "Error while finalizing child array: " _bsonDSL_str ( \ __VA_ARGS__); \ } \ } else { \ _bsonDSLDebug ("Got bsonBuildError: [%s]", bsonBuildError); \ } \ } \ _bsonDSL_end /// Append a UTF-8 string with an explicit length #define _bsonValueOperation_utf8_w_len(String, Len) \ if (!bson_append_utf8 (_bsonBuildAppendArgs, (String), (int) (Len))) { \ bsonBuildError = \ "Error while appending utf8 string: " _bsonDSL_str (String); \ } else \ ((void) 0) #define _bsonArrayOperation_utf8_w_len(X) _bsonArrayAppendValue (utf8_w_len (X)) /// Append a "cstr" as UTF-8 #define _bsonValueOperation_cstr(String) \ _bsonValueOperation_utf8_w_len ((String), strlen (String)) #define _bsonArrayOperation_cstr(X) _bsonArrayAppendValue (cstr (X)) /// Append an int32 #define _bsonValueOperation_int32(Integer) \ if (!bson_append_int32 (_bsonBuildAppendArgs, (Integer))) { \ bsonBuildError = \ "Error while appending int32(" _bsonDSL_str (Integer) ")"; \ } else \ ((void) 0) #define _bsonArrayOperation_int32(X) _bsonArrayAppendValue (int32 (X)) /// Append an int64 #define _bsonValueOperation_int64(Integer) \ if (!bson_append_int64 (_bsonBuildAppendArgs, (Integer))) { \ bsonBuildError = \ "Error while appending int64(" _bsonDSL_str (Integer) ")"; \ } else \ ((void) 0) #define _bsonArrayOperation_int64(X) _bsonArrayAppendValue (int64 (X)) /// Append the value referenced by a given iterator #define _bsonValueOperation_iterValue(Iter) \ if (!bson_append_iter (_bsonBuildAppendArgs, &(Iter))) { \ bsonBuildError = \ "Error while appending iterValue(" _bsonDSL_str (Iter) ")"; \ } else \ ((void) 0) #define _bsonArrayOperation_iterValue(X) _bsonArrayAppendValue (iterValue (X)) /// Append the BSON document referenced by the given pointer #define _bsonValueOperation_bson(Doc) \ if (!bson_append_document (_bsonBuildAppendArgs, &(Doc))) { \ bsonBuildError = \ "Error while appending subdocument: bson(" _bsonDSL_str (Doc) ")"; \ } else \ ((void) 0) #define _bsonArrayOperation_bson(X) _bsonArrayAppendValue (bson (X)) /// Append the BSON document referenced by the given pointer as an array #define _bsonValueOperation_bsonArray(Arr) \ if (!bson_append_array (_bsonBuildAppendArgs, &(Arr))) { \ bsonBuildError = "Error while appending subdocument array: " \ "bsonArray(" _bsonDSL_str (Arr) ")"; \ } else \ ((void) 0) #define _bsonArrayOperation_bsonArray(X) _bsonArrayAppendValue (bsonArray (X)) #define _bsonValueOperation_bool(b) \ if (!bson_append_bool (_bsonBuildAppendArgs, (b))) { \ bsonBuildError = "Error while appending bool(" _bsonDSL_str (b) ")"; \ } else \ ((void) 0) #define _bsonArrayOperation_bool(X) _bsonArrayAppendValue (bool (X)) #define _bsonValueOperation__Bool(b) _bsonValueOperation_bool (b) #define _bsonArrayOperation__Bool(X) _bsonArrayAppendValue (_Bool (X)) #define _bsonValueOperation_null \ if (!bson_append_null (_bsonBuildAppendArgs)) { \ bsonBuildError = "Error while appending a null"; \ } else \ ((void) 0) #define _bsonArrayOperation_null _bsonValueOperation (null) #define _bsonArrayOperation_value(X) _bsonArrayAppendValue (value (X)) #define _bsonValueOperation_value(Value) \ _bsonDSL_begin ("value(%s)", _bsonDSL_str (Value)); \ if (!bson_append_value (_bsonBuildAppendArgs, &(Value))) { \ bsonBuildError = \ "Error while appending value(" _bsonDSL_str (Value) ")"; \ } \ _bsonDSL_end /// Insert the given BSON document into the parent document in-place #define _bsonDocOperation_insert(OtherBSON, Pred) \ _bsonDSL_begin ("Insert other document: [%s]", _bsonDSL_str (OtherBSON)); \ const bool _bvHalt = false; /* Required for _bsonVisitEach() */ \ _bsonVisitEach ( \ OtherBSON, \ if (Pred, then (do (_bsonDocOperation_iterElement (bsonVisitIter))))); \ _bsonDSL_end #define _bsonDocOperation_insertFromIter(Iter, Pred) \ _bsonDSL_begin ("Insert document from iterator: [%s]", \ _bsonDSL_str (Iter)); \ bson_t _bbDocFromIter = _bson_dsl_iter_as_doc (&(Iter)); \ if (_bbDocFromIter.len == 0) { \ _bsonDSLDebug ( \ "NOTE: Skipping insert of non-document value from iterator"); \ } else { \ _bsonDocOperation_insert (_bbDocFromIter, Pred); \ } \ _bsonDSL_end #define _bsonDocOperation_iterElement(Iter) \ _bsonDSL_begin ("Insert element from bson_iter_t [%s]", \ _bsonDSL_str (Iter)); \ bson_iter_t _bbIter = (Iter); \ _bsonDocOperation_kvl (bson_iter_key (&_bbIter), \ bson_iter_key_len (&_bbIter), \ iterValue (_bbIter)); \ _bsonDSL_end /// Insert the given BSON document into the parent array. Keys of the given /// document are discarded and it is treated as an array of values. #define _bsonArrayOperation_insert(OtherArr, Pred) \ _bsonDSL_begin ("Insert other array: [%s]", _bsonDSL_str (OtherArr)); \ _bsonVisitEach ( \ OtherArr, \ if (Pred, then (do (_bsonArrayOperation_iterValue (bsonVisitIter))))); \ _bsonDSL_end #define _bsonArrayAppendValue(ValueOperation) \ _bsonDSL_begin ("[%d] => [%s]", \ (int) bsonBuildContext.index, \ _bsonDSL_strElide (30, ValueOperation)); \ /* Set the doc key to the array index as a string: */ \ _bsonBuild_setKeyToArrayIndex (bsonBuildContext.index); \ /* Append a value: */ \ _bsonValueOperation_##ValueOperation; \ /* Increment the array index: */ \ ++_bbCtx.index; \ _bsonDSL_end #define _bsonDocOperationIfThen_then _bsonBuildAppendWithCurrentContext #define _bsonDocOperationIfElse_else _bsonBuildAppendWithCurrentContext #define _bsonDocOperationIfThenElse(Condition, Then, Else) \ if ((Condition)) { \ _bsonDSLDebug ("Taking TRUE branch: [%s]", _bsonDSL_str (Then)); \ _bsonDocOperationIfThen_##Then; \ } else { \ _bsonDSLDebug ("Taking FALSE branch: [%s]", _bsonDSL_str (Else)); \ _bsonDocOperationIfElse_##Else; \ } #define _bsonDocOperationIfThen(Condition, Then) \ if ((Condition)) { \ _bsonDSLDebug ("Taking TRUE branch: [%s]", _bsonDSL_str (Then)); \ _bsonDocOperationIfThen_##Then; \ } #define _bsonDocOperation_if(Condition, ...) \ _bsonDSL_begin ("Conditional append on [%s]", _bsonDSL_str (Condition)); \ /* Pick a sub-macro depending on if there are one or two args */ \ _bsonDSL_ifElse (_bsonDSL_hasComma (__VA_ARGS__), \ _bsonDocOperationIfThenElse, \ _bsonDocOperationIfThen) (Condition, __VA_ARGS__); \ _bsonDSL_end #define _bsonArrayOperationIfThen_then _bsonBuildArrayWithCurrentContext #define _bsonArrayOperationIfElse_else _bsonBuildArrayWithCurrentContext #define _bsonArrayOperationIfThenElse(Condition, Then, Else) \ if ((Condition)) { \ _bsonDSLDebug ("Taking TRUE branch: [%s]", _bsonDSL_str (Then)); \ _bsonArrayOperationIfThen_##Then; \ } else { \ _bsonDSLDebug ("Taking FALSE branch: [%s]", _bsonDSL_str (Else)); \ _bsonArrayOperationIfElse_##Else; \ } #define _bsonArrayOperationIfThen(Condition, Then) \ if ((Condition)) { \ _bsonDSLDebug ("Taking TRUE branch: [%s]", _bsonDSL_str (Then)); \ _bsonArrayOperationIfThen_##Then; \ } #define _bsonArrayOperation_if(Condition, ...) \ _bsonDSL_begin ("Conditional value on [%s]", _bsonDSL_str (Condition)); \ /* Pick a sub-macro depending on if there are one or two args */ \ _bsonDSL_ifElse (_bsonDSL_hasComma (__VA_ARGS__), \ _bsonArrayOperationIfThenElse, \ _bsonArrayOperationIfThen) (Condition, __VA_ARGS__); \ _bsonDSL_end #define _bsonValueOperationIf_then(X) _bsonValueOperation_##X #define _bsonValueOperationIf_else(X) _bsonValueOperation_##X #define _bsonValueOperation_if(Condition, Then, Else) \ if ((Condition)) { \ _bsonDSLDebug ("Taking TRUE branch: [%s]", _bsonDSL_str (Then)); \ _bsonValueOperationIf_##Then; \ } else { \ _bsonDSLDebug ("Taking FALSE branch: [%s]", _bsonDSL_str (Else)); \ _bsonValueOperationIf_##Else; \ } #define _bsonBuild_setKeyToArrayIndex(Idx) \ _bbCtx.key_len = bson_snprintf (_bbCtx.index_key_str, \ sizeof _bbCtx.index_key_str, \ "%d", \ (int) _bbCtx.index); \ _bbCtx.key = _bbCtx.index_key_str /// Handle an element of array() #define _bsonArrayOperation(Element, _nil, _count) \ if (!bsonBuildError) { \ _bsonArrayOperation_##Element; \ } #define _bsonBuildAppendWithCurrentContext(...) \ _bsonDSL_mapMacro (_bsonDocOperation, ~, __VA_ARGS__) #define _bsonBuildArrayWithCurrentContext(...) \ _bsonDSL_mapMacro (_bsonArrayOperation, ~, __VA_ARGS__) #define _bsonDSL_Type_double BSON_TYPE_DOUBLE #define _bsonDSL_Type_utf8 BSON_TYPE_UTF8 #define _bsonDSL_Type_doc BSON_TYPE_DOCUMENT #define _bsonDSL_Type_array BSON_TYPE_ARRAY #define _bsonDSL_Type_binary BSON_TYPE_BINARY #define _bsonDSL_Type_undefined BSON_TYPE_UNDEFINED #define _bsonDSL_Type_oid BSON_TYPE_OID #define _bsonDSL_Type_bool BSON_TYPE_BOOL // ("bool" may be spelled _Bool due to macro expansion:) #define _bsonDSL_Type__Bool BSON_TYPE_BOOL #define _bsonDSL_Type_date_time BSON_TYPE_DATE_TIME #define _bsonDSL_Type_null BSON_TYPE_NULL #define _bsonDSL_Type_regex BSON_TYPE_REGEX #define _bsonDSL_Type_dbpointer BSON_TYPE_DBPOINTER #define _bsonDSL_Type_code BSON_TYPE_CODE #define _bsonDSL_Type_codewscope BSON_TYPE_CODEWSCOPE #define _bsonDSL_Type_int32 BSON_TYPE_INT32 #define _bsonDSL_Type_timestamp BSON_TYPE_TIMESTAMP #define _bsonDSL_Type_int64 BSON_TYPE_INT64 #define _bsonDSL_Type_decimal128 BSON_TYPE_DECIMAL128 #define _bsonDSL_Type_string __NOTE__No_type_named__string__did_you_mean__utf8 #define _bsonVisitOperation_halt _bvHalt = true #define _bsonVisitOperation_if(Predicate, ...) \ _bsonDSL_begin ("if(%s)", _bsonDSL_str (Predicate)); \ _bsonDSL_ifElse (_bsonDSL_hasComma (__VA_ARGS__), \ _bsonVisit_ifThenElse, \ _bsonVisit_ifThen) (Predicate, __VA_ARGS__); \ _bsonDSL_end #define _bsonVisit_ifThenElse(Predicate, Then, Else) \ if (bsonPredicate (Predicate)) { \ _bsonDSLDebug ("then:"); \ _bsonVisit_ifThen_##Then; \ } else { \ _bsonDSLDebug ("else:"); \ _bsonVisit_ifElse_##Else; \ } #define _bsonVisit_ifThen(Predicate, Then) \ if (bsonPredicate (Predicate)) { \ _bsonDSLDebug ("then:"); \ _bsonVisit_ifThen_##Then; \ } else { \ _bsonDSLDebug ("[else nothing]"); \ } #define _bsonVisit_ifThen_then _bsonVisit_applyOps #define _bsonVisit_ifElse_else _bsonVisit_applyOps #define _bsonVisitOperation_storeBool(Dest) \ _bsonDSL_begin ("storeBool(%s)", _bsonDSL_str (Dest)); \ (Dest) = bson_iter_as_bool (&bsonVisitIter); \ _bsonDSL_end #define _bsonVisitOperation_storeStrRef(Dest) \ _bsonDSL_begin ("storeStrRef(%s)", _bsonDSL_str (Dest)); \ (Dest) = bson_iter_utf8 (&bsonVisitIter, NULL); \ _bsonDSL_end #define _bsonVisitOperation_storeStrDup(Dest) \ _bsonDSL_begin ("storeStrDup(%s)", _bsonDSL_str (Dest)); \ (Dest) = bson_iter_dup_utf8 (&bsonVisitIter, NULL); \ _bsonDSL_end #define _bsonVisitOperation_storeDocDup(Dest) \ _bsonDSL_begin ("storeDocDup(%s)", _bsonDSL_str (Dest)); \ bson_t _bvDoc = BSON_INITIALIZER; \ _bson_dsl_iter_as_doc (&_bvDoc, &bsonVisitIter); \ if (_bvDoc.len) { \ bson_copy_to (&_bvDoc, &(Dest)); \ } \ _bsonDSL_end #define _bsonVisitOperation_storeDocRef(Dest) \ _bsonDSL_begin ("storeDocRef(%s)", _bsonDSL_str (Dest)); \ _bson_dsl_iter_as_doc (&(Dest), &bsonVisitIter); \ _bsonDSL_end #define _bsonVisitOperation_storeDocDupPtr(Dest) \ _bsonDSL_begin ("storeDocDupPtr(%s)", _bsonDSL_str (Dest)); \ bson_t _bvDoc = BSON_INITIALIZER; \ _bson_dsl_iter_as_doc (&_bvDoc, &bsonVisitIter); \ if (_bvDoc.len) { \ (Dest) = bson_copy (&_bvDoc); \ } \ _bsonDSL_end #define _bsonVisitOperation_storeInt32(Dest) \ _bsonDSL_begin ("storeInt32(%s)", _bsonDSL_str (Dest)); \ (Dest) = bson_iter_int32 (&bsonVisitIter); \ _bsonDSL_end #define _bsonVisitOperation_do(...) \ _bsonDSL_begin ("do: %s", _bsonDSL_strElide (30, __VA_ARGS__)); \ do { \ __VA_ARGS__; \ } while (0); \ _bsonDSL_end #define _bsonVisitOperation_appendTo(BSON) \ _bsonDSL_begin ("appendTo(%s)", _bsonDSL_str (BSON)); \ if (!bson_append_iter (&(BSON), \ bson_iter_key (&bsonVisitIter), \ (int) bson_iter_key_len (&bsonVisitIter), \ &bsonVisitIter)) { \ bsonParseError = "Error in appendTo(" _bsonDSL_str (BSON) ")"; \ } \ _bsonDSL_end #define _bsonVisitCase_when(Pred, ...) \ _bsonDSL_begin ("when: [%s]", _bsonDSL_str (Pred)); \ _bvCaseMatched = _bsonPredicate (Pred); \ if (_bvCaseMatched) { \ _bsonVisit_applyOps (__VA_ARGS__); \ } \ _bsonDSL_end #define _bsonVisitCase_else(...) \ _bsonDSL_begin ("else:%s", ""); \ _bvCaseMatched = true; \ _bsonVisit_applyOps (__VA_ARGS__); \ _bsonDSL_end #define _bsonVisitCase(Pair, _nil, _count) \ if (!_bvCaseMatched) { \ _bsonVisitCase_##Pair; \ } else \ ((void) 0); #define _bsonVisitOperation_case(...) \ _bsonDSL_begin ("case:%s", ""); \ BSON_MAYBE_UNUSED bool _bvCaseMatched = false; \ _bsonDSL_mapMacro (_bsonVisitCase, ~, __VA_ARGS__); \ _bsonDSL_end #define _bsonVisitOperation_append \ _bsonVisitOneApplyDeferred_append _bsonDSL_nothing () #define _bsonVisitOneApplyDeferred_append(Doc, ...) \ _bsonDSL_begin ("append to [%s] : %s", \ _bsonDSL_str (Doc), \ _bsonDSL_strElide (30, __VA_ARGS__)); \ _bsonBuildAppend (Doc, __VA_ARGS__); \ if (bsonBuildError) { \ bsonParseError = bsonBuildError; \ } \ _bsonDSL_end #define _bsonVisitEach(Doc, ...) \ _bsonDSL_begin ("visitEach(%s)", _bsonDSL_str (Doc)); \ do { \ /* Reset the context */ \ struct _bsonVisitContext_t _bvCtx = { \ .doc = &(Doc), \ .parent = _bsonVisitContextThreadLocalPtr, \ .index = 0, \ }; \ _bsonVisitContextThreadLocalPtr = &_bvCtx; \ bsonParseError = NULL; \ /* Iterate over each element of the document */ \ if (!bson_iter_init (&_bvCtx.iter, &(Doc))) { \ bsonParseError = "Invalid BSON data [a]"; \ } \ BSON_MAYBE_UNUSED bool _bvBreak = false; \ BSON_MAYBE_UNUSED bool _bvContinue = false; \ while (bson_iter_next (&_bvCtx.iter) && !_bvHalt && !bsonParseError && \ !_bvBreak) { \ _bvContinue = false; \ _bsonVisit_applyOps (__VA_ARGS__); \ ++_bvCtx.index; \ } \ if (bsonVisitIter.err_off) { \ bsonParseError = "Invalid BSON data [b]"; \ } \ /* Restore the dsl context */ \ _bsonVisitContextThreadLocalPtr = _bvCtx.parent; \ } while (0); \ _bsonDSL_end #define _bsonVisitOperation_visitEach \ _bsonVisitOperation_visitEachDeferred _bsonDSL_nothing () #define _bsonVisitOperation_visitEachDeferred(...) \ _bsonDSL_begin ("visitEach:%s", ""); \ do { \ const uint8_t *data; \ uint32_t len; \ bson_type_t typ = bson_iter_type_unsafe (&bsonVisitIter); \ if (typ == BSON_TYPE_ARRAY) \ bson_iter_array (&bsonVisitIter, &len, &data); \ else if (typ == BSON_TYPE_DOCUMENT) \ bson_iter_document (&bsonVisitIter, &len, &data); \ else { \ _bsonDSLDebug ("(Skipping visitEach() of non-array/document value)"); \ break; \ } \ bson_t inner; \ BSON_ASSERT (bson_init_static (&inner, data, len)); \ _bsonVisitEach (inner, __VA_ARGS__); \ } while (0); \ _bsonDSL_end #define _bsonVisitOperation_nop _bsonDSLDebug ("[nop]") #define _bsonVisitOperation_parse(...) \ do { \ const uint8_t *data; \ uint32_t len; \ bson_type_t typ = bson_iter_type (&bsonVisitIter); \ if (typ == BSON_TYPE_ARRAY) \ bson_iter_array (&bsonVisitIter, &len, &data); \ else if (typ == BSON_TYPE_DOCUMENT) \ bson_iter_document (&bsonVisitIter, &len, &data); \ else { \ _bsonDSLDebug ("Ignoring parse() for non-document/array value"); \ break; \ } \ bson_t inner; \ BSON_ASSERT (bson_init_static (&inner, data, len)); \ _bsonParse (inner, __VA_ARGS__); \ } while (0); #define _bsonVisitOperation_continue _bvContinue = true #define _bsonVisitOperation_break _bvBreak = _bvContinue = true #define _bsonVisitOperation_require(Predicate) \ _bsonDSL_begin ("require(%s)", _bsonDSL_str (Predicate)); \ if (!bsonPredicate (Predicate)) { \ bsonParseError = \ "Element requirement failed: " _bsonDSL_str (Predicate); \ } \ _bsonDSL_end #define _bsonVisitOperation_error(S) bsonParseError = (S) #define _bsonVisitOperation_errorf(S, ...) \ (bsonParseError = _bson_dsl_errorf (&(S), __VA_ARGS__)) #define _bsonVisitOperation_dupPath(S) \ _bsonDSL_begin ("dupPath(%s)", _bsonDSL_str (S)); \ _bson_dsl_dupPath (&(S)); \ _bsonDSL_end #define _bsonVisit_applyOp(P, _const, _count) \ do { \ if (!_bvContinue && !_bvHalt && !bsonParseError) { \ _bsonVisitOperation_##P; \ } \ } while (0); #define _bsonParse(Doc, ...) \ do { \ BSON_MAYBE_UNUSED const bson_t *_bpDoc = &(Doc); \ /* Keep track of which elements have been visited based on their index*/ \ uint64_t _bpVisitBits_static[4] = {0}; \ BSON_MAYBE_UNUSED uint64_t *_bpVisitBits = _bpVisitBits_static; \ BSON_MAYBE_UNUSED size_t _bpNumVisitBitInts = \ sizeof _bpVisitBits_static / sizeof (uint64_t); \ BSON_MAYBE_UNUSED bool _bpFoundElement = false; \ _bsonParse_applyOps (__VA_ARGS__); \ /* We may have allocated for visit bits */ \ if (_bpVisitBits != _bpVisitBits_static) { \ bson_free (_bpVisitBits); \ } \ } while (0) #define _bsonParse_applyOps(...) \ _bsonDSL_mapMacro (_bsonParse_applyOp, ~, __VA_ARGS__) /// Parse one entry referrenced by the context iterator #define _bsonParse_applyOp(P, _nil, Counter) \ do { \ if (!_bvHalt && !bsonParseError) { \ _bsonParseOperation_##P; \ } \ } while (0); #define _bsonParseMarkVisited(Index) \ if (1) { \ const size_t nth_int = Index / 64u; \ const size_t nth_bit = Index % 64u; \ while (nth_int >= _bpNumVisitBitInts) { \ /* Say that five times, fast: */ \ size_t new_num_visit_bit_ints = _bpNumVisitBitInts * 2u; \ uint64_t *new_visit_bit_ints = \ bson_malloc0 (sizeof (uint64_t) * new_num_visit_bit_ints); \ memcpy (new_visit_bit_ints, \ _bpVisitBits, \ sizeof (uint64_t) * _bpNumVisitBitInts); \ if (_bpVisitBits != _bpVisitBits_static) { \ bson_free (_bpVisitBits); \ } \ _bpVisitBits = new_visit_bit_ints; \ _bpNumVisitBitInts = new_num_visit_bit_ints; \ } \ \ _bpVisitBits[nth_int] |= (UINT64_C (1) << nth_bit); \ } else \ ((void) 0) #define _bsonParseDidVisitNth(Index) \ _bsonParseDidVisitNth_1 (Index / 64u, Index % 64u) #define _bsonParseDidVisitNth_1(NthInt, NthBit) \ (NthInt < _bpNumVisitBitInts && \ (_bpVisitBits[NthInt] & (UINT64_C (1) << NthBit))) #define _bsonParseOperation_find(Predicate, ...) \ _bsonDSL_begin ("find(%s)", _bsonDSL_str (Predicate)); \ _bpFoundElement = false; \ _bsonVisitEach ( \ *_bpDoc, \ if (Predicate, \ then (do (_bsonParseMarkVisited (bsonVisitContext.index); \ _bpFoundElement = true), \ __VA_ARGS__, \ break))); \ if (!_bpFoundElement && !bsonParseError) { \ _bsonDSLDebug ("[not found]"); \ } \ _bsonDSL_end #define _bsonParseOperation_require(Predicate, ...) \ _bsonDSL_begin ("require(%s)", _bsonDSL_str (Predicate)); \ _bpFoundElement = false; \ _bsonVisitEach ( \ *_bpDoc, \ if (Predicate, \ then (do (_bsonParseMarkVisited (bsonVisitContext.index); \ _bpFoundElement = true), \ __VA_ARGS__, \ break))); \ if (!_bpFoundElement && !bsonParseError) { \ bsonParseError = \ "Failed to find a required element: " _bsonDSL_str (Predicate); \ } \ _bsonDSL_end #define _bsonParseOperation_visitOthers(...) \ _bsonDSL_begin ("visitOthers(%s)", _bsonDSL_strElide (30, __VA_ARGS__)); \ _bsonVisitEach ( \ *_bpDoc, \ if (not(eval (_bsonParseDidVisitNth (bsonVisitContext.index))), \ then (__VA_ARGS__))); \ _bsonDSL_end #define bsonPredicate(P) _bsonPredicate _bsonDSL_nothing () (P) #define _bsonPredicate(P) _bsonPredicate_Condition_##P #define _bsonPredicate_Condition_ \ __NOTE__Missing_name_for_a_predicate_expression #define _bsonPredicate_Condition_allOf(...) \ (1 _bsonDSL_mapMacro (_bsonPredicateAnd, ~, __VA_ARGS__)) #define _bsonPredicate_Condition_anyOf(...) \ (0 _bsonDSL_mapMacro (_bsonPredicateOr, ~, __VA_ARGS__)) #define _bsonPredicate_Condition_not(...) \ (!(0 _bsonDSL_mapMacro (_bsonPredicateOr, ~, __VA_ARGS__))) #define _bsonPredicateAnd(Pred, _ignore, _ignore1) \ &&_bsonPredicate _bsonDSL_nothing () (Pred) #define _bsonPredicateOr(Pred, _ignore, _ignore2) \ || _bsonPredicate _bsonDSL_nothing () (Pred) #define _bsonPredicate_Condition_eval(X) (X) #define _bsonPredicate_Condition_key(...) \ (_bson_dsl_key_is_anyof (bson_iter_key (&bsonVisitIter), \ bson_iter_key_len (&bsonVisitIter), \ true /* case senstive */, \ __VA_ARGS__, \ NULL)) #define _bsonPredicate_Condition_iKey(...) \ (_bson_dsl_key_is_anyof (bson_iter_key (&bsonVisitIter), \ bson_iter_key_len (&bsonVisitIter), \ false /* case insenstive */, \ __VA_ARGS__, \ NULL)) #define _bsonPredicate_Condition_type(Type) \ (bson_iter_type (&bsonVisitIter) == _bsonDSL_Type_##Type) #define _bsonPredicate_Condition_keyWithType(Key, Type) \ (_bsonPredicate_Condition_allOf _bsonDSL_nothing () (key (Key), type (Type))) #define _bsonPredicate_Condition_iKeyWithType(Key, Type) \ (_bsonPredicate_Condition_allOf _bsonDSL_nothing () (iKey (Key), \ type (Type))) #define _bsonPredicate_Condition_lastElement \ (_bson_dsl_iter_is_last_element (&bsonVisitIter)) #define _bsonPredicate_Condition_isNumeric \ BSON_ITER_HOLDS_NUMBER (&bsonVisitIter) #define _bsonPredicate_Condition_1 1 #define _bsonPredicate_Condition_0 0 #define _bsonPredicate_Condition_true true #define _bsonPredicate_Condition_false false #define _bsonPredicate_Condition_isTrue (bson_iter_as_bool (&bsonVisitIter)) #define _bsonPredicate_Condition_isFalse (!bson_iter_as_bool (&bsonVisitIter)) #define _bsonPredicate_Condition_empty \ (_bson_dsl_is_empty_bson (&bsonVisitIter)) #define _bsonPredicate_Condition_strEqual(S) (_bson_dsl_test_strequal (S, true)) #define _bsonPredicate_Condition_iStrEqual(S) \ (_bson_dsl_test_strequal (S, false)) #define _bsonPredicate_Condition_eq(Type, Value) \ (_bsonPredicate_Condition_type (Type) && bsonAs (Type) == Value) #define _bsonParseOperation_else _bsonParse_deferredElse _bsonDSL_nothing () #define _bsonParse_deferredElse(...) \ if (!_bpFoundElement) { \ _bsonDSL_begin ("else:%s", ""); \ _bsonParse_applyOps (__VA_ARGS__); \ _bsonDSL_end; \ } else \ ((void) 0) #define _bsonParseOperation_do(...) \ _bsonDSL_begin ("do: %s", _bsonDSL_strElide (30, __VA_ARGS__)); \ do { \ __VA_ARGS__; \ } while (0); \ _bsonDSL_end #define _bsonParseOperation_halt _bvHalt = true #define _bsonParseOperation_error(S) bsonParseError = (S) #define _bsonParseOperation_errorf(S, ...) \ (bsonParseError = _bson_dsl_errorf (&(S), __VA_ARGS__)) /// Perform conditional parsing #define _bsonParseOperation_if(Condition, ...) \ _bsonDSL_begin ("if(%s)", _bsonDSL_str (Condition)); \ /* Pick a sub-macro depending on if there are one or two args */ \ _bsonDSL_ifElse (_bsonDSL_hasComma (__VA_ARGS__), \ _bsonParse_ifThenElse, \ _bsonParse_ifThen) (Condition, __VA_ARGS__); \ _bsonDSL_end #define _bsonParse_ifThen_then _bsonParse_applyOps #define _bsonParse_ifElse_else _bsonParse_applyOps #define _bsonParse_ifThenElse(Condition, Then, Else) \ if ((Condition)) { \ _bsonDSLDebug ("then:"); \ _bsonParse_ifThen_##Then; \ } else { \ _bsonDSLDebug ("else:"); \ _bsonParse_ifElse_##Else; \ } #define _bsonParse_ifThen(Condition, Then) \ if ((Condition)) { \ _bsonDSLDebug ("%s", _bsonDSL_str (Then)); \ _bsonParse_ifThen_##Then; \ } else { \ _bsonDSLDebug ("[else nothing]"); \ } #define _bsonParseOperation_append \ _bsonParseOperationDeferred_append _bsonDSL_nothing () #define _bsonParseOperationDeferred_append(Doc, ...) \ _bsonDSL_begin ("append to [%s] : %s", \ _bsonDSL_str (Doc), \ _bsonDSL_strElide (30, __VA_ARGS__)); \ _bsonBuildAppend (Doc, __VA_ARGS__); \ if (bsonBuildError) { \ bsonParseError = bsonBuildError; \ } \ _bsonDSL_end #define _bsonVisit_applyOps _bsonVisit_applyOpsDeferred _bsonDSL_nothing () #define _bsonVisit_applyOpsDeferred(...) \ do { \ _bsonDSL_mapMacro (_bsonVisit_applyOp, ~, __VA_ARGS__); \ } while (0); #define bsonBuildArray(BSON, ...) \ _bsonDSL_begin ("bsonBuildArray(%s, %s)", \ _bsonDSL_str (BSON), \ _bsonDSL_strElide (30, __VA_ARGS__)); \ _bsonDSL_eval (_bsonBuildArray (BSON, __VA_ARGS__)); \ _bsonDSL_end #define _bsonBuildArray(BSON, ...) \ do { \ _bsonDSL_disableWarnings (); \ struct _bsonBuildContext_t _bbCtx = { \ .doc = &(BSON), \ .parent = _bsonBuildContextThreadLocalPtr, \ .index = 0, \ }; \ _bsonBuildContextThreadLocalPtr = &_bbCtx; \ _bsonBuildArrayWithCurrentContext (__VA_ARGS__); \ _bsonBuildContextThreadLocalPtr = _bbCtx.parent; \ _bsonDSL_restoreWarnings (); \ } while (0) /** * @brief Build a BSON document by appending to an existing bson_t document * * @param Pointer The document upon which to append * @param ... The Document elements to append to the document */ #define bsonBuildAppend(BSON, ...) \ _bsonDSL_eval (_bsonBuildAppend (BSON, __VA_ARGS__)) #define _bsonBuildAppend(BSON, ...) \ _bsonDSL_begin ("Appending to document '%s'", _bsonDSL_str (BSON)); \ _bsonDSL_disableWarnings (); \ /* Save the dsl context */ \ struct _bsonBuildContext_t _bbCtx = { \ .doc = &(BSON), \ .parent = _bsonBuildContextThreadLocalPtr, \ }; \ /* Reset the context */ \ _bsonBuildContextThreadLocalPtr = &_bbCtx; \ bsonBuildError = NULL; \ _bsonBuildAppendWithCurrentContext (__VA_ARGS__); \ /* Restore the dsl context */ \ _bsonBuildContextThreadLocalPtr = _bbCtx.parent; \ _bsonDSL_restoreWarnings (); \ _bsonDSL_end /** * @brief Build a new BSON document and assign the value into the given * pointer. */ #define bsonBuild(BSON, ...) \ _bsonDSL_begin ("Build a new document for '%s'", _bsonDSL_str (BSON)); \ bson_t *_bbDest = &(BSON); \ bson_init (_bbDest); \ bsonBuildAppend (*_bbDest, __VA_ARGS__); \ _bsonDSL_end /** * @brief Declare a variable and build it with the BSON DSL @see bsonBuild */ #define bsonBuildDecl(Variable, ...) \ bson_t Variable = BSON_INITIALIZER; \ bsonBuild (Variable, __VA_ARGS__) struct _bsonBuildContext_t { /// The document that is being built bson_t *doc; /// The key that is pending an append const char *key; /// The length of the string given in 'key' int key_len; /// The index of the array being built (if applicable) size_t index; /// A buffer for formatting key strings char index_key_str[16]; /// The parent context (if building a sub-document) struct _bsonBuildContext_t *parent; }; /// A pointer to the current thread's bsonBuild context _bson_thread_local _bson_comdat struct _bsonBuildContext_t *_bsonBuildContextThreadLocalPtr = NULL; struct _bsonVisitContext_t { const bson_t *doc; bson_iter_t iter; const struct _bsonVisitContext_t *parent; size_t index; }; /// A pointer to the current thread's bsonVisit/bsonParse context _bson_thread_local _bson_comdat struct _bsonVisitContext_t const *_bsonVisitContextThreadLocalPtr = NULL; /** * @brief The most recent error from a bsonBuild() DSL command. * * If NULL, no error occurred. Users can assign a value to this string to * indicate failure. */ _bson_thread_local _bson_comdat const char *bsonBuildError = NULL; /** * @brief The most recent error from a buildVisit() or bsonParse() DSL command. * * If NULL, no error occurred. Users can assign a value to this string to * indicate an error. * * If this string becomes non-NULL, the current bsonVisit()/bsonParse() will * halt and return. * * Upon entering a new bsonVisit()/bsonParse(), this will be reset to NULL. */ _bson_thread_local _bson_comdat const char *bsonParseError = NULL; #define _bsonDSLDebug(...) \ _bson_dsl_debug (BSON_DSL_DEBUG, __FILE__, __LINE__, BSON_FUNC, __VA_ARGS__) static BSON_INLINE bool _bson_dsl_test_strequal (const char *string, bool case_sensitive) { bson_iter_t it = bsonVisitIter; if (bson_iter_type (&it) == BSON_TYPE_UTF8) { uint32_t len; const char *s = bson_iter_utf8 (&it, &len); if (len != (uint32_t) strlen (string)) { return false; } if (case_sensitive) { return memcmp (string, s, len) == 0; } else { return bson_strcasecmp (string, s) == 0; } } return false; } static BSON_INLINE bool _bson_dsl_key_is_anyof (const char *key, const size_t keylen, int case_sensitive, ...) { va_list va; va_start (va, case_sensitive); const char *str; while ((str = va_arg (va, const char *))) { size_t str_len = strlen (str); if (str_len != keylen) { continue; } if (case_sensitive) { if (memcmp (str, key, str_len) == 0) { va_end (va); return true; } } else { if (bson_strcasecmp (str, key) == 0) { va_end (va); return true; } } } va_end (va); return false; } static BSON_INLINE void _bson_dsl_iter_as_doc (bson_t *into, const bson_iter_t *it) { uint32_t len = 0; const uint8_t *dataptr = NULL; if (BSON_ITER_HOLDS_ARRAY (it)) { bson_iter_array (it, &len, &dataptr); } else if (BSON_ITER_HOLDS_DOCUMENT (it)) { bson_iter_document (it, &len, &dataptr); } if (dataptr) { BSON_ASSERT (bson_init_static (into, dataptr, len)); } } static BSON_INLINE bool _bson_dsl_is_empty_bson (const bson_iter_t *it) { bson_t d = BSON_INITIALIZER; _bson_dsl_iter_as_doc (&d, it); return d.len == 5; // Empty documents/arrays have byte-size of five } static BSON_INLINE bool _bson_dsl_iter_is_last_element (const bson_iter_t *it) { bson_iter_t dup = *it; return !bson_iter_next (&dup) && dup.err_off == 0; } _bson_thread_local _bson_comdat int _bson_dsl_indent = 0; static BSON_INLINE void BSON_GNUC_PRINTF (5, 6) _bson_dsl_debug (bool do_debug, const char *file, int line, const char *func, const char *string, ...) { if (do_debug) { fprintf (stderr, "%s:%d: [%s] bson_dsl: ", file, line, func); for (int i = 0; i < _bson_dsl_indent; ++i) { fputs (" ", stderr); } va_list va; va_start (va, string); vfprintf (stderr, string, va); va_end (va); fputc ('\n', stderr); fflush (stderr); } } static BSON_INLINE char *BSON_GNUC_PRINTF (2, 3) _bson_dsl_errorf (char **const into, const char *const fmt, ...) { if (*into) { bson_free (*into); *into = NULL; } va_list args; va_start (args, fmt); *into = bson_strdupv_printf (fmt, args); va_end (args); return *into; } static BSON_INLINE void _bson_dsl_dupPath (char **into) { if (*into) { bson_free (*into); *into = NULL; } char *acc = bson_strdup (""); for (const struct _bsonVisitContext_t *ctx = &bsonVisitContext; ctx; ctx = ctx->parent) { char *prev = acc; if (ctx->parent && BSON_ITER_HOLDS_ARRAY (&ctx->parent->iter)) { // We're an array element acc = bson_strdup_printf ("[%d]%s", (int) ctx->index, prev); } else { // We're a document element acc = bson_strdup_printf (".%s%s", bson_iter_key (&ctx->iter), prev); } bson_free (prev); } *into = bson_strdup_printf ("$%s", acc); bson_free (acc); } static BSON_INLINE const char * _bsonVisitIterAs_cstr (void) { return bson_iter_utf8 (&bsonVisitIter, NULL); } static BSON_INLINE int32_t _bsonVisitIterAs_int32 (void) { return bson_iter_int32 (&bsonVisitIter); } static BSON_INLINE bool _bsonVisitIterAs_bool (void) { return bson_iter_as_bool (&bsonVisitIter); } static BSON_INLINE bool _bsonVisitIterAs__Bool (void) { return _bsonVisitIterAs_bool (); } #define bsonAs(Type) _bsonDSL_paste (_bsonVisitIterAs_, Type) () /// Convert the given argument into a string without inhibitting macro expansion #define _bsonDSL_str(...) _bsonDSL_str_1 (__VA_ARGS__) // Empty quotes "" are to ensure a string appears. Old MSVC has a bug // where empty #__VA_ARGS__ just vanishes. #define _bsonDSL_str_1(...) "" #__VA_ARGS__ #define _bsonDSL_strElide(MaxLen, ...) \ (strlen (_bsonDSL_str (__VA_ARGS__)) > (MaxLen) \ ? "[...]" \ : _bsonDSL_str (__VA_ARGS__)) /// Paste two tokens: #define _bsonDSL_paste(a, ...) _bsonDSL_paste_impl (a, __VA_ARGS__) #define _bsonDSL_paste_impl(a, ...) a##__VA_ARGS__ /// Paste three tokens: #define _bsonDSL_paste3(a, b, c) _bsonDSL_paste (a, _bsonDSL_paste (b, c)) /// Paste four tokens: #define _bsonDSL_paste4(a, b, c, d) \ _bsonDSL_paste (a, _bsonDSL_paste3 (b, c, d)) // clang-format off /// Now we need a MAP() macro. This idiom is common, but fairly opaque. Below is /// some crazy preprocessor trickery to implement it. Fortunately, once we have /// MAP(), the remainder of this file is straightforward. This implementation /// isn't the simplest one possible, but is one that supports the old /// non-compliant MSVC preprocessor. /* Expands to nothing. Used to defer a function-like macro and to ignore arguments */ #define _bsonDSL_nothing(...) /// Expand to the 64th argument. See below for why this is useful. #define _bsonDSL_pick64th(\ _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \ _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \ _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \ _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \ _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \ _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \ _61, _62, _63, ...) \ _63 /** * @brief Expands to 1 if the given arguments contain any top-level commas, zero otherwise. * * There is an expansion of __VA_ARGS__, followed by 62 '1' arguments, followed * by single '0'. If __VA_ARGS__ contains no commas, pick64th() will return the * single zero. If __VA_ARGS__ contains any top-level commas, the series of ones * will shift to the right and pick64th will return one of those ones. (This only * works __VA_ARGS__ contains fewer than 62 commas, which is a somewhat reasonable * limit.) The _bsonDSL_nothing() is a workaround for MSVC's bad preprocessor that * expands __VA_ARGS__ incorrectly. * * If we have __VA_OPT__, this can be a lot simpler. */ #define _bsonDSL_hasComma(...) \ _bsonDSL_pick64th \ _bsonDSL_nothing() (__VA_ARGS__, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, ~) /** * Expands to a single comma if "invoked" as a function-like macro. * (This will make sense, I promise.) */ #define _bsonDSL_commaIfRHSHasParens(...) , /** * @brief Expand to 1 if given no arguments, otherwise 0. * * This could be done much more simply using __VA_OPT__, but we need to work on * older compilers. */ #define _bsonDSL_isEmpty(...) \ _bsonDSL_isEmpty_1(\ /* Expands to '1' if __VA_ARGS__ contains any top-level commas */ \ _bsonDSL_hasComma(__VA_ARGS__), \ /* Expands to '1' if __VA_ARGS__ begins with a parenthesis, because \ * that will cause an "invocation" of _bsonDSL_commaIfRHSHasParens, \ * which immediately expands to a single comma. */ \ _bsonDSL_hasComma(_bsonDSL_commaIfRHSHasParens __VA_ARGS__), \ /* Expands to '1' if __VA_ARGS__ expands to a function-like macro name \ * that then expands to anything containing a top-level comma */ \ _bsonDSL_hasComma(__VA_ARGS__ ()), \ /* Expands to '1' if __VA_ARGS__ expands to nothing. */ \ _bsonDSL_hasComma(_bsonDSL_commaIfRHSHasParens __VA_ARGS__ ())) /** * A helper for isEmpty(): If given (0, 0, 0, 1), expands as: * - first: _bsonDSL_hasComma(_bsonDSL_isEmpty_CASE_0001) * - then: _bsonDSL_hasComma(,) * - then: 1 * Given any other aruments: * - first: _bsonDSL_hasComma(_bsonDSL_isEmpty_CASE_) * - then: 0 */ #define _bsonDSL_isEmpty_1(_1, _2, _3, _4) \ _bsonDSL_hasComma(_bsonDSL_paste(_bsonDSL_isEmpty_CASE_, _bsonDSL_paste4(_1, _2, _3, _4))) #define _bsonDSL_isEmpty_CASE_0001 , /** * @brief Expand to the first argument if `Cond` is 1, the second argument if `Cond` is 0 */ #define _bsonDSL_ifElse(Cond, IfTrue, IfFalse) \ /* Suppress expansion of the two branches by using the '#' operator */ \ _bsonDSL_nothing(#IfTrue, #IfFalse) \ /* Concat the cond 1/0 with a prefix macro: */ \ _bsonDSL_paste(_bsonDSL_ifElse_PICK_, Cond)(IfTrue, IfFalse) #define _bsonDSL_ifElse_PICK_1(IfTrue, IfFalse) \ /* Expand the first operand, throw away the second */ \ IfTrue _bsonDSL_nothing(#IfFalse) #define _bsonDSL_ifElse_PICK_0(IfTrue, IfFalse) \ /* Expand to the second operand, throw away the first */ \ IfFalse _bsonDSL_nothing(#IfTrue) #ifdef _MSC_VER // MSVC's "traditional" preprocessor requires many more expansion passes, // but GNU and Clang are very slow when evaluating hugely nested expansions // and generate massive macro expansion backtraces. #define _bsonDSL_eval_1(...) __VA_ARGS__ #define _bsonDSL_eval_2(...) _bsonDSL_eval_1(_bsonDSL_eval_1(_bsonDSL_eval_1(_bsonDSL_eval_1(_bsonDSL_eval_1(__VA_ARGS__))))) #define _bsonDSL_eval_4(...) _bsonDSL_eval_2(_bsonDSL_eval_2(_bsonDSL_eval_2(_bsonDSL_eval_2(_bsonDSL_eval_2(__VA_ARGS__))))) #define _bsonDSL_eval_8(...) _bsonDSL_eval_4(_bsonDSL_eval_4(_bsonDSL_eval_4(_bsonDSL_eval_4(_bsonDSL_eval_4(__VA_ARGS__))))) #define _bsonDSL_eval_16(...) _bsonDSL_eval_8(_bsonDSL_eval_8(_bsonDSL_eval_8(_bsonDSL_eval_8(_bsonDSL_eval_8(__VA_ARGS__))))) #define _bsonDSL_eval(...) _bsonDSL_eval_16(_bsonDSL_eval_16(_bsonDSL_eval_16(_bsonDSL_eval_16(_bsonDSL_eval_16(__VA_ARGS__))))) #else // Each level of "eval" applies double the expansions of the previous level. #define _bsonDSL_eval_1(...) __VA_ARGS__ #define _bsonDSL_eval_2(...) _bsonDSL_eval_1(_bsonDSL_eval_1(__VA_ARGS__)) #define _bsonDSL_eval_4(...) _bsonDSL_eval_2(_bsonDSL_eval_2(__VA_ARGS__)) #define _bsonDSL_eval_8(...) _bsonDSL_eval_4(_bsonDSL_eval_4(__VA_ARGS__)) #define _bsonDSL_eval_16(...) _bsonDSL_eval_8(_bsonDSL_eval_8(__VA_ARGS__)) #define _bsonDSL_eval_32(...) _bsonDSL_eval_16(_bsonDSL_eval_16(__VA_ARGS__)) #define _bsonDSL_eval(...) _bsonDSL_eval_32(__VA_ARGS__) #endif /** * Finally, the Map() macro that allows us to do the magic, which we've been * building up to all along. * * The dance with mapMacro_first, mapMacro_final, and _bsonDSL_nothing * conditional on argument count is to prevent warnings from pre-C99 about * passing no arguments to the '...' parameters. Yet again, if we had C99 and * __VA_OPT__ this would be simpler. */ #define _bsonDSL_mapMacro(Action, Constant, ...) \ /* Pick our first action based on the content of '...': */ \ _bsonDSL_ifElse( \ /* If given no arguments: */\ _bsonDSL_isEmpty(__VA_ARGS__), \ /* expand to _bsonDSL_nothing */ \ _bsonDSL_nothing, \ /* Otherwise, expand to mapMacro_first: */ \ _bsonDSL_mapMacro_first) \ /* Now "invoke" the chosen macro: */ \ _bsonDSL_nothing() (Action, Constant, __VA_ARGS__) #define _bsonDSL_mapMacro_first(Action, Constant, ...) \ /* Select our next step based on whether we have one or more arguments: */ \ _bsonDSL_ifElse( \ /* If '...' contains more than one argument (has a top-level comma): */ \ _bsonDSL_hasComma(__VA_ARGS__), \ /* Begin the mapMacro loop with mapMacro_A: */ \ _bsonDSL_mapMacro_A, \ /* Otherwise skip to the final step of the loop: */ \ _bsonDSL_mapMacro_final) \ /* Invoke the chosen macro, setting the counter to zero: */ \ _bsonDSL_nothing() (Action, Constant, 0, __VA_ARGS__) /// Handle the last expansion in a mapMacro sequence. #define _bsonDSL_mapMacro_final(Action, Constant, Counter, FinalElement) \ Action(FinalElement, Constant, Counter) /** * mapMacro_A and mapMacro_B are identical and just invoke each other. */ #define _bsonDSL_mapMacro_A(Action, Constant, Counter, Head, ...) \ /* First evaluate the action once: */ \ Action(Head, Constant, Counter) \ /* Pick our next step: */ \ _bsonDSL_ifElse( \ /* If '...' contains more than one argument (has a top-level comma): */ \ _bsonDSL_hasComma(__VA_ARGS__), \ /* Jump to the other mapMacro: */ \ _bsonDSL_mapMacro_B, \ /* Otherwise go to mapMacro_final */ \ _bsonDSL_mapMacro_final) \ /* Invoke the next step of the map: */ \ _bsonDSL_nothing() (Action, Constant, Counter + 1, __VA_ARGS__) #define _bsonDSL_mapMacro_B(Action, Constant, Counter, Head, ...) \ Action(Head, Constant, Counter) \ _bsonDSL_ifElse(_bsonDSL_hasComma(__VA_ARGS__), _bsonDSL_mapMacro_A, _bsonDSL_mapMacro_final) \ _bsonDSL_nothing() (Action, Constant, Counter + 1, __VA_ARGS__) // clang-format on #endif // BSON_BSON_DSL_H_INCLUDED mongo-c-driver-1.26.0/src/common/bson-dsl.md000066400000000000000000000701561456567454500206100ustar00rootroot00000000000000# Using `bson-dsl.h` The header `` exposes an embedded domain-specific language (DSL) built upon the C99 preprocessor. The DSL emits valid C99 and C++03 code that can be used to inspect and construct `bson_t` objects. The intent of the DSL is to simplify and streamline the process of working with BSON data within C, which is otherwise slow, error-prone, and requires a lot of boilerplate. The DSL presents a declarative style of working with BSON data. The DSL can be broken down into two classes: - [BSON writing](#generating-bson-data): - [`bsonBuild`](#bsonbuild) - [`bsonBuildDecl`](#bsonbuilddecl) - [`bsonBuildArray`](#bsonbuildarray) - [`bsonBuildAppend`](#bsonbuildappend) - [BSON reading](#reading-bson-data) - [`bsonVisitEach`](#bsonvisiteach) - [`bsonParse`](#bsonparse) The following DSL "grammatical elements" are defined: - [*DocOperation*](#docoperation) - [*ValueOperation*](#valueoperation) - [*ArrayOperation*](#arrayoperation) - [*ParseOperation*](#parseoperation) - [*VisitOperation*](#visitoperation) - [*Predicate*](#predicate) **NOTE:** The `bson-dsl.h` header is *not* a public API. It is intended for internal use and may be changed, broken, updated, or removed. # Generating BSON Data ## Examples ### Empty ```c bsonBuildDecl(empty); ``` Result: ```js {} ``` ### A Simple "okay" ```c bsonBuildDecl(e, kv("okay", bool(true))); ``` Result: ```js { okay: true } ``` ### Nested Documents and Arrays ```c bsonBuildDecl(e, kv("integer", int32(8)), kv("subdoc", doc(kv("foo", cstr("bar")), kv("baz", null))), kv("anArray", array(int32(1), int32(2), null, cstr("I am a string")))); ``` Result: ```js { integer: 8, subdoc: { foo: "bar", "baz": null }, anArray: [1, 2, null, "I am a string"] } ``` ### Create an Aggregate Command ```c bson_t* make_aggregate(const char* coll, const bson_t* pipeline_array, int timeout_ms, int batch_size, const bson_t* comment, bson_error_t* error) { bson_t* r = bson_new(); bsonBuildAppend(r, kv("aggregate", cstr(coll)), kv("pipeline", bsonArray(*pipeline_array)), kv("cursor", doc(if(batch_size != -1, then(kv("batchSize", int32(batch_size)))))), if(timeout_ms > 0, then(kv("maxTimeMS", int32(timeout_ms))), if(comment, then(kv("comment", bson(*comment))))); // Check if any of the above failed: if (bsonBuildError) { bson_set_error(error, ERROR_COND, ERROR_CODE, "Failed to build aggregate: %s", bsonBuildError); bson_destroy(r); r = NULL; } return r; } ``` ## `bsonBuild` > `bsonBuild(BSON, DocOperation... ops)` Calls `bson_init(&BSON)`, followed by `bsonBuildAppend(BSON, ops...)`. ## `bsonBuildDecl` > `bsonBuildDecl(VarName, DocOperation... ops)` Declares a new `bson_t` named `VarName` and calls `bsonBuild(VarName, ops...)`. ## `bsonBuildAppend` > `bsonBuildAppend(BSON, DocOperation... ops)` Appends to an already-initialized `bson_t` given by `BSON` (which must be a modifiable l-value of type `bson_t`). For information on the meaning of `ops...`, See: [`DocOperation`](#DocOperation) ## `bsonBuildArray` > `bsonBuildArray(VarName, ArrayOperation... ops)` Appends to an already-initialized `bson_t` at `VarName`. Elements are inserted using incrementally increasing integer string keys. For more information, refer to [`ArrayOperation`](#ArrayOperation) ## Syntax ### *DocOperation* The *DocOperations* are used to generate elements of a `bson_t` document or subdocument thereof. The top-level `bsonBuildAppend()` and the `doc()` *ValueOperation* both accept a list of *DocOperations*. The following *DocOperations* are defined: #### `kvl()` > `kvl(const char* str, int len, ValueOperation val)` The lowest-level *DocOperation*, generates a key-value pair in the document, with the string begining at `str` for `len` characters defining the key, and `val` defining the value of the element. (See: [ValueOperation](#valueoperation)) If `str` is null-terminated, you can just use `kv()` #### `kv()` > `kv(const char* zstr, ValueOperation val)` Generate a key-value pair element, with the key given as the null-terminated C string at `zstr`, and the element value given by `val`. (See: [*ValueOperation*](#valueoperation)) #### `if()` > `if(bool c, then(DocOperation... thens))` > `if(bool c, then(DocOperation... thens), else(DocOperation... elses))` Conditionally insert elements into the document. If `c` evaluates to `true`, evaluates `thens`, otherwise `elses` (if given). `c` is a regular C expression (not a DSL *Predicate*, which is only used for visiting/parsing). Note that the `then()` and `else()` keywords must wrap the sub-operations: ```c if(some_condition, then(...), else(...)) ``` #### `insert()` > `insert(bson_t b, Predicate cond)` For some other valid `bson_t` given as `b`, copy every element from `b` that satisfies `cond` into the parent document. The *Predicate* `cond` will be evaluated for every element in `b`. Refer: [*Predicate*](#Predicate). To copy *all* elements from `b`, simply use the bare `true` predicate. #### `insertFromIter()` > `insertFromIter(bson_iter_t iter, Predicate cond)` Like `insert()`, but copies from the bson document/array referred to by `iter`. #### `iterElement()` > `iterElement(bson_iter_t iter)` Copy the BSON document element referred to by the given iterator. The element will have the same key+value as from the iterator. #### `do()` > `do(...)` Execute arbitrary C code while building the document. The document that is being built can be accessed and further modified by using the `bsonBuildContext.doc` pointer. Note: The given code can use `break` to "early exit" from the `do()`, but MUST NOT use any other form of control flow that would exit the `do()` block (i.e. `return`, `continue`, `goto`). ### *ValueOperation* The DSL *ValueOperations* are used to specify the value of an element to be appended to a document or array. #### `null` Generates a BSON null value. #### `bool(bool b)` Generate a BSON boolean value from the given C boolean expression. #### `int32(int32_t v)` #### `int64(int64_t v)` Generate an integral value from the given C integer expression. #### `cstr(const char* zstr)` Generate a UTF-8 value from the given null-terminated character array beginning at `zstr`. #### `utf8_w_len(const char* str, int len)` Generate a UTF-8 value from the character array beginning at `str`, with length `len`. #### `iterValue(bson_iter_t iter)` Copy the BSON value that is referenced by the given `iter`. #### `bson(bson_t)` Copy the given `bson_t` document as a subdocument for the element. #### `bsonArray(bson_t)` Copy the given `bson_t` document as an array element. (All keys in the array document are expected to be integer index keys, but this is not enforced). #### `doc(DocOperation... ops)` Create a sub-document using DSL *DocOperation* commands `ops`. #### `array(ArrayOperation... ops)` Create a sub-document of array type using the DSL *ArrayOperation* commands `ops`. #### `value(bson_value_t)` Insert the value denoted by the given `bson_value_t`. #### `if(bool cond, then(ValueOperation), else(ValueOperation))` "pick" one of two *ValueOperations* to use for the value, based on `cond`. Note that both of `then()` and `else()` are required. ### *ArrayOperation* *ArrayOperations* are used to build elements of arrays. **Most** *ValueOperations* are also valid *ArrayOperations*, with the following additions: #### `insert(bson_t other, Predicate cond)` Like the *DocOperation* `insert()`, but elements from `other` are given integer index keys to match the enclosing array. #### `if(bool cond, then(ArrayOperation... thens)) #### `if(bool cond, then(ArrayOperation... thens), else(ArrayOperation... elses)) Conditionally execute more *ArrayOperations* based on `cond`. # Reading BSON Data ## `bsonParse` > `bsonParse(bson_t b, ParseOperation... ops)` Perform the given *ParseOperations* `ops` on `b`. ## `bsonVisitEach` > `bsonVisitEach(bson_t b, VisitOperation... ops)` Perform the given *VisitOperations* `ops` *on every element* of `b`. ## `bsonAs` > `bsonAs(TypeName t)` Dereference the currently visited/parsed element as a value of the given type `t`. May only be evaluated within a visit/parsing context. ## "Parse" versus "Visit" `bsonParse` and `bsonVisitEach` are both commands for inspecting and destructuring BSON data, but work differently. `bsonParse` is given a list of *ParseOperations*, and then evaluates each of those operations in the given order exactly once for the whole document. `bsonParse` is used to inspect a document as a whole. `bsonVisitEach` is given a list of *VisitOperations*, and *for each element* will evaluate *all* of those operations. `bsonVisitEach` is used to inspect the individual elements of a document. Each element is visited in the order that it appears, and each operation is evaluated in the order they were given. ## The `bsonVisitIter` There is a global (thread-local) non-modifiable lvalue name `bsonVisitIter`, which evaluates to a `const bson_iter_t` that refers to whatever (sub)document element is currently being visited or parsed. This is useful in contexts where one wishes to execute arbitrary code within a parse/visit, and needs to refer to the element that is being visited. **Note** that evaluating this name outside of a parse/visit context is **undefined behavior**. ## Syntax ### *ParseOperation* Parse operations are used to find specific elements within documents, and perform additional control-flow operations. #### `find` #### `require` > `find(Predicate p, VisitOperation... ops)` > `require(Predicate p, VisitOperation... ops)` Locate the first element that matches the *Predicate* `p`, and then evaluate each *VisitOperation* in `ops` for that element. If the `require` command fails to find a matching element, it will generate an `error()` command that mentions the failed predicate `p`. #### `else` > `else(ParseOperation... ops)` If the previous `find()` command *did not* find an element, evaluate `ops`, otherwise does nothing. **NOTE** that this is unrelated to the "`if`" *ParseOperation*. #### `visitOthers` > `visitOthers(VisitOperation... ops)` For each element in the document being parsed that *has not* been visited by any previous `find` or `require` operation, evaluate `ops` #### `error` > `error(const char* S)` Assign the given character pointer `S` to `bsonParseError`. **Note** that this string is thread-local and is not freed or allocated. It is recommended to only use string literals for `S`. #### `errorf` > `errorf(char*& E, const char* fmt, ...)` If `E` is non-`NULL`, it will be freed, then: Generate an error string using printf-formatting. The allocated pointer will be written to `E`. `bsonParseError` will also be set to point to the same address as `E`. **NOTE:** It is the callers's responsibility to eventually free `E`. #### `halt` The `halt` keyword stops the current `bsonVisit()`/`bsonParse()` in which it appears. #### `if` > `if(bool cond, then(ParseOperation... thens))` > `if(bool cond, then(ParseOperation... thens), else(ParseOperation... elses))` If `cond` is true, evaluate `thens`, otherwise evaluate `elses` (if provided). #### `append` > `append(bson_t b, DocOperation... ops)` Evaluate as-if a `bsonBuildAppend(b, ops...)` appears at this location. The value of `bsonVisitIter` is unspecified. #### `do` > `do(...)` Evaluate the given arbitrary code. The value of `bsonVisitIter` is unspecified. ### *VisitOperation* A *VisitOperation* applies a specific action to individual elements within a BSON document. During a visit operation, `bsonVisitIter` refers to the current element that is being visited or parsed. For example, during a parse `find()` operation, `bsonVisitIter` refers to the element that was found matching the predicate. During a `bsonVisitEach()`, each element is iterated over, and `bsonVisitIter` will refer to every element in turn. #### `do(...)` Evaluate the given C code. The `bsonVisitIter` can be used to reference the element being visited/parsed. #### `storeBool(bool& b)` If `bsonVisitIter` refers to a boolean value, assign that value to `b` (which must be a modifiable lvalue of type `bool`). #### `storeStrRef(const char*& s)` If `bsonVisitIter` refers to a UTF-8 string, a pointer to that string element will be assigned to `s`. **NOTE** that this writes a pointer to the string within the BSON data, so `s` is only valid as long as the `bson_t` document is valid and unmodified. #### `storeStrDup(const char*& s)` If `bsonVisitIter` refers to a UTF-8 string, that string will be copied and a pointer to the allocated region will be assigned to `s`, which must later be freed. #### `storeDocRef(bson_t& doc)` Update `doc` to be a view of the subdocument at `bsonVisitIter`. This view will remain valid for as long as the root document being parsed is valid. The `doc` is a view, so it will not need to be destroyed, and cannot be modified. `storeDocDup(bson_t&)` and `storeDocDupPtr(bson_t*&)` will duplicate the document element into the given `bson_t` (or pointer thereof). The duplicated document will need to be destroyed, and is valid to modify. #### `append(bson_t b, DocOperation... ops)` Evaluate a `bsonBuildAppend(b, ops...)`, with `bsonVisitIter` referring to the element being visited. #### `appendTo(bson_t b)` Append the current element to the BSON document `b`. The element will be copied with the same key and value. #### `visitEach(VisitOperation... ops)` If `bsonVisitIter` refers to a document or array element `A`, apply `bsonVisitEach(A, ops...)`. #### `parse(ParseOperation... ops)` If `bsonVisitIter` refers to a document or array element `D`, apply `bsonParse(D, ops...)`. #### `halt` Completely stop the current `bsonParse`/`bsonVisit` command. #### `break` Stop the inner-most `bsonVisitEach`/`visitEach` command. Only valid when directly within a `bsonVisitEach` or `visitEach` context. #### `continue` If directly within a `bsonVisitEach`/`visitEach` evaluation, stop visiting the current element and advance to the next element. #### `error(const char* S)` Assign the given character pointer `S` to `bsonParseError`. **Note** that this string is thread-local and is not freed or allocated. It is recommended to only use string literals for `S`. #### `errorf(char*& E, const char* fmt, ...)` If `E` is not `NULL`, `E` will be freed. Then: Generate an error string using printf-style formatting. The allocated string will be written to `E`. `bsonParseError` will be updated to point to the generate string. **NOTE:** It is the caller's responsibility to eventually free `E`. #### `dupPath(char* P)` If `P` is non-`NULL`, `P` is freed. Then: Create a JSONPath-style string that refers to the document element currently being visited. The path will be rooted at the document given to the top-most `bsonParse`/`bsonVisit` invocation in the calling thread. **NOTE:** It is the caller's responsibility to eventually free `P`. #### `if()` > `if(Predicate cond, then(VisitOperation... thens))` > `if(Predicate cond, then(VisitOperation... thens), else(VisitOperation... elses))` If the *Predicate* `cond` matches the current element, apply the `thens` operations, otherwise the `elses` (if given). **NOTE** that this `if()` command expects a DSL *Predicate* as its condition, and *not* a regular C expression like the other `if()` DSL commands. #### `nop` Does nothing. #### `case()` > ``` > case(when(Predicate w, > VisitOperations... ops) > ..., > [else(VisitOperations... ops)]) > ``` Perform case selection based on a set of predicates. `case` accepts zero or more `when(Predicate w, VisitOperation... ops)` clauses. Each `when` is considered in the listed order. If the *Predicate* `w` of a `when` matches the `bsonVisitIter` element, then the `when`'s *VisitOperations* `ops` are evaluated on the element. After any `when` clause matches an element, no subsequent `when` clauses are considered. An `else(ops...)` clause is equivalent to `when(true, ops...)`. If no clause matches the element, nothing happens. ### *Predicate* DSL *Predicates* appears in several locations. A *Predicate* evaluates some condition on the current `bsonVisitIter` (which is updated automatically by other DSL commands). A predicate can be evaluated at any point in C code by using the `bsonPredicate()` expression (this is only valid within a `visitEach` or `parse` context, since it references the `bsonVisitIter` name). The following predicates are defined: #### `key(const char* s...)` Specify one or more C strings for `s`. This predicate will match if *any of* `s` is equivalent to the element's key string. The `iKey(s...)` predicate is the same as `key`, but performs a case-insensitive match. #### `type(TypeName t)` Matches if the element's current type matches the `TypeName` `t`. The `TypeName`s are: `double`, `utf8`, `doc`, `array`, `binary`, `undefined`, `oid`, `bool`, `date_time`, `null`, `regex`, `dbpointer`, `code`, `codewscope`, `int32`, `timestamp`, `int64`, and `decimal128`. #### `keyWithType(const char* k, TypeName t)` Matches an element with key `k` and type `t`. `iKeyWithType` performs a case-insensitive string match for the key. #### `isNumeric` The `isNumeric` predicate matches if the element's value is a numeric type (`double`, `int32`, or `int64`. `decimal128` is *not* included). #### `lastElement` Matches only the final element in a document. #### `true` Always matches. #### `false` Never matches. #### `isTrue` Matches is the element is "true" according to `bson_iter_as_bool()`: A `true` boolean, a non-zero int/double value, or other non-null value. #### `isFalse` Matches any element that is not `isTrue`. #### `empty` Matches an element which is an empty BSON subdocument or array. #### `strEqual(const char* s)` Matches if the element value is a UTF-8 string and is equivalent to the string `s`. `iStrEqual(s)` performs the same match, but performs a case-insensitive comparison. #### `eq(TypeName t, any v)` Matches if the element has type `t` and `bsonAs(t) == v`. #### `not(Predicate... ps)` Matches if *none of* the predicates `ps` match. #### `allOf(Predicate... ps)` Matches if *all of* `ps` match the element (Logical conjunction). If `ps` is empty, always matches. #### `anyOf(Predicate... ps)` Matches if *any of* `ps` match the element (logical disjunction). If `ps` is empty, never matches. #### `eval(...)` Evaluate the given C expression, which must return a boolean-testable value. The code can refer to the element under consideration via `bsonVisitIter`. The code can test other predicates by using `bsonPredicate(P)`, which evaluates to a boolean value. # Error Handling The DSL uses two global (thread-local) names to perform error handling: `bsonBuildError` and `bsonParseError`. Upon entry, BSON-constructing commands will set `bsonBuildError` to `NULL`. BSON-reading commands will set `bsonParseError` to `NULL`. If `bsonBuildError` becomes non-`NULL` during DSL evaluation, the enclosing `bsonBuild-` command will stop evaluating and immediately return to the caller. `bsonParse` and `bsonVisitEach` behave similarly with respect to the `bsonParseError` name. After a DSL command returns, `bsonParseError`/`bsonBuildError` should be checked for `NULL`. If non-`NULL`, the relevant command encountered an error while executing. This can happen if the BSON iteration encountered corruption, if any build operation failed, if an `error()` or `errorf()` DSL command was executed, or if any inner C code assigned a non-`NULL` value to the respective error string: ```c // These functions add items to bsonBuildContext.doc: void add_stuff(); void add_data(); void add_more(); ``` ```c bsonBuildAppend(mydoc, do(add_stuff()), do({ if (!some_computation()) { bsonBuildError = "some_computation() failed!"; } }), kv("subarray", bsonArray(some_array)), do(add_data()), do(add_more())); if (bsonBuildError) { fprintf(stderr, "Error building BSON: %s\n", bsonBuildError); } ``` In the above, any of the `do` blocks can indicate an error by assigning `bsonBuildError` to a non-`NULL` string. The `bsonArray` *ValueOperation* may also generate an error while appending the `subarray` element (e.g. if `some_array` is corrupt). As soon as one subcommand indicates an error, the `bsonBuildAppend()` will not evaluate any further subcommands. The `bsonBuildError` value will be retained after it returns, for inspection by the caller. The `error()` (or `errorf()`) visit/parse command can be used to do terse document validation: ```c++ struct user_info { char* name; int age; }; user_info get_user(const bson_t* data) { user_info ret = {0}; bsonParse(*data, // Get the name find(key("name"), if(not(type(utf8)), then(error("'name' must be a string"))), if(strEqual(""), then(error("'name' must not be empty"))), storeStrDup(ret.name)), else(error("The 'name' property is missing")), // Get the age find(key("age"), case(when(not(isNumeric), error("'age' must be a number")), when(eval(bsonAs(int32) < 0), error("'age' cannot be negative")), else(do(ret.age = bsonAs(int32))))), else(error("The 'age' property is missing"))); if (bsonParseError) { bson_free(ret.name); fprintf(stderr, "Error while reading user_info from bson: %s\n", bsonParseError); return {0}; } return ret; } ``` # Other Important Details ## Deferred Evaluation In a regular C program a function call `foo(x, y, z)` will evaluate `x`, `y`, and `z` *before* calling `foo`. In the DSL, this is not the case: Subcommands that accept C code and expressions will evaluate the C code only if/when the subcommand is executed. This allows one to rely on previous-executed DSL subcommands in subsequent commands. e.g. one can store a variable extracted from a document, and then later perform additional conditional parsing based on the value that was extracted: ```c int32_t expect = 0; bsonParse( some_data, require(key("expect"), do(v = bsonAs(int32))), // At this point "expect" has been extracted from 'some_data' require(key("value"), case(when(bsonAs(int32) < expect), error("'value' is less than 'expect'"), when(bsonAs(int32) > expect), error("'value' is greater than 'expect'")))); ``` ## Building while Parsing The `append()` visit operation allows one to update one BSON document while parsing another: ```c const bson_t* input = ...; bson_t* output = ...; bsonParse( input, // Find a "src' subdocument require(keyWithType("src", doc), // Append what we found to the "got" key in 'output': // (bsonVisitIter still points to "src" in 'input') append(*output, kv("got", iterValue(bsonVisitIter)))), // Add "readonly", but only if we find it. find(key("readonly"), // bsonPredicate() will evaluate a predicate on bsonVisitIter // (which here points to the "readonly" property in "input") append(*output, kv("readonly", bool(bsonPredicate(truthy)))))); ``` # Understanding Compiler Errors If you misspell the name of any DSL subcommand, or use one in an incorrect location, you will receive a string of errors from your compiler. (If you are using GCC, this will include a length expansion backtrace for `_bsonDSL_eval` and `_bsonDSL_mapMacro`, which you can mostly scroll over and ignore). However, all errors should be ignored *except* for the first one, which will often indicate the invocation of an unknown/implicitly-declared function. The name of the "missing function" will be the concatenation of a DSL-specific command namespace and the erroneous command name that was given. For example: ```c bsonBuildAppend( cmd, kv("count", utf8_w_len(collection->collection, collection->collectionlen)), kv("query", if(query, then (bson (*query)), else(doc()))), if(limit, then(kv("limit", o64(limit)))), // <-- misspelled "int64" if(skip, then(kv("skip", int64(skip))))); ``` results in the following error from GCC: ``` error: implicit declaration of function ‘_bsonValueOperation_o64’; did you mean ‘_bsonValueOperation_int64’? [-Werror=implicit-function-declaration] ``` This error message includes a helpful hint as to the spelling error and likely correction. # Debugging Unfortunately, debugging through macro definitions is still a tricky subject. `bson-dsl.h` includes a function `_bson_dsl_debug()`, which is invoked for every DSL subcommand, including a string expressing the arguments to the command. If debug is "enabled" for the DSL, `_bson_dsl_debug` will write the debug output to `stderr`. If it is "disabled", `_bson_dsl_debug` is a no-op. A breakpoint can be set within `_bson_dsl_debug` to "step through" each DSL operation. Each DSL command looks for a name `BSON_DSL_DEBUG`. If this value is truthy, debug output is enabled. The default of `BSON_DSL_DEBUG` is a global constant set to zero. A local `BSON_DSL_DEBUG` variable can be declared within the scope of a DSL command to toggle debugging for that scope only. # How? The DSL makes extreme usage of the C preprocessor to expand to fairly simple C code inline. ## The "MAP" Macro Suppose we have a macro "MAP", with the following psuedo-code: ```c #define MAP(F, Args... args) \ #foreach arg in args \ F(arg) \ #endforeach ``` That is, MAP accepts a name `F` and zero or more arguments as `args`. For each argument `a` in `args`, expand one `F(x)`. The actual definition of `MAP` is non-trivial. The definition provded in `bson-dsl.h` can be found near the bottom of the file, and goes by the name `_bsonDSL_mapMacro`. It is not necessary to understand how `MAP` works to understand the DSL. ## Token Pasting The token-paste operator `##` is a preprocessor operator that concatenates two identifiers for form a single new identifier. If the right-hand operand of `##` contains additional non-identifier characters, this does not matter. It only matters that the character touching the `##` operator is a valid alphanumeric. For example, pasting `foo` and `bar(baz)`, results in `foobar(baz)`. ## Pasting with "MAP" Suppose the following macro is defined: ```c #define execEach(...) \ MAP(_doExecEach, __VA_ARGS__) #define _doExecEach(Item) \ _doExecOperation_ ## Item ``` and then we use it: ```c execEach(foo(1), bar(2), baz(3)) ``` For the first expansion: ```c _doExecEach(foo(1)) _doExecEach(bar(2)) _doExecEach(baz(3)) ``` Then: ```c _doExecOperation_foo(1) _doExecOperation_bar(2) _doExecOperation_baz(3) ``` The resulting names may be regular functions, or may be additional macros that will be further expanded. This is the basis of this BSON DSL. ## One More Thing: `EVAL` There's one more thing to note. Imagine this: ```c #define AGAIN(X) X AGAIN(X) ``` A naive intuition is that `AGAIN(f)` will expand to an unending sequence of `f f f f f f f f f ...` since `AGAIN` "calls itself." However, the C preprocessor is written such that this will not occur. During the expansion of any macro `M`, any appearance of `M` within the result will be ignored. What we need is a way to force the preprocessor to "do it again." Besides simply appearing in the source text or during a re-scan, there is another context in which preprocessor macros will be expanded: When preparing the arguments to other function-like macros. This is where `EVAL` comes in: ```c #define EVAL(X) _doEval2(_doEval2(X)) #define _doEval2(X) _doEval4(_doEval4(X)) #define _doEval4(X) _doEval8(_doEval8(X)) #define _doEval8(X) _doEval16(_doEval16(X)) #define _doEval16(X) X ``` In this example, `EVAL(X)` will macro-expand `X` sixteen times: Twice more for each layer. This can be extended to arbitrary depth and recurring expansions. For `EVAL(AGAIN(f))`, we will end up with a string of `f f f f f f f f ...` followed by a single `AGAIN(f)`. There are additional tricks required to make `EVAL`, `MAP`, and token pasting play nice, but those details are not necessary here. mongo-c-driver-1.26.0/src/common/common-b64-private.h000066400000000000000000000044401456567454500222400ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "common-prelude.h" #ifndef COMMON_B64_PRIVATE_H #define COMMON_B64_PRIVATE_H #include #define mcommon_b64_ntop_calculate_target_size \ COMMON_NAME (b64_ntop_calculate_target_size) #define mcommon_b64_pton_calculate_target_size \ COMMON_NAME (b64_pton_calculate_target_size) #define mcommon_b64_ntop COMMON_NAME (b64_ntop) #define mcommon_b64_pton COMMON_NAME (b64_pton) /** * When encoding from "network" (raw data) to "presentation" (base64 encoded). * Includes the trailing null byte. */ size_t mcommon_b64_ntop_calculate_target_size (size_t raw_size); /* When encoding from "presentation" (base64 encoded) to "network" (raw data). * This may be an overestimate if the base64 data includes spaces. For a more * accurate size, call b64_pton (src, NULL, 0), which will read the src * data and return an exact size. */ size_t mcommon_b64_pton_calculate_target_size (size_t base64_encoded_size); /* Returns the number of bytes written (excluding NULL byte) to target on * success or -1 on error. Adds a trailing NULL byte. * Encodes from "network" (raw data) to "presentation" (base64 encoded), * hence the obscure name "ntop". */ int mcommon_b64_ntop (uint8_t const *src, size_t srclength, char *target, size_t targsize); /** If target is not NULL, the number of bytes written to target on success or * -1 on error. If target is NULL, returns the exact number of bytes that would * be written to target on decoding. Encodes from "presentation" (base64 * encoded) to "network" (raw data), hence the obscure name "pton". */ int mcommon_b64_pton (char const *src, uint8_t *target, size_t targsize); #endif /* COMMON_B64_PRIVATE_H */ mongo-c-driver-1.26.0/src/common/common-b64.c000066400000000000000000000453441456567454500205730ustar00rootroot00000000000000/* * Copyright (c) 1996, 1998 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* * Portions Copyright (c) 1995 by International Business Machines, Inc. * * International Business Machines, Inc. (hereinafter called IBM) grants * permission under its copyrights to use, copy, modify, and distribute this * Software with or without fee, provided that the above copyright notice and * all paragraphs of this notice appear in all copies, and that the name of IBM * not be used in connection with the marketing of any product incorporating * the Software or modifications thereof, without specific, written prior * permission. * * To the extent it has a right to do so, IBM grants an immunity from suit * under its patents, if any, for the use, sale or manufacture of products to * the extent that such products are used for performing Domain Name System * dynamic updates in TCP/IP networks by means of the Software. No immunity is * granted for any product per se or for any other function of any product. * * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. */ #include "bson/bson.h" #include "common-b64-private.h" #define Assert(Cond) \ if (!(Cond)) \ abort () static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) * The following encoding technique is taken from RFC 1521 by Borenstein * and Freed. It is reproduced here in a slightly edited form for * convenience. * * A 65-character subset of US-ASCII is used, enabling 6 bits to be * represented per printable character. (The extra 65th character, "=", * is used to signify a special processing function.) * * The encoding process represents 24-bit groups of input bits as output * strings of 4 encoded characters. Proceeding from left to right, a * 24-bit input group is formed by concatenating 3 8-bit input groups. * These 24 bits are then treated as 4 concatenated 6-bit groups, each * of which is translated into a single digit in the base64 alphabet. * * Each 6-bit group is used as an index into an array of 64 printable * characters. The character referenced by the index is placed in the * output string. * * Table 1: The Base64 Alphabet * * Value Encoding Value Encoding Value Encoding Value Encoding * 0 A 17 R 34 i 51 z * 1 B 18 S 35 j 52 0 * 2 C 19 T 36 k 53 1 * 3 D 20 U 37 l 54 2 * 4 E 21 V 38 m 55 3 * 5 F 22 W 39 n 56 4 * 6 G 23 X 40 o 57 5 * 7 H 24 Y 41 p 58 6 * 8 I 25 Z 42 q 59 7 * 9 J 26 a 43 r 60 8 * 10 K 27 b 44 s 61 9 * 11 L 28 c 45 t 62 + * 12 M 29 d 46 u 63 / * 13 N 30 e 47 v * 14 O 31 f 48 w (pad) = * 15 P 32 g 49 x * 16 Q 33 h 50 y * * Special processing is performed if fewer than 24 bits are available * at the end of the data being encoded. A full encoding quantum is * always completed at the end of a quantity. When fewer than 24 input * bits are available in an input group, zero bits are added (on the * right) to form an integral number of 6-bit groups. Padding at the * end of the data is performed using the '=' character. * * Since all base64 input is an integral number of octets, only the * following cases can arise: * * (1) the final quantum of encoding input is an integral * multiple of 24 bits; here, the final unit of encoded * output will be an integral multiple of 4 characters * with no "=" padding, * (2) the final quantum of encoding input is exactly 8 bits; * here, the final unit of encoded output will be two * characters followed by two "=" padding characters, or * (3) the final quantum of encoding input is exactly 16 bits; * here, the final unit of encoded output will be three * characters followed by one "=" padding character. */ int mcommon_b64_ntop (uint8_t const *src, size_t srclength, char *target, size_t targsize) { size_t datalength = 0; uint8_t input[3]; uint8_t output[4]; size_t i; if (!target) { return -1; } while (2 < srclength) { input[0] = *src++; input[1] = *src++; input[2] = *src++; srclength -= 3; output[0] = input[0] >> 2; output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); output[3] = input[2] & 0x3f; Assert (output[0] < 64); Assert (output[1] < 64); Assert (output[2] < 64); Assert (output[3] < 64); if (datalength + 4 > targsize) { return -1; } target[datalength++] = Base64[output[0]]; target[datalength++] = Base64[output[1]]; target[datalength++] = Base64[output[2]]; target[datalength++] = Base64[output[3]]; } /* Now we worry about padding. */ if (0 != srclength) { /* Get what's left. */ input[0] = input[1] = input[2] = '\0'; for (i = 0; i < srclength; i++) { input[i] = *src++; } output[0] = input[0] >> 2; output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); Assert (output[0] < 64); Assert (output[1] < 64); Assert (output[2] < 64); if (datalength + 4 > targsize) { return -1; } target[datalength++] = Base64[output[0]]; target[datalength++] = Base64[output[1]]; if (srclength == 1) { target[datalength++] = Pad64; } else { target[datalength++] = Base64[output[2]]; } target[datalength++] = Pad64; } if (datalength >= targsize) { return -1; } target[datalength] = '\0'; /* Returned value doesn't count \0. */ return (int) datalength; } /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) The following encoding technique is taken from RFC 1521 by Borenstein and Freed. It is reproduced here in a slightly edited form for convenience. A 65-character subset of US-ASCII is used, enabling 6 bits to be represented per printable character. (The extra 65th character, "=", is used to signify a special processing function.) The encoding process represents 24-bit groups of input bits as output strings of 4 encoded characters. Proceeding from left to right, a 24-bit input group is formed by concatenating 3 8-bit input groups. These 24 bits are then treated as 4 concatenated 6-bit groups, each of which is translated into a single digit in the base64 alphabet. Each 6-bit group is used as an index into an array of 64 printable characters. The character referenced by the index is placed in the output string. Table 1: The Base64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y Special processing is performed if fewer than 24 bits are available at the end of the data being encoded. A full encoding quantum is always completed at the end of a quantity. When fewer than 24 input bits are available in an input group, zero bits are added (on the right) to form an integral number of 6-bit groups. Padding at the end of the data is performed using the '=' character. Since all base64 input is an integral number of octets, only the following cases can arise: (1) the final quantum of encoding input is an integral multiple of 24 bits; here, the final unit of encoded output will be an integral multiple of 4 characters with no "=" padding, (2) the final quantum of encoding input is exactly 8 bits; here, the final unit of encoded output will be two characters followed by two "=" padding characters, or (3) the final quantum of encoding input is exactly 16 bits; here, the final unit of encoded output will be three characters followed by one "=" padding character. */ /* skips all whitespace anywhere. converts characters, four at a time, starting at (or after) src from base - 64 numbers into three 8 bit bytes in the target area. it returns the number of data bytes stored at the target, or -1 on error. */ static uint8_t mongoc_b64rmap[256]; static const uint8_t mongoc_b64rmap_special = 0xf0; static const uint8_t mongoc_b64rmap_end = 0xfd; static const uint8_t mongoc_b64rmap_space = 0xfe; static const uint8_t mongoc_b64rmap_invalid = 0xff; /* initializing the reverse map isn't thread safe, do it in pthread_once */ #if defined(BSON_OS_UNIX) #include #define mongoc_common_once_t pthread_once_t #define mongoc_common_once pthread_once #define MONGOC_COMMON_ONCE_FUN(n) void n (void) #define MONGOC_COMMON_ONCE_RETURN return #define MONGOC_COMMON_ONCE_INIT PTHREAD_ONCE_INIT #else #define mongoc_common_once_t INIT_ONCE #define MONGOC_COMMON_ONCE_INIT INIT_ONCE_STATIC_INIT #define mongoc_common_once(o, c) InitOnceExecuteOnce (o, c, NULL, NULL) #define MONGOC_COMMON_ONCE_FUN(n) \ BOOL CALLBACK n (PINIT_ONCE _ignored_a, PVOID _ignored_b, PVOID *_ignored_c) #define MONGOC_COMMON_ONCE_RETURN return true #endif static MONGOC_COMMON_ONCE_FUN (bson_b64_initialize_rmap) { int i; unsigned char ch; /* Null: end of string, stop parsing */ mongoc_b64rmap[0] = mongoc_b64rmap_end; for (i = 1; i < 256; ++i) { ch = (unsigned char) i; /* Whitespaces */ if (bson_isspace (ch)) mongoc_b64rmap[i] = mongoc_b64rmap_space; /* Padding: stop parsing */ else if (ch == Pad64) mongoc_b64rmap[i] = mongoc_b64rmap_end; /* Non-base64 char */ else mongoc_b64rmap[i] = mongoc_b64rmap_invalid; } /* Fill reverse mapping for base64 chars */ for (i = 0; Base64[i] != '\0'; ++i) mongoc_b64rmap[(uint8_t) Base64[i]] = i; MONGOC_COMMON_ONCE_RETURN; } static int mongoc_b64_pton_do (char const *src, uint8_t *target, size_t targsize) { int tarindex, state; uint8_t ch, ofs; state = 0; tarindex = 0; while (1) { ch = *src++; ofs = mongoc_b64rmap[ch]; if (ofs >= mongoc_b64rmap_special) { /* Ignore whitespaces */ if (ofs == mongoc_b64rmap_space) continue; /* End of base64 characters */ if (ofs == mongoc_b64rmap_end) break; /* A non-base64 character. */ return (-1); } switch (state) { case 0: if ((size_t) tarindex >= targsize) return (-1); target[tarindex] = ofs << 2; state = 1; break; case 1: if ((size_t) tarindex + 1 >= targsize) return (-1); target[tarindex] |= ofs >> 4; target[tarindex + 1] = (ofs & 0x0f) << 4; tarindex++; state = 2; break; case 2: if ((size_t) tarindex + 1 >= targsize) return (-1); target[tarindex] |= ofs >> 2; target[tarindex + 1] = (ofs & 0x03) << 6; tarindex++; state = 3; break; case 3: if ((size_t) tarindex >= targsize) return (-1); target[tarindex] |= ofs; tarindex++; state = 0; break; default: abort (); } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = *src++; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ return (-1); case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for ((void) NULL; ch != '\0'; ch = *src++) if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) return (-1); ch = *src++; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for ((void) NULL; ch != '\0'; ch = *src++) if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) return (-1); /* * Now make sure for cases 2 and 3 that the "extra" * bits that slopped past the last full byte were * zeros. If we don't check them, they become a * subliminal channel. */ if (target[tarindex] != 0) return (-1); default: break; } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) return (-1); } return (tarindex); } static int mongoc_b64_pton_len (char const *src) { int tarindex, state; uint8_t ch, ofs; state = 0; tarindex = 0; while (1) { ch = *src++; ofs = mongoc_b64rmap[ch]; if (ofs >= mongoc_b64rmap_special) { /* Ignore whitespaces */ if (ofs == mongoc_b64rmap_space) continue; /* End of base64 characters */ if (ofs == mongoc_b64rmap_end) break; /* A non-base64 character. */ return (-1); } switch (state) { case 0: state = 1; break; case 1: tarindex++; state = 2; break; case 2: tarindex++; state = 3; break; case 3: tarindex++; state = 0; break; default: abort (); } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = *src++; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ return (-1); case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for ((void) NULL; ch != '\0'; ch = *src++) if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) return (-1); ch = *src++; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for ((void) NULL; ch != '\0'; ch = *src++) if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) return (-1); default: break; } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) return (-1); } return (tarindex); } int mcommon_b64_pton (char const *src, uint8_t *target, size_t targsize) { static mongoc_common_once_t once = MONGOC_COMMON_ONCE_INIT; mongoc_common_once (&once, bson_b64_initialize_rmap); if (!src) { return -1; } if (target) return mongoc_b64_pton_do (src, target, targsize); else return mongoc_b64_pton_len (src); } size_t mcommon_b64_ntop_calculate_target_size (size_t raw_size) { size_t num_bits = raw_size * 8; /* Calculate how many groups of six bits this contains, adding 5 to round up * to the nearest group of 6. */ size_t num_b64_chars = (num_bits + 5) / 6; /* Round to nearest set of four. */ size_t num_b64_chars_with_padding = 4 * ((num_b64_chars + 3) / 4); /* Add one for NULL byte. */ return num_b64_chars_with_padding + 1; } size_t mcommon_b64_pton_calculate_target_size (size_t base64_encoded_size) { /* Without inspecting the data, we don't know how many padding characters * there are. Assuming none, that means each character represents 6 bits of * data. */ size_t num_bits = base64_encoded_size * 6; /* Round down to the nearest group of eight. */ return num_bits / 8; } mongo-c-driver-1.26.0/src/common/common-config.h.in000066400000000000000000000003311456567454500220420ustar00rootroot00000000000000#ifndef COMMON_CONFIG_H #define COMMON_CONFIG_H #define MONGOC_ENABLE_DEBUG_ASSERTIONS @MONGOC_ENABLE_DEBUG_ASSERTIONS@ #if MONGOC_ENABLE_DEBUG_ASSERTIONS != 1 # undef MONGOC_ENABLE_DEBUG_ASSERTIONS #endif #endif mongo-c-driver-1.26.0/src/common/common-macros-private.h000066400000000000000000000006351456567454500231330ustar00rootroot00000000000000 #include "common-prelude.h" #ifndef MONGO_C_DRIVER_COMMON_MACROS_H #define MONGO_C_DRIVER_COMMON_MACROS_H /* Test only assert. Is a noop unless -DENABLE_DEBUG_ASSERTIONS=ON is set * during configuration */ #if defined(MONGOC_ENABLE_DEBUG_ASSERTIONS) && defined(BSON_OS_UNIX) #define MONGOC_DEBUG_ASSERT(statement) BSON_ASSERT (statement) #else #define MONGOC_DEBUG_ASSERT(statement) ((void) 0) #endif #endif mongo-c-driver-1.26.0/src/common/common-md5-private.h000066400000000000000000000021431456567454500223300ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "common-prelude.h" #ifndef COMMON_MD5_PRIVATE_H #define COMMON_MD5_PRIVATE_H #include "bson/bson.h" BSON_BEGIN_DECLS #define mcommon_md5_init COMMON_NAME (md5_init) #define mcommon_md5_append COMMON_NAME (md5_append) #define mcommon_md5_finish COMMON_NAME (md5_finish) void mcommon_md5_init (bson_md5_t *pms); void mcommon_md5_append (bson_md5_t *pms, const uint8_t *data, uint32_t nbytes); void mcommon_md5_finish (bson_md5_t *pms, uint8_t digest[16]); BSON_END_DECLS #endif /* COMMON_MD5_PRIVATE_H */ mongo-c-driver-1.26.0/src/common/common-md5.c000066400000000000000000000310121456567454500206500ustar00rootroot00000000000000/* Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgement in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com */ /* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.c is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order either statically or dynamically; added missing #include in library. 2002-03-11 lpd Corrected argument list for main(), and added int return type, in test program and T value program. 2002-02-21 lpd Added missing #include in test program. 2000-07-03 lpd Patched to eliminate warnings about "constant is unsigned in ANSI C, signed in traditional"; made test program self-checking. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). 1999-05-03 lpd Original version. */ /* * The following MD5 implementation has been modified to use types as * specified in libbson. */ #include #include "common-md5-private.h" #undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ #if BSON_BYTE_ORDER == BSON_BIG_ENDIAN #define BYTE_ORDER 1 #else #define BYTE_ORDER -1 #endif #define T_MASK ((uint32_t) ~0) #define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) #define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) #define T3 0x242070db #define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) #define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) #define T6 0x4787c62a #define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) #define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) #define T9 0x698098d8 #define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) #define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) #define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) #define T13 0x6b901122 #define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) #define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) #define T16 0x49b40821 #define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) #define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) #define T19 0x265e5a51 #define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) #define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) #define T22 0x02441453 #define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) #define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) #define T25 0x21e1cde6 #define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) #define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) #define T28 0x455a14ed #define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) #define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) #define T31 0x676f02d9 #define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) #define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) #define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) #define T35 0x6d9d6122 #define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) #define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) #define T38 0x4bdecfa9 #define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) #define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) #define T41 0x289b7ec6 #define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) #define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) #define T44 0x04881d05 #define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) #define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) #define T47 0x1fa27cf8 #define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) #define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) #define T50 0x432aff97 #define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) #define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) #define T53 0x655b59c3 #define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) #define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) #define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) #define T57 0x6fa87e4f #define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) #define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) #define T60 0x4e0811a1 #define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) #define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) #define T63 0x2ad7d2bb #define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) static void bson_md5_process (bson_md5_t *md5, const uint8_t *data) { uint32_t a = md5->abcd[0]; uint32_t b = md5->abcd[1]; uint32_t c = md5->abcd[2]; uint32_t d = md5->abcd[3]; uint32_t t; #if BYTE_ORDER > 0 /* Define storage only for big-endian CPUs. */ uint32_t X[16]; #else /* Define storage for little-endian or both types of CPUs. */ uint32_t xbuf[16]; const uint32_t *X; #endif { #if BYTE_ORDER == 0 /* * Determine dynamically whether this is a big-endian or * little-endian machine, since we can use a more efficient * algorithm on the latter. */ static const int w = 1; if (*((const uint8_t *) &w)) /* dynamic little-endian */ #endif #if BYTE_ORDER <= 0 /* little-endian */ { /* * On little-endian machines, we can process properly aligned * data without copying it. */ if (!((data - (const uint8_t *) 0) & 3)) { /* data are properly aligned */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wcast-align" #endif X = (const uint32_t *) data; #ifdef __clang__ #pragma clang diagnostic pop #endif } else { /* not aligned */ memcpy (xbuf, data, sizeof (xbuf)); X = xbuf; } } #endif #if BYTE_ORDER == 0 else /* dynamic big-endian */ #endif #if BYTE_ORDER >= 0 /* big-endian */ { /* * On big-endian machines, we must arrange the bytes in the * right order. */ const uint8_t *xp = data; int i; #if BYTE_ORDER == 0 X = xbuf; /* (dynamic only) */ #else #define xbuf X /* (static only) */ #endif for (i = 0; i < 16; ++i, xp += 4) xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); } #endif } #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) /* Round 1. */ /* Let [abcd k s i] denote the operation a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) #define SET(a, b, c, d, k, s, Ti) \ t = a + F (b, c, d) + X[k] + Ti; \ a = ROTATE_LEFT (t, s) + b /* Do the following 16 operations. */ SET (a, b, c, d, 0, 7, T1); SET (d, a, b, c, 1, 12, T2); SET (c, d, a, b, 2, 17, T3); SET (b, c, d, a, 3, 22, T4); SET (a, b, c, d, 4, 7, T5); SET (d, a, b, c, 5, 12, T6); SET (c, d, a, b, 6, 17, T7); SET (b, c, d, a, 7, 22, T8); SET (a, b, c, d, 8, 7, T9); SET (d, a, b, c, 9, 12, T10); SET (c, d, a, b, 10, 17, T11); SET (b, c, d, a, 11, 22, T12); SET (a, b, c, d, 12, 7, T13); SET (d, a, b, c, 13, 12, T14); SET (c, d, a, b, 14, 17, T15); SET (b, c, d, a, 15, 22, T16); #undef SET /* Round 2. */ /* Let [abcd k s i] denote the operation a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) #define SET(a, b, c, d, k, s, Ti) \ t = a + G (b, c, d) + X[k] + Ti; \ a = ROTATE_LEFT (t, s) + b /* Do the following 16 operations. */ SET (a, b, c, d, 1, 5, T17); SET (d, a, b, c, 6, 9, T18); SET (c, d, a, b, 11, 14, T19); SET (b, c, d, a, 0, 20, T20); SET (a, b, c, d, 5, 5, T21); SET (d, a, b, c, 10, 9, T22); SET (c, d, a, b, 15, 14, T23); SET (b, c, d, a, 4, 20, T24); SET (a, b, c, d, 9, 5, T25); SET (d, a, b, c, 14, 9, T26); SET (c, d, a, b, 3, 14, T27); SET (b, c, d, a, 8, 20, T28); SET (a, b, c, d, 13, 5, T29); SET (d, a, b, c, 2, 9, T30); SET (c, d, a, b, 7, 14, T31); SET (b, c, d, a, 12, 20, T32); #undef SET /* Round 3. */ /* Let [abcd k s t] denote the operation a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ #define H(x, y, z) ((x) ^ (y) ^ (z)) #define SET(a, b, c, d, k, s, Ti) \ t = a + H (b, c, d) + X[k] + Ti; \ a = ROTATE_LEFT (t, s) + b /* Do the following 16 operations. */ SET (a, b, c, d, 5, 4, T33); SET (d, a, b, c, 8, 11, T34); SET (c, d, a, b, 11, 16, T35); SET (b, c, d, a, 14, 23, T36); SET (a, b, c, d, 1, 4, T37); SET (d, a, b, c, 4, 11, T38); SET (c, d, a, b, 7, 16, T39); SET (b, c, d, a, 10, 23, T40); SET (a, b, c, d, 13, 4, T41); SET (d, a, b, c, 0, 11, T42); SET (c, d, a, b, 3, 16, T43); SET (b, c, d, a, 6, 23, T44); SET (a, b, c, d, 9, 4, T45); SET (d, a, b, c, 12, 11, T46); SET (c, d, a, b, 15, 16, T47); SET (b, c, d, a, 2, 23, T48); #undef SET /* Round 4. */ /* Let [abcd k s t] denote the operation a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ #define I(x, y, z) ((y) ^ ((x) | ~(z))) #define SET(a, b, c, d, k, s, Ti) \ t = a + I (b, c, d) + X[k] + Ti; \ a = ROTATE_LEFT (t, s) + b /* Do the following 16 operations. */ SET (a, b, c, d, 0, 6, T49); SET (d, a, b, c, 7, 10, T50); SET (c, d, a, b, 14, 15, T51); SET (b, c, d, a, 5, 21, T52); SET (a, b, c, d, 12, 6, T53); SET (d, a, b, c, 3, 10, T54); SET (c, d, a, b, 10, 15, T55); SET (b, c, d, a, 1, 21, T56); SET (a, b, c, d, 8, 6, T57); SET (d, a, b, c, 15, 10, T58); SET (c, d, a, b, 6, 15, T59); SET (b, c, d, a, 13, 21, T60); SET (a, b, c, d, 4, 6, T61); SET (d, a, b, c, 11, 10, T62); SET (c, d, a, b, 2, 15, T63); SET (b, c, d, a, 9, 21, T64); #undef SET /* Then perform the following additions. (That is increment each of the four registers by the value it had before this block was started.) */ md5->abcd[0] += a; md5->abcd[1] += b; md5->abcd[2] += c; md5->abcd[3] += d; } void mcommon_md5_init (bson_md5_t *pms) { pms->count[0] = pms->count[1] = 0; pms->abcd[0] = 0x67452301; pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; pms->abcd[3] = 0x10325476; } void mcommon_md5_append (bson_md5_t *pms, const uint8_t *data, uint32_t nbytes) { const uint8_t *p = data; int left = nbytes; int offset = (pms->count[0] >> 3) & 63; uint32_t nbits = (uint32_t) (nbytes << 3); if (nbytes <= 0) return; /* Update the message length. */ pms->count[1] += nbytes >> 29; pms->count[0] += nbits; if (pms->count[0] < nbits) pms->count[1]++; /* Process an initial partial block. */ if (offset) { int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); memcpy (pms->buf + offset, p, copy); if (offset + copy < 64) return; p += copy; left -= copy; bson_md5_process (pms, pms->buf); } /* Process full blocks. */ for (; left >= 64; p += 64, left -= 64) bson_md5_process (pms, p); /* Process a final partial block. */ if (left) memcpy (pms->buf, p, left); } void mcommon_md5_finish (bson_md5_t *pms, uint8_t digest[16]) { static const uint8_t pad[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint8_t data[8]; int i; /* Save the length before padding. */ for (i = 0; i < 8; ++i) data[i] = (uint8_t) (pms->count[i >> 2] >> ((i & 3) << 3)); /* Pad to 56 bytes mod 64. */ mcommon_md5_append (pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); /* Append the length. */ mcommon_md5_append (pms, data, sizeof (data)); for (i = 0; i < 16; ++i) digest[i] = (uint8_t) (pms->abcd[i >> 2] >> ((i & 3) << 3)); } mongo-c-driver-1.26.0/src/common/common-prelude.h000066400000000000000000000021051456567454500216310ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(MONGOC_INSIDE) && !defined(MONGOC_COMPILATION) && \ !defined(BSON_COMPILATION) && !defined(BSON_INSIDE) #error "Only or can be included directly." #endif #define COMMON_NAME_1(a, b) COMMON_NAME_2 (a, b) #define COMMON_NAME_2(a, b) a##_##b #if defined(MCOMMON_NAME_PREFIX) && !defined(__INTELLISENSE__) #define COMMON_NAME(Name) COMMON_NAME_1 (MCOMMON_NAME_PREFIX, Name) #else #define COMMON_NAME(Name) COMMON_NAME_1 (mcommon, Name) #endif mongo-c-driver-1.26.0/src/common/common-thread-private.h000066400000000000000000000170421456567454500231160ustar00rootroot00000000000000/* * Copyright 2013-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "common-prelude.h" #include "common-config.h" #include "common-macros-private.h" #ifndef COMMON_THREAD_PRIVATE_H #define COMMON_THREAD_PRIVATE_H #define BSON_INSIDE #include "bson/bson-compat.h" #include "bson/bson-config.h" #include "bson/bson-macros.h" #undef BSON_INSIDE BSON_BEGIN_DECLS #define mcommon_thread_create COMMON_NAME (thread_create) #define mcommon_thread_join COMMON_NAME (thread_join) #if defined(BSON_OS_UNIX) #include #define BSON_ONCE_FUN(n) void n (void) #define BSON_ONCE_RETURN return #define BSON_ONCE_INIT PTHREAD_ONCE_INIT #define bson_once(o, c) \ do { \ BSON_ASSERT (pthread_once ((o), (c)) == 0); \ } while (0) #define bson_once_t pthread_once_t #define bson_thread_t pthread_t #define BSON_THREAD_FUN(_function_name, _arg_name) \ void *(_function_name) (void *(_arg_name)) #define BSON_THREAD_FUN_TYPE(_function_name) void *(*(_function_name)) (void *) #define BSON_THREAD_RETURN return NULL /* this macro can be defined as a as a build configuration option * with -DENABLE_DEBUG_ASSERTIONS=ON. its purpose is to allow for functions * that require a mutex to be locked on entry to assert that the mutex * is actually locked. * this can prevent bugs where a caller forgets to lock the mutex. */ #ifndef MONGOC_ENABLE_DEBUG_ASSERTIONS #define bson_mutex_destroy(m) \ do { \ BSON_ASSERT (pthread_mutex_destroy ((m)) == 0); \ } while (0) #define bson_mutex_init(_n) \ do { \ BSON_ASSERT (pthread_mutex_init ((_n), NULL) == 0); \ } while (0) #define bson_mutex_lock(m) \ do { \ BSON_ASSERT (pthread_mutex_lock ((m)) == 0); \ } while (0) #define bson_mutex_t pthread_mutex_t #define bson_mutex_unlock(m) \ do { \ BSON_ASSERT (pthread_mutex_unlock ((m)) == 0); \ } while (0) #else typedef struct { pthread_t lock_owner; pthread_mutex_t wrapped_mutex; bool valid_tid; } bson_mutex_t; #define bson_mutex_destroy(mutex) \ do { \ BSON_ASSERT (pthread_mutex_destroy (&(mutex)->wrapped_mutex) == 0); \ } while (0); #define bson_mutex_init(mutex) \ do { \ BSON_ASSERT (pthread_mutex_init (&(mutex)->wrapped_mutex, NULL) == 0); \ (mutex)->valid_tid = false; \ } while (0); #define bson_mutex_lock(mutex) \ do { \ BSON_ASSERT (pthread_mutex_lock (&(mutex)->wrapped_mutex) == 0); \ (mutex)->lock_owner = pthread_self (); \ (mutex)->valid_tid = true; \ } while (0); #define bson_mutex_unlock(mutex) \ do { \ (mutex)->valid_tid = false; \ BSON_ASSERT (pthread_mutex_unlock (&(mutex)->wrapped_mutex) == 0); \ } while (0); #endif #else #include #define BSON_ONCE_FUN(n) \ BOOL CALLBACK n (PINIT_ONCE _ignored_a, PVOID _ignored_b, PVOID *_ignored_c) #define BSON_ONCE_INIT INIT_ONCE_STATIC_INIT #define BSON_ONCE_RETURN return true #define bson_mutex_destroy DeleteCriticalSection #define bson_mutex_init InitializeCriticalSection #define bson_mutex_lock EnterCriticalSection #define bson_mutex_t CRITICAL_SECTION #define bson_mutex_unlock LeaveCriticalSection #define bson_once(o, c) \ do { \ BSON_ASSERT (InitOnceExecuteOnce ((o), (c), NULL, NULL)); \ } while (0) #define bson_once_t INIT_ONCE #define bson_thread_t HANDLE #define BSON_THREAD_FUN(_function_name, _arg_name) \ unsigned (__stdcall _function_name) (void *(_arg_name)) #define BSON_THREAD_FUN_TYPE(_function_name) \ unsigned (__stdcall * _function_name) (void *) #define BSON_THREAD_RETURN return 0 #endif /* Functions that require definitions get the common prefix (_mongoc for * libmongoc or _bson for libbson) to avoid duplicate symbols when linking both * libbson and libmongoc statically. */ int mcommon_thread_join (bson_thread_t thread); // mcommon_thread_create returns 0 on success. Returns a non-zero error code on // error. Callers may use `bson_strerror_r` to get an error message from the // returned error code. int mcommon_thread_create (bson_thread_t *thread, BSON_THREAD_FUN_TYPE (func), void *arg); #if defined(MONGOC_ENABLE_DEBUG_ASSERTIONS) && defined(BSON_OS_UNIX) #define mcommon_mutex_is_locked COMMON_NAME (mutex_is_locked) bool mcommon_mutex_is_locked (bson_mutex_t *mutex); #endif /** * @brief A shared mutex (a read-write lock) * * A shared mutex can be locked in 'shared' mode or 'exclusive' mode. Only one * thread may hold exclusive mode at a time. Any number of threads may hold * the lock in shared mode simultaneously. No thread can hold in exclusive mode * while another thread holds in shared mode, and vice-versa. */ typedef struct bson_shared_mutex_t { BSON_IF_WINDOWS (SRWLOCK native;) BSON_IF_POSIX (pthread_rwlock_t native;) } bson_shared_mutex_t; static BSON_INLINE void bson_shared_mutex_init (bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS (InitializeSRWLock (&mtx->native)); BSON_IF_POSIX (BSON_ASSERT (pthread_rwlock_init (&mtx->native, NULL) == 0);) } static BSON_INLINE void bson_shared_mutex_destroy (bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS ((void) mtx;) BSON_IF_POSIX (BSON_ASSERT (pthread_rwlock_destroy (&mtx->native) == 0);) } static BSON_INLINE void bson_shared_mutex_lock_shared (bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS (AcquireSRWLockShared (&mtx->native);) BSON_IF_POSIX (BSON_ASSERT (pthread_rwlock_rdlock (&mtx->native) == 0);) } static BSON_INLINE void bson_shared_mutex_lock (bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS (AcquireSRWLockExclusive (&mtx->native);) BSON_IF_POSIX (BSON_ASSERT (pthread_rwlock_wrlock (&mtx->native) == 0);) } static BSON_INLINE void bson_shared_mutex_unlock (bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS (ReleaseSRWLockExclusive (&mtx->native);) BSON_IF_POSIX (BSON_ASSERT (pthread_rwlock_unlock (&mtx->native) == 0);) } static BSON_INLINE void bson_shared_mutex_unlock_shared (bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS (ReleaseSRWLockShared (&mtx->native);) BSON_IF_POSIX (BSON_ASSERT (pthread_rwlock_unlock (&mtx->native) == 0);) } BSON_END_DECLS #endif /* COMMON_THREAD_PRIVATE_H */ mongo-c-driver-1.26.0/src/common/common-thread.c000066400000000000000000000037671456567454500214520ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "common-thread-private.h" #include #if defined(BSON_OS_UNIX) int mcommon_thread_create (bson_thread_t *thread, BSON_THREAD_FUN_TYPE (func), void *arg) { BSON_ASSERT_PARAM (thread); BSON_ASSERT_PARAM (func); BSON_ASSERT (arg || true); // optional. return pthread_create (thread, NULL, func, arg); } int mcommon_thread_join (bson_thread_t thread) { return pthread_join (thread, NULL); } #if defined(MONGOC_ENABLE_DEBUG_ASSERTIONS) && defined(BSON_OS_UNIX) bool mcommon_mutex_is_locked (bson_mutex_t *mutex) { return mutex->valid_tid && pthread_equal (pthread_self (), mutex->lock_owner); } #endif #else int mcommon_thread_create (bson_thread_t *thread, BSON_THREAD_FUN_TYPE (func), void *arg) { BSON_ASSERT_PARAM (thread); BSON_ASSERT_PARAM (func); BSON_ASSERT (arg || true); // optional. *thread = (HANDLE) _beginthreadex (NULL, 0, func, arg, 0, NULL); if (0 == *thread) { return errno; } return 0; } int mcommon_thread_join (bson_thread_t thread) { int ret; /* zero indicates success for WaitForSingleObject. */ ret = WaitForSingleObject (thread, INFINITE); if (WAIT_OBJECT_0 != ret) { return ret; } /* zero indicates failure for CloseHandle. */ ret = CloseHandle (thread); if (0 == ret) { return 1; } return 0; } #endif mongo-c-driver-1.26.0/src/cpp-check.cpp000066400000000000000000000002571456567454500176110ustar00rootroot00000000000000/** * The sole purpose of this file is to check that the mongoc headers can be * included in a C++ file without error. */ #include #include mongo-c-driver-1.26.0/src/kms-message/000077500000000000000000000000001456567454500174605ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/.gitattributes000066400000000000000000000000151456567454500223470ustar00rootroot00000000000000*.bin binary mongo-c-driver-1.26.0/src/kms-message/CMakeLists.txt000066400000000000000000000237461456567454500222340ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.5) project (kms_message VERSION 0.0.1 LANGUAGES C ) set (CMAKE_C_STANDARD 90) include (CheckCCompilerFlag) # All targets obey visibility, not just library targets. cmake_policy (SET CMP0063 NEW) set (CMAKE_C_VISIBILITY_PRESET hidden) set (KMS_MESSAGE_SOURCES src/kms_b64.c src/kms_message/kms_b64.h src/hexlify.c src/hexlify.h src/kms_azure_request.c src/kms_crypto.h src/kms_crypto_none.c src/kms_crypto_windows.c src/kms_crypto_apple.c src/kms_crypto_libcrypto.c src/kms_caller_identity_request.c src/kms_decrypt_request.c src/kms_encrypt_request.c src/kms_gcp_request.c src/kms_kmip_reader_writer.c src/kms_kmip_request.c src/kms_kmip_response.c src/kms_kmip_response_parser.c src/kms_kv_list.c src/kms_kv_list.h src/kms_message.c src/kms_port.c src/kms_message/kms_azure_request.h src/kms_message/kms_caller_identity_request.h src/kms_message/kms_decrypt_request.h src/kms_message/kms_encrypt_request.h src/kms_message/kms_gcp_request.h src/kms_message/kms_message.h src/kms_message/kms_request.h src/kms_message/kms_request_opt.h src/kms_message/kms_response.h src/kms_message/kms_response_parser.h src/kms_request.c src/kms_request_opt.c src/kms_request_opt_private.h src/kms_request_str.c src/kms_request_str.h src/kms_response.c src/kms_response_parser.c src/sort.c ) if (DISABLE_NATIVE_CRYPTO) # Nothing elseif (WIN32) set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_ENABLE_CRYPTO" "KMS_MESSAGE_ENABLE_CRYPTO_CNG") elseif (APPLE) set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_ENABLE_CRYPTO" "KMS_MESSAGE_ENABLE_CRYPTO_COMMON_CRYPTO") else() set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_ENABLE_CRYPTO" "KMS_MESSAGE_ENABLE_CRYPTO_LIBCRYPTO") endif() include (CheckSymbolExists) CHECK_SYMBOL_EXISTS (gmtime_r time.h KMS_MESSAGE_HAVE_GMTIME_R) if (KMS_MESSAGE_HAVE_GMTIME_R) set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_HAVE_GMTIME_R") endif () include (TestBigEndian) TEST_BIG_ENDIAN (KMS_BIG_ENDIAN) if (KMS_BIG_ENDIAN) message ("Detected byte order: big endian") set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_BIG_ENDIAN") else () message ("Detected byte order: little endian") set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_LITTLE_ENDIAN") endif () add_library ( kms_message SHARED ${KMS_MESSAGE_SOURCES} ) add_library ( kms_message_static STATIC ${KMS_MESSAGE_SOURCES} ) string(FIND "${CMAKE_C_FLAGS}" "-fPIC" FPIC_LOCATION) if (NOT WIN32 AND ENABLE_PIC AND "${FPIC_LOCATION}" EQUAL "-1") target_compile_options (kms_message_static PUBLIC -fPIC) message ("Adding -fPIC to compilation of kms_message_static components") endif () add_library ( kms_message_obj OBJECT ${KMS_MESSAGE_SOURCES} ) target_compile_definitions (kms_message_obj PRIVATE ${KMS_MESSAGE_DEFINITIONS}) if (NOT DISABLE_NATIVE_CRYPTO) if (WIN32) target_link_libraries(kms_message "bcrypt" "crypt32") target_link_libraries(kms_message_static "bcrypt" "crypt32") elseif (APPLE) target_link_libraries (kms_message "-framework Security -framework CoreFoundation") target_link_libraries (kms_message_static "-framework Security -framework CoreFoundation") else() include (FindOpenSSL) target_link_libraries(kms_message "${OPENSSL_LIBRARIES}") target_include_directories(kms_message SYSTEM PRIVATE "${OPENSSL_INCLUDE_DIR}") target_link_libraries(kms_message_static "${OPENSSL_LIBRARIES}") target_include_directories(kms_message_static SYSTEM PRIVATE "${OPENSSL_INCLUDE_DIR}") endif() endif () if ( CMAKE_COMPILER_IS_GNUCC ) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-unused-function -Wsign-compare") endif() if ( MSVC ) # W4273 - inconsistent dll linkage # W4996 - POSIX name for this item is deprecated set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /wd4273 /wd4996 /D_CRT_SECURE_NO_WARNINGS") endif() set_target_properties (kms_message PROPERTIES SOVERSION 0 VERSION "0.0.0" OUTPUT_NAME "kms_message" ) set_target_properties (kms_message_static PROPERTIES SOVERSION 0 VERSION "0.0.0" OUTPUT_NAME "kms_message-static" ) target_compile_definitions (kms_message PRIVATE KMS_MSG_COMPILATION) target_compile_definitions (kms_message PRIVATE ${KMS_MESSAGE_DEFINITIONS}) set_property (TARGET kms_message APPEND PROPERTY COMPATIBLE_INTERFACE_STRING kms_message_MAJOR_VERSION ) target_compile_definitions (kms_message_static PRIVATE KMS_MSG_COMPILATION) target_compile_definitions (kms_message_static PRIVATE ${KMS_MESSAGE_DEFINITIONS}) target_compile_definitions (kms_message_static PUBLIC KMS_MSG_STATIC) set_property (TARGET kms_message_static APPEND PROPERTY COMPATIBLE_INTERFACE_STRING kms_message_MAJOR_VERSION ) include (CMakePackageConfigHelpers) if (ENABLE_STATIC) set (TARGETS_TO_INSTALL kms_message kms_message_static) else () set (TARGETS_TO_INSTALL kms_message) endif () install ( TARGETS ${TARGETS_TO_INSTALL} EXPORT kms_message_targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install ( FILES src/kms_message/kms_azure_request.h src/kms_message/kms_b64.h src/kms_message/kms_caller_identity_request.h src/kms_message/kms_decrypt_request.h src/kms_message/kms_encrypt_request.h src/kms_message/kms_gcp_request.h src/kms_message/kms_message.h src/kms_message/kms_message_defines.h src/kms_message/kms_kmip_request.h src/kms_message/kms_kmip_response.h src/kms_message/kms_kmip_response_parser.h src/kms_message/kms_request.h src/kms_message/kms_request_opt.h src/kms_message/kms_response.h src/kms_message/kms_response_parser.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/kms_message COMPONENT Devel ) include (CMakePackageConfigHelpers) write_basic_package_version_file ( "${CMAKE_CURRENT_BINARY_DIR}/kms_message/kms_message-config-version.cmake" VERSION 0.0.1 COMPATIBILITY AnyNewerVersion ) export (EXPORT kms_message_targets NAMESPACE mongo:: FILE "${CMAKE_CURRENT_BINARY_DIR}/kms_message/kms_message_targets.cmake" ) configure_file (cmake/kms_message-config.cmake "${CMAKE_CURRENT_BINARY_DIR}/kms_message/kms_message-config.cmake" COPYONLY ) set (ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/kms_message) install (EXPORT kms_message_targets NAMESPACE mongo:: FILE kms_message_targets.cmake DESTINATION ${ConfigPackageLocation} ) install ( FILES cmake/kms_message-config.cmake "${CMAKE_CURRENT_BINARY_DIR}/kms_message/kms_message-config-version.cmake" DESTINATION ${ConfigPackageLocation} COMPONENT Devel ) # pkg-config. set (PKG_CONFIG_LIBDIR "\${prefix}/${CMAKE_INSTALL_LIBDIR}") set (PKG_CONFIG_INCLUDEDIR "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") set (PKG_CONFIG_LIBS "-L\${libdir} -lkms_message") set (PKG_CONFIG_CFLAGS "-I\${includedir}") configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/libkms_message.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libkms_message.pc" ) install ( FILES "${CMAKE_CURRENT_BINARY_DIR}/libkms_message.pc" DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) # cannot run tests without crypto if (NOT DISABLE_NATIVE_CRYPTO) add_executable ( test_kms_request ${KMS_MESSAGE_SOURCES} test/test_kms_request.c test/test_kmip_reader_writer.c test/test_kms_util.c test/test_kms_kmip_request.c test/test_kms_kmip_response_parser.c test/test_kms_kmip_response.c ) target_include_directories(test_kms_request PRIVATE ${PROJECT_SOURCE_DIR}/src) target_compile_definitions(test_kms_request PRIVATE ${KMS_MESSAGE_DEFINITIONS}) if (WIN32) target_link_libraries(test_kms_request "bcrypt" "crypt32") elseif (APPLE) target_link_libraries (test_kms_request "-framework Security -framework CoreFoundation") else() include (FindOpenSSL) target_link_libraries(test_kms_request "${OPENSSL_LIBRARIES}") target_include_directories(test_kms_request SYSTEM PRIVATE "${OPENSSL_INCLUDE_DIR}") endif() add_test ( NAME test_kms_request COMMAND test_kms_request WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) endif () # build online_tests if OpenSSL is available (to create TLS connections). if(DISABLE_NATIVE_CRYPTO) message ("test_kms_azure_online target disabled: Not building with native crypto.") elseif(ENABLE_ONLINE_TESTS) add_executable(test_kms_azure_online test/test_kms_azure_online.c test/test_kms_util.c test/test_kms_online_util.c) target_include_directories(test_kms_azure_online PRIVATE ${PROJECT_SOURCE_DIR}/src) target_compile_definitions(test_kms_azure_online PRIVATE ${KMS_MESSAGE_DEFINITIONS}) target_link_libraries(test_kms_azure_online _mongocrypt::mongoc) target_link_libraries(test_kms_azure_online kms_message_static) add_test ( NAME test_kms_azure_online COMMAND test_kms_azure_online WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) add_executable(test_kms_gcp_online test/test_kms_gcp_online.c test/test_kms_util.c test/test_kms_online_util.c) target_include_directories(test_kms_gcp_online PRIVATE ${PROJECT_SOURCE_DIR}/src) target_compile_definitions(test_kms_gcp_online PRIVATE ${KMS_MESSAGE_DEFINITIONS}) target_link_libraries(test_kms_gcp_online _mongocrypt::mongoc) target_link_libraries(test_kms_gcp_online kms_message_static) add_test ( NAME test_kms_gcp_online COMMAND test_kms_gcp_online WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) set_tests_properties ( test_kms_gcp_online test_kms_azure_online PROPERTIES SKIP_REGULAR_EXPRESSION "@@ctest-skip@@" # Older CMake (<3.16) does not support skipping via regex, so we'll use the # less-expressive skip-retcode. SKIP_RETURN_CODE 2 ) endif () mongo-c-driver-1.26.0/src/kms-message/COPYING000066400000000000000000000236761456567454500205310ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS mongo-c-driver-1.26.0/src/kms-message/README.md000066400000000000000000000040111456567454500207330ustar00rootroot00000000000000# kms-message Library used to generate requests for: - Amazon Web Services Key Management Service (KMS) - Azure Key Vault This library is *not* a complete implementation of a KMS client, it only implements the request format. ## Testing kms-message - `test_kms_request` tests HTTP request generation and response parsing, but does not require internet or use any live servers. - `test_kms_azure_online` makes live requests, and has additional requirements (must have working credentials). ### Requirements - A complete installation of the C driver. (libbson is needed for parsing JSON, and libmongoc is used for creating TLS streams). See http://mongoc.org/libmongoc/current/installing.html for installation instructions. For macOS, `brew install mongo-c-driver` will suffice. - An Azure key vault, and a service principal with an access policy allowing encrypt / decrypt key operations. The following environment variables must be set: - AZURE_TENANT_ID - AZURE_CLIENT_ID - AZURE_CLIENT_SECRET - AZURE_KEY_URL (e.g. `https://key-vault-kevinalbs.vault.azure.net/keys/test-key/9e1159e6ee5b447ba17e850b779bf652`) ### Building Configure and build with cmake: ``` mkdir cmake-build cd cmake-build cmake .. cmake --build . --target all ``` If the C driver is installed in a non-default location, specify the location with `-DCMAKE_PREFIX_PATH=...`. To build tests with verbose (and insecure) tracing, define `TEST_TRACING_INSECURE` in compiler flags by specifying `-DCMAKE_C_FLAGS="-DTEST_TRACING_INSECURE"` on cmake configuration. Recommended: compile tests with address sanitizer (use a relatively new gcc / clang compiler) by specifying `-fsanitize=address` in the C flags. This can be done by specifygin `-DCMAKE_C_FLAGS="-fsanitize=address"` as an option to cmake. Enable leak detection with the environment variable `ASAN_OPTIONS='detect_leaks=1'. Example: ``` cd cmake-build cmake -DCMAKE_C_FLAGS="-fsanitize=address -DTEST_TRACING_INSECURE" export ASAN_OPTIONS='detect_leaks=1' ./cmake-build/kms-message/test_kms_azure_online ``` mongo-c-driver-1.26.0/src/kms-message/THIRD_PARTY_NOTICES000066400000000000000000000042751456567454500224300ustar00rootroot00000000000000License notice for kms_b64.c ------------------------------------------------------------------------------- ISC License Copyright: 1996, 1998 Internet Software Consortium 1995 International Business Machines, Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Portions Copyright (c) 1995 by International Business Machines, Inc. International Business Machines, Inc. (hereinafter called IBM) grants permission under its copyrights to use, copy, modify, and distribute this Software with or without fee, provided that the above copyright notice and all paragraphs of this notice appear in all copies, and that the name of IBM not be used in connection with the marketing of any product incorporating the Software or modifications thereof, without specific, written prior permission. To the extent it has a right to do so, IBM grants an immunity from suit under its patents, if any, for the use, sale or manufacture of products to the extent that such products are used for performing Domain Name System dynamic updates in TCP/IP networks by means of the Software. No immunity is granted for any product per se or for any other function of any product. THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/000077500000000000000000000000001456567454500234655ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/LICENSE000077500000000000000000000261361456567454500245050ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/NOTICE000077500000000000000000000001531456567454500243730ustar00rootroot00000000000000AWS Signature Version 4 Test Suite Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicate/000077500000000000000000000000001456567454500302305ustar00rootroot00000000000000get-header-key-duplicate.authz000077500000000000000000000003051456567454500357720ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c9d5ea9f3f72853aea855b47ea873832890dbdd183b4468f858259531a5138eaget-header-key-duplicate.creq000077500000000000000000000002721456567454500355740ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateGET / host:example.amazonaws.com my-header1:value2,value2,value1 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-header-key-duplicate.req000077500000000000000000000001731456567454500354310ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value2 My-Header1:value2 My-Header1:value1 X-Amz-Date:20150830T123600Zget-header-key-duplicate.sreq000077500000000000000000000005201456567454500356100ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value2 My-Header1:value2 My-Header1:value1 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c9d5ea9f3f72853aea855b47ea873832890dbdd183b4468f858259531a5138eaget-header-key-duplicate.sts000077500000000000000000000002121456567454500354450ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request dc7f04a3abfde8d472b0ab1a418b741b7c67174dad1551b4117b15527fbe966cmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-multiline/000077500000000000000000000000001456567454500306045ustar00rootroot00000000000000get-header-value-multiline.authz000077500000000000000000000003051456567454500367220ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=ba17b383a53190154eb5fa66a1b836cc297cc0a3d70a5d00705980573d8ff790get-header-value-multiline.creq000077500000000000000000000002721456567454500365240ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineGET / host:example.amazonaws.com my-header1:value1,value2,value3 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-header-value-multiline.req000077500000000000000000000001541456567454500363600ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value1 value2 value3 X-Amz-Date:20150830T123600Zget-header-value-multiline.sreq000077500000000000000000000005011456567454500365370ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value1 value2 value3 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=ba17b383a53190154eb5fa66a1b836cc297cc0a3d70a5d00705980573d8ff790get-header-value-multiline.sts000077500000000000000000000002121456567454500363750ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request b7b6cbfd8a0430b78891e986784da2630c8a135a8595cec25b26ea94f926ee55mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-order/000077500000000000000000000000001456567454500277155ustar00rootroot00000000000000get-header-value-order.authz000077500000000000000000000003051456567454500351440ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=08c7e5a9acfcfeb3ab6b2185e75ce8b1deb5e634ec47601a50643f830c755c01get-header-value-order.creq000077500000000000000000000003011456567454500347370ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderGET / host:example.amazonaws.com my-header1:value4,value1,value3,value2 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-header-value-order.req000077500000000000000000000002151456567454500346000ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value4 My-Header1:value1 My-Header1:value3 My-Header1:value2 X-Amz-Date:20150830T123600Zget-header-value-order.sreq000077500000000000000000000005421456567454500347660ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value4 My-Header1:value1 My-Header1:value3 My-Header1:value2 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=08c7e5a9acfcfeb3ab6b2185e75ce8b1deb5e634ec47601a50643f830c755c01get-header-value-order.sts000077500000000000000000000002121456567454500346170ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 31ce73cd3f3d9f66977ad3dd957dc47af14df92fcd8509f59b349e9137c58b86mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-trim/000077500000000000000000000000001456567454500275555ustar00rootroot00000000000000get-header-value-trim.authz000077500000000000000000000003201456567454500346410ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;my-header2;x-amz-date, Signature=acc3ed3afb60bb290fc8d2dd0098b9911fcaa05412b367055dee359757a9c736get-header-value-trim.creq000077500000000000000000000003121456567454500344410ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimGET / host:example.amazonaws.com my-header1:value1 my-header2:"a b c" x-amz-date:20150830T123600Z host;my-header1;my-header2;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-header-value-trim.req000077500000000000000000000001601456567454500342770ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimGET / HTTP/1.1 Host:example.amazonaws.com My-Header1: value1 My-Header2: "a b c" X-Amz-Date:20150830T123600Zget-header-value-trim.sreq000077500000000000000000000005201456567454500344620ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimGET / HTTP/1.1 Host:example.amazonaws.com My-Header1: value1 My-Header2: "a b c" X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;my-header2;x-amz-date, Signature=acc3ed3afb60bb290fc8d2dd0098b9911fcaa05412b367055dee359757a9c736get-header-value-trim.sts000077500000000000000000000002121456567454500343170ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request a726db9b0df21c14f559d0a978e563112acb1b9e05476f0a6a1c7d68f28605c7mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-unreserved/000077500000000000000000000000001456567454500264245ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.authz000077500000000000000000000002721456567454500324440ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=07ef7494c76fa4850883e2b006601f940f8a34d404d0cfa977f52a65bbf5f24fmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.creq000077500000000000000000000003211456567454500322360ustar00rootroot00000000000000GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.req000077500000000000000000000002071456567454500320760ustar00rootroot00000000000000GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.sreq000077500000000000000000000005211456567454500322600ustar00rootroot00000000000000GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=07ef7494c76fa4850883e2b006601f940f8a34d404d0cfa977f52a65bbf5f24fmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.sts000077500000000000000000000002121456567454500321140ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 6a968768eefaa713e2a6b16b589a8ea192661f098f37349f4e2c0082757446f9mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-utf8/000077500000000000000000000000001456567454500251305ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.authz000077500000000000000000000002721456567454500276540ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8318018e0b0f223aa2bbf98705b62bb787dc9c0e678f255a891fd03141be5d85mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.creq000077500000000000000000000002301456567454500274450ustar00rootroot00000000000000GET /%E1%88%B4 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.req000077500000000000000000000001101456567454500272770ustar00rootroot00000000000000GET /ሴ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.sreq000077500000000000000000000004221456567454500274700ustar00rootroot00000000000000GET /ሴ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8318018e0b0f223aa2bbf98705b62bb787dc9c0e678f255a891fd03141be5d85mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.sts000077500000000000000000000002121456567454500273240ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 2a0a97d02205e45ce2e994789806b19270cfbbb0921b278ccf58f5249ac42102mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-key/000077500000000000000000000000001456567454500307555ustar00rootroot00000000000000get-vanilla-empty-query-key.authz000077500000000000000000000002721456567454500372470ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=a67d582fa61cc504c4bae71f336f98b97f1ea3c7a6bfe1b6e45aec72011b9aebget-vanilla-empty-query-key.creq000077500000000000000000000002341456567454500370440ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyGET / Param1=value1 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-empty-query-key.req000077500000000000000000000001231456567454500366760ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyGET /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-empty-query-key.sreq000077500000000000000000000004351456567454500370670ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyGET /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=a67d582fa61cc504c4bae71f336f98b97f1ea3c7a6bfe1b6e45aec72011b9aebget-vanilla-empty-query-key.sts000077500000000000000000000002121456567454500367170ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 1e24db194ed7d0eec2de28d7369675a243488e08526e8c1c73571282f7c517abmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/000077500000000000000000000000001456567454500316435ustar00rootroot00000000000000get-vanilla-query-order-key-case.authz000077500000000000000000000002721456567454500410230ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500get-vanilla-query-order-key-case.creq000077500000000000000000000002521456567454500406200ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseGET / Param1=value1&Param2=value2 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-query-order-key-case.req000077500000000000000000000001411456567454500404520ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseGET /?Param2=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-query-order-key-case.sreq000077500000000000000000000004531456567454500406430ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseGET /?Param2=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500get-vanilla-query-order-key-case.sts000077500000000000000000000002121456567454500404730ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 816cd5b414d056048ba4f7c5386d6e0533120fb1fcfa93762cf0fc39e2cf19e0mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key/000077500000000000000000000000001456567454500307325ustar00rootroot00000000000000get-vanilla-query-order-key.authz000077500000000000000000000002721456567454500372010ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=eedbc4e291e521cf13422ffca22be7d2eb8146eecf653089df300a15b2382bd1get-vanilla-query-order-key.creq000077500000000000000000000002521456567454500367760ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyGET / Param1=Value1&Param1=value2 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-query-order-key.req000077500000000000000000000001411456567454500366300ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyGET /?Param1=value2&Param1=Value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-query-order-key.sreq000077500000000000000000000004531456567454500370210ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyGET /?Param1=value2&Param1=Value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=eedbc4e291e521cf13422ffca22be7d2eb8146eecf653089df300a15b2382bd1get-vanilla-query-order-key.sts000077500000000000000000000002121456567454500366510ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 704b4cef673542d84cdff252633f065e8daeba5f168b77116f8b1bcaf3d38f89mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-value/000077500000000000000000000000001456567454500312565ustar00rootroot00000000000000get-vanilla-query-order-value.authz000077500000000000000000000002721456567454500400510ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5772eed61e12b33fae39ee5e7012498b51d56abc0abb7c60486157bd471c4694get-vanilla-query-order-value.creq000077500000000000000000000002521456567454500376460ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueGET / Param1=value1&Param1=value2 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-query-order-value.req000077500000000000000000000001411456567454500375000ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueGET /?Param1=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-query-order-value.sreq000077500000000000000000000004531456567454500376710ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueGET /?Param1=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5772eed61e12b33fae39ee5e7012498b51d56abc0abb7c60486157bd471c4694get-vanilla-query-order-value.sts000077500000000000000000000002121456567454500375210ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request c968629d70850097a2d8781c9bf7edcb988b04cac14cca9be4acc3595f884606mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreserved/000077500000000000000000000000001456567454500312135ustar00rootroot00000000000000get-vanilla-query-unreserved.authz000077500000000000000000000002721456567454500377430ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9c3e54bfcdf0b19771a7f523ee5669cdf59bc7cc0884027167c21bb143a40197get-vanilla-query-unreserved.creq000077500000000000000000000004241456567454500375410ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedGET / -._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-query-unreserved.req000077500000000000000000000003131456567454500373730ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedGET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-query-unreserved.sreq000077500000000000000000000006251456567454500375640ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedGET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9c3e54bfcdf0b19771a7f523ee5669cdf59bc7cc0884027167c21bb143a40197get-vanilla-query-unreserved.sts000077500000000000000000000002121456567454500374130ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request c30d4703d9f799439be92736156d47ccfb2d879ddf56f5befa6d1d6aab979177mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/000077500000000000000000000000001456567454500270335ustar00rootroot00000000000000get-vanilla-query.authz000077500000000000000000000002721456567454500334030ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-queryAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/get-vanilla-query.creq000077500000000000000000000002171456567454500332600ustar00rootroot00000000000000GET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/get-vanilla-query.req000077500000000000000000000001051456567454500331110ustar00rootroot00000000000000GET / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/get-vanilla-query.sreq000077500000000000000000000004171456567454500333020ustar00rootroot00000000000000GET / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/get-vanilla-query.sts000077500000000000000000000002121456567454500331320ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-query/000077500000000000000000000000001456567454500277175ustar00rootroot00000000000000get-vanilla-utf8-query.authz000077500000000000000000000002721456567454500351530ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=2cdec8eed098649ff3a119c94853b13c643bcf08f8b0a1d91e12c9027818dd04get-vanilla-utf8-query.creq000077500000000000000000000002341456567454500347500ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryGET / %E1%88%B4=bar host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-utf8-query.req000077500000000000000000000001151456567454500346030ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryGET /?ሴ=bar HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-utf8-query.sreq000077500000000000000000000004271456567454500347740ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryGET /?ሴ=bar HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=2cdec8eed098649ff3a119c94853b13c643bcf08f8b0a1d91e12c9027818dd04get-vanilla-utf8-query.sts000077500000000000000000000002121456567454500346230ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request eb30c5bed55734080471a834cc727ae56beb50e5f39d1bff6d0d38cb192a7073mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla/000077500000000000000000000000001456567454500256705ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.authz000077500000000000000000000002721456567454500311540ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.creq000077500000000000000000000002171456567454500307520ustar00rootroot00000000000000GET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.req000077500000000000000000000001051456567454500306030ustar00rootroot00000000000000GET / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.sreq000077500000000000000000000004171456567454500307740ustar00rootroot00000000000000GET / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.sts000077500000000000000000000002121456567454500306240ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/000077500000000000000000000000001456567454500264175ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relative/000077500000000000000000000000001456567454500326205ustar00rootroot00000000000000get-relative-relative.authz000077500000000000000000000002721456567454500400230ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-relative-relative.creq000077500000000000000000000002171456567454500376210ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeGET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-relative-relative.req000077500000000000000000000001341456567454500374540ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeGET /example1/example2/../.. HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-relative-relative.sreq000077500000000000000000000004461456567454500376450ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeGET /example1/example2/../.. HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-relative-relative.sts000077500000000000000000000002121456567454500374730ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative/000077500000000000000000000000001456567454500310075ustar00rootroot00000000000000get-relative.authz000077500000000000000000000002721456567454500344010ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-relative.creq000077500000000000000000000002171456567454500341770ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeGET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-relative.req000077500000000000000000000001171456567454500340330ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeGET /example/.. HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-relative.sreq000077500000000000000000000004311456567454500342150ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeGET /example/.. HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-relative.sts000077500000000000000000000002121456567454500340510ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slash/000077500000000000000000000000001456567454500322025ustar00rootroot00000000000000get-slash-dot-slash.authz000077500000000000000000000002721456567454500367670ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-slash-dot-slash.creq000077500000000000000000000002171456567454500365650ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashGET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-slash-dot-slash.req000077500000000000000000000001071456567454500364200ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashGET /./ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-slash-dot-slash.sreq000077500000000000000000000004211456567454500366020ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashGET /./ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-slash-dot-slash.sts000077500000000000000000000002121456567454500364370ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dot/000077500000000000000000000000001456567454500331105ustar00rootroot00000000000000get-slash-pointless-dot.authz000077500000000000000000000002721456567454500406030ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=ef75d96142cf21edca26f06005da7988e4f8dc83a165a80865db7089db637ec5get-slash-pointless-dot.creq000077500000000000000000000002261456567454500404010ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotGET /example host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-slash-pointless-dot.req000077500000000000000000000001161456567454500402340ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotGET /./example HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-slash-pointless-dot.sreq000077500000000000000000000004301456567454500404160ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotGET /./example HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=ef75d96142cf21edca26f06005da7988e4f8dc83a165a80865db7089db637ec5get-slash-pointless-dot.sts000077500000000000000000000002121456567454500402530ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 214d50c111a8edc4819da6a636336472c916b5240f51e9a51b5c3305180cf702mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/000077500000000000000000000000001456567454500303065ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.authz000077500000000000000000000002721456567454500332560ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.creq000077500000000000000000000002171456567454500330540ustar00rootroot00000000000000GET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.req000077500000000000000000000001061456567454500327060ustar00rootroot00000000000000GET // HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.sreq000077500000000000000000000004201456567454500330700ustar00rootroot00000000000000GET // HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.sts000077500000000000000000000002121456567454500327260ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashes/000077500000000000000000000000001456567454500306365ustar00rootroot00000000000000get-slashes.authz000077500000000000000000000002721456567454500340570ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9a624bd73a37c9a373b5312afbebe7a714a789de108f0bdfe846570885f57e84get-slashes.creq000077500000000000000000000002271456567454500336560ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesGET /example/ host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-slashes.req000077500000000000000000000001171456567454500335110ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesGET //example// HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-slashes.sreq000077500000000000000000000004311456567454500336730ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesGET //example// HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9a624bd73a37c9a373b5312afbebe7a714a789de108f0bdfe846570885f57e84get-slashes.sts000077500000000000000000000002121456567454500335270ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request cb96b4ac96d501f7c5c15bc6d67b3035061cfced4af6585ad927f7e6c985c015mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/000077500000000000000000000000001456567454500302675ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.authz000077500000000000000000000002721456567454500332200ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=652487583200325589f1fba4c7e578f72c47cb61beeca81406b39ddec1366741mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.creq000077500000000000000000000002371456567454500330200ustar00rootroot00000000000000GET /example%20space/ host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.req000077500000000000000000000001231456567454500326470ustar00rootroot00000000000000GET /example space/ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.sreq000077500000000000000000000004351456567454500330400ustar00rootroot00000000000000GET /example space/ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=652487583200325589f1fba4c7e578f72c47cb61beeca81406b39ddec1366741mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.sts000077500000000000000000000002121456567454500326700ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 63ee75631ed7234ae61b5f736dfc7754cdccfedbff4b5128a915706ee9390d86mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/normalize-path/normalize-path.txt000077500000000000000000000010071456567454500321130ustar00rootroot00000000000000A note about signing requests to Amazon S3: In exception to this, you do not normalize URI paths for requests to Amazon S3. For example, if you have a bucket with an object named my-object//example//photo.user, use that path. Normalizing the path to my-object/example/photo.user will cause the request to fail. For more information, see Task 1: Create a Canonical Request in the Amazon Simple Storage Service API Reference: http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html#canonical-requestmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-case/000077500000000000000000000000001456567454500273775ustar00rootroot00000000000000post-header-key-case.authz000077500000000000000000000002721456567454500343130ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-caseAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bpost-header-key-case.creq000077500000000000000000000002201456567454500341030ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-casePOST / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-header-key-case.req000077500000000000000000000001061456567454500337430ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-casePOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zpost-header-key-case.sreq000077500000000000000000000004201456567454500341250ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-casePOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bpost-header-key-case.sts000077500000000000000000000002121456567454500337630ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-caseAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 553f88c9e4d10fc9e109e2aeb65f030801b70c2f6468faca261d401ae622fc87mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-sort/000077500000000000000000000000001456567454500274535ustar00rootroot00000000000000post-header-key-sort.authz000077500000000000000000000003051456567454500344400ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c5410059b04c1ee005303aed430f6e6645f61f4dc9e1461ec8f8916fdf18852cpost-header-key-sort.creq000077500000000000000000000002551456567454500342430ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortPOST / host:example.amazonaws.com my-header1:value1 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-header-key-sort.req000077500000000000000000000001301456567454500340700ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortPOST / HTTP/1.1 Host:example.amazonaws.com My-Header1:value1 X-Amz-Date:20150830T123600Zpost-header-key-sort.sreq000077500000000000000000000004551456567454500342650ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortPOST / HTTP/1.1 Host:example.amazonaws.com My-Header1:value1 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c5410059b04c1ee005303aed430f6e6645f61f4dc9e1461ec8f8916fdf18852cpost-header-key-sort.sts000077500000000000000000000002121456567454500341130ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 9368318c2967cf6de74404b30c65a91e8f6253e0a8659d6d5319f1a812f87d65mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-value-case/000077500000000000000000000000001456567454500277235ustar00rootroot00000000000000post-header-value-case.authz000077500000000000000000000003051456567454500351600ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-value-caseAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=cdbc9802e29d2942e5e10b5bccfdd67c5f22c7c4e8ae67b53629efa58b974b7dpost-header-value-case.creq000077500000000000000000000002551456567454500347630ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-value-casePOST / host:example.amazonaws.com my-header1:VALUE1 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-header-value-case.req000077500000000000000000000001301456567454500346100ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-value-casePOST / HTTP/1.1 Host:example.amazonaws.com My-Header1:VALUE1 X-Amz-Date:20150830T123600Zpost-header-value-case.sreq000077500000000000000000000004551456567454500350050ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-value-casePOST / HTTP/1.1 Host:example.amazonaws.com My-Header1:VALUE1 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=cdbc9802e29d2942e5e10b5bccfdd67c5f22c7c4e8ae67b53629efa58b974b7dpost-header-value-case.sts000077500000000000000000000002121456567454500346330ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-header-value-caseAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request d51ced243e649e3de6ef63afbbdcbca03131a21a7103a1583706a64618606a93mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/000077500000000000000000000000001456567454500263775ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-after/000077500000000000000000000000001456567454500325205ustar00rootroot00000000000000post-sts-header-after.authz000077500000000000000000000002721456567454500376430ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bpost-sts-header-after.creq000077500000000000000000000002201456567454500374330ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterPOST / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-sts-header-after.req000077500000000000000000000001061456567454500372730ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterPOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zpost-sts-header-after.sreq000077500000000000000000000011661456567454500374650ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterPOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bpost-sts-header-after.sts000077500000000000000000000002121456567454500373130ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 553f88c9e4d10fc9e109e2aeb65f030801b70c2f6468faca261d401ae622fc87mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-before/000077500000000000000000000000001456567454500326615ustar00rootroot00000000000000post-sts-header-before.authz000077500000000000000000000003171456567454500401450ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforeAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=85d96828115b5dc0cfc3bd16ad9e210dd772bbebba041836c64533a82be05eadpost-sts-header-before.creq000077500000000000000000000010131456567454500377360ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforePOST / host:example.amazonaws.com x-amz-date:20150830T123600Z x-amz-security-token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== host;x-amz-date;x-amz-security-token e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-sts-header-before.req000077500000000000000000000006541456567454500376050ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforePOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==post-sts-header-before.sreq000077500000000000000000000012131456567454500377600ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforePOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=85d96828115b5dc0cfc3bd16ad9e210dd772bbebba041836c64533a82be05eadpost-sts-header-before.sts000077500000000000000000000002121456567454500376150ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforeAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request c237e1b440d4c63c32ca95b5b99481081cb7b13c7e40434868e71567c1a882f6mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-sts-token/readme.txt000077500000000000000000000026361456567454500304070ustar00rootroot00000000000000A note about using temporary security credentials: You can use temporary security credentials provided by the AWS Security Token Service (AWS STS) to sign a request. The process is the same as using long-term credentials but requires an additional HTTP header or query string parameter for the security token. The name of the header or query string parameter is X-Amz-Security-Token, and the value is the session token (the string that you received from AWS STS when you obtained temporary security credentials). When you add X-Amz-Security-Token, some services require that you include this parameter in the canonical (signed) request. For other services, you add this parameter at the end, after you calculate the signature. For details see the API reference documentation for that service. The test suite has 2 examples: post-sts-header-before - The X-Amz-Security-Token header is part of the canonical request. post-sts-header-after - The X-Amz-Security-Token header is added to the request after you calculate the signature. The test suite uses this example value for X-Amz-Security-Token: AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-value/000077500000000000000000000000001456567454500315075ustar00rootroot00000000000000post-vanilla-empty-query-value.authz000077500000000000000000000002721456567454500405330ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valueAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11post-vanilla-empty-query-value.creq000077500000000000000000000002351456567454500403310ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valuePOST / Param1=value1 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-vanilla-empty-query-value.req000077500000000000000000000001241456567454500401630ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valuePOST /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zpost-vanilla-empty-query-value.sreq000077500000000000000000000004361456567454500403540ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valuePOST /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11post-vanilla-empty-query-value.sts000077500000000000000000000002121456567454500402030ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valueAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 9d659678c1756bb3113e2ce898845a0a79dbbc57b740555917687f1b3340fbbdmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-query/000077500000000000000000000000001456567454500272415ustar00rootroot00000000000000post-vanilla-query.authz000077500000000000000000000002721456567454500340170ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-queryAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11post-vanilla-query.creq000077500000000000000000000002351456567454500336150ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-queryPOST / Param1=value1 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-vanilla-query.req000077500000000000000000000001241456567454500334470ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-queryPOST /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zpost-vanilla-query.sreq000077500000000000000000000004361456567454500336400ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-queryPOST /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11post-vanilla-query.sts000077500000000000000000000002121456567454500334670ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla-queryAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 9d659678c1756bb3113e2ce898845a0a79dbbc57b740555917687f1b3340fbbdmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla/000077500000000000000000000000001456567454500260765ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.authz000077500000000000000000000002721456567454500315700ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.creq000077500000000000000000000002201456567454500313600ustar00rootroot00000000000000POST / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.req000077500000000000000000000001061456567454500312200ustar00rootroot00000000000000POST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.sreq000077500000000000000000000004201456567454500314020ustar00rootroot00000000000000POST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.sts000077500000000000000000000002121456567454500312400ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 553f88c9e4d10fc9e109e2aeb65f030801b70c2f6468faca261d401ae622fc87mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parameters/000077500000000000000000000000001456567454500327655ustar00rootroot00000000000000post-x-www-form-urlencoded-parameters.authz000077500000000000000000000003071456567454500432660ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=1a72ec8f64bd914b0e42e42607c7fbce7fb2c7465f63e3092b3b0d39fa77a6fepost-x-www-form-urlencoded-parameters.creq000077500000000000000000000003321456567454500430630ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersPOST / content-type:application/x-www-form-urlencoded; charset=utf8 host:example.amazonaws.com x-amz-date:20150830T123600Z content-type;host;x-amz-date 9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6epost-x-www-form-urlencoded-parameters.req000077500000000000000000000002221456567454500427160ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersPOST / HTTP/1.1 Content-Type:application/x-www-form-urlencoded; charset=utf8 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Param1=value1post-x-www-form-urlencoded-parameters.sreq000077500000000000000000000005511456567454500431060ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersPOST / HTTP/1.1 Content-Type:application/x-www-form-urlencoded; charset=utf8 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=1a72ec8f64bd914b0e42e42607c7fbce7fb2c7465f63e3092b3b0d39fa77a6fe Param1=value1post-x-www-form-urlencoded-parameters.sts000077500000000000000000000002121456567454500427370ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 2e1cf7ed91881a30569e46552437e4156c823447bf1781b921b5d486c568dd1cmongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded/000077500000000000000000000000001456567454500306245ustar00rootroot00000000000000post-x-www-form-urlencoded.authz000077500000000000000000000003071456567454500367640ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ff11897932ad3f4e8b18135d722051e5ac45fc38421b1da7b9d196a0fe09473apost-x-www-form-urlencoded.creq000077500000000000000000000003141456567454500365610ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedPOST / content-type:application/x-www-form-urlencoded host:example.amazonaws.com x-amz-date:20150830T123600Z content-type;host;x-amz-date 9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6epost-x-www-form-urlencoded.req000077500000000000000000000002041456567454500364140ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedPOST / HTTP/1.1 Content-Type:application/x-www-form-urlencoded Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Param1=value1post-x-www-form-urlencoded.sreq000077500000000000000000000005331456567454500366040ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedPOST / HTTP/1.1 Content-Type:application/x-www-form-urlencoded Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ff11897932ad3f4e8b18135d722051e5ac45fc38421b1da7b9d196a0fe09473a Param1=value1post-x-www-form-urlencoded.sts000077500000000000000000000002121456567454500364350ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 42a5e5bb34198acb3e84da4f085bb7927f2bc277ca766e6d19c73c2154021281mongo-c-driver-1.26.0/src/kms-message/cmake/000077500000000000000000000000001456567454500205405ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/cmake/kms_message-config.cmake000066400000000000000000000000771456567454500253070ustar00rootroot00000000000000include("${CMAKE_CURRENT_LIST_DIR}/kms_message_targets.cmake") mongo-c-driver-1.26.0/src/kms-message/cmake/libkms_message.pc.in000066400000000000000000000004141456567454500244550ustar00rootroot00000000000000Name: ${PROJECT_NAME} Description: ${PROJECT_DESCRIPTION} Version: ${PROJECT_VERSION} Requires: ${PKG_CONFIG_REQUIRES} prefix=${CMAKE_INSTALL_PREFIX} includedir=${PKG_CONFIG_INCLUDEDIR} libdir=${PKG_CONFIG_LIBDIR} Libs: ${PKG_CONFIG_LIBS} Cflags: ${PKG_CONFIG_CFLAGS} mongo-c-driver-1.26.0/src/kms-message/src/000077500000000000000000000000001456567454500202475ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/src/hexlify.c000066400000000000000000000027621456567454500220720ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message_private.h" #include #include #include #include char * hexlify (const uint8_t *buf, size_t len) { char *hex_chars = malloc (len * 2 + 1); KMS_ASSERT (hex_chars); char *p = hex_chars; size_t i; for (i = 0; i < len; i++) { p += sprintf (p, "%02x", buf[i]); } *p = '\0'; return hex_chars; } /* Returns -1 on error. */ int unhexlify (const char *in, size_t len) { int i; int byte; int total = 0; int multiplier = 1; for (i = (int) len - 1; i >= 0; i--) { char c = *(in + i); if (c >= '0' && c <= '9') { byte = c - 48; } else if (c >= 'a' && c <= 'f') { byte = c - 97 + 10; } else if (c >= 'A' && c <= 'F') { byte = c - 65 + 10; } else { return -1; } total += byte * multiplier; multiplier *= 16; } return total; } mongo-c-driver-1.26.0/src/kms-message/src/hexlify.h000066400000000000000000000013421456567454500220700ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include char * hexlify (const uint8_t *buf, size_t len); int unhexlify (const char *in, size_t len);mongo-c-driver-1.26.0/src/kms-message/src/kms_azure_request.c000066400000000000000000000155021456567454500241660ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_azure_request.h" #include "kms_message/kms_b64.h" #include "kms_message_private.h" #include "kms_request_opt_private.h" #include "kms_request_str.h" /* * Request has the following form: * * POST /{tenant ID}/oauth2/v2.0/token HTTP/1.1 * Host: {host of identify platform URL} * Content-Type: application/x-www-form-urlencoded * * client_id={client ID} * &scope=https%3A%2F%2Fvault.azure.net%2F.default * &client_secret={client secret} * &grant_type=client_credentials */ kms_request_t * kms_azure_request_oauth_new (const char *host, const char *scope, const char *tenant_id, const char *client_id, const char *client_secret, const kms_request_opt_t *opt) { char *path_and_query = NULL; char *payload = NULL; kms_request_t *req; kms_request_str_t *str; str = kms_request_str_new (); kms_request_str_appendf (str, "/%s/oauth2/v2.0/token", tenant_id); path_and_query = kms_request_str_detach (str); str = kms_request_str_new (); kms_request_str_appendf ( str, "client_id=%s&scope=%s&client_secret=%s&grant_type=client_credentials", client_id, scope, client_secret); payload = kms_request_str_detach (str); req = kms_request_new ("POST", path_and_query, opt); if (opt->provider != KMS_REQUEST_PROVIDER_AZURE) { KMS_ERROR (req, "Expected KMS request with provider type: Azure"); goto done; } if (kms_request_get_error (req)) { goto done; } if (!kms_request_add_header_field ( req, "Content-Type", "application/x-www-form-urlencoded")) { goto done; } if (!kms_request_add_header_field (req, "Host", host)) { goto done; } if (!kms_request_add_header_field (req, "Accept", "application/json")) { goto done; } if (!kms_request_append_payload (req, payload, strlen (payload))) { goto done; } done: kms_request_free_string (path_and_query); kms_request_free_string (payload); return req; } static kms_request_t * _wrap_unwrap_common (const char *wrap_unwrap, const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *value, size_t value_len, const kms_request_opt_t *opt) { char *path_and_query = NULL; char *payload = NULL; char *bearer_token_value = NULL; char *value_base64url = NULL; kms_request_t *req; kms_request_str_t *str; str = kms_request_str_new (); /* {vaultBaseUrl}/keys/{key-name}/{key-version}/wrapkey?api-version=7.1 */ kms_request_str_appendf (str, "/keys/%s/%s/%s?api-version=7.1", key_name, key_version ? key_version : "", wrap_unwrap); path_and_query = kms_request_str_detach (str); req = kms_request_new ("POST", path_and_query, opt); if (opt->provider != KMS_REQUEST_PROVIDER_AZURE) { KMS_ERROR (req, "Expected KMS request with provider type: Azure"); goto done; } if (kms_request_get_error (req)) { goto done; } value_base64url = kms_message_raw_to_b64url (value, value_len); if (!value_base64url) { KMS_ERROR (req, "Could not bases64url-encode plaintext"); goto done; } str = kms_request_str_new (); kms_request_str_appendf ( str, "{\"alg\": \"RSA-OAEP-256\", \"value\": \"%s\"}", value_base64url); payload = kms_request_str_detach (str); str = kms_request_str_new (); kms_request_str_appendf (str, "Bearer %s", access_token); bearer_token_value = kms_request_str_detach (str); if (!kms_request_add_header_field ( req, "Authorization", bearer_token_value)) { goto done; } if (!kms_request_add_header_field ( req, "Content-Type", "application/json")) { goto done; } if (!kms_request_add_header_field (req, "Host", host)) { goto done; } if (!kms_request_add_header_field (req, "Accept", "application/json")) { goto done; } if (!kms_request_append_payload (req, payload, strlen (payload))) { goto done; } done: kms_request_free_string (path_and_query); kms_request_free_string (payload); kms_request_free_string (bearer_token_value); kms_request_free_string (value_base64url); return req; } /* * Request has the following form: * * POST /keys/{key-name}/{key-version}/wrapkey?api-version=7.1 * Host: {host of key vault endpoint} * Authentication: Bearer {token} * Content-Type: application/json * * { * "alg": "RSA-OAEP-256" * "value": "base64url encoded data" * } */ kms_request_t * kms_azure_request_wrapkey_new (const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *plaintext, size_t plaintext_len, const kms_request_opt_t *opt) { return _wrap_unwrap_common ("wrapkey", host, access_token, key_name, key_version, plaintext, plaintext_len, opt); } kms_request_t * kms_azure_request_unwrapkey_new (const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *ciphertext, size_t ciphertext_len, const kms_request_opt_t *opt) { return _wrap_unwrap_common ("unwrapkey", host, access_token, key_name, key_version, ciphertext, ciphertext_len, opt); }mongo-c-driver-1.26.0/src/kms-message/src/kms_b64.c000066400000000000000000000474231456567454500216720ustar00rootroot00000000000000/* * Copyright (c) 1996, 1998 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* * Portions Copyright (c) 1995 by International Business Machines, Inc. * * International Business Machines, Inc. (hereinafter called IBM) grants * permission under its copyrights to use, copy, modify, and distribute this * Software with or without fee, provided that the above copyright notice and * all paragraphs of this notice appear in all copies, and that the name of IBM * not be used in connection with the marketing of any product incorporating * the Software or modifications thereof, without specific, written prior * permission. * * To the extent it has a right to do so, IBM grants an immunity from suit * under its patents, if any, for the use, sale or manufacture of products to * the extent that such products are used for performing Domain Name System * dynamic updates in TCP/IP networks by means of the Software. No immunity is * granted for any product per se or for any other function of any product. * * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. */ #include #include #include #include #include "kms_message/kms_b64.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) * The following encoding technique is taken from RFC 1521 by Borenstein * and Freed. It is reproduced here in a slightly edited form for * convenience. * * A 65-character subset of US-ASCII is used, enabling 6 bits to be * represented per printable character. (The extra 65th character, "=", * is used to signify a special processing function.) * * The encoding process represents 24-bit groups of input bits as output * strings of 4 encoded characters. Proceeding from left to right, a * 24-bit input group is formed by concatenating 3 8-bit input groups. * These 24 bits are then treated as 4 concatenated 6-bit groups, each * of which is translated into a single digit in the base64 alphabet. * * Each 6-bit group is used as an index into an array of 64 printable * characters. The character referenced by the index is placed in the * output string. * * Table 1: The Base64 Alphabet * * Value Encoding Value Encoding Value Encoding Value Encoding * 0 A 17 R 34 i 51 z * 1 B 18 S 35 j 52 0 * 2 C 19 T 36 k 53 1 * 3 D 20 U 37 l 54 2 * 4 E 21 V 38 m 55 3 * 5 F 22 W 39 n 56 4 * 6 G 23 X 40 o 57 5 * 7 H 24 Y 41 p 58 6 * 8 I 25 Z 42 q 59 7 * 9 J 26 a 43 r 60 8 * 10 K 27 b 44 s 61 9 * 11 L 28 c 45 t 62 + * 12 M 29 d 46 u 63 / * 13 N 30 e 47 v * 14 O 31 f 48 w (pad) = * 15 P 32 g 49 x * 16 Q 33 h 50 y * * Special processing is performed if fewer than 24 bits are available * at the end of the data being encoded. A full encoding quantum is * always completed at the end of a quantity. When fewer than 24 input * bits are available in an input group, zero bits are added (on the * right) to form an integral number of 6-bit groups. Padding at the * end of the data is performed using the '=' character. * * Since all base64 input is an integral number of octets, only the * following cases can arise: * * (1) the final quantum of encoding input is an integral * multiple of 24 bits; here, the final unit of encoded * output will be an integral multiple of 4 characters * with no "=" padding, * (2) the final quantum of encoding input is exactly 8 bits; * here, the final unit of encoded output will be two * characters followed by two "=" padding characters, or * (3) the final quantum of encoding input is exactly 16 bits; * here, the final unit of encoded output will be three * characters followed by one "=" padding character. */ int kms_message_b64_ntop (uint8_t const *src, size_t srclength, char *target, size_t targsize) { size_t datalength = 0; uint8_t input[3]; uint8_t output[4]; size_t i; while (2 < srclength) { input[0] = *src++; input[1] = *src++; input[2] = *src++; srclength -= 3; output[0] = input[0] >> 2; output[1] = (uint8_t) (((input[0] & 0x03) << 4) + (input[1] >> 4)); output[2] = (uint8_t) (((input[1] & 0x0f) << 2) + (input[2] >> 6)); output[3] = input[2] & 0x3f; KMS_ASSERT (output[0] < 64); KMS_ASSERT (output[1] < 64); KMS_ASSERT (output[2] < 64); KMS_ASSERT (output[3] < 64); if (datalength + 4 > targsize) { return -1; } target[datalength++] = Base64[output[0]]; target[datalength++] = Base64[output[1]]; target[datalength++] = Base64[output[2]]; target[datalength++] = Base64[output[3]]; } /* Now we worry about padding. */ if (0 != srclength) { /* Get what's left. */ input[0] = input[1] = input[2] = '\0'; for (i = 0; i < srclength; i++) { input[i] = *src++; } output[0] = input[0] >> 2; output[1] = (uint8_t) (((input[0] & 0x03) << 4) + (input[1] >> 4)); output[2] = (uint8_t) (((input[1] & 0x0f) << 2) + (input[2] >> 6)); KMS_ASSERT (output[0] < 64); KMS_ASSERT (output[1] < 64); KMS_ASSERT (output[2] < 64); if (datalength + 4 > targsize) { return -1; } target[datalength++] = Base64[output[0]]; target[datalength++] = Base64[output[1]]; if (srclength == 1) { target[datalength++] = Pad64; } else { target[datalength++] = Base64[output[2]]; } target[datalength++] = Pad64; } if (datalength >= targsize) { return -1; } target[datalength] = '\0'; /* Returned value doesn't count \0. */ return (int) datalength; } /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) The following encoding technique is taken from RFC 1521 by Borenstein and Freed. It is reproduced here in a slightly edited form for convenience. A 65-character subset of US-ASCII is used, enabling 6 bits to be represented per printable character. (The extra 65th character, "=", is used to signify a special processing function.) The encoding process represents 24-bit groups of input bits as output strings of 4 encoded characters. Proceeding from left to right, a 24-bit input group is formed by concatenating 3 8-bit input groups. These 24 bits are then treated as 4 concatenated 6-bit groups, each of which is translated into a single digit in the base64 alphabet. Each 6-bit group is used as an index into an array of 64 printable characters. The character referenced by the index is placed in the output string. Table 1: The Base64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y Special processing is performed if fewer than 24 bits are available at the end of the data being encoded. A full encoding quantum is always completed at the end of a quantity. When fewer than 24 input bits are available in an input group, zero bits are added (on the right) to form an integral number of 6-bit groups. Padding at the end of the data is performed using the '=' character. Since all base64 input is an integral number of octets, only the following cases can arise: (1) the final quantum of encoding input is an integral multiple of 24 bits; here, the final unit of encoded output will be an integral multiple of 4 characters with no "=" padding, (2) the final quantum of encoding input is exactly 8 bits; here, the final unit of encoded output will be two characters followed by two "=" padding characters, or (3) the final quantum of encoding input is exactly 16 bits; here, the final unit of encoded output will be three characters followed by one "=" padding character. */ /* skips all whitespace anywhere. converts characters, four at a time, starting at (or after) src from base - 64 numbers into three 8 bit bytes in the target area. it returns the number of data bytes stored at the target, or -1 on error. */ static uint8_t b64rmap[256]; static const uint8_t b64rmap_special = 0xf0; static const uint8_t b64rmap_end = 0xfd; static const uint8_t b64rmap_space = 0xfe; static const uint8_t b64rmap_invalid = 0xff; void kms_message_b64_initialize_rmap (void) { uint16_t i; unsigned char ch; /* Null: end of string, stop parsing */ b64rmap[0] = b64rmap_end; for (i = 1; i < 256; ++i) { ch = (unsigned char) i; /* Whitespaces */ if (isspace (ch)) b64rmap[i] = b64rmap_space; /* Padding: stop parsing */ else if (ch == Pad64) b64rmap[i] = b64rmap_end; /* Non-base64 char */ else b64rmap[i] = b64rmap_invalid; } /* Fill reverse mapping for base64 chars */ for (i = 0; Base64[i] != '\0'; ++i) b64rmap[(uint8_t) Base64[i]] = (uint8_t) i; } static int b64_pton_do (char const *src, uint8_t *target, size_t targsize) { int tarindex, state, ch; uint8_t ofs; state = 0; tarindex = 0; while (1) { ch = *src++; ofs = b64rmap[ch]; if (ofs >= b64rmap_special) { /* Ignore whitespaces */ if (ofs == b64rmap_space) continue; /* End of base64 characters */ if (ofs == b64rmap_end) break; /* A non-base64 character. */ return (-1); } switch (state) { case 0: if ((size_t) tarindex >= targsize) return (-1); target[tarindex] = (uint8_t) (ofs << 2); state = 1; break; case 1: if ((size_t) tarindex + 1 >= targsize) return (-1); target[tarindex] |= ofs >> 4; target[tarindex + 1] = (uint8_t) ((ofs & 0x0f) << 4); tarindex++; state = 2; break; case 2: if ((size_t) tarindex + 1 >= targsize) return (-1); target[tarindex] |= ofs >> 2; target[tarindex + 1] = (uint8_t) ((ofs & 0x03) << 6); tarindex++; state = 3; break; case 3: if ((size_t) tarindex >= targsize) return (-1); target[tarindex] |= ofs; tarindex++; state = 0; break; default: abort (); } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = *src++; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ return (-1); case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for ((void) NULL; ch != '\0'; ch = *src++) if (b64rmap[ch] != b64rmap_space) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) return (-1); ch = *src++; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for ((void) NULL; ch != '\0'; ch = *src++) if (b64rmap[ch] != b64rmap_space) return (-1); /* * Now make sure for cases 2 and 3 that the "extra" * bits that slopped past the last full byte were * zeros. If we don't check them, they become a * subliminal channel. */ if (target[tarindex] != 0) return (-1); default: break; } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) return (-1); } return (tarindex); } static int b64_pton_len (char const *src) { int tarindex, state, ch; uint8_t ofs; state = 0; tarindex = 0; while (1) { ch = *src++; ofs = b64rmap[ch]; if (ofs >= b64rmap_special) { /* Ignore whitespaces */ if (ofs == b64rmap_space) continue; /* End of base64 characters */ if (ofs == b64rmap_end) break; /* A non-base64 character. */ return (-1); } switch (state) { case 0: state = 1; break; case 1: tarindex++; state = 2; break; case 2: tarindex++; state = 3; break; case 3: tarindex++; state = 0; break; default: abort (); } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = *src++; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ return (-1); case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for ((void) NULL; ch != '\0'; ch = *src++) if (b64rmap[ch] != b64rmap_space) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) return (-1); ch = *src++; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for ((void) NULL; ch != '\0'; ch = *src++) if (b64rmap[ch] != b64rmap_space) return (-1); default: break; } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) return (-1); } return (tarindex); } int kms_message_b64_pton (char const *src, uint8_t *target, size_t targsize) { if (target) return b64_pton_do (src, target, targsize); else return b64_pton_len (src); } int kms_message_b64_to_b64url (const char *src, size_t srclength, char *target, size_t targsize) { size_t i; for (i = 0; i < srclength; i++) { if (i >= targsize) { return -1; } target[i] = src[i]; if (target[i] == '+') { target[i] = '-'; } else if (target[i] == '/') { target[i] = '_'; } } /* NULL terminate if room. */ if (i < targsize) { target[i] = '\0'; } return (int) i; } int kms_message_b64url_to_b64 (const char *src, size_t srclength, char *target, size_t targsize) { size_t i; size_t boundary; for (i = 0; i < srclength; i++) { if (i >= targsize) { return -1; } target[i] = src[i]; if (target[i] == '-') { target[i] = '+'; } else if (target[i] == '_') { target[i] = '/'; } } /* Pad to four byte boundary. */ boundary = 4 * ((i + 3) / 4); for (; i < boundary; i++) { if (i >= targsize) { return -1; } target[i] = '='; } /* NULL terminate if room. */ if (i < targsize) { target[i] = '\0'; } return (int) i; } char * kms_message_raw_to_b64 (const uint8_t *raw, size_t raw_len) { char *b64; size_t b64_len; b64_len = (raw_len / 3 + 1) * 4 + 1; b64 = malloc (b64_len); memset (b64, 0, b64_len); if (-1 == kms_message_b64_ntop (raw, raw_len, b64, b64_len)) { free (b64); return NULL; } return b64; } uint8_t * kms_message_b64_to_raw (const char *b64, size_t *out) { uint8_t *raw; int ret; size_t b64len; b64len = strlen (b64); raw = (uint8_t *) malloc (b64len + 1); memset (raw, 0, b64len + 1); ret = kms_message_b64_pton (b64, raw, b64len); if (ret > 0) { *out = (size_t) ret; return raw; } free (raw); return NULL; } char * kms_message_raw_to_b64url (const uint8_t *raw, size_t raw_len) { char *b64; size_t b64len; b64 = kms_message_raw_to_b64 (raw, raw_len); if (!b64) { return NULL; } b64len = strlen (b64); if (-1 == kms_message_b64_to_b64url (b64, b64len, b64, b64len)) { free (b64); return NULL; } return b64; } uint8_t * kms_message_b64url_to_raw (const char *b64url, size_t *out) { char *b64; size_t capacity; uint8_t *raw; size_t b64urllen; b64urllen = strlen(b64url); /* Add four for padding '=' characters. */ capacity = b64urllen + 4; b64 = malloc (capacity); memset (b64, 0, capacity); if (-1 == kms_message_b64url_to_b64 (b64url, b64urllen, b64, capacity)) { free (b64); return NULL; } raw = kms_message_b64_to_raw (b64, out); free (b64); return raw; } mongo-c-driver-1.26.0/src/kms-message/src/kms_caller_identity_request.c000066400000000000000000000027501456567454500262140ustar00rootroot00000000000000/* * Copyright 2019-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_message/kms_b64.h" #include "kms_request_str.h" kms_request_t * kms_caller_identity_request_new (const kms_request_opt_t *opt) { kms_request_t *request; kms_request_str_t *payload = NULL; request = kms_request_new ("POST", "/", opt); if (kms_request_get_error (request)) { goto done; } if (!(kms_request_add_header_field ( request, "Content-Type", "application/x-www-form-urlencoded"))) { goto done; } payload = kms_request_str_new (); kms_request_str_appendf (payload, "Action=GetCallerIdentity&Version=2011-06-15"); if (!kms_request_append_payload (request, payload->str, payload->len)) { KMS_ERROR (request, "Could not append payload"); goto done; } done: kms_request_str_destroy (payload); return request; } mongo-c-driver-1.26.0/src/kms-message/src/kms_crypto.h000066400000000000000000000043641456567454500226210ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_KMS_CRYPTO_H #define KMS_MESSAGE_KMS_CRYPTO_H #include #include typedef struct { bool (*sha256) (void *ctx, const char *input, size_t len, unsigned char *hash_out); bool (*sha256_hmac) (void *ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out); bool (*sign_rsaes_pkcs1_v1_5) (void *sign_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out); void *ctx; void *sign_ctx; } _kms_crypto_t; int kms_crypto_init (void); void kms_crypto_cleanup (void); bool kms_sha256 (void *ctx, const char *input, size_t len, unsigned char *hash_out); bool kms_sha256_hmac (void *ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out); /* signature_out must be a preallocated buffer of 256 bytes (or greater). */ bool kms_sign_rsaes_pkcs1_v1_5 (void *sign_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out); #endif /* KMS_MESSAGE_KMS_CRYPTO_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_crypto_apple.c000066400000000000000000000107671456567454500240010ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #include "kms_message_private.h" /* KMS_ASSERT */ #ifdef KMS_MESSAGE_ENABLE_CRYPTO_COMMON_CRYPTO #include #include #include #include #include #include int kms_crypto_init (void) { return 0; } void kms_crypto_cleanup (void) { } bool kms_sha256 (void *unused_ctx, const char *input, size_t len, unsigned char *hash_out) { CC_SHA256_CTX ctx; CC_SHA256_Init (&ctx); KMS_ASSERT (len <= (size_t) UINT32_MAX); CC_SHA256_Update (&ctx, input, (uint32_t) len); CC_SHA256_Final (hash_out, &ctx); return true; } bool kms_sha256_hmac (void *unused_ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out) { CCHmac (kCCHmacAlgSHA256, key_input, key_len, input, len, hash_out); return true; } static void safe_CFRelease (CFTypeRef ptr) { if (ptr) { CFRelease (ptr); } } bool kms_sign_rsaes_pkcs1_v1_5 (void *unused_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out) { CFDataRef key_data_ref = NULL; CFDataRef pass_ref = NULL; SecItemImportExportKeyParameters import_params; OSStatus status; /* TODO: I think the expected format should be kSecFormatWrappedPKCS8, but * GCP keys appear to only load for kSecFormatBSAFE. */ SecExternalFormat format = kSecFormatUnknown; SecExternalItemType type = kSecItemTypePrivateKey; CFArrayRef out_ref = NULL; SecKeyRef key_ref = NULL; CFDataRef data_to_sign_ref = NULL; CFErrorRef error_ref; CFDataRef signature_ref = NULL; bool ret = false; key_data_ref = CFDataCreate (NULL /* default allocator */, (const uint8_t *) private_key, (CFIndex) private_key_len); if (!key_data_ref) { goto cleanup; } memset (&import_params, 0, sizeof (SecItemImportExportKeyParameters)); import_params.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION; /* Give an empty password. SecItemImport returns an error expecting a * password. */ pass_ref = CFDataCreate (NULL, NULL, 0); if (!pass_ref) { goto cleanup; } import_params.passphrase = (CFTypeRef) pass_ref; status = SecItemImport (key_data_ref, NULL /* extension. */, &format, &type, 0, &import_params, NULL /* keychain */, &out_ref); if (status != errSecSuccess) { goto cleanup; } if (1 != CFArrayGetCount (out_ref)) { goto cleanup; } key_ref = (SecKeyRef) CFArrayGetValueAtIndex (out_ref, 0); KMS_ASSERT (input_len <= (size_t) LONG_MAX); data_to_sign_ref = CFDataCreate (NULL, (const uint8_t *) input, (long) input_len); if (!data_to_sign_ref) { goto cleanup; } error_ref = NULL; signature_ref = SecKeyCreateSignature (key_ref, kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA256, data_to_sign_ref, &error_ref); if (!signature_ref) { goto cleanup; } memcpy (signature_out, CFDataGetBytePtr (signature_ref), (size_t) CFDataGetLength (signature_ref)); ret = true; cleanup: safe_CFRelease (key_data_ref); safe_CFRelease (pass_ref); safe_CFRelease (out_ref); safe_CFRelease (data_to_sign_ref); safe_CFRelease (signature_ref); return ret; } #endif /* KMS_MESSAGE_ENABLE_CRYPTO_COMMON_CRYPTO */ mongo-c-driver-1.26.0/src/kms-message/src/kms_crypto_libcrypto.c000066400000000000000000000065041456567454500247010ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #include "kms_message_private.h" #ifdef KMS_MESSAGE_ENABLE_CRYPTO_LIBCRYPTO #include #include #include #include /* INT_MAX, LONG_MAX */ #if OPENSSL_VERSION_NUMBER < 0x10100000L || \ (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x20700000L) static EVP_MD_CTX * EVP_MD_CTX_new (void) { return calloc (sizeof (EVP_MD_CTX), 1); } static void EVP_MD_CTX_free (EVP_MD_CTX *ctx) { EVP_MD_CTX_cleanup (ctx); free (ctx); } #endif int kms_crypto_init (void) { return 0; } void kms_crypto_cleanup (void) { } bool kms_sha256 (void *unused_ctx, const char *input, size_t len, unsigned char *hash_out) { EVP_MD_CTX *digest_ctxp = EVP_MD_CTX_new (); bool rval = false; if (1 != EVP_DigestInit_ex (digest_ctxp, EVP_sha256 (), NULL)) { goto cleanup; } if (1 != EVP_DigestUpdate (digest_ctxp, input, len)) { goto cleanup; } rval = (1 == EVP_DigestFinal_ex (digest_ctxp, hash_out, NULL)); cleanup: EVP_MD_CTX_free (digest_ctxp); return rval; } bool kms_sha256_hmac (void *unused_ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out) { KMS_ASSERT (key_len <= INT_MAX); return HMAC (EVP_sha256 (), key_input, (int) key_len, (unsigned char *) input, len, hash_out, NULL) != NULL; } bool kms_sign_rsaes_pkcs1_v1_5 (void *unused_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out) { EVP_MD_CTX *ctx; EVP_PKEY *pkey = NULL; bool ret = false; size_t signature_out_len = 256; ctx = EVP_MD_CTX_new (); KMS_ASSERT (private_key_len <= LONG_MAX); pkey = d2i_PrivateKey (EVP_PKEY_RSA, NULL, (const unsigned char **) &private_key, (long) private_key_len); if (!pkey) { goto cleanup; } ret = EVP_DigestSignInit (ctx, NULL, EVP_sha256 (), NULL /* engine */, pkey); if (ret != 1) { goto cleanup; } ret = EVP_DigestSignUpdate (ctx, input, input_len); if (ret != 1) { goto cleanup; } ret = EVP_DigestSignFinal (ctx, signature_out, &signature_out_len); if (ret != 1) { goto cleanup; } ret = true; cleanup: EVP_MD_CTX_free (ctx); EVP_PKEY_free (pkey); return ret; } #endif /* KMS_MESSAGE_ENABLE_CRYPTO_LIBCRYPTO */ mongo-c-driver-1.26.0/src/kms-message/src/kms_crypto_none.c000066400000000000000000000032131456567454500236230ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #ifndef KMS_MESSAGE_ENABLE_CRYPTO int kms_crypto_init (void) { return 0; } void kms_crypto_cleanup (void) { } bool kms_sha256 (void *unused_ctx, const char *input, size_t len, unsigned char *hash_out) { /* only gets called if hooks were mistakenly not set */ return false; } bool kms_sha256_hmac (void *unused_ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out) { /* only gets called if hooks were mistakenly not set */ return false; } bool kms_sign_rsaes_pkcs1_v1_5 (void *unused_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out) { /* only gets called if hooks were mistakenly not set */ return false; } #endif /* KMS_MESSAGE_ENABLE_CRYPTO */ mongo-c-driver-1.26.0/src/kms-message/src/kms_crypto_windows.c000066400000000000000000000164751456567454500243740ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #ifdef KMS_MESSAGE_ENABLE_CRYPTO_CNG // tell windows.h not to include a bunch of headers we don't need: #define WIN32_LEAN_AND_MEAN // Tell windows.h not to define any NT status codes, so that we can // get the definitions from ntstatus.h, which has a more complete list. #define WIN32_NO_STATUS #include #undef WIN32_NO_STATUS // Obtain a definition for the ntstatus type. #include // Add back in the status definitions so that macro expansions for // things like STILL_ACTIVE and WAIT_OBJECT_O can be resolved (they // expand to STATUS_ codes). #include #include #include static BCRYPT_ALG_HANDLE _algoSHA256 = 0; static BCRYPT_ALG_HANDLE _algoSHA256Hmac = 0; static BCRYPT_ALG_HANDLE _algoRSA = 0; #define SHA_256_HASH_LEN 32 int kms_crypto_init (void) { if (BCryptOpenAlgorithmProvider ( &_algoSHA256, BCRYPT_SHA256_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0) != STATUS_SUCCESS) { return 1; } if (BCryptOpenAlgorithmProvider (&_algoSHA256Hmac, BCRYPT_SHA256_ALGORITHM, MS_PRIMITIVE_PROVIDER, BCRYPT_ALG_HANDLE_HMAC_FLAG) != STATUS_SUCCESS) { return 2; } if (BCryptOpenAlgorithmProvider ( &_algoRSA, BCRYPT_RSA_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0) != STATUS_SUCCESS) { return 3; } return 0; } void kms_crypto_cleanup (void) { (void) BCryptCloseAlgorithmProvider (_algoSHA256, 0); (void) BCryptCloseAlgorithmProvider (_algoSHA256Hmac, 0); (void) BCryptCloseAlgorithmProvider (_algoRSA, 0); } bool kms_sha256 (void *unused_ctx, const char *input, size_t len, unsigned char *hash_out) { BCRYPT_HASH_HANDLE hHash; NTSTATUS status = BCryptCreateHash (_algoSHA256, &hHash, NULL, 0, NULL, 0, 0); if (status != STATUS_SUCCESS) { return 0; } status = BCryptHashData (hHash, (PUCHAR) (input), (ULONG) len, 0); if (status != STATUS_SUCCESS) { goto cleanup; } // Hardcode output length status = BCryptFinishHash (hHash, hash_out, 256 / 8, 0); if (status != STATUS_SUCCESS) { goto cleanup; } cleanup: (void) BCryptDestroyHash (hHash); return status == STATUS_SUCCESS ? 1 : 0; } bool kms_sha256_hmac (void *unused_ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out) { BCRYPT_HASH_HANDLE hHash; NTSTATUS status = BCryptCreateHash ( _algoSHA256Hmac, &hHash, NULL, 0, (PUCHAR) key_input, (ULONG) key_len, 0); if (status != STATUS_SUCCESS) { return 0; } status = BCryptHashData (hHash, (PUCHAR) input, (ULONG) len, 0); if (status != STATUS_SUCCESS) { goto cleanup; } // Hardcode output length status = BCryptFinishHash (hHash, hash_out, 256 / 8, 0); if (status != STATUS_SUCCESS) { goto cleanup; } cleanup: (void) BCryptDestroyHash (hHash); return status == STATUS_SUCCESS ? 1 : 0; } bool kms_sign_rsaes_pkcs1_v1_5 (void *unused_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out) { bool success = false; bool ret = false; LPBYTE blob_private = NULL; DWORD blob_private_len = 0; LPBYTE raw_private = NULL; DWORD raw_private_len = 0; NTSTATUS status; BCRYPT_KEY_HANDLE hKey = NULL; BCRYPT_PKCS1_PADDING_INFO padding_PKCS1; unsigned char *hash_value = NULL; DWORD hash_length = 256; success = CryptDecodeObjectEx (X509_ASN_ENCODING, PKCS_PRIVATE_KEY_INFO, private_key, (DWORD) private_key_len, 0, NULL, NULL, &blob_private_len); if (!success) { goto cleanup; } blob_private = (LPBYTE) calloc (1, blob_private_len); success = CryptDecodeObjectEx (X509_ASN_ENCODING, PKCS_PRIVATE_KEY_INFO, private_key, (DWORD) private_key_len, 0, NULL, blob_private, &blob_private_len); if (!success) { goto cleanup; } CRYPT_PRIVATE_KEY_INFO *privateKeyInfo = (CRYPT_PRIVATE_KEY_INFO *) blob_private; success = CryptDecodeObjectEx (X509_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, privateKeyInfo->PrivateKey.pbData, (DWORD) privateKeyInfo->PrivateKey.cbData, 0, NULL, NULL, &raw_private_len); if (!success) { goto cleanup; } raw_private = (LPBYTE) calloc (1, raw_private_len); success = CryptDecodeObjectEx (X509_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, privateKeyInfo->PrivateKey.pbData, (DWORD) privateKeyInfo->PrivateKey.cbData, 0, NULL, raw_private, &raw_private_len); if (!success) { goto cleanup; } status = BCryptImportKeyPair ( _algoRSA, NULL, LEGACY_RSAPRIVATE_BLOB, &hKey, raw_private, raw_private_len, 0); if (!NT_SUCCESS (status)) { goto cleanup; } hash_value = calloc (1, SHA_256_HASH_LEN); if(!kms_sha256 (NULL, input, input_len, hash_value)) { goto cleanup; } padding_PKCS1.pszAlgId = BCRYPT_SHA256_ALGORITHM; status = BCryptSignHash (hKey, &padding_PKCS1, hash_value, SHA_256_HASH_LEN, signature_out, hash_length, &hash_length, BCRYPT_PAD_PKCS1); if (!NT_SUCCESS (status)) { goto cleanup; } ret = true; cleanup: BCryptDestroyKey(hKey); free (blob_private); free (raw_private); free (hash_value); return ret; } #endif /* KMS_MESSAGE_ENABLE_CRYPTO_CNG */ mongo-c-driver-1.26.0/src/kms-message/src/kms_decrypt_request.c000066400000000000000000000041001456567454500245020ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_message/kms_b64.h" #include "kms_request_str.h" kms_request_t * kms_decrypt_request_new (const uint8_t *ciphertext_blob, size_t len, const kms_request_opt_t *opt) { kms_request_t *request; size_t b64_len; char *b64 = NULL; kms_request_str_t *payload = NULL; request = kms_request_new ("POST", "/", opt); if (kms_request_get_error (request)) { goto done; } if (!(kms_request_add_header_field ( request, "Content-Type", "application/x-amz-json-1.1") && kms_request_add_header_field ( request, "X-Amz-Target", "TrentService.Decrypt"))) { goto done; } b64_len = (len / 3 + 1) * 4 + 1; if (!(b64 = malloc (b64_len))) { KMS_ERROR (request, "Could not allocate %d bytes for base64-encoding payload", (int) b64_len); goto done; } if (kms_message_b64_ntop (ciphertext_blob, len, b64, b64_len) == -1) { KMS_ERROR (request, "Could not base64-encode ciphertext blob"); goto done; } payload = kms_request_str_new (); kms_request_str_appendf (payload, "{\"CiphertextBlob\": \"%s\"}", b64); if (!kms_request_append_payload (request, payload->str, payload->len)) { KMS_ERROR (request, "Could not append payload"); goto done; } done: free (b64); kms_request_str_destroy (payload); return request; } mongo-c-driver-1.26.0/src/kms-message/src/kms_encrypt_request.c000066400000000000000000000042721456567454500245260ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_message/kms_b64.h" #include "kms_request_str.h" kms_request_t * kms_encrypt_request_new (const uint8_t *plaintext, size_t plaintext_length, const char *key_id, const kms_request_opt_t *opt) { kms_request_t *request; size_t b64_len; char *b64 = NULL; kms_request_str_t *payload = NULL; request = kms_request_new ("POST", "/", opt); if (kms_request_get_error (request)) { goto done; } if (!(kms_request_add_header_field ( request, "Content-Type", "application/x-amz-json-1.1") && kms_request_add_header_field ( request, "X-Amz-Target", "TrentService.Encrypt"))) { goto done; } b64_len = (plaintext_length / 3 + 1) * 4 + 1; if (!(b64 = malloc (b64_len))) { KMS_ERROR (request, "Could not allocate %d bytes for base64-encoding payload", (int) b64_len); goto done; } if (kms_message_b64_ntop ( (const uint8_t *) plaintext, plaintext_length, b64, b64_len) == -1) { KMS_ERROR (request, "Could not base64-encode plaintext"); goto done; } payload = kms_request_str_new (); kms_request_str_appendf ( payload, "{\"Plaintext\": \"%s\", \"KeyId\": \"%s\"}", b64, key_id); if (!kms_request_append_payload (request, payload->str, payload->len)) { KMS_ERROR (request, "Could not append payload"); goto done; } done: free (b64); kms_request_str_destroy (payload); return request; } mongo-c-driver-1.26.0/src/kms-message/src/kms_endian_private.h000066400000000000000000000121341456567454500242630ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* This file is copied and modified from libbson's bson-endian.h. */ #ifndef KMS_ENDIAN_PRIVATE_H #define KMS_ENDIAN_PRIVATE_H #include #include "kms_message/kms_message_defines.h" /* Define a fallback for __has_builtin for compatibility with non-clang compilers. */ #ifndef __has_builtin #define __has_builtin(x) 0 #endif #if defined(__clang__) && __has_builtin(__builtin_bswap16) && \ __has_builtin(__builtin_bswap32) && __has_builtin(__builtin_bswap64) #define KMS_UINT16_SWAP_LE_BE(v) __builtin_bswap16 (v) #define KMS_UINT32_SWAP_LE_BE(v) __builtin_bswap32 (v) #define KMS_UINT64_SWAP_LE_BE(v) __builtin_bswap64 (v) #elif defined(__GNUC__) && (__GNUC__ >= 4) #if __GNUC__ > 4 || (defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 3) #define KMS_UINT32_SWAP_LE_BE(v) __builtin_bswap32 ((uint32_t) v) #define KMS_UINT64_SWAP_LE_BE(v) __builtin_bswap64 ((uint64_t) v) #endif #if __GNUC__ > 4 || (defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 8) #define KMS_UINT16_SWAP_LE_BE(v) __builtin_bswap16 ((uint32_t) v) #endif #endif #ifndef KMS_UINT16_SWAP_LE_BE #define KMS_UINT16_SWAP_LE_BE(v) __kms_uint16_swap_slow ((uint16_t) v) #endif #ifndef KMS_UINT32_SWAP_LE_BE #define KMS_UINT32_SWAP_LE_BE(v) __kms_uint32_swap_slow ((uint32_t) v) #endif #ifndef KMS_UINT64_SWAP_LE_BE #define KMS_UINT64_SWAP_LE_BE(v) __kms_uint64_swap_slow ((uint64_t) v) #endif #if defined(KMS_MESSAGE_LITTLE_ENDIAN) #define KMS_UINT16_FROM_LE(v) ((uint16_t) v) #define KMS_UINT16_TO_LE(v) ((uint16_t) v) #define KMS_UINT16_FROM_BE(v) KMS_UINT16_SWAP_LE_BE (v) #define KMS_UINT16_TO_BE(v) KMS_UINT16_SWAP_LE_BE (v) #define KMS_UINT32_FROM_LE(v) ((uint32_t) v) #define KMS_UINT32_TO_LE(v) ((uint32_t) v) #define KMS_UINT32_FROM_BE(v) KMS_UINT32_SWAP_LE_BE (v) #define KMS_UINT32_TO_BE(v) KMS_UINT32_SWAP_LE_BE (v) #define KMS_UINT64_FROM_LE(v) ((uint64_t) v) #define KMS_UINT64_TO_LE(v) ((uint64_t) v) #define KMS_UINT64_FROM_BE(v) KMS_UINT64_SWAP_LE_BE (v) #define KMS_UINT64_TO_BE(v) KMS_UINT64_SWAP_LE_BE (v) #elif defined(KMS_MESSAGE_BIG_ENDIAN) #define KMS_UINT16_FROM_LE(v) KMS_UINT16_SWAP_LE_BE (v) #define KMS_UINT16_TO_LE(v) KMS_UINT16_SWAP_LE_BE (v) #define KMS_UINT16_FROM_BE(v) ((uint16_t) v) #define KMS_UINT16_TO_BE(v) ((uint16_t) v) #define KMS_UINT32_FROM_LE(v) KMS_UINT32_SWAP_LE_BE (v) #define KMS_UINT32_TO_LE(v) KMS_UINT32_SWAP_LE_BE (v) #define KMS_UINT32_FROM_BE(v) ((uint32_t) v) #define KMS_UINT32_TO_BE(v) ((uint32_t) v) #define KMS_UINT64_FROM_LE(v) KMS_UINT64_SWAP_LE_BE (v) #define KMS_UINT64_TO_LE(v) KMS_UINT64_SWAP_LE_BE (v) #define KMS_UINT64_FROM_BE(v) ((uint64_t) v) #define KMS_UINT64_TO_BE(v) ((uint64_t) v) #else #error "The endianness of target architecture is unknown." #endif /* *-------------------------------------------------------------------------- * * __kms_uint16_swap_slow -- * * Fallback endianness conversion for 16-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static KMS_MSG_INLINE uint16_t __kms_uint16_swap_slow (uint16_t v) /* IN */ { return (uint16_t) (((v & 0x00FF) << 8) | ((v & 0xFF00) >> 8)); } /* *-------------------------------------------------------------------------- * * __kms_uint32_swap_slow -- * * Fallback endianness conversion for 32-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static KMS_MSG_INLINE uint32_t __kms_uint32_swap_slow (uint32_t v) /* IN */ { return ((v & 0x000000FFU) << 24) | ((v & 0x0000FF00U) << 8) | ((v & 0x00FF0000U) >> 8) | ((v & 0xFF000000U) >> 24); } /* *-------------------------------------------------------------------------- * * __kms_uint64_swap_slow -- * * Fallback endianness conversion for 64-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static KMS_MSG_INLINE uint64_t __kms_uint64_swap_slow (uint64_t v) /* IN */ { return ((v & 0x00000000000000FFULL) << 56) | ((v & 0x000000000000FF00ULL) << 40) | ((v & 0x0000000000FF0000ULL) << 24) | ((v & 0x00000000FF000000ULL) << 8) | ((v & 0x000000FF00000000ULL) >> 8) | ((v & 0x0000FF0000000000ULL) >> 24) | ((v & 0x00FF000000000000ULL) >> 40) | ((v & 0xFF00000000000000ULL) >> 56); } #endif /* KMS_ENDIAN_PRIVATE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_gcp_request.c000066400000000000000000000235331456567454500236140ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_gcp_request.h" #include "kms_message/kms_b64.h" #include "kms_message_private.h" #include "kms_request_opt_private.h" /* Set a default expiration of 5 minutes for JSON Web Tokens (GCP allows up to * one hour) */ #define JWT_EXPIRATION_SECS 5 * 60 #define SIGNATURE_LEN 256 kms_request_t * kms_gcp_request_oauth_new (const char *host, const char *email, const char *audience, const char *scope, const char *private_key_data, size_t private_key_len, const kms_request_opt_t *opt) { kms_request_t *req = NULL; kms_request_str_t *str = NULL; time_t issued_at; /* base64 encoding of {"alg":"RS256","typ":"JWT"} */ const char *jwt_header_b64url = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9"; char *jwt_claims_b64url = NULL; char *jwt_header_and_claims_b64url = NULL; uint8_t *jwt_signature = NULL; char *jwt_signature_b64url = NULL; char *jwt_assertion_b64url = NULL; char *payload = NULL; req = kms_request_new ("POST", "/token", opt); if (opt->provider != KMS_REQUEST_PROVIDER_GCP) { KMS_ERROR (req, "Expected KMS request with provider type: GCP"); goto done; } if (kms_request_get_error (req)) { goto done; } /* Produce the signed JWT .. */ issued_at = time (NULL); str = kms_request_str_new (); kms_request_str_appendf (str, "{\"iss\": \"%s\", \"aud\": \"%s\", \"scope\": " "\"%s\", \"iat\": %lu, \"exp\": %lu}", email, audience, scope, (unsigned long) issued_at, (unsigned long) issued_at + JWT_EXPIRATION_SECS); jwt_claims_b64url = kms_message_raw_to_b64url ((const uint8_t *) str->str, str->len); kms_request_str_destroy (str); if (!jwt_claims_b64url) { KMS_ERROR (req, "Failed to base64url encode JWT claims"); goto done; } str = kms_request_str_new (); kms_request_str_appendf (str, "%s.%s", jwt_header_b64url, jwt_claims_b64url); jwt_header_and_claims_b64url = kms_request_str_detach (str); /* Produce the signature of . */ req->crypto.sign_rsaes_pkcs1_v1_5 = kms_sign_rsaes_pkcs1_v1_5; if (opt->crypto.sign_rsaes_pkcs1_v1_5) { req->crypto.sign_rsaes_pkcs1_v1_5 = opt->crypto.sign_rsaes_pkcs1_v1_5; req->crypto.sign_ctx = opt->crypto.sign_ctx; } jwt_signature = malloc (SIGNATURE_LEN); if (!req->crypto.sign_rsaes_pkcs1_v1_5 ( req->crypto.sign_ctx, private_key_data, private_key_len, jwt_header_and_claims_b64url, strlen (jwt_header_and_claims_b64url), jwt_signature)) { KMS_ERROR (req, "Failed to create GCP oauth request signature"); goto done; } jwt_signature_b64url = kms_message_raw_to_b64url (jwt_signature, SIGNATURE_LEN); if (!jwt_signature_b64url) { KMS_ERROR (req, "Failed to base64url encode JWT signature"); goto done; } str = kms_request_str_new (); kms_request_str_appendf (str, "%s.%s.%s", jwt_header_b64url, jwt_claims_b64url, jwt_signature_b64url); jwt_assertion_b64url = kms_request_str_detach (str); str = kms_request_str_new_from_chars ("grant_type=urn%3Aietf%3Aparams%3Aoauth%" "3Agrant-type%3Ajwt-bearer&assertion=", -1); kms_request_str_append_chars (str, jwt_assertion_b64url, -1); payload = kms_request_str_detach (str); if (!kms_request_add_header_field ( req, "Content-Type", "application/x-www-form-urlencoded")) { goto done; } if (!kms_request_add_header_field (req, "Host", host)) { goto done; } if (!kms_request_add_header_field (req, "Accept", "application/json")) { goto done; } if (!kms_request_append_payload (req, payload, strlen (payload))) { goto done; } done: free (jwt_signature); free (jwt_signature_b64url); free (jwt_claims_b64url); free (jwt_header_and_claims_b64url); free (jwt_assertion_b64url); free (payload); return req; } static kms_request_t * _encrypt_decrypt_common (const char *encrypt_decrypt, const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const char *key_version, const uint8_t *value, size_t value_len, const kms_request_opt_t *opt) { char *path_and_query = NULL; char *payload = NULL; char *bearer_token_value = NULL; char *value_base64 = NULL; kms_request_t *req; kms_request_str_t *str; str = kms_request_str_new (); /* /v1/projects/{project-id}/locations/{location}/keyRings/{key-ring-name}/cryptoKeys/{key-name} */ kms_request_str_appendf ( str, "/v1/projects/%s/locations/%s/keyRings/%s/cryptoKeys/%s", project_id, location, key_ring_name, key_name); if (key_version && strlen (key_version) > 0) { kms_request_str_appendf (str, "/cryptoKeyVersions/%s", key_version); } kms_request_str_appendf (str, ":%s", encrypt_decrypt); path_and_query = kms_request_str_detach (str); req = kms_request_new ("POST", path_and_query, opt); if (opt->provider != KMS_REQUEST_PROVIDER_GCP) { KMS_ERROR (req, "Expected KMS request with provider type: GCP"); goto done; } if (kms_request_get_error (req)) { goto done; } value_base64 = kms_message_raw_to_b64 (value, value_len); if (!value_base64) { KMS_ERROR (req, "Could not bases64-encode plaintext"); goto done; } str = kms_request_str_new (); if (0 == strcmp ("encrypt", encrypt_decrypt)) { kms_request_str_appendf (str, "{\"plaintext\": \"%s\"}", value_base64); } else { kms_request_str_appendf (str, "{\"ciphertext\": \"%s\"}", value_base64); } payload = kms_request_str_detach (str); str = kms_request_str_new (); kms_request_str_appendf (str, "Bearer %s", access_token); bearer_token_value = kms_request_str_detach (str); if (!kms_request_add_header_field ( req, "Authorization", bearer_token_value)) { goto done; } if (!kms_request_add_header_field ( req, "Content-Type", "application/json")) { goto done; } if (!kms_request_add_header_field (req, "Host", host)) { goto done; } if (!kms_request_add_header_field (req, "Accept", "application/json")) { goto done; } if (!kms_request_append_payload (req, payload, strlen (payload))) { goto done; } done: kms_request_free_string (path_and_query); kms_request_free_string (payload); kms_request_free_string (bearer_token_value); kms_request_free_string (value_base64); return req; } kms_request_t * kms_gcp_request_encrypt_new (const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const char *key_version, const uint8_t *plaintext, size_t plaintext_len, const kms_request_opt_t *opt) { return _encrypt_decrypt_common ("encrypt", host, access_token, project_id, location, key_ring_name, key_name, key_version, plaintext, plaintext_len, opt); } kms_request_t * kms_gcp_request_decrypt_new (const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const uint8_t *ciphertext, size_t ciphertext_len, const kms_request_opt_t *opt) { return _encrypt_decrypt_common ("decrypt", host, access_token, project_id, location, key_ring_name, key_name, NULL /* key_version */, ciphertext, ciphertext_len, opt); }mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_item_type_private.h000066400000000000000000000033101456567454500260400ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_ITEM_TYPE_PRIVATE_H #define KMS_KMIP_ITEM_TYPE_PRIVATE_H #include "kms_message/kms_message_defines.h" #define KMS_XMACRO \ KMS_X (Structure, 0x01) \ KMS_X (Integer, 0x02) \ KMS_X (LongInteger, 0x03) \ KMS_X (BigInteger, 0x04) \ KMS_X (Enumeration, 0x05) \ KMS_X (Boolean, 0x06) \ KMS_X (TextString, 0x07) \ KMS_X (ByteString, 0x08) \ KMS_X (DateTime, 0x09) \ KMS_X_LAST (Interval, 0x0A) /* Generate an enum with each item_type value. */ #define KMS_X(ITEM_TYPE, VAL) KMIP_ITEM_TYPE_##ITEM_TYPE = VAL, #define KMS_X_LAST(ITEM_TYPE, VAL) KMIP_ITEM_TYPE_##ITEM_TYPE = VAL typedef enum { KMS_XMACRO } kmip_item_type_t; #undef KMS_X #undef KMS_X_LAST #define KMS_X(ITEM_TYPE, VAL) \ case KMIP_ITEM_TYPE_##ITEM_TYPE: \ return #ITEM_TYPE; #define KMS_X_LAST KMS_X static KMS_MSG_INLINE const char * kmip_item_type_to_string (kmip_item_type_t item_type) { switch (item_type) { default: return "Unknown KMIP item type"; KMS_XMACRO } } #undef KMS_X #undef KMS_X_LAST #undef KMS_XMACRO #endif /* KMS_KMIP_ITEM_TYPE_PRIVATE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_reader_writer.c000066400000000000000000000304121456567454500251430ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_kmip_reader_writer_private.h" #include "kms_endian_private.h" #include "kms_request_str.h" #include #define MAX_KMIP_WRITER_POSITIONS 10 /* KMIP encodes signed integers with two's complement. * Parsing functions read Integer / LongInteger as int32_t / int64_t by * reinterpreting byte representation. * Ensure that platform represents integers in two's complement. * See: https://stackoverflow.com/a/64843863/774658 */ #if (-1 & 3) != 3 #error Error: Twos complement integer representation is required. #endif struct _kmip_writer_t { kms_request_str_t *buffer; size_t positions[MAX_KMIP_WRITER_POSITIONS]; size_t cur_pos; }; kmip_writer_t * kmip_writer_new (void) { kmip_writer_t *writer = calloc (1, sizeof (kmip_writer_t)); writer->buffer = kms_request_str_new (); return writer; } void kmip_writer_destroy (kmip_writer_t *writer) { kms_request_str_destroy (writer->buffer); free (writer); } void kmip_writer_write_u8 (kmip_writer_t *writer, uint8_t value) { char *c = (char *) &value; kms_request_str_append_chars (writer->buffer, c, 1); } void kmip_writer_write_u16 (kmip_writer_t *writer, uint16_t value) { uint16_t v = KMS_UINT16_TO_BE (value); char *c = (char *) &v; kms_request_str_append_chars (writer->buffer, c, 2); } void kmip_writer_write_u32 (kmip_writer_t *writer, uint32_t value) { uint32_t v = KMS_UINT32_TO_BE (value); char *c = (char *) &v; kms_request_str_append_chars (writer->buffer, c, 4); } void kmip_writer_write_u64 (kmip_writer_t *writer, uint64_t value) { uint64_t v = KMS_UINT64_TO_BE (value); char *c = (char *) &v; kms_request_str_append_chars (writer->buffer, c, 8); } void kmip_writer_write_tag_enum (kmip_writer_t *writer, kmip_tag_type_t tag) { /* The 0x42 prefix is for tags built into the protocol. */ /* The 0x54 prefix is for extension tags. */ kmip_writer_write_u8 (writer, 0x42); kmip_writer_write_u16 (writer, (uint16_t) tag); } static size_t compute_padded_length (size_t len) { if (len % 8 == 0) { return len; } size_t padding = 8 - (len % 8); return len + padding; } void kmip_writer_write_string (kmip_writer_t *writer, kmip_tag_type_t tag, const char *str, size_t len) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_TextString); kmip_writer_write_u32 (writer, (uint32_t) len); size_t i; for (i = 0; i < len; i++) { kmip_writer_write_u8 (writer, (uint8_t) str[i]); } size_t padded_length = compute_padded_length (len); for (i = 0; i < padded_length - len; i++) { kmip_writer_write_u8 (writer, 0); } } void kmip_writer_write_bytes (kmip_writer_t *writer, kmip_tag_type_t tag, const char *str, size_t len) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_ByteString); kmip_writer_write_u32 (writer, (uint32_t) len); size_t i; for (i = 0; i < len; i++) { kmip_writer_write_u8 (writer, (uint8_t) str[i]); } size_t padded_length = compute_padded_length (len); for (i = 0; i < padded_length - len; i++) { kmip_writer_write_u8 (writer, 0); } } void kmip_writer_write_integer (kmip_writer_t *writer, kmip_tag_type_t tag, int32_t value) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_Integer); kmip_writer_write_u32 (writer, 4); KMS_ASSERT (value >= 0); kmip_writer_write_u32 (writer, (uint32_t) value); kmip_writer_write_u32 (writer, 0); } void kmip_writer_write_long_integer (kmip_writer_t *writer, kmip_tag_type_t tag, int64_t value) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_LongInteger); kmip_writer_write_u32 (writer, 8); KMS_ASSERT (value >= 0); kmip_writer_write_u64 (writer, (uint64_t) value); } void kmip_writer_write_enumeration (kmip_writer_t *writer, kmip_tag_type_t tag, int32_t value) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_Enumeration); kmip_writer_write_u32 (writer, 4); KMS_ASSERT (value >= 0); kmip_writer_write_u32 (writer, (uint32_t) value); kmip_writer_write_u32 (writer, 0); } void kmip_writer_write_datetime (kmip_writer_t *writer, kmip_tag_type_t tag, int64_t value) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_DateTime); kmip_writer_write_u32 (writer, 8); KMS_ASSERT (value >= 0); kmip_writer_write_u64 (writer, (uint64_t) value); } void kmip_writer_begin_struct (kmip_writer_t *writer, kmip_tag_type_t tag) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_Structure); size_t pos = writer->buffer->len; kmip_writer_write_u32 (writer, 0); KMS_ASSERT(writer->cur_pos < MAX_KMIP_WRITER_POSITIONS); writer->cur_pos++; writer->positions[writer->cur_pos] = pos; } void kmip_writer_close_struct (kmip_writer_t *writer) { size_t current_pos = writer->buffer->len; KMS_ASSERT(writer->cur_pos > 0); size_t start_pos = writer->positions[writer->cur_pos]; writer->cur_pos--; /* offset by 4 */ uint32_t len = (uint32_t) (current_pos - start_pos - 4); uint32_t v = KMS_UINT32_TO_BE (len); char *c = (char *) &v; memcpy (writer->buffer->str + start_pos, c, 4); } const uint8_t * kmip_writer_get_buffer (kmip_writer_t *writer, size_t* len) { *len = writer->buffer->len; return (const uint8_t*) writer->buffer->str; } struct _kmip_reader_t { uint8_t *ptr; size_t pos; size_t len; }; kmip_reader_t * kmip_reader_new (uint8_t *ptr, size_t len) { kmip_reader_t *reader = calloc (1, sizeof (kmip_reader_t)); reader->ptr = ptr; reader->len = len; return reader; } void kmip_reader_destroy (kmip_reader_t *reader) { free (reader); } bool kmip_reader_in_place (kmip_reader_t *reader, size_t pos, size_t len, kmip_reader_t *out_reader) { /* Everything should be padding to 8 byte boundaries. */ len = compute_padded_length (len); if ((pos + len) > reader->len) { return false; } memset (out_reader, 0, sizeof (kmip_reader_t)); out_reader->ptr = reader->ptr + reader->pos; out_reader->len = len; return true; } bool kmip_reader_has_data (kmip_reader_t *reader) { return reader->pos < reader->len; } #define CHECK_REMAINING_BUFFER_AND_RET(read_size) \ if ((reader->pos + (read_size)) > reader->len) { \ return false; \ } bool kmip_reader_read_u8 (kmip_reader_t *reader, uint8_t *value) { CHECK_REMAINING_BUFFER_AND_RET (sizeof (uint8_t)); *value = *(reader->ptr + reader->pos); reader->pos += sizeof (uint8_t); return true; } bool kmip_reader_read_u16 (kmip_reader_t *reader, uint16_t *value) { CHECK_REMAINING_BUFFER_AND_RET (sizeof (uint16_t)); uint16_t temp; memcpy (&temp, reader->ptr + reader->pos, sizeof (uint16_t)); *value = KMS_UINT16_FROM_BE (temp); reader->pos += sizeof (uint16_t); return true; } bool kmip_reader_read_u32 (kmip_reader_t *reader, uint32_t *value) { CHECK_REMAINING_BUFFER_AND_RET (sizeof (uint32_t)); uint32_t temp; memcpy (&temp, reader->ptr + reader->pos, sizeof (uint32_t)); *value = KMS_UINT32_FROM_BE (temp); reader->pos += sizeof (uint32_t); return true; } bool kmip_reader_read_u64 (kmip_reader_t *reader, uint64_t *value) { CHECK_REMAINING_BUFFER_AND_RET (sizeof (uint64_t)); uint64_t temp; memcpy (&temp, reader->ptr + reader->pos, sizeof (uint64_t)); *value = KMS_UINT64_FROM_BE (temp); reader->pos += sizeof (uint64_t); return true; } bool kmip_reader_read_bytes (kmip_reader_t *reader, uint8_t **ptr, size_t length) { size_t advance_length = compute_padded_length (length); CHECK_REMAINING_BUFFER_AND_RET (advance_length); *ptr = reader->ptr + reader->pos; reader->pos += advance_length; return true; } #define CHECK_AND_RET(x) \ if (!(x)) { \ return false; \ } bool kmip_reader_read_tag (kmip_reader_t *reader, kmip_tag_type_t *tag) { uint8_t tag_first; CHECK_AND_RET (kmip_reader_read_u8 (reader, &tag_first)); if (tag_first != 0x42) { return false; } uint16_t tag_second; CHECK_AND_RET (kmip_reader_read_u16 (reader, &tag_second)); *tag = (kmip_tag_type_t) (0x420000 + tag_second); return true; } bool kmip_reader_read_length (kmip_reader_t *reader, uint32_t *length) { return kmip_reader_read_u32 (reader, length); } bool kmip_reader_read_type (kmip_reader_t *reader, kmip_item_type_t *type) { uint8_t u8; CHECK_AND_RET (kmip_reader_read_u8 (reader, &u8)); *type = (kmip_item_type_t) u8; return true; } bool kmip_reader_read_enumeration (kmip_reader_t *reader, uint32_t *enum_value) { CHECK_AND_RET (kmip_reader_read_u32 (reader, enum_value)); /* Skip 4 bytes because enums are padded. */ uint32_t ignored; return kmip_reader_read_u32 (reader, &ignored); } bool kmip_reader_read_integer (kmip_reader_t *reader, int32_t *value) { CHECK_AND_RET (kmip_reader_read_u32 (reader, (uint32_t*) value)); /* Skip 4 bytes because integers are padded. */ uint32_t ignored; return kmip_reader_read_u32 (reader, &ignored); } bool kmip_reader_read_long_integer (kmip_reader_t *reader, int64_t *value) { return kmip_reader_read_u64 (reader, (uint64_t*) value); } bool kmip_reader_read_string (kmip_reader_t *reader, uint8_t **ptr, size_t length) { return kmip_reader_read_bytes (reader, ptr, length); } bool kmip_reader_find (kmip_reader_t *reader, kmip_tag_type_t search_tag, kmip_item_type_t type, size_t *pos, size_t *length) { reader->pos = 0; while (kmip_reader_has_data (reader)) { kmip_tag_type_t read_tag; CHECK_AND_RET (kmip_reader_read_tag (reader, &read_tag)); kmip_item_type_t read_type; CHECK_AND_RET (kmip_reader_read_type (reader, &read_type)); uint32_t read_length; CHECK_AND_RET (kmip_reader_read_length (reader, &read_length)); if (read_tag == search_tag && read_type == type) { *pos = reader->pos; *length = read_length; return true; } size_t advance_length = read_length; advance_length = compute_padded_length (advance_length); CHECK_REMAINING_BUFFER_AND_RET (advance_length); /* Skip to the next type. */ reader->pos += advance_length; } return false; } bool kmip_reader_find_and_recurse (kmip_reader_t *reader, kmip_tag_type_t tag) { size_t pos; size_t length; if (!kmip_reader_find (reader, tag, KMIP_ITEM_TYPE_Structure, &pos, &length)) { return false; } reader->pos = 0; reader->ptr = reader->ptr + pos; reader->len = length; return true; } bool kmip_reader_find_and_read_enum (kmip_reader_t *reader, kmip_tag_type_t tag, uint32_t *value) { size_t pos; size_t length; if (!kmip_reader_find (reader, tag, KMIP_ITEM_TYPE_Enumeration, &pos, &length)) { return false; } kmip_reader_t temp_reader; if (!kmip_reader_in_place (reader, pos, length, &temp_reader)) { return false; } return kmip_reader_read_enumeration (&temp_reader, value); } bool kmip_reader_find_and_read_bytes (kmip_reader_t *reader, kmip_tag_type_t tag, uint8_t **out_ptr, size_t *out_len) { size_t pos; if (!kmip_reader_find (reader, tag, KMIP_ITEM_TYPE_ByteString, &pos, out_len)) { return false; } kmip_reader_t temp_reader; if (!kmip_reader_in_place (reader, pos, *out_len, &temp_reader)) { return false; } return kmip_reader_read_bytes (&temp_reader, out_ptr, *out_len); } mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_reader_writer_private.h000066400000000000000000000102051456567454500267000ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_READER_WRITER_PRIVATE_H #define KMS_KMIP_READER_WRITER_PRIVATE_H #include "kms_kmip_item_type_private.h" #include "kms_kmip_tag_type_private.h" #include "kms_message_private.h" #include typedef struct _kmip_writer_t kmip_writer_t; kmip_writer_t * kmip_writer_new (void); void kmip_writer_destroy (kmip_writer_t *writer); void kmip_writer_write_u8 (kmip_writer_t *writer, uint8_t value); void kmip_writer_write_u16 (kmip_writer_t *writer, uint16_t value); void kmip_writer_write_u32 (kmip_writer_t *writer, uint32_t value); void kmip_writer_write_u64 (kmip_writer_t *writer, uint64_t value); void kmip_writer_write_tag_enum (kmip_writer_t *writer, kmip_tag_type_t tag); void kmip_writer_write_string (kmip_writer_t *writer, kmip_tag_type_t tag, const char *str, size_t len); void kmip_writer_write_bytes (kmip_writer_t *writer, kmip_tag_type_t tag, const char *str, size_t len); void kmip_writer_write_integer (kmip_writer_t *writer, kmip_tag_type_t tag, int32_t value); void kmip_writer_write_long_integer (kmip_writer_t *writer, kmip_tag_type_t tag, int64_t value); void kmip_writer_write_enumeration (kmip_writer_t *writer, kmip_tag_type_t tag, int32_t value); void kmip_writer_write_datetime (kmip_writer_t *writer, kmip_tag_type_t tag, int64_t value); void kmip_writer_begin_struct (kmip_writer_t *writer, kmip_tag_type_t tag); void kmip_writer_close_struct (kmip_writer_t *writer); const uint8_t * kmip_writer_get_buffer (kmip_writer_t *writer, size_t* len); typedef struct _kmip_reader_t kmip_reader_t; kmip_reader_t * kmip_reader_new (uint8_t *ptr, size_t len); void kmip_reader_destroy (kmip_reader_t *reader); bool kmip_reader_in_place (kmip_reader_t *reader, size_t pos, size_t len, kmip_reader_t *out_reader); bool kmip_reader_has_data (kmip_reader_t *reader); bool kmip_reader_read_u8 (kmip_reader_t *reader, uint8_t *value); bool kmip_reader_read_u16 (kmip_reader_t *reader, uint16_t *value); bool kmip_reader_read_u32 (kmip_reader_t *reader, uint32_t *value); bool kmip_reader_read_u64 (kmip_reader_t *reader, uint64_t *value); bool kmip_reader_read_tag (kmip_reader_t *reader, kmip_tag_type_t *tag); bool kmip_reader_read_length (kmip_reader_t *reader, uint32_t *length); bool kmip_reader_read_type (kmip_reader_t *reader, kmip_item_type_t *type); bool kmip_reader_read_enumeration (kmip_reader_t *reader, uint32_t *enum_value); bool kmip_reader_read_integer (kmip_reader_t *reader, int32_t *value); bool kmip_reader_read_long_integer (kmip_reader_t *reader, int64_t *value); bool kmip_reader_read_bytes (kmip_reader_t *reader, uint8_t **ptr, size_t length); bool kmip_reader_read_string (kmip_reader_t *reader, uint8_t **ptr, size_t length); /* kmip_reader_find does not descend structures. * To find and descend into a structure use kmip_reader_find_and_recurse. */ bool kmip_reader_find (kmip_reader_t *reader, kmip_tag_type_t search_tag, kmip_item_type_t type, size_t *pos, size_t *length); bool kmip_reader_find_and_recurse (kmip_reader_t *reader, kmip_tag_type_t tag); bool kmip_reader_find_and_read_enum (kmip_reader_t *reader, kmip_tag_type_t tag, uint32_t *value); bool kmip_reader_find_and_read_bytes (kmip_reader_t *reader, kmip_tag_type_t tag, uint8_t **out_ptr, size_t *out_len); #endif /* KMS_KMIP_READER_WRITER_PRIVATE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_request.c000066400000000000000000000241311456567454500237760ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_kmip_request.h" #include "kms_message_private.h" #include "kms_kmip_reader_writer_private.h" #include #include static void copy_writer_buffer (kms_request_t *req, kmip_writer_t *writer) { const uint8_t *buf; size_t buflen; buf = kmip_writer_get_buffer (writer, &buflen); req->kmip.data = malloc (buflen); memcpy (req->kmip.data, buf, buflen); req->kmip.len = (uint32_t) buflen; } kms_request_t * kms_kmip_request_register_secretdata_new (void *reserved, const uint8_t *data, size_t len) { /* Create a KMIP Register request with a 96 byte SecretData of this form: */ kmip_writer_t *writer; kms_request_t *req; req = calloc (1, sizeof (kms_request_t)); req->provider = KMS_REQUEST_PROVIDER_KMIP; if (len != KMS_KMIP_REQUEST_SECRETDATA_LENGTH) { KMS_ERROR (req, "expected SecretData length of %d, got %" PRIu32, KMS_KMIP_REQUEST_SECRETDATA_LENGTH, len); return req; } writer = kmip_writer_new (); kmip_writer_begin_struct (writer, KMIP_TAG_RequestMessage); kmip_writer_begin_struct (writer, KMIP_TAG_RequestHeader); kmip_writer_begin_struct (writer, KMIP_TAG_ProtocolVersion); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMajor, 1); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMinor, 0); kmip_writer_close_struct (writer); /* KMIP_TAG_ProtocolVersion */ kmip_writer_write_integer (writer, KMIP_TAG_BatchCount, 1); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestHeader */ kmip_writer_begin_struct (writer, KMIP_TAG_BatchItem); /* 0x03 == Register */ kmip_writer_write_enumeration (writer, KMIP_TAG_Operation, 0x03); kmip_writer_begin_struct (writer, KMIP_TAG_RequestPayload); /* 0x07 == SecretData */ kmip_writer_write_enumeration (writer, KMIP_TAG_ObjectType, 0x07); kmip_writer_begin_struct (writer, KMIP_TAG_TemplateAttribute); // Add required Cryptographic Usage Mask attribute. { kmip_writer_begin_struct (writer, KMIP_TAG_Attribute); const char *cryptographicUsageMaskStr = "Cryptographic Usage Mask"; kmip_writer_write_string (writer, KMIP_TAG_AttributeName, cryptographicUsageMaskStr, strlen (cryptographicUsageMaskStr)); // Use 0 because the Secret Data object is not used in cryptographic // operations on the KMIP server. kmip_writer_write_integer (writer, KMIP_TAG_AttributeValue, 0); kmip_writer_close_struct (writer); } kmip_writer_close_struct (writer); /* KMIP_TAG_TemplateAttribute */ kmip_writer_begin_struct (writer, KMIP_TAG_SecretData); /* 0x02 = Seed */ kmip_writer_write_enumeration (writer, KMIP_TAG_SecretDataType, 0x02); kmip_writer_begin_struct (writer, KMIP_TAG_KeyBlock); /* 0x02 = Opaque */ kmip_writer_write_enumeration (writer, KMIP_TAG_KeyFormatType, 0x02); kmip_writer_begin_struct (writer, KMIP_TAG_KeyValue); kmip_writer_write_bytes ( writer, KMIP_TAG_KeyMaterial, (const char *) data, len); kmip_writer_close_struct (writer); /* KMIP_TAG_KeyValue */ kmip_writer_close_struct (writer); /* KMIP_TAG_KeyBlock */ kmip_writer_close_struct (writer); /* KMIP_TAG_SecretData */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestPayload */ kmip_writer_close_struct (writer); /* KMIP_TAG_BatchItem */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestMessage */ copy_writer_buffer (req, writer); kmip_writer_destroy (writer); return req; } kms_request_t * kms_kmip_request_activate_new (void *reserved, const char *unique_identifer) { /* Create a KMIP Activate request of this form: */ kmip_writer_t *writer; kms_request_t *req; req = calloc (1, sizeof (kms_request_t)); req->provider = KMS_REQUEST_PROVIDER_KMIP; writer = kmip_writer_new (); kmip_writer_begin_struct (writer, KMIP_TAG_RequestMessage); kmip_writer_begin_struct (writer, KMIP_TAG_RequestHeader); kmip_writer_begin_struct (writer, KMIP_TAG_ProtocolVersion); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMajor, 1); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMinor, 0); kmip_writer_close_struct (writer); /* KMIP_TAG_ProtocolVersion */ kmip_writer_write_integer (writer, KMIP_TAG_BatchCount, 1); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestHeader */ kmip_writer_begin_struct (writer, KMIP_TAG_BatchItem); /* 0x0A == Get */ kmip_writer_write_enumeration (writer, KMIP_TAG_Operation, 0x12); kmip_writer_begin_struct (writer, KMIP_TAG_RequestPayload); kmip_writer_write_string (writer, KMIP_TAG_UniqueIdentifier, unique_identifer, strlen (unique_identifer)); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestPayload */ kmip_writer_close_struct (writer); /* KMIP_TAG_BatchItem */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestMessage */ copy_writer_buffer (req, writer); kmip_writer_destroy (writer); return req; } kms_request_t * kms_kmip_request_get_new (void *reserved, const char *unique_identifer) { /* Create a KMIP Get request of this form: */ kmip_writer_t *writer; kms_request_t *req; req = calloc (1, sizeof (kms_request_t)); req->provider = KMS_REQUEST_PROVIDER_KMIP; writer = kmip_writer_new (); kmip_writer_begin_struct (writer, KMIP_TAG_RequestMessage); kmip_writer_begin_struct (writer, KMIP_TAG_RequestHeader); kmip_writer_begin_struct (writer, KMIP_TAG_ProtocolVersion); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMajor, 1); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMinor, 0); kmip_writer_close_struct (writer); /* KMIP_TAG_ProtocolVersion */ kmip_writer_write_integer (writer, KMIP_TAG_BatchCount, 1); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestHeader */ kmip_writer_begin_struct (writer, KMIP_TAG_BatchItem); /* 0x0A == Get */ kmip_writer_write_enumeration (writer, KMIP_TAG_Operation, 0x0A); kmip_writer_begin_struct (writer, KMIP_TAG_RequestPayload); kmip_writer_write_string (writer, KMIP_TAG_UniqueIdentifier, unique_identifer, strlen (unique_identifer)); /* 0x01 = Raw */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestPayload */ kmip_writer_close_struct (writer); /* KMIP_TAG_BatchItem */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestMessage */ /* Copy the KMIP writer buffer to a KMIP request. */ copy_writer_buffer (req, writer); kmip_writer_destroy (writer); return req; } mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_response.c000066400000000000000000000242051456567454500241460ustar00rootroot00000000000000#include "kms_message/kms_kmip_response.h" #include "kms_message_private.h" #include "kms_kmip_reader_writer_private.h" #include "kms_kmip_result_reason_private.h" #include "kms_kmip_result_status_private.h" #include #include #include /* CHAR_BIT */ static bool check_and_require_kmip (kms_response_t *res) { if (res->provider != KMS_REQUEST_PROVIDER_KMIP) { KMS_ERROR (res, "Function requires KMIP request"); return false; } return true; } /* Example of an error message: */ static bool kms_kmip_response_ok (kms_response_t *res) { kmip_reader_t *reader = NULL; size_t pos; size_t len; uint32_t result_status; uint32_t result_reason = 0; const char *result_message = ""; uint32_t result_message_len = 0; bool ok = false; reader = kmip_reader_new (res->kmip.data, res->kmip.len); if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponseMessage)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponseMessage)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_BatchItem)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_BatchItem)); goto fail; } /* Look for optional Result Reason. */ if (kmip_reader_find (reader, KMIP_TAG_ResultReason, KMIP_ITEM_TYPE_Enumeration, &pos, &len)) { if (!kmip_reader_read_enumeration (reader, &result_reason)) { KMS_ERROR (res, "unable to read result reason value"); goto fail; } } /* Look for optional Result Message. */ if (kmip_reader_find (reader, KMIP_TAG_ResultMessage, KMIP_ITEM_TYPE_TextString, &pos, &len)) { if (!kmip_reader_read_string ( reader, (uint8_t **) &result_message, len)) { KMS_ERROR (res, "unable to read result message value"); goto fail; } result_message_len = (uint32_t) len; } /* Look for required Result Status. */ if (!kmip_reader_find (reader, KMIP_TAG_ResultStatus, KMIP_ITEM_TYPE_Enumeration, &pos, &len)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResultStatus)); goto fail; } if (!kmip_reader_read_enumeration (reader, &result_status)) { KMS_ERROR (res, "unable to read result status value"); goto fail; } if (result_status != KMIP_RESULT_STATUS_OperationSuccess) { KMS_ERROR (res, "KMIP response error. Result Status (%" PRIu32 "): %s. Result Reason (%" PRIu32 "): %s. Result Message: %.*s", result_status, kmip_result_status_to_string (result_status), result_reason, kmip_result_reason_to_string (result_reason), result_message_len, result_message); goto fail; } ok = true; fail: kmip_reader_destroy (reader); return ok; } /* Example of a successful response to a Register request: */ char * kms_kmip_response_get_unique_identifier (kms_response_t *res) { kmip_reader_t *reader = NULL; size_t pos; size_t len; char *uid = NULL; kms_request_str_t *nullterminated = NULL; if (!check_and_require_kmip (res)) { goto fail; } if (!kms_kmip_response_ok (res)) { goto fail; } reader = kmip_reader_new (res->kmip.data, res->kmip.len); if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponseMessage)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponseMessage)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_BatchItem)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_BatchItem)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponsePayload)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponsePayload)); goto fail; } if (!kmip_reader_find (reader, KMIP_TAG_UniqueIdentifier, KMIP_ITEM_TYPE_TextString, &pos, &len)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_UniqueIdentifier)); goto fail; } if (!kmip_reader_read_string (reader, (uint8_t **) &uid, len)) { KMS_ERROR (res, "unable to read unique identifier"); goto fail; } KMS_ASSERT (len <= SSIZE_MAX); nullterminated = kms_request_str_new_from_chars (uid, (ssize_t) len); fail: kmip_reader_destroy (reader); return kms_request_str_detach (nullterminated); } /* Example of a successful response to a Get request: */ uint8_t * kms_kmip_response_get_secretdata (kms_response_t *res, size_t *secretdatalen) { kmip_reader_t *reader = NULL; size_t pos; size_t len; uint8_t *secretdata = NULL; uint8_t *tmp; if (!check_and_require_kmip (res)) { goto fail; } if (!kms_kmip_response_ok (res)) { goto fail; } reader = kmip_reader_new (res->kmip.data, res->kmip.len); if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponseMessage)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponseMessage)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_BatchItem)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_BatchItem)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponsePayload)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponsePayload)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_SecretData)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_SecretData)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_KeyBlock)) { KMS_ERROR ( res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_KeyBlock)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_KeyValue)) { KMS_ERROR ( res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_KeyValue)); goto fail; } if (!kmip_reader_find (reader, KMIP_TAG_KeyMaterial, KMIP_ITEM_TYPE_ByteString, &pos, &len)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_KeyMaterial)); goto fail; } if (!kmip_reader_read_bytes (reader, &tmp, len)) { KMS_ERROR (res, "unable to read secretdata bytes"); goto fail; } secretdata = malloc (len); memcpy (secretdata, tmp, len); *secretdatalen = len; fail: kmip_reader_destroy (reader); return secretdata; } mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_response_parser.c000066400000000000000000000105071456567454500255220ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_kmip_response_parser.h" #include "kms_endian_private.h" #include "kms_kmip_response_parser_private.h" #include "kms_message_private.h" #include "kms_request_str.h" struct _kms_kmip_response_parser_t { uint32_t first_len; uint32_t bytes_fed; kms_request_str_t *buf; bool failed; char error[512]; }; /* FIRST_LENGTH_OFFSET is the offset of the first Length in a TTLV sequence. The * sequence is: Tag (3 bytes), Type (1 byte), Length (4 bytes), Value (Length * bytes). */ static const uint32_t FIRST_LENGTH_OFFSET = 4; /* _parser_destroy destroys the fields of parser, but not the parser itself. */ static void _parser_destroy (kms_kmip_response_parser_t *parser) { kms_request_str_destroy (parser->buf); } /* _parser_init initializes the members of parser. */ static void _parser_init (kms_kmip_response_parser_t *parser) { memset (parser, 0, sizeof (*parser)); parser->buf = kms_request_str_new (); } kms_response_parser_t * kms_kmip_response_parser_new (void *reserved) { kms_response_parser_t *parser = kms_response_parser_new (); parser->kmip = malloc (sizeof (kms_kmip_response_parser_t)); _parser_init (parser->kmip); return parser; } int32_t kms_kmip_response_parser_wants_bytes (const kms_kmip_response_parser_t *parser, int32_t max) { int32_t wants_bytes; uint32_t total_len; uint32_t want_bytes_pending; if (parser->bytes_fed < KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH) { wants_bytes = KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH - (int32_t) parser->bytes_fed; } else { KMS_ASSERT (parser->first_len <= UINT32_MAX - KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH); total_len = parser->first_len + KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH; KMS_ASSERT (total_len >= parser->bytes_fed); want_bytes_pending = total_len - parser->bytes_fed; KMS_ASSERT (want_bytes_pending <= (uint32_t) INT32_MAX); wants_bytes = (int32_t) want_bytes_pending; } if (max < wants_bytes) { return max; } return wants_bytes; } bool kms_kmip_response_parser_feed (kms_kmip_response_parser_t *parser, const uint8_t *buf, uint32_t len) { kms_request_str_append_chars (parser->buf, (char *) buf, len); parser->bytes_fed += len; if (parser->first_len > 0) { if (parser->bytes_fed > parser->first_len + KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH) { KMS_ERROR (parser, "KMIP parser was fed too much data"); return false; } } else if (parser->first_len == 0 && parser->bytes_fed >= KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH) { uint32_t temp; memcpy (&temp, parser->buf->str + FIRST_LENGTH_OFFSET, sizeof (uint32_t)); parser->first_len = KMS_UINT32_FROM_BE (temp); } return true; } kms_response_t * kms_kmip_response_parser_get_response (kms_kmip_response_parser_t *parser) { kms_response_t *res; if (kms_kmip_response_parser_wants_bytes (parser, 1) != 0) { KMS_ERROR (parser, "KMIP parser does not have a complete message"); return NULL; } res = calloc (1, sizeof (kms_response_t)); res->provider = KMS_REQUEST_PROVIDER_KMIP; res->kmip.len = (uint32_t) parser->buf->len; res->kmip.data = (uint8_t *) kms_request_str_detach (parser->buf); parser->buf = NULL; /* Reinitialize for reuse. */ _parser_destroy (parser); _parser_init (parser); return res; } const char * kms_kmip_response_parser_error (const kms_kmip_response_parser_t *parser) { return parser->failed ? parser->error : NULL; } void kms_kmip_response_parser_destroy (kms_kmip_response_parser_t *parser) { if (!parser) { return; } _parser_destroy (parser); free (parser); } mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_response_parser_private.h000066400000000000000000000037031456567454500272610ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESPONSE_PARSER_PRIVATE_H #define KMS_KMIP_RESPONSE_PARSER_PRIVATE_H #include "kms_message/kms_response.h" #include #include /* kms_kmip_response_parser_t is a private type used for parsing a KMIP * response. */ typedef struct _kms_kmip_response_parser_t kms_kmip_response_parser_t; /* KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH is the number of bytes needed by the * parser to determine the total length of the message being parsed. * It includes the first Length in a TTLV sequence. The sequence is: Tag (3 * bytes), Type (1 byte), Length (4 bytes), Value (Length bytes). */ #define KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH 8 int32_t kms_kmip_response_parser_wants_bytes (const kms_kmip_response_parser_t *parser, int32_t max); bool kms_kmip_response_parser_feed (kms_kmip_response_parser_t *parser, const uint8_t *buf, uint32_t len); /* kms_kmip_response_parser_get_response returns a kms_response_t and resets the * parser. */ kms_response_t * kms_kmip_response_parser_get_response (kms_kmip_response_parser_t *parser); void kms_kmip_response_parser_destroy (kms_kmip_response_parser_t *parser); const char * kms_kmip_response_parser_error (const kms_kmip_response_parser_t *parser); #endif /* KMS_KMIP_RESPONSE_PARSER_PRIVATE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_result_reason_private.h000066400000000000000000000076571456567454500267500ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESULT_REASON_PRIVATE_H #define KMS_KMIP_RESULT_REASON_PRIVATE_H #include "kms_message/kms_message_defines.h" /* clang-format off */ #define KMS_XMACRO \ KMS_X (ItemNotFound, "Item Not Found", 0x00000001) \ KMS_X (ResponseTooLarge, "Response Too Large", 0x00000002) \ KMS_X (AuthenticationNotSuccessful, "Authentication Not Successful", 0x00000003) \ KMS_X (InvalidMessage, "Invalid Message", 0x00000004) \ KMS_X (OperationNotSupported, "Operation Not Supported", 0x00000005) \ KMS_X (MissingData, "Missing Data", 0x00000006) \ KMS_X (InvalidField, "Invalid Field", 0x00000007) \ KMS_X (FeatureNotSupported, "Feature Not Supported", 0x00000008) \ KMS_X (OperationCanceledByRequester, "Operation Canceled By Requester", 0x00000009) \ KMS_X (CryptographicFailure, "Cryptographic Failure", 0x0000000A) \ KMS_X (IllegalOperation, "Illegal Operation", 0x0000000B) \ KMS_X (PermissionDenied, "Permission Denied", 0x0000000C) \ KMS_X (Objectarchived, "Object archived", 0x0000000D) \ KMS_X (IndexOutofBounds, "Index Out of Bounds", 0x0000000E) \ KMS_X (ApplicationNamespaceNotSupported, "Application Namespace Not Supported", 0x0000000F) \ KMS_X (KeyFormatTypeNotSupported, "Key Format Type Not Supported", 0x00000010) \ KMS_X (KeyCompressionTypeNotSupported, "Key Compression Type Not Supported", 0x00000011) \ KMS_X (EncodingOptionError, "Encoding Option Error", 0x00000012) \ KMS_X (KeyValueNotPresent, "Key Value Not Present", 0x00000013) \ KMS_X (AttestationRequired, "Attestation Required", 0x00000014) \ KMS_X (AttestationFailed, "Attestation Failed", 0x00000015) \ KMS_X (Sensitive, "Sensitive", 0x00000016) \ KMS_X (NotExtractable, "Not Extractable", 0x00000017) \ KMS_X (ObjectAlreadyExists, "Object Already Exists", 0x00000018) \ KMS_X_LAST (GeneralFailure, "General Failure", 0x00000100) /* clang-format on */ /* Generate an enum with each result_reason value. */ #define KMS_X(RESULT_REASON, STR, VAL) KMIP_RESULT_REASON_##RESULT_REASON = VAL, #define KMS_X_LAST(RESULT_REASON, STR, VAL) \ KMIP_RESULT_REASON_##RESULT_REASON = VAL typedef enum { KMS_XMACRO } kmip_result_reason_t; #undef KMS_X #undef KMS_X_LAST #define KMS_X(RESULT_REASON, STR, VAL) \ case KMIP_RESULT_REASON_##RESULT_REASON: \ return STR; #define KMS_X_LAST KMS_X static KMS_MSG_INLINE const char * kmip_result_reason_to_string (kmip_result_reason_t result_reason) { switch (result_reason) { default: return "Unknown KMIP result reason"; KMS_XMACRO } } #undef KMS_X #undef KMS_X_LAST #undef KMS_XMACRO #endif /* KMS_KMIP_RESULT_REASON_PRIVATE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_result_status_private.h000066400000000000000000000034071456567454500267710ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESULT_STATUS_PRIVATE_H #define KMS_KMIP_RESULT_STATUS_PRIVATE_H #include "kms_message/kms_message_defines.h" #define KMS_XMACRO \ KMS_X (OperationSuccess, "Success", 0x00000000) \ KMS_X (OperationFailed, "Operation Failed", 0x00000001) \ KMS_X (OperationPending, "Operation Pending", 0x00000002) \ KMS_X_LAST (OperationUndone, "Operation Undone", 0x00000003) /* Generate an enum with each result_status value. */ #define KMS_X(RESULT_STATUS, STR, VAL) KMIP_RESULT_STATUS_##RESULT_STATUS = VAL, #define KMS_X_LAST(RESULT_STATUS, STR, VAL) \ KMIP_RESULT_STATUS_##RESULT_STATUS = VAL typedef enum { KMS_XMACRO } kmip_result_status_t; #undef KMS_X #undef KMS_X_LAST #define KMS_X(RESULT_STATUS, STR, VAL) \ case KMIP_RESULT_STATUS_##RESULT_STATUS: \ return STR; #define KMS_X_LAST KMS_X static KMS_MSG_INLINE const char * kmip_result_status_to_string (kmip_result_status_t result_status) { switch (result_status) { default: return "Unknown KMIP result status"; KMS_XMACRO } } #undef KMS_X #undef KMS_X_LAST #undef KMS_XMACRO #endif /* KMS_KMIP_RESULT_STATUS_PRIVATE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_kmip_tag_type_private.h000066400000000000000000000702351456567454500256670ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_TAG_TYPE_PRIVATE_H #define KMS_KMIP_TAG_TYPE_PRIVATE_H #include "kms_message/kms_message_defines.h" /* clang-format off */ #define KMS_XMACRO \ KMS_X (ActivationDate, 0x420001) \ KMS_X (ApplicationData, 0x420002) \ KMS_X (ApplicationNamespace, 0x420003) \ KMS_X (ApplicationSpecificInformation, 0x420004) \ KMS_X (ArchiveDate, 0x420005) \ KMS_X (AsynchronousCorrelationValue, 0x420006) \ KMS_X (AsynchronousIndicator, 0x420007) \ KMS_X (Attribute, 0x420008) \ KMS_X (AttributeIndex, 0x420009) \ KMS_X (AttributeName, 0x42000A) \ KMS_X (AttributeValue, 0x42000B) \ KMS_X (Authentication, 0x42000C) \ KMS_X (BatchCount, 0x42000D) \ KMS_X (BatchErrorContinuationOption, 0x42000E) \ KMS_X (BatchItem, 0x42000F) \ KMS_X (BatchOrderOption, 0x420010) \ KMS_X (BlockCipherMode, 0x420011) \ KMS_X (CancellationResult, 0x420012) \ KMS_X (Certificate, 0x420013) \ KMS_X (CertificateIdentifier, 0x420014) /* deprecated as of version 1.1 */ \ KMS_X (CertificateIssuer, 0x420015) /* deprecated as of version 1.1 */ \ KMS_X (CertificateIssuerAlternativeName, 0x420016) /* deprecated as of version 1.1 */ \ KMS_X (CertificateIssuerDistinguishedName, 0x420017) /* deprecated as of version 1.1 */ \ KMS_X (CertificateRequest, 0x420018) \ KMS_X (CertificateRequestType, 0x420019) \ KMS_X (CertificateSubject, 0x42001A) /* deprecated as of version 1.1 */ \ KMS_X (CertificateSubjectAlternativeName, 0x42001B) /* deprecated as of version 1.1 */ \ KMS_X (CertificateSubjectDistinguishedName, 0x42001C) /* deprecated as of version 1.1 */ \ KMS_X (CertificateType, 0x42001D) \ KMS_X (CertificateValue, 0x42001E) \ KMS_X (CommonTemplateAttribute, 0x42001F) \ KMS_X (CompromiseDate, 0x420020) \ KMS_X (CompromiseOccurrenceDate, 0x420021) \ KMS_X (ContactInformation, 0x420022) \ KMS_X (Credential, 0x420023) \ KMS_X (CredentialType, 0x420024) \ KMS_X (CredentialValue, 0x420025) \ KMS_X (CriticalityIndicator, 0x420026) \ KMS_X (CRTCoefficient, 0x420027) \ KMS_X (CryptographicAlgorithm, 0x420028) \ KMS_X (CryptographicDomainParameters, 0x420029) \ KMS_X (CryptographicLength, 0x42002A) \ KMS_X (CryptographicParameters, 0x42002B) \ KMS_X (CryptographicUsageMask, 0x42002C) \ KMS_X (CustomAttribute, 0x42002D) \ KMS_X (D, 0x42002E) \ KMS_X (DeactivationDate, 0x42002F) \ KMS_X (DerivationData, 0x420030) \ KMS_X (DerivationMethod, 0x420031) \ KMS_X (DerivationParameters, 0x420032) \ KMS_X (DestroyDate, 0x420033) \ KMS_X (Digest, 0x420034) \ KMS_X (DigestValue, 0x420035) \ KMS_X (EncryptionKeyInformation, 0x420036) \ KMS_X (G, 0x420037) \ KMS_X (HashingAlgorithm, 0x420038) \ KMS_X (InitialDate, 0x420039) \ KMS_X (InitializationVector, 0x42003A) \ KMS_X (Issuer, 0x42003B) /* deprecated as of version 1.1 */ \ KMS_X (IterationCount, 0x42003C) \ KMS_X (IVCounterNonce, 0x42003D) \ KMS_X (J, 0x42003E) \ KMS_X (Key, 0x42003F) \ KMS_X (KeyBlock, 0x420040) \ KMS_X (KeyCompressionType, 0x420041) \ KMS_X (KeyFormatType, 0x420042) \ KMS_X (KeyMaterial, 0x420043) \ KMS_X (KeyPartIdentifier, 0x420044) \ KMS_X (KeyValue, 0x420045) \ KMS_X (KeyWrappingData, 0x420046) \ KMS_X (KeyWrappingSpecification, 0x420047) \ KMS_X (LastChangeDate, 0x420048) \ KMS_X (LeaseTime, 0x420049) \ KMS_X (Link, 0x42004A) \ KMS_X (LinkType, 0x42004B) \ KMS_X (LinkedObjectIdentifier, 0x42004C) \ KMS_X (MACSignature, 0x42004D) \ KMS_X (MACSignatureKeyInformation, 0x42004E) \ KMS_X (MaximumItems, 0x42004F) \ KMS_X (MaximumResponseSize, 0x420050) \ KMS_X (MessageExtension, 0x420051) \ KMS_X (Modulus, 0x420052) \ KMS_X (Name, 0x420053) \ KMS_X (NameType, 0x420054) \ KMS_X (NameValue, 0x420055) \ KMS_X (ObjectGroup, 0x420056) \ KMS_X (ObjectType, 0x420057) \ KMS_X (Offset, 0x420058) \ KMS_X (OpaqueDataType, 0x420059) \ KMS_X (OpaqueDataValue, 0x42005A) \ KMS_X (OpaqueObject, 0x42005B) \ KMS_X (Operation, 0x42005C) \ KMS_X (OperationPolicyName, 0x42005D) /* deprecated */ \ KMS_X (P, 0x42005E) \ KMS_X (PaddingMethod, 0x42005F) \ KMS_X (PrimeExponentP, 0x420060) \ KMS_X (PrimeExponentQ, 0x420061) \ KMS_X (PrimeFieldSize, 0x420062) \ KMS_X (PrivateExponent, 0x420063) \ KMS_X (PrivateKey, 0x420064) \ KMS_X (PrivateKeyTemplateAttribute, 0x420065) \ KMS_X (PrivateKeyUniqueIdentifier, 0x420066) \ KMS_X (ProcessStartDate, 0x420067) \ KMS_X (ProtectStopDate, 0x420068) \ KMS_X (ProtocolVersion, 0x420069) \ KMS_X (ProtocolVersionMajor, 0x42006A) \ KMS_X (ProtocolVersionMinor, 0x42006B) \ KMS_X (PublicExponent, 0x42006C) \ KMS_X (PublicKey, 0x42006D) \ KMS_X (PublicKeyTemplateAttribute, 0x42006E) \ KMS_X (PublicKeyUniqueIdentifier, 0x42006F) \ KMS_X (PutFunction, 0x420070) \ KMS_X (Q, 0x420071) \ KMS_X (QString, 0x420072) \ KMS_X (Qlength, 0x420073) \ KMS_X (QueryFunction, 0x420074) \ KMS_X (RecommendedCurve, 0x420075) \ KMS_X (ReplacedUniqueIdentifier, 0x420076) \ KMS_X (RequestHeader, 0x420077) \ KMS_X (RequestMessage, 0x420078) \ KMS_X (RequestPayload, 0x420079) \ KMS_X (ResponseHeader, 0x42007A) \ KMS_X (ResponseMessage, 0x42007B) \ KMS_X (ResponsePayload, 0x42007C) \ KMS_X (ResultMessage, 0x42007D) \ KMS_X (ResultReason, 0x42007E) \ KMS_X (ResultStatus, 0x42007F) \ KMS_X (RevocationMessage, 0x420080) \ KMS_X (RevocationReason, 0x420081) \ KMS_X (RevocationReasonCode, 0x420082) \ KMS_X (KeyRoleType, 0x420083) \ KMS_X (Salt, 0x420084) \ KMS_X (SecretData, 0x420085) \ KMS_X (SecretDataType, 0x420086) \ KMS_X (SerialNumber, 0x420087) /* deprecated as of version 1.1 */ \ KMS_X (ServerInformation, 0x420088) \ KMS_X (SplitKey, 0x420089) \ KMS_X (SplitKeyMethod, 0x42008A) \ KMS_X (SplitKeyParts, 0x42008B) \ KMS_X (SplitKeyThreshold, 0x42008C) \ KMS_X (State, 0x42008D) \ KMS_X (StorageStatusMask, 0x42008E) \ KMS_X (SymmetricKey, 0x42008F) \ KMS_X (Template, 0x420090) \ KMS_X (TemplateAttribute, 0x420091) \ KMS_X (TimeStamp, 0x420092) \ KMS_X (UniqueBatchItemID, 0x420093) \ KMS_X (UniqueIdentifier, 0x420094) \ KMS_X (UsageLimits, 0x420095) \ KMS_X (UsageLimitsCount, 0x420096) \ KMS_X (UsageLimitsTotal, 0x420097) \ KMS_X (UsageLimitsUnit, 0x420098) \ KMS_X (Username, 0x420099) \ KMS_X (ValidityDate, 0x42009A) \ KMS_X (ValidityIndicator, 0x42009B) \ KMS_X (VendorExtension, 0x42009C) \ KMS_X (VendorIdentification, 0x42009D) \ KMS_X (WrappingMethod, 0x42009E) \ KMS_X (X, 0x42009F) \ KMS_X (Y, 0x4200A0) \ KMS_X (Password, 0x4200A1) \ KMS_X (DeviceIdentifier, 0x4200A2) \ KMS_X (EncodingOption, 0x4200A3) \ KMS_X (ExtensionInformation, 0x4200A4) \ KMS_X (ExtensionName, 0x4200A5) \ KMS_X (ExtensionTag, 0x4200A6) \ KMS_X (ExtensionType, 0x4200A7) \ KMS_X (Fresh, 0x4200A8) \ KMS_X (MachineIdentifier, 0x4200A9) \ KMS_X (MediaIdentifier, 0x4200AA) \ KMS_X (NetworkIdentifier, 0x4200AB) \ KMS_X (ObjectGroupMember, 0x4200AC) \ KMS_X (CertificateLength, 0x4200AD) \ KMS_X (DigitalSignatureAlgorithm, 0x4200AE) \ KMS_X (CertificateSerialNumber, 0x4200AF) \ KMS_X (DeviceSerialNumber, 0x4200B0) \ KMS_X (IssuerAlternativeName, 0x4200B1) \ KMS_X (IssuerDistinguishedName, 0x4200B2) \ KMS_X (SubjectAlternativeName, 0x4200B3) \ KMS_X (SubjectDistinguishedName, 0x4200B4) \ KMS_X (X509CertificateIdentifier, 0x4200B5) \ KMS_X (X509CertificateIssuer, 0x4200B6) \ KMS_X (X509CertificateSubject, 0x4200B7) \ KMS_X (KeyValueLocation, 0x4200B8) \ KMS_X (KeyValueLocationValue, 0x4200B9) \ KMS_X (KeyValueLocationType, 0x4200BA) \ KMS_X (KeyValuePresent, 0x4200BB) \ KMS_X (OriginalCreationDate, 0x4200BC) \ KMS_X (PGPKey, 0x4200BD) \ KMS_X (PGPKeyVersion, 0x4200BE) \ KMS_X (AlternativeName, 0x4200BF) \ KMS_X (AlternativeNameValue, 0x4200C0) \ KMS_X (AlternativeNameType, 0x4200C1) \ KMS_X (Data, 0x4200C2) \ KMS_X (SignatureData, 0x4200C3) \ KMS_X (DataLength, 0x4200C4) \ KMS_X (RandomIV, 0x4200C5) \ KMS_X (MACData, 0x4200C6) \ KMS_X (AttestationType, 0x4200C7) \ KMS_X (Nonce, 0x4200C8) \ KMS_X (NonceID, 0x4200C9) \ KMS_X (NonceValue, 0x4200CA) \ KMS_X (AttestationMeasurement, 0x4200CB) \ KMS_X (AttestationAssertion, 0x4200CC) \ KMS_X (IVLength, 0x4200CD) \ KMS_X (TagLength, 0x4200CE) \ KMS_X (FixedFieldLength, 0x4200CF) \ KMS_X (CounterLength, 0x4200D0) \ KMS_X (InitialCounterValue, 0x4200D1) \ KMS_X (InvocationFieldLength, 0x4200D2) \ KMS_X (AttestationCapableIndicator, 0x4200D3) \ KMS_X (OffsetItems, 0x4200D4) \ KMS_X (LocatedItems, 0x4200D5) \ KMS_X (CorrelationValue, 0x4200D6) \ KMS_X (InitIndicator, 0x4200D7) \ KMS_X (FinalIndicator, 0x4200D8) \ KMS_X (RNGParameters, 0x4200D9) \ KMS_X (RNGAlgorithm, 0x4200DA) \ KMS_X (DRBGAlgorithm, 0x4200DB) \ KMS_X (FIPS186Variation, 0x4200DC) \ KMS_X (PredictionResistance, 0x4200DD) \ KMS_X (RandomNumberGenerator, 0x4200DE) \ KMS_X (ValidationInformation, 0x4200DF) \ KMS_X (ValidationAuthorityType, 0x4200E0) \ KMS_X (ValidationAuthorityCountry, 0x4200E1) \ KMS_X (ValidationAuthorityURI, 0x4200E2) \ KMS_X (ValidationVersionMajor, 0x4200E3) \ KMS_X (ValidationVersionMinor, 0x4200E4) \ KMS_X (ValidationType, 0x4200E5) \ KMS_X (ValidationLevel, 0x4200E6) \ KMS_X (ValidationCertificateIdentifier, 0x4200E7) \ KMS_X (ValidationCertificateURI, 0x4200E8) \ KMS_X (ValidationVendorURI, 0x4200E9) \ KMS_X (ValidationProfile, 0x4200EA) \ KMS_X (ProfileInformation, 0x4200EB) \ KMS_X (ProfileName, 0x4200EC) \ KMS_X (ServerURI, 0x4200ED) \ KMS_X (ServerPort, 0x4200EE) \ KMS_X (StreamingCapability, 0x4200EF) \ KMS_X (AsynchronousCapability, 0x4200F0) \ KMS_X (AttestationCapability, 0x4200F1) \ KMS_X (UnwrapMode, 0x4200F2) \ KMS_X (DestroyAction, 0x4200F3) \ KMS_X (ShreddingAlgorithm, 0x4200F4) \ KMS_X (RNGMode, 0x4200F5) \ KMS_X (ClientRegistrationMethod, 0x4200F6) \ KMS_X (CapabilityInformation, 0x4200F7) \ KMS_X (KeyWrapType, 0x4200F8) \ KMS_X (BatchUndoCapability, 0x4200F9) \ KMS_X (BatchContinueCapability, 0x4200FA) \ KMS_X (PKCS12FriendlyName, 0x4200FB) \ KMS_X (Description, 0x4200FC) \ KMS_X (Comment, 0x4200FD) \ KMS_X (AuthenticatedEncryptionAdditionalData, 0x4200FE) \ KMS_X (AuthenticatedEncryptionTag, 0x4200FF) \ KMS_X (SaltLength, 0x420100) \ KMS_X (MaskGenerator, 0x420101) \ KMS_X (MaskGeneratorHashingAlgorithm, 0x420102) \ KMS_X (PSource, 0x420103) \ KMS_X (TrailerField, 0x420104) \ KMS_X (ClientCorrelationValue, 0x420105) \ KMS_X (ServerCorrelationValue, 0x420106) \ KMS_X (DigestedData, 0x420107) \ KMS_X (CertificateSubjectCN, 0x420108) \ KMS_X (CertificateSubjectO, 0x420109) \ KMS_X (CertificateSubjectOU, 0x42010A) \ KMS_X (CertificateSubjectEmail, 0x42010B) \ KMS_X (CertificateSubjectC, 0x42010C) \ KMS_X (CertificateSubjectST, 0x42010D) \ KMS_X (CertificateSubjectL, 0x42010E) \ KMS_X (CertificateSubjectUID, 0x42010F) \ KMS_X (CertificateSubjectSerialNumber, 0x420110) \ KMS_X (CertificateSubjectTitle, 0x420111) \ KMS_X (CertificateSubjectDC, 0x420112) \ KMS_X (CertificateSubjectDNQualifier, 0x420113) \ KMS_X (CertificateIssuerCN, 0x420114) \ KMS_X (CertificateIssuerO, 0x420115) \ KMS_X (CertificateIssuerOU, 0x420116) \ KMS_X (CertificateIssuerEmail, 0x420117) \ KMS_X (CertificateIssuerC, 0x420118) \ KMS_X (CertificateIssuerST, 0x420119) \ KMS_X (CertificateIssuerL, 0x42011A) \ KMS_X (CertificateIssuerUID, 0x42011B) \ KMS_X (CertificateIssuerSerialNumber, 0x42011C) \ KMS_X (CertificateIssuerTitle, 0x42011D) \ KMS_X (CertificateIssuerDC, 0x42011E) \ KMS_X (CertificateIssuerDNQualifier, 0x42011F) \ KMS_X (Sensitive, 0x420120) \ KMS_X (AlwaysSensitive, 0x420121) \ KMS_X (Extractable, 0x420122) \ KMS_X (NeverExtractable, 0x420123) \ KMS_X_LAST (ReplaceExisting, 0x420124) /* clang-format on */ /* Generate an enum with each tag value. */ #define KMS_X(TAG, VAL) KMIP_TAG_##TAG = VAL, #define KMS_X_LAST(TAG, VAL) KMIP_TAG_##TAG = VAL typedef enum { KMS_XMACRO } kmip_tag_type_t; #undef KMS_X #undef KMS_X_LAST #define KMS_X(TAG, VAL) \ case KMIP_TAG_##TAG: \ return #TAG; #define KMS_X_LAST KMS_X static KMS_MSG_INLINE const char * kmip_tag_to_string (kmip_tag_type_t tag) { switch (tag) { default: return "Unknown KMIP tag"; KMS_XMACRO } } #undef KMS_X #undef KMS_X_LAST #undef KMS_XMACRO #endif /* KMS_KMIP_TAG_TYPE_PRIVATE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_kv_list.c000066400000000000000000000062741456567454500227510ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_kv_list.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_request_str.h" #include "kms_port.h" #include "sort.h" static void kv_init (kms_kv_t *kv, kms_request_str_t *key, kms_request_str_t *value) { kv->key = kms_request_str_dup (key); kv->value = kms_request_str_dup (value); } static void kv_cleanup (kms_kv_t *kv) { kms_request_str_destroy (kv->key); kms_request_str_destroy (kv->value); } kms_kv_list_t * kms_kv_list_new (void) { kms_kv_list_t *lst = malloc (sizeof (kms_kv_list_t)); KMS_ASSERT (lst); lst->size = 16; lst->kvs = malloc (lst->size * sizeof (kms_kv_t)); KMS_ASSERT (lst->kvs); lst->len = 0; return lst; } void kms_kv_list_destroy (kms_kv_list_t *lst) { size_t i; if (!lst) { return; } for (i = 0; i < lst->len; i++) { kv_cleanup (&lst->kvs[i]); } free (lst->kvs); free (lst); } void kms_kv_list_add (kms_kv_list_t *lst, kms_request_str_t *key, kms_request_str_t *value) { if (lst->len == lst->size) { lst->size *= 2; lst->kvs = realloc (lst->kvs, lst->size * sizeof (kms_kv_t)); KMS_ASSERT (lst->kvs); } kv_init (&lst->kvs[lst->len], key, value); ++lst->len; } const kms_kv_t * kms_kv_list_find (const kms_kv_list_t *lst, const char *key) { size_t i; for (i = 0; i < lst->len; i++) { if (0 == kms_strcasecmp (lst->kvs[i].key->str, key)) { return &lst->kvs[i]; } } return NULL; } void kms_kv_list_del (kms_kv_list_t *lst, const char *key) { size_t i; for (i = 0; i < lst->len; i++) { if (0 == strcmp (lst->kvs[i].key->str, key)) { kv_cleanup (&lst->kvs[i]); memmove (&lst->kvs[i], &lst->kvs[i + 1], sizeof (kms_kv_t) * (lst->len - i - 1)); lst->len--; } } } kms_kv_list_t * kms_kv_list_dup (const kms_kv_list_t *lst) { kms_kv_list_t *dup; size_t i; if (lst->len == 0) { return kms_kv_list_new (); } dup = malloc (sizeof (kms_kv_list_t)); KMS_ASSERT (dup); dup->size = dup->len = lst->len; dup->kvs = malloc (lst->len * sizeof (kms_kv_t)); KMS_ASSERT (dup->kvs); for (i = 0; i < lst->len; i++) { kv_init (&dup->kvs[i], lst->kvs[i].key, lst->kvs[i].value); } return dup; } void kms_kv_list_sort (kms_kv_list_t *lst, int (*cmp) (const void *, const void *)) { /* A stable sort is required to sort headers when creating canonical * requests. qsort is not stable. */ insertionsort ( (unsigned char *) (lst->kvs), lst->len, sizeof (kms_kv_t), cmp); } mongo-c-driver-1.26.0/src/kms-message/src/kms_kv_list.h000066400000000000000000000027271456567454500227550ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KV_LIST_H #define KMS_KV_LIST_H #include "kms_message/kms_message.h" #include "kms_request_str.h" #include #include #include /* key-value pair */ typedef struct { kms_request_str_t *key; kms_request_str_t *value; } kms_kv_t; typedef struct { kms_kv_t *kvs; size_t len; size_t size; } kms_kv_list_t; kms_kv_list_t * kms_kv_list_new (void); void kms_kv_list_destroy (kms_kv_list_t *lst); void kms_kv_list_add (kms_kv_list_t *lst, kms_request_str_t *key, kms_request_str_t *value); const kms_kv_t * kms_kv_list_find (const kms_kv_list_t *lst, const char *key); void kms_kv_list_del (kms_kv_list_t *lst, const char *key); kms_kv_list_t * kms_kv_list_dup (const kms_kv_list_t *lst); void kms_kv_list_sort (kms_kv_list_t *lst, int (*cmp) (const void *, const void *)); #endif /* KMS_KV_LIST_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message.c000066400000000000000000000021241456567454500227100ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_b64.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_crypto.h" #include #include void set_error (char *error, size_t size, const char *fmt, ...) { va_list va; va_start (va, fmt); (void) vsnprintf (error, size, fmt, va); va_end (va); } int kms_message_init (void) { kms_message_b64_initialize_rmap (); return kms_crypto_init (); } void kms_message_cleanup (void) { kms_crypto_cleanup (); } mongo-c-driver-1.26.0/src/kms-message/src/kms_message/000077500000000000000000000000001456567454500225455ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_azure_request.h000066400000000000000000000104021456567454500264630ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_AZURE_REQUEST_H #define KMS_AZURE_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif /* Constructs an oauth client credentials grant request for Azure. * See * https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow#get-a-token. * * Parameters: * All parameters must be NULL terminated strings. * - host: The value of the Host header. This should be a custom host or * "login.microsoftonline.com". * - scope: The oauth scope. This should be a custom scope or * "https%3A%2F%2Fvault.azure.net%2F.default". Must be URL encoded. * - tenant_id: The Azure tenant ID. * - client_id: The client ID to authenticate. * - client_secret: The client secret to authenticate. * - opt: Additional options. This must have the Azure provider set via * kms_request_opt_set_provider. * * Returns: A new kms_request_t. * Always returns a new kms_request_t, even on error. * Caller must check if an error occurred by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_azure_request_oauth_new (const char *host, const char *scope, const char *tenant_id, const char *client_id, const char *client_secret, const kms_request_opt_t *opt); /* Constructs a wrapkey request for Azure. * See https://docs.microsoft.com/en-us/rest/api/keyvault/wrapkey/wrapkey * * Parameters: * All parameters must be NULL terminated strings. * - host: The value of the Host header, like "mykeyvault.vault.azure.net". * - access_token: The access_token obtained from an oauth response as a * base64url encoded string. * - key_name: The azure key name. * - key_version: An optional key version. May be NULL or empty string. * - plaintext: The plaintext key to encrypt. * - plaintext_len: The number of bytes of plaintext. * - opt: Additional options. This must have the Azure provider set via * kms_request_opt_set_provider. */ KMS_MSG_EXPORT (kms_request_t *) kms_azure_request_wrapkey_new (const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *plaintext, size_t plaintext_len, const kms_request_opt_t *opt); /* Constructs an unwrapkey request for Azure. * See https://docs.microsoft.com/en-us/rest/api/keyvault/unwrapkey/unwrapkey * * Parameters: * All parameters must be NULL terminated strings. * - host: The value of the Host header, like "mykeyvault.vault.azure.net". * - access_token: The access_token obtained from an oauth response as a * base64url encoded string. * - key_name: The azure key name. * - key_version: An optional key version. May be NULL or empty string. * - ciphertext: The ciphertext key to decrypt. * - ciphertext_len: The number of bytes of ciphertext. * - opt: Additional options. This must have the Azure provider set via * kms_request_opt_set_provider. */ KMS_MSG_EXPORT (kms_request_t *) kms_azure_request_unwrapkey_new (const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *ciphertext, size_t ciphertext_len, const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_AZURE_REQUEST_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_b64.h000066400000000000000000000036711456567454500241720ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_B64_H #define KMS_MESSAGE_B64_H #include "kms_message.h" #include #include #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (void) kms_message_b64_initialize_rmap (void); KMS_MSG_EXPORT (int) kms_message_b64_ntop (uint8_t const *src, size_t srclength, char *target, size_t targsize); KMS_MSG_EXPORT (int) kms_message_b64_pton (char const *src, uint8_t *target, size_t targsize); /* src and target may be the same string. Assumes no whitespace in src. */ KMS_MSG_EXPORT (int) kms_message_b64_to_b64url (const char *src, size_t srclength, char *target, size_t targsize); KMS_MSG_EXPORT (int) kms_message_b64url_to_b64 (const char *src, size_t srclength, char *target, size_t targsize); /* Convenience conversions which return copies. */ char * kms_message_raw_to_b64 (const uint8_t *raw, size_t raw_len); uint8_t * kms_message_b64_to_raw (const char *b64, size_t *out); char * kms_message_raw_to_b64url (const uint8_t *raw, size_t raw_len); uint8_t * kms_message_b64url_to_raw (const char *b64url, size_t *out); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_MESSAGE_B64_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_caller_identity_request.h000066400000000000000000000017451456567454500305220ustar00rootroot00000000000000/* * Copyright 2019-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_CALLER_IDENTITY_REQUEST_H #define KMS_CALLER_IDENTITY_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (kms_request_t *) kms_caller_identity_request_new (const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_CALLER_IDENTITY_REQUEST_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_decrypt_request.h000066400000000000000000000020421456567454500270100ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_DECRYPT_REQUEST_H #define KMS_DECRYPT_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (kms_request_t *) kms_decrypt_request_new (const uint8_t *ciphertext_blob, size_t len, const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_DECRYPT_REQUEST_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_encrypt_request.h000066400000000000000000000021271456567454500270260ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_ENCRYPT_REQUEST_H #define KMS_ENCRYPT_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (kms_request_t *) kms_encrypt_request_new (const uint8_t *plaintext, size_t plaintext_length, const char *key_id, const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_ENCRYPT_REQUEST_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_gcp_request.h000066400000000000000000000116221456567454500261130ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_GCP_REQUEST_H #define KMS_GCP_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif /* Constructs an oauth client credentials request for GCP. * See https://developers.google.com/identity/protocols/oauth2/service-account * * Parameters: * - host: The host header, like "oauth2.googleapis.com". * - email: The email for the service account to authenticate. * - audience: The "aud" field in the JSON Web Token (JWT). Should be a URL * like "https://oauth2.googleapis.com/token" * - scope: The "scope" field in the JSON Web Token (JWT). Should be a URL * like "https://www.googleapis.com/auth/cloudkms". * - private_key_data: Bytes pointing to a PKCS#8 private key. * - private_key_len: The length of private_key_data. * - opt: Request options. The provider must be set to KMS_REQUEST_PROVIDER_GCP * with kms_request_opt_set_provider. Callers that want to use a custom crypto * callback to sign the request should set the callback on opt with * kms_request_opt_set_crypto_hook_rsaes_pkcs1_v1_5. * * Returns: A new kms_request_t. * Always returns a new kms_request_t, even on error. * Caller must check if an error occurred by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_gcp_request_oauth_new (const char *host, const char *email, const char *audience, const char *scope, const char *private_key_data, size_t private_key_len, const kms_request_opt_t *opt); /* Constructs the encrypt request for GCP. * See * https://cloud.google.com/kms/docs/encrypt-decrypt#kms-encrypt-symmetric-api * * Parameters: * - host: The value of the Host header, like "cloudkms.googleapis.com". * - project_id: The project id. * - location: The location id, like "global". * - key_ring_name: The key ring name. * - key_name: The key name. * - key_version: The optional key version. May be NULL. * - plaintext: The plaintext key to encrypt. * - plaintext_len: The number of bytes of plaintext. * - opt: Request options. The provider must be set to KMS_REQUEST_PROVIDER_GCP * with kms_request_opt_set_provider. * * Returns: A new kms_request_t. * Always returns a new kms_request_t, even on error. * Caller must check if an error occurred by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_gcp_request_encrypt_new (const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const char *key_version, const uint8_t *plaintext, size_t plaintext_len, const kms_request_opt_t *opt); /* Constructs the decrypt request for GCP. * See * https://cloud.google.com/kms/docs/encrypt-decrypt#kms-decrypt-symmetric-api * * Parameters: * - host: The value of the Host header, like "cloudkms.googleapis.com". * - project_id: The project id. * - location: The location id, like "global". * - key_ring_name: The key ring name. * - key_name: The key name. * - ciphertext: The ciphertext key to encrypt. * - ciphertext_len: The number of bytes of ciphertext. * - opt: Request options. The provider must be set to KMS_REQUEST_PROVIDER_GCP * with kms_request_opt_set_provider. * * Returns: A new kms_request_t. * Always returns a new kms_request_t, even on error. * Caller must check if an error occurred by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_gcp_request_decrypt_new (const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const uint8_t *ciphertext, size_t ciphertext_len, const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_GCP_REQUEST_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_kmip_request.h000066400000000000000000000040101456567454500262730ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_REQUEST_H #define KMS_KMIP_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include #ifdef __cplusplus extern "C" { #endif #define KMS_KMIP_REQUEST_SECRETDATA_LENGTH 96 /* kms_kmip_request_register_secretdata_new creates a KMIP Register request with * a SecretData payload of length KMS_KMIP_REQUEST_SECRETDATA_LENGTH. * - len must be KMS_KMIP_REQUEST_SECRETDATA_LENGTH. * - Callers must check for an error by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_kmip_request_register_secretdata_new (void *reserved, const uint8_t *data, size_t len); /* kms_kmip_request_activate_new creates a KMIP Activate request with the * provided unique identifer. * - unique_identifier must be a NULL terminated string. * - Callers must check for an error by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_kmip_request_activate_new (void *reserved, const char *unique_identifier); /* kms_kmip_request_get_new creates a KMIP Get request with the provided unique * identifer. * - unique_identifier must be a NULL terminated string. * - Callers must check for an error by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_kmip_request_get_new (void *reserved, const char *unique_identifier); #ifdef __cplusplus } #endif #endif /* KMS_KMIP_REQUEST_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_kmip_response.h000066400000000000000000000026331456567454500264520ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESPONSE_H #define KMS_KMIP_RESPONSE_H #include "kms_message_defines.h" #include #include "kms_response.h" /* kms_kmip_response_get_unique_identifier returns the UniqueIdentifier in the * first BatchItem in a ResponseMessage. * - Returns a NULL terminated string that the caller must free. * - Returns NULL on error and sets an error on kms_response_t. */ KMS_MSG_EXPORT (char *) kms_kmip_response_get_unique_identifier (kms_response_t *res); /* kms_kmip_response_get_secretdata returns the KeyMaterial in the * first BatchItem in a ResponseMessage. * - Caller must free returned data. * - Returns NULL on error and sets an error on kms_response_t. */ KMS_MSG_EXPORT (uint8_t *) kms_kmip_response_get_secretdata (kms_response_t *res, size_t *secretdatalen); #endif /* KMS_KMIP_RESPONSE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_kmip_response_parser.h000066400000000000000000000015471456567454500300310ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESPONSE_PARSER_H #define KMS_KMIP_RESPONSE_PARSER_H #include "kms_message_defines.h" #include "kms_response_parser.h" KMS_MSG_EXPORT (kms_response_parser_t *) kms_kmip_response_parser_new (void *reserved); #endif /* KMS_KMIP_RESPONSE_PARSER_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_message.h000066400000000000000000000020351456567454500252140ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_H #define KMS_MESSAGE_H #include #include "kms_message_defines.h" #include "kms_kmip_request.h" #include "kms_kmip_response.h" #include "kms_kmip_response_parser.h" #include "kms_request_opt.h" #include "kms_request.h" #include "kms_response.h" #include "kms_response_parser.h" #include "kms_caller_identity_request.h" #include "kms_decrypt_request.h" #include "kms_encrypt_request.h" #endif /* KMS_MESSAGE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_message_defines.h000066400000000000000000000032201456567454500267060ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_DEFINES_H #define KMS_MESSAGE_DEFINES_H #ifdef _MSC_VER #ifdef KMS_MSG_STATIC #define KMS_MSG_API #elif defined(KMS_MSG_COMPILATION) #define KMS_MSG_API __declspec(dllexport) #else #define KMS_MSG_API __declspec(dllimport) #endif #define KMS_MSG_CALL __cdecl #elif defined(__GNUC__) #ifdef KMS_MSG_STATIC #define KMS_MSG_API #elif defined(KMS_MSG_COMPILATION) #define KMS_MSG_API __attribute__ ((visibility ("default"))) #else #define KMS_MSG_API #endif #define KMS_MSG_CALL #endif #define KMS_MSG_EXPORT(type) KMS_MSG_API type KMS_MSG_CALL #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (int) kms_message_init (void); KMS_MSG_EXPORT (void) kms_message_cleanup (void); #ifdef __cplusplus } /* extern "C" */ #endif #ifdef _MSC_VER #include #pragma warning(disable : 4142) #ifndef _SSIZE_T_DEFINED #define _SSIZE_T_DEFINED typedef SSIZE_T ssize_t; #endif #pragma warning(default : 4142) #endif #if defined(_MSC_VER) #define KMS_MSG_INLINE __inline #else #define KMS_MSG_INLINE __inline__ #endif #endif /* KMS_MESSAGE_DEFINES_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_request.h000066400000000000000000000065151456567454500252670ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_REQUEST_H #define KMS_REQUEST_H #include "kms_message_defines.h" #include "kms_request_opt.h" #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* A KMS request is general enough to create arbitrary HTTP requests, but also * supports generating AWS signature v4. */ typedef struct _kms_request_t kms_request_t; KMS_MSG_EXPORT (kms_request_t *) kms_request_new (const char *method, const char *path_and_query, const kms_request_opt_t *opt); KMS_MSG_EXPORT (void) kms_request_destroy (kms_request_t *request); KMS_MSG_EXPORT (const char *) kms_request_get_error (kms_request_t *request); /* Begin: AWS specific */ KMS_MSG_EXPORT (bool) kms_request_set_date (kms_request_t *request, const struct tm *tm); KMS_MSG_EXPORT (bool) kms_request_set_region (kms_request_t *request, const char *region); KMS_MSG_EXPORT (bool) kms_request_set_service (kms_request_t *request, const char *service); KMS_MSG_EXPORT (bool) kms_request_set_access_key_id (kms_request_t *request, const char *akid); KMS_MSG_EXPORT (bool) kms_request_set_secret_key (kms_request_t *request, const char *key); /* End: AWS specific */ KMS_MSG_EXPORT (bool) kms_request_add_header_field (kms_request_t *request, const char *field_name, const char *value); KMS_MSG_EXPORT (bool) kms_request_append_header_field_value (kms_request_t *request, const char *value, size_t len); KMS_MSG_EXPORT (bool) kms_request_append_payload (kms_request_t *request, const char *payload, size_t len); /* Begin: AWS specific */ KMS_MSG_EXPORT (char *) kms_request_get_canonical (kms_request_t *request); KMS_MSG_EXPORT (const char *) kms_request_get_canonical_header (kms_request_t *request, const char *header); KMS_MSG_EXPORT (char *) kms_request_get_string_to_sign (kms_request_t *request); KMS_MSG_EXPORT (bool) kms_request_get_signing_key (kms_request_t *request, unsigned char *key); KMS_MSG_EXPORT (char *) kms_request_get_signature (kms_request_t *request); KMS_MSG_EXPORT (char *) kms_request_get_signed (kms_request_t *request); /* End: AWS specific */ KMS_MSG_EXPORT (void) kms_request_free_string (char *ptr); /* Finalize and obtain a plain HTTP request (no signing). */ KMS_MSG_EXPORT (char *) kms_request_to_string (kms_request_t *request); /* kms_request_to_bytes returns the data for a request. * - Returns NULL on error and sets an error on request. */ KMS_MSG_EXPORT (const uint8_t *) kms_request_to_bytes (kms_request_t *request, size_t *len); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_REQUEST_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_request_opt.h000066400000000000000000000055501456567454500261470ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_REQUEST_OPT_H #define KMS_REQUEST_OPT_H #include "kms_message_defines.h" #include #include #ifdef __cplusplus extern "C" { #endif typedef struct _kms_request_opt_t kms_request_opt_t; typedef size_t kms_request_provider_t; #define KMS_REQUEST_PROVIDER_AWS 0 #define KMS_REQUEST_PROVIDER_AZURE 1 #define KMS_REQUEST_PROVIDER_GCP 2 #define KMS_REQUEST_PROVIDER_KMIP 3 KMS_MSG_EXPORT (kms_request_opt_t *) kms_request_opt_new (void); /* The default provider is AWS. This will automatically set extra headers. * Returns false if provider is invalid. */ KMS_MSG_EXPORT (bool) kms_request_opt_set_provider (kms_request_opt_t *opt, kms_request_provider_t provider); KMS_MSG_EXPORT (void) kms_request_opt_destroy (kms_request_opt_t *request); KMS_MSG_EXPORT (void) kms_request_opt_set_connection_close (kms_request_opt_t *opt, bool connection_close); KMS_MSG_EXPORT (void) kms_request_opt_set_crypto_hooks (kms_request_opt_t *opt, bool (*sha256) (void *ctx, const char *input, size_t len, unsigned char *hash_out), bool (*sha256_hmac) (void *ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out), void *ctx); KMS_MSG_EXPORT (void) kms_request_opt_set_crypto_hook_sign_rsaes_pkcs1_v1_5 ( kms_request_opt_t *opt, bool (*sign_rsaes_pkcs1_v1_5) (void *ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out), void *ctx); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_REQUEST_OPT_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_response.h000066400000000000000000000023001456567454500254210ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_RESPONSE_H #define KMS_RESPONSE_H #include "kms_message_defines.h" #include #include #ifdef __cplusplus extern "C" { #endif typedef struct _kms_response_t kms_response_t; KMS_MSG_EXPORT (int) kms_response_get_status (kms_response_t *response); KMS_MSG_EXPORT (const char *) kms_response_get_body (kms_response_t *response, size_t *len); KMS_MSG_EXPORT (void) kms_response_destroy (kms_response_t *response); KMS_MSG_EXPORT (const char *) kms_response_get_error (const kms_response_t *response); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_RESPONSE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message/kms_response_parser.h000066400000000000000000000034731456567454500270110ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_RESPONSE_PARSER_H #define KMS_RESPONSE_PARSER_H #include "kms_message_defines.h" #include "kms_response.h" #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct _kms_response_parser_t kms_response_parser_t; KMS_MSG_EXPORT (kms_response_parser_t *) kms_response_parser_new (void); KMS_MSG_EXPORT (int) kms_response_parser_wants_bytes (kms_response_parser_t *parser, int32_t max); KMS_MSG_EXPORT (bool) kms_response_parser_feed (kms_response_parser_t *parser, uint8_t *buf, uint32_t len); KMS_MSG_EXPORT (kms_response_t *) kms_response_parser_get_response (kms_response_parser_t *parser); /* kms_response_parser_status returns the HTTP response status if one was * parsed. * - Calling on a KMIP parser is an error. * - Returns an int for the HTTP status or 0 on error. */ KMS_MSG_EXPORT (int) kms_response_parser_status (kms_response_parser_t *parser); KMS_MSG_EXPORT (const char *) kms_response_parser_error (kms_response_parser_t *parser); KMS_MSG_EXPORT (void) kms_response_parser_destroy (kms_response_parser_t *parser); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_RESPONSE_PARSER_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_message_private.h000066400000000000000000000077551456567454500244660ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_PRIVATE_H #define KMS_MESSAGE_PRIVATE_H #include #include "kms_message/kms_message.h" #include "kms_request_str.h" #include "kms_kv_list.h" #include "kms_crypto.h" #include "kms_kmip_response_parser_private.h" /* Sadly, Windows does not define SSIZE_MAX. It is defined in bson-compat.h, * but only since 1.22.x, so copy this from bson-compat.h for now. */ #ifndef SSIZE_MAX #define SSIZE_MAX \ (ssize_t) ( \ (((size_t) 0x01u) << (sizeof (ssize_t) * (size_t) CHAR_BIT - 1u)) - 1u) #endif struct _kms_request_t { char error[512]; bool failed; bool finalized; /* Begin: AWS specific */ kms_request_str_t *region; kms_request_str_t *service; kms_request_str_t *access_key_id; kms_request_str_t *secret_key; kms_request_str_t *datetime; kms_request_str_t *date; /* End: AWS specific */ kms_request_str_t *method; kms_request_str_t *path; kms_request_str_t *query; kms_request_str_t *payload; kms_kv_list_t *query_params; kms_kv_list_t *header_fields; /* turn off for tests only, not in public kms_request_opt_t API */ bool auto_content_length; _kms_crypto_t crypto; kms_request_str_t *to_string; kms_request_provider_t provider; /* TODO (MONGOCRYPT-342): make a union for each KMS provider type. kms_request_provider_t provider; union { struct {} aws; struct {} azure; struct {} gcp; struct {} kmip; } */ struct { uint8_t *data; uint32_t len; } kmip; }; struct _kms_response_t { int status; kms_kv_list_t *headers; kms_request_str_t *body; /* TODO (MONGOCRYPT-347): make a union for each KMS provider type. */ char error[512]; bool failed; kms_request_provider_t provider; struct { uint8_t *data; uint32_t len; } kmip; }; typedef enum { PARSING_STATUS_LINE, PARSING_HEADER, PARSING_BODY, PARSING_CHUNK_LENGTH, PARSING_CHUNK, PARSING_DONE } kms_response_parser_state_t; struct _kms_response_parser_t { char error[512]; bool failed; kms_response_t *response; kms_request_str_t *raw_response; int content_length; int start; /* start of the current thing getting parsed. */ /* Support two types of HTTP 1.1 responses. * - "Content-Length: x" header is present, indicating the body length. * - "Transfer-Encoding: chunked" header is present, indicating a stream of * chunks. */ bool transfer_encoding_chunked; int chunk_size; kms_response_parser_state_t state; /* TODO: MONGOCRYPT-348 reorganize this struct to better separate fields for * HTTP parsing and fields for KMIP parsing. */ kms_kmip_response_parser_t *kmip; }; #define CHECK_FAILED \ do { \ if (request->failed) { \ return false; \ } \ } while (0) void set_error (char *error, size_t size, const char *fmt, ...); #define KMS_ERROR(obj, ...) \ do { \ obj->failed = true; \ set_error (obj->error, sizeof (obj->error), __VA_ARGS__); \ } while (0) #define KMS_ASSERT(stmt) \ if (!(stmt)) { \ fprintf (stderr, "%s failed\n", #stmt); \ abort (); \ } #endif /* KMS_MESSAGE_PRIVATE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_port.c000066400000000000000000000015701456567454500222540ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_port.h" #if defined(_WIN32) #include #include char * kms_strndup (const char *src, size_t len) { char *dst = (char *) malloc (len + 1); if (!dst) { return 0; } memcpy (dst, src, len); dst[len] = '\0'; return dst; } #endif mongo-c-driver-1.26.0/src/kms-message/src/kms_port.h000066400000000000000000000015741456567454500222650ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_PORT_H #define KMS_PORT_H #include #if defined(_WIN32) #define kms_strcasecmp _stricmp char * kms_strndup (const char *src, size_t len); #else #include #define kms_strndup strndup #define kms_strcasecmp strcasecmp #endif #endif /* KMS_PORT_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_request.c000066400000000000000000000607331456567454500227660ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_request_opt_private.h" #include "kms_port.h" #include /* CHAR_BIT */ static kms_kv_list_t * parse_query_params (kms_request_str_t *q) { kms_kv_list_t *lst = kms_kv_list_new (); char *p = q->str; char *end = q->str + q->len; char *amp, *equals; kms_request_str_t *k, *v; do { equals = strchr ((const char *) p, '='); if (!equals) { kms_kv_list_destroy (lst); return NULL; } amp = strchr ((const char *) equals, '&'); if (!amp) { amp = end; } k = kms_request_str_new_from_chars (p, equals - p); v = kms_request_str_new_from_chars (equals + 1, amp - equals - 1); kms_kv_list_add (lst, k, v); kms_request_str_destroy (k); kms_request_str_destroy (v); p = amp + 1; } while (p < end); return lst; } static bool check_and_prohibit_kmip (kms_request_t *req) { if (req->provider == KMS_REQUEST_PROVIDER_KMIP) { KMS_ERROR (req, "Function not applicable to KMIP"); return false; } return true; } kms_request_t * kms_request_new (const char *method, const char *path_and_query, const kms_request_opt_t *opt) { kms_request_t *request = calloc (1, sizeof (kms_request_t)); const char *question_mark; KMS_ASSERT (request); if (opt && opt->provider) { request->provider = opt->provider; } else { request->provider = KMS_REQUEST_PROVIDER_AWS; } if (!check_and_prohibit_kmip (request)) { return request; } /* parsing may set failed to true */ request->failed = false; request->finalized = false; request->region = kms_request_str_new (); request->service = kms_request_str_new (); request->access_key_id = kms_request_str_new (); request->secret_key = kms_request_str_new (); question_mark = strchr (path_and_query, '?'); if (question_mark) { request->path = kms_request_str_new_from_chars ( path_and_query, question_mark - path_and_query); request->query = kms_request_str_new_from_chars (question_mark + 1, -1); request->query_params = parse_query_params (request->query); if (!request->query_params) { KMS_ERROR (request, "Cannot parse query: %s", request->query->str); } } else { request->path = kms_request_str_new_from_chars (path_and_query, -1); request->query = kms_request_str_new (); request->query_params = kms_kv_list_new (); } request->payload = kms_request_str_new (); request->date = kms_request_str_new (); request->datetime = kms_request_str_new (); request->method = kms_request_str_new_from_chars (method, -1); request->header_fields = kms_kv_list_new (); request->auto_content_length = true; /* For AWS KMS requests, add a X-Amz-Date header. */ if (request->provider == KMS_REQUEST_PROVIDER_AWS && !kms_request_set_date (request, NULL)) { return request; } if (opt && opt->connection_close) { if (!kms_request_add_header_field (request, "Connection", "close")) { return request; } } if (opt && opt->crypto.sha256) { memcpy (&request->crypto, &opt->crypto, sizeof (opt->crypto)); } else { request->crypto.sha256 = kms_sha256; request->crypto.sha256_hmac = kms_sha256_hmac; } return request; } void kms_request_destroy (kms_request_t *request) { kms_request_str_destroy (request->region); kms_request_str_destroy (request->service); kms_request_str_destroy (request->access_key_id); kms_request_str_destroy (request->secret_key); kms_request_str_destroy (request->method); kms_request_str_destroy (request->path); kms_request_str_destroy (request->query); kms_request_str_destroy (request->payload); kms_request_str_destroy (request->datetime); kms_request_str_destroy (request->date); kms_kv_list_destroy (request->query_params); kms_kv_list_destroy (request->header_fields); kms_request_str_destroy (request->to_string); free (request->kmip.data); free (request); } const char * kms_request_get_error (kms_request_t *request) { return request->failed ? request->error : NULL; } #define AMZ_DT_FORMAT "YYYYmmDDTHHMMSSZ" bool kms_request_set_date (kms_request_t *request, const struct tm *tm) { char buf[sizeof AMZ_DT_FORMAT]; struct tm tmp_tm; if (request->failed) { return false; } if (!check_and_prohibit_kmip (request)) { return false; } if (!tm) { /* use current time */ time_t t; time (&t); #if defined(KMS_MESSAGE_HAVE_GMTIME_R) gmtime_r (&t, &tmp_tm); #elif defined(_MSC_VER) gmtime_s (&tmp_tm, &t); #else tmp_tm = *gmtime (&t); #endif tm = &tmp_tm; } if (0 == strftime (buf, sizeof AMZ_DT_FORMAT, "%Y%m%dT%H%M%SZ", tm)) { KMS_ERROR (request, "Invalid tm struct"); return false; } kms_request_str_set_chars (request->date, buf, sizeof "YYYYmmDD" - 1); kms_request_str_set_chars (request->datetime, buf, sizeof AMZ_DT_FORMAT - 1); kms_kv_list_del (request->header_fields, "X-Amz-Date"); if (!kms_request_add_header_field (request, "X-Amz-Date", buf)) { return false; } return true; } #undef AMZ_DT_FORMAT bool kms_request_set_region (kms_request_t *request, const char *region) { if (!check_and_prohibit_kmip (request)) { return false; } kms_request_str_set_chars (request->region, region, -1); return true; } bool kms_request_set_service (kms_request_t *request, const char *service) { if (!check_and_prohibit_kmip (request)) { return false; } kms_request_str_set_chars (request->service, service, -1); return true; } bool kms_request_set_access_key_id (kms_request_t *request, const char *akid) { if (!check_and_prohibit_kmip (request)) { return false; } kms_request_str_set_chars (request->access_key_id, akid, -1); return true; } bool kms_request_set_secret_key (kms_request_t *request, const char *key) { if (!check_and_prohibit_kmip (request)) { return false; } kms_request_str_set_chars (request->secret_key, key, -1); return true; } bool kms_request_add_header_field (kms_request_t *request, const char *field_name, const char *value) { kms_request_str_t *k, *v; CHECK_FAILED; if (!check_and_prohibit_kmip (request)) { return false; } k = kms_request_str_new_from_chars (field_name, -1); v = kms_request_str_new_from_chars (value, -1); kms_kv_list_add (request->header_fields, k, v); kms_request_str_destroy (k); kms_request_str_destroy (v); return true; } bool kms_request_append_header_field_value (kms_request_t *request, const char *value, size_t len) { kms_request_str_t *v; CHECK_FAILED; if (!check_and_prohibit_kmip (request)) { return false; } if (request->header_fields->len == 0) { KMS_ERROR ( request, "Ensure the request has at least one header field before calling %s", __func__); } v = request->header_fields->kvs[request->header_fields->len - 1].value; KMS_ASSERT (len <= SSIZE_MAX); kms_request_str_append_chars (v, value, (ssize_t) len); return true; } bool kms_request_append_payload (kms_request_t *request, const char *payload, size_t len) { CHECK_FAILED; if (!check_and_prohibit_kmip (request)) { return false; } KMS_ASSERT (len <= SSIZE_MAX); kms_request_str_append_chars (request->payload, payload, (ssize_t) len); return true; } /* docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html * * "Sort the parameter names by character code point in ascending order. For * example, a parameter name that begins with the uppercase letter F precedes a * parameter name that begins with a lowercase letter b." */ static int cmp_query_params (const void *a, const void *b) { int r = strcmp (((kms_kv_t *) a)->key->str, ((kms_kv_t *) b)->key->str); if (r != 0) { return r; } /* not in docs, but tested in get-vanilla-query-order-key: sort by value */ return strcmp (((kms_kv_t *) a)->value->str, ((kms_kv_t *) b)->value->str); } static void append_canonical_query (kms_request_t *request, kms_request_str_t *str) { size_t i; kms_kv_list_t *lst; if (!request->query_params->len) { return; } lst = kms_kv_list_dup (request->query_params); kms_kv_list_sort (lst, cmp_query_params); for (i = 0; i < lst->len; i++) { kms_request_str_append_escaped (str, lst->kvs[i].key, true); kms_request_str_append_char (str, '='); kms_request_str_append_escaped (str, lst->kvs[i].value, true); if (i < lst->len - 1) { kms_request_str_append_char (str, '&'); } } kms_kv_list_destroy (lst); } /* "lst" is a sorted list of headers */ static void append_canonical_headers (kms_kv_list_t *lst, kms_request_str_t *str) { size_t i; kms_kv_t *kv; const kms_request_str_t *previous_key = NULL; /* aws docs: "To create the canonical headers list, convert all header names * to lowercase and remove leading spaces and trailing spaces. Convert * sequential spaces in the header value to a single space." "Do not sort the * values in headers that have multiple values." */ for (i = 0; i < lst->len; i++) { kv = &lst->kvs[i]; if (previous_key && 0 == kms_strcasecmp (previous_key->str, kv->key->str)) { /* duplicate header */ kms_request_str_append_char (str, ','); kms_request_str_append_stripped (str, kv->value); continue; } if (i > 0) { kms_request_str_append_newline (str); } kms_request_str_append_lowercase (str, kv->key); kms_request_str_append_char (str, ':'); kms_request_str_append_stripped (str, kv->value); previous_key = kv->key; } kms_request_str_append_newline (str); } static void append_signed_headers (kms_kv_list_t *lst, kms_request_str_t *str) { size_t i; kms_kv_t *kv; const kms_request_str_t *previous_key = NULL; for (i = 0; i < lst->len; i++) { kv = &lst->kvs[i]; if (previous_key && 0 == kms_strcasecmp (previous_key->str, kv->key->str)) { /* duplicate header */ continue; } if (0 == kms_strcasecmp (kv->key->str, "connection")) { continue; } kms_request_str_append_lowercase (str, kv->key); if (i < lst->len - 1) { kms_request_str_append_char (str, ';'); } previous_key = kv->key; } } static bool finalize (kms_request_t *request) { kms_kv_list_t *lst; kms_request_str_t *k; kms_request_str_t *v; if (request->failed) { return false; } if (request->finalized) { return true; } request->finalized = true; lst = request->header_fields; if (!kms_kv_list_find (lst, "Host")) { if (request->provider != KMS_REQUEST_PROVIDER_AWS) { KMS_ERROR (request, "Required Host header not set"); return false; } /* For AWS requests, derive a default Host header from region + service. * E.g. "kms.us-east-1.amazonaws.com" */ k = kms_request_str_new_from_chars ("Host", -1); v = kms_request_str_dup (request->service); kms_request_str_append_char (v, '.'); kms_request_str_append (v, request->region); kms_request_str_append_chars (v, ".amazonaws.com", -1); kms_kv_list_add (lst, k, v); kms_request_str_destroy (k); kms_request_str_destroy (v); } if (!kms_kv_list_find (lst, "Content-Length") && request->payload->len && request->auto_content_length) { k = kms_request_str_new_from_chars ("Content-Length", -1); v = kms_request_str_new (); kms_request_str_appendf (v, "%zu", request->payload->len); kms_kv_list_add (lst, k, v); kms_request_str_destroy (k); kms_request_str_destroy (v); } return true; } /* docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html * * "Build the canonical headers list by sorting the (lowercase) headers by * character code... Do not sort the values in headers that have multiple * values." */ static int cmp_header_field_names (const void *a, const void *b) { return kms_strcasecmp (((kms_kv_t *) a)->key->str, ((kms_kv_t *) b)->key->str); } static kms_kv_list_t * canonical_headers (const kms_request_t *request) { kms_kv_list_t *lst; KMS_ASSERT (request->finalized); lst = kms_kv_list_dup (request->header_fields); kms_kv_list_sort (lst, cmp_header_field_names); kms_kv_list_del (lst, "Connection"); return lst; } char * kms_request_get_canonical (kms_request_t *request) { kms_request_str_t *canonical; kms_request_str_t *normalized; kms_kv_list_t *lst; if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } if (!finalize (request)) { return NULL; } canonical = kms_request_str_new (); kms_request_str_append (canonical, request->method); kms_request_str_append_newline (canonical); normalized = kms_request_str_path_normalized (request->path); kms_request_str_append_escaped (canonical, normalized, false); kms_request_str_destroy (normalized); kms_request_str_append_newline (canonical); append_canonical_query (request, canonical); kms_request_str_append_newline (canonical); lst = canonical_headers (request); append_canonical_headers (lst, canonical); kms_request_str_append_newline (canonical); append_signed_headers (lst, canonical); kms_kv_list_destroy (lst); kms_request_str_append_newline (canonical); if (!kms_request_str_append_hashed ( &request->crypto, canonical, request->payload)) { KMS_ERROR (request, "could not generate hash"); kms_request_str_destroy (canonical); return NULL; } return kms_request_str_detach (canonical); } const char * kms_request_get_canonical_header (kms_request_t *request, const char *header) { const kms_kv_t *value; if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } if (!finalize (request)) { return NULL; } value = kms_kv_list_find (request->header_fields, header); if (!value) { return NULL; } return value->value->str; } char * kms_request_get_string_to_sign (kms_request_t *request) { bool success = false; kms_request_str_t *sts; kms_request_str_t *creq = NULL; /* canonical request */ if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } if (!finalize (request)) { return NULL; } sts = kms_request_str_new (); kms_request_str_append_chars (sts, "AWS4-HMAC-SHA256\n", -1); kms_request_str_append (sts, request->datetime); kms_request_str_append_newline (sts); /* credential scope, like "20150830/us-east-1/service/aws4_request" */ kms_request_str_append (sts, request->date); kms_request_str_append_char (sts, '/'); kms_request_str_append (sts, request->region); kms_request_str_append_char (sts, '/'); kms_request_str_append (sts, request->service); kms_request_str_append_chars (sts, "/aws4_request\n", -1); creq = kms_request_str_wrap (kms_request_get_canonical (request), -1); if (!creq) { goto done; } if (!kms_request_str_append_hashed (&request->crypto, sts, creq)) { goto done; } success = true; done: kms_request_str_destroy (creq); if (!success) { kms_request_str_destroy (sts); sts = NULL; } return kms_request_str_detach (sts); } static bool kms_request_hmac (_kms_crypto_t *crypto, unsigned char *out, kms_request_str_t *key, kms_request_str_t *data) { return crypto->sha256_hmac ( crypto->ctx, key->str, key->len, data->str, data->len, out); } static bool kms_request_hmac_again (_kms_crypto_t *crypto, unsigned char *out, unsigned char *in, kms_request_str_t *data) { return crypto->sha256_hmac ( crypto->ctx, (const char *) in, 32, data->str, data->len, out); } bool kms_request_get_signing_key (kms_request_t *request, unsigned char *key) { bool success = false; kms_request_str_t *aws4_plus_secret = NULL; kms_request_str_t *aws4_request = NULL; unsigned char k_date[32]; unsigned char k_region[32]; unsigned char k_service[32]; if (request->failed) { return false; } if (!check_and_prohibit_kmip (request)) { return false; } /* docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html * Pseudocode for deriving a signing key * * kSecret = your secret access key * kDate = HMAC("AWS4" + kSecret, Date) * kRegion = HMAC(kDate, Region) * kService = HMAC(kRegion, Service) * kSigning = HMAC(kService, "aws4_request") */ aws4_plus_secret = kms_request_str_new_from_chars ("AWS4", -1); kms_request_str_append (aws4_plus_secret, request->secret_key); aws4_request = kms_request_str_new_from_chars ("aws4_request", -1); if (!(kms_request_hmac ( &request->crypto, k_date, aws4_plus_secret, request->date) && kms_request_hmac_again ( &request->crypto, k_region, k_date, request->region) && kms_request_hmac_again ( &request->crypto, k_service, k_region, request->service) && kms_request_hmac_again ( &request->crypto, key, k_service, aws4_request))) { goto done; } success = true; done: kms_request_str_destroy (aws4_plus_secret); kms_request_str_destroy (aws4_request); return success; } char * kms_request_get_signature (kms_request_t *request) { bool success = false; kms_kv_list_t *lst = NULL; kms_request_str_t *sig = NULL; kms_request_str_t *sts = NULL; unsigned char signing_key[32]; unsigned char signature[32]; if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } sts = kms_request_str_wrap (kms_request_get_string_to_sign (request), -1); if (!sts) { goto done; } sig = kms_request_str_new (); kms_request_str_append_chars (sig, "AWS4-HMAC-SHA256 Credential=", -1); kms_request_str_append (sig, request->access_key_id); kms_request_str_append_char (sig, '/'); kms_request_str_append (sig, request->date); kms_request_str_append_char (sig, '/'); kms_request_str_append (sig, request->region); kms_request_str_append_char (sig, '/'); kms_request_str_append (sig, request->service); kms_request_str_append_chars (sig, "/aws4_request, SignedHeaders=", -1); lst = canonical_headers (request); append_signed_headers (lst, sig); kms_request_str_append_chars (sig, ", Signature=", -1); if (!(kms_request_get_signing_key (request, signing_key) && kms_request_hmac_again ( &request->crypto, signature, signing_key, sts))) { goto done; } kms_request_str_append_hex (sig, signature, sizeof (signature)); success = true; done: kms_kv_list_destroy (lst); kms_request_str_destroy (sts); if (!success) { kms_request_str_destroy (sig); sig = NULL; } return kms_request_str_detach (sig); } void kms_request_validate (kms_request_t *request) { if (!check_and_prohibit_kmip (request)) { return; } if (0 == request->region->len) { KMS_ERROR (request, "Region not set"); } else if (0 == request->service->len) { KMS_ERROR (request, "Service not set"); } else if (0 == request->access_key_id->len) { KMS_ERROR (request, "Access key ID not set"); } else if (0 == request->method->len) { KMS_ERROR (request, "Method not set"); } else if (0 == request->path->len) { KMS_ERROR (request, "Path not set"); } else if (0 == request->date->len) { KMS_ERROR (request, "Date not set"); } else if (0 == request->secret_key->len) { KMS_ERROR (request, "Secret key not set"); } } /* append_http_endofline appends an HTTP end-of-line marker: "\r\n". */ static void append_http_endofline (kms_request_str_t *str) { kms_request_str_append_chars (str, "\r\n", 2); } char * kms_request_get_signed (kms_request_t *request) { bool success = false; kms_kv_list_t *lst = NULL; char *signature = NULL; kms_request_str_t *sreq = NULL; size_t i; kms_request_validate (request); if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return false; } if (!finalize (request)) { return NULL; } sreq = kms_request_str_new (); /* like "POST / HTTP/1.1" */ kms_request_str_append (sreq, request->method); kms_request_str_append_char (sreq, ' '); kms_request_str_append (sreq, request->path); if (request->query->len) { kms_request_str_append_char (sreq, '?'); kms_request_str_append (sreq, request->query); } kms_request_str_append_chars (sreq, " HTTP/1.1", -1); append_http_endofline (sreq); /* headers */ lst = kms_kv_list_dup (request->header_fields); kms_kv_list_sort (lst, cmp_header_field_names); for (i = 0; i < lst->len; i++) { kms_request_str_append (sreq, lst->kvs[i].key); kms_request_str_append_char (sreq, ':'); kms_request_str_append (sreq, lst->kvs[i].value); append_http_endofline (sreq); } /* authorization header */ signature = kms_request_get_signature (request); if (!signature) { goto done; } /* note space after ':', to match test .sreq files */ kms_request_str_append_chars (sreq, "Authorization: ", -1); kms_request_str_append_chars (sreq, signature, -1); /* body */ if (request->payload->len) { append_http_endofline (sreq); append_http_endofline (sreq); kms_request_str_append (sreq, request->payload); } success = true; done: free (signature); kms_kv_list_destroy (lst); if (!success) { kms_request_str_destroy (sreq); sreq = NULL; } return kms_request_str_detach (sreq); } char * kms_request_to_string (kms_request_t *request) { kms_kv_list_t *lst = NULL; kms_request_str_t *sreq = NULL; size_t i; if (!finalize (request)) { return false; } if (!check_and_prohibit_kmip (request)) { return false; } if (request->to_string) { return kms_request_str_detach (kms_request_str_dup (request->to_string)); } sreq = kms_request_str_new (); /* like "POST / HTTP/1.1" */ kms_request_str_append (sreq, request->method); kms_request_str_append_char (sreq, ' '); kms_request_str_append (sreq, request->path); if (request->query->len) { kms_request_str_append_char (sreq, '?'); kms_request_str_append (sreq, request->query); } kms_request_str_append_chars (sreq, " HTTP/1.1", -1); append_http_endofline (sreq); /* headers */ lst = kms_kv_list_dup (request->header_fields); kms_kv_list_sort (lst, cmp_header_field_names); for (i = 0; i < lst->len; i++) { kms_request_str_append (sreq, lst->kvs[i].key); kms_request_str_append_char (sreq, ':'); kms_request_str_append (sreq, lst->kvs[i].value); append_http_endofline (sreq); } append_http_endofline (sreq); /* body */ if (request->payload->len) { kms_request_str_append (sreq, request->payload); } kms_kv_list_destroy (lst); request->to_string = kms_request_str_dup (sreq); return kms_request_str_detach (sreq); } void kms_request_free_string (char *ptr) { free (ptr); } const uint8_t * kms_request_to_bytes (kms_request_t *request, size_t *len) { if (request->provider == KMS_REQUEST_PROVIDER_KMIP) { *len = request->kmip.len; return request->kmip.data; } if (!request->to_string && !kms_request_to_string (request)) { return NULL; } KMS_ASSERT (request->to_string); *len = request->to_string->len; return (const uint8_t*) request->to_string->str; } mongo-c-driver-1.26.0/src/kms-message/src/kms_request_opt.c000066400000000000000000000055011456567454500236400ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_request_opt_private.h" #include kms_request_opt_t * kms_request_opt_new (void) { return calloc (1, sizeof (kms_request_opt_t)); } void kms_request_opt_destroy (kms_request_opt_t *request) { free (request); } void kms_request_opt_set_connection_close (kms_request_opt_t *opt, bool connection_close) { opt->connection_close = connection_close; } void kms_request_opt_set_crypto_hooks (kms_request_opt_t *opt, bool (*sha256) (void *ctx, const char *input, size_t len, unsigned char *hash_out), bool (*sha256_hmac) (void *ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out), void *ctx) { opt->crypto.sha256 = sha256; opt->crypto.sha256_hmac = sha256_hmac; opt->crypto.ctx = ctx; } bool kms_request_opt_set_provider (kms_request_opt_t *opt, kms_request_provider_t provider) { if (provider != KMS_REQUEST_PROVIDER_AWS && provider != KMS_REQUEST_PROVIDER_AZURE && provider != KMS_REQUEST_PROVIDER_GCP && provider != KMS_REQUEST_PROVIDER_KMIP) { return false; } opt->provider = provider; return true; } void kms_request_opt_set_crypto_hook_sign_rsaes_pkcs1_v1_5 ( kms_request_opt_t *opt, bool (*sign_rsaes_pkcs1_v1_5) (void *sign_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out), void *sign_ctx) { opt->crypto.sign_rsaes_pkcs1_v1_5 = sign_rsaes_pkcs1_v1_5; opt->crypto.sign_ctx = sign_ctx; }mongo-c-driver-1.26.0/src/kms-message/src/kms_request_opt_private.h000066400000000000000000000017041456567454500254000ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_REQUEST_OPT_PRIVATE_H #define KMS_REQUEST_OPT_PRIVATE_H #include "kms_message/kms_message_defines.h" #include "kms_message/kms_request_opt.h" #include "kms_crypto.h" #include struct _kms_request_opt_t { bool connection_close; _kms_crypto_t crypto; kms_request_provider_t provider; }; #endif /* KMS_REQUEST_OPT_PRIVATE_H */ mongo-c-driver-1.26.0/src/kms-message/src/kms_request_str.c000066400000000000000000000277551456567454500236650ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "hexlify.h" #include "kms_crypto.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_request_str.h" #include "kms_port.h" #include #include #include #include #include /* CHAR_BIT */ bool rfc_3986_tab[256] = {0}; bool kms_initialized = false; static void tables_init (void) { int i; if (kms_initialized) { return; } for (i = 0; i < 256; ++i) { rfc_3986_tab[i] = isalnum (i) || i == '~' || i == '-' || i == '.' || i == '_'; } kms_initialized = true; } kms_request_str_t * kms_request_str_new (void) { kms_request_str_t *s = malloc (sizeof (kms_request_str_t)); KMS_ASSERT (s); s->len = 0; s->size = 16; s->str = malloc (s->size); KMS_ASSERT (s->str); s->str[0] = '\0'; return s; } kms_request_str_t * kms_request_str_new_from_chars (const char *chars, ssize_t len) { kms_request_str_t *s = malloc (sizeof (kms_request_str_t)); KMS_ASSERT (s); size_t actual_len; actual_len = len < 0 ? strlen (chars) : (size_t) len; s->size = actual_len + 1; s->str = malloc (s->size); KMS_ASSERT (s->str); memcpy (s->str, chars, actual_len); s->str[actual_len] = '\0'; s->len = actual_len; return s; } kms_request_str_t * kms_request_str_wrap (char *chars, ssize_t len) { kms_request_str_t *s; if (!chars) { return NULL; } s = malloc (sizeof (kms_request_str_t)); KMS_ASSERT (s); s->str = chars; s->len = len < 0 ? strlen (chars) : (size_t) len; s->size = s->len; return s; } void kms_request_str_destroy (kms_request_str_t *str) { if (!str) { return; } free (str->str); free (str); } char * kms_request_str_detach (kms_request_str_t *str) { if (!str) { return NULL; } char *r = str->str; free (str); return r; } const char * kms_request_str_get (kms_request_str_t *str) { return str->str; } bool kms_request_str_reserve (kms_request_str_t *str, size_t size) { size_t next_size = str->len + size + 1; if (str->size < next_size) { /* next power of 2 */ --next_size; next_size |= next_size >> 1U; next_size |= next_size >> 2U; next_size |= next_size >> 4U; next_size |= next_size >> 8U; next_size |= next_size >> 16U; ++next_size; str->size = next_size; str->str = realloc (str->str, next_size); } return str->str != NULL; } kms_request_str_t * kms_request_str_dup (kms_request_str_t *str) { kms_request_str_t *dup = malloc (sizeof (kms_request_str_t)); KMS_ASSERT (dup); dup->str = kms_strndup (str->str, str->len); dup->len = str->len; dup->size = str->len + 1; return dup; } void kms_request_str_set_chars (kms_request_str_t *str, const char *chars, ssize_t len) { size_t actual_len = len < 0 ? strlen (chars) : (size_t) len; kms_request_str_reserve (str, actual_len); /* adds 1 for nil */ memcpy (str->str, chars, actual_len + 1); str->len = actual_len; } bool kms_request_str_ends_with (kms_request_str_t *str, kms_request_str_t *suffix) { if (str->len >= suffix->len && 0 == strncmp ( &str->str[str->len - suffix->len], suffix->str, suffix->len)) { return true; } return false; } void kms_request_str_append (kms_request_str_t *str, kms_request_str_t *appended) { size_t next_len = str->len + appended->len; kms_request_str_reserve (str, next_len); memcpy (str->str + str->len, appended->str, appended->len); str->len += appended->len; str->str[str->len] = '\0'; } void kms_request_str_append_char (kms_request_str_t *str, char c) { kms_request_str_reserve (str, 1); *(str->str + str->len) = c; ++str->len; str->str[str->len] = '\0'; } void kms_request_str_append_chars (kms_request_str_t *str, const char *appended, ssize_t len) { size_t str_len; if (len < 0) { str_len = strlen (appended); } else { str_len = (size_t) len; } kms_request_str_reserve (str, str_len); memcpy (str->str + str->len, appended, str_len); str->len += str_len; str->str[str->len] = '\0'; } void kms_request_str_append_newline (kms_request_str_t *str) { kms_request_str_append_char (str, '\n'); } void kms_request_str_append_lowercase (kms_request_str_t *str, kms_request_str_t *appended) { size_t i; char *p; i = str->len; kms_request_str_append (str, appended); /* downcase the chars from the old end to the new end of str */ for (; i < str->len; ++i) { p = &str->str[i]; /* ignore UTF-8 non-ASCII chars, which have 1 in the top bit */ if (((unsigned int) (*p) & (0x1U << 7U)) == 0) { *p = (char) tolower (*p); } } } void kms_request_str_appendf (kms_request_str_t *str, const char *format, ...) { va_list args; size_t remaining; int n; KMS_ASSERT (format); while (true) { remaining = str->size - str->len; va_start (args, format); n = vsnprintf (&str->str[str->len], remaining, format, args); va_end (args); if (n > -1 && (size_t) n < remaining) { /* success */ str->len += (size_t) n; return; } if (n > -1) { kms_request_str_reserve (str, (size_t) n); } else { /* TODO: error! */ abort (); } } } void kms_request_str_append_escaped (kms_request_str_t *str, kms_request_str_t *appended, bool escape_slash) { uint8_t *in; uint8_t *out; size_t i; tables_init (); /* might replace each input char with 3 output chars: "%AB" */ kms_request_str_reserve (str, 3 * appended->len); in = (uint8_t *) appended->str; out = (uint8_t *) str->str + str->len; for (i = 0; i < appended->len; ++i) { if (rfc_3986_tab[*in] || (*in == '/' && !escape_slash)) { *out = *in; ++out; ++str->len; } else { sprintf ((char *) out, "%%%02X", *in); out += 3; str->len += 3; } ++in; } } void kms_request_str_append_stripped (kms_request_str_t *str, kms_request_str_t *appended) { const char *src = appended->str; const char *end = appended->str + appended->len; bool space = false; bool comma = false; kms_request_str_reserve (str, appended->len); /* msvcrt is unhappy when it gets non-ANSI characters in isspace */ while (*src >= 0 && isspace (*src)) { ++src; } while (src < end) { /* replace newlines with commas. not documented but see * get-header-value-multiline.creq */ if (*src == '\n') { comma = true; space = false; } else if (*src >= 0 && isspace (*src)) { space = true; } else { if (comma) { kms_request_str_append_char (str, ','); comma = false; space = false; } /* is there a run of spaces waiting to be written as one space? */ if (space) { kms_request_str_append_char (str, ' '); space = false; } kms_request_str_append_char (str, *src); } ++src; } } bool kms_request_str_append_hashed (_kms_crypto_t *crypto, kms_request_str_t *str, kms_request_str_t *appended) { uint8_t hash[32]; char *hex_chars; if (!crypto->sha256 (crypto->ctx, appended->str, appended->len, hash)) { return false; } hex_chars = hexlify (hash, sizeof (hash)); kms_request_str_append_chars (str, hex_chars, 2 * sizeof (hash)); free (hex_chars); return true; } bool kms_request_str_append_hex (kms_request_str_t *str, unsigned char *data, size_t len) { char *hex_chars; hex_chars = hexlify (data, len); KMS_ASSERT (len <= SSIZE_MAX / 2); kms_request_str_append_chars (str, hex_chars, (ssize_t) (len * 2)); free (hex_chars); return true; } static bool starts_with (char *s, const char *prefix) { if (strstr (s, prefix) == s) { return true; } return false; } /* remove from last slash to the end, but don't remove slash from start */ static void delete_last_segment (kms_request_str_t *str, bool is_absolute) { ssize_t i; if (!str->len) { return; } KMS_ASSERT (str->len < SSIZE_MAX); for (i = (ssize_t) str->len - 1; i >= 0; --i) { if (str->str[i] == '/') { if (i == 0 && is_absolute) { str->len = 1; } else { str->len = (size_t) i; } goto done; } } /* no slashes */ str->len = 0; done: str->str[str->len] = '\0'; } /* follow algorithm in https://tools.ietf.org/html/rfc3986#section-5.2.4, * the block comments are copied from there */ kms_request_str_t * kms_request_str_path_normalized (kms_request_str_t *str) { kms_request_str_t *slash = kms_request_str_new_from_chars ("/", 1); kms_request_str_t *out = kms_request_str_new (); char *in = strdup (str->str); char *p = in; char *end = in + str->len; bool is_absolute = (*p == '/'); if (0 == strcmp (p, "/")) { goto done; } while (p < end) { /* If the input buffer begins with a prefix of "../" or "./", * then remove that prefix from the input buffer */ if (starts_with (p, "../")) { p += 3; } else if (starts_with (p, "./")) { p += 2; } /* otherwise, if the input buffer begins with a prefix of "/./" or "/.", * where "." is a complete path segment, then replace that prefix with "/" * in the input buffer */ else if (starts_with (p, "/./")) { p += 2; } else if (0 == strcmp (p, "/.")) { break; } /* otherwise, if the input buffer begins with a prefix of "/../" or "/..", * where ".." is a complete path segment, then replace that prefix with * "/" in the input buffer and remove the last segment and its preceding * "/" (if any) from the output buffer */ else if (starts_with (p, "/../")) { p += 3; delete_last_segment (out, is_absolute); } else if (0 == strcmp (p, "/..")) { delete_last_segment (out, is_absolute); break; } /* otherwise, if the input buffer consists only of "." or "..", then remove that from the input buffer */ else if (0 == strcmp (p, ".") || 0 == strcmp (p, "..")) { break; } /* otherwise, move the first path segment in the input buffer to the end * of the output buffer, including the initial "/" character (if any) and * any subsequent characters up to, but not including, the next "/" * character or the end of the input buffer. */ else { char *next_slash = strchr (p + 1, '/'); if (!next_slash) { next_slash = end; } /* fold repeated slashes */ if (kms_request_str_ends_with (out, slash) && *p == '/') { ++p; } /* normalize "a/../b" as "b", not as "/b" */ if (out->len == 0 && !is_absolute && *p == '/') { ++p; } kms_request_str_append_chars (out, p, next_slash - p); p = next_slash; } } done: free (in); kms_request_str_destroy (slash); if (!out->len) { kms_request_str_append_char (out, '/'); } return out; } mongo-c-driver-1.26.0/src/kms-message/src/kms_request_str.h000066400000000000000000000064021456567454500236540ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_KMS_REQUEST_STR_H #define KMS_MESSAGE_KMS_REQUEST_STR_H #include "kms_message/kms_message.h" #include "kms_crypto.h" #include #include #include #include typedef struct { char *str; size_t len; size_t size; } kms_request_str_t; KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_new (void); KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_new_from_chars (const char *chars, ssize_t len); KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_wrap (char *chars, ssize_t len); KMS_MSG_EXPORT (void) kms_request_str_destroy (kms_request_str_t *str); KMS_MSG_EXPORT (char *) kms_request_str_detach (kms_request_str_t *str); KMS_MSG_EXPORT (bool) kms_request_str_reserve (kms_request_str_t *str, size_t size); KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_dup (kms_request_str_t *str); KMS_MSG_EXPORT (void) kms_request_str_set_chars (kms_request_str_t *str, const char *chars, ssize_t len); KMS_MSG_EXPORT (bool) kms_request_str_ends_with (kms_request_str_t *str, kms_request_str_t *suffix); KMS_MSG_EXPORT (void) kms_request_str_append (kms_request_str_t *str, kms_request_str_t *appended); KMS_MSG_EXPORT (void) kms_request_str_append_char (kms_request_str_t *str, char c); KMS_MSG_EXPORT (void) kms_request_str_append_chars (kms_request_str_t *str, const char *appended, ssize_t len); KMS_MSG_EXPORT (void) kms_request_str_append_newline (kms_request_str_t *str); KMS_MSG_EXPORT (void) kms_request_str_append_lowercase (kms_request_str_t *str, kms_request_str_t *appended); KMS_MSG_EXPORT (void) kms_request_str_appendf (kms_request_str_t *str, const char *format, ...); KMS_MSG_EXPORT (void) kms_request_strdupf (kms_request_str_t *str, const char *format, ...); KMS_MSG_EXPORT (void) kms_request_str_append_escaped (kms_request_str_t *str, kms_request_str_t *appended, bool escape_slash); KMS_MSG_EXPORT (void) kms_request_str_append_stripped (kms_request_str_t *str, kms_request_str_t *appended); KMS_MSG_EXPORT (bool) kms_request_str_append_hashed (_kms_crypto_t *crypto, kms_request_str_t *str, kms_request_str_t *appended); KMS_MSG_EXPORT (bool) kms_request_str_append_hex (kms_request_str_t *str, unsigned char *data, size_t len); KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_path_normalized (kms_request_str_t *str); #endif // KMS_MESSAGE_KMS_REQUEST_STR_H mongo-c-driver-1.26.0/src/kms-message/src/kms_response.c000066400000000000000000000024631456567454500231300ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_request_str.h" void kms_response_destroy (kms_response_t *response) { if (response == NULL) { return; } free (response->kmip.data); kms_kv_list_destroy (response->headers); kms_request_str_destroy (response->body); free (response); } const char * kms_response_get_body (kms_response_t *response, size_t *len) { if (len) { *len = response->body->len; } return response->body->str; } int kms_response_get_status (kms_response_t *response) { return response->status; } const char * kms_response_get_error (const kms_response_t *response) { return response->failed ? response->error : NULL; } mongo-c-driver-1.26.0/src/kms-message/src/kms_response_parser.c000066400000000000000000000257721456567454500245140ustar00rootroot00000000000000#include "kms_message/kms_response_parser.h" #include "kms_message_private.h" #include "kms_kmip_response_parser_private.h" #include #include #include #include #include "hexlify.h" /* destroys the members of parser, but not the parser itself. */ static void _parser_destroy (kms_response_parser_t *parser) { kms_request_str_destroy (parser->raw_response); parser->raw_response = NULL; parser->content_length = -1; kms_response_destroy (parser->response); parser->response = NULL; kms_kmip_response_parser_destroy (parser->kmip); } /* initializes the members of parser. */ static void _parser_init (kms_response_parser_t *parser) { parser->raw_response = kms_request_str_new (); parser->content_length = -1; parser->response = calloc (1, sizeof (kms_response_t)); KMS_ASSERT (parser->response); parser->response->headers = kms_kv_list_new (); parser->state = PARSING_STATUS_LINE; parser->start = 0; parser->failed = false; parser->chunk_size = 0; parser->transfer_encoding_chunked = false; parser->kmip = NULL; } kms_response_parser_t * kms_response_parser_new (void) { kms_response_parser_t *parser = malloc (sizeof (kms_response_parser_t)); KMS_ASSERT (parser); _parser_init (parser); return parser; } int kms_response_parser_wants_bytes (kms_response_parser_t *parser, int32_t max) { if (parser->kmip) { return kms_kmip_response_parser_wants_bytes (parser->kmip, max); } switch (parser->state) { case PARSING_DONE: return 0; case PARSING_STATUS_LINE: case PARSING_HEADER: return max; case PARSING_CHUNK_LENGTH: return max; case PARSING_CHUNK: /* add 2 for trailing \r\n */ return (parser->chunk_size + 2) - ((int) parser->raw_response->len - parser->start); case PARSING_BODY: KMS_ASSERT (parser->content_length != -1); return parser->content_length - ((int) parser->raw_response->len - parser->start); default: KMS_ASSERT (false && "Invalid kms_response_parser HTTP state"); } return -1; } static bool _parse_int (const char *str, int *result) { char *endptr = NULL; int64_t long_result; errno = 0; long_result = strtol (str, &endptr, 10); if (endptr == str) { /* No digits were parsed. Consider this an error */ return false; } if (endptr != NULL && *endptr != '\0') { /* endptr points to the first invalid character. */ return false; } if (errno == EINVAL || errno == ERANGE) { return false; } if (long_result > INT32_MAX || long_result < INT32_MIN) { return false; } *result = (int) long_result; return true; } /* parse an int from a substring inside of a string. */ static bool _parse_int_from_view (const char *str, int start, int end, int *result) { KMS_ASSERT (end >= start); char *num_str = malloc ((size_t) (end - start + 1)); KMS_ASSERT (num_str); bool ret; strncpy (num_str, str + start, (size_t) (end - start)); num_str[end - start] = '\0'; ret = _parse_int (num_str, result); free (num_str); return ret; } static bool _parse_hex_from_view (const char *str, int len, int *result) { KMS_ASSERT (len >= 0); *result = unhexlify (str, (size_t) len); if (*result < 0) { return false; } return true; } /* returns true if char is "linear white space". This *ignores* the folding case * of CRLF followed by WSP. See https://stackoverflow.com/a/21072806/774658 */ static bool _is_lwsp (char c) { return c == ' ' || c == 0x09 /* HTAB */; } /* parse a header line or status line. */ static kms_response_parser_state_t _parse_line (kms_response_parser_t *parser, int end) { int i = parser->start; const char *raw = parser->raw_response->str; kms_response_t *response = parser->response; if (parser->state == PARSING_STATUS_LINE) { /* Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF */ int j; int status; if (strncmp (raw + i, "HTTP/1.1 ", 9) != 0) { KMS_ERROR (parser, "Could not parse HTTP-Version."); return PARSING_DONE; } i += 9; for (j = i; j < end; j++) { if (raw[j] == ' ') break; } if (!_parse_int_from_view (raw, i, j, &status)) { KMS_ERROR (parser, "Could not parse Status-Code."); return PARSING_DONE; } response->status = status; /* ignore the Reason-Phrase. */ return PARSING_HEADER; } else if (parser->state == PARSING_HEADER) { /* Treating a header as: * message-header = field-name ":" [ field-value ] CRLF * This is not completely correct, and does not take folding into acct. * See https://tools.ietf.org/html/rfc822#section-3.1 */ int j; kms_request_str_t *key; kms_request_str_t *val; if (i == end) { /* empty line, this signals the start of the body. */ if (parser->transfer_encoding_chunked) { return PARSING_CHUNK_LENGTH; } return PARSING_BODY; } for (j = i; j < end; j++) { if (raw[j] == ':') break; } if (j == end) { KMS_ERROR (parser, "Could not parse header, no colon found."); return PARSING_DONE; } key = kms_request_str_new_from_chars (raw + i, j - i); i = j + 1; /* remove leading and trailing whitespace from the value. */ for (j = i; j < end; j++) { if (!_is_lwsp (raw[j])) break; } i = j; /* find the end of the header by backtracking. */ for (j = end; j > i; j--) { if (!_is_lwsp (raw[j])) break; } if (i == j) { val = kms_request_str_new (); } else { val = kms_request_str_new_from_chars (raw + i, j - i); } kms_kv_list_add (response->headers, key, val); /* if we have *not* read the Content-Length yet, check. */ if (parser->content_length == -1 && strcmp (key->str, "Content-Length") == 0) { if (!_parse_int (val->str, &parser->content_length)) { KMS_ERROR (parser, "Could not parse Content-Length header."); kms_request_str_destroy (key); kms_request_str_destroy (val); return PARSING_DONE; } } if (0 == strcmp (key->str, "Transfer-Encoding")) { if (0 == strcmp (val->str, "chunked")) { parser->transfer_encoding_chunked = true; } else { KMS_ERROR (parser, "Unsupported Transfer-Encoding: %s", val->str); kms_request_str_destroy (key); kms_request_str_destroy (val); return PARSING_DONE; } } kms_request_str_destroy (key); kms_request_str_destroy (val); return PARSING_HEADER; } else if (parser->state == PARSING_CHUNK_LENGTH) { int result = 0; if (!_parse_hex_from_view (raw + i, end - i, &result)) { KMS_ERROR (parser, "Failed to parse hex chunk length."); return PARSING_DONE; } parser->chunk_size = result; return PARSING_CHUNK; } return PARSING_DONE; } bool kms_response_parser_feed (kms_response_parser_t *parser, uint8_t *buf, uint32_t len) { kms_request_str_t *raw = parser->raw_response; int curr, body_read, chunk_read; if (parser->kmip) { return kms_kmip_response_parser_feed (parser->kmip, buf, len); } curr = (int) raw->len; kms_request_str_append_chars (raw, (char *) buf, len); /* process the new data appended. */ while (curr < (int) raw->len) { switch (parser->state) { case PARSING_STATUS_LINE: case PARSING_HEADER: case PARSING_CHUNK_LENGTH: /* find the next \r\n. */ if (curr && strncmp (raw->str + (curr - 1), "\r\n", 2) == 0) { parser->state = _parse_line (parser, curr - 1); parser->start = curr + 1; } curr++; if (parser->state == PARSING_BODY && parser->content_length <= 0) { /* Ok, no Content-Length header, or explicitly 0, so empty body */ parser->response->body = kms_request_str_new (); parser->state = PARSING_DONE; } break; case PARSING_BODY: body_read = (int) raw->len - parser->start; if (parser->content_length == -1 || body_read > parser->content_length) { KMS_ERROR (parser, "Unexpected: exceeded content length"); return false; } /* check if we have the entire body. */ if (body_read == parser->content_length) { parser->response->body = kms_request_str_new_from_chars ( raw->str + parser->start, parser->content_length); parser->state = PARSING_DONE; } curr = (int) raw->len; break; case PARSING_CHUNK: chunk_read = (int) raw->len - parser->start; /* check if we've read the full chunk and the trailing \r\n */ if (chunk_read >= parser->chunk_size + 2) { if (!parser->response->body) { parser->response->body = kms_request_str_new (); } kms_request_str_append_chars (parser->response->body, raw->str + parser->start, parser->chunk_size); curr = parser->start + parser->chunk_size + 2; parser->start = curr; if (parser->chunk_size == 0) { /* last chunk. */ parser->state = PARSING_DONE; } else { parser->state = PARSING_CHUNK_LENGTH; } } else { curr = (int) raw->len; } break; case PARSING_DONE: KMS_ERROR (parser, "Unexpected extra HTTP content"); return false; default: KMS_ASSERT (false && "Invalid kms_response_parser HTTP state"); } } if (parser->failed) { return false; } return true; } /* steals the response from the parser. */ kms_response_t * kms_response_parser_get_response (kms_response_parser_t *parser) { kms_response_t *response; if (parser->kmip) { return kms_kmip_response_parser_get_response (parser->kmip); } response = parser->response; parser->response = NULL; /* reset the parser. */ _parser_destroy (parser); _parser_init (parser); return response; } int kms_response_parser_status (kms_response_parser_t *parser) { if (!parser) { return 0; } if (parser->kmip) { KMS_ERROR (parser, "kms_response_parser_status not applicable to KMIP"); return 0; } if (!parser->response) { return 0; } return parser->response->status; } const char * kms_response_parser_error (kms_response_parser_t *parser) { if (!parser) { return NULL; } if (parser->kmip) { return kms_kmip_response_parser_error (parser->kmip); } return parser->error; } void kms_response_parser_destroy (kms_response_parser_t *parser) { _parser_destroy (parser); free (parser); } mongo-c-driver-1.26.0/src/kms-message/src/sort.c000066400000000000000000000050661456567454500214110ustar00rootroot00000000000000/* * SPDX-License-Identifier: BSD-3-Clause * * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Peter McIlroy. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS 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. */ /** * This code is originally from: * https://github.com/freebsd/freebsd/blob/e7c6cef9514d3bb1f14a30a5ee871231523e43db/lib/libc/stdlib/merge.c */ #include /* * This is to avoid out-of-bounds addresses in sorting the * last 4 elements. */ typedef int (*cmp_t) (const void *, const void *); #define CMP(x, y) cmp (x, y) #define swap(a, b) \ { \ s = b; \ i = size; \ do { \ tmp = *a; \ *a++ = *s; \ *s++ = tmp; \ } while (--i); \ a -= size; \ } void insertionsort (unsigned char *a, size_t n, size_t size, cmp_t cmp) { unsigned char *ai, *s, *t, *u, tmp; size_t i; for (ai = a + size; --n >= 1; ai += size) for (t = ai; t > a; t -= size) { u = t - size; if (CMP (u, t) <= 0) break; swap (u, t); } } mongo-c-driver-1.26.0/src/kms-message/src/sort.h000066400000000000000000000013351456567454500214110ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ typedef int (*cmp_t) (const void *, const void *); void insertionsort (unsigned char *a, size_t n, size_t size, cmp_t cmp); mongo-c-driver-1.26.0/src/kms-message/test/000077500000000000000000000000001456567454500204375ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/test/connection_close/000077500000000000000000000000001456567454500237635ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/test/connection_close/connection_close.sreq000066400000000000000000000004621456567454500302050ustar00rootroot00000000000000POST / HTTP/1.1 Connection:close Host:foo-service.foo-region.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=foo-akid/20150830/foo-region/foo-service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8b264695a2fd7fe28b309c611e0770da5a4c5ca0c040209941f78d773d9297b2mongo-c-driver-1.26.0/src/kms-message/test/content_length/000077500000000000000000000000001456567454500234525ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/test/content_length/content_length.sreq000066400000000000000000000005171456567454500273640ustar00rootroot00000000000000POST / HTTP/1.1 Content-Length:11 Host:foo-service.foo-region.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=foo-akid/20150830/foo-region/foo-service/aws4_request, SignedHeaders=content-length;host;x-amz-date, Signature=9025f1937fb114f77158a8bf0170e1ec1a9aa29806bc7800ca850966cd32920b foo-payloadmongo-c-driver-1.26.0/src/kms-message/test/decrypt/000077500000000000000000000000001456567454500221115ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/test/decrypt/decrypt.creq000066400000000000000000000004401456567454500244350ustar00rootroot00000000000000POST / content-length:234 content-type:application/x-amz-json-1.1 host:service.us-east-1.amazonaws.com x-amz-date:20150830T123600Z x-amz-target:TrentService.Decrypt content-length;content-type;host;x-amz-date;x-amz-target 48384de310621c850968f3948bddd004ecf5cae592a24530f778e4d190bd9dbcmongo-c-driver-1.26.0/src/kms-message/test/decrypt/decrypt.sreq000066400000000000000000000012141456567454500244550ustar00rootroot00000000000000POST / HTTP/1.1 Content-Length:234 Content-Type:application/x-amz-json-1.1 Host:service.us-east-1.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Target:TrentService.Decrypt Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target, Signature=977a49f82aa74b38944cbd299880dcc3ec2bbcd953c36b1a19a3cde56f415f31 {"CiphertextBlob": "AQICAHjzjtjUxrr7oc/BHmjyoZGeNk10osSeMGcIUzMNzeDJGwFgMNRznpAfp0NVhCb51fCxAAAAZDBiBgkqhkiG9w0BBwagVTBTAgEAME4GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMoscSHCU4DuwIHyMJAgEQgCFhA83L4qw2T3PbG3MuM9pFUfTNwP/S4bnEwg6/U5BGGEI="}mongo-c-driver-1.26.0/src/kms-message/test/encrypt/000077500000000000000000000000001456567454500221235ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/test/encrypt/encrypt.creq000066400000000000000000000004371456567454500244670ustar00rootroot00000000000000POST / content-length:45 content-type:application/x-amz-json-1.1 host:service.us-east-1.amazonaws.com x-amz-date:20150830T123600Z x-amz-target:TrentService.Encrypt content-length;content-type;host;x-amz-date;x-amz-target 5fc6e5b49ee8c6926b9eeefb69e108be4c8e1cf81d8af8f51c7d5b992afd029cmongo-c-driver-1.26.0/src/kms-message/test/encrypt/encrypt.sreq000066400000000000000000000007161456567454500245070ustar00rootroot00000000000000POST / HTTP/1.1 Content-Length:45 Content-Type:application/x-amz-json-1.1 Host:service.us-east-1.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Target:TrentService.Encrypt Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target, Signature=28d8a139a4a7da0bd7082979fa938ce20514e0500cdd441fd46f702ae3d3cfd2 {"Plaintext": "Zm9vYmFy", "KeyId": "alias/1"}mongo-c-driver-1.26.0/src/kms-message/test/example-chunked-response.bin000066400000000000000000000015561456567454500260460ustar00rootroot00000000000000HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Vary: X-Origin Vary: Referer Date: Thu, 24 Sep 2020 14:21:44 GMT Server: scaffolding on HTTPServer2 Cache-Control: private X-XSS-Protection: 0 X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff Alt-Svc: h3-Q050=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" Accept-Ranges: none Vary: Origin,Accept-Encoding Connection: close Transfer-Encoding: chunked 105 {"access_token":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","expires_in":3599,"token_type":"Bearer"} 0 mongo-c-driver-1.26.0/src/kms-message/test/example-multi-chunked-response.bin000066400000000000000000000015631456567454500271740ustar00rootroot00000000000000HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Vary: X-Origin Vary: Referer Date: Thu, 24 Sep 2020 14:21:44 GMT Server: scaffolding on HTTPServer2 Cache-Control: private X-XSS-Protection: 0 X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff Alt-Svc: h3-Q050=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" Accept-Ranges: none Vary: Origin,Accept-Encoding Connection: close Transfer-Encoding: chunked DD {"access_token":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 28 "expires_in":3599,"token_type":"Bearer"} 0 mongo-c-driver-1.26.0/src/kms-message/test/example-response.bin000077500000000000000000000007111456567454500244220ustar00rootroot00000000000000HTTP/1.1 200 OK x-amzn-RequestId: deeb35e5-4ecb-4bf1-9af5-84a54ff0af0e Content-Type: application/x-amz-json-1.1 Content-Length: 319 {"CiphertextBlob":"AQICAHifzrL6n/3uqZyz+z1bJj80DhqPcSAibAaIoYc+HOVP6QEplwbM0wpvU5zsQG/1SBKvAAAAZDBiBgkqhkiG9w0BBwagVTBTAgEAME4GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM5syMJE7RodxDaqYqAgEQgCHMFCnFso4Lih0CNbLT1kiET0hQyzjgoa9733353GQkGlM=","KeyId":"arn:aws:kms:us-east-1:524754917239:key/bd05530b-0a7f-4fbd-8362-ab3667370db0"}mongo-c-driver-1.26.0/src/kms-message/test/host/000077500000000000000000000000001456567454500214145ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/test/host/host.sreq000066400000000000000000000004411456567454500232640ustar00rootroot00000000000000POST / HTTP/1.1 Host:foo-service.foo-region.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=foo-akid/20150830/foo-region/foo-service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8b264695a2fd7fe28b309c611e0770da5a4c5ca0c040209941f78d773d9297b2mongo-c-driver-1.26.0/src/kms-message/test/multibyte/000077500000000000000000000000001456567454500224555ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/test/multibyte/multibyte.creq000066400000000000000000000003321456567454500253450ustar00rootroot00000000000000GET /%E2%82%AC/ euro=%E2%82%AC content-length:4 host:€.€.amazonaws.com x-amz-date:20150830T123600Z €:€asdf€ content-length;host;x-amz-date;€ 5bf858e4b892817978d798623768af7080d99ded72501cf15374e12861725f12mongo-c-driver-1.26.0/src/kms-message/test/multibyte/multibyte.sreq000066400000000000000000000005121456567454500253650ustar00rootroot00000000000000GET /€/?euro=€ HTTP/1.1 Content-Length:4 Host:€.€.amazonaws.com X-Amz-Date:20150830T123600Z €:€asdf€ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/€/€/aws4_request, SignedHeaders=content-length;host;x-amz-date;€, Signature=88d2d4b0639c6b6db1ce366d2578b8407562caa905fc375fdf1ddb7f0b789f5b €mongo-c-driver-1.26.0/src/kms-message/test/test_kmip_reader_writer.c000066400000000000000000000402271456567454500255250ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_assert.h" #include "test_kms_util.h" #include "kms_kmip_reader_writer_private.h" #include #include typedef struct { char *desc; char *expected_hex; } kms_kmip_writer_test_case_t; static void kms_kmip_writer_test_evaluate (kmip_writer_t *writer, const char *expected_hex_in, char *desc) { char *expected_hex; const uint8_t *actual_buf; size_t actual_len; char *actual_hex; expected_hex = copy_and_filter_hex (expected_hex_in); actual_buf = kmip_writer_get_buffer (writer, &actual_len); actual_hex = data_to_hex (actual_buf, actual_len); if (0 != strcmp (expected_hex, actual_hex)) { fprintf (stderr, "expected '%s' but got '%s' for test description: %s\n", expected_hex, actual_hex, desc); abort (); } free (actual_hex); free (expected_hex); } void kms_kmip_writer_test (void) { kmip_writer_t *writer; /* The following test cases come from section 9.1.2 of * http://docs.oasis-open.org/kmip/spec/v1.4/os/kmip-spec-v1.4-os.html */ writer = kmip_writer_new (); kmip_writer_write_integer (writer, KMIP_TAG_CompromiseDate, 8); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 02 | 00 00 00 04 | 00 00 00 08 00 00 00 00", "An Integer containing the decimal value 8"); kmip_writer_destroy (writer); writer = kmip_writer_new (); kmip_writer_write_long_integer ( writer, KMIP_TAG_CompromiseDate, 123456789000000000LL); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 03 | 00 00 00 08 | 01 B6 9B 4B A5 74 92 00", "A Long Integer containing the decimal value 123456789000000000"); kmip_writer_destroy (writer); /* BigInteger is not implemented. */ writer = kmip_writer_new (); kmip_writer_write_enumeration (writer, KMIP_TAG_CompromiseDate, 255); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 05 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", "An Enumeration with value 255"); kmip_writer_destroy (writer); /* Boolean is not implemented. */ writer = kmip_writer_new (); kmip_writer_write_string ( writer, KMIP_TAG_CompromiseDate, "Hello World", 11); kms_kmip_writer_test_evaluate (writer, "42 00 20 | 07 | 00 00 00 0B | 48 65 6C 6C " "6F 20 57 6F 72 6C 64 00 00 00 00 00", "A Text String with the value 'Hello World'"); kmip_writer_destroy (writer); writer = kmip_writer_new (); kmip_writer_write_bytes (writer, KMIP_TAG_CompromiseDate, "\01\02\03", 3); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 08 | 00 00 00 03 | 01 02 03 00 00 00 00 00", "A Byte String with the value { 0x01, 0x02, 0x03 }"); kmip_writer_destroy (writer); writer = kmip_writer_new (); kmip_writer_write_datetime ( writer, KMIP_TAG_CompromiseDate, 0x0000000047DA67F8LL); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 09 | 00 00 00 08 | 00 00 00 00 47 DA 67 F8", "A Date-Time, containing the value for Friday, March 14, 2008, 11:56:40 " "GMT"); kmip_writer_destroy (writer); /* Interval is not implemented. */ writer = kmip_writer_new (); kmip_writer_begin_struct (writer, KMIP_TAG_CompromiseDate); kmip_writer_write_enumeration ( writer, KMIP_TAG_ApplicationSpecificInformation, 254); kmip_writer_write_integer (writer, KMIP_TAG_ArchiveDate, 255); kmip_writer_close_struct (writer); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE " "00 00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", "A Structure containing an Enumeration, value 254, followed by an " "Integer, value 255, having tags 420004 and 420005 respectively"); kmip_writer_destroy (writer); } void kms_kmip_reader_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; kmip_tag_type_t tag; kmip_item_type_t type; uint32_t length; int32_t i32; int64_t i64; uint32_t u32; uint8_t *ptr; /* The following test cases come from section 9.1.2 of * http://docs.oasis-open.org/kmip/spec/v1.4/os/kmip-spec-v1.4-os.html */ /* An Integer containing the decimal value 8 */ data = hex_to_data ("42 00 20 | 02 | 00 00 00 04 | 00 00 00 08 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Integer); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_integer (reader, &i32)); ASSERT (i32 == 8); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* A Long Integer containing the decimal value 123456789000000000 */ data = hex_to_data ("42 00 20 | 03 | 00 00 00 08 | 01 B6 9B 4B A5 74 92 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_LongInteger); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 8); ASSERT (kmip_reader_read_long_integer (reader, &i64)); ASSERT (i64 == 123456789000000000LL); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* Big Integer is not implemented. */ /* An Enumeration with value 255 */ data = hex_to_data ("42 00 20 | 05 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Enumeration); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_enumeration (reader, &u32)); ASSERT (u32 == 255); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* Boolean is not implemented */ /* A Text String with the value 'Hello World' */ data = hex_to_data ("42 00 20 | 07 | 00 00 00 0B | 48 65 6C " "6C 6F 20 57 6F 72 6C 64 00 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_TextString); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 11); ASSERT (kmip_reader_read_string (reader, &ptr, length)); ASSERT (0 == strncmp ("Hello World", (const char *) ptr, length)); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* A Byte String with the value { 0x01, 0x02, 0x03 } */ data = hex_to_data ("42 00 20 | 08 | 00 00 00 03 | 01 02 03 00 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_ByteString); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 3); ASSERT (kmip_reader_read_bytes (reader, &ptr, length)); ASSERT (0 == strncmp ("\01\02\03", (const char *) ptr, length)); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* A Date-Time, containing the value for Friday, March 14, 2008, 11:56:40 GMT */ data = hex_to_data ("42 00 20 | 09 | 00 00 00 08 | 00 00 00 00 47 DA 67 F8", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_DateTime); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 8); kmip_reader_read_long_integer (reader, &i64); ASSERT (i64 == 0x47DA67F8); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* Interval is not implemented. */ /* A Structure containing an Enumeration, value 254, followed by an Integer, * value 255, having tags 420004 and 420005 respectively */ data = hex_to_data ( "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE " "00 00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Structure); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 0x20); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_ApplicationSpecificInformation); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Enumeration); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_enumeration (reader, &u32)); ASSERT (u32 == 254); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_ArchiveDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Integer); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_integer (reader, &i32)); ASSERT (i32 == 255); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_negative_int_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; kmip_tag_type_t tag; kmip_item_type_t type; uint32_t length; int32_t i32; /* Test reading the integer -1. */ data = hex_to_data ("42 00 20 | 02 | 00 00 00 04 | FF FF FF FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Integer); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_integer (reader, &i32)); ASSERT (i32 == -1); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* Test reading the integer INT32_MIN (-2^31). */ data = hex_to_data ("42 00 20 | 02 | 00 00 00 04 | 80 00 00 00 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Integer); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_integer (reader, &i32)); ASSERT (i32 == INT32_MIN); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_find_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; bool found; size_t pos = 0; size_t len = 0; /* A Structure containing an Enumeration, value 254, followed by an Integer, * value 255, having tags 420004 and 420005 respectively */ data = hex_to_data ( "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE " "00 00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); /* Finds the top-level Structure. */ found = kmip_reader_find ( reader, KMIP_TAG_CompromiseDate, KMIP_ITEM_TYPE_Structure, &pos, &len); ASSERT (found); ASSERT (pos == 0); ASSERT (len == 32); /* Mismatched tag does not find the Structure. */ found = kmip_reader_find ( reader, KMIP_TAG_ActivationDate, KMIP_ITEM_TYPE_Structure, &pos, &len); ASSERT (!found); /* Mismatched type does not find the Structure. */ found = kmip_reader_find ( reader, KMIP_TAG_CompromiseDate, KMIP_ITEM_TYPE_Integer, &pos, &len); ASSERT (!found); /* Values nested within the Structure are not found. */ found = kmip_reader_find (reader, KMIP_TAG_ApplicationSpecificInformation, KMIP_ITEM_TYPE_Enumeration, &pos, &len); ASSERT (!found); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_find_and_recurse_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; bool found; size_t pos = 0; size_t len = 0; /* A Structure containing an Enumeration, value 254, followed by an Integer, * value 255, having tags 420004 and 420005 respectively */ data = hex_to_data ( "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE " "00 00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_find_and_recurse (reader, KMIP_TAG_CompromiseDate)); /* Values nested within the Structure are found. */ found = kmip_reader_find (reader, KMIP_TAG_ApplicationSpecificInformation, KMIP_ITEM_TYPE_Enumeration, &pos, &len); ASSERT (found); ASSERT (pos == 8); ASSERT (len == 4); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_find_and_read_enum_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; bool found; uint32_t value; /* An Integer, value 255, followed by an Enumeration, value 254 having tags * 420005 and 420004 respectively. */ data = hex_to_data ( "42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00 | 42 00 04 | 05 | " "00 00 00 04 | 00 00 00 FE 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); found = kmip_reader_find_and_read_enum ( reader, KMIP_TAG_ApplicationSpecificInformation, &value); ASSERT (found); ASSERT (value == 254); /* The Integer should not be found. */ found = kmip_reader_find_and_read_enum (reader, KMIP_TAG_ArchiveDate, &value); ASSERT (!found); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_find_and_read_bytes_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; bool found; uint8_t *outptr; size_t outlen; /* An Integer, value 255, followed by ByteString of value 0x1122 having tags * 420005 and 420004 respectively. */ data = hex_to_data ( "42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00 | 42 00 04 | 08 | " "00 00 00 02 | 11 22 00 00 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); found = kmip_reader_find_and_read_bytes ( reader, KMIP_TAG_ApplicationSpecificInformation, &outptr, &outlen); ASSERT (found); ASSERT (outlen == 2); ASSERT (outptr[0] == 0x11); ASSERT (outptr[1] == 0x22); /* The Integer should not be found. */ found = kmip_reader_find_and_read_bytes ( reader, KMIP_TAG_ArchiveDate, &outptr, &outlen); ASSERT (!found); kmip_reader_destroy (reader); free (data); } mongo-c-driver-1.26.0/src/kms-message/test/test_kms_assert.h000066400000000000000000000171301456567454500240240ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_KMS_ASSERT_H #define TEST_KMS_ASSERT_H #include "kms_request_str.h" #include "test_kms_util.h" #include #include #define TEST_ERROR(...) \ do { \ fprintf ( \ stderr, "test error %s:%d %s(): ", __FILE__, __LINE__, __FUNCTION__); \ fprintf (stderr, __VA_ARGS__); \ fprintf (stderr, "\n"); \ fflush (stderr); \ abort (); \ } while (0) #define ASSERT(stmt) \ if (!(stmt)) { \ TEST_ERROR ("statement failed %s", #stmt); \ } #define ASSERT_CMPSTR_WITH_LEN(_expect, _expect_len, _actual, _actual_len) \ do { \ kms_request_str_t *_expect_str = \ kms_request_str_new_from_chars ((_expect), _expect_len); \ kms_request_str_t *_actual_str = \ kms_request_str_new_from_chars ((_actual), _actual_len); \ if (0 != strcmp (_expect_str->str, _actual_str->str)) { \ TEST_ERROR ( \ "strings not equal:\n%s\n%s", _expect_str->str, _actual_str->str); \ } \ kms_request_str_destroy (_actual_str); \ kms_request_str_destroy (_expect_str); \ } while (0) #define ASSERT_CMPSTR(_expect, _actual) \ ASSERT_CMPSTR_WITH_LEN ( \ (_expect), strlen (_expect), (_actual), strlen (_actual)) #define ASSERT_CONTAINS(_a, _b) \ do { \ kms_request_str_t *_a_str = kms_request_str_new_from_chars ((_a), -1); \ kms_request_str_t *_b_str = kms_request_str_new_from_chars ((_b), -1); \ kms_request_str_t *_a_lower = kms_request_str_new (); \ kms_request_str_t *_b_lower = kms_request_str_new (); \ kms_request_str_append_lowercase (_a_lower, (_a_str)); \ kms_request_str_append_lowercase (_b_lower, (_b_str)); \ if (NULL == strstr ((_a_lower->str), (_b_lower->str))) { \ TEST_ERROR ("string \"%s\" does not contain \"%s\"", _a, _b); \ } \ kms_request_str_destroy (_a_str); \ kms_request_str_destroy (_b_str); \ kms_request_str_destroy (_a_lower); \ kms_request_str_destroy (_b_lower); \ } while (0) #define ASSERT_CMPINT(_a, _operator, _b) \ do { \ int _a_int = _a; \ int _b_int = _b; \ if (!(_a_int _operator _b_int)) { \ TEST_ERROR ( \ "comparison failed: %d %s %d", _a_int, #_operator, _b_int); \ } \ } while (0); #define ASSERT_CMPBYTES( \ expected_bytes, expected_len, actual_bytes, actual_len) \ do { \ char *_actual_hex = data_to_hex (actual_bytes, actual_len); \ char *_expected_hex = data_to_hex (expected_bytes, expected_len); \ ASSERT_CMPSTR (_actual_hex, _expected_hex); \ free (_actual_hex); \ free (_expected_hex); \ } while (0) #define ASSERT_REQUEST_OK(req) \ do { \ if (kms_request_get_error (req)) { \ TEST_ERROR ("expected request ok but got error: %s", \ kms_request_get_error (req)); \ } \ } while (0) #define ASSERT_REQUEST_ERROR(req, expect_substring) \ do { \ if (!kms_request_get_error (req)) { \ TEST_ERROR ("expected request error but got ok"); \ } \ const char *_error_str = kms_request_get_error (req); \ ASSERT_CONTAINS (_error_str, expect_substring); \ } while (0) #define ASSERT_RESPONSE_OK(req) \ do { \ if (kms_response_get_error (req)) { \ TEST_ERROR ("expected response ok but got error: %s", \ kms_response_get_error (req)); \ } \ } while (0) #define ASSERT_RESPONSE_ERROR(req, expect_substring) \ do { \ if (!kms_response_get_error (req)) { \ TEST_ERROR ("expected response error but got ok"); \ } \ const char *_error_str = kms_response_get_error (req); \ ASSERT_CONTAINS (_error_str, expect_substring); \ } while (0) #define ASSERT_PARSER_OK(parser) \ do { \ if (kms_response_parser_error (parser)) { \ TEST_ERROR ("expected parser ok but got error: %s", \ kms_response_parser_error (parser)); \ } \ } while (0) #define ASSERT_PARSER_ERROR(parser, expect_substring) \ do { \ if (!kms_response_parser_error (parser)) { \ TEST_ERROR ("expected parser error but got ok"); \ } \ const char *_error_str = kms_response_parser_error (parser); \ ASSERT_CONTAINS (_error_str, expect_substring); \ } while (0) #endif /* TEST_KMS_ASSERT_H */mongo-c-driver-1.26.0/src/kms-message/test/test_kms_azure_online.c000066400000000000000000000177301456567454500252160ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_azure_request.h" #include "kms_message/kms_b64.h" #include "kms_message/kms_request.h" #include "kms_message/kms_response.h" #include "kms_message/kms_response_parser.h" #define MONGOC_LOG_DOMAIN "test_kms_azure_online" #include #include "test_kms_assert.h" #include #include "test_kms_online_util.h" #define SCOPE "https%3A%2F%2Fvault.azure.net%2F.default" /* Define TEST_TRACING_INSECURE in compiler flags to enable * log output with sensitive information (for debugging). */ #ifdef TEST_TRACING_INSECURE #define TEST_TRACE(...) MONGOC_DEBUG (__VA_ARGS__) #else #define TEST_TRACE(...) (void) 0 #endif typedef struct { char *tenant_id; char *client_id; char *client_secret; char *key_url; char *key_vault_url; char *key_path; char *key_host; char *key_name; char *key_version; } test_env_t; static char * test_getenv (const char *key) { char *value = getenv (key); if (!value) { fprintf ( stderr, "Environment variable: %s not set (@@ctest-skip@@)", key); exit (2); } TEST_TRACE ("Env: %s = %s", key, value); return value; } static void test_env_init (test_env_t *test_env) { char *azure_domain = "vault.azure.net"; char *loc; test_env->tenant_id = test_getenv ("AZURE_TENANT_ID"); test_env->client_id = test_getenv ("AZURE_CLIENT_ID"); test_env->client_secret = test_getenv ("AZURE_CLIENT_SECRET"); test_env->key_url = test_getenv ("AZURE_KEY_URL"); test_env->key_name = test_getenv ("AZURE_KEY_NAME"); test_env->key_version = test_getenv ("AZURE_KEY_VERSION"); loc = strstr (test_env->key_url, azure_domain); ASSERT (loc); test_env->key_vault_url = bson_strndup ( test_env->key_url, strlen (azure_domain) + loc - test_env->key_url); test_env->key_path = bson_strdup (loc + strlen (azure_domain)); loc = strstr (test_env->key_vault_url, "//"); test_env->key_host = bson_strdup (loc + 2); } static void test_env_cleanup (test_env_t *test_env) { bson_free (test_env->key_vault_url); bson_free (test_env->key_path); bson_free (test_env->key_host); } /* Authenticate to Azure by sending an oauth request with client_id and client_secret (set in environment variables). Returns the base64url encoded bearer token that must be freed with bson_free. Subsequent requests to Azure can use the returned token by setting the header Authorization: Bearer . References: [1] https://docs.microsoft.com/en-us/azure/key-vault/general/authentication-requests-and-responses */ static char * azure_authenticate (void) { kms_request_t *req; kms_request_opt_t *opt; char *req_str; const char *res_str; bson_t *res_bson; bson_iter_t iter; char *bearer_token; kms_response_t *res; test_env_t test_env; test_env_init (&test_env); opt = kms_request_opt_new (); kms_request_opt_set_connection_close (opt, true); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_AZURE); req = kms_azure_request_oauth_new ("login.microsoftonline.com", SCOPE, test_env.tenant_id, test_env.client_id, test_env.client_secret, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, "login.microsoftonline.com"); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s\n", res_str); ASSERT (kms_response_get_status (res) == 200); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); if (!bson_iter_init_find (&iter, res_bson, "access_token")) { TEST_ERROR ("could not find 'access_token' in HTTP response"); } bearer_token = bson_strdup (bson_iter_utf8 (&iter, NULL)); kms_request_free_string (req_str); kms_response_destroy (res); kms_request_destroy (req); bson_destroy (res_bson); test_env_cleanup (&test_env); kms_request_opt_destroy (opt); return bearer_token; } /* Test wrapping a 96 byte payload (the size of a data key) and unwrapping it * back. */ static void test_azure_wrapkey (void) { test_env_t test_env; kms_request_opt_t *opt; kms_request_t *req; char *req_str; char *bearer_token; kms_response_t *res; const char *res_str; uint8_t *encrypted_raw; size_t encrypted_raw_len; char *decrypted; bson_t *res_bson; bson_iter_t iter; uint8_t *key_data; char *key_data_b64url; int i; #define KEYLEN 96 key_data = bson_malloc0 (KEYLEN); for (i = 0; i < KEYLEN; i++) { key_data[i] = i; } key_data_b64url = kms_message_raw_to_b64url (key_data, KEYLEN); test_env_init (&test_env); bearer_token = azure_authenticate (); opt = kms_request_opt_new (); kms_request_opt_set_connection_close (opt, true); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_AZURE); req = kms_azure_request_wrapkey_new (test_env.key_host, bearer_token, test_env.key_name, test_env.key_version, key_data, KEYLEN, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, test_env.key_host); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s", res_str); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); ASSERT (bson_iter_init_find (&iter, res_bson, "value")); encrypted_raw = kms_message_b64url_to_raw (bson_iter_utf8 (&iter, NULL), &encrypted_raw_len); ASSERT (encrypted_raw); bson_destroy (res_bson); bson_free (req_str); kms_request_destroy (req); kms_response_destroy (res); /* Send a request to unwrap the encrypted key. */ req = kms_azure_request_unwrapkey_new (test_env.key_host, bearer_token, test_env.key_name, test_env.key_version, encrypted_raw, encrypted_raw_len, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, test_env.key_host); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s", res_str); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); ASSERT (bson_iter_init_find (&iter, res_bson, "value")); decrypted = bson_strdup (bson_iter_utf8 (&iter, NULL)); ASSERT_CMPSTR (decrypted, key_data_b64url); bson_destroy (res_bson); kms_response_destroy (res); bson_free (req_str); bson_free (bearer_token); test_env_cleanup (&test_env); kms_request_destroy (req); bson_free (encrypted_raw); bson_free (key_data_b64url); bson_free (key_data); bson_free (decrypted); kms_request_opt_destroy (opt); } int main (int argc, char **argv) { kms_message_init (); test_azure_wrapkey (); return 0; }mongo-c-driver-1.26.0/src/kms-message/test/test_kms_gcp_online.c000066400000000000000000000174721456567454500246440ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_gcp_request.h" #include "kms_message/kms_b64.h" #include "kms_message/kms_request.h" #include "kms_message/kms_response.h" #include "kms_message/kms_response_parser.h" #define MONGOC_LOG_DOMAIN "test_kms_gcp_online" #include #include "test_kms_assert.h" #include #include "test_kms_online_util.h" /* Define TEST_TRACING_INSECURE in compiler flags to enable * log output with sensitive information (for debugging). */ #ifdef TEST_TRACING_INSECURE #define TEST_TRACE(...) MONGOC_DEBUG (__VA_ARGS__) #else #define TEST_TRACE(...) (void) 0 #endif typedef struct { const char *email; const char *audience; const char *scope; const char *auth_host; const char *private_key_b64; const char *kms_host; const char *project_id; const char *location; const char *key_ring_name; const char *key_name; const char *key_version; } test_env_t; static char * test_getenv (const char *key) { char *value = getenv (key); if (!value) { fprintf ( stderr, "Environment variable: %s not set (@@ctest-skip@@)", key); exit (2); } TEST_TRACE ("Env: %s = %s", key, value); return value; } static void test_env_init (test_env_t *test_env) { test_env->email = test_getenv ("GCP_EMAIL"); test_env->audience = test_getenv ("GCP_AUDIENCE"); test_env->scope = test_getenv ("GCP_SCOPE"); test_env->auth_host = test_getenv ("GCP_AUTH_HOST"); test_env->private_key_b64 = test_getenv ("GCP_PRIVATE_KEY_B64"); test_env->kms_host = test_getenv ("GCP_KMS_HOST"); test_env->project_id = test_getenv ("GCP_PROJECT_ID"); test_env->location = test_getenv ("GCP_LOCATION"); test_env->key_ring_name = test_getenv ("GCP_KEY_RING_NAME"); test_env->key_name = test_getenv ("GCP_KEY_NAME"); test_env->key_version = test_getenv ("GCP_KEY_VERSION"); } static char * gcp_authenticate (void) { kms_request_t *req; kms_request_opt_t *opt; char *req_str; const char *res_str; bson_t *res_bson; bson_iter_t iter; char *bearer_token; char *private_key_data; size_t private_key_len; kms_response_t *res; test_env_t test_env; test_env_init (&test_env); opt = kms_request_opt_new (); kms_request_opt_set_connection_close (opt, true); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_GCP); private_key_data = (char *) kms_message_b64_to_raw (test_env.private_key_b64, &private_key_len); if (!private_key_data) { TEST_ERROR ("unable to base64 decode private key"); } req = kms_gcp_request_oauth_new (test_env.auth_host, test_env.email, test_env.audience, test_env.scope, private_key_data, private_key_len, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, "oauth2.googleapis.com"); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s\n", res_str); ASSERT (kms_response_get_status (res) == 200); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); if (!bson_iter_init_find (&iter, res_bson, "access_token")) { TEST_ERROR ("could not find 'access_token' in HTTP response"); } bearer_token = bson_strdup (bson_iter_utf8 (&iter, NULL)); kms_request_free_string (req_str); kms_response_destroy (res); kms_request_destroy (req); bson_destroy (res_bson); kms_request_opt_destroy (opt); bson_free (private_key_data); return bearer_token; } static void test_gcp (void) { test_env_t test_env; kms_request_opt_t *opt; kms_request_t *req; char *req_str; char *bearer_token; kms_response_t *res; const char *res_str; uint8_t *encrypted_raw; size_t encrypted_raw_len; char *decrypted; bson_t *res_bson; bson_iter_t iter; uint8_t *key_data; char *key_data_b64url; int i; #define KEYLEN 96 key_data = bson_malloc0 (KEYLEN); for (i = 0; i < KEYLEN; i++) { key_data[i] = i; } key_data_b64url = kms_message_raw_to_b64 (key_data, KEYLEN); test_env_init (&test_env); bearer_token = gcp_authenticate (); opt = kms_request_opt_new (); kms_request_opt_set_connection_close (opt, true); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_GCP); req = kms_gcp_request_encrypt_new (test_env.kms_host, bearer_token, test_env.project_id, test_env.location, test_env.key_ring_name, test_env.key_name, test_env.key_version, key_data, KEYLEN, opt); ASSERT (req); if (kms_request_get_error (req)) { printf ("error: %s\n", kms_request_get_error (req)); ASSERT (false); } req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, test_env.kms_host); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s", res_str); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); ASSERT (bson_iter_init_find (&iter, res_bson, "ciphertext")); encrypted_raw = kms_message_b64_to_raw (bson_iter_utf8 (&iter, NULL), &encrypted_raw_len); ASSERT (encrypted_raw); bson_destroy (res_bson); bson_free (req_str); kms_request_destroy (req); kms_response_destroy (res); /* Send a request to decrypt the encrypted key. */ req = kms_gcp_request_decrypt_new (test_env.kms_host, bearer_token, test_env.project_id, test_env.location, test_env.key_ring_name, test_env.key_name, encrypted_raw, encrypted_raw_len, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, test_env.kms_host); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s", res_str); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); ASSERT (bson_iter_init_find (&iter, res_bson, "plaintext")); decrypted = bson_strdup (bson_iter_utf8 (&iter, NULL)); ASSERT_CMPSTR (decrypted, key_data_b64url); bson_destroy (res_bson); kms_response_destroy (res); bson_free (req_str); bson_free (bearer_token); kms_request_destroy (req); bson_free (encrypted_raw); bson_free (key_data_b64url); bson_free (key_data); bson_free (decrypted); kms_request_opt_destroy (opt); } int main (int argc, char **argv) { kms_message_init (); test_gcp (); return 0; }mongo-c-driver-1.26.0/src/kms-message/test/test_kms_kmip_request.c000066400000000000000000000242141456567454500252270ustar00rootroot00000000000000#include "test_kms_assert.h" #include "kms_message/kms_kmip_request.h" /* */ #define REGISTER_SECRETDATA_REQUEST \ 0x42, 0x00, 0x78, 0x01, 0x00, 0x00, 0x01, 0x50, 0x42, 0x00, 0x77, 0x01, \ 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, \ 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0d, 0x02, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x01, 0x08, 0x42, 0x00, 0x5c, 0x05, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x79, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x42, 0x00, 0x57, 0x05, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x08, 0x01, \ 0x00, 0x00, 0x00, 0x30, 0x42, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x00, 0x18, \ 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, \ 0x63, 0x20, 0x55, 0x73, 0x61, 0x67, 0x65, 0x20, 0x4d, 0x61, 0x73, 0x6b, \ 0x42, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x85, 0x01, 0x00, 0x00, 0x00, 0x98, \ 0x42, 0x00, 0x86, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x80, \ 0x42, 0x00, 0x42, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x45, 0x01, 0x00, 0x00, 0x00, 0x68, \ 0x42, 0x00, 0x43, 0x08, 0x00, 0x00, 0x00, 0x60, 0xff, 0xa8, 0xcc, 0x79, \ 0xe8, 0xc3, 0x76, 0x3b, 0x01, 0x21, 0xfc, 0xd0, 0x6b, 0xb3, 0x48, 0x8c, \ 0x8b, 0xf4, 0x2c, 0x07, 0x74, 0x60, 0x46, 0x40, 0x27, 0x9b, 0x16, 0xb2, \ 0x64, 0x19, 0x40, 0x30, 0xee, 0xb0, 0x83, 0x96, 0x24, 0x1d, 0xef, 0xcc, \ 0x4d, 0x32, 0xd1, 0x6e, 0xa8, 0x31, 0xad, 0x77, 0x71, 0x38, 0xf0, 0x8e, \ 0x2f, 0x98, 0x56, 0x64, 0xc0, 0x04, 0xc2, 0x48, 0x5d, 0x6f, 0x49, 0x91, \ 0xeb, 0x3d, 0x9e, 0xc3, 0x28, 0x02, 0x53, 0x78, 0x36, 0xa9, 0x06, 0x6b, \ 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a, 0xa4, 0x69, 0x01, 0xe6, \ 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec #define REGISTER_SECRETDATA_SECRETDATA \ 0xff, 0xa8, 0xcc, 0x79, 0xe8, 0xc3, 0x76, 0x3b, 0x01, 0x21, 0xfc, 0xd0, \ 0x6b, 0xb3, 0x48, 0x8c, 0x8b, 0xf4, 0x2c, 0x07, 0x74, 0x60, 0x46, 0x40, \ 0x27, 0x9b, 0x16, 0xb2, 0x64, 0x19, 0x40, 0x30, 0xee, 0xb0, 0x83, 0x96, \ 0x24, 0x1d, 0xef, 0xcc, 0x4d, 0x32, 0xd1, 0x6e, 0xa8, 0x31, 0xad, 0x77, \ 0x71, 0x38, 0xf0, 0x8e, 0x2f, 0x98, 0x56, 0x64, 0xc0, 0x04, 0xc2, 0x48, \ 0x5d, 0x6f, 0x49, 0x91, 0xeb, 0x3d, 0x9e, 0xc3, 0x28, 0x02, 0x53, 0x78, \ 0x36, 0xa9, 0x06, 0x6b, 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a, \ 0xa4, 0x69, 0x01, 0xe6, 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec void kms_kmip_request_register_secretdata_test (void) { kms_request_t *req; uint8_t secret_data[] = {REGISTER_SECRETDATA_SECRETDATA}; const uint8_t *actual_bytes; size_t actual_len; uint8_t expected_bytes[] = {REGISTER_SECRETDATA_REQUEST}; size_t expected_len = sizeof (expected_bytes); req = kms_kmip_request_register_secretdata_new ( NULL, secret_data, sizeof (secret_data)); ASSERT_REQUEST_OK (req); actual_bytes = kms_request_to_bytes (req, &actual_len); ASSERT (actual_bytes != NULL); ASSERT_CMPBYTES (expected_bytes, expected_len, actual_bytes, actual_len); kms_request_destroy (req); } void kms_kmip_request_register_secretdata_invalid_test (void) { kms_request_t *req; uint8_t secret_data[KMS_KMIP_REQUEST_SECRETDATA_LENGTH] = {0}; req = kms_kmip_request_register_secretdata_new ( NULL, secret_data, KMS_KMIP_REQUEST_SECRETDATA_LENGTH - 1); ASSERT_REQUEST_ERROR (req, "SecretData length"); kms_request_destroy (req); } /* */ #define GET_REQUEST \ 0x42, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x88, 0x42, 0x00, 0x77, 0x01, \ 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, \ 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0d, 0x02, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x40, 0x42, 0x00, 0x5c, 0x05, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x79, 0x01, 0x00, 0x00, 0x00, 0x28, 0x42, 0x00, 0x94, 0x07, \ 0x00, 0x00, 0x00, 0x20, 0x37, 0x46, 0x4a, 0x59, 0x76, 0x6e, 0x56, 0x36, \ 0x58, 0x6b, 0x61, 0x55, 0x43, 0x57, 0x75, 0x59, 0x39, 0x36, 0x62, 0x43, \ 0x53, 0x63, 0x36, 0x41, 0x75, 0x68, 0x76, 0x6b, 0x50, 0x70, 0x71, 0x49 void kms_kmip_request_get_test (void) { kms_request_t *req; const uint8_t *actual_bytes; size_t actual_len; uint8_t expected_bytes[] = {GET_REQUEST}; size_t expected_len = sizeof (expected_bytes); static const char *const GET_UNIQUE_IDENTIFIER = "7FJYvnV6XkaUCWuY96bCSc6AuhvkPpqI"; req = kms_kmip_request_get_new (NULL, GET_UNIQUE_IDENTIFIER); ASSERT_REQUEST_OK (req); actual_bytes = kms_request_to_bytes (req, &actual_len); ASSERT (actual_bytes != NULL); ASSERT_CMPBYTES (actual_bytes, actual_len, expected_bytes, expected_len); kms_request_destroy (req); } /* */ #define ACTIVATE_REQUEST \ 0x42, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x88, 0x42, 0x00, 0x77, 0x01, \ 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, \ 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0d, 0x02, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x40, 0x42, 0x00, 0x5c, 0x05, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x79, 0x01, 0x00, 0x00, 0x00, 0x28, 0x42, 0x00, 0x94, 0x07, \ 0x00, 0x00, 0x00, 0x20, 0x37, 0x46, 0x4a, 0x59, 0x76, 0x6e, 0x56, 0x36, \ 0x58, 0x6b, 0x61, 0x55, 0x43, 0x57, 0x75, 0x59, 0x39, 0x36, 0x62, 0x43, \ 0x53, 0x63, 0x36, 0x41, 0x75, 0x68, 0x76, 0x6b, 0x50, 0x70, 0x71, 0x49 void kms_kmip_request_activate_test (void) { kms_request_t *req; const uint8_t *actual_bytes; size_t actual_len; uint8_t expected_bytes[] = {ACTIVATE_REQUEST}; size_t expected_len = sizeof (expected_bytes); static const char *const ACTIVATE_UNIQUE_IDENTIFIER = "7FJYvnV6XkaUCWuY96bCSc6AuhvkPpqI"; req = kms_kmip_request_activate_new (NULL, ACTIVATE_UNIQUE_IDENTIFIER); ASSERT_REQUEST_OK (req); actual_bytes = kms_request_to_bytes (req, &actual_len); ASSERT (actual_bytes != NULL); ASSERT_CMPBYTES (actual_bytes, actual_len, expected_bytes, expected_len); kms_request_destroy (req); } mongo-c-driver-1.26.0/src/kms-message/test/test_kms_kmip_response.c000066400000000000000000000242151456567454500253760ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_assert.h" #include "test_kms_util.h" #include "kms_message/kms_kmip_response.h" #include "kms_message_private.h" /* */ static const uint8_t SUCCESS_REGISTER_RESPONSE[] = { 0x42, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x90, 0x42, 0x00, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x48, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x61, 0x65, 0x97, 0x15, 0x42, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7f, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x94, 0x07, 0x00, 0x00, 0x00, 0x02, 0x33, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static const char *const SUCCESS_REGISTER_RESPONSE_UNIQUE_IDENTIFIER = "39"; void kms_kmip_response_get_unique_identifier_test (void) { kms_response_t res = {0}; char *actual_uid; res.provider = KMS_REQUEST_PROVIDER_KMIP; res.kmip.data = (uint8_t *) SUCCESS_REGISTER_RESPONSE; res.kmip.len = sizeof (SUCCESS_REGISTER_RESPONSE); actual_uid = kms_kmip_response_get_unique_identifier (&res); ASSERT_RESPONSE_OK (&res); ASSERT_CMPSTR (SUCCESS_REGISTER_RESPONSE_UNIQUE_IDENTIFIER, actual_uid); free (actual_uid); } /* */ static const uint8_t SUCCESS_GET_RESPONSE[] = { 0x42, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x01, 0x40, 0x42, 0x00, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x48, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x61, 0x65, 0x97, 0x15, 0x42, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0xe8, 0x42, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7f, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x00, 0xc0, 0x42, 0x00, 0x57, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x94, 0x07, 0x00, 0x00, 0x00, 0x02, 0x33, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x85, 0x01, 0x00, 0x00, 0x00, 0x98, 0x42, 0x00, 0x86, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x80, 0x42, 0x00, 0x42, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x45, 0x01, 0x00, 0x00, 0x00, 0x68, 0x42, 0x00, 0x43, 0x08, 0x00, 0x00, 0x00, 0x60, 0xff, 0xa8, 0xcc, 0x79, 0xe8, 0xc3, 0x76, 0x3b, 0x01, 0x21, 0xfc, 0xd0, 0x6b, 0xb3, 0x48, 0x8c, 0x8b, 0xf4, 0x2c, 0x07, 0x74, 0x60, 0x46, 0x40, 0x27, 0x9b, 0x16, 0xb2, 0x64, 0x19, 0x40, 0x30, 0xee, 0xb0, 0x83, 0x96, 0x24, 0x1d, 0xef, 0xcc, 0x4d, 0x32, 0xd1, 0x6e, 0xa8, 0x31, 0xad, 0x77, 0x71, 0x38, 0xf0, 0x8e, 0x2f, 0x98, 0x56, 0x64, 0xc0, 0x04, 0xc2, 0x48, 0x5d, 0x6f, 0x49, 0x91, 0xeb, 0x3d, 0x9e, 0xc3, 0x28, 0x02, 0x53, 0x78, 0x36, 0xa9, 0x06, 0x6b, 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a, 0xa4, 0x69, 0x01, 0xe6, 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec}; static const uint8_t SUCCESS_GET_RESPONSE_SECRETDATA[] = { 0xff, 0xa8, 0xcc, 0x79, 0xe8, 0xc3, 0x76, 0x3b, 0x01, 0x21, 0xfc, 0xd0, 0x6b, 0xb3, 0x48, 0x8c, 0x8b, 0xf4, 0x2c, 0x07, 0x74, 0x60, 0x46, 0x40, 0x27, 0x9b, 0x16, 0xb2, 0x64, 0x19, 0x40, 0x30, 0xee, 0xb0, 0x83, 0x96, 0x24, 0x1d, 0xef, 0xcc, 0x4d, 0x32, 0xd1, 0x6e, 0xa8, 0x31, 0xad, 0x77, 0x71, 0x38, 0xf0, 0x8e, 0x2f, 0x98, 0x56, 0x64, 0xc0, 0x04, 0xc2, 0x48, 0x5d, 0x6f, 0x49, 0x91, 0xeb, 0x3d, 0x9e, 0xc3, 0x28, 0x02, 0x53, 0x78, 0x36, 0xa9, 0x06, 0x6b, 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a, 0xa4, 0x69, 0x01, 0xe6, 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec}; void kms_kmip_response_get_secretdata_test (void) { kms_response_t res = {0}; uint8_t *actual_secretdata; size_t actual_secretdata_len; res.provider = KMS_REQUEST_PROVIDER_KMIP; res.kmip.data = (uint8_t *) SUCCESS_GET_RESPONSE; res.kmip.len = sizeof (SUCCESS_GET_RESPONSE); actual_secretdata = kms_kmip_response_get_secretdata (&res, &actual_secretdata_len); ASSERT_RESPONSE_OK (&res); ASSERT_CMPBYTES (SUCCESS_GET_RESPONSE_SECRETDATA, sizeof (SUCCESS_GET_RESPONSE_SECRETDATA), actual_secretdata, actual_secretdata_len); free (actual_secretdata); } /* */ static const uint8_t ERROR_GET_RESPOSE_NOTFOUND[] = { 0x42, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x00, 0xa8, 0x42, 0x00, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x48, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x61, 0x57, 0x1e, 0x81, 0x42, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x50, 0x42, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7f, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7e, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x18, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64}; void kms_kmip_response_get_secretdata_notfound_test (void) { kms_response_t res = {0}; uint8_t *secretdata; size_t secretdata_len; res.provider = KMS_REQUEST_PROVIDER_KMIP; res.kmip.data = (uint8_t *) ERROR_GET_RESPOSE_NOTFOUND; res.kmip.len = sizeof (ERROR_GET_RESPOSE_NOTFOUND); secretdata = kms_kmip_response_get_secretdata (&res, &secretdata_len); ASSERT_RESPONSE_ERROR (&res, "ResultReasonItemNotFound"); ASSERT (NULL == secretdata); } mongo-c-driver-1.26.0/src/kms-message/test/test_kms_kmip_response_parser.c000066400000000000000000000133001456567454500267430ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_assert.h" #include "test_kms_util.h" #include "kms_message/kms_kmip_response_parser.h" #include "kms_kmip_response_parser_private.h" /* The following sample data come from section 9.1.2 of * http://docs.oasis-open.org/kmip/spec/v1.4/os/kmip-spec-v1.4-os.html. The * data describes "A Structure containing an Enumeration, value 254, followed * by an Integer, value 255, having tags 420004 and 420005 respectively." */ static const char *const SAMPLE_KMIP = "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE 00 " "00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00"; /* SAMPLE_KMIP_FIRST_LENGTH is the length of message after the first tag, type, * and length. */ static const int SAMPLE_KMIP_FIRST_LENGTH = 32; /* SAMPLE_KMIP_LARGE_LENGTH is a byte size larger than the message. */ static const int SAMPLE_KMIP_LARGE_LENGTH = 1024; void kms_kmip_response_parser_test (void) { kms_response_parser_t *parser; uint8_t *data; size_t outlen; int32_t want_bytes; kms_response_t *res; bool ok; data = hex_to_data (SAMPLE_KMIP, &outlen); parser = kms_kmip_response_parser_new (NULL); want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH, ==, want_bytes); /* A smaller maximum size caps the requested bytes. */ want_bytes = kms_response_parser_wants_bytes (parser, 1); ASSERT_CMPINT (1, ==, want_bytes); /* Feed one byte */ ok = kms_response_parser_feed (parser, data, 1); ASSERT_PARSER_OK (parser); ASSERT (ok); want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH - 1, ==, want_bytes); /* Feed the remaining bytes. */ ok = kms_response_parser_feed ( parser, data + 1, KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH - 1); ASSERT_PARSER_OK (parser); ASSERT (ok); /* The parser knows first length. Expect the parser wants the remaining * length. */ want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (want_bytes, ==, SAMPLE_KMIP_FIRST_LENGTH); ok = kms_response_parser_feed (parser, data + KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH, SAMPLE_KMIP_FIRST_LENGTH); ASSERT_PARSER_OK (parser); ASSERT (ok); /* Parser has full message. */ want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (want_bytes, ==, 0); res = kms_response_parser_get_response (parser); ASSERT_PARSER_OK (parser); ASSERT (res); kms_response_destroy (res); kms_response_parser_destroy (parser); free (data); } static void feed_full_response (kms_response_parser_t *parser, uint8_t *data) { uint32_t i = 0; int32_t want_bytes; bool ok; want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH, ==, want_bytes); while (want_bytes > 0) { ok = kms_response_parser_feed (parser, data + i, want_bytes); ASSERT_PARSER_OK (parser); ASSERT (ok); i += want_bytes; want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); } } void kms_kmip_response_parser_reuse_test (void) { kms_response_parser_t *parser; uint8_t *data; size_t outlen; kms_response_t *res; data = hex_to_data (SAMPLE_KMIP, &outlen); parser = kms_kmip_response_parser_new (NULL); feed_full_response (parser, data); ASSERT_PARSER_OK (parser); res = kms_response_parser_get_response (parser); ASSERT_PARSER_OK (parser); ASSERT (res); kms_response_destroy (res); /* Feed another full response. */ feed_full_response (parser, data); ASSERT_PARSER_OK (parser); res = kms_response_parser_get_response (parser); ASSERT_PARSER_OK (parser); ASSERT (res); kms_response_destroy (res); kms_response_parser_destroy (parser); free (data); } void kms_kmip_response_parser_excess_test (void) { kms_response_parser_t *parser; uint8_t *data; size_t outlen; bool ok; data = hex_to_data (SAMPLE_KMIP, &outlen); parser = kms_kmip_response_parser_new (NULL); feed_full_response (parser, data); ASSERT_PARSER_OK (parser); ok = kms_response_parser_feed (parser, data, 1); ASSERT_PARSER_ERROR (parser, "KMIP parser was fed too much data"); ASSERT (!ok); kms_response_parser_destroy (parser); free (data); } void kms_kmip_response_parser_notenough_test (void) { kms_response_parser_t *parser; uint8_t *data; size_t outlen; kms_response_t *res; bool ok; data = hex_to_data (SAMPLE_KMIP, &outlen); parser = kms_kmip_response_parser_new (NULL); ok = kms_response_parser_feed ( parser, data, KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH); ASSERT_PARSER_OK (parser); ASSERT (ok); res = kms_response_parser_get_response (parser); ASSERT_PARSER_ERROR (parser, "KMIP parser does not have a complete message"); ASSERT (!res); kms_response_parser_destroy (parser); free (data); } mongo-c-driver-1.26.0/src/kms-message/test/test_kms_online_util.c000066400000000000000000000066071456567454500250460ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_online_util.h" #include "test_kms_assert.h" #include "kms_message/kms_response_parser.h" mongoc_stream_t * connect_with_tls (const char *host, const char *port, mongoc_ssl_opt_t *ssl_opt) { mongoc_stream_t *stream; mongoc_socket_t *sock = NULL; struct addrinfo hints; struct addrinfo *result, *rp; int64_t expire_at; int s; const int connecttimeoutms = 5000; memset (&hints, 0, sizeof hints); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; hints.ai_protocol = 0; if (!port) { port = "443"; } s = getaddrinfo (host, port, &hints, &result); ASSERT_CMPINT (s, ==, 0); for (rp = result; rp; rp = rp->ai_next) { if (!(sock = mongoc_socket_new ( rp->ai_family, rp->ai_socktype, rp->ai_protocol))) { continue; } expire_at = bson_get_monotonic_time () + (connecttimeoutms * 1000L); if (0 != mongoc_socket_connect ( sock, rp->ai_addr, (mongoc_socklen_t) rp->ai_addrlen, expire_at)) { mongoc_socket_destroy (sock); sock = NULL; continue; } break; } if (!sock) { TEST_ERROR ("Failed to connect: %s", host); } freeaddrinfo (result); stream = mongoc_stream_socket_new (sock); ASSERT (stream); if (ssl_opt == NULL) { ssl_opt = (mongoc_ssl_opt_t *) mongoc_ssl_opt_get_default (); } return mongoc_stream_tls_new_with_hostname ( stream, host, ssl_opt, 1); } /* Helper to send an HTTP request and receive a response. */ kms_response_t * send_kms_request (kms_request_t *req, const char *host) { mongoc_stream_t *tls_stream; char *req_str; int32_t socket_timeout_ms = 5000; ssize_t write_ret; kms_response_parser_t *response_parser; int bytes_to_read; int bytes_read; uint8_t buf[1024]; kms_response_t *response; tls_stream = connect_with_tls (host, NULL, NULL); req_str = kms_request_to_string (req); write_ret = mongoc_stream_write ( tls_stream, req_str, strlen (req_str), socket_timeout_ms); ASSERT_CMPINT ((int) write_ret, ==, (int) strlen (req_str)); response_parser = kms_response_parser_new (); while ((bytes_to_read = kms_response_parser_wants_bytes (response_parser, 1024)) > 0) { bytes_read = (int) mongoc_stream_read ( tls_stream, buf, bytes_to_read, 0, socket_timeout_ms); if (!kms_response_parser_feed (response_parser, buf, bytes_read)) { TEST_ERROR ("read failed: %s", kms_response_parser_error (response_parser)); } } response = kms_response_parser_get_response (response_parser); ASSERT (response); kms_request_free_string (req_str); kms_response_parser_destroy (response_parser); mongoc_stream_destroy (tls_stream); return response; }mongo-c-driver-1.26.0/src/kms-message/test/test_kms_online_util.h000066400000000000000000000022231456567454500250410ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_KMS_ONLINE_UTIL_H #define TEST_KMS_ONLINE_UTIL_H #include #include "kms_message/kms_request.h" #include "kms_message/kms_response.h" /* connect_with_tls creates a TLS stream. * port may be NULL. It defaults to "443". * ssl_opt may be NULL. It defaults to mongoc_ssl_opt_default (). */ mongoc_stream_t * connect_with_tls (const char *host, const char *port, mongoc_ssl_opt_t *ssl_opt); kms_response_t * send_kms_request (kms_request_t *req, const char *host); #endif /* TEST_KMS_ONLINE_UTIL_H */mongo-c-driver-1.26.0/src/kms-message/test/test_kms_request.c000066400000000000000000001176351456567454500242210ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* Needed for strptime */ #define _GNU_SOURCE #include "kms_message/kms_message.h" #include "kms_message_private.h" #ifndef _WIN32 #include #else #include "windows/dirent.h" #endif #include #include #include #include #include #include #include #include "kms_message/kms_azure_request.h" #include "kms_message/kms_b64.h" #include "hexlify.h" #include "kms_request_str.h" #include "kms_kv_list.h" #include "kms_port.h" #include "test_kms_assert.h" const char *aws_test_suite_dir = "aws-sig-v4-test-suite"; const char *skipped_aws_tests[] = { /* we don't yet support temporary security credentials provided by the AWS * Security Token Service (AWS STS). see post-sts-token/readme.txt */ "post-sts-token", }; bool skip_aws_test (const char *test_name) { size_t i; for (i = 0; i < sizeof (skipped_aws_tests) / sizeof (char *); i++) { if (0 == strcmp (test_name, skipped_aws_tests[i])) { return true; } } return false; } bool ends_with (const char *str, const char *suffix) { size_t str_len = strlen (str); size_t suf_len = strlen (suffix); if (str_len >= suf_len && 0 == strncmp (&str[str_len - suf_len], suffix, suf_len)) { return true; } return false; } char * last_segment (const char *str) { const char *p = str + strlen (str); while (--p > str) { if (*p == '/') { return strdup (p + 1); } } return strdup (str); } char * test_file_path (const char *path, const char *suffix) { char *r; char *test_name = last_segment (path); char file_path[PATH_MAX]; snprintf (file_path, PATH_MAX, "%s/%s.%s", path, test_name, suffix); r = strdup (file_path); free (test_name); return r; } void realloc_buffer (char **buffer, size_t *n, size_t len) { if (*buffer == NULL) { *buffer = malloc (len); KMS_ASSERT (*buffer); } else { *buffer = realloc (*buffer, len); } *n = len; } ssize_t test_getline (char **lineptr, size_t *n, FILE *stream) { if (*lineptr == NULL && *n == 0) { realloc_buffer (lineptr, n, 128); }; // Sanity check if ((*lineptr == NULL && *n != 0) || (*lineptr != NULL && *n == 0)) { abort (); } ssize_t count = 0; while (true) { // Read a character int c = fgetc (stream); // If the buffer is full, grow the buffer if ((*n - count) <= 1) { realloc_buffer (lineptr, n, *n + 128); } if (c == EOF) { *(*lineptr + count) = '\0'; if (count > 0) { return count; } return -1; } *(*lineptr + count) = c; ++count; // If we hit the end of the line, we are done if (c == '\n') { *(*lineptr + count) = '\0'; return count; } } } char * read_test (const char *path, const char *suffix) { char *file_path = test_file_path (path, suffix); FILE *f; struct stat file_stat; size_t f_size; char *str; if (0 != stat (file_path, &file_stat)) { perror (file_path); abort (); } f = fopen (file_path, "r"); if (!f) { perror (file_path); abort (); } f_size = (size_t) file_stat.st_size; str = malloc (f_size + 1); KMS_ASSERT (str); memset (str, 0, f_size + 1); // Windows will convert crlf to lf // We want this behavior in this function call but // it prevents us from validating we read the whole file here. #ifndef _WIN32 if (f_size != fread (str, 1, f_size, f)) { perror (file_path); abort (); } #else fread (str, 1, f_size, f); #endif fclose (f); str[f_size] = '\0'; free (file_path); return str; } void set_test_date (kms_request_t *request) { struct tm tm; /* all tests use the same date and time: 20150830T123600Z */ tm.tm_year = 115; tm.tm_mon = 7; tm.tm_mday = 30; tm.tm_yday = 241; tm.tm_wday = 0; tm.tm_hour = 12; tm.tm_min = 36; tm.tm_sec = 0; KMS_ASSERT (kms_request_set_date (request, &tm)); } kms_request_t * read_req (const char *path) { kms_request_t *request; char *file_path = test_file_path (path, "req"); FILE *f; size_t len = 0; ssize_t line_len; char *line = NULL; char *method; char *uri_path; char *field_name; char *field_value; bool r; f = fopen (file_path, "r"); if (!f) { perror (file_path); abort (); } /* like "GET /path HTTP/1.1" */ line_len = test_getline (&line, &len, f); method = kms_strndup (line, strchr (line, ' ') - line); uri_path = kms_strndup (line + strlen (method) + 1, line_len - strlen (method) - 1 - strlen (" HTTP/1.1\n")); request = kms_request_new (method, uri_path, NULL); request->auto_content_length = false; /* from docs.aws.amazon.com/general/latest/gr/signature-v4-test-suite.html */ kms_request_set_region (request, "us-east-1"); kms_request_set_service (request, "service"); kms_request_set_access_key_id (request, "AKIDEXAMPLE"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); while ((line_len = test_getline (&line, &len, f)) != -1) { if (strchr (line, ':')) { /* new header field like Host:example.com */ field_name = strtok (line, ": "); KMS_ASSERT (field_name); field_value = strtok (NULL, "\n"); KMS_ASSERT (field_value); r = kms_request_add_header_field (request, field_name, field_value); KMS_ASSERT (r); } else if (0 == strcmp (line, "\n")) { /* end of header */ break; } else if (line_len > 2) { /* continuing a multiline header value from previous line */ /* Header line folding is deprecated by RFC 7230 section 3.2. */ /* get-header-value-multiline tests this behavior. */ kms_request_append_header_field_value (request, "\r\n", 2); /* omit this line's newline */ kms_request_append_header_field_value ( request, line, (size_t) (line_len - 1)); } } while ((line_len = test_getline (&line, &len, f)) != -1) { KMS_ASSERT (kms_request_append_payload (request, line, (size_t) line_len)); } fclose (f); free (file_path); free (line); free (uri_path); free (method); set_test_date (request); return request; } void test_compare (kms_request_t *request, char *(*func) (kms_request_t *), const char *dir_path, const char *suffix) { char *test_name = last_segment (dir_path); char *expect; char *actual; expect = read_test (dir_path, suffix); if (0 == strcmp (suffix, "sreq")) { /* The final signed request is an HTTP request. * The expected output must contain \r\n, not \n. */ char* tmp = replace_all (expect, "\n", "\r\n"); free (expect); expect = tmp; } actual = func (request); ASSERT_CMPSTR (expect, actual); free (actual); free (expect); free (test_name); } void test_compare_creq (kms_request_t *request, const char *dir_path) { test_compare (request, kms_request_get_canonical, dir_path, "creq"); } void test_compare_sts (kms_request_t *request, const char *dir_path) { test_compare (request, kms_request_get_string_to_sign, dir_path, "sts"); } void test_compare_authz (kms_request_t *request, const char *dir_path) { test_compare (request, kms_request_get_signature, dir_path, "authz"); } void test_compare_sreq (kms_request_t *request, const char *dir_path) { test_compare (request, kms_request_get_signed, dir_path, "sreq"); } void aws_sig_v4_test (const char *dir_path) { kms_request_t *request; request = read_req (dir_path); test_compare_creq (request, dir_path); test_compare_sts (request, dir_path); test_compare_authz (request, dir_path); test_compare_sreq (request, dir_path); kms_request_destroy (request); } bool all_aws_sig_v4_tests (const char *path, const char *selected) { /* Amazon supplies tests, one per directory, 5 files per test, see * docs.aws.amazon.com/general/latest/gr/signature-v4-test-suite.html */ DIR *dp; struct dirent *ent; bool ran_tests = false; char *test_name = last_segment (path); char sub[PATH_MAX]; dp = opendir (path); if (!dp) { perror (path); abort (); } if (skip_aws_test (test_name) && !selected) { printf ("SKIP: %s\n", test_name); goto done; } while ((ent = readdir (dp))) { if (ent->d_name[0] == '.') { continue; } if (ent->d_type & DT_DIR) { snprintf (sub, PATH_MAX, "%s/%s", path, ent->d_name); ran_tests |= all_aws_sig_v4_tests (sub, selected); } if (!(ent->d_type & DT_REG) || !ends_with (ent->d_name, ".req")) { continue; } /* "ent" is a "test.req" request file, this is a test directory */ /* skip the test if it doesn't match the name passed to us */ if (selected && 0 != strcmp (test_name, selected)) { continue; } printf ("%s\n", path); aws_sig_v4_test (path); ran_tests = true; } done: (void) closedir (dp); free (test_name); return ran_tests; } /* docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html */ void example_signature_test (void) { const char *expect = "c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9"; kms_request_t *request; unsigned char signing[32]; char *sig; request = kms_request_new ("GET", "uri", NULL); set_test_date (request); kms_request_set_region (request, "us-east-1"); kms_request_set_service (request, "iam"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); KMS_ASSERT (kms_request_get_signing_key (request, signing)); sig = hexlify (signing, 32); ASSERT_CMPSTR (expect, sig); free (sig); kms_request_destroy (request); } void path_normalization_test (void) { const char *tests[][2] = { {"", "/"}, {"/", "/"}, {"/..", "/"}, {"./..", "/"}, {"../..", "/"}, {"/../..", "/"}, {"a", "a"}, {"a/", "a/"}, {"a//", "a/"}, {"a///", "a/"}, {"/a", "/a"}, {"//a", "/a"}, {"///a", "/a"}, {"/a/", "/a/"}, {"/a/..", "/"}, {"/a/../..", "/"}, {"/a/b/../..", "/"}, {"/a/b/c/../..", "/a"}, {"/a/b/../../d", "/d"}, {"/a/b/c/../../d", "/a/d"}, {"/a/b", "/a/b"}, {"a/..", "/"}, {"a/../..", "/"}, {"a/b/../..", "/"}, {"a/b/c/../..", "a"}, {"a/b/../../d", "d"}, {"a/b/c/../../d", "a/d"}, {"a/b", "a/b"}, {"/a//b", "/a/b"}, {"/a///b", "/a/b"}, {"/a////b", "/a/b"}, {"//", "/"}, {"//a///", "/a/"}, }; const char **test; const char *out; size_t i; kms_request_str_t *in, *norm; for (i = 0; i < sizeof (tests) / (2 * sizeof (const char *)); i++) { test = tests[i]; in = kms_request_str_new_from_chars (test[0], -1); out = test[1]; norm = kms_request_str_path_normalized (in); ASSERT_CMPSTR (out, norm->str); kms_request_str_destroy (in); kms_request_str_destroy (norm); } } kms_request_t * make_test_request (void) { kms_request_t *request = kms_request_new ("POST", "/", NULL); kms_request_set_region (request, "foo-region"); kms_request_set_service (request, "foo-service"); kms_request_set_access_key_id (request, "foo-akid"); kms_request_set_secret_key (request, "foo-key"); set_test_date (request); return request; } void host_test (void) { kms_request_t *request = make_test_request (); test_compare_sreq (request, "test/host"); kms_request_destroy (request); } void content_length_test (void) { const char *payload = "foo-payload"; kms_request_t *request = make_test_request (); KMS_ASSERT (kms_request_append_payload (request, payload, strlen (payload))); test_compare_sreq (request, "test/content_length"); kms_request_destroy (request); } void bad_query_test (void) { kms_request_t *request = kms_request_new ("GET", "/?asdf", NULL); ASSERT_CONTAINS (kms_request_get_error (request), "Cannot parse"); kms_request_destroy (request); } void append_header_field_value_test (void) { kms_request_t *request = kms_request_new ("GET", "/", NULL); KMS_ASSERT (kms_request_add_header_field (request, "a", "b")); KMS_ASSERT (kms_request_append_header_field_value (request, "asdf", 4)); /* header field 0 is "X-Amz-Date", field 1 is "a" */ ASSERT_CMPSTR (request->header_fields->kvs[1].value->str, "basdf"); kms_request_destroy (request); } void set_date_test (void) { // Windows CRT asserts on this negative test because it is a negative test // so it is skipped on Windows. #ifndef _WIN32 struct tm tm = {0}; kms_request_t *request = kms_request_new ("GET", "/", NULL); tm.tm_sec = 9999; /* invalid, shouldn't be > 60 */ KMS_ASSERT (!kms_request_set_date (request, &tm)); ASSERT_CONTAINS (kms_request_get_error (request), "Invalid tm struct"); kms_request_destroy (request); #endif } void multibyte_test (void) { /* euro currency symbol */ #define EU "\xe2\x82\xac" kms_request_t *request = kms_request_new ("GET", "/" EU "/?euro=" EU, NULL); set_test_date (request); KMS_ASSERT (kms_request_set_region (request, EU)); KMS_ASSERT (kms_request_set_service (request, EU)); kms_request_set_access_key_id (request, "AKIDEXAMPLE"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); KMS_ASSERT (kms_request_add_header_field (request, EU, EU)); KMS_ASSERT (kms_request_append_header_field_value (request, "asdf" EU, 7)); KMS_ASSERT (kms_request_append_payload (request, EU, sizeof (EU))); /* header field 0 is "X-Amz-Date" */ ASSERT_CMPSTR (request->header_fields->kvs[1].value->str, EU "asdf" EU); test_compare_creq (request, "test/multibyte"); test_compare_sreq (request, "test/multibyte"); kms_request_destroy (request); #undef EU } void connection_close_test (void) { kms_request_opt_t *opt; kms_request_t *request; opt = kms_request_opt_new (); kms_request_opt_set_connection_close (opt, true); request = kms_request_new ("POST", "/", opt); kms_request_set_region (request, "foo-region"); kms_request_set_service (request, "foo-service"); kms_request_set_access_key_id (request, "foo-akid"); kms_request_set_secret_key (request, "foo-key"); set_test_date (request); test_compare_sreq (request, "test/connection_close"); kms_request_opt_destroy (opt); kms_request_destroy (request); } /* the ciphertext blob from a response to an "Encrypt" API call */ const char ciphertext_blob[] = "\x01\x02\x02\x00\x78\xf3\x8e\xd8\xd4\xc6\xba\xfb\xa1\xcf\xc1\x1e\x68\xf2" "\xa1\x91\x9e\x36\x4d\x74\xa2\xc4\x9e\x30\x67\x08\x53\x33\x0d\xcd\xe0\xc9" "\x1b\x01\x60\x30\xd4\x73\x9e\x90\x1f\xa7\x43\x55\x84\x26\xf9\xd5\xf0\xb1" "\x00\x00\x00\x64\x30\x62\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x07\x06\xa0" "\x55\x30\x53\x02\x01\x00\x30\x4e\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x07" "\x01\x30\x1e\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x2e\x30\x11\x04\x0c" "\xa2\xc7\x12\x1c\x25\x38\x0e\xec\x08\x1f\x23\x09\x02\x01\x10\x80\x21\x61" "\x03\xcd\xcb\xe2\xac\x36\x4f\x73\xdb\x1b\x73\x2e\x33\xda\x45\x51\xf4\xcd" "\xc0\xff\xd2\xe1\xb9\xc4\xc2\x0e\xbf\x53\x90\x46\x18\x42"; void decrypt_request_test (void) { kms_request_t *request = kms_decrypt_request_new ( (uint8_t *) ciphertext_blob, sizeof (ciphertext_blob) - 1, NULL); set_test_date (request); kms_request_set_region (request, "us-east-1"); kms_request_set_service (request, "service"); kms_request_set_access_key_id (request, "AKIDEXAMPLE"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); test_compare_creq (request, "test/decrypt"); test_compare_sreq (request, "test/decrypt"); kms_request_destroy (request); } void encrypt_request_test (void) { char *plaintext = "foobar"; kms_request_t *request = kms_encrypt_request_new ( (uint8_t *) plaintext, strlen (plaintext), "alias/1", NULL); set_test_date (request); kms_request_set_region (request, "us-east-1"); kms_request_set_service (request, "service"); kms_request_set_access_key_id (request, "AKIDEXAMPLE"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); test_compare_creq (request, "test/encrypt"); test_compare_sreq (request, "test/encrypt"); kms_request_destroy (request); } void kv_list_del_test (void) { kms_kv_list_t *lst = kms_kv_list_new (); kms_request_str_t *k = kms_request_str_new_from_chars ("one", -1); kms_request_str_t *v = kms_request_str_new_from_chars ("v", -1); kms_kv_list_add (lst, k, v); kms_request_str_set_chars (k, "two", -1); kms_kv_list_add (lst, k, v); kms_request_str_set_chars (k, "three", -1); kms_kv_list_add (lst, k, v); kms_request_str_set_chars (k, "two", -1); /* dupe */ kms_kv_list_add (lst, k, v); kms_request_str_set_chars (k, "four", -1); kms_kv_list_add (lst, k, v); KMS_ASSERT (lst->len == 5); kms_kv_list_del (lst, "two"); /* delete both "two" keys */ KMS_ASSERT (lst->len == 3); ASSERT_CMPSTR (lst->kvs[0].key->str, "one"); ASSERT_CMPSTR (lst->kvs[1].key->str, "three"); ASSERT_CMPSTR (lst->kvs[2].key->str, "four"); kms_request_str_destroy (k); kms_request_str_destroy (v); kms_kv_list_destroy (lst); } void b64_test (void) { uint8_t *expected = (uint8_t *) "\x01\x02\x03\x04"; char encoded[9]; int r; uint8_t data[5]; r = kms_message_b64_ntop (expected, 4, encoded, 9); KMS_ASSERT (r == 8); ASSERT_CMPSTR (encoded, "AQIDBA=="); r = kms_message_b64_pton (encoded, data, 5); /* +1 for terminator */ KMS_ASSERT (r == 4); KMS_ASSERT (0 == memcmp (expected, data, 4)); } void b64_b64url_test (void) { char base64_data[64]; char base64url_data[64]; int ret; memset (base64_data, 0, sizeof (base64_data)); memset (base64url_data, 0, sizeof (base64url_data)); strcpy (base64_data, "PDw/Pz8+Pg=="); ret = kms_message_b64_to_b64url (base64_data, strlen (base64_data), base64url_data, sizeof (base64url_data)); ASSERT (ret == 12); ASSERT_CMPSTR (base64url_data, "PDw_Pz8-Pg=="); memset (base64_data, 0, sizeof (base64_data)); ret = kms_message_b64url_to_b64 (base64url_data, strlen (base64url_data), base64_data, sizeof (base64_data)); ASSERT (ret == 12); ASSERT_CMPSTR (base64_data, "PDw/Pz8+Pg=="); /* Convert to base64url in-place. */ ret = kms_message_b64_to_b64url ( base64_data, strlen (base64_data), base64_data, sizeof (base64_data)); ASSERT (ret == 12); ASSERT_CMPSTR (base64_data, "PDw_Pz8-Pg=="); } void kms_response_parser_test (void) { kms_response_parser_t *parser = kms_response_parser_new (); kms_response_t *response; /* the parser resets after returning a response. */ ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "Content-Length: 15\r\n", 20)); ASSERT (kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "This is a test.", 15)); ASSERT (0 == kms_response_parser_wants_bytes (parser, 123)); response = kms_response_parser_get_response (parser); ASSERT (response->status == 200) ASSERT_CMPSTR (response->body->str, "This is a test."); kms_response_destroy (response); kms_response_parser_destroy (parser); /* We fail to parse invalid HTTP */ parser = kms_response_parser_new (); ASSERT (!kms_response_parser_feed ( parser, (uint8_t *) "To Whom it May Concern\r\n", 24)); kms_response_parser_destroy (parser); /* We fail on HTTP other than 1.1 */ parser = kms_response_parser_new (); ASSERT (!kms_response_parser_feed ( parser, (uint8_t *) "HTTP/6.1 200 OK\r\n", 17)); kms_response_parser_destroy (parser); /* We fail if there is no status */ parser = kms_response_parser_new (); ASSERT (!kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 CREATED\r\n", 18)); kms_response_parser_destroy (parser); /* We do not fail when parsing a non-200 status code, * as the content may provide a useful error message. */ parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 100 CONTINUE\r\n", 23)); ASSERT (kms_response_parser_status (parser) == 100); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 201 CREATED\r\n", 22)); ASSERT (kms_response_parser_status (parser) == 201); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 301 MOVED PERMANENTLY\r\n", 32)); ASSERT (kms_response_parser_status (parser) == 301); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 400 BAD REQUEST\r\n", 26)); ASSERT (kms_response_parser_status (parser) == 400); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 404 NOT FOUND\r\n", 24)); ASSERT (kms_response_parser_status (parser) == 404); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 500 INTERNAL SERVER ERROR\r\n", 36)); ASSERT (kms_response_parser_status (parser) == 500); kms_response_parser_destroy (parser); /* We fail if the header doesn't have a colon in it */ parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT (!kms_response_parser_feed ( parser, (uint8_t *) "Content-Length= 15\r\n", 20)); ASSERT (strstr (kms_response_parser_error (parser), "Could not parse header, no colon found.")); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT ( !kms_response_parser_feed (parser, (uint8_t *) "Anything else\r\n", 15)); ASSERT (strstr (kms_response_parser_error (parser), "Could not parse header, no colon found.")); kms_response_parser_destroy (parser); /* An empty body is ok. */ parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT (kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); kms_response_parser_destroy (parser); /* Extra content is not ok. */ parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT (kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); ASSERT (!kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); ASSERT (strstr (kms_response_parser_error (parser), "Unexpected extra HTTP content")); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "Content-Length: 5\r\n", 19)); ASSERT (kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); ASSERT (!kms_response_parser_feed (parser, (uint8_t *) "abcdefghi", 9)); ASSERT (strstr (kms_response_parser_error (parser), "Unexpected: exceeded content length")); kms_response_parser_destroy (parser); } typedef struct { const char *filepath; const char *expected_body; int max_to_read; int expected_status; } parser_testcase_t; /* File should have \r\n line endings (use /etc/rewrite.py) */ static void parser_testcase_run (parser_testcase_t *testcase) { FILE *response_file; kms_response_parser_t *parser; kms_response_t *response; uint8_t buf[512] = {0}; int bytes_to_read; response_file = fopen (testcase->filepath, "rb"); ASSERT (response_file); parser = kms_response_parser_new (); while ((bytes_to_read = kms_response_parser_wants_bytes ( parser, testcase->max_to_read)) > 0) { if (bytes_to_read > testcase->max_to_read) { bytes_to_read = testcase->max_to_read; } size_t ret = fread (buf, 1, (size_t) bytes_to_read, response_file); if (!kms_response_parser_feed (parser, buf, (int) ret)) { printf ("feed error: %s\n", parser->error); ASSERT (false); } } fclose (response_file); ASSERT (0 == kms_response_parser_wants_bytes (parser, 123)); response = kms_response_parser_get_response (parser); ASSERT_CMPSTR (testcase->expected_body, response->body->str); ASSERT (response->status == testcase->expected_status); kms_response_parser_destroy (parser); kms_response_destroy (response); } static void kms_response_parser_files (void) { const char *body = "{\"CiphertextBlob\":\"AQICAHifzrL6n/" "3uqZyz+z1bJj80DhqPcSAibAaIoYc+HOVP6QEplwbM0wpvU5zsQG/" "1SBKvAAAAZDBiBgkqhkiG9w0BBwagVTBTAgEAME4GCSqGSIb3DQEHATA" "eBglghkgBZQMEAS4wEQQM5syMJE7RodxDaqYqAgEQgCHMFCnFso4Lih0" "CNbLT1kiET0hQyzjgoa9733353GQkGlM=\",\"KeyId\":\"arn:aws:" "kms:us-east-1:524754917239:key/" "bd05530b-0a7f-4fbd-8362-ab3667370db0\"}"; const char *chunked_body = "{\"access_token\":" "\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"," "\"expires_in\":3599,\"token_type\":\"Bearer\"}"; parser_testcase_t tests[] = { {"./test/example-response.bin", body, 512, 200}, {"./test/example-response.bin", body, 1, 200}, {"./test/example-chunked-response.bin", chunked_body, 512, 200}, {"./test/example-chunked-response.bin", chunked_body, 1, 200}, {"./test/example-multi-chunked-response.bin", chunked_body, 512, 200}, {"./test/example-multi-chunked-response.bin", chunked_body, 1, 200}}; size_t i; for (i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) { printf (" parser testcase: %d\n", (int) i); parser_testcase_run (tests + i); } } #define CLEAR(_field) \ do { \ kms_request_str_destroy (_field); \ _field = kms_request_str_new (); \ } while (0) void kms_request_validate_test (void) { kms_request_t *request = NULL; request = make_test_request (); CLEAR (request->region); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Region not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->service); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Service not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->access_key_id); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Access key ID not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->method); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Method not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->path); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Path not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->date); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Date not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->secret_key); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Secret key not set", kms_request_get_error (request)); kms_request_destroy (request); } /* Test private key signing. * * private_key_b64 was generated by taking the base64 data out of * test-private-key.pem generated as follows: openssl genpkey -out * test-private-key.pem -algorithm RSA -pkeyopt rsa_keygen_bits:2048 * * It was used to generate a test signature of the string "data to sign" with: * openssl dgst -sign test-private-key.pem -sha256 signme.txt | base64 */ static void kms_signature_test (void) { const char *private_key_b64 = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4JOyv5z05cL18ztpknRC7" "CFY2gYol4DAKerdVUoDJxCTmFMf39dVUEqD0WDiw/qcRtSO1/" "FRut08PlSPmvbyKetsLoxlpS8lukSzEFpFK7+L+R4miFOl6HvECyg7lbC1H/" "WGAhIz9yZRlXhRo9qmO/" "fB6PV9IeYtU+" "1xYuXicjCDPp36uuxBAnCz7JfvxJ3mdVc0vpSkbSb141nWuKNYR1mgyvvL6KzxO6mYsCo4hR" "AdhuizD9C4jDHk0V2gDCFBk0h8SLEdzStX8L0jG90/Og4y7J1b/cPo/" "kbYokkYisxe8cPlsvGBf+rZex7XPxc1yWaP080qeABJb+S88O//" "LAgMBAAECggEBAKVxP1m3FzHBUe2NZ3fYCc0Qa2zjK7xl1KPFp2u4CU+" "9sy0oZJUqQHUdm5CMprqWwIHPTftWboFenmCwrSXFOFzujljBO7Z3yc1WD3NJl1ZNepLcsRJ" "3WWFH5V+NLJ8Bdxlj1DMEZCwr7PC5+vpnCuYWzvT0qOPTl9RNVaW9VVjHouJ9Fg+" "s2DrShXDegFabl1iZEDdI4xScHoYBob06A5lw0WOCTayzw0Naf37lM8Y4psRAmI46XLiF/" "Vbuorna4hcChxDePlNLEfMipICcuxTcei1RBSlBa2t1tcnvoTy6cuYDqqImRYjp1KnMKlKQB" "nQ1NjS2TsRGm+F0FbreVCECgYEA4IDJlm8q/hVyNcPe4OzIcL1rsdYN3bNm2Y2O/" "YtRPIkQ446ItyxD06d9VuXsQpFp9jNACAPfCMSyHpPApqlxdc8z/" "xATlgHkcGezEOd1r4E7NdTpGg8y6Rj9b8kVlED6v4grbRhKcU6moyKUQT3+" "1B6ENZTOKyxuyDEgTwZHtFECgYEA0fqdv9h9s77d6eWmIioP7FSymq93pC4umxf6TVicpjpM" "ErdD2ZfJGulN37dq8FOsOFnSmFYJdICj/PbJm6p1i8O21lsFCltEqVoVabJ7/" "0alPfdG2U76OeBqI8ZubL4BMnWXAB/" "VVEYbyWCNpQSDTjHQYs54qa2I0dJB7OgJt1sCgYEArctFQ02/" "7H5Rscl1yo3DBXO94SeiCFSPdC8f2Kt3MfOxvVdkAtkjkMACSbkoUsgbTVqTYSEOEc2jTgR3" "iQ13JgpHaFbbsq64V0QP3TAxbLIQUjYGVgQaF1UfLOBv8hrzgj45z/ST/" "G80lOl595+0nCUbmBcgG1AEWrmdF0/" "3RmECgYAKvIzKXXB3+19vcT2ga5Qq2l3TiPtOGsppRb2XrNs9qKdxIYvHmXo/" "9QP1V3SRW0XoD7ez8FpFabp42cmPOxUNk3FK3paQZABLxH5pzCWI9PzIAVfPDrm+" "sdnbgG7vAnwfL2IMMJSA3aDYGCbF9EgefG+" "STcpfqq7fQ6f5TBgLFwKBgCd7gn1xYL696SaKVSm7VngpXlczHVEpz3kStWR5gfzriPBxXgM" "VcWmcbajRser7ARpCEfbxM1UJyv6oAYZWVSNErNzNVb4POqLYcCNySuC6xKhs9FrEQnyKjyk" "8wI4VnrEMGrQ8e+qYSwYk9Gh6dKGoRMAPYVXQAO0fIsHF/T0a"; const char *data_to_sign = "data to sign"; const char *expected_signature = "VocBRhpMmQ2XCzVehWSqheQLnU889gf3dhU4AnVnQTJjsKx/CM23qKDPkZDd2A/" "BnQsp99SN7ksIX5Raj0TPwyN5OCN/YrNFNGoOFlTsGhgP/" "hyE8X3Duiq6sNO0SMvRYNPFFGlJFsp1Fw3Z94eYMg4/Wpw5s4+Jo5Zm/" "qY7aTJIqDKDQ3CNHLeJgcMUOc9sz01/" "GzoUYKDVODHSxrYEk5ireFJFz9vP8P7Ha+" "VDUZuQIQdXer9NBbGFtYmWprY3nn4D3Dw93Sn0V0dIqYeIo91oKyslvMebmUM95S2PyIJdEp" "Pb2DJDxjvX/0LLwSWlSXRWy9gapWoBkb4ynqZBsg=="; uint8_t *private_key_raw; size_t private_key_len; unsigned char *signature_raw; bool ret; char *signature_b64; private_key_raw = kms_message_b64_to_raw (private_key_b64, &private_key_len); signature_raw = malloc (256); ret = kms_sign_rsaes_pkcs1_v1_5 (NULL /* unused ctx */, (const char *) private_key_raw, private_key_len, data_to_sign, strlen (data_to_sign), signature_raw); KMS_ASSERT (ret); signature_b64 = kms_message_raw_to_b64 (signature_raw, 256); if (0 != strcmp (signature_b64, expected_signature)) { printf ("generated signature: %s\n", signature_b64); printf ("but expected signature: %s\n", expected_signature); abort (); } /* Test with an invalid key. */ ret = kms_sign_rsaes_pkcs1_v1_5 ( NULL, "blah", 4, data_to_sign, strlen (data_to_sign), signature_raw); free (private_key_raw); free (signature_raw); free (signature_b64); KMS_ASSERT (!ret); } static void kms_request_kmip_prohibited_test (void) { kms_request_opt_t *opt; kms_request_t *req; opt = kms_request_opt_new (); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_KMIP); req = kms_request_new ("method", "path_and_query", opt); ASSERT_REQUEST_ERROR (req, "Function not applicable to KMIP"); kms_request_destroy (req); kms_request_opt_destroy (opt); } static int count_substrings (const char *big, const char *little) { char *iter; int count = 0; iter = strstr (big, little); while (iter != NULL) { count += 1; iter += strlen (little); iter = strstr (iter, little); } return count; } /* Test that outgoing HTTP requests use \r\n line delimitters, not \n. * This is a regression test for MONGOCRYPT-457. */ static void test_request_newlines (void) { bool ok; kms_request_t *req; kms_request_opt_t *opt; uint8_t example_data[] = {0x01, 0x02, 0x03, 0x04}; // Test kms_request_to_string. { opt = kms_request_opt_new (); kms_request_opt_set_connection_close (opt, true); ASSERT (kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_AZURE)); req = kms_azure_request_wrapkey_new ("example-host", "example-access-token", "example-key-name", "example-key-version", example_data, sizeof (example_data), opt); ASSERT_REQUEST_OK (req); char *req_str = kms_request_to_string (req); ASSERT_REQUEST_OK (req); ASSERT (req_str); /* Check that all \n have a \r. */ int n = count_substrings (req_str, "\n"); int rn = count_substrings (req_str, "\r\n"); ASSERT_CMPINT (n, ==, rn); ASSERT_CMPINT (rn, ==, 8); free (req_str); kms_request_opt_destroy (opt); kms_request_destroy (req); } // Test kms_request_get_signed. { opt = kms_request_opt_new (); kms_request_opt_set_connection_close (opt, true); req = kms_caller_identity_request_new (opt); ASSERT_REQUEST_OK (req); ok = kms_request_set_region (req, "example-region"); ASSERT_REQUEST_OK (req); ASSERT (ok); ok = kms_request_set_service (req, "example-service"); ASSERT_REQUEST_OK (req); ASSERT (ok); ok = kms_request_set_access_key_id (req, "example-access-key-id"); ASSERT_REQUEST_OK (req); ASSERT (ok); ok = kms_request_set_secret_key (req, "example-secret-key"); ASSERT_REQUEST_OK (req); ASSERT (ok); char *req_str = kms_request_get_signed (req); ASSERT_REQUEST_OK (req); ASSERT (req_str); /* Check that all \n have a \r. */ int n = count_substrings (req_str, "\n"); int rn = count_substrings (req_str, "\r\n"); ASSERT_CMPINT (n, ==, rn); ASSERT_CMPINT (rn, ==, 8); free (req_str); kms_request_opt_destroy (opt); kms_request_destroy (req); } } #define RUN_TEST(_func) \ do { \ if (!selector || 0 == kms_strcasecmp (#_func, selector)) { \ printf ("%s\n", #_func); \ _func (); \ ran_tests = true; \ } \ } while (0) extern void kms_kmip_writer_test (void); extern void kms_kmip_reader_test (void); extern void kms_kmip_reader_negative_int_test (void); extern void kms_kmip_reader_find_test (void); extern void kms_kmip_reader_find_and_recurse_test (void); extern void kms_kmip_reader_find_and_read_enum_test (void); extern void kms_kmip_reader_find_and_read_bytes_test (void); extern void kms_kmip_request_register_secretdata_test (void); extern void kms_kmip_request_register_secretdata_invalid_test (void); extern void kms_kmip_request_get_test (void); extern void kms_kmip_request_activate_test (void); extern void kms_kmip_response_parser_test (void); extern void kms_kmip_response_get_unique_identifier_test (void); extern void kms_kmip_response_get_secretdata_test (void); extern void kms_kmip_response_get_secretdata_notfound_test (void); extern void kms_kmip_response_parser_reuse_test (void); extern void kms_kmip_response_parser_excess_test (void); extern void kms_kmip_response_parser_notenough_test (void); int main (int argc, char *argv[]) { const char *help; char *selector = NULL; bool ran_tests = false; help = "Usage: test_kms_request [TEST_NAME]"; if (argc > 2) { fprintf (stderr, "%s\n", help); abort (); } else if (argc == 2) { selector = argv[1]; } int ret = kms_message_init (); if (ret != 0) { printf ("kms_message_init failed: 0x%x\n", ret); abort (); } RUN_TEST (example_signature_test); RUN_TEST (path_normalization_test); RUN_TEST (host_test); RUN_TEST (content_length_test); RUN_TEST (bad_query_test); RUN_TEST (append_header_field_value_test); RUN_TEST (set_date_test); RUN_TEST (multibyte_test); RUN_TEST (connection_close_test); RUN_TEST (decrypt_request_test); RUN_TEST (encrypt_request_test); RUN_TEST (kv_list_del_test); RUN_TEST (b64_test); RUN_TEST (b64_b64url_test); ran_tests |= all_aws_sig_v4_tests (aws_test_suite_dir, selector); RUN_TEST (kms_response_parser_test); RUN_TEST (kms_response_parser_files); RUN_TEST (kms_request_validate_test); RUN_TEST (kms_signature_test); RUN_TEST (kms_kmip_writer_test); RUN_TEST (kms_kmip_reader_test); RUN_TEST (kms_kmip_reader_negative_int_test); RUN_TEST (kms_kmip_reader_test); RUN_TEST (kms_kmip_reader_find_and_recurse_test); RUN_TEST (kms_kmip_reader_find_and_read_enum_test); RUN_TEST (kms_kmip_reader_find_and_read_bytes_test); RUN_TEST (kms_kmip_request_register_secretdata_test); RUN_TEST (kms_kmip_request_register_secretdata_invalid_test); RUN_TEST (kms_kmip_request_get_test); RUN_TEST (kms_kmip_request_activate_test); RUN_TEST (kms_request_kmip_prohibited_test); RUN_TEST (kms_kmip_response_parser_test); RUN_TEST (kms_kmip_response_get_unique_identifier_test); RUN_TEST (kms_kmip_response_get_secretdata_test); RUN_TEST (kms_kmip_response_get_secretdata_notfound_test); RUN_TEST (kms_kmip_response_parser_reuse_test); RUN_TEST (kms_kmip_response_parser_excess_test); RUN_TEST (kms_kmip_response_parser_notenough_test); RUN_TEST (test_request_newlines); RUN_TEST (test_kms_util); if (!ran_tests) { KMS_ASSERT (argc == 2); fprintf (stderr, "No such test: \"%s\"\n", argv[1]); abort (); } kms_message_cleanup (); return 0; } mongo-c-driver-1.26.0/src/kms-message/test/test_kms_util.c000066400000000000000000000046171456567454500235010ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_util.h" #include "test_kms_assert.h" #include "hexlify.h" #include /* tolower */ char * copy_and_filter_hex (const char *unfiltered_hex) { size_t i, j; char *filtered = malloc (strlen (unfiltered_hex) + 1); j = 0; for (i = 0; i < strlen (unfiltered_hex); i++) { if (unfiltered_hex[i] != ' ' && unfiltered_hex[i] != '|') { filtered[j] = (char) tolower (unfiltered_hex[i]); j++; } } filtered[j] = '\0'; return filtered; } uint8_t * hex_to_data (const char *unfiltered_hex, size_t *outlen) { char *filtered_hex; uint8_t *bytes; size_t i; filtered_hex = copy_and_filter_hex (unfiltered_hex); *outlen = strlen (filtered_hex) / 2; bytes = malloc (*outlen); for (i = 0; i < *outlen; i++) { bytes[i] = unhexlify (filtered_hex + (i * 2), 2); } free (filtered_hex); return bytes; } char * data_to_hex (const uint8_t *buf, size_t len) { return hexlify (buf, len); } char * replace_all (const char *input, const char *match, const char *replacement) { ASSERT (input); ASSERT (match); ASSERT (replacement); kms_request_str_t *replaced = kms_request_str_new (); const char *start = input; const char *iter = strstr (input, match); while (iter != NULL) { kms_request_str_append_chars (replaced, start, (ssize_t) (iter - start)); kms_request_str_append_chars ( replaced, replacement, (ssize_t) strlen (replacement)); iter += strlen (match); start = iter; iter = strstr (iter, match); } // Append the remainder of input. kms_request_str_append_chars (replaced, start, -1); return kms_request_str_detach (replaced); } void test_kms_util (void) { char *got = replace_all ("foo bar baz", "bar", "baz"); ASSERT_CMPSTR (got, "foo baz baz"); free (got); } mongo-c-driver-1.26.0/src/kms-message/test/test_kms_util.h000066400000000000000000000025771456567454500235110ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_KMS_UTIL_H #define TEST_KMS_UTIL_H #include #include "kms_request_str.h" /* copy_and_filter_hex returns a copy of @unfiltered_hex with the following * characters removed: ' ', '|' */ char * copy_and_filter_hex (const char *unfiltered_hex); /* hex_to_data calls copy_and_filter_hex on @unfiltered_hex, then converts it to * binary and returns a byte array. */ uint8_t * hex_to_data (const char *unfiltered_hex, size_t *outlen); char * data_to_hex (const uint8_t *data, size_t len); /* replace_all returns a copy of @input with all occurrences of @match replaced * with @replacement. */ char * replace_all (const char *input, const char *match, const char *replacement); /* test_kms_util tests utility functions. */ void test_kms_util (void); #endif /* TEST_KMS_UTIL_H */ mongo-c-driver-1.26.0/src/kms-message/test/windows/000077500000000000000000000000001456567454500221315ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/kms-message/test/windows/dirent.h000066400000000000000000000717701456567454500236030ustar00rootroot00000000000000/* * Dirent interface for Microsoft Visual Studio * * Copyright (C) 2006-2012 Toni Ronkko * This file is part of dirent. Dirent may be freely distributed * under the MIT license. For all details and documentation, see * https://github.com/tronkko/dirent */ #ifndef DIRENT_H #define DIRENT_H /* * Include windows.h without Windows Sockets 1.1 to prevent conflicts with * Windows Sockets 2.0. */ #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #include #include #include #include #include #include #include #include #include #include /* Indicates that d_type field is available in dirent structure */ #define _DIRENT_HAVE_D_TYPE /* Indicates that d_namlen field is available in dirent structure */ #define _DIRENT_HAVE_D_NAMLEN /* Entries missing from MSVC 6.0 */ #if !defined(FILE_ATTRIBUTE_DEVICE) # define FILE_ATTRIBUTE_DEVICE 0x40 #endif /* File type and permission flags for stat(), general mask */ #if !defined(S_IFMT) # define S_IFMT _S_IFMT #endif /* Directory bit */ #if !defined(S_IFDIR) # define S_IFDIR _S_IFDIR #endif /* Character device bit */ #if !defined(S_IFCHR) # define S_IFCHR _S_IFCHR #endif /* Pipe bit */ #if !defined(S_IFFIFO) # define S_IFFIFO _S_IFFIFO #endif /* Regular file bit */ #if !defined(S_IFREG) # define S_IFREG _S_IFREG #endif /* Read permission */ #if !defined(S_IREAD) # define S_IREAD _S_IREAD #endif /* Write permission */ #if !defined(S_IWRITE) # define S_IWRITE _S_IWRITE #endif /* Execute permission */ #if !defined(S_IEXEC) # define S_IEXEC _S_IEXEC #endif /* Pipe */ #if !defined(S_IFIFO) # define S_IFIFO _S_IFIFO #endif /* Block device */ #if !defined(S_IFBLK) # define S_IFBLK 0 #endif /* Link */ #if !defined(S_IFLNK) # define S_IFLNK 0 #endif /* Socket */ #if !defined(S_IFSOCK) # define S_IFSOCK 0 #endif /* Read user permission */ #if !defined(S_IRUSR) # define S_IRUSR S_IREAD #endif /* Write user permission */ #if !defined(S_IWUSR) # define S_IWUSR S_IWRITE #endif /* Execute user permission */ #if !defined(S_IXUSR) # define S_IXUSR 0 #endif /* Read group permission */ #if !defined(S_IRGRP) # define S_IRGRP 0 #endif /* Write group permission */ #if !defined(S_IWGRP) # define S_IWGRP 0 #endif /* Execute group permission */ #if !defined(S_IXGRP) # define S_IXGRP 0 #endif /* Read others permission */ #if !defined(S_IROTH) # define S_IROTH 0 #endif /* Write others permission */ #if !defined(S_IWOTH) # define S_IWOTH 0 #endif /* Execute others permission */ #if !defined(S_IXOTH) # define S_IXOTH 0 #endif /* Maximum length of file name */ #if !defined(PATH_MAX) # define PATH_MAX MAX_PATH #endif #if !defined(FILENAME_MAX) # define FILENAME_MAX MAX_PATH #endif #if !defined(NAME_MAX) # define NAME_MAX FILENAME_MAX #endif /* File type flags for d_type */ #define DT_UNKNOWN 0 #define DT_REG S_IFREG #define DT_DIR S_IFDIR #define DT_FIFO S_IFIFO #define DT_SOCK S_IFSOCK #define DT_CHR S_IFCHR #define DT_BLK S_IFBLK #define DT_LNK S_IFLNK /* Macros for converting between st_mode and d_type */ #define IFTODT(mode) ((mode) & S_IFMT) #define DTTOIF(type) (type) /* * File type macros. Note that block devices, sockets and links cannot be * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are * only defined for compatibility. These macros should always return false * on Windows. */ #if !defined(S_ISFIFO) # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) #endif #if !defined(S_ISDIR) # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif #if !defined(S_ISREG) # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #endif #if !defined(S_ISLNK) # define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) #endif #if !defined(S_ISSOCK) # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) #endif #if !defined(S_ISCHR) # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) #endif #if !defined(S_ISBLK) # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) #endif /* Return the exact length of the file name without zero terminator */ #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) /* Return the maximum size of a file name */ #define _D_ALLOC_NAMLEN(p) ((PATH_MAX)+1) #ifdef __cplusplus extern "C" { #endif /* Wide-character version */ struct _wdirent { /* Always zero */ long d_ino; /* File position within stream */ long d_off; /* Structure size */ unsigned short d_reclen; /* Length of name without \0 */ size_t d_namlen; /* File type */ int d_type; /* File name */ wchar_t d_name[PATH_MAX+1]; }; typedef struct _wdirent _wdirent; struct _WDIR { /* Current directory entry */ struct _wdirent ent; /* Private file data */ WIN32_FIND_DATAW data; /* True if data is valid */ int cached; /* Win32 search handle */ HANDLE handle; /* Initial directory name */ wchar_t *patt; }; typedef struct _WDIR _WDIR; /* Multi-byte character version */ struct dirent { /* Always zero */ long d_ino; /* File position within stream */ long d_off; /* Structure size */ unsigned short d_reclen; /* Length of name without \0 */ size_t d_namlen; /* File type */ int d_type; /* File name */ char d_name[PATH_MAX+1]; }; typedef struct dirent dirent; struct DIR { struct dirent ent; struct _WDIR *wdirp; }; typedef struct DIR DIR; /* Dirent functions */ static DIR *opendir (const char *dirname); static _WDIR *_wopendir (const wchar_t *dirname); static struct dirent *readdir (DIR *dirp); static struct _wdirent *_wreaddir (_WDIR *dirp); static int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result); static int _wreaddir_r( _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result); static int closedir (DIR *dirp); static int _wclosedir (_WDIR *dirp); static void rewinddir (DIR* dirp); static void _wrewinddir (_WDIR* dirp); static int scandir (const char *dirname, struct dirent ***namelist, int (*filter)(const struct dirent*), int (*compare)(const struct dirent**, const struct dirent**)); static int alphasort (const struct dirent **a, const struct dirent **b); static int versionsort (const struct dirent **a, const struct dirent **b); /* For compatibility with Symbian */ #define wdirent _wdirent #define WDIR _WDIR #define wopendir _wopendir #define wreaddir _wreaddir #define wclosedir _wclosedir #define wrewinddir _wrewinddir /* Internal utility functions */ static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp); static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp); static int dirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count); static int dirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, const wchar_t *wcstr, size_t count); static void dirent_set_errno (int error); /* * Open directory stream DIRNAME for read and return a pointer to the * internal working area that is used to retrieve individual directory * entries. */ static _WDIR* _wopendir( const wchar_t *dirname) { _WDIR *dirp = NULL; int error; /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno (ENOENT); return NULL; } /* Allocate new _WDIR structure */ dirp = (_WDIR*) malloc (sizeof (struct _WDIR)); if (dirp != NULL) { DWORD n; /* Reset _WDIR structure */ dirp->handle = INVALID_HANDLE_VALUE; dirp->patt = NULL; dirp->cached = 0; /* Compute the length of full path plus zero terminator * * Note that on WinRT there's no way to convert relative paths * into absolute paths, so just assume it is an absolute path. */ # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) n = wcslen(dirname); # else n = GetFullPathNameW (dirname, 0, NULL, NULL); # endif /* Allocate room for absolute directory name and search pattern */ dirp->patt = (wchar_t*) malloc (sizeof (wchar_t) * n + 16); if (dirp->patt) { /* * Convert relative directory name to an absolute one. This * allows rewinddir() to function correctly even when current * working directory is changed between opendir() and rewinddir(). * * Note that on WinRT there's no way to convert relative paths * into absolute paths, so just assume it is an absolute path. */ # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) wcsncpy_s(dirp->patt, n+1, dirname, n); # else n = GetFullPathNameW (dirname, n, dirp->patt, NULL); # endif if (n > 0) { wchar_t *p; /* Append search pattern \* to the directory name */ p = dirp->patt + n; if (dirp->patt < p) { switch (p[-1]) { case '\\': case '/': case ':': /* Directory ends in path separator, e.g. c:\temp\ */ /*NOP*/; break; default: /* Directory name doesn't end in path separator */ *p++ = '\\'; } } *p++ = '*'; *p = '\0'; /* Open directory stream and retrieve the first entry */ if (dirent_first (dirp)) { /* Directory stream opened successfully */ error = 0; } else { /* Cannot retrieve first entry */ error = 1; dirent_set_errno (ENOENT); } } else { /* Cannot retrieve full path name */ dirent_set_errno (ENOENT); error = 1; } } else { /* Cannot allocate memory for search pattern */ error = 1; } } else { /* Cannot allocate _WDIR structure */ error = 1; } /* Clean up in case of error */ if (error && dirp) { _wclosedir (dirp); dirp = NULL; } return dirp; } /* * Read next directory entry. * * Returns pointer to static directory entry which may be overwritten by * subsequent calls to _wreaddir(). */ static struct _wdirent* _wreaddir( _WDIR *dirp) { struct _wdirent *entry; /* * Read directory entry to buffer. We can safely ignore the return value * as entry will be set to NULL in case of error. */ (void) _wreaddir_r (dirp, &dirp->ent, &entry); /* Return pointer to statically allocated directory entry */ return entry; } /* * Read next directory entry. * * Returns zero on success. If end of directory stream is reached, then sets * result to NULL and returns zero. */ static int _wreaddir_r( _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result) { WIN32_FIND_DATAW *datap; /* Read next directory entry */ datap = dirent_next (dirp); if (datap) { size_t n; DWORD attr; /* * Copy file name as wide-character string. If the file name is too * long to fit in to the destination buffer, then truncate file name * to PATH_MAX characters and zero-terminate the buffer. */ n = 0; while (n < PATH_MAX && datap->cFileName[n] != 0) { entry->d_name[n] = datap->cFileName[n]; n++; } entry->d_name[n] = 0; /* Length of file name excluding zero terminator */ entry->d_namlen = n; /* File type */ attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { entry->d_type = DT_CHR; } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { entry->d_type = DT_DIR; } else { entry->d_type = DT_REG; } /* Reset dummy fields */ entry->d_ino = 0; entry->d_off = 0; entry->d_reclen = sizeof (struct _wdirent); /* Set result address */ *result = entry; } else { /* Return NULL to indicate end of directory */ *result = NULL; } return /*OK*/0; } /* * Close directory stream opened by opendir() function. This invalidates the * DIR structure as well as any directory entry read previously by * _wreaddir(). */ static int _wclosedir( _WDIR *dirp) { int ok; if (dirp) { /* Release search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) { FindClose (dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; } /* Release search pattern */ if (dirp->patt) { free (dirp->patt); dirp->patt = NULL; } /* Release directory structure */ free (dirp); ok = /*success*/0; } else { /* Invalid directory stream */ dirent_set_errno (EBADF); ok = /*failure*/-1; } return ok; } /* * Rewind directory stream such that _wreaddir() returns the very first * file name again. */ static void _wrewinddir( _WDIR* dirp) { if (dirp) { /* Release existing search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) { FindClose (dirp->handle); } /* Open new search handle */ dirent_first (dirp); } } /* Get first directory entry (internal) */ static WIN32_FIND_DATAW* dirent_first( _WDIR *dirp) { WIN32_FIND_DATAW *datap; /* Open directory and retrieve the first entry */ dirp->handle = FindFirstFileExW( dirp->patt, FindExInfoStandard, &dirp->data, FindExSearchNameMatch, NULL, 0); if (dirp->handle != INVALID_HANDLE_VALUE) { /* a directory entry is now waiting in memory */ datap = &dirp->data; dirp->cached = 1; } else { /* Failed to re-open directory: no directory entry in memory */ dirp->cached = 0; datap = NULL; } return datap; } /* * Get next directory entry (internal). * * Returns */ static WIN32_FIND_DATAW* dirent_next( _WDIR *dirp) { WIN32_FIND_DATAW *p; /* Get next directory entry */ if (dirp->cached != 0) { /* A valid directory entry already in memory */ p = &dirp->data; dirp->cached = 0; } else if (dirp->handle != INVALID_HANDLE_VALUE) { /* Get the next directory entry from stream */ if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) { /* Got a file */ p = &dirp->data; } else { /* The very last entry has been processed or an error occurred */ FindClose (dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; p = NULL; } } else { /* End of directory stream reached */ p = NULL; } return p; } /* * Open directory stream using plain old C-string. */ static DIR* opendir( const char *dirname) { struct DIR *dirp; int error; /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno (ENOENT); return NULL; } /* Allocate memory for DIR structure */ dirp = (DIR*) malloc (sizeof (struct DIR)); if (dirp) { wchar_t wname[PATH_MAX + 1]; size_t n; /* Convert directory name to wide-character string */ error = dirent_mbstowcs_s( &n, wname, PATH_MAX + 1, dirname, PATH_MAX + 1); if (!error) { /* Open directory stream using wide-character name */ dirp->wdirp = _wopendir (wname); if (dirp->wdirp) { /* Directory stream opened */ error = 0; } else { /* Failed to open directory stream */ error = 1; } } else { /* * Cannot convert file name to wide-character string. This * occurs if the string contains invalid multi-byte sequences or * the output buffer is too small to contain the resulting * string. */ error = 1; } } else { /* Cannot allocate DIR structure */ error = 1; } /* Clean up in case of error */ if (error && dirp) { free (dirp); dirp = NULL; } return dirp; } /* * Read next directory entry. */ static struct dirent* readdir( DIR *dirp) { struct dirent *entry; /* * Read directory entry to buffer. We can safely ignore the return value * as entry will be set to NULL in case of error. */ (void) readdir_r (dirp, &dirp->ent, &entry); /* Return pointer to statically allocated directory entry */ return entry; } /* * Read next directory entry into called-allocated buffer. * * Returns zero on success. If the end of directory stream is reached, then * sets result to NULL and returns zero. */ static int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result) { WIN32_FIND_DATAW *datap; /* Read next directory entry */ datap = dirent_next (dirp->wdirp); if (datap) { size_t n; int error; /* Attempt to convert file name to multi-byte string */ error = dirent_wcstombs_s( &n, entry->d_name, PATH_MAX + 1, datap->cFileName, PATH_MAX + 1); /* * If the file name cannot be represented by a multi-byte string, * then attempt to use old 8+3 file name. This allows traditional * Unix-code to access some file names despite of unicode * characters, although file names may seem unfamiliar to the user. * * Be ware that the code below cannot come up with a short file * name unless the file system provides one. At least * VirtualBox shared folders fail to do this. */ if (error && datap->cAlternateFileName[0] != '\0') { error = dirent_wcstombs_s( &n, entry->d_name, PATH_MAX + 1, datap->cAlternateFileName, PATH_MAX + 1); } if (!error) { DWORD attr; /* Length of file name excluding zero terminator */ entry->d_namlen = n - 1; /* File attributes */ attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { entry->d_type = DT_CHR; } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { entry->d_type = DT_DIR; } else { entry->d_type = DT_REG; } /* Reset dummy fields */ entry->d_ino = 0; entry->d_off = 0; entry->d_reclen = sizeof (struct dirent); } else { /* * Cannot convert file name to multi-byte string so construct * an erroneous directory entry and return that. Note that * we cannot return NULL as that would stop the processing * of directory entries completely. */ entry->d_name[0] = '?'; entry->d_name[1] = '\0'; entry->d_namlen = 1; entry->d_type = DT_UNKNOWN; entry->d_ino = 0; entry->d_off = -1; entry->d_reclen = 0; } /* Return pointer to directory entry */ *result = entry; } else { /* No more directory entries */ *result = NULL; } return /*OK*/0; } /* * Close directory stream. */ static int closedir( DIR *dirp) { int ok; if (dirp) { /* Close wide-character directory stream */ ok = _wclosedir (dirp->wdirp); dirp->wdirp = NULL; /* Release multi-byte character version */ free (dirp); } else { /* Invalid directory stream */ dirent_set_errno (EBADF); ok = /*failure*/-1; } return ok; } /* * Rewind directory stream to beginning. */ static void rewinddir( DIR* dirp) { /* Rewind wide-character string directory stream */ _wrewinddir (dirp->wdirp); } /* * Scan directory for entries. */ static int scandir( const char *dirname, struct dirent ***namelist, int (*filter)(const struct dirent*), int (*compare)(const struct dirent**, const struct dirent**)) { struct dirent **files = NULL; size_t size = 0; size_t allocated = 0; const size_t init_size = 1; DIR *dir = NULL; struct dirent *entry; struct dirent *tmp = NULL; size_t i; int result = 0; /* Open directory stream */ dir = opendir (dirname); if (dir) { /* Read directory entries to memory */ while (1) { /* Enlarge pointer table to make room for another pointer */ if (size >= allocated) { void *p; size_t num_entries; /* Compute number of entries in the enlarged pointer table */ if (size < init_size) { /* Allocate initial pointer table */ num_entries = init_size; } else { /* Double the size */ num_entries = size * 2; } /* Allocate first pointer table or enlarge existing table */ p = realloc (files, sizeof (void*) * num_entries); if (p != NULL) { /* Got the memory */ files = (dirent**) p; allocated = num_entries; } else { /* Out of memory */ result = -1; break; } } /* Allocate room for temporary directory entry */ if (tmp == NULL) { tmp = (struct dirent*) malloc (sizeof (struct dirent)); if (tmp == NULL) { /* Cannot allocate temporary directory entry */ result = -1; break; } } /* Read directory entry to temporary area */ if (readdir_r (dir, tmp, &entry) == /*OK*/0) { /* Did we get an entry? */ if (entry != NULL) { int pass; /* Determine whether to include the entry in result */ if (filter) { /* Let the filter function decide */ pass = filter (tmp); } else { /* No filter function, include everything */ pass = 1; } if (pass) { /* Store the temporary entry to pointer table */ files[size++] = tmp; tmp = NULL; /* Keep up with the number of files */ result++; } } else { /* * End of directory stream reached => sort entries and * exit. */ qsort (files, size, sizeof (void*), (int (*) (const void*, const void*)) compare); break; } } else { /* Error reading directory entry */ result = /*Error*/ -1; break; } } } else { /* Cannot open directory */ result = /*Error*/ -1; } /* Release temporary directory entry */ if (tmp) { free (tmp); } /* Release allocated memory on error */ if (result < 0) { for (i = 0; i < size; i++) { free (files[i]); } free (files); files = NULL; } /* Close directory stream */ if (dir) { closedir (dir); } /* Pass pointer table to caller */ if (namelist) { *namelist = files; } return result; } /* Alphabetical sorting */ static int alphasort( const struct dirent **a, const struct dirent **b) { return strcoll ((*a)->d_name, (*b)->d_name); } /* Sort versions */ static int versionsort( const struct dirent **a, const struct dirent **b) { /* FIXME: implement strverscmp and use that */ return alphasort (a, b); } /* Convert multi-byte string to wide character string */ static int dirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count) { int error; int n; size_t len; UINT cp; DWORD flags; /* Determine code page for multi-byte string */ if (AreFileApisANSI ()) { /* Default ANSI code page */ cp = GetACP (); } else { /* Default OEM code page */ cp = GetOEMCP (); } /* * Determine flags based on the character set. For more information, * please see https://docs.microsoft.com/fi-fi/windows/desktop/api/stringapiset/nf-stringapiset-multibytetowidechar */ switch (cp) { case 42: case 50220: case 50221: case 50222: case 50225: case 50227: case 50229: case 57002: case 57003: case 57004: case 57005: case 57006: case 57007: case 57008: case 57009: case 57010: case 57011: case 65000: /* MultiByteToWideChar does not support MB_ERR_INVALID_CHARS */ flags = 0; break; default: /* * Ask MultiByteToWideChar to return an error if a multi-byte * character cannot be converted to a wide-character. */ flags = MB_ERR_INVALID_CHARS; } /* Compute the length of input string without zero-terminator */ len = 0; while (mbstr[len] != '\0' && len < count) { len++; } /* Convert to wide-character string */ n = MultiByteToWideChar( /* Source code page */ cp, /* Flags */ flags, /* Pointer to string to convert */ mbstr, /* Size of multi-byte string */ (int) len, /* Pointer to output buffer */ wcstr, /* Size of output buffer */ (int)sizeInWords - 1 ); /* Ensure that output buffer is zero-terminated */ wcstr[n] = '\0'; /* Return length of wide-character string with zero-terminator */ *pReturnValue = (size_t) (n + 1); /* Return zero if conversion succeeded */ if (n > 0) { error = 0; } else { error = 1; } return error; } /* Convert wide-character string to multi-byte string */ static int dirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, /* max size of mbstr */ const wchar_t *wcstr, size_t count) { int n; int error; UINT cp; size_t len; BOOL flag = 0; LPBOOL pflag; /* Determine code page for multi-byte string */ if (AreFileApisANSI ()) { /* Default ANSI code page */ cp = GetACP (); } else { /* Default OEM code page */ cp = GetOEMCP (); } /* Compute the length of input string without zero-terminator */ len = 0; while (wcstr[len] != '\0' && len < count) { len++; } /* * Determine if we can ask WideCharToMultiByte to return information on * broken characters. For more information, please see * https://docs.microsoft.com/en-us/windows/desktop/api/stringapiset/nf-stringapiset-widechartomultibyte */ switch (cp) { case CP_UTF7: case CP_UTF8: /* * WideCharToMultiByte fails if we request information on default * characters. This is just a nuisance but doesn't affect the * conversion: if Windows is configured to use UTF-8, then the default * character should not be needed anyway. */ pflag = NULL; break; default: /* * Request that WideCharToMultiByte sets the flag if it uses the * default character. */ pflag = &flag; } /* Convert wide-character string to multi-byte character string */ n = WideCharToMultiByte( /* Target code page */ cp, /* Flags */ 0, /* Pointer to unicode string */ wcstr, /* Length of unicode string */ (int) len, /* Pointer to output buffer */ mbstr, /* Size of output buffer */ (int)sizeInBytes - 1, /* Default character */ NULL, /* Whether default character was used or not */ pflag ); /* Ensure that output buffer is zero-terminated */ mbstr[n] = '\0'; /* Return length of multi-byte string with zero-terminator */ *pReturnValue = (size_t) (n + 1); /* Return zero if conversion succeeded without using default characters */ if (n > 0 && flag == 0) { error = 0; } else { error = 1; } return error; } /* Set errno variable */ static void dirent_set_errno( int error) { #if defined(_MSC_VER) && _MSC_VER >= 1400 /* Microsoft Visual Studio 2005 and later */ _set_errno (error); #else /* Non-Microsoft compiler or older Microsoft compiler */ errno = error; #endif } #ifdef __cplusplus } #endif #endif /*DIRENT_H*/ mongo-c-driver-1.26.0/src/libbson/000077500000000000000000000000001456567454500166745ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/.gitattributes000066400000000000000000000001051456567454500215630ustar00rootroot00000000000000*.txt text *.vcproj eol=crlf *.sh eol=lf mongo-c-driver-1.26.0/src/libbson/.gitignore000066400000000000000000000015711456567454500206700ustar00rootroot00000000000000*~ *.a aclocal.m4 AUTHORS autom4te.cache ChangeLog CMakeFiles CMakeCache.txt compile config.* !config.yml configure depcomp .deps .dirstamp *.exe INSTALL install-sh *.la .libs libtool libbson-1.0.so* *.lo ltmain.sh Makefile Makefile.in missing *.o *.pc README stamp-h1 *.swp test-libbson test.log test-results.json .DS_Store xcuserdata tags .lvimrc doc/installing.page doc/version.page .coverage.lcov coverage *.gcda *.gcno CPackConfig.cmake CPackSourceConfig.cmake CTestTestfile.cmake cmake_install.cmake # CMake artifacts libbson-1.0-config-version.cmake libbson-1.0-config.cmake libbson-static-1.0-config-version.cmake libbson-static-1.0-config.cmake bson/bson-1.0-config-version.cmake bson/bson-1.0-config.cmake bson/bson-targets.cmake # Example binaries bcon-col-view bcon-speed bson-check-depth bson-depth bson-metrics bson-streaming-reader bson-to-json bson-validate json-to-bson mongo-c-driver-1.26.0/src/libbson/CMakeLists.txt000066400000000000000000000357641456567454500214530ustar00rootroot00000000000000 # .d8888b. 888 # d88P Y88b 888 # Y88b. 888 # "Y888b. .d88b. 888888 888 888 88888b. # "Y88b. d8P Y8b 888 888 888 888 "88b # "888 88888888 888 888 888 888 888 # Y88b d88P Y8b. Y88b. Y88b 888 888 d88P # "Y8888P" "Y8888 "Y888 "Y88888 88888P" # 888 # 888 # 888 cmake_minimum_required (VERSION 3.15) project (libbson LANGUAGES C # Inherit the version from mongo-c-driver VERSION "${PROJECT_VERSION}" DESCRIPTION "The libbson BSON serialization library" ) # These values are inherited from the mongo-c-driver parent. These are named as to # match the CMake variables generated by project(). set(libbson_VERSION_PRERELEASE ${mongo-c-driver_VERSION_PRERELEASE}) set(libbson_VERSION_FULL ${mongo-c-driver_VERSION_FULL}) # Don't export symbols implicitly set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden) # A tag attached to libbson artifacts, denoting the *major* API version, used to # potentially co-locate additional future major versions. set (BSON_API_VERSION 1.0) if (APPLE) cmake_policy (SET CMP0042 OLD) endif () # .d8888b. 888 888 d8b # d88P Y88b 888 888 Y8P # Y88b. 888 888 # "Y888b. .d88b. 888888 888888 888 88888b. .d88b. .d8888b # "Y88b. d8P Y8b 888 888 888 888 "88b d88P"88b 88K # "888 88888888 888 888 888 888 888 888 888 "Y8888b. # Y88b d88P Y8b. Y88b. Y88b. 888 888 888 Y88b 888 X88 # "Y8888P" "Y8888 "Y888 "Y888 888 888 888 "Y88888 88888P' # 888 # Y8b d88P # "Y88P" # libbson-specific configuration settings. Note that we inherit all settings # from the parent! mongo_setting( BSON_OUTPUT_BASENAME "Set the output basename for the libbson library" TYPE STRING DEFAULT VALUE "bson" ) # Control over what components are installed: mongo_bool_setting( ENABLE_STATIC_LIBBSON_INSTALL "Install static libbson" VISIBLE_IF ENABLE_STATIC) mongo_bool_setting( ENABLE_SHARED_LIBBSON_INSTALL "Install shared libbson" VISIBLE_IF ENABLE_SHARED) # .d8888b. 888 888 # d88P Y88b 888 888 # 888 888 888 888 # 888 88888b. .d88b. .d8888b 888 888 .d8888b # 888 888 "88b d8P Y8b d88P" 888 .88P 88K # 888 888 888 888 88888888 888 888888K "Y8888b. # Y88b d88P 888 888 Y8b. Y88b. 888 "88b X88 # "Y8888P" 888 888 "Y8888 "Y8888P 888 888 88888P' # Configure-time platform checks. These start as regular CMake booleans, but are # converted to 0/1 values (with mongo_bool01) so that they can be inserted into # bson-config.h as preprocessor values. We cannot use #cmakedefine01, as we need # to keep compatibility with an external Autotools-generated library configuration include (CheckFunctionExists) include (CheckIncludeFile) include (CheckStructHasMember) include (CheckSymbolExists) include (TestBigEndian) include (InstallRequiredSystemLibraries) include (CheckIncludeFiles) # See https://public.kitware.com/Bug/view.php?id=15659 check_symbol_exists (snprintf stdio.h BSON_HAVE_SNPRINTF) mongo_bool01 (BSON_HAVE_SNPRINTF BSON_HAVE_SNPRINTF) check_struct_has_member ("struct timespec" tv_sec time.h BSON_HAVE_TIMESPEC) mongo_bool01 (BSON_HAVE_TIMESPEC BSON_HAVE_TIMESPEC) check_symbol_exists (gmtime_r time.h BSON_HAVE_GMTIME_R) mongo_bool01 (BSON_HAVE_GMTIME_R BSON_HAVE_GMTIME_R) check_function_exists (rand_r BSON_HAVE_RAND_R) mongo_bool01 (BSON_HAVE_RAND_R BSON_HAVE_RAND_R) check_include_file (strings.h BSON_HAVE_STRINGS_H) mongo_bool01 (BSON_HAVE_STRINGS_H BSON_HAVE_STRINGS_H) check_symbol_exists (strlcpy string.h BSON_HAVE_STRLCPY) mongo_bool01 (BSON_HAVE_STRLCPY BSON_HAVE_STRLCPY) check_include_file (stdbool.h BSON_HAVE_STDBOOL_H) mongo_bool01 (BSON_HAVE_STDBOOL_H BSON_HAVE_STDBOOL_H) check_symbol_exists (clock_gettime time.h BSON_HAVE_CLOCK_GETTIME) mongo_bool01 (BSON_HAVE_CLOCK_GETTIME BSON_HAVE_CLOCK_GETTIME) check_symbol_exists (strnlen string.h BSON_HAVE_STRNLEN) mongo_bool01 (BSON_HAVE_STRNLEN BSON_HAVE_STRNLEN) test_big_endian (BSON_BIG_ENDIAN) if (WIN32) set (BSON_OS 2) else () set (BSON_OS 1) endif () if (BSON_BIG_ENDIAN) set (BSON_BYTE_ORDER 4321) else () set (BSON_BYTE_ORDER 1234) endif () configure_file ( "${PROJECT_SOURCE_DIR}/src/bson/bson-config.h.in" "${PROJECT_BINARY_DIR}/src/bson/bson-config.h" ) configure_file ( "${PROJECT_SOURCE_DIR}/src/bson/bson-version.h.in" "${PROJECT_BINARY_DIR}/src/bson/bson-version.h" ) if (ENABLE_APPLE_FRAMEWORK) configure_file ( "${PROJECT_SOURCE_DIR}/src/bson/modules/module.modulemap.in" "${PROJECT_BINARY_DIR}/src/bson/modules/module.modulemap" ) endif () # 8888888b. .d888 d8b d8b 888 d8b # 888 "Y88b d88P" Y8P Y8P 888 Y8P # 888 888 888 888 # 888 888 .d88b. 888888 888 88888b. 888 888888 888 .d88b. 88888b. .d8888b # 888 888 d8P Y8b 888 888 888 "88b 888 888 888 d88""88b 888 "88b 88K # 888 888 88888888 888 888 888 888 888 888 888 888 888 888 888 "Y8888b. # 888 .d88P Y8b. 888 888 888 888 888 Y88b. 888 Y88..88P 888 888 X88 # 8888888P" "Y8888 888 888 888 888 888 "Y888 888 "Y88P" 888 888 88888P' # Base INTERFACE library propagates in-build-tree requirements for using libbson add_library(_libbson_build_interface INTERFACE) # Header directories required for libbson in-source target_include_directories(_libbson_build_interface INTERFACE # The default src/ src/ # The generated src/ ${PROJECT_BINARY_DIR}/src/ # The source directories of the common lib: ${mongo-c-driver_SOURCE_DIR}/src/common/ # Generated: ${mongo-c-driver_BINARY_DIR}/src/common/ ) target_link_libraries(_libbson_build_interface INTERFACE mongo::detail::c_platform) # Collect all source files file(GLOB_RECURSE all_sources CONFIGURE_DEPENDS src/*.c src/*.h # Include common library source files within libbson itself (names # will be mangled with MCOMMON_NAME_PREFIX) "${mongo-c-driver_SOURCE_DIR}/src/common/*.c" ) # List of the primary BSON library targets that we are building set(bson_libs) if(ENABLE_STATIC) add_library(bson_static STATIC ${all_sources}) list(APPEND bson_libs bson_static) # Define `BSON_STATIC` when building to suppress the annotation __declspec(dllexport). # This prevents consumers of bson_static from exporting the symbols. target_compile_definitions(bson_static PRIVATE BSON_STATIC) # When consumers link against bson_static, suppress the annotation __declspec(dllimport), # since those symbols will be available immediately at the link step: target_compile_definitions(bson_static INTERFACE BSON_STATIC) if(ENABLE_PIC) # User wants static libs to use PIC code. set_property(TARGET bson_static PROPERTY POSITION_INDEPENDENT_CODE TRUE) endif() endif() if(ENABLE_SHARED) add_library(bson_shared SHARED ${all_sources}) if(WIN32) # Add resource-definition script for Windows shared library (.dll). configure_file(libbson.rc.in libbson.rc) target_sources(bson_shared PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/libbson.rc) endif() list(APPEND bson_libs bson_shared) endif() if(NOT bson_libs) message(FATAL_ERROR "Neither bson_shared nor bson_static is going to be built. Did you mean to enable at least one of them?") endif() # Set target properties for the libraries. mongo_target_requirements( ${bson_libs} LINK_LIBRARIES PUBLIC # Build-local requirements: $ # Include in the install interface explicitly: mongo::detail::c_platform COMPILE_DEFINITIONS PRIVATE # Tell headers that they are part of compilation: BSON_COMPILATION # Enable NaN parsing in jsonsl JSONSL_PARSE_NAN # Set the name mangling scheme for the common libraries MCOMMON_NAME_PREFIX=_bson_mcommon COMPILE_OPTIONS PRIVATE # Macro constant INFINITY triggers constant arithmetic overflow warnings in # VS 2013, but VS 2013 doesn't support inline warning suppression. # Remove once support for VS 2013 is dropped. $<$,$>:/wd4756> ) set_target_properties(${bson_libs} PROPERTIES VERSION "0.0.0" SOVERSION "0" OUTPUT_NAME "${BSON_OUTPUT_BASENAME}-${BSON_API_VERSION}" ) if(TARGET bson_static) set_property(TARGET bson_static PROPERTY OUTPUT_NAME "${BSON_OUTPUT_BASENAME}-static-${BSON_API_VERSION}") endif() if (ENABLE_APPLE_FRAMEWORK) set_target_properties(bson_shared PROPERTIES FRAMEWORK TRUE MACOSX_FRAMEWORK_BUNDLE_VERSION ${MONGOC_VERSION} MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${MONGOC_VERSION} MACOSX_FRAMEWORK_IDENTIFIER org.mongodb.bson OUTPUT_NAME "${BSON_OUTPUT_BASENAME}" PUBLIC_HEADER "${HEADERS}" ) endif () # 8888888888 888 # 888 888 # 888 888 # 8888888 888 888 8888b. 88888b.d88b. 88888b. 888 .d88b. .d8888b # 888 `Y8bd8P' "88b 888 "888 "88b 888 "88b 888 d8P Y8b 88K # 888 X88K .d888888 888 888 888 888 888 888 88888888 "Y8888b. # 888 .d8""8b. 888 888 888 888 888 888 d88P 888 Y8b. X88 # 8888888888 888 888 "Y888888 888 888 888 88888P" 888 "Y8888 88888P' # 888 # 888 # 888 function (add_example bin src) set (BSON_EXAMPLE_SOURCES ${PROJECT_SOURCE_DIR}/${src}) add_executable (${bin} ${BSON_EXAMPLE_SOURCES}) # Link against the shared lib like normal apps if(TARGET bson_shared) target_link_libraries (${bin} bson_shared) elseif(TARGET bson_static) target_link_libraries (${bin} bson_static) else() return() endif() endfunction () if (ENABLE_EXAMPLES) add_example (bcon-col-view examples/bcon-col-view.c) add_example (bcon-speed examples/bcon-speed.c) add_example (bson-metrics examples/bson-metrics.c) if (NOT WIN32) target_link_libraries (bson-metrics m) add_example (bson-streaming-reader examples/bson-streaming-reader.c) endif () add_example (bson-to-json examples/bson-to-json.c) add_example (bson-validate examples/bson-validate.c) add_example (json-to-bson examples/json-to-bson.c) add_example (bson-check-depth examples/bson-check-depth.c) add_example (creating examples/creating.c) endif () # ENABLE_EXAMPLES # 8888888 888 888 888 # 888 888 888 888 # 888 888 888 888 # 888 88888b. .d8888b 888888 8888b. 888 888 # 888 888 "88b 88K 888 "88b 888 888 # 888 888 888 "Y8888b. 888 .d888888 888 888 # 888 888 888 X88 Y88b. 888 888 888 888 # 8888888 888 888 88888P' "Y888 "Y888888 888 888 set (BSON_HEADER_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}/libbson-${BSON_API_VERSION}" ) function(install_export_target target) # Tell pkg-config where the headers are going: set_property(TARGET ${target} APPEND PROPERTY pkg_config_INCLUDE_DIRECTORIES "${BSON_HEADER_INSTALL_DIR}") # Install the target: install( TARGETS "${target}" # Important: We generate a unique export set for this target alone. EXPORT "${target}-targets" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" INCLUDES DESTINATION "${BSON_HEADER_INSTALL_DIR}" FRAMEWORK DESTINATION "${CMAKE_INSTALL_BINDIR}" ) # Install the unique export set into a file that is qualified by the name of # the target itself. The main config-file package will search for the # possibly-installed exported targets for the known targets. See: bson-config.cmake install( EXPORT "${target}-targets" NAMESPACE mongo:: FILE "${target}-targets.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/bson-${BSON_API_VERSION}" ) endfunction() if(ENABLE_STATIC_LIBBSON_INSTALL AND TARGET bson_static) install_export_target(bson_static) mongo_generate_pkg_config(bson_static FILENAME libbson-static-1.0.pc INSTALL) endif() if(ENABLE_SHARED_LIBBSON_INSTALL AND TARGET bson_shared) install_export_target(bson_shared) mongo_generate_pkg_config(bson_shared FILENAME libbson-1.0.pc INSTALL) endif() # Install all headers by doing a recursive directory-install. install( DIRECTORY # Trailing "/" requests directory contents, not the dir itself: src/bson/ # Also get the generated dir: ${PROJECT_BINARY_DIR}/src/bson/ DESTINATION "${BSON_HEADER_INSTALL_DIR}/bson" # Only grab the *public* headers. FILES_MATCHING PATTERN "*.h" PATTERN "*-private.h" EXCLUDE # Installed separately below: PATTERN "forwarding" EXCLUDE # Don't generate an empty "modules" directory PATTERN "modules" EXCLUDE ) # The forwarding header is for compatibility with `#include `, so it goes at the top-level: install(FILES src/bson/forwarding/bson.h DESTINATION "${BSON_HEADER_INSTALL_DIR}") if (ENABLE_APPLE_FRAMEWORK) install ( FILES "${PROJECT_BINARY_DIR}/src/bson/modules/module.modulemap" DESTINATION "${CMAKE_INSTALL_BINDIR}/bson.framework/Modules/" ) endif () # Generate the config-file package include (CMakePackageConfigHelpers) write_basic_package_version_file ( "${CMAKE_CURRENT_BINARY_DIR}/bson/bson-${BSON_API_VERSION}-config-version.cmake" VERSION ${BSON_VERSION} COMPATIBILITY AnyNewerVersion ) configure_file (src/bson-config.cmake "${CMAKE_CURRENT_BINARY_DIR}/bson/bson-${BSON_API_VERSION}-config.cmake" COPYONLY ) install ( FILES "${CMAKE_CURRENT_BINARY_DIR}/bson/bson-${BSON_API_VERSION}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/bson/bson-${BSON_API_VERSION}-config-version.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bson-${BSON_API_VERSION} COMPONENT Devel ) # Install the base targets. (Prior targets were installed above) install (EXPORT bson-targets NAMESPACE mongo:: FILE bson-targets.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bson-${BSON_API_VERSION} ) include (LegacyPackage) include (CPack) # 8888888b. # 888 "Y88b # 888 888 # 888 888 .d88b. .d8888b .d8888b # 888 888 d88""88b d88P" 88K # 888 888 888 888 888 "Y8888b. # 888 .d88P Y88..88P Y88b. X88 # 8888888P" "Y88P" "Y8888P 88888P' if (ENABLE_MAN_PAGES OR ENABLE_HTML_DOCS) find_package (Sphinx REQUIRED) add_subdirectory (doc) add_custom_target (bson-doc ALL DEPENDS $<$:bson-man> $<$:bson-html> ) endif () mongo-c-driver-1.26.0/src/libbson/NEWS000066400000000000000000001352121456567454500173770ustar00rootroot00000000000000libbson 1.26.0 ============== No changes since 1.25.4. Version incremented to match the libmongoc version. libbson 1.25.4 ============== Fixes: * Restore support for Sphinx 1.7.6 for man page build. libbson 1.25.3 ============== No changes since 1.25.2. Version incremented to match the libmongoc version. libbson 1.25.2 ============== Fixes: * Fix conversion warning with GCC 12. * Include -pthread in pkg-config Libs. Thanks to everyone who contributed to the development of this release. * Calvin Buckley * Kevin Albertson * Roland Hieber libbson 1.25.1 ============== Fixes: * The `BUILD_VERSION` CMake option was restored. * Fixes to some format strings in trace logs. * Allow mongoc_buffer_t to be larger than INT_MAX. Thanks to everyone who contributed to the development of this release: * Adrian Dole * Kevin Albertson * Roberto C. Sánchez libbson 1.25.0 ============== New Features: * Add `bson_array_builder_t`. Platform Support: * Support for macOS 10.14 is dropped. * Support for Ubuntu 14.04 is dropped. * Support for Debian 8.1 is dropped. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike * Adrian Dole * Roberto C. Sánchez * Ezra Chung * Joshua Siegel libbson 1.24.4 ============== Fixes: * Fix libmongoc build failure caused by missing install of `bson-dsl.h`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libbson 1.24.3 ============== Fixes: * Fix parsing of `[ { $code: ... } ]` or `[{$dbPointer: ...}]`. * Improve detection Fix use of `strerror_l`. * Fix possible overflow parsing Decimal128 in extJSON with very large exponents. Thanks to everyone who contributed to the development of this release. * Joshua Siegel * Ezra Chung libbson 1.24.2 ============== No changes since 1.24.1. Version incremented to match the libmongoc version. libbson 1.24.1 ============== No changes since 1.24.0. Version incremented to match the libmongoc version. libbson 1.24.0 ============== New Features: * Add extended JSON helpers for top-level BSON arrays `bson_array_as_canonical_extended_json` and `bson_array_as_relaxed_extended_json`. Language Standard Support: * C89 support has been dropped. C99 is the default tested C standard. Platform Support: * Support for macOS 10.14 will be dropped in an upcoming release. * Support for Ubuntu 14.04 will be dropped in an upcoming release. * Support for Debian 8.1 will be dropped in an upcoming release. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson * Colby Pike * Joshua Siegel * Jeroen Ooms * Jean-Marc Le Roux * Kyle Kloberdanz * bisht2050 * gopukrishnasIBM * Charles Pritchard libbson 1.23.5 ============== No changes since 1.23.3. Version incremented to match the libmongoc version. libbson 1.23.4 ============== No changes since 1.23.3. Version incremented to match the libmongoc version. libbson 1.23.3 ============== Fix: * Don't use `aligned_alloc()` on Windows Thanks to everyone who contributed to the development of this release. * Jeroen Ooms libbson 1.23.2 ============== No changes since 1.23.1. Version incremented to match the libmongoc version. -- Kevin Albertson libbson 1.22.2 ============== Bug fixes: - Fix link errors related to atomic operations on RISC-V - Fix compile-time errors due to type conflicts on some platforms. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Roberto C. Sánchez libbson 1.23.1 ============== No changes since 1.23.0. Version incremented to match the libmongoc version. libbson 1.23.0 ============== Improvements: * Reducing Warnings of Misaligned Address of Over-Aligned Types Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson * Colby Pike libbson 1.22.1 ============== No changes since 1.22.0. Version incremented to match the libmongoc version. --Colby Pike libbson 1.21.2 ============== Announcing libbson 1.21.2. No changes since 1.21.1; release to keep pace with libmongoc's version. -- Ezra Chung libbson 1.22.0-beta0 ==================== Bug fixes: * Fix BSON_ASSERT triggered by invalid JavaScript/JSON. Thanks to everyone who contributed to the development of this release. * Colby Pike * Ezra Chung * Jesse Williamson * MonkeybreadSoftware libbson 1.21.1 ============== Announcing libbson 1.21.1 No changes since 1.21.0; release to keep pace with libmongoc's version. --Jesse Williamson libbson 1.21.0 ============== Bug Fixes: * Addressed VS 2013 build failures due to missing C99 features. Improvements: * Addressed -Wstrict-prototype warnings in bson-atomic.h. * Addressed incompatible pointer warnings in bson-atomic.h on GCC 4.8.5. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson * Colby Pike * Pau Espin Pedrol * Ryan Schmidt libbson 1.20.1 ============== Bug fixes: * Fix implicit declarations causing build failures on macOS. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ryan Schmidt libbson 1.20.0 ============== Features: * Improve atomics API. Thanks to everyone who contributed to the development of this release. * Colby Pike * Kevin Albertson * Roberto C. Sánchez * Ezra Chung libbson 1.19.2 ============== Announcing libbson 1.19.2. No changes since 1.19.1; release to keep pace with libmongoc's version. --Kevin Albertson libbson 1.19.1 ============== It is my pleasure to announce libbson 1.19.1. Bug fixes: * Fix string handling in BSON keys and regular expressions. --Kevin Albertson libbson 1.19.0 ============== It is my pleasure to announce libbson 1.18.0. No changes since 1.18.0; release to keep pace with libmongoc's version. --Kevin Albertson libbson 1.18.0 ============== It is my pleasure to announce libbson 1.18.0. Features: * Add BSON to JSON encoder that limits encoded string length. * Support parsing $uuid into a binary UUID. * Relax validation for insert and replace documents to support fields containing dots and dollars. Improvements: * Add trailing space after base64 JSON field for consistency. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Jeremy Mikola * Andreas Braun * Benjamin Rewis * Richard Donkin * David Korczynski * Josh Weinstein * David Carlier * Andrew Witten * Tim Gates --Kevin Albertson libbson 1.18.0-alpha ==================== It is my pleasure to announce libbson 1.18.0-alpha. This is an unstable prerelease and is unsuitable for production applications. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Benjamin Rewis * Richard Donkin * Andreas Braun * Tim Gates * Andrew Witten * David Carlier * David Korczynski * Josh Weinstein --Kevin Albertson libbson 1.17.7 ============== It is my pleasure to announce libbson 1.17.7. No changes since 1.17.6; release to keep pace with libmongoc's version. --Kevin Albertson libbson 1.17.6 ============== It is my pleasure to announce libbson 1.17.6. No changes since 1.17.5; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.5 ============== It is my pleasure to announce libbson 1.17.5. Bug fixes: * Remove unnecessary dependency of libm for static libbson on macOS Thanks to everyone who contributed to the development of this release. * Kevin Albertson --Kevin Albertson libbson 1.17.4 ============== It is my pleasure to announce libbson 1.17.4. No changes since 1.17.3; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.3 ============== No changes since 1.17.2; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.2 ============== No changes since 1.17.1; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.1 ============== No changes since 1.17.0; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.0 ============== It is my pleasure to announce libbson 1.17.0. Features: * Add the cmake option ENABLE_PIC to build static libraries with position independent code. Bug fixes: * Fix possible int32 overflow when comparing and constructing large bson_t's. * Fix pedantic compiler warnings. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Richard Donkin * Roberto C. Sánchez * Josh Weinstein -- Kevin Albertson libbson 1.17.0 rc0 ================== It is my pleasure to announce libbson 1.17.0 rc0. No changes since 1.17.0 beta2; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.0 beta2 ==================== It is my pleasure to announce libbson 1.17.0 beta2. Features: * Fix pedantic compiler warnings. * Improve assertion error messages. Bug fixes: * Fix possible int32 overflow when comparing and constructing large bson_t's. Thanks to everyone who contributed to the development of this release. * Richard Donkin * Roberto C. Sánchez * Josh Weinstein * Kevin Albertson -- Kevin Albertson libbson 1.17.0 beta =================== It is my pleasure to announce libbson 1.17.0 beta. Features: * Add the cmake option ENABLE_PIC to build static libraries with position independent code. Notes: * Deprecated "lib" prefixed artifacts are no longer produced when building on Windows. Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * Kevin Albertson * Jeroen Ooms -- Kevin Albertson libbson 1.16.1 ============== It is my pleasure to announce libbson 1.16.1. Features: * Add bson_isspace, a safer isspace alternative. Thanks to everyone who contributed to the development of this release. * Kevin Albertson Peace, Kevin Albertson libbson 1.16.0 ============== It is my pleasure to announce libbson 1.16.0. Bug fixes: * Fix crash if an empty BSON binary value is copied and then appended. * Fix out-of-bounds read when parsing JSON. * Fix out-of-bounds read when parsing base64. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Clyde Bazile * Diego Barrios Romero * Vasil Velichkov Peace, Kevin Albertson libbson 1.15.3 ============== It is my pleasure to announce libbson 1.15.3. No changes since 1.15.2; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.15.2 ============== It is my pleasure to announce libbson 1.15.2. No changes since 1.15.1; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.15.1 ============== No change since 1.15.0; released to keep pace with libmongoc's version. -- Clyde Bazile libbson 1.15.0 ============== No change since 1.14.1; released to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.14.1 ============== It is my pleasure to announce libbson 1.14.1. Bug fixes: * Remove unnecessary dependencies from pkg-config. Thanks to everyone who contributed to the development of this release. * Kevin Albertson Peace, Kevin Albertson libbson 1.14.0 ============== It is my pleasure to announce libbson 1.14.0. Features: * ObjectIDs are generated in compliance with the driver ObjectID spec. * Add a bson_copy_to_excluding_noinit variant taking a va_list. * Add example of validating BSON nesting depth with bson_visitor_t. Bug fixes: * Relaxed JSON pads datetime milliseconds with spaces instead of zeroes. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * A. Jesse Jiryu Davis * Henrik Edin * Jeroen * Gustaf Neumann * Scott Gayou * Spencer McKenney * Samantha Ritter Peace, Samantha Ritter libbson 1.13.1 ============== It is my pleasure to announce libbson 1.13.1. Bug fixes: * Separate libmongoc and libbson uninstall scripts so they do not overwrite each other. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Henrik Edin Peace, Kevin Albertson libbson 1.13.0 ============== It is my pleasure to announce libbson 1.13.0. Features: * New functions to save and restore progress of a bson_iter_t: bson_iter_key_len, bson_iter_offset, and bson_iter_init_from_data_at_offset * Additional functions bson_iter_overwrite_date_time, bson_iter_overwrite_oid, and bson_iter_overwrite_timestamp. All fixed-length BSON values can now be updated in place. Bug fixes: * Fix crash when iterating corrupt BSON. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Roberto C. Sánchez * Kevin Albertson * Henrik Edin * Gustaf Neumann * Scott Gayou * Spencer McKenney Peace, Kevin Albertson libbson 1.12.0 ============== It is my pleasure to announce libbson 1.12.0. This release deprecates all MD5-related public APIs; they will be removed in the next major release. Bug fixes: * Properly handle zero-length BSON binary values * Fix crash parsing Base64-encoded data in JSON when using libbson without libmongoc Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * A. Jesse Jiryu Davis * Kevin Albertson Peace, A. Jesse Jiryu Davis libbson 1.11.0 ============== It is my pleasure to announce libbson 1.11.0. This version adds the following features and improvements: * All "destroy" functions such as bson_destroy or bson_reader_destroy now ignore a NULL argument. * Replace MD5 with FNV-1a hash to generate ObjectIds (for FIPS compliance). Bug fixes: * Functions incorrectly marked with the "const" compiler attribute are now marked as "pure", fixes build error when link-time optimization is enabled. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson * Roberto C. Sánchez Peace, A. Jesse Jiryu Davis libbson 1.10.3 ============== It is my pleasure to announce libbson 1.10.3. This release fixes a crash when parsing binary data from JSON if using libbson as a standalone library, without calling mongoc_init. Peace, A. Jesse Jiryu Davis libbson 1.10.2 ============== No change since 1.10.1; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis libbson 1.10.1 ============== No change since 1.10.0; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis libbson 1.10.0 ============== It is my pleasure to announce libbson 1.10.0. This version adds the following features: * libbson and libmongoc are now maintained in the mongo-c-driver repository, although they are still built as separate libraries, and libbson can still be used without libmongoc. * Building libbson and libmongoc now requires CMake on all platforms. The Autotools build scripts ("configure" and related scripts) have been deleted. See the "installing" page for updated instructions. * Additional functions for strings of known length (not necessarily null- terminated): bson_iter_find_w_len bson_iter_init_find_w_len bson_append_regex_w_len bson_decimal128_from_string_w_len Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Roberto C. Sánchez * Xiangyu Yao * Kevin Albertson * Mansuro * Petr Písař Peace, A. Jesse Jiryu Davis Libbson-1.9.5 ============= No change since 1.9.4; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.9.4 ============= It is my pleasure to announce Libbson-1.9.4. This release offers compatibility with Sphinx 1.7.0 and later. Peace, A. Jesse Jiryu Davis Libbson-1.9.3 ============= No change since 1.9.2; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.9.2 ============= It is my pleasure to announce Libbson-1.9.2. This release completes reverting a changed macro definition that broke API compatibility. The revert in 1.9.1 did not completely fix the BC break. Thanks to Petr Písař for finding and fixing the mistake. Peace, A. Jesse Jiryu Davis Libbson-1.9.1 ============= It is my pleasure to announce Libbson-1.9.1. This release reverts a changed macro definition that broke API compatibility, and fixes an off-by-one error in bson_append_regex that resulted in corrupt BSON. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Derick Rethans Peace, A. Jesse Jiryu Davis Libbson-1.9.0 ============= It is my pleasure to announce Libbson-1.9.0. New features and bugfixes: * Fix Autotools syntax for OpenBSD and any platform lacking stdint.h. * Fix Android NDK incompatibilities. * Fix a one-byte write past the end of a buffer in bson_decimal128_to_string. * Avoid reading past the end of a string that contains UTF-8 multibyte NIL. * Fix some pedantic warnings in C99 mode. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson * Jean-Marc Le Roux * Jeremy Mikola * Dimitri Gence * Hannes Magnusson Peace, A. Jesse Jiryu Davis Libbson-1.8.2 ============= No change since 1.8.1; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.8.1 ============= It is my pleasure to announce libbson-1.8.1. This release removes a syntax error in the configure script that affects some shells, and fixes the encoding of this NEWS file. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Jeremy Mikola Peace, A. Jesse Jiryu Davis Libbson-1.8.0 ============= It is my pleasure to announce Libbson-1.8.0. New features and bugfixes: * Make symbols bson_get_major_version, bson_get_minor_version, bson_get_micro_version, bson_get_version, and bson_check_version available to C++ programs. * New CMake option ENABLE_MAINTAINER_FLAGS. * Crash iterating over invalid code with scope. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeremy Mikola * Kevin Albertson * Michael Kuhn Peace, A. Jesse Jiryu Davis Libbson-1.7.0 ============= * Changes to JSON encoding and decoding: * New functions bson_as_canonical_extended_json and bson_as_relaxed_extended_json convert BSON to canonical and relaxed extended JSON according to MongoDB Extended JSON Spec. Output for the existing bson_as_json function has not been changed. * When parsing JSON type wrappers like "$timestamp", any missing or extra keys are an error. * The JSON format for BSON regular expressions is now "$regularExpression": {"pattern": "...", "options": "..."}. The old format {"$regex": "...", "$options": "..."} is still parsed. * The JSON format for BSON binary elements is now "$binary": {"base64": "...", "subType": "..."}. The old format {"$binary": "...", "$type": "..."} is still parsed. * BSON dates can be parsed from "$date" as an ISO8601 date or "$numberLong" as milliseconds since the epoch: "t": {"$date": {"$numberLong": "1234"}}. Dates can no longer be formatted as raw integers. bson_as_json writes a BSON date after 1970 as "$date" with an ISO8601 string, and dates before 1970 as negative milliseconds wrapped in "$numberLong". bson_as_canonical_extended_json always writes dates with "$numberLong". bson_as_relaxed_extended_json always writes dates with "$date". * The non-numbers NaN, Infinity, and -Infinity are now recognized (regardless of case) when parsing JSON. * CMake build now installs .pc files for programs that link to libbson using pkg-config. Both the CMake and Autotools build systems now install .cmake files for programs that link to libbson using CMake. Linking to libbson statically or dynamically is now much more convenient. * New CMake option, "ENABLE_STATIC", defaults to ON. * Minimum required CMake version has been increased to 3.1. * CMake remains experimental on non-Windows platforms and issues a warning now * New functions * bson_strcasecmp, a portable equivalent of strcasecmp. * bson_iter_as_double, cast the current value to double. * bson_iter_init_from_data, creates an iterator from BSON string. * bson_validate_with_error, checks a document like bson_validate does but also reports which key was invalid * New convenience macros * BSON_ITER_HOLDS_INT, checks if iterator holds int32 or int64 * BSON_ITER_HOLDS_NUMBER, checks if iterator holds int32, int64 or double * Raised BSON recursion limit to 200 Libbson-1.6.0 ============= It is my pleasure to announce libbson-1.6.0. New features and bug fixes: * Use jsonsl instead of libyajl as our JSON parsing library, parse JSON more strictly, fix minor parsing bugs. * Extended JSON documents like '{"$code": "...", "$scope": {}}' are now parsed into BSON "code" elements. * ISO8601 dates now allow years from 0000 to 9999 inclusive. Before, years before 1970 were prohibited. * BSON floats and ints are now distinguished in JSON output. * The library is now built and continuously tested with MinGW-W64 on Windows. * The documentation is ported from Mallard XML to ReStructured Text, the HTML documentation is restyled, and numerous man page syntax errors fixed. * All public functions now have the __cdecl calling convention on Windows. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Aleksander Melnikov * Remi Collet Peace, A. Jesse Jiryu Davis libbson-1.5.5 ============= No change since 1.5.4; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.4 ============= No change since 1.5.3; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.3 ============= No change since 1.5.2; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.2 ============= This is a patch release that fixes a build error with MinGW on Windows. Libbson-1.5.1 ============= No change since 1.5.0; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.2 ============= It is my pleasure to announce Libbson-1.5.2. New bug fixes: * CDRIVER-1982 fix ifdef for strerror_s with mingw. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis Peace, Hannes Magnusson Libbson-1.5.1 ============= No change since 1.5.0; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.0 ============= It is my pleasure to announce Libbson-1.5.0. New features and bug fixes: * New BSON Type, Decimal128 (bson_decimal128_t) along with the following new functions and helpers: * bson_decimal128_to_string() * bson_decimal128_from_string() * bson_iter_decimal128() * bson_iter_overwrite_decimal128() * BSON_ITER_HOLDS_DECIMAL128() * bson_append_decimal128() * BSON_APPEND_DECIMAL128() * BCON_DECIMAL128() See the documentations for further details. * bson_validate and bson_iter_next now validate that BSON boolean values are 0 or 1. Before, any non-zero value was considered true. * bson_append_code_with_scope now preserves the "code with scope" type if scope is an empty, non-NULL BSON document. * BSON "code" and "code with scope" types are properly translated to and from JSON of the form '{"$code": "...", "$scope": {...}}'. * bson_json_reader functions now always validate UTF-8. * JSON parsing now preserves integer width. * bson_strtoll now matches stroll: it detects range errors, and when parsing octal it stops at non-octal digits and returns what it parsed instead of setting errno. * New flag BSON_VALIDATE_EMPTY_KEYS causes bson_validate to fail if a document contains zero-length field names. * The configure option "--enable-hardening" had had no effect. It is removed in favor of system-wide compiler configuration. Thanks to everyone who contributed to the development of this release. * Hannes Magnusson * A. Jesse Jiryu Davis * Fiona Rowan * Brian Samek Peace, A. Jesse Jiryu Davis Libbson-1.4.1 ============= This release improves the HTML documentation's Makefile. -- A. Jesse Jiryu Davis Libbson-1.4.0 ============= It is my pleasure to announce Libbson-1.4.0. New features and bug fixes: * bson_reader_reset seeks to the beginning of a BSON buffer. * bson_steal efficiently transfers contents from one bson_t to another. * Fix Windows compile error with BSON_EXTRA_ALIGN disabled. * Potential buffer overrun in bson_strndup. * bson_oid_to_string optimization for MS Visual Studio * bson_oid_is_valid accepts uppercase hex characters. * bson_json_reader_read aborted on some invalid Extended JSON documents. * All man page names now begin with "bson_" to avoid install conflicts. * Error messages sometimes truncated at 63 chars. This release tentatively supports the new BSON decimal type when built with "./configure --enable-experimental-features", or with "cmake -DENABLE_EXPERIMENTAL_FEATURES=ON", but this feature may change between now and libbson 1.5. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeremy Mikola * David Hatch * Ian Boros * Fiona Rowan * Shane Harvey * Runar Buvik * Raymond Jacobson * ReadmeCritic * Mike Lloyd * Derick Rethans * Maverick Chan Peace, A. Jesse Jiryu Davis Libbson-1.3.5 ============= No change since 1.3.4; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.3.4 ============= No change since 1.3.3; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.3.3 ============= No change since 1.3.2; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.3.2 ============= This is a patch release with a fix for the build system: * man pages couldn't be built from a distribution tarball. Peace, A. Jesse Jiryu Davis Libbson-1.3.1 ============= It is my pleasure to announce Libbson-1.3.1. This is a bugfix release: * bson_strnlen is off by one on Windows. * BSON_HAVE_STRNLEN config check used incorrectly. * Incompatibility with older CMake versions. * Wrong-sized allocation in bson_json_reader_new. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Alex Bishop * Jeroen Ooms Peace, A. Jesse Jiryu Davis Libbson-1.3.0 ============= It is my pleasure to announce to you the release of Libbson-1.3.0. Since the release candidate 1.3.0-rc0, the only changes have been fixes for compiler warnings and errors on various platforms. All changes since the previous stable release, 1.2.1: * Fix potential crash in bson_strncpy on Windows. * Parse DBRefs correctly from JSON. * CMake option to disable building tests: "cmake -DENABLE_TESTS:BOOL=OFF". * Refactor the build system to declare library version in one place. * Fix compiler warnings and errors, especially with Visual Studio 2015 and IBM XL C. * Combine environment's CFLAGS with configure options when building. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Mark Benvenuto * Petr Písař * xpol * Jose Sebastian Battig * Jeroen Ooms Peace, A. Jesse Jiryu Davis Libbson-1.3.0-rc0 ================= It is my pleasure to announce to you first release candidate of Libbson-1.3.0. Changes since 1.3.0-beta0: * Parse DBRefs correctly from JSON. * CMake option to disable building tests: "cmake -DENABLE_TESTS:BOOL=OFF". * Fix build warnings on some platforms, and refactor the build system. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jose Sebastian Battig Peace, A. Jesse Jiryu Davis Libbson-1.3.0-beta0 =================== It is my pleasure to announce to you the beta release of Libbson-1.3.0. Changes since the previous stable release, 1.2.1: * Fix potential crash in bson_strncpy on Windows. * Fix compiler warnings and errors, especially with Visual Studio 2015 and IBM XL C. * Combine environment's CFLAGS with configure options when building. Thanks to everyone who contributed to the development of this release. * Hannes Magnusson * A. Jesse Jiryu Davis * Jeroen Ooms * Petr Písař * xpol Peace, A. Jesse Jiryu Davis Libbson-1.2.1 ============= It is my pleasure to announce to you the release of Libbson-1.2.1. Changes since the previous stable release, 1.2.0 are solely in the content and format of documentation. Peace, A. Jesse Jiryu Davis Libbson-1.2.0 ============= It is my pleasure to announce to you the release of Libbson-1.2.0. Changes since the previous stable release, 1.1.11: * Add bson_mem_restore_vtable(), the inverse of bson_mem_set_vtable(). * Enable runtime asserts in release build. * Fixed compiler warnings and build failures on various platforms. * Improvements to the formatting and contents of the documentation. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jason Carey * Kyle Suarez * Derick Rethans * David Hatch Peace, A. Jesse Jiryu Davis Libbson 1.2.0-rc0 ================== It is my pleasure to announce to you the release candidate of Libbson-1.2.0. Changes: * Merge changes from 1.1.11. * Enable runtime asserts in release build. Thanks to everyone who contributed to the development of this release candidate. * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * Jason Carey -- A. Jesse Jiryu Davis Libbson 1.2.0-beta ================== It is my pleasure to announce to you the beta of Libbson-1.2.0. This release adds the bson_mem_restore_vtable() function to undo the effect of bson_mem_set_vtable(). Thanks to everyone who contributed to the development of this beta. * Jason Carey * Hannes Magnusson Libbson-1.1.11 ============== It is my pleasure to announce to you the release of Libbson-1.1.11. This is a patch release with improvements to the documentation: * Document bson streaming reads with an example, bson-streaming-reader.c. * Document callback function types bson_reader_destroy_func_t and bson_reader_read_func_t. Thanks to Kyle Suarez for his contributions to this version of Libbson. -- A. Jesse Jiryu Davis Libbson-1.1.10 ============== No change since 1.1.9; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.1.9 ============= This is a patch release with a fix for the build system: * "./configure --enable-coverage" works now. -- A. Jesse Jiryu Davis Libbson-1.1.8 ============= No change since 1.1.7; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.1.7 ============= It is my pleasure to announce to you the release of Libbson-1.1.7. This is a patch release with bug fixes: * Unchecked error in bson_utf8_escape_for_json caused unbounded memory growth and a crash. * Nicer floating-point formatting in bson_as_json. * Link error with CMake on Mac. Thanks to everyone who contributed to this version of Libbson. * A. Jesse Jiryu Davis * Jason Carey * Jeroen Ooms * Hannes Magnusson * Hendrik Dahlkamp -- A. Jesse Jiryu Davis Libbson-1.1.6 ============= No change since 1.1.5; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson 1.1.5 ============= It is my pleasure to announce to you the release of Libbson-1.1.5. This is a patch release with small bug fixes: * Fix link error "missing __sync_add_and_fetch_4" in GCC on i386 - the functions bson_atomic_int_add and bson_atomic_int64_add are now compiled and exported if needed in i386 mode * Fix version check for GCC 5 and future versions of Clang * Fix warnings and errors building on various platforms With this release, Libbson abandons the convention that odd-numbered patch versions indicate unstable releases. We switch to simple semantic versioning: 1.1.5 is a stable release with bug fixes since 1.1.4. During subsequent development the version will be "1.1.6-dev". Thanks to everyone who contributed to this version of Libbson. * A. Jesse Jiryu Davis * Christian Hergert * Jason Carey * Hannes Magnusson * Paul Melnikow -- A. Jesse Jiryu Davis Libbson 1.1.4 ============= It is my pleasure to announce to you the release of Libbson-1.1.4. This release is a minor patch release with one bug fix for bson_iter_timeval Thanks to everyone who contributed to the development of this release candidate for Libbson. * Jason Carey * A. Jesse Jiryu Davis * Vladimir Zidar -- Jason Carey Libbson 1.1.2 ============= It is my pleasure to announce to you the release of Libbson-1.1.2. This release is a minor patch release with one bug fix for mingw. * sscanf_s doesn't exist for mingw. -- Jason Carey Libbson 1.1.0 ============= It is my pleasure to announce to you the release of Libbson-1.1.0. This release is a stable release with some ABI additions and bugfixes. The below changes include the changes mentioned in the rc0. ABI/API changes include: * RC0 * Deprecation of bson_copy_to_excluding * Addition of bson_copy_to_excluding_noinit * Removal of MIN, MAX and ABS macros in favor of BSON_MIN, BSON_MAX and BSON_ABS. Note this is a breaking source level change if you relied on these from bson.h. Also note that this is not a breaking ABI change. * Addition of BSON_ERROR_BUFFER_SIZE macro Other changes include: * RC0 * Addition of a versioned ABI for the libbson shared library * fixed bson_get_monotonic_time fallback when a system monotonic clock can not be found. Formerly failed to compile with an incorrect call to bson_gettimeofday * Allow the "dbref" convention in bson_validate when BSON_VALIDATE_DOLLAR_KEYS is present * Support for ISO-8601 or $numberLong dates in bson <-> json parsing * Quiet various compiler warnings Thanks to everyone who contributed to the development of this release candidate for Libbson. * Adam Midvidy * Christian Hergert * Daniel Colchete * Ivan Suvorov * Hannes Magnusson * Jason Carey * Jérôme Lebel * Samantha Ritter -- Jason Carey Libbson 1.1.0-rc0 ================= It is my pleasure to announce to you the release of Libbson-1.1.0-rc0. This release is a release candidate release with some ABI additions and bugfixes. ABI changes include: * Deprecation of bson_copy_to_excluding * Addition of bson_copy_to_excluding_noinit Other changes include: * Addition of a versioned ABI for the libbson shared library * fixed bson_get_monotonic_time fallback when a system monotonic clock can not be found. Formerly failed to compile with an incorrect call to bson_gettimeofday * Allow the "dbref" convention in bson_validate when BSON_VALIDATE_DOLLAR_KEYS is present * Support for ISO-8601 or $numberLong dates in bson <-> json parsing * Quiet various compiler warnings Thanks to everyone who contributed to the development of this release candidate for Libbson. * Adam Midvidy * Christian Hergert * Daniel Colchete * Ivan Suvorov * Jason Carey * Jérôme Lebel -- Jason Carey Libbson 1.0.2 ============= It is my pleasure to announce to you the release of Libbson-1.0.2. This release is a minor point release with no ABI changes and mostly small bugfixes. Changes include: * bson_init_from_json supports top level arrays * fixes for bson_strerror_r * fix for timeouts on OS X * house cleaning for various integer types Thanks to everyone who contributed to the development of this point release for Libbson. * Adam Midvidy * Christian Hergert * Jason Carey * Jérôme Lebel * Tyler Brock -- Jason Carey Libbson 1.0.0 ============= It is my very distinct pleasure to announce to you the release of Libbson-1.0.0! This is the culmination of just over a year of work and could not have been done without the help of our wonderful community. Thanks to everyone who contributed to the development of Libbson! * Christian Hergert * Jason Carey * Jose Sebastian Battig * Maxim Zakharov * Jérôme Lebel * Itay Neeman * Mike Manilone * Michael Kuhn * Kyle Suarez * Josh Blum * Jason Choy * mntmnt7@gmail.com * Tyler Brock * Stefan Kaes * Paul Melnikow * Matt Cotter * Gary J. Murakami * Toon Schoenmakers * Máximo Cuadros * Michael Whittaker * Kota Yamaguchi * Justin Case * Jeff Yemin * Ivan Suvorov * Hannes Magnusson * Eric Daniels * Anil Kumar * A. Jesse Jiryu Davis Happy Hacking! -- Christian Hergert Libbson 0.98.0 ============== One more step closer to a 1.0! This release has a few fixes as we near the finish line of a 1.0 release. We have bumped the version to 0.98.0 to sync up with MongoDB C driver, which is the primary consumer of this library. This release includes a new memory callback vtable to help in embedding situations that have their own custom allocator such as various language runtimes. A few compilation fixes for various C++ compilers have also been included. A special thanks to: * Itay Neeman * Michael Whittaker Happy Hacking! -- Christian Libbson 0.8.4 ============= Another incremental release with a couple of new functions and bugfixes. In this release you will find the following changes: * Alignment fixes for Solaris Studio C compiler. * RPM and Debian packaging helpers. * bson_gettimeofday() has dropped the deprecated timezone field used when calling posix gettimeofday(). This eases portability concerns. It is technically an ABI break, but since the field was never set, in reality it shouldn't be an issue. * Multi-byte optimizations for bson_oid_to_string() have been disabled on non-x86 based platforms. This should aid in architecture portability. * The JSON parser can now support $numberLong. * bson_ascii_strtoll() has been added, which is a portable strtoll() implementation. This is primarily useful for Windows users and is used by the JSON parser. * A bug was fixed in bson_iter_find_descendent() where the wrong field could be matched if it's prefix matched the query. * bson_array_as_json() has been added to convert a bson_t as a top-level array. Thanks to: * Kyle Suarez * Itay Neeman Happy Hacking! Libbson 0.8.2 ============= A bugfix release is here as a follow up to 0.8.0. In this release you will find the following changes: * A fix for BCON when used from C++. * Change bson_next_power_of_two() to accept size_t. This should not be an ABI break since it is static inline. Happy Hacking! Libbson 0.8.0 ============= It's that time again, time for another Libbson release! This cycle includes much, much more documentation for your perusing. There is much more cross-referencing and structure for your navigation pleasure. We've improved support for Libbson on a few more exotic platforms. SPARC support is looking pretty good these days. You'll also find some new examples in this release to help you get started a bit faster. If there is something you'd like to see, just ask! There are a few ABI breaks this cycle, as we are well on the road to a 1.0 and would like things as clean as possible. I anticipate a few more during the next couple of cycles, but we will try to keep them to a minimum. With that said, you *WILL* need to recompile your application against 0.8.0. Happy Hacking! Libbson 0.6.8 ============= Quickly following up on the 0.6.6 release is 0.6.8. This release contains a couple of bugfixes and more support for older architectures. On big-endian systems, bson_append_date_time() was not properly converting to little-endian. This is now fixed. We've added support for Sun Pro C Compiler on Solaris 10 and 11. This includes support for SPARC systems as well as x86_64. In particular, intrinsics were added for the Solaris/SPARC/SunProC combination. If you are running SunProC on a non-Solaris platform, a fallback path will be used which is slower than native support for atomics. Additionally, bson_gettimeofday() does not fully support timezones under SunProC as struct timezone is not defined. Libbson will now check for GLibc 2.19 to remove various warnings with both _GNU_SOURCE and _BSD_SOURCE defined. Happy Hacking! Libbson 0.6.6 ============= Another release for your hacking pleasure! First off, note that there are two ABI breaks as part of this release. We felt they were important as they will help us stablize towards a 1.0 release. It is recommended that you recompile against this version of libbson. Lots of small fixes went into this release to help get things building better on various platforms. Windows support should be improved and many warnings have been cleaned up. The signature of bson_realloc_func has changed to allow for context to be provided. This should help in situations where a pointer to the memory pool is required. bson_destroy_with_steal() has been added so that you can steal a buffer instead of freeing it when bson_destroy() is called. bson_new_from_buffer() has been added so that you can provide your own realloc function to manage the underlying buffer. This will be useful for bindings that want to integrate their memory manager for bson documents. bson_value_t is a new container type that can hold any bson type. I'd like to thank everyone who contributed to this release. Gary Murakami Jason Carey Jose Sebastian Battig Máximo Cuadros Paul Melnikow Stefan Kaes Happy hacking! Libbson 0.6.4 ============= This is just a followup release of libbson as we work towards stablizing for the new mongo-c-driver release. In fact, it only includes build work and a new macro, bson_clear(). Happy hacking! Libbson 0.6.2 ============= A new Libbson release is already here as a follow up to the 0.6.0 release. This release includes a few build and installation fixes. In particular, * Windows build fixes * CMake build fixes * C++ build fixes. The monotonic clock is now more accurately calculated on Windows as well. If you'd like to build on Windows, check out the section in README.md for information on how to do so. Happy hacking! Libbson 0.6.0 ============= Many changes have gone into this release! TL;DR * C99 types (from C89). * JSON parsing. * Lots of Operating System support, including Windows. * Parallel Test Suite. * Revamped build system. * A couple ABI breaks. First off, 0.6.0 has gone through a significant amount of build system cleanup. This should simplify using libbson as a submodule for those that wish to do so. For example, the mongo-c-driver now does this using autotools. Windows Vista and higher is now supported as a build target through the use of cmake. See README.md for the instructions. Other platforms should continue to use autotools. The test suite has been improved and more tests added. We now generate random seeds on every run to help catch more errors with additional fuzzing passes. By default, the test suite will run all tests in parallel with subprocesses. This should speed up execution of `make test' for contributors. bson_string_t went through an ABI break to support power-of-two growth. JSON parsing has been added through the bson_json_reader_t type. You can also now use bson_init_from_json() for a simplified interface. Types were revamped to appear to be using C99 types. If C99 types are available, they will be used. If not, they will be emulated. This means you can just go on using uint64_t and similar. We even use bool now. Many functions have been made portable to deal with inconsistencies with Win32. This release has been tested on the following operating systems: * RedHat Enterprise 5, 6, and 7 beta. * CentOS 6.5 * Ubuntu 12.04 LTS * Fedora 20 * Windows 7 * FreeBSD 10 * DragonFly BSD * Solaris 11 * SmartOS * mingw64 Thanks again and enjoy using libbson! Libbson 0.4.0 ============= This release includes a few bug fixes and copious documentation. Additionally, we improved our fuzz testing and found a couple issues in the process. It is suggested that everyone upgrade their installations to 0.4.0. We have been busy adding a lot of documentation that we hope you will like. Many `man' pages have been added for various API endpoints and structures. If you use vim, remember that you can jump to the documentation with k while on a symbol. Thanks and enjoy using libbson! Libbson 0.2.4 ============= This release includes some more performance improvements and bug fixes. It contains an important fix for dealing with invalid string lengths that could cause an integer overflow when checking to see if the string length fits within the end of the buffer. There is preliminary support for Solaris on x86_64 and SPARC. Generating OIDs is now simpler with the use of bson_context_get_default(). This function will return a thread-safe generic bson_context_t implementation. Alternatively, you may pass NULL to bson_oid_init() for the context and the default context is automatically used. The fuzz tests now use srand() with a 32-bit integer derived from /dev/urandom. Endianess conversions are now performed by __builtin_bswap*() functions when available with the GCC compiler. Endianness conversions for the double type are now properly handled on big-endian systems. bson_reinit() has been added to cleanup code that needs to destroy and then initialize a bson_t. Validation of Code with Scope fields was absent from bson_validate(). This is now supported. Libbson 0.2.2 ============= This release includes a few performance improvements and bug fixes. The bson_t structure is more efficient when growing allocated buffers. The use of memalign() was unnecessary for allocated bson_t structures and has therefore been removed. Performance sensitive allocations now use bson_malloc() instead of calloc() and initialize fields directly. Stack alignment of bson_t is now enforced through compiler intrinsics. The unit tests can now support running inside of valgrind to check for various memory leaks. Simply defing VALGRIND=valgrind when running `make test`. Enjoy libbson-0.2.2! Libbson 0.2.0 ============= This is the initial release of Libbson. It has not yet reached API and ABI maturity and is therefore subject to change without notice. Developers are encouraged to start using Libbson as we journey on the road to 1.0, where ABI stability will be guaranteed. Libbson is Apache 2.0 licensed so that it can be embedded in a multitude of scenarios. This means that we try hard to not rely on external libraries. Therefore, Libbson contains useful routines to help in portability as well as BSON support. Libbson is the basis of a new MongoDB C driver that will follow shortly. Please see the doc/ directory for documentation on how to use Libbson. We would love for you to contribute to Libbson, whether that is code, documentation or packaging. mongo-c-driver-1.26.0/src/libbson/THIRD_PARTY_NOTICES000066400000000000000000000023731456567454500216410ustar00rootroot00000000000000Libbson uses third-party libraries distributed under different licenses. License notice for jsonsl ------------------------------------------------------------------------------- MIT License Copyright (c) 2012-2015 M. Nunberg, mnunberg@haskalah.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.mongo-c-driver-1.26.0/src/libbson/doc/000077500000000000000000000000001456567454500174415ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/doc/.gitignore000066400000000000000000000002351456567454500214310ustar00rootroot00000000000000*.7 *.pyc .doctrees objects.inv html/*.html html/*.css html/*.js html/*.png html/_sources html/_static html/.buildinfo html/.nojekyll man/*.3 man/.buildinfo mongo-c-driver-1.26.0/src/libbson/doc/CMakeLists.txt000066400000000000000000000002361456567454500222020ustar00rootroot00000000000000include (SphinxBuild) if (ENABLE_HTML_DOCS) sphinx_build_html (bson-html libbson) endif () if (ENABLE_MAN_PAGES) sphinx_build_man (bson-man) endif () mongo-c-driver-1.26.0/src/libbson/doc/api.rst000066400000000000000000000006371456567454500207520ustar00rootroot00000000000000API Reference ============= .. toctree:: :titlesonly: :maxdepth: 2 bson_t bson_array_builder_t bson_context_t bson_decimal128_t bson_error_t bson_iter_t bson_json_reader_t bson_oid_t bson_reader_t character_and_string_routines bson_string_t bson_subtype_t bson_type_t bson_unichar_t bson_value_t bson_visitor_t bson_writer_t bson_get_monotonic_time bson_memory version mongo-c-driver-1.26.0/src/libbson/doc/bson_aligned_alloc.rst000066400000000000000000000015731456567454500237770ustar00rootroot00000000000000:man_page: bson_aligned_alloc bson_aligned_alloc() ==================== Synopsis -------- .. code-block:: c void * bson_aligned_alloc (size_t alignment, size_t num_bytes); Parameters ---------- * ``alignment``: The alignment of the allocated bytes of memory. Must be a power of 2 and a multiple of ``sizeof (void *)``. * ``num_bytes``: The number of bytes to allocate. Must be a multiple of ``alignment``. Description ----------- This is a portable ``aligned_alloc()`` wrapper. In general, this function will return an allocation at least ``sizeof(void*)`` bytes or bigger with an alignment of at least ``alignment``. If there was a failure to allocate ``num_bytes`` bytes aligned to ``alignment``, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS NOT* been zeroed. mongo-c-driver-1.26.0/src/libbson/doc/bson_aligned_alloc0.rst000066400000000000000000000016351456567454500240560ustar00rootroot00000000000000:man_page: bson_aligned_alloc0 bson_aligned_alloc0() ===================== Synopsis -------- .. code-block:: c void * bson_aligned_alloc0 (size_t alignment, size_t num_bytes); Parameters ---------- * ``alignment``: The alignment of the allocated bytes of memory. Must be a power of 2 and a multiple of ``sizeof (void *)``. * ``num_bytes``: The number of bytes to allocate. Must be a multiple of ``alignment``. Description ----------- This is a portable ``aligned_alloc()`` wrapper that also sets the memory to zero. In general, this function will return an allocation at least ``sizeof(void*)`` bytes or bigger with an alignment of at least ``alignment``. If there was a failure to allocate ``num_bytes`` bytes aligned to ``alignment``, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS* been zeroed. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_array.rst000066400000000000000000000022021456567454500236550ustar00rootroot00000000000000:man_page: bson_append_array bson_append_array() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_ARRAY(b, key, val) \ bson_append_array (b, key, (int) strlen (key), val) bool bson_append_array (bson_t *bson, const char *key, int key_length, const bson_t *array); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``array``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_append_array()` function shall append ``array`` to ``bson`` using the specified key. The type of the field will be an array, but it is the responsibility of the caller to ensure that the keys of ``array`` are properly formatted with string keys such as "0", "1", "2" and so forth. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_array_builder_t` mongo-c-driver-1.26.0/src/libbson/doc/bson_append_array_begin.rst000066400000000000000000000025601456567454500250300ustar00rootroot00000000000000:man_page: bson_append_array_begin bson_append_array_begin() ========================= Synopsis -------- .. code-block:: c #define BSON_APPEND_ARRAY_BEGIN(b, key, child) \ bson_append_array_begin (b, key, (int) strlen (key), child) bool bson_append_array_begin (bson_t *bson, const char *key, int key_length, bson_t *child); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: A string containing the name for the key. * ``key_length``: The length of ``key`` or -1 to call ``strlen()``. * ``child``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_append_array_begin()` function shall begin appending an array field to ``bson``. This allows for incrementally building a sub-array. Doing so will generally yield better performance as you will serialize to a single buffer. When done building the sub-array, the caller *MUST* call :symbol:`bson_append_array_end()`. For generating array element keys, see :symbol:`bson_uint32_to_string`. Consider using :symbol:`bson_array_builder_t` to append an array without needing to generate array element keys. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_array_builder_t` mongo-c-driver-1.26.0/src/libbson/doc/bson_append_array_end.rst000066400000000000000000000012171456567454500245100ustar00rootroot00000000000000:man_page: bson_append_array_end bson_append_array_end() ======================= Synopsis -------- .. code-block:: c bool bson_append_array_end (bson_t *bson, bson_t *child); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``child``: The :symbol:`bson_t` initialized in a call to :symbol:`bson_append_array_begin()`. Description ----------- The :symbol:`bson_append_array_end()` function shall complete the appending of an array field started with :symbol:`bson_append_array_begin()`. ``child`` is invalid after calling this function. Returns ------- Returns ``true`` if successful. .. seealso:: | :symbol:`bson_array_builder_t` mongo-c-driver-1.26.0/src/libbson/doc/bson_append_binary.rst000066400000000000000000000022541456567454500240320ustar00rootroot00000000000000:man_page: bson_append_binary bson_append_binary() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_BINARY(b, key, subtype, val, len) \ bson_append_binary (b, key, (int) strlen (key), subtype, val, len) bool bson_append_binary (bson_t *bson, const char *key, int key_length, bson_subtype_t subtype, const uint8_t *binary, uint32_t length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: The key name. * ``key_length``: The length of ``key`` in bytes or -1 to use strlen(). * ``subtype``: A bson_subtype_t indicating the binary subtype. * ``binary``: A buffer to embed as binary data. May be ``NULL`` for an empty binary value. * ``length``: The length of ``buffer`` in bytes. Must be ``0`` if ``binary`` is NULL. Description ----------- The :symbol:`bson_append_binary()` function shall append a new element to ``bson`` containing the binary data provided. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``binary`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_bool.rst000066400000000000000000000014071456567454500235000ustar00rootroot00000000000000:man_page: bson_append_bool bson_append_bool() ================== Synopsis -------- .. code-block:: c #define BSON_APPEND_BOOL(b, key, val) \ bson_append_bool (b, key, (int) strlen (key), val) bool bson_append_bool (bson_t *bson, const char *key, int key_length, bool value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: The name of the field. * ``key_length``: The length of ``key`` or -1 to use strlen(). * ``value``: true or false. Description ----------- The :symbol:`bson_append_bool()` function shall append a new element to ``bson`` containing the boolean provided. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_code.rst000066400000000000000000000016661456567454500234660ustar00rootroot00000000000000:man_page: bson_append_code bson_append_code() ================== Synopsis -------- .. code-block:: c #define BSON_APPEND_CODE(b, key, val) \ bson_append_code (b, key, (int) strlen (key), val) bool bson_append_code (bson_t *bson, const char *key, int key_length, const char *javascript); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: The key name. * ``key_length``: The length of ``key`` or -1 to use strlen(). * ``javascript``: A UTF-8 encoded string containing the javascript. Description ----------- The :symbol:`bson_append_code()` function shall append a new element to ``bson`` using the UTF-8 encoded ``javascript`` provided. ``javascript`` must be a NULL terminated C string. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``javascript`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_code_with_scope.rst000066400000000000000000000026451456567454500257100ustar00rootroot00000000000000:man_page: bson_append_code_with_scope bson_append_code_with_scope() ============================= Synopsis -------- .. code-block:: c #define BSON_APPEND_CODE_WITH_SCOPE(b, key, val, scope) \ bson_append_code_with_scope (b, key, (int) strlen (key), val, scope) bool bson_append_code_with_scope (bson_t *bson, const char *key, int key_length, const char *javascript, const bson_t *scope); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``javascript``: A NULL-terminated UTF-8 encoded string containing the javascript fragment. * ``scope``: Optional :symbol:`bson_t` containing the scope for ``javascript``. Description ----------- The :symbol:`bson_append_code_with_scope()` function shall perform like :symbol:`bson_append_code()` except it allows providing a scope to the javascript function in the form of a bson document. If ``scope`` is NULL, this function appends an element with BSON type "code", otherwise with BSON type "code with scope". Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``javascript`` and ``scope`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_date_time.rst000066400000000000000000000021761456567454500245040ustar00rootroot00000000000000:man_page: bson_append_date_time bson_append_date_time() ======================= Synopsis -------- .. code-block:: c #define BSON_APPEND_DATE_TIME(b, key, val) \ bson_append_date_time (b, key, (int) strlen (key), val) bool bson_append_date_time (bson_t *bson, const char *key, int key_length, int64_t value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: The date and time as specified in milliseconds since the UNIX epoch. Description ----------- The :symbol:`bson_append_date_time()` function shall append a new element to a ``bson`` document containing a date and time with no timezone information. ``value`` is assumed to be in UTC format of milliseconds since the UNIX epoch. ``value`` *MAY* be negative. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_dbpointer.rst000066400000000000000000000020731456567454500245330ustar00rootroot00000000000000:man_page: bson_append_dbpointer bson_append_dbpointer() ======================= Synopsis -------- .. code-block:: c #define BSON_APPEND_DBPOINTER(b, key, coll, oid) \ bson_append_dbpointer (b, key, (int) strlen (key), coll, oid) bool bson_append_dbpointer (bson_t *bson, const char *key, int key_length, const char *collection, const bson_oid_t *oid); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``collection``: The target collection name. * ``oid``: The target document identifier. Description ----------- .. warning:: The dbpointer field type is *DEPRECATED* and should only be used when interacting with legacy systems. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the array grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_decimal128.rst000066400000000000000000000017351456567454500244020ustar00rootroot00000000000000:man_page: bson_append_decimal128 bson_append_decimal128() ======================== Synopsis -------- .. code-block:: c #define BSON_APPEND_DECIMAL128(b, key, val) \ bson_append_decimal128 (b, key, (int) strlen (key), val) bool bson_append_decimal128 (bson_t *bson, const char *key, int key_length, const bson_decimal128_t *value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A :symbol:`bson_decimal128_t`. Description ----------- The :symbol:`bson_append_decimal128()` function shall append a new element to ``bson`` containing a Decimal 128. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_document.rst000066400000000000000000000017761456567454500243740ustar00rootroot00000000000000:man_page: bson_append_document bson_append_document() ====================== Synopsis -------- .. code-block:: c #define BSON_APPEND_DOCUMENT(b, key, val) \ bson_append_document (b, key, (int) strlen (key), val) bool bson_append_document (bson_t *bson, const char *key, int key_length, const bson_t *value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A :symbol:`bson_t` containing the sub-document to append. Description ----------- The :symbol:`bson_append_document()` function shall append ``child`` to ``bson`` using the specified key. The type of the field will be a document. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_document_begin.rst000066400000000000000000000023271456567454500255310ustar00rootroot00000000000000:man_page: bson_append_document_begin bson_append_document_begin() ============================ Synopsis -------- .. code-block:: c #define BSON_APPEND_DOCUMENT_BEGIN(b, key, child) \ bson_append_document_begin (b, key, (int) strlen (key), child) bool bson_append_document_begin (bson_t *bson, const char *key, int key_length, bson_t *child); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``child``: An uninitialized :symbol:`bson_t` to be initialized as the sub-document. Description ----------- The :symbol:`bson_append_document_begin()` function shall begin appending a sub-document to ``bson``. Use ``child`` to add fields to the sub-document. When completed, call :symbol:`bson_append_document_end()` to complete the element. ``child`` *MUST* be an uninitialized :symbol:`bson_t` to avoid leaking memory. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if ``bson`` must grow larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_document_end.rst000066400000000000000000000011541456567454500252100ustar00rootroot00000000000000:man_page: bson_append_document_end bson_append_document_end() ========================== Synopsis -------- .. code-block:: c bool bson_append_document_end (bson_t *bson, bson_t *child); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``child``: The child :symbol:`bson_t` initialized in a call to :symbol:`bson_append_document_begin()`. Description ----------- The :symbol:`bson_append_document_end()` function shall complete the appending of a document with :symbol:`bson_append_document_begin()`. ``child`` is invalid after calling this function. Returns ------- Returns ``true`` if successful. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_double.rst000066400000000000000000000016371456567454500240240ustar00rootroot00000000000000:man_page: bson_append_double bson_append_double() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_DOUBLE(b, key, val) \ bson_append_double (b, key, (int) strlen (key), val) bool bson_append_double (bson_t *bson, const char *key, int key_length, double value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A double value to append. Description ----------- The :symbol:`bson_append_double()` function shall append a new element to a bson document of type ``double``. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_int32.rst000066400000000000000000000016211456567454500235020ustar00rootroot00000000000000:man_page: bson_append_int32 bson_append_int32() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_INT32(b, key, val) \ bson_append_int32 (b, key, (int) strlen (key), val) bool bson_append_int32 (bson_t *bson, const char *key, int key_length, int32_t value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: An int32_t. Description ----------- The :symbol:`bson_append_int32()` function shall append a new element to ``bson`` containing a 32-bit signed integer. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_int64.rst000066400000000000000000000016211456567454500235070ustar00rootroot00000000000000:man_page: bson_append_int64 bson_append_int64() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_INT64(b, key, val) \ bson_append_int64 (b, key, (int) strlen (key), val) bool bson_append_int64 (bson_t *bson, const char *key, int key_length, int64_t value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: An int64_t. Description ----------- The :symbol:`bson_append_int64()` function shall append a new element to ``bson`` containing a 64-bit signed integer. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_iter.rst000066400000000000000000000014611456567454500235100ustar00rootroot00000000000000:man_page: bson_append_iter bson_append_iter() ================== Synopsis -------- .. code-block:: c bool bson_append_iter (bson_t *bson, const char *key, int key_length, const bson_iter_t *iter); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: Optional field name. If NULL, uses :symbol:`bson_iter_key(iter) `. * ``key_length``: The length of ``key`` or -1 to use strlen(). * ``iter``: A :symbol:`bson_iter_t` located on the position of the element to append. Description ----------- Appends the value at the current position of ``iter`` to the document. Returns ------- Returns ``true`` if successful; ``false`` if the operation would overflow the maximum document size or another invalid state is detected. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_maxkey.rst000066400000000000000000000015771456567454500240530ustar00rootroot00000000000000:man_page: bson_append_maxkey bson_append_maxkey() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_MAXKEY(b, key) \ bson_append_maxkey (b, key, (int) strlen (key)) bool bson_append_maxkey (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_maxkey()` function shall append an element of type BSON_TYPE_MAXKEY to a bson document. This is primarily used in queries and unlikely to be used when storing a document to MongoDB. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_minkey.rst000066400000000000000000000015771456567454500240510ustar00rootroot00000000000000:man_page: bson_append_minkey bson_append_minkey() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_MINKEY(b, key) \ bson_append_minkey (b, key, (int) strlen (key)) bool bson_append_minkey (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_minkey()` function shall append an element of type BSON_TYPE_MINKEY to a bson document. This is primarily used in queries and unlikely to be used when storing a document to MongoDB. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_now_utc.rst000066400000000000000000000014671456567454500242310ustar00rootroot00000000000000:man_page: bson_append_now_utc bson_append_now_utc() ===================== Synopsis -------- .. code-block:: c bool bson_append_now_utc (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_now_utc()` function is a helper to get the current date and time in UTC and append it to ``bson`` as a BSON_TYPE_DATE_TIME element. This function calls :symbol:`bson_append_date_time()` internally. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_null.rst000066400000000000000000000014061456567454500235160ustar00rootroot00000000000000:man_page: bson_append_null bson_append_null() ================== Synopsis -------- .. code-block:: c #define BSON_APPEND_NULL(b, key) bson_append_null (b, key, (int) strlen (key)) bool bson_append_null (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_null()` function shall append a new element to ``bson`` of type BSON_TYPE_NULL. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_oid.rst000066400000000000000000000016551456567454500233250ustar00rootroot00000000000000:man_page: bson_append_oid bson_append_oid() ================= Synopsis -------- .. code-block:: c #define BSON_APPEND_OID(b, key, val) \ bson_append_oid (b, key, (int) strlen (key), val) bool bson_append_oid (bson_t *bson, const char *key, int key_length, const bson_oid_t *oid); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``oid``: A bson_oid_t. Description ----------- The :symbol:`bson_append_oid()` function shall append a new element to ``bson`` of type BSON_TYPE_OID. ``oid`` *MUST* be a pointer to a :symbol:`bson_oid_t`. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``oid`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_regex.rst000066400000000000000000000025431456567454500236610ustar00rootroot00000000000000:man_page: bson_append_regex bson_append_regex() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_REGEX(b, key, val, opt) \ bson_append_regex (b, key, (int) strlen (key), val, opt) bool bson_append_regex (bson_t *bson, const char *key, int key_length, const char *regex, const char *options); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``regex``: An ASCII string containing the regex. * ``options``: An optional string containing the regex options as a string. Description ----------- Appends a new field to ``bson`` of type BSON_TYPE_REGEX. ``regex`` should be the regex string. ``options`` should contain the options for the regex. Valid characters for ``options`` include: * ``'i'`` for case-insensitive. * ``'m'`` for multiple matching. * ``'x'`` for verbose mode. * ``'l'`` to make \w and \W locale dependent. * ``'s'`` for dotall mode ('.' matches everything) * ``'u'`` to make \w and \W match unicode. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the regex grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_regex_w_len.rst000066400000000000000000000026771456567454500250550ustar00rootroot00000000000000:man_page: bson_append_regex_w_len bson_append_regex_w_len() ========================== Synopsis -------- .. code-block:: c bool bson_append_regex_w_len (bson_t *bson, const char *key, int key_length, const char *regex, int regex_length, const char *options); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``regex``: An ASCII string containing the regex. * ``regex_length``: The length of ``regex`` in bytes, or -1 to determine the length with ``strlen()``. * ``options``: An optional string containing the regex options as a string. Description ----------- Appends a new field to ``bson`` of type BSON_TYPE_REGEX. ``regex`` should be the regex string. ``options`` should contain the options for the regex. Valid characters for ``options`` include: * ``'i'`` for case-insensitive. * ``'m'`` for multiple matching. * ``'x'`` for verbose mode. * ``'l'`` to make \w and \W locale dependent. * ``'s'`` for dotall mode ('.' matches everything) * ``'u'`` to make \w and \W match unicode. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the regex grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_symbol.rst000066400000000000000000000023511456567454500240510ustar00rootroot00000000000000:man_page: bson_append_symbol bson_append_symbol() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_SYMBOL(b, key, val) \ bson_append_symbol (b, key, (int) strlen (key), val, (int) strlen (val)) bool bson_append_symbol (bson_t *bson, const char *key, int key_length, const char *value, int length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: The symbol. * ``length``: A length of ``symbol`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- Appends a new field to ``bson`` of type BSON_TYPE_SYMBOL. This BSON type is deprecated and should not be used in new code. Due to legacy behavior, passing ``NULL`` for ``value`` appends a null value, *not* a symbol value. To append a null value directly, prefer using :symbol:`bson_append_null()`. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_time_t.rst000066400000000000000000000016371456567454500240330ustar00rootroot00000000000000:man_page: bson_append_time_t bson_append_time_t() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_TIME_T(b, key, val) \ bson_append_time_t (b, key, (int) strlen (key), val) bool bson_append_time_t (bson_t *bson, const char *key, int key_length, time_t value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A time_t. Description ----------- The :symbol:`bson_append_time_t()` function is a helper that takes a ``time_t`` instead of milliseconds since the UNIX epoch. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_timestamp.rst000066400000000000000000000023751456567454500245550ustar00rootroot00000000000000:man_page: bson_append_timestamp bson_append_timestamp() ======================= Synopsis -------- .. code-block:: c #define BSON_APPEND_TIMESTAMP(b, key, val, inc) \ bson_append_timestamp (b, key, (int) strlen (key), val, inc) bool bson_append_timestamp (bson_t *bson, const char *key, int key_length, uint32_t timestamp, uint32_t increment); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``timestamp``: A uint32_t. * ``increment``: A uint32_t. Description ----------- This function is not similar in functionality to :symbol:`bson_append_date_time()`. Timestamp elements are different in that they include only second precision and an increment field. They are primarily used for intra-MongoDB server communication. The :symbol:`bson_append_timestamp()` function shall append a new element of type BSON_TYPE_TIMESTAMP. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_timeval.rst000066400000000000000000000017021456567454500242040ustar00rootroot00000000000000:man_page: bson_append_timeval bson_append_timeval() ===================== Synopsis -------- .. code-block:: c #define BSON_APPEND_TIMEVAL(b, key, val) \ bson_append_timeval (b, key, (int) strlen (key), val) bool bson_append_timeval (bson_t *bson, const char *key, int key_length, struct timeval *value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A struct timeval. Description ----------- The :symbol:`bson_append_timeval()` function is a helper that takes a ``struct timeval`` instead of milliseconds since the UNIX epoch. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_undefined.rst000066400000000000000000000016451456567454500245120ustar00rootroot00000000000000:man_page: bson_append_undefined bson_append_undefined() ======================= Synopsis -------- .. code-block:: c #define BSON_APPEND_UNDEFINED(b, key) \ bson_append_undefined (b, key, (int) strlen (key)) bool bson_append_undefined (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_undefined()` function shall append a new element to ``bson`` of type BSON_TYPE_UNDEFINED. Undefined is common in Javascript. However, this element type is deprecated and should not be used in new code. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_utf8.rst000066400000000000000000000032531456567454500234340ustar00rootroot00000000000000:man_page: bson_append_utf8 bson_append_utf8() ================== Synopsis -------- .. code-block:: c #define BSON_APPEND_UTF8(b, key, val) \ bson_append_utf8 (b, key, (int) strlen (key), val, (int) strlen (val)) bool bson_append_utf8 (bson_t *bson, const char *key, int key_length, const char *value, int length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A UTF-8 encoded string. * ``length``: The number of bytes in ``value`` excluding the trailing ``\0``, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_utf8()` function shall append a UTF-8 encoded string to ``bson``. ``value`` *MUST* be valid UTF-8. Some UTF-8 implementations allow for ``\0`` to be contained within the string (excluding the termination ``\0``. This is allowed, but remember that it could cause issues with communicating with external systems that do not support it. It is suggested to use modified UTF-8 which uses a 2 byte representation for embedded ``\0`` within the string. This will allow these UTF-8 encoded strings to used with many libc functions. Due to legacy behavior, passing ``NULL`` for ``value`` appends a null value, *not* a UTF8 value. To append a null value directly, prefer using :symbol:`bson_append_null()`. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_append_value.rst000066400000000000000000000017551456567454500236670ustar00rootroot00000000000000:man_page: bson_append_value bson_append_value() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_VALUE(b, key, val) \ bson_append_value (b, key, (int) strlen (key), (val)) bool bson_append_value (bson_t *bson, const char *key, int key_length, const bson_value_t *value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A :symbol:`bson_value_t`. Description ----------- Appends a new field to ``bson`` by determining the boxed type in ``value``. This is useful if you want to copy fields between documents but do not know the field type until runtime. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-1.26.0/src/libbson/doc/bson_array_as_canonical_extended_json.rst000066400000000000000000000032671456567454500277450ustar00rootroot00000000000000:man_page: bson_array_as_canonical_extended_json bson_array_as_canonical_extended_json() ======================================= Synopsis -------- .. code-block:: c char * bson_array_as_canonical_extended_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- The :symbol:`bson_array_as_canonical_extended_json()` encodes ``bson`` as a UTF-8 string in the canonical `MongoDB Extended JSON format`_, except the outermost element is encoded as a JSON array, rather than a JSON document. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. code-block:: c #include int main () { bson_t bson; char *str; bson_init (&bson); /* BSON array is a normal BSON document with integer values for the keys, * starting with 0 and continuing sequentially */ BSON_APPEND_INT32 (&bson, "0", 1); BSON_APPEND_UTF8 (&bson, "1", "bar"); str = bson_array_as_canonical_extended_json (&bson, NULL); /* Prints * [ { "$numberInt" : 1 }, "bar" ] */ printf ("%s\n", str); bson_free (str); bson_destroy (&bson); } .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst mongo-c-driver-1.26.0/src/libbson/doc/bson_array_as_json.rst000066400000000000000000000034171456567454500240530ustar00rootroot00000000000000:man_page: bson_array_as_json bson_array_as_json() ==================== Synopsis -------- .. code-block:: c char * bson_array_as_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- The :symbol:`bson_array_as_json()` function shall encode ``bson`` as a UTF-8 string using libbson's legacy JSON format, except the outermost element is encoded as a JSON array, rather than a JSON document. This function is superseded by :symbol:`bson_array_as_canonical_extended_json()` and :symbol:`bson_array_as_relaxed_extended_json()`, which use the same `MongoDB Extended JSON format`_ as all other MongoDB drivers. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. code-block:: c #include int main () { bson_t bson; char *str; bson_init (&bson); /* BSON array is a normal BSON document with integer values for the keys, * starting with 0 and continuing sequentially */ BSON_APPEND_UTF8 (&bson, "0", "foo"); BSON_APPEND_UTF8 (&bson, "1", "bar"); str = bson_array_as_json (&bson, NULL); /* Prints * [ "foo", "bar" ] */ printf ("%s\n", str); bson_free (str); bson_destroy (&bson); } .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json.rstmongo-c-driver-1.26.0/src/libbson/doc/bson_array_as_relaxed_extended_json.rst000066400000000000000000000032271456567454500274360ustar00rootroot00000000000000:man_page: bson_array_as_relaxed_extended_json bson_array_as_relaxed_extended_json() ===================================== Synopsis -------- .. code-block:: c char * bson_array_as_relaxed_extended_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- The :symbol:`bson_as_relaxed_extended_json()` encodes ``bson`` as a UTF-8 string in the relaxed `MongoDB Extended JSON format`_, except the outermost element is encoded as a JSON array, rather than a JSON document. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. code-block:: c #include int main () { bson_t bson; char *str; bson_init (&bson); /* BSON array is a normal BSON document with integer values for the keys, * starting with 0 and continuing sequentially */ BSON_APPEND_DOUBLE (&bson, "0", 3.14); BSON_APPEND_UTF8 (&bson, "1", "bar"); str = bson_array_as_relaxed_extended_json (&bson, NULL); /* Prints * [ 3.14, "bar" ] */ printf ("%s\n", str); bson_free (str); bson_destroy (&bson); } .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst mongo-c-driver-1.26.0/src/libbson/doc/bson_array_builder_t.rst000066400000000000000000000150031456567454500243620ustar00rootroot00000000000000:man_page: bson_array_builder_t bson_array_builder_t ==================== .. code-block:: c typedef struct _bson_array_builder_t bson_array_builder_t; ``bson_array_builder_t`` may be used to build BSON arrays. ``bson_array_builder_t`` internally tracks and uses the array index as a key ("0", "1", "2", ...) when appending elements. Appending an array value ------------------------ .. code-block:: c typedef struct _bson_array_builder_t bson_array_builder_t; bool bson_append_array_builder_begin (bson_t *bson, const char *key, int key_length, bson_array_builder_t **child); bool bson_append_array_builder_end (bson_t *bson, bson_array_builder_t *child); #define BSON_APPEND_ARRAY_BUILDER_BEGIN(b, key, child) \ bson_append_array_builder_begin (b, key, (int) strlen (key), child) ``bson_append_array_builder_begin`` may be used to append an array as a value. Example: .. literalinclude:: ../examples/creating.c :language: c :start-after: // bson_array_builder_t example ... begin :end-before: // bson_array_builder_t example ... end :dedent: 6 Creating a top-level array -------------------------- .. code-block:: c bson_array_builder_t * bson_array_builder_new (void); bool bson_array_builder_build (bson_array_builder_t *bab, bson_t *out); BSON_EXPORT (void) bson_array_builder_destroy (bson_array_builder_t *bab); ``bson_array_builder_new`` and ``bson_array_builder_build`` may be used to build a top-level BSON array. ``bson_array_builder_build`` initializes and moves BSON data to ``out``. The ``bson_array_builder_t`` may be reused and will start appending a new array at index "0": Example: .. literalinclude:: ../examples/creating.c :language: c :start-after: // bson_array_builder_t top-level example ... begin :end-before: // bson_array_builder_t top-level example ... end :dedent: 6 Appending values to an array ---------------------------- ``bson_array_builder_append_*`` functions are provided to append values to a BSON array. The ``bson_array_builder_append_*`` functions internally use ``bson_append_*`` and provide the array index as a key: .. code-block:: c bool bson_array_builder_append_value (bson_array_builder_t *bab, const bson_value_t *value); bool bson_array_builder_append_array (bson_array_builder_t *bab, const bson_t *array); bool bson_array_builder_append_binary (bson_array_builder_t *bab, bson_subtype_t subtype, const uint8_t *binary, uint32_t length); bool bson_array_builder_append_bool (bson_array_builder_t *bab, bool value); bool bson_array_builder_append_code (bson_array_builder_t *bab, const char *javascript); bool bson_array_builder_append_code_with_scope (bson_array_builder_t *bab, const char *javascript, const bson_t *scope); bool bson_array_builder_append_dbpointer (bson_array_builder_t *bab, const char *collection, const bson_oid_t *oid); bool bson_array_builder_append_double (bson_array_builder_t *bab, double value); bool bson_array_builder_append_document (bson_array_builder_t *bab, const bson_t *value); bool bson_array_builder_append_document_begin (bson_array_builder_t *bab, bson_t *child); bool bson_array_builder_append_document_end (bson_array_builder_t *bab, bson_t *child); bool bson_array_builder_append_int32 (bson_array_builder_t *bab, int32_t value); bool bson_array_builder_append_int64 (bson_array_builder_t *bab, int64_t value); bool bson_array_builder_append_decimal128 (bson_array_builder_t *bab, const bson_decimal128_t *value); bool bson_array_builder_append_iter (bson_array_builder_t *bab, const bson_iter_t *iter); bool bson_array_builder_append_minkey (bson_array_builder_t *bab); bool bson_array_builder_append_maxkey (bson_array_builder_t *bab); bool bson_array_builder_append_null (bson_array_builder_t *bab); bool bson_array_builder_append_oid (bson_array_builder_t *bab, const bson_oid_t *oid); bool bson_array_builder_append_regex (bson_array_builder_t *bab, const char *regex, const char *options); bool bson_array_builder_append_regex_w_len (bson_array_builder_t *bab, const char *regex, int regex_length, const char *options); bool bson_array_builder_append_utf8 (bson_array_builder_t *bab, const char *value, int length); bool bson_array_builder_append_symbol (bson_array_builder_t *bab, const char *value, int length); bool bson_array_builder_append_time_t (bson_array_builder_t *bab, time_t value); bool bson_array_builder_append_timeval (bson_array_builder_t *bab, struct timeval *value); bool bson_array_builder_append_date_time (bson_array_builder_t *bab, int64_t value); bool bson_array_builder_append_now_utc (bson_array_builder_t *bab); bool bson_array_builder_append_timestamp (bson_array_builder_t *bab, uint32_t timestamp, uint32_t increment); bool bson_array_builder_append_undefined (bson_array_builder_t *bab); bool bson_array_builder_append_array_builder_begin (bson_array_builder_t *bab, bson_array_builder_t **child); bool bson_array_builder_append_array_builder_end (bson_array_builder_t *bab, bson_array_builder_t *child); mongo-c-driver-1.26.0/src/libbson/doc/bson_as_canonical_extended_json.rst000066400000000000000000000022211456567454500265340ustar00rootroot00000000000000:man_page: bson_as_canonical_extended_json bson_as_canonical_extended_json() ================================= Synopsis -------- .. code-block:: c char * bson_as_canonical_extended_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- The :symbol:`bson_as_canonical_extended_json()` encodes ``bson`` as a UTF-8 string in the canonical `MongoDB Extended JSON format`_. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. code-block:: c char *str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst mongo-c-driver-1.26.0/src/libbson/doc/bson_as_json.rst000066400000000000000000000030121456567454500226440ustar00rootroot00000000000000:man_page: bson_as_json bson_as_json() ============== Synopsis -------- .. code-block:: c char * bson_as_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- The :symbol:`bson_as_json()` function shall encode ``bson`` as a UTF-8 string using libbson's legacy JSON format. This function is superseded by :symbol:`bson_as_canonical_extended_json()` and :symbol:`bson_as_relaxed_extended_json()`, which use the same `MongoDB Extended JSON format`_ as all other MongoDB drivers. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. code-block:: c #include int main () { bson_t bson; char *str; bson_init (&bson); BSON_APPEND_UTF8 (&bson, "0", "foo"); BSON_APPEND_UTF8 (&bson, "1", "bar"); str = bson_as_json (&bson, NULL); /* Prints * { "0" : "foo", "1" : "bar" } */ printf ("%s\n", str); bson_free (str); bson_destroy (&bson); } .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst mongo-c-driver-1.26.0/src/libbson/doc/bson_as_json_with_opts.rst000066400000000000000000000026761456567454500247630ustar00rootroot00000000000000:man_page: bson_as_json_with_opts bson_as_json_with_opts() ======================== Synopsis -------- .. code-block:: c char * bson_as_json_with_opts (const bson_t *bson, size_t *length, const bson_json_opts_t *opts); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. * ``opts``: A :symbol:`bson_json_opts_t`. Description ----------- The :symbol:`bson_as_json_with_opts()` encodes ``bson`` as a UTF-8 string in the `MongoDB Extended JSON format`_. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. The ``opts`` structure is used to pass options for the encoding process. Please refer to the documentation of :symbol:`bson_json_opts_t` for more details. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. code-block:: c bson_json_opts_t *opts = bson_json_opts_new (BSON_JSON_MODE_CANONICAL, BSON_MAX_LEN_UNLIMITED); char *str = bson_as_json_with_opts (doc, NULL, opts); printf ("%s\n", str); bson_free (str); bson_json_opts_destroy (opts); .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst mongo-c-driver-1.26.0/src/libbson/doc/bson_as_relaxed_extended_json.rst000066400000000000000000000022031456567454500262310ustar00rootroot00000000000000:man_page: bson_as_relaxed_extended_json bson_as_relaxed_extended_json() =============================== Synopsis -------- .. code-block:: c char * bson_as_relaxed_extended_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- The :symbol:`bson_as_relaxed_extended_json()` encodes ``bson`` as a UTF-8 string in the relaxed `MongoDB Extended JSON format`_. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. code-block:: c char *str = bson_as_relaxed_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst mongo-c-driver-1.26.0/src/libbson/doc/bson_ascii_strtoll.rst000066400000000000000000000022331456567454500240670ustar00rootroot00000000000000:man_page: bson_ascii_strtoll bson_ascii_strtoll() ==================== Synopsis -------- .. code-block:: c int64_t bson_ascii_strtoll (const char *str, char **endptr, int base); Parameters ---------- * ``str``: The string to convert. * ``endptr``: Address of the first invalid character of ``str``, or null. * ``base``: The base to use for the conversion. Description ----------- A portable version of ``strtoll()``. Converts a string to a 64-bit signed integer according to the given ``base``, which must be 16, 10, or 8. Leading whitespace will be ignored. If base is 0 is passed in, the base is inferred from the string's leading characters. Base-16 numbers start with "0x" or "0X", base-8 numbers start with "0", base-10 numbers start with a digit from 1 to 9. If ``endptr`` is not NULL, it will be assigned the address of the first invalid character of ``str``, or its null terminating byte if the entire string was valid. If an invalid value is encountered, errno will be set to EINVAL and zero will be returned. If the number is out of range, errno is set to ERANGE and LLONG_MAX or LLONG_MIN is returned. Returns ------- The result of the conversion. mongo-c-driver-1.26.0/src/libbson/doc/bson_check_version.rst000066400000000000000000000011171456567454500240360ustar00rootroot00000000000000:man_page: bson_check_version bson_check_version() ==================== Synopsis -------- .. code-block:: c bool bson_check_version (int required_major, int required_minor, int required_micro); Parameters ---------- * ``required_major``: The minimum major version required. * ``required_minor``: The minimum minor version required. * ``required_micro``: The minimum micro version required. Description ----------- Check at runtime if this release of libbson meets a required version. Returns ------- True if libbson's version is greater than or equal to the required version. mongo-c-driver-1.26.0/src/libbson/doc/bson_compare.rst000066400000000000000000000011351456567454500226420ustar00rootroot00000000000000:man_page: bson_compare bson_compare() ============== Synopsis -------- .. code-block:: c int bson_compare (const bson_t *bson, const bson_t *other); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``other``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_compare()` function shall compare two bson documents for equality. This can be useful in conjunction with _qsort()_. If equal, 0 is returned. .. tip:: This function uses _memcmp()_ internally, so the semantics are the same. Returns ------- less than zero, zero, or greater than zero in ``qsort()`` style. mongo-c-driver-1.26.0/src/libbson/doc/bson_concat.rst000066400000000000000000000010651456567454500224650ustar00rootroot00000000000000:man_page: bson_concat bson_concat() ============= Synopsis -------- .. code-block:: c bool bson_concat (bson_t *dst, const bson_t *src); Parameters ---------- * ``dst``: A :symbol:`bson_t`. * ``src``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_concat()` function shall append the contents of ``src`` to ``dst``. Returns ------- Returns ``true`` if successful; ``false`` if the operation would overflow the maximum document size or another invalid state is detected. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_context_destroy.rst000066400000000000000000000010351456567454500244500ustar00rootroot00000000000000:man_page: bson_context_destroy bson_context_destroy() ====================== Synopsis -------- .. code-block:: c void bson_context_destroy (bson_context_t *context); Parameters ---------- * ``context``: A :symbol:`bson_context_t`. Description ----------- The ``bson_context_destroy()`` function shall release all resources associated with ``context``. Does nothing if ``context`` is NULL. This should be called when you are no longer using a :symbol:`bson_context_t` that you have allocated with :symbol:`bson_context_new()`. mongo-c-driver-1.26.0/src/libbson/doc/bson_context_get_default.rst000066400000000000000000000006441456567454500252470ustar00rootroot00000000000000:man_page: bson_context_get_default bson_context_get_default() ========================== Synopsis -------- .. code-block:: c bson_context_t * bson_context_get_default (void); Returns ------- The ``bson_context_get_default()`` function shall return the default :symbol:`bson_context_t` for the process. This context is created with the flags ``BSON_CONTEXT_THREAD_SAFE`` and ``BSON_CONTEXT_DISABLE_PID_CACHE``.mongo-c-driver-1.26.0/src/libbson/doc/bson_context_new.rst000066400000000000000000000017361456567454500235600ustar00rootroot00000000000000:man_page: bson_context_new bson_context_new() ================== Synopsis -------- .. code-block:: c bson_context_t * bson_context_new (bson_context_flags_t flags); Parameters ---------- * ``flags``: A :symbol:`bson_context_flags_t `. The following ``flags`` may be used: * ``BSON_CONTEXT_NONE`` meaning creating ObjectIDs with this context is not a thread-safe operation. * ``BSON_CONTEXT_DISABLE_PID_CACHE`` meaning creating ObjectIDs will also check if the process has changed by calling ``getpid()`` on every ObjectID generation. The following flags are deprecated and have no effect: - ``BSON_CONTEXT_DISABLE_HOST_CACHE`` - ``BSON_CONTEXT_THREAD_SAFE`` - ``BSON_CONTEXT_USE_TASK_ID`` Description ----------- Creates a new :symbol:`bson_context_t`. This is rarely needed as :symbol:`bson_context_get_default()` serves most use-cases. Returns ------- A newly allocated :symbol:`bson_context_t` that should be freed with :symbol:`bson_context_destroy`. mongo-c-driver-1.26.0/src/libbson/doc/bson_context_t.rst000066400000000000000000000026651456567454500232340ustar00rootroot00000000000000:man_page: bson_context_t bson_context_t ============== BSON OID Generation Context Synopsis -------- .. code-block:: c #include typedef enum { BSON_CONTEXT_NONE = 0, BSON_CONTEXT_DISABLE_PID_CACHE = (1 << 2), } bson_context_flags_t; typedef struct _bson_context_t bson_context_t; bson_context_t * bson_context_get_default (void) BSON_GNUC_CONST; bson_context_t * bson_context_new (bson_context_flags_t flags); void bson_context_destroy (bson_context_t *context); Description ----------- The :symbol:`bson_context_t` structure is context for generation of BSON Object IDs. This context allows overriding behavior of generating ObjectIDs. The flags ``BSON_CONTEXT_NONE``, ``BSON_CONTEXT_THREAD_SAFE``, and ``BSON_CONTEXT_DISABLE_PID_CACHE`` are the only ones used. The others have no effect. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_context_destroy bson_context_get_default bson_context_new Example ------- .. code-block:: c #include int main (int argc, char *argv[]) { bson_context_t *ctx = NULL; bson_oid_t oid; /* use default context, via bson_context_get_default() */ bson_oid_init (&oid, NULL); /* specify a local context for additional control */ ctx = bson_context_new (BSON_CONTEXT_NONE); bson_oid_init (&oid, ctx); bson_context_destroy (ctx); return 0; } mongo-c-driver-1.26.0/src/libbson/doc/bson_copy.rst000066400000000000000000000007701456567454500221720ustar00rootroot00000000000000:man_page: bson_copy bson_copy() =========== Synopsis -------- .. code-block:: c bson_t * bson_copy (const bson_t *bson); Parameters ---------- * ``bson``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_copy()` function shall copy the contents of a bson document into a new :symbol:`bson_t`. The resulting :symbol:`bson_t` should be freed with :symbol:`bson_destroy()`. Returns ------- A newly allocated :symbol:`bson_t` that should be freed with :symbol:`bson_destroy()`. mongo-c-driver-1.26.0/src/libbson/doc/bson_copy_to.rst000066400000000000000000000006741456567454500226770ustar00rootroot00000000000000:man_page: bson_copy_to bson_copy_to() ============== Synopsis -------- .. code-block:: c void bson_copy_to (const bson_t *src, bson_t *dst); Parameters ---------- * ``src``: A :symbol:`bson_t`. * ``dst``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_copy_to()` function shall initialize ``dst`` with a copy of the contents of ``src``. ``dst`` *MUST* be an uninitialized :symbol:`bson_t` to avoid leaking memory. mongo-c-driver-1.26.0/src/libbson/doc/bson_copy_to_excluding.rst000066400000000000000000000017411456567454500247350ustar00rootroot00000000000000:man_page: bson_copy_to_excluding bson_copy_to_excluding() ======================== .. warning:: .. deprecated:: 1.1.0 This function is deprecated and should not be used in new code. Please use :symbol:`bson_copy_to_excluding_noinit()` in new code. Synopsis -------- .. code-block:: c void bson_copy_to_excluding (const bson_t *src, bson_t *dst, const char *first_exclude, ...) BSON_GNUC_NULL_TERMINATED BSON_GNUC_DEPRECATED_FOR (bson_copy_to_excluding_noinit); Parameters ---------- * ``src``: A :symbol:`bson_t`. * ``dst``: A :symbol:`bson_t`. * ``first_exclude``: The first field name to exclude. Description ----------- The :symbol:`bson_copy_to_excluding()` function shall copy all fields from ``src`` to ``dst`` except those specified by the variadic, NULL terminated list of keys starting from ``first_exclude``. .. warning:: :symbol:`bson_init` is called on ``dst``. mongo-c-driver-1.26.0/src/libbson/doc/bson_copy_to_excluding_noinit.rst000066400000000000000000000031051456567454500263110ustar00rootroot00000000000000:man_page: bson_copy_to_excluding_noinit bson_copy_to_excluding_noinit() =============================== Synopsis -------- .. code-block:: c void bson_copy_to_excluding_noinit (const bson_t *src, bson_t *dst, const char *first_exclude, ...) BSON_GNUC_NULL_TERMINATED; Parameters ---------- * ``src``: A :symbol:`bson_t`. * ``dst``: A :symbol:`bson_t`. * ``first_exclude``: The first field name to exclude. Description ----------- The :symbol:`bson_copy_to_excluding_noinit()` function shall copy all fields from ``src`` to ``dst`` except those specified by the variadic, NULL terminated list of keys starting from ``first_exclude``. Works the same way as :symbol:`bson_copy_to_excluding`, except does **not** call :symbol:`bson_init` on ``dst``. This function should be preferred in new code over :symbol:`bson_copy_to_excluding`. .. warning:: This is generally not needed except in very special situations. Example ------- .. code-block:: c #include int main () { bson_t bson; bson_t bson2; char *str; bson_init (&bson); bson_append_int32 (&bson, "a", 1, 1); bson_append_int32 (&bson, "b", 1, 2); bson_append_int32 (&bson, "c", 1, 2); bson_init (&bson2); bson_copy_to_excluding_noinit (&bson, &bson2, "b", NULL); str = bson_as_json (&bson2, NULL); /* Prints * { "a" : 1, "c" : 2 } */ printf ("%s\n", str); bson_free (str); bson_destroy (&bson); bson_destroy (&bson2); } mongo-c-driver-1.26.0/src/libbson/doc/bson_copy_to_excluding_noinit_va.rst000066400000000000000000000016741456567454500270100ustar00rootroot00000000000000:man_page: bson_copy_to_excluding_noinit_va bson_copy_to_excluding_noinit_va() ================================== Synopsis -------- .. code-block:: c void bson_copy_to_excluding_noinit_va (const bson_t *src, bson_t *dst, const char *first_exclude, va_list args); Parameters ---------- * ``src``: A :symbol:`bson_t`. * ``dst``: A :symbol:`bson_t`. * ``first_exclude``: The first field name to exclude. * ``args``: A va_list. Description ----------- The :symbol:`bson_copy_to_excluding_noinit_va()` function shall copy all fields from ``src`` to ``dst`` except those specified by ``first_exclude`` and ``args``. This method works the same way as :symbol:`bson_copy_to_excluding_noinit`, except it takes a va_list. This method does not call :symbol:`bson_init` on ``dst``. .. seealso:: | :symbol:`bson_copy_to_excluding_noinit` mongo-c-driver-1.26.0/src/libbson/doc/bson_count_keys.rst000066400000000000000000000005701456567454500234010ustar00rootroot00000000000000:man_page: bson_count_keys bson_count_keys() ================= Synopsis -------- .. code-block:: c uint32_t bson_count_keys (const bson_t *bson); Parameters ---------- * ``bson``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_count_keys()` function shall count the number of elements within ``bson``. Returns ------- A positive integer or zero. mongo-c-driver-1.26.0/src/libbson/doc/bson_decimal128_from_string.rst000066400000000000000000000015411456567454500254570ustar00rootroot00000000000000:man_page: bson_decimal128_from_string bson_decimal128_from_string() ============================= Synopsis -------- .. code-block:: c bool bson_decimal128_from_string (const char *string, bson_decimal128_t *dec); Parameters ---------- * ``string``: A string containing ASCII encoded Decimal128. * ``dec``: A :symbol:`bson_decimal128_t`. Description ----------- Parses the string containing ascii encoded Decimal128 and initialize the bytes in ``dec``. See the `Decimal128 specification `_ for the exact string format. Returns ------- Returns ``true`` if valid Decimal128 string was provided, otherwise ``false`` and ``dec`` will be set to ``NaN``. Example ------- .. code-block:: c bson_decimal128_t dec; bson_decimal128_from_string ("1.00", &dec); mongo-c-driver-1.26.0/src/libbson/doc/bson_decimal128_from_string_w_len.rst000066400000000000000000000021471456567454500266460ustar00rootroot00000000000000:man_page: bson_decimal128_from_string_w_len bson_decimal128_from_string_w_len() =================================== Synopsis -------- .. code-block:: c bool bson_decimal128_from_string_w_len (const char *string, int len, bson_decimal128_t *dec); Parameters ---------- * ``string``: A string containing ASCII encoded Decimal128. * ``len``: The length of ``string`` in bytes, or -1 meaning the string is null-terminated. * ``dec``: A :symbol:`bson_decimal128_t`. Description ----------- Parses the string containing ascii encoded Decimal128 and initialize the bytes in ``dec``. See the `Decimal128 specification `_ for the exact string format. Returns ------- Returns ``true`` if valid Decimal128 string was provided, otherwise ``false`` and ``dec`` will be set to ``NaN``. Example ------- .. code-block:: c bson_decimal128_t dec; bson_decimal128_from_string_w_len ("1.00", 4, &dec); bson_decimal128_from_string_w_len ("1.00", -1, &dec); mongo-c-driver-1.26.0/src/libbson/doc/bson_decimal128_t.rst000066400000000000000000000031371456567454500233740ustar00rootroot00000000000000:man_page: bson_decimal128_t bson_decimal128_t ================= BSON Decimal128 Abstraction Synopsis -------- .. code-block:: c #include #define BSON_DECIMAL128_STRING 43 #define BSON_DECIMAL128_INF "Infinity" #define BSON_DECIMAL128_NAN "NaN" typedef struct { #if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN uint64_t low; uint64_t high; #elif BSON_BYTE_ORDER == BSON_BIG_ENDIAN uint64_t high; uint64_t low; #endif } bson_decimal128_t; Description ----------- The :symbol:`bson_decimal128_t` structure represents the IEEE-754 Decimal128 data type. The type ``bson_decimal128_t`` is an aggregate that contains two ``uint64_t``\ s, named ``high`` and ``low``. The declaration and layout order between them depends on the endian order of the target platform: ``low`` will always correspond to the low-order bits of the Decimal128 object, while ``high`` corresponds to the high-order bits. The ``bson_decimal128_t`` always has a size of sixteen (``16``), and can be bit-cast to/from a ``_Decimal128``. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_decimal128_from_string bson_decimal128_from_string_w_len bson_decimal128_to_string Example ------- .. code-block:: c #include #include int main (int argc, char *argv[]) { char string[BSON_DECIMAL128_STRING]; bson_decimal128_t decimal128; bson_decimal128_from_string ("100.00", &decimal128); bson_decimal128_to_string (&decimal128, string); printf ("Decimal128 value: %s\n", string); return 0; } mongo-c-driver-1.26.0/src/libbson/doc/bson_decimal128_to_string.rst000066400000000000000000000011011456567454500251260ustar00rootroot00000000000000:man_page: bson_decimal128_to_string bson_decimal128_to_string() =========================== Synopsis -------- .. code-block:: c void bson_decimal128_to_string (const bson_decimal128_t *dec, char *str); Parameters ---------- * ``dec``: A :symbol:`bson_decimal128_t`. * ``str``: A location of length BSON_DECIMAL128_STRING for the resulting string. Description ----------- Converts ``dec`` into a printable string. Example ------- .. code-block:: c char decimal128_string[BSON_DECIMAL128_STRING]; bson_decimal128_to_string (&decimal128t, decimal128_string); mongo-c-driver-1.26.0/src/libbson/doc/bson_destroy.rst000066400000000000000000000007001456567454500227020ustar00rootroot00000000000000:man_page: bson_destroy bson_destroy() ============== Synopsis -------- .. code-block:: c void bson_destroy (bson_t *bson); Parameters ---------- * ``bson``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_destroy()` function shall free an allocated :symbol:`bson_t` structure. Does nothing if ``bson`` is NULL. This function should always be called when you are done with a :symbol:`bson_t` unless otherwise specified. mongo-c-driver-1.26.0/src/libbson/doc/bson_destroy_with_steal.rst000066400000000000000000000024671456567454500251410ustar00rootroot00000000000000:man_page: bson_destroy_with_steal bson_destroy_with_steal() ========================= Synopsis -------- .. code-block:: c uint8_t * bson_destroy_with_steal (bson_t *bson, bool steal, uint32_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``steal``: A bool indicating if the underlying buffer should be stolen. * ``length``: A location for storing the resulting buffer length. Description ----------- The :symbol:`bson_destroy_with_steal()` function shall destroy a :symbol:`bson_t` structure but return the underlying buffer instead of freeing it. If steal is false, this is equivalent to calling bson_destroy(). It is a programming error to call this function on a :symbol:`bson_t` that is not a top-level :symbol:`bson_t`, such as those initialized with :symbol:`bson_append_document_begin()`, :symbol:`bson_append_array_begin()`, and :symbol:`bson_writer_begin()`. Returns ------- :symbol:`bson_destroy_with_steal()` shall return a buffer containing the contents of the :symbol:`bson_t` if ``steal`` is non-zero. This should be freed with :symbol:`bson_free()` when no longer in use. ``length`` will be set to the length of the bson document if non-NULL. .. seealso:: | :symbol:`bson_steal`, a higher-level function that efficiently transfers the contents of one :symbol:`bson_t` to another. mongo-c-driver-1.26.0/src/libbson/doc/bson_equal.rst000066400000000000000000000006221456567454500223230ustar00rootroot00000000000000:man_page: bson_equal bson_equal() ============ Synopsis -------- .. code-block:: c bool bson_equal (const bson_t *bson, const bson_t *other); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``other``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_equal()` function shall return true if both documents are equal. Returns ------- true if both documents are equal. mongo-c-driver-1.26.0/src/libbson/doc/bson_error_t.rst000066400000000000000000000015451456567454500226750ustar00rootroot00000000000000:man_page: bson_error_t bson_error_t ============ BSON Error Encapsulation Synopsis -------- .. code-block:: c #include typedef struct { uint32_t domain; uint32_t code; char message[504]; } bson_error_t; Description ----------- The :symbol:`bson_error_t` structure is used as an out-parameter to pass error information to the caller. It should be stack-allocated and does not requiring freeing. See :doc:`Handling Errors `. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_set_error bson_strerror_r Example ------- .. code-block:: c bson_reader_t *reader; bson_error_t error; reader = bson_reader_new_from_file ("dump.bson", &error); if (!reader) { fprintf ( stderr, "ERROR: %d.%d: %s\n", error.domain, error.code, error.message); } mongo-c-driver-1.26.0/src/libbson/doc/bson_free.rst000066400000000000000000000005251456567454500221370ustar00rootroot00000000000000:man_page: bson_free bson_free() =========== Synopsis -------- .. code-block:: c void bson_free (void *mem); Parameters ---------- * ``mem``: A memory region. Description ----------- This function shall free the memory supplied by ``mem``. This should be used by functions that require you free the result with ``bson_free()``. mongo-c-driver-1.26.0/src/libbson/doc/bson_get_data.rst000066400000000000000000000010001456567454500227530ustar00rootroot00000000000000:man_page: bson_get_data bson_get_data() =============== Synopsis -------- .. code-block:: c const uint8_t * bson_get_data (const bson_t *bson); Parameters ---------- * ``bson``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_get_data()` function shall return the raw buffer of a bson document. This can be used in conjunction with the ``len`` property of a :symbol:`bson_t` if you want to copy the raw buffer around. Returns ------- A buffer which should not be modified or freed. mongo-c-driver-1.26.0/src/libbson/doc/bson_get_major_version.rst000066400000000000000000000005241456567454500247310ustar00rootroot00000000000000:man_page: bson_get_major_version bson_get_major_version() ======================== Synopsis -------- .. code-block:: c int bson_get_major_version (void); Description ----------- Get the first number in libbson's MAJOR.MINOR.MICRO release version. Returns ------- The value of ``BSON_MAJOR_VERSION`` when Libbson was compiled. mongo-c-driver-1.26.0/src/libbson/doc/bson_get_micro_version.rst000066400000000000000000000005241456567454500247320ustar00rootroot00000000000000:man_page: bson_get_micro_version bson_get_micro_version() ======================== Synopsis -------- .. code-block:: c int bson_get_micro_version (void); Description ----------- Get the third number in libbson's MAJOR.MINOR.MICRO release version. Returns ------- The value of ``BSON_MICRO_VERSION`` when Libbson was compiled. mongo-c-driver-1.26.0/src/libbson/doc/bson_get_minor_version.rst000066400000000000000000000005251456567454500247460ustar00rootroot00000000000000:man_page: bson_get_minor_version bson_get_minor_version() ======================== Synopsis -------- .. code-block:: c int bson_get_minor_version (void); Description ----------- Get the middle number in libbson's MAJOR.MINOR.MICRO release version. Returns ------- The value of ``BSON_MINOR_VERSION`` when Libbson was compiled. mongo-c-driver-1.26.0/src/libbson/doc/bson_get_monotonic_time.rst000066400000000000000000000011141456567454500250730ustar00rootroot00000000000000:man_page: bson_get_monotonic_time System Clock ============ BSON Clock Abstraction Synopsis -------- .. code-block:: c int64_t bson_get_monotonic_time (void); int bson_gettimeofday (struct timeval *tv); Description ----------- The clock abstraction in Libbson provides a cross-platform way to handle timeouts within the BSON library. It abstracts the differences in implementations of ``gettimeofday()`` as well as providing a monotonic (incrementing only) clock in microseconds. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongo-c-driver-1.26.0/src/libbson/doc/bson_get_version.rst000066400000000000000000000005061456567454500235410ustar00rootroot00000000000000:man_page: bson_get_version bson_get_version() ================== Synopsis -------- .. code-block:: c const char * bson_get_version (void); Description ----------- A string representation of Libbson's version, formatted something like "1.2.3" or "1.2.3-pre". Returns ------- A string you must not modify or free. mongo-c-driver-1.26.0/src/libbson/doc/bson_has_field.rst000066400000000000000000000007661456567454500231430ustar00rootroot00000000000000:man_page: bson_has_field bson_has_field() ================ Synopsis -------- .. code-block:: c bool bson_has_field (const bson_t *bson, const char *key); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: A string containing the name of the field to check for. Description ----------- Checks to see if key contains an element named ``key``. This also accepts "dotkey" notation such as "a.b.c.d". Returns ------- true if ``key`` was found within ``bson``; otherwise false. mongo-c-driver-1.26.0/src/libbson/doc/bson_init.rst000066400000000000000000000006701456567454500221620ustar00rootroot00000000000000:man_page: bson_init bson_init() =========== Synopsis -------- .. code-block:: c void bson_init (bson_t *b); Parameters ---------- * ``b``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_init()` function shall initialize a :symbol:`bson_t` that is placed on the stack. This is equivalent to initializing a :symbol:`bson_t` to ``BSON_INITIALIZER``. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_init_from_json.rst000066400000000000000000000034601456567454500242360ustar00rootroot00000000000000:man_page: bson_init_from_json bson_init_from_json() ===================== Synopsis -------- .. code-block:: c bool bson_init_from_json (bson_t *bson, const char *data, ssize_t len, bson_error_t *error); Parameters ---------- * ``bson``: Pointer to an uninitialized :symbol:`bson_t`. * ``data``: A UTF-8 encoded string containing valid JSON. * ``len``: The length of ``data`` in bytes excluding a trailing ``\0`` or -1 to determine the length with ``strlen()``. * ``error``: An optional location for a :symbol:`bson_error_t`. Description ----------- The ``bson_init_from_json()`` function will initialize a new :symbol:`bson_t` by parsing the JSON found in ``data``. Only a single JSON object may exist in ``data`` or an error will be set and false returned. ``data`` should be in `MongoDB Extended JSON `_ format. Deprecated behavior ------------------- If there are multiple comma-separated JSONs in ``data``, the keys from all JSONs are merged in the returned BSON. For example, ``{"a": 1},{"b": 2}`` is parsed as ``{"a": 1, "b": 2}``. If the first character encountered after the last valid JSON object is ``{``, all following characters are ignored and no error is set. Otherwise, an error will be set and NULL returned. This deprecated behavior is subject to change in a future release. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if valid JSON was parsed, otherwise ``false`` and ``error`` is set. On success, ``bson`` is initialized and must be freed with :symbol:`bson_destroy`, otherwise ``bson`` is invalid. .. only:: html .. include:: includes/seealso/create-bson.txt .. include:: includes/seealso/json.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_init_static.rst000066400000000000000000000016561456567454500235360ustar00rootroot00000000000000:man_page: bson_init_static bson_init_static() ================== Synopsis -------- .. code-block:: c bool bson_init_static (bson_t *b, const uint8_t *data, size_t length); Parameters ---------- * ``b``: A :symbol:`bson_t`. * ``data``: A buffer to initialize with. * ``length``: The length of ``data`` in bytes. Description ----------- The :symbol:`bson_init_static()` function shall shall initialize a read-only :symbol:`bson_t` on the stack using the data provided. No copies of the data will be made and therefore must remain valid for the lifetime of the :symbol:`bson_t`. The resulting `bson_t` has internal references and therefore must not be copied to avoid dangling pointers in the copy. Returns ------- Returns ``true`` if :symbol:`bson_t` was successfully initialized, otherwise ``false``. The function can fail if ``data`` or ``length`` are invalid. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_isspace.rst000066400000000000000000000007661456567454500226540ustar00rootroot00000000000000:man_page: bson_isspace bson_isspace() ============== Synopsis -------- .. code-block:: c bool bson_isspace (int c); Parameters ---------- * ``c``: A character. Description ----------- A safer alternative to ``isspace`` with additional bounds checking. It is equivalent to ``isspace``, excepts always returns false if ``c`` is out of the inclusive bounds [-1, 255]. Returns ------- A boolean indicating if the ``c`` is considered white-space (as determined by the ``isspace`` function). mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_array.rst000066400000000000000000000013761456567454500233640ustar00rootroot00000000000000:man_page: bson_iter_array bson_iter_array() ================= Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_ARRAY(iter) (bson_iter_type ((iter)) == BSON_TYPE_ARRAY) void bson_iter_array (const bson_iter_t *iter, uint32_t *array_len, const uint8_t **array); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``array_len``: A location for the buffer length. * ``array``: A location for the immutable buffer. Description ----------- The ``bson_iter_array()`` function shall retrieve the raw buffer of a sub-array from ``iter``. ``iter`` *MUST* be on an element that is of type BSON_TYPE_ARRAY. This can be verified with :symbol:`bson_iter_type()` or the ``BSON_ITER_HOLDS_ARRAY()`` macro. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_as_bool.rst000066400000000000000000000011741456567454500236600ustar00rootroot00000000000000:man_page: bson_iter_as_bool bson_iter_as_bool() =================== Synopsis -------- .. code-block:: c bool bson_iter_as_bool (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the current field as if it were a boolean. ``bson_iter_as_bool()`` currently knows how to determine a boolean value from the following types: * BSON_TYPE_BOOL * BSON_TYPE_DOUBLE * BSON_TYPE_INT32 * BSON_TYPE_INT64 * BSON_TYPE_NULL * BSON_TYPE_UNDEFINED * BSON_TYPE_UTF8 BSON_TYPE_UTF8 will always equate to ``true``. Returns ------- true if the field equates to non-zero. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_as_double.rst000066400000000000000000000010261456567454500241730ustar00rootroot00000000000000:man_page: bson_iter_as_double bson_iter_as_double() ===================== Synopsis -------- .. code-block:: c double bson_iter_as_double (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the current field as if it were a double. ``bson_iter_as_double()`` will cast the following types to double * BSON_TYPE_BOOL * BSON_TYPE_DOUBLE * BSON_TYPE_INT32 * BSON_TYPE_INT64 Any other value will return 0. Returns ------- The value type casted to double. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_as_int64.rst000066400000000000000000000010351456567454500236650ustar00rootroot00000000000000:man_page: bson_iter_as_int64 bson_iter_as_int64() ==================== Synopsis -------- .. code-block:: c int64_t bson_iter_as_int64 (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The ``bson_iter_as_int64()`` function shall return the contents of the current element as if it were a BSON_TYPE_INT64 element. The currently supported casts include: * BSON_TYPE_BOOL * BSON_TYPE_DOUBLE * BSON_TYPE_INT32 * BSON_TYPE_INT64 Returns ------- A 64-bit signed integer. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_binary.rst000066400000000000000000000020111456567454500235150ustar00rootroot00000000000000:man_page: bson_iter_binary bson_iter_binary() ================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_BINARY(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_BINARY) void bson_iter_binary (const bson_iter_t *iter, bson_subtype_t *subtype, uint32_t *binary_len, const uint8_t **binary); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``subtype``: A location for a :symbol:`bson_subtype_t` or NULL. * ``binary_len``: A location for the length of ``binary``. * ``binary``: A location for a pointer to the immutable buffer. Description ----------- This function shall return the binary data of a BSON_TYPE_BINARY element. It is a programming error to call this function on a field that is not of type BSON_TYPE_BINARY. You can check this with the BSON_ITER_HOLDS_BINARY() macro or :symbol:`bson_iter_type()`. The buffer that ``binary`` points to is only valid until the iterator's :symbol:`bson_t` is modified or freed. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_bool.rst000066400000000000000000000011721456567454500231730ustar00rootroot00000000000000:man_page: bson_iter_bool bson_iter_bool() ================ Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_BOOL(iter) (bson_iter_type ((iter)) == BSON_TYPE_BOOL) bool bson_iter_bool (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The ``bson_iter_bool()`` function shall return the boolean value of a BSON_TYPE_BOOL element. It is a programming error to call this function on an element other than BSON_TYPE_BOOL. You can check this with :symbol:`bson_iter_type()` or ``BSON_ITER_HOLDS_BOOL()``. Returns ------- Either ``true`` or ``false``. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_code.rst000066400000000000000000000013101456567454500231440ustar00rootroot00000000000000:man_page: bson_iter_code bson_iter_code() ================ Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_CODE(iter) (bson_iter_type ((iter)) == BSON_TYPE_CODE) const char * bson_iter_code (const bson_iter_t *iter, uint32_t *length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: A location for the length of the UTF-8 encoded string or NULL. Description ----------- This function returns the contents of a BSON_TYPE_CODE field. The length of the string is stored in ``length`` if non-NULL. It is invalid to call this function on a field that is not of type BSON_TYPE_CODE. Returns ------- A UTF-8 encoded string which should not be modified or freed. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_codewscope.rst000066400000000000000000000021341456567454500243720ustar00rootroot00000000000000:man_page: bson_iter_codewscope bson_iter_codewscope() ====================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_CODEWSCOPE(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_CODEWSCOPE) const char * bson_iter_codewscope (const bson_iter_t *iter, uint32_t *length, uint32_t *scope_len, const uint8_t **scope); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: An optional location for the length of the resulting UTF-8 encoded string. * ``scope_len``: A optional location for the length of ``scope``. * ``scope``: An optional location to store the immutable raw scope BSON document. Description ----------- The ``bson_iter_codewscope()`` function acts similar to :symbol:`bson_iter_code()` except for BSON_TYPE_CODEWSCOPE elements. It also will provide a pointer to the buffer for scope, which can be loaded into a :symbol:`bson_t` using :symbol:`bson_init_static()`. Returns ------- An UTF-8 encoded string containing the JavaScript code which should not be modified or freed. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_date_time.rst000066400000000000000000000011321456567454500241670ustar00rootroot00000000000000:man_page: bson_iter_date_time bson_iter_date_time() ===================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_DATE_TIME(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DATE_TIME) int64_t bson_iter_date_time (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The bson_iter_date_time() function shall return the number of milliseconds since the UNIX epoch, as contained in the BSON_TYPE_DATE_TIME element. Returns ------- A 64-bit integer containing the number of milliseconds since the UNIX epoch. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_dbpointer.rst000066400000000000000000000013621456567454500242270ustar00rootroot00000000000000:man_page: bson_iter_dbpointer bson_iter_dbpointer() ===================== Synopsis -------- .. code-block:: c void bson_iter_dbpointer (const bson_iter_t *iter, uint32_t *collection_len, const char **collection, const bson_oid_t **oid); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``collection_len``: A location for the length of the collection name. * ``collection``: A location for the collection name.. * ``oid``: A location for a :symbol:`bson_oid_t`. Description ----------- Fetches the contents of a BSON_TYPE_DBPOINTER element. .. warning:: The BSON_TYPE_DBPOINTER field type is deprecated by the BSON spec and should not be used in new code. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_decimal128.rst000066400000000000000000000013011456567454500240630ustar00rootroot00000000000000:man_page: bson_iter_decimal128 bson_iter_decimal128() ====================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_DECIMAL128(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DECIMAL128) bool bson_iter_decimal128 (const bson_iter_t *iter, /* IN */ bson_decimal128_t *dec); /* OUT */ Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``dec``: A location for a :symbol:`bson_decimal128_t`. Description ----------- Fetches the value from a BSON_TYPE_DECIMAL128 field. You should verify that this is a BSON_TYPE_DECIMAL128 field before calling this function. Returns ------- true if type was BSON_TYPE_DECIMAL128, otherwise false. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_document.rst000066400000000000000000000015061456567454500240570ustar00rootroot00000000000000:man_page: bson_iter_document bson_iter_document() ==================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_DOCUMENT(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DOCUMENT) void bson_iter_document (const bson_iter_t *iter, uint32_t *document_len, const uint8_t **document); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``document_len``: A location for the length of the document in bytes. * ``document``: A location for the document buffer. Description ----------- The ``bson_iter_document()`` function shall retrieve the raw buffer of a sub-document from ``iter``. ``iter`` *MUST* be on an element that is of type BSON_TYPE_DOCUMENT. This can be verified with :symbol:`bson_iter_type()` or the ``BSON_ITER_HOLDS_DOCUMENT()`` macro. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_double.rst000066400000000000000000000006441456567454500235150ustar00rootroot00000000000000:man_page: bson_iter_double bson_iter_double() ================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_DOUBLE(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DOUBLE) double bson_iter_double (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the contents of a BSON_TYPE_DOUBLE field. Returns ------- A double. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_dup_utf8.rst000066400000000000000000000010621456567454500237740ustar00rootroot00000000000000:man_page: bson_iter_dup_utf8 bson_iter_dup_utf8() ==================== Synopsis -------- .. code-block:: c char * bson_iter_dup_utf8 (const bson_iter_t *iter, uint32_t *length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: An optional location for the length of the UTF-8 encoded string. Description ----------- This function is similar to :symbol:`bson_iter_utf8()` except that it calls :symbol:`bson_strndup()` on the result. Returns ------- A newly allocated string that should be freed with :symbol:`bson_free()`. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_find.rst000066400000000000000000000013501456567454500231560ustar00rootroot00000000000000:man_page: bson_iter_find bson_iter_find() ================ Synopsis -------- .. code-block:: c bool bson_iter_find (bson_iter_t *iter, const char *key); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``key``: A string containing the requested key. Description ----------- The ``bson_iter_find()`` function shall advance ``iter`` to the first element named ``key`` or exhaust all elements of ``iter``. If ``iter`` is exhausted, false is returned and ``iter`` should be considered invalid. ``key`` is case-sensitive. For a case-folded version, see :symbol:`bson_iter_find_case()`. Returns ------- true is returned if the requested key was found. If not, ``iter`` was exhausted and should now be considered invalid. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_find_case.rst000066400000000000000000000011021456567454500241440ustar00rootroot00000000000000:man_page: bson_iter_find_case bson_iter_find_case() ===================== Synopsis -------- .. code-block:: c bool bson_iter_find_case (bson_iter_t *iter, const char *key); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``key``: An ASCII string containing the field to locate. Description ----------- Advances ``iter`` to the first element matching the name of ``key`` or exhausting all elements. ``key`` is not case-sensitive. The keys will be case-folded to determine a match using the current locale. Returns ------- true if ``key`` was found. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_find_descendant.rst000066400000000000000000000016161456567454500253530ustar00rootroot00000000000000:man_page: bson_iter_find_descendant bson_iter_find_descendant() =========================== Synopsis -------- .. code-block:: c bool bson_iter_find_descendant (bson_iter_t *iter, const char *dotkey, bson_iter_t *descendant); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``dotkey``: A dot-notation key like ``"a.b.c.d"``. * ``descendant``: A :symbol:`bson_iter_t`. Description ----------- The :symbol:`bson_iter_find_descendant()` function shall follow standard MongoDB dot notation to recurse into subdocuments. ``descendant`` will be initialized and advanced to the descendant. If false is returned, both ``iter`` and ``descendant`` should be considered invalid. Returns ------- true is returned if the requested key was found. If not, false is returned and ``iter`` was exhausted and should now be considered invalid. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_find_w_len.rst000066400000000000000000000015241456567454500243450ustar00rootroot00000000000000:man_page: bson_iter_find_w_len bson_iter_find_w_len() ====================== Synopsis -------- .. code-block:: c bool bson_iter_find_w_len (bson_iter_t *iter, const char *key, int keylen); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``key``: A string containing the requested key. * ``keylen``: An integer indicating the length of the key string. Description ----------- The ``bson_iter_find_w_len()`` function shall advance ``iter`` to the first element named ``key`` or exhaust all elements of ``iter``. If ``iter`` is exhausted, false is returned and ``iter`` should be considered invalid. ``key`` is case-sensitive. For a case-folded version, see :symbol:`bson_iter_find_case()`. Returns ------- true is returned if the requested key was found. If not, ``iter`` was exhausted and should now be considered invalid. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_init.rst000066400000000000000000000030701456567454500232020ustar00rootroot00000000000000:man_page: bson_iter_init bson_iter_init() ================ Synopsis -------- .. code-block:: c bool bson_iter_init (bson_iter_t *iter, const bson_t *bson); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``bson``: A :symbol:`bson_t`. Description ----------- The ``bson_iter_init()`` function shall initialize ``iter`` to iterate upon the BSON document ``bson``. Upon initialization, ``iter`` is placed before the first element. Callers must call :symbol:`bson_iter_next()`, :symbol:`bson_iter_find()`, or :symbol:`bson_iter_find_case()` to advance to an element. Returns ------- Returns true if the iter was successfully initialized. Example ------- .. code-block:: c static void print_doc_id (const bson_t *doc) { bson_iter_t iter; bson_oid_t oid; char oidstr[25]; if (bson_iter_init (&iter, doc) && bson_iter_find (&iter, "_id") && BSON_ITER_HOLDS_OID (&iter)) { bson_iter_oid (&iter, &oid); bson_oid_to_string (&oid, oidstr); printf ("%s\n", oidstr); } else { printf ("Document is missing _id.\n"); } } /* alternatively */ static void print_doc_id (const bson_t *doc) { bson_iter_t iter; bson_oid_t oid; char oidstr[25]; if (bson_iter_init_find (&iter, doc, "_id") && BSON_ITER_HOLDS_OID (&iter)) { bson_iter_oid (&iter, &oid); bson_oid_to_string (&oid, oidstr); printf ("%s\n", oidstr); } else { printf ("Document is missing _id.\n"); } } .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_init_find.rst000066400000000000000000000010021456567454500241730ustar00rootroot00000000000000:man_page: bson_iter_init_find bson_iter_init_find() ===================== Synopsis -------- .. code-block:: c bool bson_iter_init_find (bson_iter_t *iter, const bson_t *bson, const char *key); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``bson``: A :symbol:`bson_t`. * ``key``: A key to locate after initializing the iter. Description ----------- This function is identical to ``(bson_iter_init() && bson_iter_find())``. .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_init_find_case.rst000066400000000000000000000011211456567454500251700ustar00rootroot00000000000000:man_page: bson_iter_init_find_case bson_iter_init_find_case() ========================== Synopsis -------- .. code-block:: c bool bson_iter_init_find_case (bson_iter_t *iter, const bson_t *bson, const char *key); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``bson``: A :symbol:`bson_t`. * ``key``: A key to locate after initializing the iter. Description ----------- This function is identical to ``bson_iter_init() && bson_iter_find_case()``. .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_init_find_w_len.rst000066400000000000000000000013061456567454500253660ustar00rootroot00000000000000:man_page: bson_iter_init_find_w_len bson_iter_init_find_w_len() =========================== Synopsis -------- .. code-block:: c bool bson_iter_init_find_w_len (bson_iter_t *iter, const bson_t *bson, const char *key, int keylen); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``bson``: A :symbol:`bson_t`. * ``key``: A key to locate after initializing the iter. * ``keylen``: An integer indicating the length of the key string. Description ----------- This function is identical to ``(bson_iter_init() && bson_iter_find_w_len())``. .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_init_from_data.rst000066400000000000000000000025271456567454500252240ustar00rootroot00000000000000:man_page: bson_iter_init_from_data bson_iter_init_from_data() ========================== Synopsis -------- .. code-block:: c bool bson_iter_init_from_data (bson_iter_t *iter, const uint8_t *data, size_t length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``data``: A buffer to initialize with. * ``length``: The length of ``data`` in bytes. Description ----------- The ``bson_iter_init_from_data()`` function shall initialize ``iter`` to iterate upon the buffer ``data``, which must contain a BSON document. Upon initialization, ``iter`` is placed before the first element. Callers must call :symbol:`bson_iter_next()`, :symbol:`bson_iter_find()`, or :symbol:`bson_iter_find_case()` to advance to an element. Returns ------- Returns true if the iter was successfully initialized. Example ------- .. code-block:: c static void print_doc_id (const uint8_t *data, size_t length) { bson_iter_t iter; bson_oid_t oid; char oidstr[25]; if (bson_iter_init_from_data (&iter, data, length) && bson_iter_find (&iter, "_id") && BSON_ITER_HOLDS_OID (&iter)) { bson_iter_oid (&iter, &oid); bson_oid_to_string (&oid, oidstr); printf ("%s\n", oidstr); } else { printf ("Document is missing _id.\n"); } } .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_init_from_data_at_offset.rst000066400000000000000000000037211456567454500272530ustar00rootroot00000000000000:man_page: bson_iter_init_from_data_at_offset bson_iter_init_from_data_at_offset() ==================================== Synopsis -------- .. code-block:: c bool bson_iter_init_from_data_at_offset (bson_iter_t *iter, const uint8_t *data, size_t length, uint32_t offset, uint32_t keylen); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``data``: A buffer to initialize with. This is not validated. * ``length``: The length of ``data`` in bytes. This is not validated. * ``offset``: The offset of the field to start iterating. This is not validated. This should be an offset previously obtained from :symbol:`bson_iter_offset()`. * ``keylen``: The string length of the key of the field to start iterating. This is not validated. This should be a length previously obtained from :symbol:`bson_iter_key_len()`. Description ----------- Creates a :symbol:`bson_iter_t` and starts iteration on a field at the offset. :symbol:`bson_iter_init_from_data_at_offset` is useful for situations where the progress of a :symbol:`bson_iter_t` must be saved and restored without relying on the :symbol:`bson_iter_t` data layout. Saving the progress could be accomplished by: - Saving the current field's key length with :symbol:`bson_iter_key_len()` - Saving the current offset with :symbol:`bson_iter_offset()` - Saving the data pointer of the iterated :symbol:`bson_t` with :symbol:`bson_get_data()` - Saving the data length of the iterated :symbol:`bson_t` with the ``len`` struct field Then later, these saved values can be passed to :symbol:`bson_iter_init_from_data_at_offset()` to reconstruct the :symbol:`bson_iter_t` in constant time. Returns ------- Returns true if the iter was successfully initialized. .. seealso:: | :symbol:`bson_iter_key_len()` | :symbol:`bson_iter_offset()` | :symbol:`bson_get_data()` mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_int32.rst000066400000000000000000000007721456567454500232040ustar00rootroot00000000000000:man_page: bson_iter_int32 bson_iter_int32() ================= Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_INT32(iter) (bson_iter_type ((iter)) == BSON_TYPE_INT32) int32_t bson_iter_int32 (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the value from a BSON_TYPE_INT32 element. You should verify that the field is a BSON_TYPE_INT32 field before calling this function. Returns ------- A 32-bit integer. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_int64.rst000066400000000000000000000007631456567454500232110ustar00rootroot00000000000000:man_page: bson_iter_int64 bson_iter_int64() ================= Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_INT64(iter) (bson_iter_type ((iter)) == BSON_TYPE_INT64) int64_t bson_iter_int64 (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the value from a BSON_TYPE_INT64 field. You should verify that this is a BSON_TYPE_INT64 field before calling this function. Returns ------- A 64-bit integer. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_key.rst000066400000000000000000000007301456567454500230270ustar00rootroot00000000000000:man_page: bson_iter_key bson_iter_key() =============== Synopsis -------- .. code-block:: c const char * bson_iter_key (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the key for the current element observed by ``iter``. Returns ------- A string which should not be modified or freed. .. seealso:: | :symbol:`bson_iter_key_len()` to retrieve the length of the key in constant time. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_key_len.rst000066400000000000000000000011171456567454500236650ustar00rootroot00000000000000:man_page: bson_iter_key_len bson_iter_key_len() =================== Synopsis -------- .. code-block:: c uint32_t bson_iter_key_len (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the length of the key for the current element observed by ``iter``. This is a constant time computation, and therefore faster than calling ``strlen()`` on a key returned by :symbol:`bson_iter_key()`. Returns ------- An integer representing the key length. .. seealso:: | :symbol:`bson_iter_key()` to retrieve current key. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_next.rst000066400000000000000000000010071456567454500232130ustar00rootroot00000000000000:man_page: bson_iter_next bson_iter_next() ================ Synopsis -------- .. code-block:: c bool bson_iter_next (bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Advances ``iter`` to the next element in the document. Returns ------- true if ``iter`` was advanced. Returns false if ``iter`` has passed the last element in the document or encountered invalid BSON. It is a programming error to use ``iter`` after this function has returned false. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_offset.rst000066400000000000000000000010611456567454500235230ustar00rootroot00000000000000:man_page: bson_iter_offset bson_iter_offset() ================== Synopsis -------- .. code-block:: c uint32_t bson_iter_offset (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the offset for the current element observed by ``iter``. Returns ------- An unsigned integer representing the offset in the BSON data of the current element. .. seealso:: | :symbol:`bson_iter_init_from_data_at_offset()` to use this offset to reconstruct a :symbol:`bson_iter_t` in constant time. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_oid.rst000066400000000000000000000010551456567454500230130ustar00rootroot00000000000000:man_page: bson_iter_oid bson_iter_oid() =============== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_OID(iter) (bson_iter_type ((iter)) == BSON_TYPE_OID) const bson_oid_t * bson_iter_oid (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the :symbol:`bson_oid_t` for a BSON_TYPE_OID element. You should verify it is an element of type BSON_TYPE_OID before calling this function. Returns ------- A :symbol:`bson_oid_t` that should not be modified or freed. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_overwrite_bool.rst000066400000000000000000000011671456567454500253050ustar00rootroot00000000000000:man_page: bson_iter_overwrite_bool bson_iter_overwrite_bool() ========================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_bool (bson_iter_t *iter, bool value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: A bool containing the new value. Description ----------- The ``bson_iter_overwrite_bool()`` function shall overwrite the contents of a BSON_TYPE_BOOL element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_BOOL. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_overwrite_date_time.rst000066400000000000000000000013011456567454500262730ustar00rootroot00000000000000:man_page: bson_iter_overwrite_date_time bson_iter_overwrite_date_time() =============================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_date_time (bson_iter_t *iter, int64_t value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: The date and time as specified in milliseconds since the UNIX epoch. Description ----------- The ``bson_iter_overwrite_date_time()`` function shall overwrite the contents of a BSON_TYPE_DATE_TIME element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_DATE_TIME. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_overwrite_decimal128.rst000066400000000000000000000012641456567454500262010ustar00rootroot00000000000000:man_page: bson_iter_overwrite_decimal128 bson_iter_overwrite_decimal128() ================================ Synopsis -------- .. code-block:: c bool bson_iter_overwrite_decimal128 (bson_iter_t *iter, const bson_decimal128_t *value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: The new Decimal128 value. Description ----------- The :symbol:`bson_iter_overwrite_decimal128()` function shall overwrite the contents of a BSON_TYPE_DECIMAL128 element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_DECIMAL128. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_overwrite_double.rst000066400000000000000000000012021456567454500256120ustar00rootroot00000000000000:man_page: bson_iter_overwrite_double bson_iter_overwrite_double() ============================ Synopsis -------- .. code-block:: c void bson_iter_overwrite_double (bson_iter_t *iter, double value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: The new double value. Description ----------- The :symbol:`bson_iter_overwrite_double()` function shall overwrite the contents of a BSON_TYPE_DOUBLE element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_DOUBLE. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_overwrite_int32.rst000066400000000000000000000011601456567454500253020ustar00rootroot00000000000000:man_page: bson_iter_overwrite_int32 bson_iter_overwrite_int32() =========================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_int32 (bson_iter_t *iter, int32_t value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: A int32_t. Description ----------- The :symbol:`bson_iter_overwrite_int32()` function shall overwrite the contents of a BSON_TYPE_INT32 element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_BOOL. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_overwrite_int64.rst000066400000000000000000000011611456567454500253100ustar00rootroot00000000000000:man_page: bson_iter_overwrite_int64 bson_iter_overwrite_int64() =========================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_int64 (bson_iter_t *iter, int64_t value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: A int64_t. Description ----------- The :symbol:`bson_iter_overwrite_int64()` function shall overwrite the contents of a BSON_TYPE_INT64 element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_INT64. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_overwrite_oid.rst000066400000000000000000000011621456567454500251200ustar00rootroot00000000000000:man_page: bson_iter_overwrite_oid bson_iter_overwrite_oid() ========================= Synopsis -------- .. code-block:: c void bson_iter_overwrite_oid (bson_iter_t *iter, const bson_oid_t *value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``oid``: A :symbol:`bson_oid_t`. Description ----------- The ``bson_iter_overwrite_oid()`` function shall overwrite the contents of a BSON_TYPE_OID element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_OID. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_overwrite_timestamp.rst000066400000000000000000000014041456567454500263470ustar00rootroot00000000000000:man_page: bson_iter_overwrite_timestamp bson_iter_overwrite_timestamp() =============================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_timestamp (bson_iter_t *iter, uint32_t timestamp, uint32_t increment); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``timestamp``: A uint32_t. * ``increment``: A uint32_t. Description ----------- The ``bson_iter_overwrite_timestamp()`` function shall overwrite the contents of a BSON_TYPE_TIMESTAMP element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_TIMESTAMP. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_recurse.rst000066400000000000000000000016161456567454500237130ustar00rootroot00000000000000:man_page: bson_iter_recurse bson_iter_recurse() =================== Synopsis -------- .. code-block:: c bool bson_iter_recurse (const bson_iter_t *iter, bson_iter_t *child); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``child``: A :symbol:`bson_iter_t`. Description ----------- The :symbol:`bson_iter_recurse()` function shall initialize ``child`` using the embedded document or array currently observed by ``iter``. If there was a failure to initialize the ``iter``, false is returned and both ``iter`` and ``child`` should be considered invalid. This should only be called when observing an element of type BSON_TYPE_ARRAY or BSON_TYPE_DOCUMENT. Returns ------- If ``iter`` observes an element of type BSON_TYPE_ARRAY or BSON_TYPE_DOCUMENT, then ``child`` is initialized and the function returns ``true``. Otherwise, the function returns ``false`` and ``child`` is invalid. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_regex.rst000066400000000000000000000012311456567454500233460ustar00rootroot00000000000000:man_page: bson_iter_regex bson_iter_regex() ================= Synopsis -------- .. code-block:: c const char * bson_iter_regex (const bson_iter_t *iter, const char **options); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``options``: A (null). Description ----------- The :symbol:`bson_iter_regex()` function shall retrieve the contents of a BSON_TYPE_REGEX element currently observed by ``iter``. It is invalid to call this function when not observing an element of type BSON_TYPE_REGEX. Returns ------- A string containing the regex which should not be modified or freed. ``options`` is set to the options provided for the regex. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_symbol.rst000066400000000000000000000011511456567454500235420ustar00rootroot00000000000000:man_page: bson_iter_symbol bson_iter_symbol() ================== Synopsis -------- .. code-block:: c const char * bson_iter_symbol (const bson_iter_t *iter, uint32_t *length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: A uint32_t. Description ----------- The symbol element type is *DEPRECATED* in the bson specification at http://bsonspec.org. The :symbol:`bson_iter_symbol()` function shall return the contents of a BSON_TYPE_SYMBOL element. If non-NULL, ``length`` will be set to the length of the resulting string. Returns ------- The symbol and ``length`` is set. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_t.rst000066400000000000000000000104271456567454500225060ustar00rootroot00000000000000:man_page: bson_iter_t bson_iter_t =========== BSON Document Iterator Synopsis -------- .. code-block:: c #include #define BSON_ITER_HOLDS_DOUBLE(iter) /* ... */ #define BSON_ITER_HOLDS_UTF8(iter) /* ... */ #define BSON_ITER_HOLDS_DOCUMENT(iter) /* ... */ #define BSON_ITER_HOLDS_ARRAY(iter) /* ... */ #define BSON_ITER_HOLDS_BINARY(iter) /* ... */ #define BSON_ITER_HOLDS_UNDEFINED(iter) /* ... */ #define BSON_ITER_HOLDS_OID(iter) /* ... */ #define BSON_ITER_HOLDS_BOOL(iter) /* ... */ #define BSON_ITER_HOLDS_DATE_TIME(iter) /* ... */ #define BSON_ITER_HOLDS_NULL(iter) /* ... */ #define BSON_ITER_HOLDS_REGEX(iter) /* ... */ #define BSON_ITER_HOLDS_DBPOINTER(iter) /* ... */ #define BSON_ITER_HOLDS_CODE(iter) /* ... */ #define BSON_ITER_HOLDS_SYMBOL(iter) /* ... */ #define BSON_ITER_HOLDS_CODEWSCOPE(iter) /* ... */ #define BSON_ITER_HOLDS_INT32(iter) /* ... */ #define BSON_ITER_HOLDS_TIMESTAMP(iter) /* ... */ #define BSON_ITER_HOLDS_INT64(iter) /* ... */ #define BSON_ITER_HOLDS_DECIMAL128(iter) /* ... */ #define BSON_ITER_HOLDS_MAXKEY(iter) /* ... */ #define BSON_ITER_HOLDS_MINKEY(iter) /* ... */ #define BSON_ITER_HOLDS_INT(iter) \ (BSON_ITER_HOLDS_INT32 (iter) || BSON_ITER_HOLDS_INT64 (iter)) #define BSON_ITER_HOLDS_NUMBER(iter) \ (BSON_ITER_HOLDS_INT (iter) || BSON_ITER_HOLDS_DOUBLE (iter)) #define BSON_ITER_IS_KEY(iter, key) \ (0 == strcmp ((key), bson_iter_key ((iter)))) typedef struct { /*< private >*/ } bson_iter_t; Description ----------- :symbol:`bson_iter_t` is a structure used to iterate through the elements of a :symbol:`bson_t`. It is meant to be used on the stack and can be discarded at any time as it contains no external allocation. The contents of the structure should be considered private and may change between releases, however the structure size will not change. The :symbol:`bson_t` *MUST* be valid for the lifetime of the iter and it is an error to modify the :symbol:`bson_t` while using the iter. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_iter_array bson_iter_as_bool bson_iter_as_double bson_iter_as_int64 bson_iter_binary bson_iter_bool bson_iter_code bson_iter_codewscope bson_iter_date_time bson_iter_dbpointer bson_iter_decimal128 bson_iter_document bson_iter_double bson_iter_dup_utf8 bson_iter_find bson_iter_find_case bson_iter_find_descendant bson_iter_find_w_len bson_iter_init bson_iter_init_find bson_iter_init_find_case bson_iter_init_find_w_len bson_iter_init_from_data bson_iter_init_from_data_at_offset bson_iter_int32 bson_iter_int64 bson_iter_key bson_iter_key_len bson_iter_next bson_iter_offset bson_iter_oid bson_iter_overwrite_bool bson_iter_overwrite_date_time bson_iter_overwrite_decimal128 bson_iter_overwrite_double bson_iter_overwrite_int32 bson_iter_overwrite_int64 bson_iter_overwrite_oid bson_iter_overwrite_timestamp bson_iter_recurse bson_iter_regex bson_iter_symbol bson_iter_time_t bson_iter_timestamp bson_iter_timeval bson_iter_type bson_iter_utf8 bson_iter_value bson_iter_visit_all Examples -------- .. code-block:: c bson_iter_t iter; if (bson_iter_init (&iter, my_bson_doc)) { while (bson_iter_next (&iter)) { printf ("Found a field named: %s\n", bson_iter_key (&iter)); } } .. code-block:: c bson_iter_t iter; if (bson_iter_init (&iter, my_bson_doc) && bson_iter_find (&iter, "my_field")) { printf ("Found the field named: %s\n", bson_iter_key (&iter)); } .. code-block:: c bson_iter_t iter; bson_iter_t sub_iter; if (bson_iter_init_find (&iter, my_bson_doc, "mysubdoc") && (BSON_ITER_HOLDS_DOCUMENT (&iter) || BSON_ITER_HOLDS_ARRAY (&iter)) && bson_iter_recurse (&iter, &sub_iter)) { while (bson_iter_next (&sub_iter)) { printf ("Found key \"%s\" in sub document.\n", bson_iter_key (&sub_iter)); } } .. code-block:: c bson_iter_t iter; if (bson_iter_init (&iter, my_doc) && bson_iter_find_descendant (&iter, "a.b.c.d", &sub_iter)) { printf ("The type of a.b.c.d is: %d\n", (int) bson_iter_type (&sub_iter)); } mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_time_t.rst000066400000000000000000000007431456567454500235240ustar00rootroot00000000000000:man_page: bson_iter_time_t bson_iter_time_t() ================== Synopsis -------- .. code-block:: c time_t bson_iter_time_t (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The :symbol:`bson_iter_time_t()` function shall return the number of seconds since the UNIX epoch, as contained in the BSON_TYPE_DATE_TIME element. Returns ------- A ``time_t`` containing the number of seconds since the UNIX epoch. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_timestamp.rst000066400000000000000000000015441456567454500242460ustar00rootroot00000000000000:man_page: bson_iter_timestamp bson_iter_timestamp() ===================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_TIMESTAMP(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_TIMESTAMP) void bson_iter_timestamp (const bson_iter_t *iter, uint32_t *timestamp, uint32_t *increment); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``timestamp``: A uint32_t. * ``increment``: A uint32_t. Description ----------- The BSON_TYPE_TIMESTAMP type is not a date/time and is typically used for intra-server communication. You probably want :symbol:`bson_iter_date_time()`. The :symbol:`bson_iter_timestamp()` function shall return the contents of a BSON_TYPE_TIMESTAMP element. It is invalid to call this function while observing an element that is not of type BSON_TYPE_TIMESTAMP. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_timeval.rst000066400000000000000000000007351456567454500237050ustar00rootroot00000000000000:man_page: bson_iter_timeval bson_iter_timeval() =================== Synopsis -------- .. code-block:: c void bson_iter_timeval (const bson_iter_t *iter, struct timeval *tv); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``tv``: A struct timeval. Description ----------- The :symbol:`bson_iter_timeval()` function shall return the number of seconds and microseconds since the UNIX epoch, as contained in the BSON_TYPE_DATE_TIME element into ``tv``. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_type.rst000066400000000000000000000020361456567454500232210ustar00rootroot00000000000000:man_page: bson_iter_type bson_iter_type() ================ Synopsis -------- .. code-block:: c typedef enum { BSON_TYPE_EOD = 0x00, BSON_TYPE_DOUBLE = 0x01, BSON_TYPE_UTF8 = 0x02, BSON_TYPE_DOCUMENT = 0x03, BSON_TYPE_ARRAY = 0x04, BSON_TYPE_BINARY = 0x05, BSON_TYPE_UNDEFINED = 0x06, BSON_TYPE_OID = 0x07, BSON_TYPE_BOOL = 0x08, BSON_TYPE_DATE_TIME = 0x09, BSON_TYPE_NULL = 0x0A, BSON_TYPE_REGEX = 0x0B, BSON_TYPE_DBPOINTER = 0x0C, BSON_TYPE_CODE = 0x0D, BSON_TYPE_SYMBOL = 0x0E, BSON_TYPE_CODEWSCOPE = 0x0F, BSON_TYPE_INT32 = 0x10, BSON_TYPE_TIMESTAMP = 0x11, BSON_TYPE_INT64 = 0x12, BSON_TYPE_MAXKEY = 0x7F, BSON_TYPE_MINKEY = 0xFF, } bson_type_t; bson_type_t bson_iter_type (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The ``bson_iter_type()`` function shall return the type of the observed element in a bson document. Returns ------- A :symbol:`bson_type_t`. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_utf8.rst000066400000000000000000000022331456567454500231250ustar00rootroot00000000000000:man_page: bson_iter_utf8 bson_iter_utf8() ================ Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_UTF8(iter) (bson_iter_type ((iter)) == BSON_TYPE_UTF8) const char * bson_iter_utf8 (const bson_iter_t *iter, uint32_t *length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: An optional location for the length of the resulting UTF-8 encoded string. Description ----------- The :symbol:`bson_iter_utf8()` function shall retrieve the contents of a BSON_TYPE_UTF8 element currently observed by ``iter``. It is invalid to call this function while observing an element other than BSON_TYPE_UTF8. Returns ------- A UTF-8 encoded string that has not been modified or freed. It is suggested that the caller validate the content is valid UTF-8 before using this in other places. That can be done by calling :symbol:`bson_utf8_validate()` or validating the underlying :symbol:`bson_t` before iterating it. Note that not all drivers use multi-byte representation for ``\0`` in UTF-8 encodings (commonly referred to as modified-UTF8). You probably want to take a look at the length field when marshaling to other runtimes. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_value.rst000066400000000000000000000010711456567454500233520ustar00rootroot00000000000000:man_page: bson_iter_value bson_iter_value() ================= Synopsis -------- .. code-block:: c const bson_value_t * bson_iter_value (bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the value for the currently observed type as a boxed type. This allows passing around the value without knowing the type at runtime. If the :symbol:`bson_iter_t` is further modified, the :symbol:`bson_value_t` is invalidated. Returns ------- A :symbol:`bson_value_t` that should not be modified or freed. mongo-c-driver-1.26.0/src/libbson/doc/bson_iter_visit_all.rst000066400000000000000000000015671456567454500242360ustar00rootroot00000000000000:man_page: bson_iter_visit_all bson_iter_visit_all() ===================== Synopsis -------- .. code-block:: c bool bson_iter_visit_all (bson_iter_t *iter, const bson_visitor_t *visitor, void *data); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``visitor``: A :symbol:`bson_visitor_t`. * ``data``: Optional data for ``visitor``. Description ----------- A convenience function to iterate all remaining fields of ``iter`` using the callback vtable provided by ``visitor``. Returns ------- Returns true if visitation was prematurely stopped by a callback function. Returns false either because all elements were visited *or* due to corrupt BSON. See :symbol:`bson_visitor_t` for examples of how to set your own callbacks to provide information about the location of corrupt or unsupported BSON document entries. mongo-c-driver-1.26.0/src/libbson/doc/bson_json_data_reader_ingest.rst000066400000000000000000000010431456567454500260470ustar00rootroot00000000000000:man_page: bson_json_data_reader_ingest bson_json_data_reader_ingest() ============================== Synopsis -------- .. code-block:: c void bson_json_data_reader_ingest (bson_json_reader_t *reader, const uint8_t *data, size_t len); Parameters ---------- * ``reader``: A :symbol:`bson_json_reader_t`. * ``data``: A uint8_t containing data to feed. * ``len``: A size_t containing the length of ``data``. Description ----------- Feed data to a memory based json reader. mongo-c-driver-1.26.0/src/libbson/doc/bson_json_data_reader_new.rst000066400000000000000000000010721456567454500253510ustar00rootroot00000000000000:man_page: bson_json_data_reader_new bson_json_data_reader_new() =========================== Synopsis -------- .. code-block:: c bson_json_reader_t * bson_json_data_reader_new (bool allow_multiple, size_t size); Parameters ---------- * ``allow_multiple``: Unused. * ``size``: A requested buffer size. Description ----------- Creates a new streaming JSON reader that will convert JSON documents to BSON. The ``allow_multiple`` parameter is unused. Returns ------- A newly allocated bson_json_reader_t that should be freed with bson_json_reader_destroy(). mongo-c-driver-1.26.0/src/libbson/doc/bson_json_mode_t.rst000066400000000000000000000011301456567454500235070ustar00rootroot00000000000000:man_page: bson_json_mode_t bson_json_mode_t ================ BSON JSON encoding mode enumeration Synopsis -------- .. code-block:: c #include typedef enum { BSON_JSON_MODE_LEGACY, BSON_JSON_MODE_CANONICAL, BSON_JSON_MODE_RELAXED, } bson_json_mode_t; Description ----------- The :symbol:`bson_json_mode_t` enumeration contains all available modes for encoding BSON into `MongoDB Extended JSON`_. .. seealso:: | :symbol:`bson_as_json_with_opts()` .. _MongoDB Extended JSON: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst mongo-c-driver-1.26.0/src/libbson/doc/bson_json_opts_destroy.rst000066400000000000000000000005621456567454500250060ustar00rootroot00000000000000:man_page: bson_json_opts_destroy bson_json_opts_destroy() ======================== Synopsis -------- .. code-block:: c void bson_json_opts_destroy (bson_json_opts_t *opts); Parameters ---------- * ``opts``: A :symbol:`bson_json_opts_t`. Description ----------- Destroys and releases all resources associated with ``opts``. Does nothing if ``opts`` is NULL. mongo-c-driver-1.26.0/src/libbson/doc/bson_json_opts_new.rst000066400000000000000000000014401456567454500241020ustar00rootroot00000000000000:man_page: bson_json_opts_new bson_json_opts_new() ==================== Synopsis -------- .. code-block:: c bson_json_opts_t * bson_json_opts_new (bson_json_mode_t mode, int32_t max_len); Parameters ---------- * ``mode``: A bson_json_mode_t. * ``max_len``: An int32_t. Description ----------- The :symbol:`bson_json_opts_new()` function shall create a new :symbol:`bson_json_opts_t` using the mode and length supplied. The ``mode`` member is a :symbol:`bson_json_mode_t` defining the encoding mode. The ``max_len`` member holds a maximum length for the resulting JSON string. Encoding will stop once the serialised string has reached this length. To encode the full BSON document, ``BSON_MAX_LEN_UNLIMITED`` can be used. Returns ------- A newly allocated :symbol:`bson_json_opts_t`. mongo-c-driver-1.26.0/src/libbson/doc/bson_json_opts_set_outermost_array.rst000066400000000000000000000011641456567454500274260ustar00rootroot00000000000000:man_page: bson_json_opts_set_outermost_array bson_json_opts_set_outermost_array() ==================================== Synopsis -------- .. code-block:: c void bson_json_opts_set_outermost_array (bson_json_opts_t *opts, bool is_outermost_array); Parameters ---------- * ``opts``: A :symbol:`bson_json_opts_t`. * ``is_outermost_array``: A value determining what we want to set the is_outermost_array variable to. Description ----------- The :symbol:`bson_json_opts_set_outermost_array()` function shall set the ``is_outermost_array`` variable on the :symbol:`bson_json_opts_t` parameter using the boolean provided. mongo-c-driver-1.26.0/src/libbson/doc/bson_json_opts_t.rst000066400000000000000000000021761456567454500235630ustar00rootroot00000000000000:man_page: bson_json_opts_t bson_json_opts_t ================ BSON to JSON encoding options Synopsis -------- .. code-block:: c #include typedef struct _bson_json_opts_t bson_json_opts_t; bson_json_opts_t * bson_json_opts_new (bson_json_mode_t mode, int32_t max_len); void bson_json_opts_destroy (bson_json_opts_t *opts); Description ----------- The :symbol:`bson_json_opts_t` structure contains options for encoding BSON into `MongoDB Extended JSON`_. The ``mode`` member is a :symbol:`bson_json_mode_t` defining the encoding mode. The ``max_len`` member holds a maximum length for the resulting JSON string. Encoding will stop once the serialised string has reached this length. To encode the full BSON document, ``BSON_MAX_LEN_UNLIMITED`` can be used. .. seealso:: | :symbol:`bson_as_json_with_opts()` .. _MongoDB Extended JSON: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_json_opts_new bson_json_opts_destroy bson_json_opts_set_outermost_array mongo-c-driver-1.26.0/src/libbson/doc/bson_json_reader_destroy.rst000066400000000000000000000005421456567454500252610ustar00rootroot00000000000000:man_page: bson_json_reader_destroy bson_json_reader_destroy() ========================== Synopsis -------- .. code-block:: c void bson_json_reader_destroy (bson_json_reader_t *reader); Parameters ---------- * ``reader``: A :symbol:`bson_json_reader_t`. Description ----------- Frees a bson_json_reader_t. Does nothing if ``reader`` is NULL. mongo-c-driver-1.26.0/src/libbson/doc/bson_json_reader_new.rst000066400000000000000000000015521456567454500243630ustar00rootroot00000000000000:man_page: bson_json_reader_new bson_json_reader_new() ====================== Synopsis -------- .. code-block:: c bson_json_reader_t * bson_json_reader_new (void *data, bson_json_reader_cb cb, bson_json_destroy_cb dcb, bool allow_multiple, size_t buf_size); Parameters ---------- * ``data``: A user-defined pointer. * ``cb``: A bson_json_reader_cb. * ``dcb``: A bson_json_destroy_cb. * ``allow_multiple``: Unused. * ``buf_size``: A size_t containing the requested internal buffer size. Description ----------- Creates a new bson_json_reader_t that can read from an arbitrary data source in a streaming fashion. The ``allow_multiple`` parameter is unused. Returns ------- A newly allocated bson_json_reader_t that should be freed with bson_json_reader_destroy(). mongo-c-driver-1.26.0/src/libbson/doc/bson_json_reader_new_from_fd.rst000066400000000000000000000011501456567454500260510ustar00rootroot00000000000000:man_page: bson_json_reader_new_from_fd bson_json_reader_new_from_fd() ============================== Synopsis -------- .. code-block:: c bson_json_reader_t * bson_json_reader_new_from_fd (int fd, bool close_on_destroy); Parameters ---------- * ``fd``: An open file-descriptor. * ``close_on_destroy``: Whether ``close()`` should be called on ``fd`` when the reader is destroyed. Description ----------- Creates a new JSON to BSON converter that will be reading from the file-descriptor ``fd``. Returns ------- A newly allocated bson_json_reader_t that should be freed with bson_json_reader_destroy(). mongo-c-driver-1.26.0/src/libbson/doc/bson_json_reader_new_from_file.rst000066400000000000000000000011771456567454500264100ustar00rootroot00000000000000:man_page: bson_json_reader_new_from_file bson_json_reader_new_from_file() ================================ Synopsis -------- .. code-block:: c bson_json_reader_t * bson_json_reader_new_from_file (const char *filename, bson_error_t *error); Parameters ---------- * ``filename``: A file-name in the system file-name encoding. * ``error``: A :symbol:`bson_error_t`. Description ----------- Creates a new bson_json_reader_t using the underlying file found at ``filename``. Errors ------ Errors are propagated via ``error``. Returns ------- A newly allocated bson_json_reader_t if successful, otherwise NULL and error is set. mongo-c-driver-1.26.0/src/libbson/doc/bson_json_reader_read.rst000066400000000000000000000013411456567454500245010ustar00rootroot00000000000000:man_page: bson_json_reader_read bson_json_reader_read() ======================= Synopsis -------- .. code-block:: c int bson_json_reader_read (bson_json_reader_t *reader, bson_t *bson, bson_error_t *error); Parameters ---------- * ``reader``: A :symbol:`bson_json_reader_t`. * ``bson``: A :symbol:`bson_t`. * ``error``: A :symbol:`bson_error_t`. Description ----------- Reads the next BSON document from the underlying JSON source. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- 1 if successful and data was read. 0 if successful and no data was read. -1 if there was an error. .. only:: html .. include:: includes/seealso/json.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_json_reader_t.rst000066400000000000000000000070641456567454500240410ustar00rootroot00000000000000:man_page: bson_json_reader_t bson_json_reader_t ================== Bulk JSON to BSON conversion Synopsis -------- .. code-block:: c #include typedef struct _bson_json_reader_t bson_json_reader_t; typedef enum { BSON_JSON_ERROR_READ_CORRUPT_JS = 1, BSON_JSON_ERROR_READ_INVALID_PARAM, BSON_JSON_ERROR_READ_CB_FAILURE, } bson_json_error_code_t; Description ----------- The :symbol:`bson_json_reader_t` structure is used for reading a sequence of JSON documents and transforming them to :symbol:`bson_t` documents. This can often be useful if you want to perform bulk operations that are defined in a file containing JSON documents. .. tip:: :symbol:`bson_json_reader_t` works upon JSON documents formatted in `MongoDB extended JSON `_ format. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_json_data_reader_ingest bson_json_data_reader_new bson_json_reader_destroy bson_json_reader_new bson_json_reader_new_from_fd bson_json_reader_new_from_file bson_json_reader_read Example ------- .. code-block:: c /* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each JSON document contained in the provided files * as a BSON string to STDOUT. */ #include #include #include int main (int argc, char *argv[]) { bson_json_reader_t *reader; bson_error_t error; const char *filename; bson_t doc = BSON_INITIALIZER; int i; int b; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s FILE...\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; /* * Open the filename provided in command line arguments. */ if (0 == strcmp (filename, "-")) { reader = bson_json_reader_new_from_fd (STDIN_FILENO, false); } else { if (!(reader = bson_json_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to BSON and print to stdout. */ while ((b = bson_json_reader_read (reader, &doc, &error))) { if (b < 0) { fprintf (stderr, "Error in json parsing:\n%s\n", error.message); abort (); } if (fwrite (bson_get_data (&doc), 1, doc.len, stdout) != doc.len) { fprintf (stderr, "Failed to write to stdout, exiting.\n"); exit (1); } bson_reinit (&doc); } bson_json_reader_destroy (reader); bson_destroy (&doc); } return 0; } mongo-c-driver-1.26.0/src/libbson/doc/bson_malloc.rst000066400000000000000000000011641456567454500224650ustar00rootroot00000000000000:man_page: bson_malloc bson_malloc() ============= Synopsis -------- .. code-block:: c void * bson_malloc (size_t num_bytes); Parameters ---------- * ``num_bytes``: A size_t containing the number of bytes to allocate. Description ----------- This is a portable ``malloc()`` wrapper. In general, this function will return an allocation at least ``sizeof(void*)`` bytes or bigger. If there was a failure to allocate ``num_bytes`` bytes, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS NOT* been zeroed. mongo-c-driver-1.26.0/src/libbson/doc/bson_malloc0.rst000066400000000000000000000012041456567454500225400ustar00rootroot00000000000000:man_page: bson_malloc0 bson_malloc0() ============== Synopsis -------- .. code-block:: c void * bson_malloc0 (size_t num_bytes); Parameters ---------- * ``num_bytes``: A size_t. Description ----------- This is a portable ``malloc()`` wrapper that also sets the memory to zero. Similar to ``calloc()``. In general, this function will return an allocation at least ``sizeof(void*)`` bytes or bigger. If there was a failure to allocate ``num_bytes`` bytes, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS* been zeroed. mongo-c-driver-1.26.0/src/libbson/doc/bson_mem_restore_vtable.rst000066400000000000000000000006511456567454500250740ustar00rootroot00000000000000:man_page: bson_mem_restore_vtable bson_mem_restore_vtable() ========================= Synopsis -------- .. code-block:: c void bson_mem_restore_vtable (void); Description ----------- This function shall restore the default memory allocator to be used by Libbson. .. warning:: This function *MUST* be called at the end of the process. Failure to do so will result in memory being freed by the wrong allocator. mongo-c-driver-1.26.0/src/libbson/doc/bson_mem_set_vtable.rst000066400000000000000000000017551456567454500242120ustar00rootroot00000000000000:man_page: bson_mem_set_vtable bson_mem_set_vtable() ===================== Synopsis -------- .. code-block:: c typedef struct _bson_mem_vtable_t { void *(*malloc) (size_t num_bytes); void *(*calloc) (size_t n_members, size_t num_bytes); void *(*realloc) (void *mem, size_t num_bytes); void (*free) (void *mem); void *(*aligned_alloc) (size_t alignment, size_t num_bytes); void *padding[3]; } bson_mem_vtable_t; void bson_mem_set_vtable (const bson_mem_vtable_t *vtable); Parameters ---------- * ``vtable``: A bson_mem_vtable_t with every non-padding field set. Description ----------- This function shall install a new memory allocator to be used by Libbson. For backwards compatibility, if ``vtable->aligned_alloc`` is not set, calls to ``vtable->aligned_alloc`` will use ``vtable->malloc`` instead. .. warning:: This function *MUST* be called at the beginning of the process. Failure to do so will result in memory being freed by the wrong allocator. mongo-c-driver-1.26.0/src/libbson/doc/bson_memory.rst000066400000000000000000000021311456567454500225210ustar00rootroot00000000000000:man_page: bson_memory Memory Management ================= BSON Memory Abstraction. Description ----------- Libbson contains a lightweight memory abstraction to make portability to new platforms easier. Additionally, it helps us integrate with interesting higher-level languages. One caveat, however, is that Libbson is not designed to deal with Out of Memory (OOM) situations. Doing so requires extreme diligence throughout the application stack that has rarely been implemented correctly. This may change in the future. As it stands now, Libbson will ``abort()`` under OOM situations. To aid in language binding integration, Libbson allows for setting a custom memory allocator via :symbol:`bson_mem_set_vtable()`. This allocation may be reversed via :symbol:`bson_mem_restore_vtable()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_free bson_malloc bson_malloc0 bson_aligned_alloc bson_aligned_alloc0 bson_mem_restore_vtable bson_mem_set_vtable bson_realloc bson_realloc_ctx bson_realloc_func bson_zero_free mongo-c-driver-1.26.0/src/libbson/doc/bson_new.rst000066400000000000000000000007371456567454500220140ustar00rootroot00000000000000:man_page: bson_new bson_new() ========== Synopsis -------- .. code-block:: c bson_t * bson_new (void); Description ----------- The :symbol:`bson_new()` function shall create a new :symbol:`bson_t` structure on the heap. It should be freed with :symbol:`bson_destroy()` when it is no longer in use. Returns ------- A newly allocated :symbol:`bson_t` that should be freed with :symbol:`bson_destroy()`. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_new_from_buffer.rst000066400000000000000000000023611456567454500243630ustar00rootroot00000000000000:man_page: bson_new_from_buffer bson_new_from_buffer() ====================== Synopsis -------- .. code-block:: c bson_t * bson_new_from_buffer (uint8_t **buf, size_t *buf_len, bson_realloc_func realloc_func, void *realloc_func_ctx); Parameters ---------- * ``buf``: An out-pointer to a buffer containing a serialized BSON document, or to NULL. * ``buf_len``: An out-pointer to the length of the buffer in bytes. * ``realloc_func``: Optional :symbol:`bson_realloc_func` for reallocating the buffer. * ``realloc_func_ctx``: Optional pointer that will be passed as ``ctx`` to ``realloc_func``. Description ----------- Creates a new :symbol:`bson_t` using the data provided. The ``realloc_func``, if provided, is called to resize ``buf`` if the document is later expanded, for example by a call to one of the ``bson_append`` functions. If ``*buf`` is initially NULL then it is allocated, using ``realloc_func`` or the default allocator, and initialized with an empty BSON document, and ``*buf_len`` is set to 5, the size of an empty document. Returns ------- A newly-allocated :symbol:`bson_t` on success, or NULL. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_new_from_data.rst000066400000000000000000000012671456567454500240270ustar00rootroot00000000000000:man_page: bson_new_from_data bson_new_from_data() ==================== Synopsis -------- .. code-block:: c bson_t * bson_new_from_data (const uint8_t *data, size_t length); Parameters ---------- * ``data``: A BSON encoded document buffer. * ``length``: The length of ``data`` in bytes. Description ----------- The :symbol:`bson_new_from_data()` function shall create a new :symbol:`bson_t` on the heap and copy the contents of ``data``. This may be helpful when working with language bindings but is generally expected to be slower. Returns ------- A newly allocated :symbol:`bson_t` if successful, otherwise NULL. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_new_from_json.rst000066400000000000000000000025461456567454500240700ustar00rootroot00000000000000:man_page: bson_new_from_json bson_new_from_json() ==================== Synopsis -------- .. code-block:: c bson_t * bson_new_from_json (const uint8_t *data, ssize_t len, bson_error_t *error); Parameters ---------- * ``data``: A UTF-8 encoded string containing valid JSON. * ``len``: The length of ``data`` in bytes excluding a trailing ``\0`` or -1 to determine the length with ``strlen()``. * ``error``: An optional location for a :symbol:`bson_error_t`. Description ----------- The ``bson_new_from_json()`` function allocates and initializes a new :symbol:`bson_t` by parsing the JSON found in ``data``. Only a single JSON object may exist in ``data`` or an error will be set and NULL returned. Deprecated behavior: If there are multiple comma-separated JSONs in ``data``, the keys from all JSONs are merged in the returned BSON. For example, ``{"a": 1},{"b": 2}`` is parsed as ``{"a": 1, "b": 2}``. If the first character encountered after the last valid JSON object is ``{``, all following characters are ignored and no error is set. Otherwise, an error will be set and NULL returned. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- A newly allocated :symbol:`bson_t` if successful, otherwise NULL and ``error`` is set. .. only:: html .. include:: includes/seealso/create-bson.txt .. include:: includes/seealso/json.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_compare.rst000066400000000000000000000007761456567454500235070ustar00rootroot00000000000000:man_page: bson_oid_compare bson_oid_compare() ================== Synopsis -------- .. code-block:: c int bson_oid_compare (const bson_oid_t *oid1, const bson_oid_t *oid2); Parameters ---------- * ``oid1``: A :symbol:`bson_oid_t`. * ``oid2``: A :symbol:`bson_oid_t`. Description ----------- The :symbol:`bson_oid_compare()` function shall return a qsort() style value of a lexicographical sort of ``oid1`` and ``oid2``. Returns ------- less than 0, 0, or greater than 0 based on the comparison. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_compare_unsafe.rst000066400000000000000000000005101456567454500250320ustar00rootroot00000000000000:man_page: bson_oid_compare_unsafe bson_oid_compare_unsafe() ========================= Synopsis -------- .. code-block:: c static inline int bson_oid_compare_unsafe (const bson_oid_t *oid1, const bson_oid_t *oid2); Description ----------- Identical to :symbol:`bson_oid_compare()`, but performs no integrity checking. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_copy.rst000066400000000000000000000005001456567454500230140ustar00rootroot00000000000000:man_page: bson_oid_copy bson_oid_copy() =============== Synopsis -------- .. code-block:: c void bson_oid_copy (const bson_oid_t *src, bson_oid_t *dst); Parameters ---------- * ``src``: A :symbol:`bson_oid_t`. * ``dst``: A :symbol:`bson_oid_t`. Description ----------- Copies the contents of src into dst. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_copy_unsafe.rst000066400000000000000000000004621456567454500243640ustar00rootroot00000000000000:man_page: bson_oid_copy_unsafe bson_oid_copy_unsafe() ====================== Synopsis -------- .. code-block:: c static inline void bson_oid_copy_unsafe (const bson_oid_t *src, bson_oid_t *dst); Description ----------- Identical to :symbol:`bson_oid_copy()`, but performs no integrity checking. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_equal.rst000066400000000000000000000006251456567454500231610ustar00rootroot00000000000000:man_page: bson_oid_equal bson_oid_equal() ================ Synopsis -------- .. code-block:: c bool bson_oid_equal (const bson_oid_t *oid1, const bson_oid_t *oid2); Parameters ---------- * ``oid1``: A :symbol:`bson_oid_t`. * ``oid2``: A :symbol:`bson_oid_t`. Description ----------- Checks if two bson_oid_t contain the same bytes. Returns ------- true if they are equal, otherwise false. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_equal_unsafe.rst000066400000000000000000000004771456567454500245270ustar00rootroot00000000000000:man_page: bson_oid_equal_unsafe bson_oid_equal_unsafe() ======================= Synopsis -------- .. code-block:: c static inline bool bson_oid_equal_unsafe (const bson_oid_t *oid1, const bson_oid_t *oid2); Description ----------- Identical to :symbol:`bson_oid_equal()`, but performs no integrity checking. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_get_time_t.rst000066400000000000000000000006341456567454500241720ustar00rootroot00000000000000:man_page: bson_oid_get_time_t bson_oid_get_time_t() ===================== Synopsis -------- .. code-block:: c time_t bson_oid_get_time_t (const bson_oid_t *oid); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. Description ----------- Fetches the generation time in seconds since the UNIX Epoch of ``oid``. Returns ------- A time_t containing the seconds since the UNIX epoch of ``oid``. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_get_time_t_unsafe.rst000066400000000000000000000005011456567454500255240ustar00rootroot00000000000000:man_page: bson_oid_get_time_t_unsafe bson_oid_get_time_t_unsafe() ============================ Synopsis -------- .. code-block:: c static inline time_t bson_oid_get_time_t_unsafe (const bson_oid_t *oid); Description ----------- Identical to :symbol:`bson_oid_get_time_t()`, but performs no integrity checking. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_hash.rst000066400000000000000000000005151456567454500227730ustar00rootroot00000000000000:man_page: bson_oid_hash bson_oid_hash() =============== Synopsis -------- .. code-block:: c uint32_t bson_oid_hash (const bson_oid_t *oid); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. Description ----------- Generates a hash code for ``oid`` suitable for a hashtable. Returns ------- A 32-bit hash code. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_hash_unsafe.rst000066400000000000000000000004451456567454500243360ustar00rootroot00000000000000:man_page: bson_oid_hash_unsafe bson_oid_hash_unsafe() ====================== Synopsis -------- .. code-block:: c static inline uint32_t bson_oid_hash_unsafe (const bson_oid_t *oid); Description ----------- Identical to :symbol:`bson_oid_hash()`, but performs no integrity checking. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_init.rst000066400000000000000000000006401456567454500230120ustar00rootroot00000000000000:man_page: bson_oid_init bson_oid_init() =============== Synopsis -------- .. code-block:: c void bson_oid_init (bson_oid_t *oid, bson_context_t *context); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. * ``context``: An *optional* :symbol:`bson_context_t` or NULL. Description ----------- Generates a new :symbol:`bson_oid_t` using either ``context`` or the default :symbol:`bson_context_t`. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_init_from_data.rst000066400000000000000000000006261456567454500250320ustar00rootroot00000000000000:man_page: bson_oid_init_from_data bson_oid_init_from_data() ========================= Synopsis -------- .. code-block:: c void bson_oid_init_from_data (bson_oid_t *oid, const uint8_t *data); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. * ``data``: A buffer containing 12 bytes for the oid. Description ----------- Initializes a :symbol:`bson_oid_t` using the raw buffer provided. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_init_from_string.rst000066400000000000000000000010321456567454500254170ustar00rootroot00000000000000:man_page: bson_oid_init_from_string bson_oid_init_from_string() =========================== Synopsis -------- .. code-block:: c void bson_oid_init_from_string (bson_oid_t *oid, const char *str); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. * ``str``: A string containing a hex encoded version of the oid. Description ----------- Parses the string containing hex encoded oid and initialize the bytes in ``oid``. Example ------- .. code-block:: c bson_oid_init_from_string (&oid, "012345678901234567890123"); mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_init_from_string_unsafe.rst000066400000000000000000000005501456567454500267640ustar00rootroot00000000000000:man_page: bson_oid_init_from_string_unsafe bson_oid_init_from_string_unsafe() ================================== Synopsis -------- .. code-block:: c static inline void bson_oid_init_from_string_unsafe (bson_oid_t *oid, const char *str); Description ----------- Identical to :symbol:`bson_oid_init_from_string()`, but performs no integrity checking. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_init_sequence.rst000066400000000000000000000016211456567454500247020ustar00rootroot00000000000000:man_page: bson_oid_init_sequence bson_oid_init_sequence() ======================== .. warning:: .. deprecated:: 1.14.0 This function is deprecated and should not be used in new code. Please use :symbol:`bson_oid_init()` in new code. Synopsis -------- .. code-block:: c void bson_oid_init_sequence (bson_oid_t *oid, bson_context_t *context) BSON_GNUC_DEPRECATED_FOR (bson_oid_init); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. * ``context``: An optional :symbol:`bson_context_t`. Description ----------- Generates a new ObjectID with the next 64-bit sequence number in ``context``. The first 4 bytes contain the current time and the following 8 contain the sequence number in big-endian format. The :symbol:`bson_oid_t` generated by this function is not guaranteed to be globally unique. Only unique within this context. It is however, guaranteed to be sequential. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_is_valid.rst000066400000000000000000000006271456567454500236460ustar00rootroot00000000000000:man_page: bson_oid_is_valid bson_oid_is_valid() =================== Synopsis -------- .. code-block:: c bool bson_oid_is_valid (const char *str, size_t length); Parameters ---------- * ``str``: A string. * ``length``: The length of ``str``. Description ----------- Checks if a string containing a hex encoded string is a valid BSON ObjectID. Returns ------- true if ``str`` could be parsed. mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_t.rst000066400000000000000000000043211456567454500223120ustar00rootroot00000000000000:man_page: bson_oid_t bson_oid_t ========== BSON ObjectID Abstraction Synopsis -------- .. code-block:: c #include typedef struct { uint8_t bytes[12]; } bson_oid_t; Description ----------- The :symbol:`bson_oid_t` structure contains the 12-byte ObjectId notation defined by the `BSON ObjectID specification `_. ObjectId is a 12-byte BSON type, constructed using: * a 4-byte value representing the seconds since the Unix epoch (in Big Endian). * a 5-byte random value. * a 3-byte counter (Big Endian), starting with a random value. String Conversion ----------------- You can convert an Object ID to a string using :symbol:`bson_oid_to_string()` and back with :symbol:`bson_oid_init_from_string()`. Hashing ------- A :symbol:`bson_oid_t` can be used in hashtables using the function :symbol:`bson_oid_hash()` and :symbol:`bson_oid_equal()`. Comparing --------- A :symbol:`bson_oid_t` can be compared to another using :symbol:`bson_oid_compare()` for ``qsort()`` style comparing and :symbol:`bson_oid_equal()` for direct equality. Validating ---------- You can validate that a string containing a hex-encoded ObjectID is valid using the function :symbol:`bson_oid_is_valid()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_oid_compare bson_oid_compare_unsafe bson_oid_copy bson_oid_copy_unsafe bson_oid_equal bson_oid_equal_unsafe bson_oid_get_time_t bson_oid_get_time_t_unsafe bson_oid_hash bson_oid_hash_unsafe bson_oid_init bson_oid_init_from_data bson_oid_init_from_string bson_oid_init_from_string_unsafe bson_oid_init_sequence bson_oid_is_valid bson_oid_to_string Example ------- .. code-block:: c #include #include int main (int argc, char *argv[]) { bson_oid_t oid; char str[25]; bson_oid_init (&oid, NULL); bson_oid_to_string (&oid, str); printf ("%s\n", str); if (bson_oid_is_valid (str, sizeof str)) { bson_oid_init_from_string (&oid, str); } printf ("The UNIX time was: %u\n", (unsigned) bson_oid_get_time_t (&oid)); return 0; } mongo-c-driver-1.26.0/src/libbson/doc/bson_oid_to_string.rst000066400000000000000000000005451456567454500240630ustar00rootroot00000000000000:man_page: bson_oid_to_string bson_oid_to_string() ==================== Synopsis -------- .. code-block:: c void bson_oid_to_string (const bson_oid_t *oid, char str[25]); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. * ``str``: A location for the resulting string. Description ----------- Converts ``oid`` into a hex encoded string. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_destroy.rst000066400000000000000000000005501456567454500242270ustar00rootroot00000000000000:man_page: bson_reader_destroy bson_reader_destroy() ===================== Synopsis -------- .. code-block:: c void bson_reader_destroy (bson_reader_t *reader); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. Description ----------- Destroys and releases all resources associated with ``reader``. Does nothing if ``reader`` is NULL. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_destroy_func_t.rst000066400000000000000000000011041456567454500255610ustar00rootroot00000000000000:man_page: bson_reader_destroy_func_t bson_reader_destroy_func_t ========================== Synopsis -------- .. code-block:: c typedef void (*bson_reader_destroy_func_t) (void *handle); Parameters ---------- * ``handle``: The opaque handle provided to :symbol:`bson_reader_new_from_handle`. Description ----------- An optional callback function that will be called when a :symbol:`bson_reader_t` created with :symbol:`bson_reader_new_from_handle` is destroyed with :symbol:`bson_reader_destroy()`. The handle used when creating the reader is passed to this callback. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_new_from_data.rst000066400000000000000000000011271456567454500253440ustar00rootroot00000000000000:man_page: bson_reader_new_from_data bson_reader_new_from_data() =========================== Synopsis -------- .. code-block:: c bson_reader_t * bson_reader_new_from_data (const uint8_t *data, size_t length); Parameters ---------- * ``data``: A uint8_t. * ``length``: A size_t. Description ----------- The :symbol:`bson_reader_new_from_data()` function shall create a new :symbol:`bson_reader_t` using the buffer supplied. ``data`` is not copied and *MUST* be valid for the lifetime of the resulting :symbol:`bson_reader_t`. Returns ------- A newly allocated :symbol:`bson_reader_t`. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_new_from_fd.rst000066400000000000000000000014631456567454500250270ustar00rootroot00000000000000:man_page: bson_reader_new_from_fd bson_reader_new_from_fd() ========================= Synopsis -------- .. code-block:: c bson_reader_t * bson_reader_new_from_fd (int fd, bool close_on_destroy); Parameters ---------- * ``fd``: A valid file-descriptor. * ``close_on_destroy``: Whether ``close()`` should be called on ``fd`` when the reader is destroyed. Description ----------- The :symbol:`bson_reader_new_from_fd()` function shall create a new :symbol:`bson_reader_t` that will read from the provided file-descriptor. fd *MUST* be in blocking mode. If ``close_fd`` is true, then ``fd`` will be closed when the :symbol:`bson_reader_t` is destroyed with :symbol:`bson_reader_destroy()`. Returns ------- A newly allocated :symbol:`bson_reader_t` that should be freed with :symbol:`bson_reader_destroy`. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_new_from_file.rst000066400000000000000000000011461456567454500253530ustar00rootroot00000000000000:man_page: bson_reader_new_from_file bson_reader_new_from_file() =========================== Synopsis -------- .. code-block:: c bson_reader_t * bson_reader_new_from_file (const char *path, bson_error_t *error); Parameters ---------- * ``path``: A filename in the host filename encoding. * ``error``: A :symbol:`bson_error_t`. Description ----------- Creates a new :symbol:`bson_reader_t` using the file denoted by ``filename``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- A newly allocated :symbol:`bson_reader_t` on success, otherwise NULL and error is set. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_new_from_handle.rst000066400000000000000000000013531456567454500256670ustar00rootroot00000000000000:man_page: bson_reader_new_from_handle bson_reader_new_from_handle() ============================= Synopsis -------- .. code-block:: c bson_reader_t * bson_reader_new_from_handle (void *handle, bson_reader_read_func_t rf, bson_reader_destroy_func_t df); Parameters ---------- * ``handle``: A user-provided pointer or NULL. * ``rf``: A :symbol:`bson_reader_read_func_t`. * ``df``: A :symbol:`bson_reader_destroy_func_t`. Description ----------- This function allows for a pluggable data stream for the reader. This can be used to read from sockets, files, memory, or other arbitrary sources. Returns ------- A newly allocated bson_reader_t if successful; otherwise NULL. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_read.rst000066400000000000000000000017271456567454500234600ustar00rootroot00000000000000:man_page: bson_reader_read bson_reader_read() ================== Synopsis -------- .. code-block:: c const bson_t * bson_reader_read (bson_reader_t *reader, bool *reached_eof); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. * ``reached_eof``: A UNKNOWN. Description ----------- The :symbol:`bson_reader_read()` function shall read the next document from the underlying file-descriptor or buffer. If there are no further documents or a failure was detected, then NULL is returned. If we reached the end of the sequence, ``reached_eof`` is set to true. To detect an error, check for NULL and ``reached_of`` is false. Returns ------- A :symbol:`bson_t` that should not be modified or freed. Example ------- .. code-block:: c const bson_t *doc; bool reached_eof = false; while ((doc = bson_reader_read (reader, &reached_eof))) { /* do something */ } if (!reached_eof) { fprintf (stderr, "Failed to read all documents.\n"); } mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_read_func_t.rst000066400000000000000000000015301456567454500250060ustar00rootroot00000000000000:man_page: bson_reader_read_func_t bson_reader_read_func_t ======================= Synopsis -------- .. code-block:: c typedef ssize_t (*bson_reader_read_func_t) (void *handle, void *buf, size_t count); Parameters ---------- * ``handle``: The handle to read from. * ``buf``: The buffer to read into. * ``count``: The number of bytes to read. Description ----------- A callback function that will be called by :symbol:`bson_reader_t` to read the next chunk of data from the underlying opaque file descriptor. This function is meant to operate similar to the ``read(2)`` function as part of libc on UNIX-like systems. Returns ------- 0 for end of stream. -1 for a failure on read. A value greater than zero for the number of bytes read into ``buf``. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_reset.rst000066400000000000000000000006771456567454500236720ustar00rootroot00000000000000:man_page: bson_reader_reset bson_reader_reset() =================== Synopsis -------- .. code-block:: c void bson_reader_reset (bson_reader_t *reader); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. Description ----------- Seeks to the beginning of the underlying buffer. Valid only for a reader created from a buffer with :symbol:`bson_reader_new_from_data`, not one created from a file, file descriptor, or handle. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_set_destroy_func.rst000066400000000000000000000010721456567454500261150ustar00rootroot00000000000000:man_page: bson_reader_set_destroy_func bson_reader_set_destroy_func() ============================== Synopsis -------- .. code-block:: c void bson_reader_set_destroy_func (bson_reader_t *reader, bson_reader_destroy_func_t func); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. * ``func``: A :symbol:`bson_reader_destroy_func_t`. Description ----------- Allows for setting a callback to be executed when a reader is destroyed. This should only be used by implementations implementing their own read callbacks. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_set_read_func.rst000066400000000000000000000007061456567454500253420ustar00rootroot00000000000000:man_page: bson_reader_set_read_func bson_reader_set_read_func() =========================== Synopsis -------- .. code-block:: c void bson_reader_set_read_func (bson_reader_t *reader, bson_reader_read_func_t func); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. * ``func``: A :symbol:`bson_reader_read_func_t`. Description ----------- Sets the function to read more data from the underlying stream in a custom bson_reader_t. mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_t.rst000066400000000000000000000066261456567454500230130ustar00rootroot00000000000000:man_page: bson_reader_t bson_reader_t ============= Streaming BSON Document Reader Synopsis -------- .. code-block:: c #include typedef struct _bson_reader_t bson_reader_t; bson_reader_t * bson_reader_new_from_handle (void *handle, bson_reader_read_func_t rf, bson_reader_destroy_func_t df); bson_reader_t * bson_reader_new_from_fd (int fd, bool close_on_destroy); bson_reader_t * bson_reader_new_from_file (const char *path, bson_error_t *error); bson_reader_t * bson_reader_new_from_data (const uint8_t *data, size_t length); void bson_reader_destroy (bson_reader_t *reader); Description ----------- :symbol:`bson_reader_t` is a structure used for reading a sequence of BSON documents. The sequence can come from a file-descriptor, memory region, or custom callbacks. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_reader_destroy bson_reader_destroy_func_t bson_reader_new_from_data bson_reader_new_from_fd bson_reader_new_from_file bson_reader_new_from_handle bson_reader_read bson_reader_read_func_t bson_reader_reset bson_reader_set_destroy_func bson_reader_set_read_func bson_reader_tell Example ------- .. code-block:: c /* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each BSON document contained in the provided files * as a JSON string to STDOUT. */ #include #include int main (int argc, char *argv[]) { bson_reader_t *reader; const bson_t *b; bson_error_t error; const char *filename; char *str; int i; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s [FILE | -]...\nUse - for STDIN.\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; if (strcmp (filename, "-") == 0) { reader = bson_reader_new_from_fd (STDIN_FILENO, false); } else { if (!(reader = bson_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to JSON and print to stdout. */ while ((b = bson_reader_read (reader, NULL))) { str = bson_as_canonical_extended_json (b, NULL); fprintf (stdout, "%s\n", str); bson_free (str); } /* * Cleanup after our reader, which closes the file descriptor. */ bson_reader_destroy (reader); } return 0; } mongo-c-driver-1.26.0/src/libbson/doc/bson_reader_tell.rst000066400000000000000000000006071456567454500235010ustar00rootroot00000000000000:man_page: bson_reader_tell bson_reader_tell() ================== Synopsis -------- .. code-block:: c off_t bson_reader_tell (bson_reader_t *reader); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. Description ----------- Tells the current position within the underlying stream. Returns ------- -1 on failure, otherwise the offset within the underlying stream. mongo-c-driver-1.26.0/src/libbson/doc/bson_realloc.rst000066400000000000000000000013211456567454500226320ustar00rootroot00000000000000:man_page: bson_realloc bson_realloc() ============== Synopsis -------- .. code-block:: c void * bson_realloc (void *mem, size_t num_bytes); Parameters ---------- * ``mem``: A memory region. * ``num_bytes``: A size_t containing the new requested size. Description ----------- This is a portable ``realloc()`` wrapper. In general, this function will return an allocation at least ``sizeof(void*)`` bytes or bigger. If ``num_bytes`` is 0, then the allocation will be freed. If there was a failure to allocate ``num_bytes`` bytes, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS NOT* been zeroed. mongo-c-driver-1.26.0/src/libbson/doc/bson_realloc_ctx.rst000066400000000000000000000010171456567454500235120ustar00rootroot00000000000000:man_page: bson_realloc_ctx bson_realloc_ctx() ================== Synopsis -------- .. code-block:: c void * bson_realloc_ctx (void *mem, size_t num_bytes, void *ctx); Parameters ---------- * ``mem``: A memory region. * ``num_bytes``: A size_t containing the requested size. * ``ctx``: A consumer-specific pointer or ``NULL``. Description ----------- This function is identical to :symbol:`bson_realloc()` except it takes a context parameter. This is useful when working with pooled or specific memory allocators. mongo-c-driver-1.26.0/src/libbson/doc/bson_realloc_func.rst000066400000000000000000000011441456567454500236500ustar00rootroot00000000000000:man_page: bson_realloc_func bson_realloc_func ================= Synopsis -------- .. code-block:: c typedef void *(*bson_realloc_func) (void *mem, size_t num_bytes, void *ctx); Parameters ---------- * ``mem``: A memory region. * ``num_bytes``: A size_t containing the requested size. * ``ctx``: A consumer-specific pointer or ``NULL``. Description ----------- This is a prototype for pluggable realloc functions used through the Libbson library. If you wish to use a custom allocator this is one way to do it. Additionally, :symbol:`bson_realloc_ctx()` is a default implementation of this prototype. mongo-c-driver-1.26.0/src/libbson/doc/bson_reinit.rst000066400000000000000000000010531456567454500225050ustar00rootroot00000000000000:man_page: bson_reinit bson_reinit() ============= Synopsis -------- .. code-block:: c void bson_reinit (bson_t *b); Parameters ---------- * ``b``: A :symbol:`bson_t`. Description ----------- Reinitializes a :symbol:`bson_t`. If the :symbol:`bson_t` structure contains a malloc()'d buffer, it may be reused. To be certain that any buffer is freed, always call :symbol:`bson_destroy` on any :symbol:`bson_t` structure, whether initialized or reinitialized, after its final use. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_reserve_buffer.rst000066400000000000000000000050271456567454500242240ustar00rootroot00000000000000:man_page: bson_reserve_buffer bson_reserve_buffer() ===================== Synopsis -------- .. code-block:: c uint8_t * bson_reserve_buffer (bson_t *bson, uint32_t size); Parameters ---------- * ``bson``: An initialized :symbol:`bson_t`. * ``size``: The length in bytes of the new buffer. Description ----------- Grow the internal buffer of ``bson`` to ``size`` and set the document length to ``size``. Useful for eliminating copies when reading BSON bytes from a stream. First, initialize ``bson`` with :symbol:`bson_init` or :symbol:`bson_new`, then call this function. After it returns, the length of ``bson`` is set to ``size`` but its contents are uninitialized memory: you must fill the contents with a BSON document of the correct length before any other operations. The document must be freed with :symbol:`bson_destroy`. Returns ------- A pointer to the internal buffer, which is at least ``size`` bytes, or NULL if the space could not be allocated. Example ------- Use ``bson_reserve_buffer`` to write a function that takes a :symbol:`bson_t` pointer and reads a file into it directly: .. code-block:: c #include #include bool read_into (bson_t *bson, FILE *fp) { uint8_t *buffer; long size; if (fseek (fp, 0L, SEEK_END) < 0) { perror ("Couldn't get file size"); return 1; } size = ftell (fp); if (size == EOF) { perror ("Couldn't get file size"); return 1; } if (size > INT32_MAX) { fprintf (stderr, "File too large\n"); return 1; } /* reserve buffer space - bson is temporarily invalid */ buffer = bson_reserve_buffer (bson, (uint32_t) size); if (!buffer) { fprintf (stderr, "Couldn't reserve %ld bytes", size); return false; } /* read file directly into the buffer */ rewind (fp); if (fread ((void *) buffer, 1, (size_t) size, fp) < (size_t) size) { perror ("Couldn't read file"); return false; } return true; } int main () { FILE *fp; char *json; /* stack-allocated, initialized bson_t */ bson_t bson = BSON_INITIALIZER; if (!(fp = fopen ("document.bson", "rb"))) { perror ("Couldn't read file"); return 1; } read_into (&bson, fp); fclose (fp); json = bson_as_canonical_extended_json (&bson, NULL); printf ("%s\n", json); bson_free (json); bson_destroy (&bson); return 0; } .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_set_error.rst000066400000000000000000000011001456567454500232100ustar00rootroot00000000000000:man_page: bson_set_error bson_set_error() ================ Synopsis -------- .. code-block:: c void bson_set_error ( bson_error_t *error, uint32_t domain, uint32_t code, const char *format, ...) BSON_GNUC_PRINTF (4, 5); Parameters ---------- * ``error``: A :symbol:`bson_error_t`. * ``domain``: A ``uint32_t``. * ``code``: A ``uint32_t``. * ``format``: A ``printf()`` style format string. Description ----------- This is a helper function to set the parameters of a :symbol:`bson_error_t`. It handles the case where ``error`` is NULL by doing nothing. mongo-c-driver-1.26.0/src/libbson/doc/bson_sized_new.rst000066400000000000000000000011551456567454500232050ustar00rootroot00000000000000:man_page: bson_sized_new bson_sized_new() ================ Synopsis -------- .. code-block:: c bson_t * bson_sized_new (size_t size); Parameters ---------- * ``size``: The size to pre-allocate for the underlying buffer. Description ----------- The :symbol:`bson_sized_new()` function shall create a new :symbol:`bson_t` on the heap with a preallocated buffer. This is useful if you have a good idea of the size of the resulting document. Returns ------- A newly allocated :symbol:`bson_t` that should be freed with :symbol:`bson_destroy()`. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-1.26.0/src/libbson/doc/bson_snprintf.rst000066400000000000000000000010221456567454500230520ustar00rootroot00000000000000:man_page: bson_snprintf bson_snprintf() =============== Synopsis -------- .. code-block:: c int bson_snprintf (char *str, size_t size, const char *format, ...) BSON_GNUC_PRINTF (3, 4); Parameters ---------- * ``str``: The destination buffer. * ``size``: The size of ``str``. * ``format``: A printf style format string. Description ----------- This is a portable wrapper around ``snprintf()``. It also enforces a trailing ``\0`` in the resulting string. Returns ------- The number of bytes written to ``str``. mongo-c-driver-1.26.0/src/libbson/doc/bson_steal.rst000066400000000000000000000033221456567454500223240ustar00rootroot00000000000000:man_page: bson_steal bson_steal() ============ Synopsis -------- .. code-block:: c bool bson_steal (bson_t *dst, bson_t *src); Parameters ---------- * ``dst``: An uninitialized :symbol:`bson_t`. * ``src``: A :symbol:`bson_t`. Description ----------- Efficiently transfer the contents of ``src`` to ``dst`` and destroy ``src``. Before calling this function, ``src`` must be initialized and ``dst`` must be uninitialized. After this function returns successfully, ``src`` is destroyed, and ``dst`` is initialized and must be freed with :symbol:`bson_destroy`. For example, if you have a higher-level structure that wraps a :symbol:`bson_t`, use ``bson_steal`` to transfer BSON data into it: .. code-block:: c typedef struct { bson_t bson; } bson_wrapper_t; bson_wrapper_t * wrap_bson (bson_t *b) { bson_wrapper_t *wrapper = bson_malloc (sizeof (bson_wrapper_t)); if (bson_steal (&wrapper->bson, b)) { return wrapper; } bson_free (wrapper); return NULL; } void bson_wrapper_destroy (bson_wrapper_t *wrapper) { bson_destroy (&wrapper->bson); bson_free (wrapper); } int main (int argc, char *argv[]) { bson_t bson = BSON_INITIALIZER; bson_wrapper_t *wrapper; BSON_APPEND_UTF8 (&bson, "key", "value"); /* now "bson" is destroyed */ wrapper = wrap_bson (&bson); /* clean up */ bson_wrapper_destroy (wrapper); } Returns ------- Returns ``true`` if ``src`` was successfully moved to ``dst``, ``false`` if ``src`` is invalid, or was statically initialized, or another error occurred. .. seealso:: | :symbol:`bson_destroy_with_steal`, a lower-level function that returns the raw contents of a :symbol:`bson_t`. mongo-c-driver-1.26.0/src/libbson/doc/bson_strcasecmp.rst000066400000000000000000000007521456567454500233640ustar00rootroot00000000000000:man_page: bson_strcasecmp bson_strcasecmp() ================= Synopsis -------- .. code-block:: c int bson_strcasecmp (const char *s1, const char *s2); Parameters ---------- * ``s1``: A string. * ``s2``: A string. Description ----------- A portable version of ``strcasecmp()``. Returns ------- Returns a negative integer if s1 sorts lexicographically before s2, a positive integer if it sorts after, or 0 if they are equivalent, after translating both strings to lower case. mongo-c-driver-1.26.0/src/libbson/doc/bson_strdup.rst000066400000000000000000000005541456567454500225410ustar00rootroot00000000000000:man_page: bson_strdup bson_strdup() ============= Synopsis -------- .. code-block:: c char * bson_strdup (const char *str); Parameters ---------- * ``str``: A string. Description ----------- Copies ``str`` into a new string. If ``str`` is NULL, then NULL is returned. Returns ------- A newly allocated string that should be freed with bson_free(). mongo-c-driver-1.26.0/src/libbson/doc/bson_strdup_printf.rst000066400000000000000000000007021456567454500241160ustar00rootroot00000000000000:man_page: bson_strdup_printf bson_strdup_printf() ==================== Synopsis -------- .. code-block:: c char * bson_strdup_printf (const char *format, ...) BSON_GNUC_PRINTF (1, 2); Parameters ---------- * ``format``: A printf style format string. Description ----------- This function performs a printf style format but into a newly allocated string. Returns ------- A newly allocated string that should be freed with bson_free(). mongo-c-driver-1.26.0/src/libbson/doc/bson_strdupv_printf.rst000066400000000000000000000007611456567454500243110ustar00rootroot00000000000000:man_page: bson_strdupv_printf bson_strdupv_printf() ===================== Synopsis -------- .. code-block:: c char * bson_strdupv_printf (const char *format, va_list args) BSON_GNUC_PRINTF (1, 0); Parameters ---------- * ``format``: A printf style format string. * ``args``: A va_list. Description ----------- This function is like :symbol:`bson_strdup_printf()` except takes a va_list of parameters. Returns ------- A newly allocated string that should be freed with bson_free(). mongo-c-driver-1.26.0/src/libbson/doc/bson_strerror_r.rst000066400000000000000000000007051456567454500234210ustar00rootroot00000000000000:man_page: bson_strerror_r bson_strerror_r() ================= Synopsis -------- .. code-block:: c char * bson_strerror_r (int err_code, char *buf, size_t buflen); Parameters ---------- * ``err_code``: An errno. * ``buf``: A location to store the string. * ``buflen``: The size of ``buf``. Description ----------- This is a portability wrapper around ``strerror()``. Returns ------- The passed in ``buf`` parameter or an internal string. mongo-c-driver-1.26.0/src/libbson/doc/bson_strfreev.rst000066400000000000000000000005431456567454500230560ustar00rootroot00000000000000:man_page: bson_strfreev bson_strfreev() =============== Synopsis -------- .. code-block:: c void bson_strfreev (char **strv); Parameters ---------- * ``strv``: A NULL-terminated array of strings to free, including the array. Description ----------- This will free each string in a NULL-terminated array of strings and then the array itself. mongo-c-driver-1.26.0/src/libbson/doc/bson_string_append.rst000066400000000000000000000006351456567454500240550ustar00rootroot00000000000000:man_page: bson_string_append bson_string_append() ==================== Synopsis -------- .. code-block:: c void bson_string_append (bson_string_t *string, const char *str); Parameters ---------- * ``string``: A :symbol:`bson_string_t`. * ``str``: A string. Description ----------- Appends the ASCII or UTF-8 encoded string ``str`` to ``string``. This is not suitable for embedding NULLs in strings. mongo-c-driver-1.26.0/src/libbson/doc/bson_string_append_c.rst000066400000000000000000000005351456567454500243560ustar00rootroot00000000000000:man_page: bson_string_append_c bson_string_append_c() ====================== Synopsis -------- .. code-block:: c void bson_string_append_c (bson_string_t *string, char str); Parameters ---------- * ``string``: A :symbol:`bson_string_t`. * ``str``: An ASCII char. Description ----------- Appends ``c`` to the string builder ``string``. mongo-c-driver-1.26.0/src/libbson/doc/bson_string_append_printf.rst000066400000000000000000000007401456567454500254340ustar00rootroot00000000000000:man_page: bson_string_append_printf bson_string_append_printf() =========================== Synopsis -------- .. code-block:: c void bson_string_append_printf (bson_string_t *string, const char *format, ...) BSON_GNUC_PRINTF (2, 3); Parameters ---------- * ``string``: A :symbol:`bson_string_t`. * ``format``: A printf style format string. Description ----------- Like bson_string_append() but formats a printf style string and then appends that to ``string``. mongo-c-driver-1.26.0/src/libbson/doc/bson_string_append_unichar.rst000066400000000000000000000007231456567454500255640ustar00rootroot00000000000000:man_page: bson_string_append_unichar bson_string_append_unichar() ============================ Synopsis -------- .. code-block:: c void bson_string_append_unichar (bson_string_t *string, bson_unichar_t unichar); Parameters ---------- * ``string``: A :symbol:`bson_string_t`. * ``unichar``: A :symbol:`bson_unichar_t`. Description ----------- Appends a unicode character to string. The character will be encoded into its multi-byte UTF-8 representation. mongo-c-driver-1.26.0/src/libbson/doc/bson_string_free.rst000066400000000000000000000007671456567454500235350ustar00rootroot00000000000000:man_page: bson_string_free bson_string_free() ================== Synopsis -------- .. code-block:: c char * bson_string_free (bson_string_t *string, bool free_segment); Parameters ---------- * ``string``: A :symbol:`bson_string_t`. * ``free_segment``: A bool indicating whether ``string->str`` should be freed. Description ----------- Frees the ``bson_string_t`` structure and optionally ``string->str``. Returns ------- ``string->str`` if ``free_segment`` is false, otherwise ``NULL``. mongo-c-driver-1.26.0/src/libbson/doc/bson_string_new.rst000066400000000000000000000010031456567454500233650ustar00rootroot00000000000000:man_page: bson_string_new bson_string_new() ================= Synopsis -------- .. code-block:: c bson_string_t * bson_string_new (const char *str); Parameters ---------- * ``str``: A string to be copied or NULL. Description ----------- Creates a new string builder, which uses power-of-two growth of buffers. Use the various bson_string_append*() functions to append to the string. Returns ------- A newly allocated bson_string_t that should be freed with bson_string_free() when no longer in use. mongo-c-driver-1.26.0/src/libbson/doc/bson_string_t.rst000066400000000000000000000022551456567454500230510ustar00rootroot00000000000000:man_page: bson_string_t bson_string_t ============= String Building Abstraction Synopsis -------- .. code-block:: c #include typedef struct { char *str; uint32_t len; uint32_t alloc; } bson_string_t; Description ----------- :symbol:`bson_string_t` is an abstraction for building strings. As chunks are added to the string, allocations are performed in powers of two. This API is useful if you need to build UTF-8 encoded strings. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_string_append bson_string_append_c bson_string_append_printf bson_string_append_unichar bson_string_free bson_string_new bson_string_truncate Example ------- .. code-block:: c bson_string_t *str; str = bson_string_new (NULL); bson_string_append_printf (str, "%d %s %f\n", 0, "some string", 0.123); printf ("%s\n", str->str); bson_string_free (str, true); .. tip:: You can call :symbol:`bson_string_free()` with ``false`` if you would like to take ownership of ``str->str``. Some APIs that do this might call ``return bson_string_free (str, false);`` after building the string. mongo-c-driver-1.26.0/src/libbson/doc/bson_string_truncate.rst000066400000000000000000000010401456567454500244220ustar00rootroot00000000000000:man_page: bson_string_truncate bson_string_truncate() ====================== Synopsis -------- .. code-block:: c void bson_string_truncate (bson_string_t *string, uint32_t len); Parameters ---------- * ``string``: A :symbol:`bson_string_t`. * ``len``: The new length of the string, excluding the trailing ``\0``. Description ----------- Truncates the string so that it is ``len`` bytes in length. This must be smaller or equal to the current length of the string. A ``\0`` byte will be placed where the end of the string occurs. mongo-c-driver-1.26.0/src/libbson/doc/bson_strncpy.rst000066400000000000000000000016201456567454500227150ustar00rootroot00000000000000:man_page: bson_strncpy bson_strncpy() ============== Synopsis -------- .. code-block:: c void bson_strncpy (char *dst, const char *src, size_t size); Parameters ---------- * ``dst``: The destination buffer. * ``src``: The src buffer. * ``size``: The number of bytes to copy into dst, which must be at least that size. Description ----------- Copies up to ``size`` bytes from ``src`` into ``dst``. ``dst`` must be at least ``size`` bytes in size. A trailing ``\0`` is always set. Does nothing if ``size`` is zero. ``bson_strncpy`` matches the behavior of the C11 standard ``strncpy_s``, rather than ``strncpy``. This means that ``bson_strncpy`` always writes a null terminator to ``dst``, even if ``dst`` is too short to fit the entire string from ``src``. If there is additional space left in ``dst`` after copying ``src``, ``bson_strncpy`` does not fill the remaining space with null characters. mongo-c-driver-1.26.0/src/libbson/doc/bson_strndup.rst000066400000000000000000000006771456567454500227250ustar00rootroot00000000000000:man_page: bson_strndup bson_strndup() ============== Synopsis -------- .. code-block:: c char * bson_strndup (const char *str, size_t n_bytes); Parameters ---------- * ``str``: A string to copy. * ``n_bytes``: A size_t. Description ----------- Allocates a new string and copies up to ``n_bytes`` from ``str`` into it. A trailing ``\0`` is always set. Returns ------- A newly allocated string that should be freed with bson_free(). mongo-c-driver-1.26.0/src/libbson/doc/bson_strnlen.rst000066400000000000000000000006111456567454500226770ustar00rootroot00000000000000:man_page: bson_strnlen bson_strnlen() ============== Synopsis -------- .. code-block:: c size_t bson_strnlen (const char *s, size_t maxlen); Parameters ---------- * ``s``: A string. * ``maxlen``: The maximum size of string to check. Description ----------- A portable version of ``strnlen()``. Returns ------- The length of ``s`` in bytes or ``maxlen`` if no ``\0`` was found. mongo-c-driver-1.26.0/src/libbson/doc/bson_subtype_t.rst000066400000000000000000000016241456567454500232350ustar00rootroot00000000000000:man_page: bson_subtype_t bson_subtype_t ============== Binary Field Subtype Synopsis -------- .. code-block:: c #include typedef enum { BSON_SUBTYPE_BINARY = 0x00, BSON_SUBTYPE_FUNCTION = 0x01, BSON_SUBTYPE_BINARY_DEPRECATED = 0x02, BSON_SUBTYPE_UUID_DEPRECATED = 0x03, BSON_SUBTYPE_UUID = 0x04, BSON_SUBTYPE_MD5 = 0x05, BSON_SUBTYPE_COLUMN = 0x07, BSON_SUBTYPE_SENSITIVE = 0x08, BSON_SUBTYPE_USER = 0x80, } bson_subtype_t; Description ----------- This enumeration contains the various subtypes that may be used in a binary field. See `http://bsonspec.org `_ for more information. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 Example ------- .. code-block:: c bson_t doc = BSON_INITIALIZER; BSON_APPEND_BINARY (&doc, "binary", BSON_SUBTYPE_BINARY, data, data_len); mongo-c-driver-1.26.0/src/libbson/doc/bson_t.rst000066400000000000000000000152521456567454500214640ustar00rootroot00000000000000:man_page: bson_t bson_t ====== BSON Document Abstraction Synopsis -------- .. code-block:: c #include /** * bson_empty: * @b: a bson_t. * * Checks to see if @b is an empty BSON document. An empty BSON document is * a 5 byte document which contains the length (4 bytes) and a single NUL * byte indicating end of fields. */ #define bson_empty(b) /* ... */ /** * bson_empty0: * * Like bson_empty() but treats NULL the same as an empty bson_t document. */ #define bson_empty0(b) /* ... */ /** * bson_clear: * * Easily free a bson document and set it to NULL. Use like: * * bson_t *doc = bson_new(); * bson_clear (&doc); * BSON_ASSERT (doc == NULL); */ #define bson_clear(bptr) /* ... */ /** * BSON_MAX_SIZE: * * The maximum size in bytes of a BSON document. */ #define BSON_MAX_SIZE /* ... */ #define BSON_APPEND_ARRAY(b, key, val) \ bson_append_array (b, key, (int) strlen (key), val) #define BSON_APPEND_ARRAY_BEGIN(b, key, child) \ bson_append_array_begin (b, key, (int) strlen (key), child) #define BSON_APPEND_BINARY(b, key, subtype, val, len) \ bson_append_binary (b, key, (int) strlen (key), subtype, val, len) #define BSON_APPEND_BOOL(b, key, val) \ bson_append_bool (b, key, (int) strlen (key), val) #define BSON_APPEND_CODE(b, key, val) \ bson_append_code (b, key, (int) strlen (key), val) #define BSON_APPEND_CODE_WITH_SCOPE(b, key, val, scope) \ bson_append_code_with_scope (b, key, (int) strlen (key), val, scope) #define BSON_APPEND_DBPOINTER(b, key, coll, oid) \ bson_append_dbpointer (b, key, (int) strlen (key), coll, oid) #define BSON_APPEND_DOCUMENT_BEGIN(b, key, child) \ bson_append_document_begin (b, key, (int) strlen (key), child) #define BSON_APPEND_DOUBLE(b, key, val) \ bson_append_double (b, key, (int) strlen (key), val) #define BSON_APPEND_DOCUMENT(b, key, val) \ bson_append_document (b, key, (int) strlen (key), val) #define BSON_APPEND_INT32(b, key, val) \ bson_append_int32 (b, key, (int) strlen (key), val) #define BSON_APPEND_INT64(b, key, val) \ bson_append_int64 (b, key, (int) strlen (key), val) #define BSON_APPEND_MINKEY(b, key) \ bson_append_minkey (b, key, (int) strlen (key)) #define BSON_APPEND_DECIMAL128(b, key, val) \ bson_append_decimal128 (b, key, (int) strlen (key), val) #define BSON_APPEND_MAXKEY(b, key) \ bson_append_maxkey (b, key, (int) strlen (key)) #define BSON_APPEND_NULL(b, key) bson_append_null (b, key, (int) strlen (key)) #define BSON_APPEND_OID(b, key, val) \ bson_append_oid (b, key, (int) strlen (key), val) #define BSON_APPEND_REGEX(b, key, val, opt) \ bson_append_regex (b, key, (int) strlen (key), val, opt) #define BSON_APPEND_UTF8(b, key, val) \ bson_append_utf8 (b, key, (int) strlen (key), val, (int) strlen (val)) #define BSON_APPEND_SYMBOL(b, key, val) \ bson_append_symbol (b, key, (int) strlen (key), val, (int) strlen (val)) #define BSON_APPEND_TIME_T(b, key, val) \ bson_append_time_t (b, key, (int) strlen (key), val) #define BSON_APPEND_TIMEVAL(b, key, val) \ bson_append_timeval (b, key, (int) strlen (key), val) #define BSON_APPEND_DATE_TIME(b, key, val) \ bson_append_date_time (b, key, (int) strlen (key), val) #define BSON_APPEND_TIMESTAMP(b, key, val, inc) \ bson_append_timestamp (b, key, (int) strlen (key), val, inc) #define BSON_APPEND_UNDEFINED(b, key) \ bson_append_undefined (b, key, (int) strlen (key)) #define BSON_APPEND_VALUE(b, key, val) \ bson_append_value (b, key, (int) strlen (key), (val)) BSON_ALIGNED_BEGIN (128) typedef struct { uint32_t flags; /* Internal flags for the bson_t. */ uint32_t len; /* Length of BSON data. */ uint8_t padding[120]; /* Padding for stack allocation. */ } bson_t BSON_ALIGNED_END (128); Description ----------- The :symbol:`bson_t` structure represents a BSON document. This structure manages the underlying BSON encoded buffer. For mutable documents, it can append new data to the document. Performance Notes ----------------- The :symbol:`bson_t` structure attempts to use an inline allocation within the structure to speed up performance of small documents. When this internal buffer has been exhausted, a heap allocated buffer will be dynamically allocated. Therefore, it is essential to call :symbol:`bson_destroy()` on allocated documents. Duplicate Keys -------------- The `BSON specification `_ allows BSON documents to have duplicate keys. Documents are stored as an ordered list of key-value pairs. A :symbol:`bson_t` may contain duplicate keys. Applications should refrain from generating such documents, because MongoDB server behavior is undefined when a BSON document contains duplicate keys. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_append_array bson_append_array_begin bson_append_array_end bson_append_binary bson_append_bool bson_append_code bson_append_code_with_scope bson_append_date_time bson_append_dbpointer bson_append_decimal128 bson_append_document bson_append_document_begin bson_append_document_end bson_append_double bson_append_int32 bson_append_int64 bson_append_iter bson_append_maxkey bson_append_minkey bson_append_now_utc bson_append_null bson_append_oid bson_append_regex bson_append_regex_w_len bson_append_symbol bson_append_time_t bson_append_timestamp bson_append_timeval bson_append_undefined bson_append_utf8 bson_append_value bson_array_as_canonical_extended_json bson_array_as_json bson_array_as_relaxed_extended_json bson_as_canonical_extended_json bson_as_json bson_as_json_with_opts bson_as_relaxed_extended_json bson_compare bson_concat bson_copy bson_copy_to bson_copy_to_excluding bson_copy_to_excluding_noinit bson_copy_to_excluding_noinit_va bson_count_keys bson_destroy bson_destroy_with_steal bson_equal bson_get_data bson_has_field bson_init bson_init_from_json bson_init_static bson_json_mode_t bson_json_opts_t bson_new bson_new_from_buffer bson_new_from_data bson_new_from_json bson_reinit bson_reserve_buffer bson_sized_new bson_steal bson_validate bson_validate_with_error Example ------- .. code-block:: c static void create_on_heap (void) { bson_t *b = bson_new (); BSON_APPEND_INT32 (b, "foo", 123); BSON_APPEND_UTF8 (b, "bar", "foo"); BSON_APPEND_DOUBLE (b, "baz", 1.23f); bson_destroy (b); } mongo-c-driver-1.26.0/src/libbson/doc/bson_type_t.rst000066400000000000000000000024641456567454500225260ustar00rootroot00000000000000:man_page: bson_type_t bson_type_t =========== BSON Type Enumeration Synopsis -------- .. code-block:: c #include typedef enum { BSON_TYPE_EOD = 0x00, BSON_TYPE_DOUBLE = 0x01, BSON_TYPE_UTF8 = 0x02, BSON_TYPE_DOCUMENT = 0x03, BSON_TYPE_ARRAY = 0x04, BSON_TYPE_BINARY = 0x05, BSON_TYPE_UNDEFINED = 0x06, BSON_TYPE_OID = 0x07, BSON_TYPE_BOOL = 0x08, BSON_TYPE_DATE_TIME = 0x09, BSON_TYPE_NULL = 0x0A, BSON_TYPE_REGEX = 0x0B, BSON_TYPE_DBPOINTER = 0x0C, BSON_TYPE_CODE = 0x0D, BSON_TYPE_SYMBOL = 0x0E, BSON_TYPE_CODEWSCOPE = 0x0F, BSON_TYPE_INT32 = 0x10, BSON_TYPE_TIMESTAMP = 0x11, BSON_TYPE_INT64 = 0x12, BSON_TYPE_DECIMAL128 = 0x13, BSON_TYPE_MAXKEY = 0x7F, BSON_TYPE_MINKEY = 0xFF, } bson_type_t; Description ----------- The :symbol:`bson_type_t` enumeration contains all of the types from the `BSON Specification `_. It can be used to determine the type of a field at runtime. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 Example ------- .. code-block:: c bson_iter_t iter; if (bson_iter_init_find (&iter, doc, "foo") && (BSON_TYPE_INT32 == bson_iter_type (&iter))) { printf ("'foo' is an int32.\n"); } mongo-c-driver-1.26.0/src/libbson/doc/bson_uint32_to_string.rst000066400000000000000000000024061456567454500244320ustar00rootroot00000000000000:man_page: bson_uint32_to_string bson_uint32_to_string() ======================= Synopsis -------- .. code-block:: c size_t bson_uint32_to_string (uint32_t value, const char **strptr, char *str, size_t size); Parameters ---------- * ``value``: A uint32_t. * ``strptr``: A location for the resulting string pointer. * ``str``: A location to buffer the string. * ``size``: A size_t containing the size of ``str``. Description ----------- Converts ``value`` to a string. If ``value`` is from 0 to 999, it will use a constant string in the data section of the library. If not, a string will be formatted using ``str`` and ``snprintf()``. ``strptr`` will always be set. It will either point to ``str`` or a constant string. Use this as your key. Array Element Key Building -------------------------- Each element in a BSON array has a monotonic string key like ``"0"``, ``"1"``, etc. This function is optimized for generating such string keys. .. code-block:: c char str[16]; const char *key; uint32_t i; for (i = 0; i < 10; i++) { bson_uint32_to_string (i, &key, str, sizeof str); printf ("Key: %s\n", key); } Returns ------- The number of bytes in the resulting string. mongo-c-driver-1.26.0/src/libbson/doc/bson_unichar_t.rst000066400000000000000000000014221456567454500231670ustar00rootroot00000000000000:man_page: bson_unichar_t bson_unichar_t ============== Unicode Character Abstraction Synopsis -------- .. code-block:: c typedef uint32_t bson_unichar_t; Description ----------- :symbol:`bson_unichar_t` provides an abstraction on a single unicode character. It is the 32-bit representation of a character. As UTF-8 can contain multi-byte characters, this should be used when iterating through UTF-8 text. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 Example ------- .. code-block:: c static void print_each_char (const char *str) { bson_unichar_t c; for (; *str; str = bson_utf8_next_char (str)) { c = bson_utf8_get_char (str); printf ("The numberic value is %u.\n", (unsigned) c); } } mongo-c-driver-1.26.0/src/libbson/doc/bson_utf8_escape_for_json.rst000066400000000000000000000014271456567454500253250ustar00rootroot00000000000000:man_page: bson_utf8_escape_for_json bson_utf8_escape_for_json() =========================== Synopsis -------- .. code-block:: c char * bson_utf8_escape_for_json (const char *utf8, ssize_t utf8_len); Parameters ---------- * ``utf8``: A UTF-8 encoded string. * ``utf8_len``: The length of ``utf8`` in bytes or -1 if it is NULL terminated. Description ----------- Allocates a new string matching ``utf8`` except that special characters in JSON are escaped. The resulting string is also UTF-8 encoded. Both " and \\ characters will be backslash-escaped. If a NUL byte is found before ``utf8_len`` bytes, it is converted to "\\u0000". Other non-ASCII characters in the input are preserved. Returns ------- A newly allocated string that should be freed with :symbol:`bson_free()`. mongo-c-driver-1.26.0/src/libbson/doc/bson_utf8_from_unichar.rst000066400000000000000000000010731456567454500246370ustar00rootroot00000000000000:man_page: bson_utf8_from_unichar bson_utf8_from_unichar() ======================== Synopsis -------- .. code-block:: c void bson_utf8_from_unichar (bson_unichar_t unichar, char utf8[6], uint32_t *len); Parameters ---------- * ``unichar``: A :symbol:`bson_unichar_t`. * ``utf8``: A location for the utf8 sequence. * ``len``: A location for the number of bytes in the resulting utf8 sequence. Description ----------- Converts a single unicode character to a multi-byte UTF-8 sequence. The result is stored in ``utf8`` and the number of bytes used in ``len``. mongo-c-driver-1.26.0/src/libbson/doc/bson_utf8_get_char.rst000066400000000000000000000006441456567454500237420ustar00rootroot00000000000000:man_page: bson_utf8_get_char bson_utf8_get_char() ==================== Synopsis -------- .. code-block:: c bson_unichar_t bson_utf8_get_char (const char *utf8); Parameters ---------- * ``utf8``: A UTF-8 encoded string. Description ----------- Converts the current character in a UTF-8 sequence to a bson_unichar_t, the 32-bit representation of the multi-byte character. Returns ------- A bson_unichar_t. mongo-c-driver-1.26.0/src/libbson/doc/bson_utf8_next_char.rst000066400000000000000000000011141456567454500241320ustar00rootroot00000000000000:man_page: bson_utf8_next_char bson_utf8_next_char() ===================== Synopsis -------- .. code-block:: c const char * bson_utf8_next_char (const char *utf8); Parameters ---------- * ``utf8``: A UTF-8 encoded string. Description ----------- Advances within ``utf8`` to the next UTF-8 character, which may be multiple bytes offset from ``utf8``. A pointer to the next character is returned. It is invalid to call this function on a string whose current character is ``\0``. Returns ------- A pointer to the beginning of the next character in the UTF-8 encoded string. mongo-c-driver-1.26.0/src/libbson/doc/bson_utf8_validate.rst000066400000000000000000000011571456567454500237570ustar00rootroot00000000000000:man_page: bson_utf8_validate bson_utf8_validate() ==================== Synopsis -------- .. code-block:: c bool bson_utf8_validate (const char *utf8, size_t utf8_len, bool allow_null); Parameters ---------- * ``utf8``: A string to verify. * ``utf8_len``: The length of ``utf8`` in bytes. * ``allow_null``: A bool indicating that embedded ``\0`` bytes are allowed. Description ----------- Validates that the content within ``utf8`` is valid UTF-8 (by the RFC 3629 standard). If ``allow_null`` is ``true``, then embedded NULL bytes are allowed (``\0``). Returns ------- true if ``utf8`` contains valid UTF-8. mongo-c-driver-1.26.0/src/libbson/doc/bson_validate.rst000066400000000000000000000017511456567454500230110ustar00rootroot00000000000000:man_page: bson_validate bson_validate() =============== Synopsis -------- .. code-block:: c bool bson_validate (const bson_t *bson, bson_validate_flags_t flags, size_t *offset); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``flags``: A bitwise-or of all desired :symbol:`bson_validate_flags_t `. * ``offset``: A location for the offset within ``bson`` where the error occurred. Description ----------- Validates a BSON document by walking through the document and inspecting the keys and values for valid content. You can modify how the validation occurs through the use of the ``flags`` parameter, see :symbol:`bson_validate_with_error()` for details. Returns ------- Returns true if ``bson`` is valid; otherwise false and ``offset`` is set to the byte offset where the error was detected. .. seealso:: | :symbol:`bson_validate_with_error()`. | :symbol:`bson_visitor_t` can be used for custom validation, :ref:`example_custom_validation`. mongo-c-driver-1.26.0/src/libbson/doc/bson_validate_with_error.rst000066400000000000000000000041701456567454500252530ustar00rootroot00000000000000:man_page: bson_validate_with_error bson_validate_with_error() ========================== Synopsis -------- .. code-block:: c typedef enum { BSON_VALIDATE_NONE = 0, BSON_VALIDATE_UTF8 = (1 << 0), BSON_VALIDATE_DOLLAR_KEYS = (1 << 1), BSON_VALIDATE_DOT_KEYS = (1 << 2), BSON_VALIDATE_UTF8_ALLOW_NULL = (1 << 3), BSON_VALIDATE_EMPTY_KEYS = (1 << 4), } bson_validate_flags_t; bool bson_validate_with_error (const bson_t *bson, bson_validate_flags_t flags, bson_error_t *error); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``flags``: A bitwise-or of all desired validation flags. * ``error``: Optional :symbol:`bson_error_t`. Description ----------- Validates a BSON document by walking through the document and inspecting the keys and values for valid content. You can modify how the validation occurs through the use of the ``flags`` parameter. A description of their effect is below. * ``BSON_VALIDATE_NONE`` Basic validation of BSON length and structure. * ``BSON_VALIDATE_UTF8`` All keys and string values are checked for invalid UTF-8. * ``BSON_VALIDATE_UTF8_ALLOW_NULL`` String values are allowed to have embedded NULL bytes. * ``BSON_VALIDATE_DOLLAR_KEYS`` Prohibit keys that start with ``$`` outside of a "DBRef" subdocument. * ``BSON_VALIDATE_DOT_KEYS`` Prohibit keys that contain ``.`` anywhere in the string. * ``BSON_VALIDATE_EMPTY_KEYS`` Prohibit zero-length keys. Returns ------- Returns true if ``bson`` is valid; otherwise false and ``error`` is filled out. The :symbol:`bson_error_t` domain is set to ``BSON_ERROR_INVALID``. Its code is set to one of the ``bson_validate_flags_t`` flags indicating which validation failed; for example, if a key contains invalid UTF-8, then the code is set to ``BSON_VALIDATE_UTF8``, but if the basic structure of the BSON document is corrupt, the code is set to ``BSON_VALIDATE_NONE``. The error message is filled out, and gives more detail if possible. .. seealso:: | :symbol:`bson_validate()`. | :symbol:`bson_visitor_t` can be used for custom validation, :ref:`example_custom_validation`. mongo-c-driver-1.26.0/src/libbson/doc/bson_value_copy.rst000066400000000000000000000007311456567454500233630ustar00rootroot00000000000000:man_page: bson_value_copy bson_value_copy() ================= Synopsis -------- .. code-block:: c void bson_value_copy (const bson_value_t *src, bson_value_t *dst); Parameters ---------- * ``src``: A :symbol:`bson_value_t` to copy from. * ``dst``: A :symbol:`bson_value_t` to copy into. Description ----------- This function will copy the boxed content in ``src`` into ``dst``. ``dst`` must be freed with :symbol:`bson_value_destroy()` when no longer in use. mongo-c-driver-1.26.0/src/libbson/doc/bson_value_destroy.rst000066400000000000000000000005211456567454500240770ustar00rootroot00000000000000:man_page: bson_value_destroy bson_value_destroy() ==================== Synopsis -------- .. code-block:: c void bson_value_destroy (bson_value_t *value); Parameters ---------- * ``value``: A :symbol:`bson_value_t`. Description ----------- Releases any resources associated with ``value``. Does nothing if ``value`` is NULL. mongo-c-driver-1.26.0/src/libbson/doc/bson_value_t.rst000066400000000000000000000035201456567454500226530ustar00rootroot00000000000000:man_page: bson_value_t bson_value_t ============ BSON Boxed Container Type Synopsis -------- .. code-block:: c #include typedef struct _bson_value_t { bson_type_t value_type; union { bson_oid_t v_oid; int64_t v_int64; int32_t v_int32; int8_t v_int8; double v_double; bool v_bool; int64_t v_datetime; struct { uint32_t timestamp; uint32_t increment; } v_timestamp; struct { uint32_t len; char *str; } v_utf8; struct { uint32_t data_len; uint8_t *data; } v_doc; struct { uint32_t data_len; uint8_t *data; bson_subtype_t subtype; } v_binary; struct { char *regex; char *options; } v_regex; struct { char *collection; uint32_t collection_len; bson_oid_t oid; } v_dbpointer; struct { uint32_t code_len; char *code; } v_code; struct { uint32_t code_len; char *code; uint32_t scope_len; uint8_t *scope_data; } v_codewscope; struct { uint32_t len; char *symbol; } v_symbol; bson_decimal128_t v_decimal128; } value; } bson_value_t; Description ----------- The :symbol:`bson_value_t` structure is a boxed type for encapsulating a runtime determined type. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_value_copy bson_value_destroy Example ------- .. code-block:: c const bson_value_t *value; value = bson_iter_value (&iter); if (value->value_type == BSON_TYPE_INT32) { printf ("%d\n", value->value.v_int32); } mongo-c-driver-1.26.0/src/libbson/doc/bson_visitor_t.rst000066400000000000000000000201701456567454500232360ustar00rootroot00000000000000:man_page: bson_visitor_t bson_visitor_t ============== Synopsis -------- .. code-block:: c #include typedef struct { /* run before / after descending into a document */ bool (*visit_before) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_after) (const bson_iter_t *iter, const char *key, void *data); /* corrupt BSON, or unsupported type and visit_unsupported_type not set */ void (*visit_corrupt) (const bson_iter_t *iter, void *data); /* normal bson field callbacks */ bool (*visit_double) (const bson_iter_t *iter, const char *key, double v_double, void *data); bool (*visit_utf8) (const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data); bool (*visit_document) (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); bool (*visit_array) (const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data); bool (*visit_binary) (const bson_iter_t *iter, const char *key, bson_subtype_t v_subtype, size_t v_binary_len, const uint8_t *v_binary, void *data); /* normal field with deprecated "Undefined" BSON type */ bool (*visit_undefined) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_oid) (const bson_iter_t *iter, const char *key, const bson_oid_t *v_oid, void *data); bool (*visit_bool) (const bson_iter_t *iter, const char *key, bool v_bool, void *data); bool (*visit_date_time) (const bson_iter_t *iter, const char *key, int64_t msec_since_epoch, void *data); bool (*visit_null) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_regex) (const bson_iter_t *iter, const char *key, const char *v_regex, const char *v_options, void *data); bool (*visit_dbpointer) (const bson_iter_t *iter, const char *key, size_t v_collection_len, const char *v_collection, const bson_oid_t *v_oid, void *data); bool (*visit_code) (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, void *data); bool (*visit_symbol) (const bson_iter_t *iter, const char *key, size_t v_symbol_len, const char *v_symbol, void *data); bool (*visit_codewscope) (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, const bson_t *v_scope, void *data); bool (*visit_int32) (const bson_iter_t *iter, const char *key, int32_t v_int32, void *data); bool (*visit_timestamp) (const bson_iter_t *iter, const char *key, uint32_t v_timestamp, uint32_t v_increment, void *data); bool (*visit_int64) (const bson_iter_t *iter, const char *key, int64_t v_int64, void *data); bool (*visit_maxkey) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_minkey) (const bson_iter_t *iter, const char *key, void *data); /* if set, called instead of visit_corrupt when an apparently valid BSON * includes an unrecognized field type (reading future version of BSON) */ void (*visit_unsupported_type) (const bson_iter_t *iter, const char *key, uint32_t type_code, void *data); bool (*visit_decimal128) (const bson_iter_t *iter, const char *key, const bson_decimal128_t *v_decimal128, void *data); void *padding[7]; } bson_visitor_t bson_visitor_t; Description ----------- The :symbol:`bson_visitor_t` structure provides a series of callbacks that can be called while iterating a BSON document. This may simplify the conversion of a :symbol:`bson_t` to a higher level language structure. If the optional callback ``visit_unsupported_type`` is set, it is called instead of ``visit_corrupt`` in the specific case of an unrecognized field type. (Parsing is aborted in either case.) Use this callback to report an error like "unrecognized type" instead of simply "corrupt BSON". This future-proofs code that may use an older version of libbson to parse future BSON formats. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 Basic Example ------------- .. code-block:: c #include #include static bool my_visit_before (const bson_iter_t *iter, const char *key, void *data) { int *count = (int *) data; (*count)++; /* returning true stops further iteration of the document */ return false; } static void count_fields (bson_t *doc) { bson_visitor_t visitor = {0}; bson_iter_t iter; int count = 0; visitor.visit_before = my_visit_before; if (bson_iter_init (&iter, doc)) { bson_iter_visit_all (&iter, &visitor, &count); } printf ("Found %d fields.\n", count); } The example below demonstrates how to set your own callbacks to provide information about the location of corrupt or unsupported BSON document entries. Example Corruption Check ------------------------ .. code-block:: c #include #include typedef struct { ssize_t *err_offset; } my_state_t; static void my_visit_corrupt (const bson_iter_t *iter, void *data) { *(((my_state_t *) data)->err_offset) = iter->off; } static void my_visit_unsupported_type (const bson_iter_t *iter, const char *key, uint32_t type_code, void *data) { *(((my_state_t *) data)->err_offset) = iter->off; } static void find_error_location (bson_t *doc) { bson_visitor_t visitors = {0}; bson_iter_t iter; my_state_t state; ssize_t err_offset = -1; visitors.visit_corrupt = my_visit_corrupt; visitors.visit_unsupported_type = my_visit_unsupported_type; /* provide additional visitors as needed based on your requirements */ state.err_offset = &err_offset; if (!bson_iter_init (&iter, doc)) { printf ("Could not initialize iterator!"); exit (1); } if (bson_iter_visit_all (&iter, &visitors, &state) || err_offset != -1) { printf ("Found error at offset %d.\n", err_offset); } else { printf ("BSON document had no errors.\n"); } } The example below demonstrates how to use a visitor to validate a BSON document's maximum depth. .. _example_custom_validation: Example Custom Validation ------------------------- .. literalinclude:: ../examples/bson-check-depth.c :caption: bson-check-depth.c :start-after: -- sphinx-include-start --mongo-c-driver-1.26.0/src/libbson/doc/bson_vsnprintf.rst000066400000000000000000000011061456567454500232430ustar00rootroot00000000000000:man_page: bson_vsnprintf bson_vsnprintf() ================ Synopsis -------- .. code-block:: c int bson_vsnprintf (char *str, size_t size, const char *format, va_list ap) BSON_GNUC_PRINTF (3, 0); Parameters ---------- * ``str``: A location for the resulting string. * ``size``: The size of str in bytes. * ``format``: A printf style format string. * ``ap``: A va_list of parameters for the format. Description ----------- Like bson_snprintf() but allows for variadic parameters. Returns ------- The number of bytes written to ``str`` excluding the ``\0`` byte. mongo-c-driver-1.26.0/src/libbson/doc/bson_writer_begin.rst000066400000000000000000000011331456567454500236720ustar00rootroot00000000000000:man_page: bson_writer_begin bson_writer_begin() =================== Synopsis -------- .. code-block:: c bool bson_writer_begin (bson_writer_t *writer, bson_t **bson); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. * ``bson``: A :symbol:`bson_t`. Description ----------- Begins writing a new document. The caller may use the bson structure to write out a new BSON document. When completed, the caller must call either :symbol:`bson_writer_end()` or :symbol:`bson_writer_rollback()`. Returns ------- true if there was space in the underlying buffers to begin the document. mongo-c-driver-1.26.0/src/libbson/doc/bson_writer_destroy.rst000066400000000000000000000007451456567454500243070ustar00rootroot00000000000000:man_page: bson_writer_destroy bson_writer_destroy() ===================== Synopsis -------- .. code-block:: c void bson_writer_destroy (bson_writer_t *writer); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. Description ----------- Cleanup after ``writer`` and release any allocated memory. Does nothing if ``writer`` is NULL. Note that the buffer supplied to :symbol:`bson_writer_new()` is *NOT* freed from this method. The caller is responsible for that. mongo-c-driver-1.26.0/src/libbson/doc/bson_writer_end.rst000066400000000000000000000004731456567454500233620ustar00rootroot00000000000000:man_page: bson_writer_end bson_writer_end() ================= Synopsis -------- .. code-block:: c void bson_writer_end (bson_writer_t *writer); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. Description ----------- Complete writing of a :symbol:`bson_writer_t` to the buffer supplied. mongo-c-driver-1.26.0/src/libbson/doc/bson_writer_get_length.rst000066400000000000000000000012631456567454500247320ustar00rootroot00000000000000:man_page: bson_writer_get_length bson_writer_get_length() ======================== Synopsis -------- .. code-block:: c size_t bson_writer_get_length (bson_writer_t *writer); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. Description ----------- Fetches the current length of the content written by the buffer (including the initial offset). This includes a partly written document currently being written. This is useful if you want to check to see if you've passed a given memory boundary that cannot be sent in a packet. See :symbol:`bson_writer_rollback()` to abort the current document being written. Returns ------- The length of the underlying buffer. mongo-c-driver-1.26.0/src/libbson/doc/bson_writer_new.rst000066400000000000000000000014531456567454500234040ustar00rootroot00000000000000:man_page: bson_writer_new bson_writer_new() ================= Synopsis -------- .. code-block:: c bson_writer_t * bson_writer_new (uint8_t **buf, size_t *buflen, size_t offset, bson_realloc_func realloc_func, void *realloc_func_ctx); Parameters ---------- * ``buf``: A uint8_t. * ``buflen``: A size_t. * ``offset``: A size_t. * ``realloc_func``: A bson_realloc_func. * ``realloc_func_ctx``: A bson_realloc_func. Description ----------- Creates a new instance of :symbol:`bson_writer_t` using the ``buffer``, ``length``, ``offset``, and _realloc()_ function supplied. The caller is expected to clean up the structure when finished using :symbol:`bson_writer_destroy()`. Returns ------- A newly allocated bson_writer_t. mongo-c-driver-1.26.0/src/libbson/doc/bson_writer_rollback.rst000066400000000000000000000007321456567454500244030ustar00rootroot00000000000000:man_page: bson_writer_rollback bson_writer_rollback() ====================== Synopsis -------- .. code-block:: c void bson_writer_rollback (bson_writer_t *writer); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. Description ----------- Abort the appending of the current bson_t to the memory region managed by ``writer``. This is useful if you detected that you went past a particular memory limit. For example, MongoDB has 48MB message limits. mongo-c-driver-1.26.0/src/libbson/doc/bson_writer_t.rst000066400000000000000000000031501456567454500230520ustar00rootroot00000000000000:man_page: bson_writer_t bson_writer_t ============= Bulk BSON serialization Abstraction Synopsis -------- .. code-block:: c #include typedef struct _bson_writer_t bson_writer_t; bson_writer_t * bson_writer_new (uint8_t **buf, size_t *buflen, size_t offset, bson_realloc_func realloc_func, void *realloc_func_ctx); void bson_writer_destroy (bson_writer_t *writer); Description ----------- The :symbol:`bson_writer_t` API provides an abstraction for serializing many BSON documents to a single memory region. The memory region may be dynamically allocated and re-allocated as more memory is demanded. This can be useful when building network packets from a high-level language. For example, you can serialize a Python Dictionary directly to a single buffer destined for a TCP packet. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_writer_begin bson_writer_destroy bson_writer_end bson_writer_get_length bson_writer_new bson_writer_rollback Example ------- .. code-block:: c #include int main (int argc, char *argv[]) { bson_writer_t *writer; uint8_t *buf = NULL; size_t buflen = 0; bson_t *doc; writer = bson_writer_new (&buf, &buflen, 0, bson_realloc_ctx, NULL); for (i = 0; i < 1000; i++) { bson_writer_begin (writer, &doc); BSON_APPEND_INT32 (&doc, "i", i); bson_writer_end (writer); } bson_writer_destroy (writer); bson_free (buf); return 0; } mongo-c-driver-1.26.0/src/libbson/doc/bson_zero_free.rst000066400000000000000000000010621456567454500231730ustar00rootroot00000000000000:man_page: bson_zero_free bson_zero_free() ================ Synopsis -------- .. code-block:: c void bson_zero_free (void *mem, size_t size); Parameters ---------- * ``mem``: A memory region. * ``size``: The size of ``mem``. Description ----------- This function behaves like :symbol:`bson_free()` except that it zeroes the memory first. This can be useful if you are storing passwords or other similarly important data. Note that if it truly is important, you probably want a page protected with ``mlock()`` as well to prevent it swapping to disk. mongo-c-driver-1.26.0/src/libbson/doc/character_and_string_routines.rst000066400000000000000000000014001456567454500262620ustar00rootroot00000000000000:man_page: bson_character_and_string_routines Character and String Routines ============================= We provide a small number of character and string routines to substitute for those that are not available on all platforms, and routines to make UTF-8 character manipulation convenient. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_ascii_strtoll bson_isspace bson_snprintf bson_strcasecmp bson_strdup bson_strdup_printf bson_strdupv_printf bson_strfreev bson_strncpy bson_strndup bson_strnlen bson_uint32_to_string bson_utf8_escape_for_json bson_utf8_from_unichar bson_utf8_get_char bson_utf8_next_char bson_utf8_validate bson_vsnprintf mongo-c-driver-1.26.0/src/libbson/doc/conf.py000066400000000000000000000022561456567454500207450ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import os.path import sys # Ensure we can import "mongoc" extension module. this_path = os.path.dirname(__file__) sys.path.append(os.path.normpath(os.path.join(this_path, "../../../build/sphinx"))) from mongoc_common import * extensions = [ "mongoc", ] # General information about the project. project = "libbson" copyright = "2017-present, MongoDB, Inc" author = "MongoDB, Inc" version_path = os.path.join(os.path.dirname(__file__), "../../..", "VERSION_CURRENT") version = open(version_path).read().strip() language = "en" exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] master_doc = "index" # -- Options for HTML output ---------------------------------------------- html_theme = "furo" html_title = html_shorttitle = "libbson %s" % version # html_favicon = None html_sidebars = {} html_use_index = False def add_canonical_link(app, pagename, templatename, context, doctree): link = f'' context["metatags"] = context.get("metatags", "") + link def setup(app): mongoc_common_setup(app) app.connect("html-page-context", add_canonical_link) mongo-c-driver-1.26.0/src/libbson/doc/creating.rst000066400000000000000000000071711456567454500217750ustar00rootroot00000000000000:man_page: bson_creating Creating a BSON Document ======================== The bson_t structure -------------------- BSON documents are created using the :symbol:`bson_t` structure. This structure encapsulates the necessary logic for encoding using the `BSON Specification `_. At the core, :symbol:`bson_t` is a buffer manager and set of encoding routines. .. tip:: BSON documents can live on the stack or the heap based on the performance needs or preference of the consumer. Let's start by creating a new BSON document on the stack. Whenever using libbson, make sure you ``#include ``. .. code-block:: c bson_t b; bson_init (&b); This creates an empty document. In JSON, this would be the same as ``{}``. We can now proceed to adding items to the BSON document. A variety of functions prefixed with ``bson_append_`` can be used based on the type of field you want to append. Let's append a UTF-8 encoded string. .. code-block:: c bson_append_utf8 (&b, "key", -1, "value", -1); Notice the two ``-1`` parameters. The first indicates that the length of ``key`` in bytes should be determined with ``strlen()``. Alternatively, we could have passed the number ``3``. The same goes for the second ``-1``, but for ``value``. Libbson provides macros to make this less tedious when using string literals. The following two appends are identical. .. code-block:: c bson_append_utf8 (&b, "key", -1, "value", -1); BSON_APPEND_UTF8 (&b, "key", "value"); Now let's take a look at an example that adds a few different field types to a BSON document. .. code-block:: c bson_t b = BSON_INITIALIZER; BSON_APPEND_INT32 (&b, "a", 1); BSON_APPEND_UTF8 (&b, "hello", "world"); BSON_APPEND_BOOL (&b, "bool", true); Notice that we omitted the call to :symbol:`bson_init()`. By specifying ``BSON_INITIALIZER`` we can remove the need to initialize the structure to a base state. Sub-Documents and Sub-Arrays ---------------------------- To simplify the creation of sub-documents :symbol:`bson_append_document_begin()` can be used to build a sub-document using the parent's memory region as the destination buffer. .. literalinclude:: ../examples/creating.c :language: c :start-after: // bson_append_document_begin example ... begin :end-before: // bson_append_document_begin example ... end :dedent: 6 To simplify the creation of sub-arrays :symbol:`bson_array_builder_t` can be used to build a sub-array using the parent's memory region as the destination buffer. .. literalinclude:: ../examples/creating.c :language: c :start-after: // bson_array_builder_t example ... begin :end-before: // bson_array_builder_t example ... end :dedent: 6 Simplified BSON C Object Notation --------------------------------- Creating BSON documents by hand can be tedious and time consuming. BCON, or BSON C Object Notation, was added to allow for the creation of BSON documents in a format that looks closer to the destination format. The following example shows the use of BCON. Notice that values for fields are wrapped in the ``BCON_*`` macros. These are required for the variadic processor to determine the parameter type. .. code-block:: c bson_t *doc; doc = BCON_NEW ("foo", "{", "int", BCON_INT32 (1), "array", "[", BCON_INT32 (100), "{", "sub", BCON_UTF8 ("value"), "}", "]", "}"); Creates the following document .. code-block:: none { "foo" : { "int" : 1, "array" : [ 100, { "sub" : "value" } ] } } mongo-c-driver-1.26.0/src/libbson/doc/cross-platform-notes.rst000066400000000000000000000002071456567454500242730ustar00rootroot00000000000000:man_page: bson_cross_platform_notes Cross Platform Notes ==================== .. toctree:: :titlesonly: endianness threading mongo-c-driver-1.26.0/src/libbson/doc/endianness.rst000066400000000000000000000007701456567454500223260ustar00rootroot00000000000000:man_page: bson_endianness Endianness ========== The BSON specification dictates that the encoding format is in little-endian. Many implementations simply ignore endianness altogether and expect that they are to be run on little-endian. Libbson supports both Big and Little Endian systems. This means we use ``memcpy()`` when appropriate instead of dereferencing and properly convert to and from the host endian format. We expect the compiler intrinsics to optimize it to a dereference when possible. mongo-c-driver-1.26.0/src/libbson/doc/errors.rst000066400000000000000000000025161456567454500215130ustar00rootroot00000000000000:man_page: bson_errors Handling Errors =============== Description ----------- Many libbson functions report errors by returning ``NULL`` or -1 and filling out a :symbol:`bson_error_t` structure with an error domain, error code, and message. * ``error.domain`` names the subsystem that generated the error. * ``error.code`` is a domain-specific error type. * ``error.message`` describes the error. Some error codes overlap with others; always check both the domain and code to determine the type of error. ===================== ====================================== ================================================================================================== ``BSON_ERROR_JSON`` ``BSON_JSON_ERROR_READ_CORRUPT_JS`` :symbol:`bson_json_reader_t` tried to parse invalid MongoDB Extended JSON. ``BSON_JSON_ERROR_READ_INVALID_PARAM`` Tried to parse a valid JSON document that is invalid as MongoDBExtended JSON. ``BSON_JSON_ERROR_READ_CB_FAILURE`` An internal callback failure during JSON parsing. ``BSON_ERROR_READER`` ``BSON_ERROR_READER_BADFD`` :symbol:`bson_json_reader_new_from_file` could not open the file. ===================== ====================================== ================================================================================================== mongo-c-driver-1.26.0/src/libbson/doc/full_index.rst000066400000000000000000000004271456567454500223270ustar00rootroot00000000000000:man_page: bson_reference :orphan: .. Yes it's confusing: the home page is called "index" so this is "full_index", and it works by including the complete Table of Contents from the homepage, i.e., "index". Index ===== .. toctree:: :maxdepth: 6 :titlesonly: index mongo-c-driver-1.26.0/src/libbson/doc/guides.rst000066400000000000000000000001501456567454500214470ustar00rootroot00000000000000:man_page: bson_guides Guides ====== .. toctree:: :titlesonly: streaming-bson json lifetimes mongo-c-driver-1.26.0/src/libbson/doc/include-and-link.rst000066400000000000000000000030301456567454500233050ustar00rootroot00000000000000:man_page: bson_include_and_link Using libbson In Your C Program =============================== Include bson.h -------------- All libbson's functions and types are available in one header file. Simply include ``bson.h``: .. literalinclude:: ../examples/hello_bson.c :caption: hello_bson.c :start-after: -- sphinx-include-start -- CMake ----- The libbson installation includes a `CMake config-file package`_, so you can use CMake's `find_package`_ command to import libbson's CMake target and link to libbson (as a shared library): .. literalinclude:: ../examples/cmake/find_package/CMakeLists.txt :caption: CMakeLists.txt :start-after: -- sphinx-include-start -- You can also use libbson as a static library instead: Use the ``mongo::bson_static`` CMake target: .. literalinclude:: ../examples/cmake/find_package_static/CMakeLists.txt :start-after: -- sphinx-include-start -- :emphasize-lines: 1, 5 .. _CMake config-file package: https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#config-file-packages .. _find_package: https://cmake.org/cmake/help/latest/command/find_package.html pkg-config ---------- If you're not using CMake, use `pkg-config`_ on the command line to set header and library paths: .. literalinclude:: ../examples/compile-with-pkg-config.sh :start-after: -- sphinx-include-start -- Or to statically link to libbson: .. literalinclude:: ../examples/compile-with-pkg-config-static.sh :start-after: -- sphinx-include-start -- .. _pkg-config: https://www.freedesktop.org/wiki/Software/pkg-config/ mongo-c-driver-1.26.0/src/libbson/doc/includes/000077500000000000000000000000001456567454500212475ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/doc/includes/seealso/000077500000000000000000000000001456567454500227025ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/doc/includes/seealso/bson-as-json.txt000066400000000000000000000005041456567454500257530ustar00rootroot00000000000000.. seealso:: | :symbol: `bson_array_as_canonical_extended_json()` | :symbol:`bson_array_as_json()` | :symbol: `bson_array_as_relaxed_extended_json()` | :symbol:`bson_as_canonical_extended_json()` | :symbol:`bson_as_json()` | :symbol:`bson_as_json_with_opts()` | :symbol:`bson_as_relaxed_extended_json()` mongo-c-driver-1.26.0/src/libbson/doc/includes/seealso/create-bson.txt000066400000000000000000000005661456567454500256540ustar00rootroot00000000000000.. seealso:: | :symbol:`bson_concat()` | :symbol:`bson_init()` | :symbol:`bson_init_from_json()` | :symbol:`bson_init_static()` | :symbol:`bson_new()` | :symbol:`bson_new_from_buffer()` | :symbol:`bson_new_from_data()` | :symbol:`bson_new_from_json()` | :symbol:`bson_reinit()` | :symbol:`bson_reserve_buffer()` | :symbol:`bson_sized_new()` mongo-c-driver-1.26.0/src/libbson/doc/includes/seealso/iter-init.txt000066400000000000000000000002461456567454500253510ustar00rootroot00000000000000.. seealso:: | :symbol:`bson_iter_init()` | :symbol:`bson_iter_init_find()` | :symbol:`bson_iter_init_find_case()` | :symbol:`bson_iter_init_from_data()` mongo-c-driver-1.26.0/src/libbson/doc/includes/seealso/json.txt000066400000000000000000000001751456567454500244170ustar00rootroot00000000000000.. seealso:: | :symbol:`bson_init_from_json()` | :symbol:`bson_json_reader_read()` | :symbol:`bson_new_from_json()` mongo-c-driver-1.26.0/src/libbson/doc/index.rst000066400000000000000000000010051456567454500212760ustar00rootroot00000000000000libbson ======= A Cross Platform BSON Library for C Introduction ------------ libbson builds, parses, and iterates `BSON `_ documents, the native data format of MongoDB. It also converts BSON to and from JSON, and provides a platform compatibility layer for `the MongoDB C Driver `_. .. toctree:: :titlesonly: tutorial .. toctree:: :titlesonly: guides .. toctree:: :titlesonly: cross-platform-notes .. toctree:: :titlesonly: :maxdepth: 2 api mongo-c-driver-1.26.0/src/libbson/doc/json.rst000066400000000000000000000153611456567454500211520ustar00rootroot00000000000000:man_page: bson_json JSON ==== Libbson provides routines for converting to and from the JSON format. In particular, it supports the `MongoDB extended JSON `_ format. Converting BSON to JSON ----------------------- There are often times where you might want to convert a BSON document to JSON. It is convenient for debugging as well as an interchange format. To help with this, Libbson contains the functions :symbol:`bson_as_canonical_extended_json()` and :symbol:`bson_as_relaxed_extended_json()`. The canonical format preserves BSON type information for values that may have ambiguous representations in JSON (e.g. numeric types). .. code-block:: c bson_t *b; size_t len; char *str; b = BCON_NEW ("a", BCON_INT32 (1)); str = bson_as_canonical_extended_json (b, &len); printf ("%s\n", str); bson_free (str); bson_destroy (b); .. code-block:: none { "a" : { "$numberInt": "1" } } The relaxed format prefers JSON primitives for numeric values and may be used if type fidelity is not required. .. code-block:: c bson_t *b; size_t len; char *str; b = BCON_NEW ("a", BCON_INT32 (1)); str = bson_as_relaxed_extended_json (b, &len); printf ("%s\n", str); bson_free (str); bson_destroy (b); .. code-block:: none { "a" : 1 } Converting JSON to BSON ----------------------- Converting back from JSON is also useful and common enough that we added :symbol:`bson_init_from_json()` and :symbol:`bson_new_from_json()`. The following example creates a new :symbol:`bson_t` from the JSON string ``{"a":1}``. .. code-block:: c bson_t *b; bson_error_t error; b = bson_new_from_json ("{\"a\":1}", -1, &error); if (!b) { printf ("Error: %s\n", error.message); } else { bson_destroy (b); } Streaming JSON Parsing ---------------------- Libbson provides :symbol:`bson_json_reader_t` to allow for parsing a sequence of JSON documents into BSON. The interface is similar to :symbol:`bson_reader_t` but expects the input to be in the `MongoDB extended JSON `_ format. .. code-block:: c /* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each JSON document contained in the provided files * as a BSON string to STDOUT. */ #include #include #include int main (int argc, char *argv[]) { bson_json_reader_t *reader; bson_error_t error; const char *filename; bson_t doc = BSON_INITIALIZER; int i; int b; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s FILE...\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; /* * Open the filename provided in command line arguments. */ if (0 == strcmp (filename, "-")) { reader = bson_json_reader_new_from_fd (STDIN_FILENO, false); } else { if (!(reader = bson_json_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to BSON and print to stdout. */ while ((b = bson_json_reader_read (reader, &doc, &error))) { if (b < 0) { fprintf (stderr, "Error in json parsing:\n%s\n", error.message); abort (); } if (fwrite (bson_get_data (&doc), 1, doc.len, stdout) != doc.len) { fprintf (stderr, "Failed to write to stdout, exiting.\n"); exit (1); } bson_reinit (&doc); } bson_json_reader_destroy (reader); bson_destroy (&doc); } return 0; } Examples -------- The following example reads BSON documents from ``stdin`` and prints them to ``stdout`` as JSON. .. code-block:: c /* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each BSON document contained in the provided files * as a JSON string to STDOUT. */ #include #include int main (int argc, char *argv[]) { bson_reader_t *reader; const bson_t *b; bson_error_t error; const char *filename; char *str; int i; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s [FILE | -]...\nUse - for STDIN.\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; if (strcmp (filename, "-") == 0) { reader = bson_reader_new_from_fd (STDIN_FILENO, false); } else { if (!(reader = bson_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to JSON and print to stdout. */ while ((b = bson_reader_read (reader, NULL))) { str = bson_as_canonical_extended_json (b, NULL); fprintf (stdout, "%s\n", str); bson_free (str); } /* * Cleanup after our reader, which closes the file descriptor. */ bson_reader_destroy (reader); } return 0; } mongo-c-driver-1.26.0/src/libbson/doc/lifetimes.rst000066400000000000000000000030571456567454500221610ustar00rootroot00000000000000:man_page: bson_lifetimes :symbol:`bson_t` lifetimes ========================== A :symbol:`bson_t` may contain its data directly or may contain pointers to heap-allocated memory. Overwriting an existing :symbol:`bson_t` or allowing a stack-allocated :symbol:`bson_t` to go out of scope may cause a memory leak. A :symbol:`bson_t` should always be destroyed with :symbol:`bson_destroy()`. :symbol:`bson_t` out parameters ------------------------------- A :symbol:`bson_t` pointer used as an out parameter must point to valid overwritable storage for a new :symbol:`bson_t` which must be one of: #. Uninitialized storage for a :symbol:`bson_t`. #. A zero-initialized :symbol:`bson_t` object. #. A :symbol:`bson_t` object initialized with ``BSON_INITIALIZER``. #. A :symbol:`bson_t` object not created with :symbol:`bson_new` that was destroyed with :symbol:`bson_destroy`. This can be on the stack: .. code-block:: c bson_t stack_doc = BSON_INITIALIZER; example_get_doc (&stack_doc); bson_destroy (&stack_doc); Or on the heap: .. code-block:: c bson_t *heap_doc = bson_malloc (sizeof (bson_t)); example_get_doc (heap_doc); bson_destroy (heap_doc); bson_free (heap_doc); Omitting :symbol:`bson_destroy` in either case may cause memory leaks. .. warning:: Passing a :symbol:`bson_t` pointer obtained from :symbol:`bson_new` as an out parameter will result in a leak of the :symbol:`bson_t` struct. .. code-block:: c bson_t *heap_doc = bson_new (); example_get_doc (heap_doc); bson_destroy (heap_doc); // Leaks the `bson_t` struct! mongo-c-driver-1.26.0/src/libbson/doc/oid.rst000066400000000000000000000040511456567454500207460ustar00rootroot00000000000000:man_page: bson_oid ObjectIDs ========= Libbson provides a simple way to generate ObjectIDs. It can be used in a single-threaded or multi-threaded manner depending on your requirements. The :symbol:`bson_oid_t` structure represents an ``ObjectID`` in MongoDB. It is a 96-bit identifier. Composition ----------- * 4 bytes : The UNIX timestamp in big-endian format. * 5 bytes : A random number. * 3 bytes : A 24-bit monotonic counter incrementing from ``rand()`` in big-endian. Sorting ObjectIDs ----------------- The typical way to sort in C is using ``qsort()``. Therefore, Libbson provides a ``qsort()`` compatible callback function named :symbol:`bson_oid_compare()`. It returns ``less than 1``, ``greater than 1``, or ``0`` depending on the equality of two :symbol:`bson_oid_t` structures. Comparing Object IDs -------------------- If you simply want to compare two :symbol:`bson_oid_t` structures for equality, use :symbol:`bson_oid_equal()`. Generating ---------- To generate a :symbol:`bson_oid_t`, you may use the following. .. code-block:: c bson_oid_t oid; bson_oid_init (&oid, NULL); Parsing ObjectID Strings ------------------------ You can also parse a string containing a :symbol:`bson_oid_t`. The input string *MUST* be 24 characters or more in length. .. code-block:: c bson_oid_t oid; bson_oid_init_from_string (&oid, "123456789012345678901234"); .. code-block:: c bson_oid_t oid; bson_oid_init_from_string_unsafe (&oid, "123456789012345678901234"); Hashing ObjectIDs ----------------- If you need to store items in a hashtable, you may want to use the :symbol:`bson_oid_t` as the key. Libbson provides a hash function for just this purpose. It is based on DJB hash. .. code-block:: c unsigned hash; hash = bson_oid_hash (oid); Fetching ObjectID Creation Time ------------------------------- You can easily fetch the time that a :symbol:`bson_oid_t` was generated using :symbol:`bson_oid_get_time_t()`. .. code-block:: c time_t t; t = bson_oid_get_time_t (oid); printf ("The OID was generated at %u\n", (unsigned) t); mongo-c-driver-1.26.0/src/libbson/doc/parsing.rst000066400000000000000000000073711456567454500216460ustar00rootroot00000000000000:man_page: bson_parsing Parsing and Iterating BSON Documents ==================================== Parsing ------- BSON documents are lazily parsed as necessary. To begin parsing a BSON document, use one of the provided Libbson functions to create a new :symbol:`bson_t` from existing data such as :symbol:`bson_new_from_data()`. This will make a copy of the data so that additional mutations may occur to the BSON document. .. tip:: If you only want to parse a BSON document and have no need to mutate it, you may use :symbol:`bson_init_static()` to avoid making a copy of the data. .. code-block:: c bson_t *b; b = bson_new_from_data (my_data, my_data_len); if (!b) { fprintf (stderr, "The specified length embedded in did not match " "\n"); return; } bson_destroy (b); Only two checks are performed when creating a new :symbol:`bson_t` from an existing buffer. First, the document must begin with the buffer length, matching what was expected by the caller. Second, the document must end with the expected trailing ``\0`` byte. To parse the document further we use a :symbol:`bson_iter_t` to iterate the elements within the document. Let's print all of the field names in the document. .. code-block:: c bson_t *b; bson_iter_t iter; if ((b = bson_new_from_data (my_data, my_data_len))) { if (bson_iter_init (&iter, b)) { while (bson_iter_next (&iter)) { printf ("Found element key: \"%s\"\n", bson_iter_key (&iter)); } } bson_destroy (b); } Converting a document to JSON uses a :symbol:`bson_iter_t` and :symbol:`bson_visitor_t` to iterate all fields of a BSON document recursively and generate a UTF-8 encoded JSON string. .. code-block:: c bson_t *b; char *json; if ((b = bson_new_from_data (my_data, my_data_len))) { if ((json = bson_as_canonical_extended_json (b, NULL))) { printf ("%s\n", json); bson_free (json); } bson_destroy (b); } Recursing into Sub-Documents ---------------------------- Libbson provides convenient sub-iterators to dive down into a sub-document or sub-array. Below is an example that will dive into a sub-document named "foo" and print it's field names. .. code-block:: c bson_iter_t iter; bson_iter_t child; char *json; if (bson_iter_init_find (&iter, doc, "foo") && BSON_ITER_HOLDS_DOCUMENT (&iter) && bson_iter_recurse (&iter, &child)) { while (bson_iter_next (&child)) { printf ("Found sub-key of \"foo\" named \"%s\"\n", bson_iter_key (&child)); } } Finding Fields using Dot Notation --------------------------------- Using the :symbol:`bson_iter_recurse()` function exemplified above, :symbol:`bson_iter_find_descendant()` can find a field for you using the MongoDB style path notation such as "foo.bar.0.baz". Let's create a document like ``{"foo": {"bar": [{"baz: 1}]}}`` and locate the ``"baz"`` field. .. code-block:: c bson_t *b; bson_iter_t iter; bson_iter_t baz; b = BCON_NEW ("foo", "{", "bar", "[", "{", "baz", BCON_INT32 (1), "}", "]", "}"); if (bson_iter_init (&iter, b) && bson_iter_find_descendant (&iter, "foo.bar.0.baz", &baz) && BSON_ITER_HOLDS_INT32 (&baz)) { printf ("baz = %d\n", bson_iter_int32 (&baz)); } bson_destroy (b); Validating a BSON Document -------------------------- If all you want to do is validate that a BSON document is valid, you can use :symbol:`bson_validate()`. .. code-block:: c size_t err_offset; if (!bson_validate (doc, BSON_VALIDATE_NONE, &err_offset)) { fprintf (stderr, "The document failed to validate at offset: %u\n", (unsigned) err_offset); } See the :symbol:`bson_validate()` documentation for more information and examples. mongo-c-driver-1.26.0/src/libbson/doc/streaming-bson.rst000066400000000000000000000053251456567454500231300ustar00rootroot00000000000000:man_page: bson_streaming_bson Streaming BSON ============== :symbol:`bson_reader_t` provides a streaming reader which can be initialized with a filedescriptor or memory region. :symbol:`bson_writer_t` provides a streaming writer which can be initialized with a memory region. (Streaming BSON to a file descriptor is not yet supported.) Reading from a BSON Stream -------------------------- :symbol:`bson_reader_t` provides a convenient API to read sequential BSON documents from a file-descriptor or memory buffer. The :symbol:`bson_reader_read()` function will read forward in the underlying stream and return a :symbol:`bson_t` that can be inspected and iterated upon. .. code-block:: c #include #include int main (int argc, char *argv[]) { bson_reader_t *reader; const bson_t *doc; bson_error_t error; bool eof; reader = bson_reader_new_from_file ("mycollection.bson", &error); if (!reader) { fprintf (stderr, "Failed to open file.\n"); return 1; } while ((doc = bson_reader_read (reader, &eof))) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } if (!eof) { fprintf (stderr, "corrupted bson document found at %u\n", (unsigned) bson_reader_tell (reader)); } bson_reader_destroy (reader); return 0; } See :symbol:`bson_reader_new_from_fd()`, :symbol:`bson_reader_new_from_file()`, and :symbol:`bson_reader_new_from_data()` for more information. Writing a sequence of BSON Documents ------------------------------------ :symbol:`bson_writer_t` provides a convenient API to write a sequence of BSON documents to a memory buffer that can grow with ``realloc()``. The :symbol:`bson_writer_begin()` and :symbol:`bson_writer_end()` functions will manage the underlying buffer while building the sequence of documents. This could also be useful if you want to write to a network packet while serializing the documents from a higher level language, (but do so just after the packets header). .. code-block:: c #include #include #include int main (int argc, char *argv[]) { bson_writer_t *writer; bson_t *doc; uint8_t *buf = NULL; size_t buflen = 0; bool r; int i; writer = bson_writer_new (&buf, &buflen, 0, bson_realloc_ctx, NULL); for (i = 0; i < 10000; i++) { r = bson_writer_begin (writer, &doc); assert (r); r = BSON_APPEND_INT32 (doc, "i", i); assert (r); bson_writer_end (writer); } bson_free (buf); return 0; } See :symbol:`bson_writer_new()` for more information. mongo-c-driver-1.26.0/src/libbson/doc/threading.rst000066400000000000000000000010041456567454500221330ustar00rootroot00000000000000:man_page: bson_threading Threading ========= Libbson's data structures are *NOT* thread-safe. You are responsible for accessing and mutating these structures from one thread at a time. Libbson requires POSIX threads (pthreads) on all UNIX-like platforms. On Windows, the native threading interface is used. Libbson uses your system's threading library to safely generate unique :doc:`ObjectIds `, and to provide a fallback implementation for atomic operations on platforms without built-in atomics. mongo-c-driver-1.26.0/src/libbson/doc/tutorial.rst000066400000000000000000000002271456567454500220370ustar00rootroot00000000000000:man_page: bson_tutorial Tutorial ======== .. toctree:: :titlesonly: :maxdepth: 1 include-and-link creating errors oid parsing utf8 mongo-c-driver-1.26.0/src/libbson/doc/utf8.rst000066400000000000000000000017421456567454500210650ustar00rootroot00000000000000:man_page: bson_utf8 UTF-8 ===== Encoding -------- Libbson expects that you are always working with UTF-8 encoded text. Anything else is **invalid API use**. If you should need to walk through UTF-8 sequences, you can use the various UTF-8 helper functions distributed with Libbson. Validating a UTF-8 Sequence --------------------------- To validate the string contained in ``my_string``, use the following. You may pass ``-1`` for the string length if you know the string is NULL-terminated. .. code-block:: c if (!bson_utf8_validate (my_string, -1, false)) { printf ("Validation failed.\n"); } If ``my_string`` has NULL bytes within the string, you must provide the string length. Use the following format. Notice the ``true`` at the end indicating ``\0`` is allowed. .. code-block:: c if (!bson_utf8_validate (my_string, my_string_len, true)) { printf ("Validation failed.\n"); } For more information see the API reference for :symbol:`bson_utf8_validate()`. mongo-c-driver-1.26.0/src/libbson/doc/version.rst000066400000000000000000000021051456567454500216560ustar00rootroot00000000000000:man_page: bson_version Libbson Versioning ================== Versioning Macros and Functions Macros ------ The following preprocessor macros can be used to perform various checks based on the version of the library you are compiling against. This may be useful if you only want to enable a feature on a certain version of the library. Synopsis -------- .. code-block:: c #define BSON_CHECK_VERSION(major, minor, micro) #define BSON_MAJOR_VERSION (1) #define BSON_MINOR_VERSION (4) #define BSON_MICRO_VERSION (1) #define BSON_VERSION_S "1.4.1" #define BSON_VERSION_HEX \ (BSON_MAJOR_VERSION << 24 | BSON_MINOR_VERSION << 16 | \ BSON_MICRO_VERSION << 8) Only compile a block on Libbson 1.1.0 and newer. .. code-block:: c #if BSON_CHECK_VERSION(1, 1, 0) static void do_something (void) { } #endif .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_check_version bson_get_major_version bson_get_micro_version bson_get_minor_version bson_get_version mongo-c-driver-1.26.0/src/libbson/examples/000077500000000000000000000000001456567454500205125ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/examples/bcon-col-view.c000066400000000000000000000042151456567454500233240ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #define QUERY(...) ELE_QUERY, __VA_ARGS__, NULL #define SORT(...) ELE_SORT, __VA_ARGS__, NULL #define LIMIT(var) ELE_LIMIT, (var) #define COL_VIEW_CREATE(...) col_view_create ("", __VA_ARGS__, ELE_END) typedef enum ele { ELE_SORT, ELE_LIMIT, ELE_QUERY, ELE_END, } ele_t; bson_t * col_view_create (const char *stub, ...) { bson_t *bson; va_list ap; ele_t type; int keep_going = 1; bcon_append_ctx_t ctx; bcon_append_ctx_init (&ctx); va_start (ap, stub); bson = bson_new (); while (keep_going) { type = va_arg (ap, ele_t); switch (type) { case ELE_SORT: BCON_APPEND_CTX (bson, &ctx, "sort", "{"); bcon_append_ctx_va (bson, &ctx, &ap); BCON_APPEND_CTX (bson, &ctx, "}"); break; case ELE_LIMIT: { int i = va_arg (ap, int); BCON_APPEND_CTX (bson, &ctx, "limit", BCON_INT32 (i)); break; } case ELE_QUERY: BCON_APPEND_CTX (bson, &ctx, "query", "{"); bcon_append_ctx_va (bson, &ctx, &ap); BCON_APPEND_CTX (bson, &ctx, "}"); break; case ELE_END: keep_going = 0; break; default: BSON_ASSERT (0); break; } } va_end (ap); return bson; } int main (void) { bson_t *bson; char *json; bson = COL_VIEW_CREATE ( SORT ("a", BCON_INT32 (1)), QUERY ("hello", "world"), LIMIT (10)); json = bson_as_canonical_extended_json (bson, NULL); printf ("%s\n", json); bson_free (json); bson_destroy (bson); return 0; } mongo-c-driver-1.26.0/src/libbson/examples/bcon-speed.c000066400000000000000000000047601456567454500227040ustar00rootroot00000000000000/* * Copyright 2013-2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include /* * This is a test for comparing the performance of BCON to regular * bson_append*() function calls. * * Maybe run the following a few times to get an idea of the performance * implications of using BCON. Generally, it's fast enough to be very * useful and result in easier to read BSON code. * * time ./bcon-speed 100000 y * time ./bcon-speed 100000 n */ int main (int argc, char *argv[]) { int i; int n; int bcon; bson_t bson, foo, bar, baz; bson_init (&bson); if (argc != 3) { fprintf (stderr, "usage: bcon-speed NUM_ITERATIONS [y|n]\n" "\n" " y = perform speed tests with bcon\n" " n = perform speed tests with bson_append\n" "\n"); return EXIT_FAILURE; } BSON_ASSERT (argc == 3); n = atoi (argv[1]); bcon = (argv[2][0] == 'y') ? 1 : 0; for (i = 0; i < n; i++) { if (bcon) { BCON_APPEND (&bson, "foo", "{", "bar", "{", "baz", "[", BCON_INT32 (1), BCON_INT32 (2), BCON_INT32 (3), "]", "}", "}"); } else { bson_append_document_begin (&bson, "foo", -1, &foo); bson_append_document_begin (&foo, "bar", -1, &bar); bson_append_array_begin (&bar, "baz", -1, &baz); bson_append_int32 (&baz, "0", -1, 1); bson_append_int32 (&baz, "1", -1, 2); bson_append_int32 (&baz, "2", -1, 3); bson_append_array_end (&bar, &baz); bson_append_document_end (&foo, &bar); bson_append_document_end (&bson, &foo); } bson_reinit (&bson); } bson_destroy (&bson); return 0; } mongo-c-driver-1.26.0/src/libbson/examples/bson-check-depth.c000066400000000000000000000065371456567454500240070ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* -- sphinx-include-start -- */ /* Reports the maximum nested depth of a BSON document. */ #include #include #include #include #include typedef struct { uint32_t depth; uint32_t max_depth; bool valid; } check_depth_t; bool _check_depth_document (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); static const bson_visitor_t check_depth_funcs = { NULL, NULL, NULL, NULL, NULL, _check_depth_document, _check_depth_document, NULL, }; bool _check_depth_document (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data) { check_depth_t *state = (check_depth_t *) data; bson_iter_t child; BSON_UNUSED (iter); BSON_UNUSED (key); if (!bson_iter_init (&child, v_document)) { fprintf (stderr, "corrupt\n"); return true; /* cancel */ } state->depth++; if (state->depth > state->max_depth) { state->valid = false; return true; /* cancel */ } bson_iter_visit_all (&child, &check_depth_funcs, state); state->depth--; return false; /* continue */ } void check_depth (const bson_t *bson, uint32_t max_depth) { bson_iter_t iter; check_depth_t state = {0}; if (!bson_iter_init (&iter, bson)) { fprintf (stderr, "corrupt\n"); } state.valid = true; state.max_depth = max_depth; _check_depth_document (&iter, NULL, bson, &state); if (!state.valid) { printf ("document exceeds maximum depth of %" PRIu32 "\n", state.max_depth); } else { char *as_json = bson_as_canonical_extended_json (bson, NULL); printf ("document %s ", as_json); printf ("is valid\n"); bson_free (as_json); } } int main (int argc, char **argv) { bson_reader_t *bson_reader; const bson_t *bson; bool reached_eof; bson_error_t error; if (argc != 3) { fprintf (stderr, "usage: %s FILE MAX_DEPTH\n", argv[0]); fprintf (stderr, "Checks that the depth of the BSON contained in FILE\n"); fprintf (stderr, "does not exceed MAX_DEPTH\n"); } const char *const filename = argv[1]; const int max_depth = atoi (argv[2]); bson_reader = bson_reader_new_from_file (filename, &error); if (!bson_reader) { printf ("could not read %s: %s\n", filename, error.message); return 1; } BSON_ASSERT (bson_in_range_signed (uint32_t, max_depth)); while ((bson = bson_reader_read (bson_reader, &reached_eof))) { check_depth (bson, (uint32_t) max_depth); } if (!reached_eof) { printf ("error reading BSON\n"); } bson_reader_destroy (bson_reader); return 0; } mongo-c-driver-1.26.0/src/libbson/examples/bson-metrics.c000066400000000000000000000243601456567454500232700ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will scan each BSON document contained in the provided files * and print metrics to STDOUT. */ #include #include #include #define MAX_RECURSION 100 static double dtimeofday (void) { struct timeval timeval; bson_gettimeofday (&timeval); return (timeval.tv_sec + timeval.tv_usec * 0.000001); } typedef struct { uint64_t count; char *description; } bson_type_metrics_t; typedef struct { uint64_t doc_count; uint64_t element_count; uint64_t doc_size_max; uint64_t key_size_tally; uint64_t utf8_size_tally; uint32_t depth; bson_type_metrics_t bson_type_metrics[256]; } bson_metrics_state_t; static bson_metrics_state_t initial_state = { 0L, 0L, 0L, 0L, 0L, 0L, {{/* BSON_TYPE_EOD = 0x00 */ 0L, "End of document"}, {/* BSON_TYPE_DOUBLE = 0x01 */ 0L, "Floating point"}, {/* BSON_TYPE_UTF8 = 0x02 */ 0L, "UTF-8 string"}, {/* BSON_TYPE_DOCUMENT = 0x03 */ 0L, "Embedded document"}, {/* BSON_TYPE_ARRAY = 0x04 */ 0L, "Array"}, {/* BSON_TYPE_BINARY = 0x05 */ 0L, "Binary data"}, {/* BSON_TYPE_UNDEFINED = 0x06 */ 0L, "Undefined - Deprecated"}, {/* BSON_TYPE_OID = 0x07 */ 0L, "ObjectId"}, {/* BSON_TYPE_BOOL = 0x08 */ 0L, "Boolean"}, {/* BSON_TYPE_DATE_TIME = 0x09 */ 0L, "UTC datetime"}, {/* BSON_TYPE_NULL = 0x0A */ 0L, "Null value"}, {/* BSON_TYPE_REGEX = 0x0B */ 0L, "Regular expression"}, {/* BSON_TYPE_DBPOINTER = 0x0C */ 0L, "DBPointer - Deprecated"}, {/* BSON_TYPE_CODE = 0x0D */ 0L, "JavaScript code"}, {/* BSON_TYPE_SYMBOL = 0x0E */ 0L, "Symbol - Deprecated"}, {/* BSON_TYPE_CODEWSCOPE = 0x0F */ 0L, "JavaScript code w/ scope"}, {/* BSON_TYPE_INT32 = 0x10 */ 0L, "32-bit Integer"}, {/* BSON_TYPE_TIMESTAMP = 0x11 */ 0L, "Timestamp"}, {/* BSON_TYPE_INT64 = 0x12 */ 0L, "64-bit Integer"}, {0L, NULL}}}; static bson_metrics_state_t state; static int compar_bson_type_metrics (const void *a, const void *b) { const uint64_t a_count = ((bson_type_metrics_t *) a)->count; const uint64_t b_count = ((bson_type_metrics_t *) b)->count; if (a_count == b_count) { return 0; } return a_count < b_count ? -1 : 1; } /* * Forward declarations. */ static bool bson_metrics_visit_array (const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data); static bool bson_metrics_visit_document (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); static bool bson_metrics_visit_utf8 (const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data) { bson_metrics_state_t *s = data; BSON_UNUSED (iter); BSON_UNUSED (key); BSON_UNUSED (v_utf8); s->utf8_size_tally += v_utf8_len; return false; } static bool bson_metrics_visit_before (const bson_iter_t *iter, const char *key, void *data) { bson_metrics_state_t *s = data; bson_type_t btype; ++s->element_count; s->key_size_tally += strlen (key); /* TODO - filter out array keys(?) */ btype = bson_iter_type (iter); ++s->bson_type_metrics[btype].count; return false; } static const bson_visitor_t bson_metrics_visitors = { bson_metrics_visit_before, NULL, /* visit_after */ NULL, /* visit_corrupt */ NULL, /* visit_double */ bson_metrics_visit_utf8, bson_metrics_visit_document, bson_metrics_visit_array, NULL, /* visit_binary */ NULL, /* visit_undefined */ NULL, /* visit_oid */ NULL, /* visit_bool */ NULL, /* visit_date_time */ NULL, /* visit_null */ NULL, /* visit_regex */ NULL, /* visit_dbpointer */ NULL, /* visit_code */ NULL, /* visit_symbol */ NULL, /* visit_codewscope */ NULL, /* visit_int32 */ NULL, /* visit_timestamp */ NULL, /* visit_int64 */ NULL, /* visit_maxkey */ NULL, /* visit_minkey */ }; static bool bson_metrics_visit_document (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data) { bson_metrics_state_t *s = data; bson_iter_t child; BSON_UNUSED (iter); BSON_UNUSED (key); if (s->depth >= MAX_RECURSION) { fprintf (stderr, "Invalid document, max recursion reached.\n"); return true; } if (bson_iter_init (&child, v_document)) { s->depth++; bson_iter_visit_all (&child, &bson_metrics_visitors, data); s->depth--; } return false; } static bool bson_metrics_visit_array (const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data) { bson_metrics_state_t *s = data; bson_iter_t child; BSON_UNUSED (iter); BSON_UNUSED (key); if (s->depth >= MAX_RECURSION) { fprintf (stderr, "Invalid document, max recursion reached.\n"); return true; } if (bson_iter_init (&child, v_array)) { s->depth++; bson_iter_visit_all (&child, &bson_metrics_visitors, data); s->depth--; } return false; } static void bson_metrics (const bson_t *bson, size_t *length, void *data) { bson_iter_t iter; bson_metrics_state_t *s = data; BSON_UNUSED (length); ++s->doc_count; if (bson_iter_init (&iter, bson)) { bson_iter_visit_all (&iter, &bson_metrics_visitors, data); } } int main (int argc, char *argv[]) { bson_reader_t *reader; const bson_t *b; bson_error_t error; const char *filename; int i, j; double dtime_before, dtime_after, dtime_delta; uint64_t aggregate_count; off_t mark; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s FILE...\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ printf ("["); for (i = 1; i < argc; i++) { if (i > 1) printf (","); filename = argv[i]; /* * Initialize a new reader for this file descriptor. */ if (!(reader = bson_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } state = initial_state; dtime_before = dtimeofday (); mark = 0; while ((b = bson_reader_read (reader, NULL))) { off_t pos = bson_reader_tell (reader); state.doc_size_max = BSON_MAX (pos - mark, state.doc_size_max); mark = pos; bson_metrics (b, NULL, &state); } dtime_after = dtimeofday (); dtime_delta = BSON_MAX (dtime_after - dtime_before, 0.000001); state.bson_type_metrics[BSON_TYPE_MAXKEY].description = "Max key"; state.bson_type_metrics[BSON_TYPE_MINKEY].description = "Min key"; aggregate_count = state.bson_type_metrics[BSON_TYPE_DOCUMENT].count + state.bson_type_metrics[BSON_TYPE_ARRAY].count; qsort (state.bson_type_metrics, 256, sizeof (bson_type_metrics_t), compar_bson_type_metrics); printf ("\n {\n"); printf (" \"file\": \"%s\",\n", filename); printf (" \"secs\": %.2f,\n", dtime_delta); printf (" \"docs_per_sec\": %" PRIu64 ",\n", (uint64_t) floor (state.doc_count / dtime_delta)); printf (" \"docs\": %" PRIu64 ",\n", state.doc_count); printf (" \"elements\": %" PRIu64 ",\n", state.element_count); printf (" \"elements_per_doc\": %" PRIu64 ",\n", (uint64_t) floor ((double) state.element_count / (double) BSON_MAX (state.doc_count, 1))); printf (" \"aggregates\": %" PRIu64 ",\n", aggregate_count); printf (" \"aggregates_per_doc\": %" PRIu64 ",\n", (uint64_t) floor ((double) aggregate_count / (double) BSON_MAX (state.doc_count, 1))); printf (" \"degree\": %" PRIu64 ",\n", (uint64_t) floor ( (double) state.element_count / ((double) BSON_MAX (state.doc_count + aggregate_count, 1)))); printf (" \"doc_size_max\": %" PRIu64 ",\n", state.doc_size_max); printf (" \"doc_size_average\": %" PRIu64 ",\n", (uint64_t) floor ((double) bson_reader_tell (reader) / (double) BSON_MAX (state.doc_count, 1))); printf (" \"key_size_average\": %" PRIu64 ",\n", (uint64_t) floor ((double) state.key_size_tally / (double) BSON_MAX (state.element_count, 1))); printf (" \"string_size_average\": %" PRIu64 ",\n", (uint64_t) floor ( (double) state.utf8_size_tally / (double) BSON_MAX ( state.bson_type_metrics[BSON_TYPE_UTF8].count, 1))); printf (" \"percent_by_type\": {\n"); for (j = 0; state.bson_type_metrics[j].count > 0; j++) { bson_type_metrics_t bson_type_metrics = state.bson_type_metrics[j]; printf (" \"%s\": %" PRIu64 ",\n", bson_type_metrics.description, (uint64_t) floor ((double) bson_type_metrics.count * 100.0 / (double) BSON_MAX (state.element_count, 1))); } printf (" }\n"); printf (" }"); /* * Cleanup after our reader, which closes the file descriptor. */ bson_reader_destroy (reader); } printf ("\n]\n"); return 0; } mongo-c-driver-1.26.0/src/libbson/examples/bson-streaming-reader.c000066400000000000000000000120331456567454500250450ustar00rootroot00000000000000/* * Copyright 2015 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #ifdef _WIN32 #include #include #else #include #include #include #include #include #endif #define DEFAULT_PORT "5000" #define DEFAULT_HOST "localhost" /* * bson-streaming-remote-open -- * * Makes a connection to the specified host and port over TCP. This * abstracts away most of the socket details required to make a * connection. * * Parameters: * @hostname: The name of the host to connect to, or NULL. * @port: The port number of the server on the host, or NULL. * * Returns: * A valid file descriptor ready for reading on success. * -1 on failure. */ int bson_streaming_remote_open (const char *hostname, const char *port) { int error, sock; struct addrinfo hints, *ptr, *server_list; /* * Look up the host's address information, hinting that we'd like to use a * TCP/IP connection. */ memset (&hints, 0, sizeof hints); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; error = getaddrinfo ((!hostname || !strlen (hostname)) ? DEFAULT_HOST : hostname, (!port || !strlen (port)) ? DEFAULT_PORT : port, &hints, &server_list); if (error) { fprintf (stderr, "bson-streaming-remote-open: Failed to get server info: %s\n", gai_strerror (error)); return -1; } /* * Iterate through the results of getaddrinfo, attempting to connect to the * first possible result. */ for (ptr = server_list; ptr != NULL; ptr = ptr->ai_next) { sock = socket (ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (sock < 0) { perror ("bson-streaming-remote-open: socket creation failed"); continue; } if (connect (sock, ptr->ai_addr, ptr->ai_addrlen) < 0) { close (sock); perror ("bson-streaming-remote-open: connect failure"); continue; } /* * Connection success. */ break; } freeaddrinfo (server_list); if (ptr == NULL) { fprintf (stderr, "bson-streaming-remote-open: failed to connect to server\n"); return -1; } return sock; } /* * main -- * * Connects to a server and reads BSON from it. This program takes the * following command line options: * * -h Print this help and exit. * -s SERVER_NAME Specify the host name of the server. * -p PORT_NUM Specify the port number to connect to on the server. */ int main (int argc, char *argv[]) { bson_reader_t *reader; char *hostname = NULL; char *json; char *port = NULL; const bson_t *document; int fd; int opt; opterr = 1; /* * Parse command line arguments. */ while ((opt = getopt (argc, argv, "hs:p:")) != -1) { switch (opt) { case 'h': fprintf ( stdout, "Usage: %s [-s SERVER_NAME] [-p PORT_NUM]\n", argv[0]); bson_free (hostname); bson_free (port); return EXIT_SUCCESS; case 'p': bson_free (port); port = (char *) bson_malloc (strlen (optarg) + 1); strcpy (port, optarg); break; case 's': bson_free (hostname); hostname = (char *) bson_malloc (strlen (optarg) + 1); strcpy (hostname, optarg); break; default: fprintf (stderr, "Unknown option: %s\n", optarg); } } /* * Open a file descriptor on the remote and read in BSON documents, one by * one. As an example of processing, this prints the incoming documents as * JSON onto STDOUT. */ fd = bson_streaming_remote_open (hostname, port); if (fd == -1) { bson_free (hostname); bson_free (port); return EXIT_FAILURE; } reader = bson_reader_new_from_fd (fd, true); while ((document = bson_reader_read (reader, NULL))) { json = bson_as_canonical_extended_json (document, NULL); fprintf (stdout, "%s\n", json); bson_free (json); } /* * Destroy the reader, which performs cleanup. The ``true'' argument passed * to bson_reader_new_from_fd tells libbson to close the file descriptor on * destruction. */ bson_reader_destroy (reader); bson_free (hostname); bson_free (port); return EXIT_SUCCESS; } mongo-c-driver-1.26.0/src/libbson/examples/bson-to-json.c000066400000000000000000000040101456567454500232010ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each BSON document contained in the provided files * as a JSON string to STDOUT. */ #include #include #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif int main (int argc, char *argv[]) { bson_reader_t *reader; const bson_t *b; bson_error_t error; const char *filename; char *str; int i; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s [FILE | -]...\nUse - for STDIN.\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; if (strcmp (filename, "-") == 0) { reader = bson_reader_new_from_fd (STDIN_FILENO, false); } else { if (!(reader = bson_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to JSON and print to stdout. */ while ((b = bson_reader_read (reader, NULL))) { str = bson_as_canonical_extended_json (b, NULL); fprintf (stdout, "%s\n", str); bson_free (str); } /* * Cleanup after our reader, which closes the file descriptor. */ bson_reader_destroy (reader); } return 0; } mongo-c-driver-1.26.0/src/libbson/examples/bson-validate.c000066400000000000000000000047641456567454500234210ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will validate each BSON document contained in the files provide * as arguments to the program. Each document from each file is read in * sequence until a bad BSON document is found or there are no more documents * to read. * * Try running it with: * * ./bson-validate tests/binary/overflow2.bson * ./bson-validate tests/binary/trailingnull.bson */ #include #include #include int main (int argc, char *argv[]) { bson_reader_t *reader; const bson_t *b; bson_error_t error; const char *filename; size_t offset; int docnum; int i; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s FILE...\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; docnum = 0; /* * Initialize a new reader for this file descriptor. */ if (!(reader = bson_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } /* * Convert each incoming document to JSON and print to stdout. */ while ((b = bson_reader_read (reader, NULL))) { docnum++; if (!bson_validate ( b, (BSON_VALIDATE_UTF8 | BSON_VALIDATE_UTF8_ALLOW_NULL), &offset)) { fprintf (stderr, "Document %u in \"%s\" is invalid at offset %u.\n", docnum, filename, (int) offset); bson_reader_destroy (reader); return 1; } } /* * Cleanup after our reader, which closes the file descriptor. */ bson_reader_destroy (reader); } return 0; } mongo-c-driver-1.26.0/src/libbson/examples/cmake-deprecated/000077500000000000000000000000001456567454500236705ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/examples/cmake-deprecated/.gitignore000066400000000000000000000001101456567454500256500ustar00rootroot00000000000000CMakeCache.txt CMakeFiles Makefile cmake_install.cmake hello_bson build mongo-c-driver-1.26.0/src/libbson/examples/cmake-deprecated/find_package/000077500000000000000000000000001456567454500262635ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/examples/cmake-deprecated/find_package/CMakeLists.txt000066400000000000000000000030721456567454500310250ustar00rootroot00000000000000# Copyright 2017 MongoDB Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Demonstrates how to use the CMake 'find_package' mechanism to locate # and build against libbson. cmake_minimum_required (VERSION 2.8) if (APPLE) cmake_policy (SET CMP0042 OLD) endif () project (hello_bson LANGUAGES C) # NOTE: For this to work, the CMAKE_PREFIX_PATH variable must be set to point to # the directory that was used as the argument to CMAKE_INSTALL_PREFIX when # building libbson. # -- sphinx-include-start -- # Specify the minimum version you require. find_package (libbson-1.0 1.7 REQUIRED) message (STATUS " libbson found version \"${BSON_VERSION}\"") message (STATUS " libbson include path \"${BSON_INCLUDE_DIRS}\"") message (STATUS " libbson libraries \"${BSON_LIBRARIES}\"") # The "hello_bson.c" sample program is shared among four tests. add_executable (hello_bson ../../hello_bson.c) target_include_directories (hello_bson PRIVATE ${BSON_INCLUDE_DIRS}) target_link_libraries (hello_bson PRIVATE ${BSON_LIBRARIES}) target_compile_definitions (hello_bson PRIVATE ${BSON_DEFINITIONS}) mongo-c-driver-1.26.0/src/libbson/examples/cmake-deprecated/find_package_static/000077500000000000000000000000001456567454500276325ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/examples/cmake-deprecated/find_package_static/CMakeLists.txt000066400000000000000000000032001456567454500323650ustar00rootroot00000000000000# Copyright 2017 MongoDB Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Demonstrates how to use the CMake 'find_package' mechanism to locate # and build against libbson. cmake_minimum_required (VERSION 2.8) if (APPLE) cmake_policy (SET CMP0042 OLD) endif () project (hello_bson LANGUAGES C) # NOTE: For this to work, the CMAKE_PREFIX_PATH variable must be set to point to # the directory that was used as the argument to CMAKE_INSTALL_PREFIX when # building libbson. # -- sphinx-include-start -- # Specify the minimum version you require. find_package (libbson-static-1.0 1.7 REQUIRED) message (STATUS " libbson-static found version \"${BSON_STATIC_VERSION}\"") message (STATUS " libbson-static include path \"${BSON_STATIC_INCLUDE_DIRS}\"") message (STATUS " libbson-static libraries \"${BSON_STATIC_LIBRARIES}\"") # The "hello_bson.c" sample program is shared among four tests. add_executable (hello_bson ../../hello_bson.c) target_include_directories (hello_bson PRIVATE ${BSON_STATIC_INCLUDE_DIRS}) target_link_libraries (hello_bson PRIVATE ${BSON_STATIC_LIBRARIES}) target_compile_definitions (hello_bson PRIVATE ${BSON_STATIC_DEFINITIONS}) mongo-c-driver-1.26.0/src/libbson/examples/cmake/000077500000000000000000000000001456567454500215725ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/examples/cmake/.gitignore000066400000000000000000000001101456567454500235520ustar00rootroot00000000000000CMakeCache.txt CMakeFiles Makefile cmake_install.cmake hello_bson build mongo-c-driver-1.26.0/src/libbson/examples/cmake/find_package/000077500000000000000000000000001456567454500241655ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/examples/cmake/find_package/CMakeLists.txt000066400000000000000000000023541456567454500267310ustar00rootroot00000000000000# Copyright 2017 MongoDB Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Demonstrates how to use the CMake 'find_package' mechanism to locate # and build against libbson. cmake_minimum_required (VERSION 3.0) if (APPLE) cmake_policy (SET CMP0042 OLD) endif () project (hello_bson LANGUAGES C) # NOTE: For this to work, the CMAKE_PREFIX_PATH variable must be set to point to # the directory that was used as the argument to CMAKE_INSTALL_PREFIX when # building libbson. # -- sphinx-include-start -- # Specify the minimum version you require. find_package (bson-1.0 1.7 REQUIRED) # The "hello_bson.c" sample program is shared among four tests. add_executable (hello_bson ../../hello_bson.c) target_link_libraries (hello_bson PRIVATE mongo::bson_shared) mongo-c-driver-1.26.0/src/libbson/examples/cmake/find_package_static/000077500000000000000000000000001456567454500255345ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/examples/cmake/find_package_static/CMakeLists.txt000066400000000000000000000023541456567454500303000ustar00rootroot00000000000000# Copyright 2017 MongoDB Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Demonstrates how to use the CMake 'find_package' mechanism to locate # and build against libbson. cmake_minimum_required (VERSION 2.8) if (APPLE) cmake_policy (SET CMP0042 OLD) endif () project (hello_bson LANGUAGES C) # NOTE: For this to work, the CMAKE_PREFIX_PATH variable must be set to point to # the directory that was used as the argument to CMAKE_INSTALL_PREFIX when # building libbson. # -- sphinx-include-start -- # Specify the minimum version you require. find_package (bson-1.0 1.7 REQUIRED) # The "hello_bson.c" sample program is shared among four tests. add_executable (hello_bson ../../hello_bson.c) target_link_libraries (hello_bson PRIVATE mongo::bson_static) mongo-c-driver-1.26.0/src/libbson/examples/compile-with-pkg-config-static.sh000066400000000000000000000003011456567454500267500ustar00rootroot00000000000000#!/bin/sh set -o errexit # Exit the script with error if any of the commands fail # -- sphinx-include-start -- gcc -o hello_bson hello_bson.c $(pkg-config --libs --cflags libbson-static-1.0) mongo-c-driver-1.26.0/src/libbson/examples/compile-with-pkg-config.sh000066400000000000000000000002721456567454500254720ustar00rootroot00000000000000#!/bin/sh set -o errexit # Exit the script with error if any of the commands fail # -- sphinx-include-start -- gcc -o hello_bson hello_bson.c $(pkg-config --libs --cflags libbson-1.0) mongo-c-driver-1.26.0/src/libbson/examples/creating.c000066400000000000000000000045531456567454500224610ustar00rootroot00000000000000/* Copyright 2017 MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include int main (int argc, const char **argv) { { // bson_append_document_begin example ... begin bson_t parent = BSON_INITIALIZER; bson_t child; bson_append_document_begin (&parent, "foo", 3, &child); bson_append_int32 (&child, "baz", 3, 1); bson_append_document_end (&parent, &child); char *str = bson_as_relaxed_extended_json (&parent, NULL); printf ("%s\n", str); // Prints: { "foo" : { "baz" : 1 } } bson_free (str); bson_destroy (&parent); // bson_append_document_begin example ... end } { // bson_array_builder_t example ... begin bson_t parent = BSON_INITIALIZER; bson_array_builder_t *bab; bson_append_array_builder_begin (&parent, "foo", 3, &bab); bson_array_builder_append_int32 (bab, 9); bson_array_builder_append_int32 (bab, 8); bson_array_builder_append_int32 (bab, 7); bson_append_array_builder_end (&parent, bab); char *str = bson_as_relaxed_extended_json (&parent, NULL); printf ("%s\n", str); // Prints: { "foo" : [ 9, 8, 7 ] } bson_free (str); bson_destroy (&parent); // bson_array_builder_t example ... end } { // bson_array_builder_t top-level example ... begin bson_t out; bson_array_builder_t *bab = bson_array_builder_new (); bson_array_builder_append_int32 (bab, 9); bson_array_builder_append_int32 (bab, 8); bson_array_builder_append_int32 (bab, 7); bson_array_builder_build (bab, &out); char *str = bson_array_as_relaxed_extended_json (&out, NULL); printf ("%s\n", str); // Prints: [ 9, 8, 7 ] bson_free (str); bson_array_builder_destroy (bab); // bson_array_builder_t top-level example ... end } return 0; } mongo-c-driver-1.26.0/src/libbson/examples/hello_bson.c000066400000000000000000000016171456567454500230070ustar00rootroot00000000000000/* Copyright 2017 MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* -- sphinx-include-start -- */ #include #include int main (int argc, const char **argv) { bson_t *b; char *j; b = BCON_NEW ("hello", BCON_UTF8 ("bson!")); j = bson_as_canonical_extended_json (b, NULL); printf ("%s\n", j); bson_free (j); bson_destroy (b); return 0; } mongo-c-driver-1.26.0/src/libbson/examples/json-to-bson.c000066400000000000000000000044401456567454500232100ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each JSON document contained in the provided files * as a BSON string to STDOUT. */ #include #include #include #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif int main (int argc, char *argv[]) { bson_json_reader_t *reader; bson_error_t error; const char *filename; bson_t doc = BSON_INITIALIZER; int i; int b; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s FILE...\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; /* * Open the filename provided in command line arguments. */ if (0 == strcmp (filename, "-")) { reader = bson_json_reader_new_from_fd (STDIN_FILENO, false); } else { if (!(reader = bson_json_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to BSON and print to stdout. */ while ((b = bson_json_reader_read (reader, &doc, &error))) { if (b < 0) { fprintf (stderr, "Error in json parsing:\n%s\n", error.message); abort (); } if (fwrite (bson_get_data (&doc), 1, doc.len, stdout) != doc.len) { fprintf (stderr, "Failed to write to stdout, exiting.\n"); exit (1); } bson_reinit (&doc); } bson_json_reader_destroy (reader); bson_destroy (&doc); } return 0; } mongo-c-driver-1.26.0/src/libbson/fuzz/000077500000000000000000000000001456567454500176725ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/fuzz/fuzz_test_libbson.c000066400000000000000000000005731456567454500236100ustar00rootroot00000000000000#include #include #include #include int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { char *nt = malloc(size+1); memcpy(nt, data, size); nt[size] = '\0'; bson_error_t error; bson_t b; if (bson_init_from_json(&b, nt, -1, &error)) { bson_destroy(&b); } free(nt); return 0; } mongo-c-driver-1.26.0/src/libbson/libbson.rc.in000066400000000000000000000034421456567454500212620ustar00rootroot00000000000000// Defines Version Information to include in DLL on Windows. // Refer: https://learn.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource #include // Defines VS_VERSION_INFO #define BSON_COMPILATION // Tell bson-version.h it is part of compilation. #include // Defines BSON_MAJOR_VERSION and other version macros. #undef BSON_COMPILATION #define BSON_OUTPUT_BASENAME "@BSON_OUTPUT_BASENAME@" #define BSON_API_VERSION "@BSON_API_VERSION@" VS_VERSION_INFO VERSIONINFO FILEVERSION BSON_MAJOR_VERSION,BSON_MINOR_VERSION,BSON_MICRO_VERSION,0 PRODUCTVERSION BSON_MAJOR_VERSION,BSON_MINOR_VERSION,BSON_MICRO_VERSION,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #else FILEFLAGS 0L #endif // Set FILEOS to VOS_UNKNOWN. There is no documented value for 64-bit builds. FILEOS VOS_UNKNOWN FILETYPE VFT_DLL // Set FILESUBTYPE to VFT2_UNKNOWN. There is no applicable value. FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN // Use langID `0409` for "US English". Use charsetID `04b0` for "Unicode" BLOCK "040904b0" BEGIN VALUE "CompanyName", "MongoDB, Inc" VALUE "FileDescription", "A BSON Library for C" VALUE "FileVersion", BSON_VERSION_S VALUE "InternalName", BSON_OUTPUT_BASENAME "-" BSON_API_VERSION VALUE "OriginalFilename", BSON_OUTPUT_BASENAME "-" BSON_API_VERSION ".dll" VALUE "ProductName", "MongoDB C Driver" VALUE "ProductVersion", BSON_VERSION_S VALUE "LegalCopyright", "Copyright (C) 2013-present MongoDB, Inc." END END BLOCK "VarFileInfo" BEGIN // Use langID `0x0409` for "U.S. English". Use charsetID `1200` for "Unicode". VALUE "Translation", 0x409, 1200 END END mongo-c-driver-1.26.0/src/libbson/src/000077500000000000000000000000001456567454500174635ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/src/bson-config.cmake000066400000000000000000000007561456567454500227010ustar00rootroot00000000000000include(CMakeFindDependencyMacro) find_dependency(Threads) # Required for Threads::Threads # Import common targets first: include("${CMAKE_CURRENT_LIST_DIR}/bson-targets.cmake") # Now import the targets of each link-kind that's available. Only the targets of # libbson libraries that were actually installed alongside this file will be # imported. file(GLOB target_files "${CMAKE_CURRENT_LIST_DIR}/bson_*-targets.cmake") foreach(inc IN LISTS target_files) include("${inc}") endforeach() mongo-c-driver-1.26.0/src/libbson/src/bson/000077500000000000000000000000001456567454500204245ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/src/bson/.gitignore000066400000000000000000000000651456567454500224150ustar00rootroot00000000000000bson-config.h bson-stdint.h bson-version.h .dirstamp mongo-c-driver-1.26.0/src/libbson/src/bson/bcon.c000066400000000000000000000654501456567454500215230ustar00rootroot00000000000000/* * @file bcon.c * @brief BCON (BSON C Object Notation) Implementation */ /* Copyright 2009-2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "bcon.h" #include /* These stack manipulation macros are used to manage append recursion in * bcon_append_ctx_va(). They take care of some awkward dereference rules (the * real bson object isn't in the stack, but accessed by pointer) and add in run * time asserts to make sure we don't blow the stack in either direction */ #define STACK_ELE(_delta, _name) (ctx->stack[(_delta) + ctx->n]._name) #define STACK_BSON(_delta) \ (((_delta) + ctx->n) == 0 ? bson : &STACK_ELE (_delta, bson)) #define STACK_ITER(_delta) \ (((_delta) + ctx->n) == 0 ? &root_iter : &STACK_ELE (_delta, iter)) #define STACK_BSON_PARENT STACK_BSON (-1) #define STACK_BSON_CHILD STACK_BSON (0) #define STACK_ITER_PARENT STACK_ITER (-1) #define STACK_ITER_CHILD STACK_ITER (0) #define STACK_I STACK_ELE (0, i) #define STACK_IS_ARRAY STACK_ELE (0, is_array) #define STACK_PUSH_ARRAY(statement) \ do { \ BSON_ASSERT (ctx->n < (BCON_STACK_MAX - 1)); \ ctx->n++; \ STACK_I = 0; \ STACK_IS_ARRAY = 1; \ statement; \ } while (0) #define STACK_PUSH_DOC(statement) \ do { \ BSON_ASSERT (ctx->n < (BCON_STACK_MAX - 1)); \ ctx->n++; \ STACK_IS_ARRAY = 0; \ statement; \ } while (0) #define STACK_POP_ARRAY(statement) \ do { \ BSON_ASSERT (STACK_IS_ARRAY); \ BSON_ASSERT (ctx->n != 0); \ statement; \ ctx->n--; \ } while (0) #define STACK_POP_DOC(statement) \ do { \ BSON_ASSERT (!STACK_IS_ARRAY); \ BSON_ASSERT (ctx->n != 0); \ statement; \ ctx->n--; \ } while (0) /* This is a landing pad union for all of the types we can process with bcon. * We need actual storage for this to capture the return value of va_arg, which * takes multiple calls to get everything we need for some complex types */ typedef union bcon_append { char *UTF8; double DOUBLE; bson_t *DOCUMENT; bson_t *ARRAY; bson_t *BCON; struct { bson_subtype_t subtype; uint8_t *binary; uint32_t length; } BIN; bson_oid_t *OID; bool BOOL; int64_t DATE_TIME; struct { char *regex; char *flags; } REGEX; struct { char *collection; bson_oid_t *oid; } DBPOINTER; const char *CODE; char *SYMBOL; struct { const char *js; bson_t *scope; } CODEWSCOPE; int32_t INT32; struct { uint32_t timestamp; uint32_t increment; } TIMESTAMP; int64_t INT64; bson_decimal128_t *DECIMAL128; const bson_iter_t *ITER; } bcon_append_t; /* same as bcon_append_t. Some extra symbols and varying types that handle the * differences between bson_append and bson_iter */ typedef union bcon_extract { bson_type_t TYPE; bson_iter_t *ITER; const char *key; const char **UTF8; double *DOUBLE; bson_t *DOCUMENT; bson_t *ARRAY; struct { bson_subtype_t *subtype; const uint8_t **binary; uint32_t *length; } BIN; const bson_oid_t **OID; bool *BOOL; int64_t *DATE_TIME; struct { const char **regex; const char **flags; } REGEX; struct { const char **collection; const bson_oid_t **oid; } DBPOINTER; const char **CODE; const char **SYMBOL; struct { const char **js; bson_t *scope; } CODEWSCOPE; int32_t *INT32; struct { uint32_t *timestamp; uint32_t *increment; } TIMESTAMP; int64_t *INT64; bson_decimal128_t *DECIMAL128; } bcon_extract_t; static const char *gBconMagic = "BCON_MAGIC"; static const char *gBconeMagic = "BCONE_MAGIC"; const char * bson_bcon_magic (void) { return gBconMagic; } const char * bson_bcone_magic (void) { return gBconeMagic; } static void _noop (void) { } /* appends val to the passed bson object. Meant to be a super simple dispatch * table */ static void _bcon_append_single (bson_t *bson, bcon_type_t type, const char *key, bcon_append_t *val) { switch ((int) type) { case BCON_TYPE_UTF8: BSON_ASSERT (bson_append_utf8 (bson, key, -1, val->UTF8, -1)); break; case BCON_TYPE_DOUBLE: BSON_ASSERT (bson_append_double (bson, key, -1, val->DOUBLE)); break; case BCON_TYPE_BIN: { BSON_ASSERT (bson_append_binary ( bson, key, -1, val->BIN.subtype, val->BIN.binary, val->BIN.length)); break; } case BCON_TYPE_UNDEFINED: BSON_ASSERT (bson_append_undefined (bson, key, -1)); break; case BCON_TYPE_OID: BSON_ASSERT (bson_append_oid (bson, key, -1, val->OID)); break; case BCON_TYPE_BOOL: BSON_ASSERT (bson_append_bool (bson, key, -1, (bool) val->BOOL)); break; case BCON_TYPE_DATE_TIME: BSON_ASSERT (bson_append_date_time (bson, key, -1, val->DATE_TIME)); break; case BCON_TYPE_NULL: BSON_ASSERT (bson_append_null (bson, key, -1)); break; case BCON_TYPE_REGEX: { BSON_ASSERT ( bson_append_regex (bson, key, -1, val->REGEX.regex, val->REGEX.flags)); break; } case BCON_TYPE_DBPOINTER: { BSON_ASSERT (bson_append_dbpointer ( bson, key, -1, val->DBPOINTER.collection, val->DBPOINTER.oid)); break; } case BCON_TYPE_CODE: BSON_ASSERT (bson_append_code (bson, key, -1, val->CODE)); break; case BCON_TYPE_SYMBOL: BSON_ASSERT (bson_append_symbol (bson, key, -1, val->SYMBOL, -1)); break; case BCON_TYPE_CODEWSCOPE: BSON_ASSERT (bson_append_code_with_scope ( bson, key, -1, val->CODEWSCOPE.js, val->CODEWSCOPE.scope)); break; case BCON_TYPE_INT32: BSON_ASSERT (bson_append_int32 (bson, key, -1, val->INT32)); break; case BCON_TYPE_TIMESTAMP: { BSON_ASSERT (bson_append_timestamp ( bson, key, -1, val->TIMESTAMP.timestamp, val->TIMESTAMP.increment)); break; } case BCON_TYPE_INT64: BSON_ASSERT (bson_append_int64 (bson, key, -1, val->INT64)); break; case BCON_TYPE_DECIMAL128: BSON_ASSERT (bson_append_decimal128 (bson, key, -1, val->DECIMAL128)); break; case BCON_TYPE_MAXKEY: BSON_ASSERT (bson_append_maxkey (bson, key, -1)); break; case BCON_TYPE_MINKEY: BSON_ASSERT (bson_append_minkey (bson, key, -1)); break; case BCON_TYPE_ARRAY: { BSON_ASSERT (bson_append_array (bson, key, -1, val->ARRAY)); break; } case BCON_TYPE_DOCUMENT: { BSON_ASSERT (bson_append_document (bson, key, -1, val->DOCUMENT)); break; } case BCON_TYPE_ITER: BSON_ASSERT (bson_append_iter (bson, key, -1, val->ITER)); break; default: BSON_ASSERT (0); break; } } #define CHECK_TYPE(_type) \ do { \ if (bson_iter_type (iter) != (_type)) { \ return false; \ } \ } while (0) /* extracts the value under the iterator and writes it to val. returns false * if the iterator type doesn't match the token type. * * There are two magic tokens: * * BCONE_SKIP - * Let's us verify that a key has a type, without caring about its value. * This allows for wider declarative BSON verification * * BCONE_ITER - * Returns the underlying iterator. This could allow for more complicated, * procedural verification (if a parameter could have multiple types). * */ static bool _bcon_extract_single (const bson_iter_t *iter, bcon_type_t type, bcon_extract_t *val) { switch ((int) type) { case BCON_TYPE_UTF8: CHECK_TYPE (BSON_TYPE_UTF8); *val->UTF8 = bson_iter_utf8 (iter, NULL); break; case BCON_TYPE_DOUBLE: CHECK_TYPE (BSON_TYPE_DOUBLE); *val->DOUBLE = bson_iter_double (iter); break; case BCON_TYPE_BIN: CHECK_TYPE (BSON_TYPE_BINARY); bson_iter_binary ( iter, val->BIN.subtype, val->BIN.length, val->BIN.binary); break; case BCON_TYPE_UNDEFINED: CHECK_TYPE (BSON_TYPE_UNDEFINED); break; case BCON_TYPE_OID: CHECK_TYPE (BSON_TYPE_OID); *val->OID = bson_iter_oid (iter); break; case BCON_TYPE_BOOL: CHECK_TYPE (BSON_TYPE_BOOL); *val->BOOL = bson_iter_bool (iter); break; case BCON_TYPE_DATE_TIME: CHECK_TYPE (BSON_TYPE_DATE_TIME); *val->DATE_TIME = bson_iter_date_time (iter); break; case BCON_TYPE_NULL: CHECK_TYPE (BSON_TYPE_NULL); break; case BCON_TYPE_REGEX: CHECK_TYPE (BSON_TYPE_REGEX); *val->REGEX.regex = bson_iter_regex (iter, val->REGEX.flags); break; case BCON_TYPE_DBPOINTER: CHECK_TYPE (BSON_TYPE_DBPOINTER); bson_iter_dbpointer ( iter, NULL, val->DBPOINTER.collection, val->DBPOINTER.oid); break; case BCON_TYPE_CODE: CHECK_TYPE (BSON_TYPE_CODE); *val->CODE = bson_iter_code (iter, NULL); break; case BCON_TYPE_SYMBOL: CHECK_TYPE (BSON_TYPE_SYMBOL); *val->SYMBOL = bson_iter_symbol (iter, NULL); break; case BCON_TYPE_CODEWSCOPE: { const uint8_t *buf; uint32_t len; CHECK_TYPE (BSON_TYPE_CODEWSCOPE); *val->CODEWSCOPE.js = bson_iter_codewscope (iter, NULL, &len, &buf); BSON_ASSERT (bson_init_static (val->CODEWSCOPE.scope, buf, len)); break; } case BCON_TYPE_INT32: CHECK_TYPE (BSON_TYPE_INT32); *val->INT32 = bson_iter_int32 (iter); break; case BCON_TYPE_TIMESTAMP: CHECK_TYPE (BSON_TYPE_TIMESTAMP); bson_iter_timestamp ( iter, val->TIMESTAMP.timestamp, val->TIMESTAMP.increment); break; case BCON_TYPE_INT64: CHECK_TYPE (BSON_TYPE_INT64); *val->INT64 = bson_iter_int64 (iter); break; case BCON_TYPE_DECIMAL128: CHECK_TYPE (BSON_TYPE_DECIMAL128); BSON_ASSERT (bson_iter_decimal128 (iter, val->DECIMAL128)); break; case BCON_TYPE_MAXKEY: CHECK_TYPE (BSON_TYPE_MAXKEY); break; case BCON_TYPE_MINKEY: CHECK_TYPE (BSON_TYPE_MINKEY); break; case BCON_TYPE_ARRAY: { const uint8_t *buf; uint32_t len; CHECK_TYPE (BSON_TYPE_ARRAY); bson_iter_array (iter, &len, &buf); BSON_ASSERT (bson_init_static (val->ARRAY, buf, len)); break; } case BCON_TYPE_DOCUMENT: { const uint8_t *buf; uint32_t len; CHECK_TYPE (BSON_TYPE_DOCUMENT); bson_iter_document (iter, &len, &buf); BSON_ASSERT (bson_init_static (val->DOCUMENT, buf, len)); break; } case BCON_TYPE_SKIP: CHECK_TYPE (val->TYPE); break; case BCON_TYPE_ITER: memcpy (val->ITER, iter, sizeof *iter); break; default: BSON_ASSERT (0); break; } return true; } /* Consumes ap, storing output values into u and returning the type of the * captured token. * * The basic workflow goes like this: * * 1. Look at the current arg. It will be a char * * a. If it's a NULL, we're done processing. * b. If it's BCON_MAGIC (a symbol with storage in this module) * I. The next token is the type * II. The type specifies how many args to eat and their types * c. Otherwise it's either recursion related or a raw string * I. If the first byte is '{', '}', '[', or ']' pass back an * appropriate recursion token * II. If not, just call it a UTF8 token and pass that back */ static bcon_type_t _bcon_append_tokenize (va_list *ap, bcon_append_t *u) { char *mark; bcon_type_t type; mark = va_arg (*ap, char *); BSON_ASSERT (mark != BCONE_MAGIC); if (mark == NULL) { type = BCON_TYPE_END; } else if (mark == BCON_MAGIC) { type = va_arg (*ap, bcon_type_t); switch ((int) type) { case BCON_TYPE_UTF8: u->UTF8 = va_arg (*ap, char *); break; case BCON_TYPE_DOUBLE: u->DOUBLE = va_arg (*ap, double); break; case BCON_TYPE_DOCUMENT: u->DOCUMENT = va_arg (*ap, bson_t *); break; case BCON_TYPE_ARRAY: u->ARRAY = va_arg (*ap, bson_t *); break; case BCON_TYPE_BIN: u->BIN.subtype = va_arg (*ap, bson_subtype_t); u->BIN.binary = va_arg (*ap, uint8_t *); u->BIN.length = va_arg (*ap, uint32_t); break; case BCON_TYPE_UNDEFINED: break; case BCON_TYPE_OID: u->OID = va_arg (*ap, bson_oid_t *); break; case BCON_TYPE_BOOL: u->BOOL = va_arg (*ap, int); break; case BCON_TYPE_DATE_TIME: u->DATE_TIME = va_arg (*ap, int64_t); break; case BCON_TYPE_NULL: break; case BCON_TYPE_REGEX: u->REGEX.regex = va_arg (*ap, char *); u->REGEX.flags = va_arg (*ap, char *); break; case BCON_TYPE_DBPOINTER: u->DBPOINTER.collection = va_arg (*ap, char *); u->DBPOINTER.oid = va_arg (*ap, bson_oid_t *); break; case BCON_TYPE_CODE: u->CODE = va_arg (*ap, char *); break; case BCON_TYPE_SYMBOL: u->SYMBOL = va_arg (*ap, char *); break; case BCON_TYPE_CODEWSCOPE: u->CODEWSCOPE.js = va_arg (*ap, char *); u->CODEWSCOPE.scope = va_arg (*ap, bson_t *); break; case BCON_TYPE_INT32: u->INT32 = va_arg (*ap, int32_t); break; case BCON_TYPE_TIMESTAMP: u->TIMESTAMP.timestamp = va_arg (*ap, uint32_t); u->TIMESTAMP.increment = va_arg (*ap, uint32_t); break; case BCON_TYPE_INT64: u->INT64 = va_arg (*ap, int64_t); break; case BCON_TYPE_DECIMAL128: u->DECIMAL128 = va_arg (*ap, bson_decimal128_t *); break; case BCON_TYPE_MAXKEY: break; case BCON_TYPE_MINKEY: break; case BCON_TYPE_BCON: u->BCON = va_arg (*ap, bson_t *); break; case BCON_TYPE_ITER: u->ITER = va_arg (*ap, const bson_iter_t *); break; default: BSON_ASSERT (0); break; } } else { switch (mark[0]) { case '{': type = BCON_TYPE_DOC_START; break; case '}': type = BCON_TYPE_DOC_END; break; case '[': type = BCON_TYPE_ARRAY_START; break; case ']': type = BCON_TYPE_ARRAY_END; break; default: type = BCON_TYPE_UTF8; u->UTF8 = mark; break; } } return type; } /* Consumes ap, storing output values into u and returning the type of the * captured token. * * The basic workflow goes like this: * * 1. Look at the current arg. It will be a char * * a. If it's a NULL, we're done processing. * b. If it's BCONE_MAGIC (a symbol with storage in this module) * I. The next token is the type * II. The type specifies how many args to eat and their types * c. Otherwise it's either recursion related or a raw string * I. If the first byte is '{', '}', '[', or ']' pass back an * appropriate recursion token * II. If not, just call it a UTF8 token and pass that back */ static bcon_type_t _bcon_extract_tokenize (va_list *ap, bcon_extract_t *u) { char *mark; bcon_type_t type; mark = va_arg (*ap, char *); BSON_ASSERT (mark != BCON_MAGIC); if (mark == NULL) { type = BCON_TYPE_END; } else if (mark == BCONE_MAGIC) { type = va_arg (*ap, bcon_type_t); switch ((int) type) { case BCON_TYPE_UTF8: u->UTF8 = va_arg (*ap, const char **); break; case BCON_TYPE_DOUBLE: u->DOUBLE = va_arg (*ap, double *); break; case BCON_TYPE_DOCUMENT: u->DOCUMENT = va_arg (*ap, bson_t *); break; case BCON_TYPE_ARRAY: u->ARRAY = va_arg (*ap, bson_t *); break; case BCON_TYPE_BIN: u->BIN.subtype = va_arg (*ap, bson_subtype_t *); u->BIN.binary = va_arg (*ap, const uint8_t **); u->BIN.length = va_arg (*ap, uint32_t *); break; case BCON_TYPE_UNDEFINED: break; case BCON_TYPE_OID: u->OID = va_arg (*ap, const bson_oid_t **); break; case BCON_TYPE_BOOL: u->BOOL = va_arg (*ap, bool *); break; case BCON_TYPE_DATE_TIME: u->DATE_TIME = va_arg (*ap, int64_t *); break; case BCON_TYPE_NULL: break; case BCON_TYPE_REGEX: u->REGEX.regex = va_arg (*ap, const char **); u->REGEX.flags = va_arg (*ap, const char **); break; case BCON_TYPE_DBPOINTER: u->DBPOINTER.collection = va_arg (*ap, const char **); u->DBPOINTER.oid = va_arg (*ap, const bson_oid_t **); break; case BCON_TYPE_CODE: u->CODE = va_arg (*ap, const char **); break; case BCON_TYPE_SYMBOL: u->SYMBOL = va_arg (*ap, const char **); break; case BCON_TYPE_CODEWSCOPE: u->CODEWSCOPE.js = va_arg (*ap, const char **); u->CODEWSCOPE.scope = va_arg (*ap, bson_t *); break; case BCON_TYPE_INT32: u->INT32 = va_arg (*ap, int32_t *); break; case BCON_TYPE_TIMESTAMP: u->TIMESTAMP.timestamp = va_arg (*ap, uint32_t *); u->TIMESTAMP.increment = va_arg (*ap, uint32_t *); break; case BCON_TYPE_INT64: u->INT64 = va_arg (*ap, int64_t *); break; case BCON_TYPE_DECIMAL128: u->DECIMAL128 = va_arg (*ap, bson_decimal128_t *); break; case BCON_TYPE_MAXKEY: break; case BCON_TYPE_MINKEY: break; case BCON_TYPE_SKIP: u->TYPE = va_arg (*ap, bson_type_t); break; case BCON_TYPE_ITER: u->ITER = va_arg (*ap, bson_iter_t *); break; default: BSON_ASSERT (0); break; } } else { switch (mark[0]) { case '{': type = BCON_TYPE_DOC_START; break; case '}': type = BCON_TYPE_DOC_END; break; case '[': type = BCON_TYPE_ARRAY_START; break; case ']': type = BCON_TYPE_ARRAY_END; break; default: type = BCON_TYPE_RAW; u->key = mark; break; } } return type; } /* This trivial utility function is useful for concatenating a bson object onto * the end of another, ignoring the keys from the source bson object and * continuing to use and increment the keys from the source. It's only useful * when called from bcon_append_ctx_va */ static void _bson_concat_array (bson_t *dest, const bson_t *src, bcon_append_ctx_t *ctx) { bson_iter_t iter; const char *key; char i_str[16]; bool r; r = bson_iter_init (&iter, src); if (!r) { fprintf (stderr, "Invalid BSON document, possible memory coruption.\n"); return; } STACK_I--; while (bson_iter_next (&iter)) { bson_uint32_to_string (STACK_I, &key, i_str, sizeof i_str); STACK_I++; BSON_ASSERT (bson_append_iter (dest, key, -1, &iter)); } } /* Append_ctx_va consumes the va_list until NULL is found, appending into bson * as tokens are found. It can receive or return an in-progress bson object * via the ctx param. It can also operate on the middle of a va_list, and so * can be wrapped inside of another varargs function. * * Note that passing in a va_list that isn't perferectly formatted for BCON * ingestion will almost certainly result in undefined behavior * * The workflow relies on the passed ctx object, which holds a stack of bson * objects, along with metadata (if the emedded layer is an array, and which * element it is on if so). We iterate, generating tokens from the va_list, * until we reach an END token. If any errors occur, we just blow up (the * var_args stuff is already incredibly fragile to mistakes, and we have no way * of introspecting, so just don't screw it up). * * There are also a few STACK_* macros in here which manipulate ctx that are * defined up top. * */ void bcon_append_ctx_va (bson_t *bson, bcon_append_ctx_t *ctx, va_list *ap) { bcon_type_t type; const char *key; char i_str[16]; bcon_append_t u = {0}; while (1) { if (STACK_IS_ARRAY) { bson_uint32_to_string (STACK_I, &key, i_str, sizeof i_str); STACK_I++; } else { type = _bcon_append_tokenize (ap, &u); if (type == BCON_TYPE_END) { return; } if (type == BCON_TYPE_DOC_END) { STACK_POP_DOC ( bson_append_document_end (STACK_BSON_PARENT, STACK_BSON_CHILD)); continue; } if (type == BCON_TYPE_BCON) { bson_concat (STACK_BSON_CHILD, u.BCON); continue; } BSON_ASSERT (type == BCON_TYPE_UTF8); key = u.UTF8; } type = _bcon_append_tokenize (ap, &u); BSON_ASSERT (type != BCON_TYPE_END); switch ((int) type) { case BCON_TYPE_BCON: BSON_ASSERT (STACK_IS_ARRAY); _bson_concat_array (STACK_BSON_CHILD, u.BCON, ctx); break; case BCON_TYPE_DOC_START: STACK_PUSH_DOC (bson_append_document_begin ( STACK_BSON_PARENT, key, -1, STACK_BSON_CHILD)); break; case BCON_TYPE_DOC_END: STACK_POP_DOC ( bson_append_document_end (STACK_BSON_PARENT, STACK_BSON_CHILD)); break; case BCON_TYPE_ARRAY_START: STACK_PUSH_ARRAY (bson_append_array_begin ( STACK_BSON_PARENT, key, -1, STACK_BSON_CHILD)); break; case BCON_TYPE_ARRAY_END: STACK_POP_ARRAY ( bson_append_array_end (STACK_BSON_PARENT, STACK_BSON_CHILD)); break; default: _bcon_append_single (STACK_BSON_CHILD, type, key, &u); break; } } } /* extract_ctx_va consumes the va_list until NULL is found, extracting values * as tokens are found. It can receive or return an in-progress bson object * via the ctx param. It can also operate on the middle of a va_list, and so * can be wrapped inside of another varargs function. * * Note that passing in a va_list that isn't perferectly formatted for BCON * ingestion will almost certainly result in undefined behavior * * The workflow relies on the passed ctx object, which holds a stack of iterator * objects, along with metadata (if the emedded layer is an array, and which * element it is on if so). We iterate, generating tokens from the va_list, * until we reach an END token. If any errors occur, we just blow up (the * var_args stuff is already incredibly fragile to mistakes, and we have no way * of introspecting, so just don't screw it up). * * There are also a few STACK_* macros in here which manipulate ctx that are * defined up top. * * The function returns true if all tokens could be successfully matched, false * otherwise. * */ bool bcon_extract_ctx_va (bson_t *bson, bcon_extract_ctx_t *ctx, va_list *ap) { bcon_type_t type; const char *key; bson_iter_t root_iter; bson_iter_t current_iter; char i_str[16]; bcon_extract_t u = {0}; BSON_ASSERT (bson_iter_init (&root_iter, bson)); while (1) { if (STACK_IS_ARRAY) { bson_uint32_to_string (STACK_I, &key, i_str, sizeof i_str); STACK_I++; } else { type = _bcon_extract_tokenize (ap, &u); if (type == BCON_TYPE_END) { return true; } if (type == BCON_TYPE_DOC_END) { STACK_POP_DOC (_noop ()); continue; } BSON_ASSERT (type == BCON_TYPE_RAW); key = u.key; } type = _bcon_extract_tokenize (ap, &u); BSON_ASSERT (type != BCON_TYPE_END); if (type == BCON_TYPE_DOC_END) { STACK_POP_DOC (_noop ()); } else if (type == BCON_TYPE_ARRAY_END) { STACK_POP_ARRAY (_noop ()); } else { memcpy (¤t_iter, STACK_ITER_CHILD, sizeof current_iter); if (!bson_iter_find (¤t_iter, key)) { return false; } switch ((int) type) { case BCON_TYPE_DOC_START: if (bson_iter_type (¤t_iter) != BSON_TYPE_DOCUMENT) { return false; } STACK_PUSH_DOC ( bson_iter_recurse (¤t_iter, STACK_ITER_CHILD)); break; case BCON_TYPE_ARRAY_START: if (bson_iter_type (¤t_iter) != BSON_TYPE_ARRAY) { return false; } STACK_PUSH_ARRAY ( bson_iter_recurse (¤t_iter, STACK_ITER_CHILD)); break; default: if (!_bcon_extract_single (¤t_iter, type, &u)) { return false; } break; } } } } void bcon_extract_ctx_init (bcon_extract_ctx_t *ctx) { ctx->n = 0; ctx->stack[0].is_array = false; } bool bcon_extract (bson_t *bson, ...) { va_list ap; bcon_extract_ctx_t ctx; bool r; bcon_extract_ctx_init (&ctx); va_start (ap, bson); r = bcon_extract_ctx_va (bson, &ctx, &ap); va_end (ap); return r; } void bcon_append (bson_t *bson, ...) { va_list ap; bcon_append_ctx_t ctx; bcon_append_ctx_init (&ctx); va_start (ap, bson); bcon_append_ctx_va (bson, &ctx, &ap); va_end (ap); } void bcon_append_ctx (bson_t *bson, bcon_append_ctx_t *ctx, ...) { va_list ap; va_start (ap, ctx); bcon_append_ctx_va (bson, ctx, &ap); va_end (ap); } void bcon_extract_ctx (bson_t *bson, bcon_extract_ctx_t *ctx, ...) { va_list ap; va_start (ap, ctx); bcon_extract_ctx_va (bson, ctx, &ap); va_end (ap); } void bcon_append_ctx_init (bcon_append_ctx_t *ctx) { ctx->n = 0; ctx->stack[0].is_array = 0; } bson_t * bcon_new (void *unused, ...) { va_list ap; bcon_append_ctx_t ctx; bson_t *bson; bcon_append_ctx_init (&ctx); bson = bson_new (); va_start (ap, unused); bcon_append_ctx_va (bson, &ctx, &ap); va_end (ap); return bson; } mongo-c-driver-1.26.0/src/libbson/src/bson/bcon.h000066400000000000000000000253311456567454500215220ustar00rootroot00000000000000/* * @file bcon.h * @brief BCON (BSON C Object Notation) Declarations */ #include /* Copyright 2009-2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BCON_H_ #define BCON_H_ #include "bson.h" BSON_BEGIN_DECLS #define BCON_STACK_MAX 100 #define BCON_ENSURE_DECLARE(fun, type) \ static BSON_INLINE type bcon_ensure_##fun (type _t) \ { \ return _t; \ } #define BCON_ENSURE(fun, val) bcon_ensure_##fun (val) #define BCON_ENSURE_STORAGE(fun, val) bcon_ensure_##fun (&(val)) BCON_ENSURE_DECLARE (const_char_ptr, const char *) BCON_ENSURE_DECLARE (const_char_ptr_ptr, const char **) BCON_ENSURE_DECLARE (double, double) BCON_ENSURE_DECLARE (double_ptr, double *) BCON_ENSURE_DECLARE (const_bson_ptr, const bson_t *) BCON_ENSURE_DECLARE (bson_ptr, bson_t *) BCON_ENSURE_DECLARE (subtype, bson_subtype_t) BCON_ENSURE_DECLARE (subtype_ptr, bson_subtype_t *) BCON_ENSURE_DECLARE (const_uint8_ptr, const uint8_t *) BCON_ENSURE_DECLARE (const_uint8_ptr_ptr, const uint8_t **) BCON_ENSURE_DECLARE (uint32, uint32_t) BCON_ENSURE_DECLARE (uint32_ptr, uint32_t *) BCON_ENSURE_DECLARE (const_oid_ptr, const bson_oid_t *) BCON_ENSURE_DECLARE (const_oid_ptr_ptr, const bson_oid_t **) BCON_ENSURE_DECLARE (int32, int32_t) BCON_ENSURE_DECLARE (int32_ptr, int32_t *) BCON_ENSURE_DECLARE (int64, int64_t) BCON_ENSURE_DECLARE (int64_ptr, int64_t *) BCON_ENSURE_DECLARE (const_decimal128_ptr, const bson_decimal128_t *) BCON_ENSURE_DECLARE (bool, bool) BCON_ENSURE_DECLARE (bool_ptr, bool *) BCON_ENSURE_DECLARE (bson_type, bson_type_t) BCON_ENSURE_DECLARE (bson_iter_ptr, bson_iter_t *) BCON_ENSURE_DECLARE (const_bson_iter_ptr, const bson_iter_t *) #define BCON_UTF8(_val) \ BCON_MAGIC, BCON_TYPE_UTF8, BCON_ENSURE (const_char_ptr, (_val)) #define BCON_DOUBLE(_val) \ BCON_MAGIC, BCON_TYPE_DOUBLE, BCON_ENSURE (double, (_val)) #define BCON_DOCUMENT(_val) \ BCON_MAGIC, BCON_TYPE_DOCUMENT, BCON_ENSURE (const_bson_ptr, (_val)) #define BCON_ARRAY(_val) \ BCON_MAGIC, BCON_TYPE_ARRAY, BCON_ENSURE (const_bson_ptr, (_val)) #define BCON_BIN(_subtype, _binary, _length) \ BCON_MAGIC, BCON_TYPE_BIN, BCON_ENSURE (subtype, (_subtype)), \ BCON_ENSURE (const_uint8_ptr, (_binary)), \ BCON_ENSURE (uint32, (_length)) #define BCON_UNDEFINED BCON_MAGIC, BCON_TYPE_UNDEFINED #define BCON_OID(_val) \ BCON_MAGIC, BCON_TYPE_OID, BCON_ENSURE (const_oid_ptr, (_val)) #define BCON_BOOL(_val) BCON_MAGIC, BCON_TYPE_BOOL, BCON_ENSURE (bool, (_val)) #define BCON_DATE_TIME(_val) \ BCON_MAGIC, BCON_TYPE_DATE_TIME, BCON_ENSURE (int64, (_val)) #define BCON_NULL BCON_MAGIC, BCON_TYPE_NULL #define BCON_REGEX(_regex, _flags) \ BCON_MAGIC, BCON_TYPE_REGEX, BCON_ENSURE (const_char_ptr, (_regex)), \ BCON_ENSURE (const_char_ptr, (_flags)) #define BCON_DBPOINTER(_collection, _oid) \ BCON_MAGIC, BCON_TYPE_DBPOINTER, \ BCON_ENSURE (const_char_ptr, (_collection)), \ BCON_ENSURE (const_oid_ptr, (_oid)) #define BCON_CODE(_val) \ BCON_MAGIC, BCON_TYPE_CODE, BCON_ENSURE (const_char_ptr, (_val)) #define BCON_SYMBOL(_val) \ BCON_MAGIC, BCON_TYPE_SYMBOL, BCON_ENSURE (const_char_ptr, (_val)) #define BCON_CODEWSCOPE(_js, _scope) \ BCON_MAGIC, BCON_TYPE_CODEWSCOPE, BCON_ENSURE (const_char_ptr, (_js)), \ BCON_ENSURE (const_bson_ptr, (_scope)) #define BCON_INT32(_val) \ BCON_MAGIC, BCON_TYPE_INT32, BCON_ENSURE (int32, (_val)) #define BCON_TIMESTAMP(_timestamp, _increment) \ BCON_MAGIC, BCON_TYPE_TIMESTAMP, BCON_ENSURE (int32, (_timestamp)), \ BCON_ENSURE (int32, (_increment)) #define BCON_INT64(_val) \ BCON_MAGIC, BCON_TYPE_INT64, BCON_ENSURE (int64, (_val)) #define BCON_DECIMAL128(_val) \ BCON_MAGIC, BCON_TYPE_DECIMAL128, BCON_ENSURE (const_decimal128_ptr, (_val)) #define BCON_MAXKEY BCON_MAGIC, BCON_TYPE_MAXKEY #define BCON_MINKEY BCON_MAGIC, BCON_TYPE_MINKEY #define BCON(_val) \ BCON_MAGIC, BCON_TYPE_BCON, BCON_ENSURE (const_bson_ptr, (_val)) #define BCON_ITER(_val) \ BCON_MAGIC, BCON_TYPE_ITER, BCON_ENSURE (const_bson_iter_ptr, (_val)) #define BCONE_UTF8(_val) \ BCONE_MAGIC, BCON_TYPE_UTF8, BCON_ENSURE_STORAGE (const_char_ptr_ptr, (_val)) #define BCONE_DOUBLE(_val) \ BCONE_MAGIC, BCON_TYPE_DOUBLE, BCON_ENSURE_STORAGE (double_ptr, (_val)) #define BCONE_DOCUMENT(_val) \ BCONE_MAGIC, BCON_TYPE_DOCUMENT, BCON_ENSURE_STORAGE (bson_ptr, (_val)) #define BCONE_ARRAY(_val) \ BCONE_MAGIC, BCON_TYPE_ARRAY, BCON_ENSURE_STORAGE (bson_ptr, (_val)) #define BCONE_BIN(subtype, binary, length) \ BCONE_MAGIC, BCON_TYPE_BIN, BCON_ENSURE_STORAGE (subtype_ptr, (subtype)), \ BCON_ENSURE_STORAGE (const_uint8_ptr_ptr, (binary)), \ BCON_ENSURE_STORAGE (uint32_ptr, (length)) #define BCONE_UNDEFINED BCONE_MAGIC, BCON_TYPE_UNDEFINED #define BCONE_OID(_val) \ BCONE_MAGIC, BCON_TYPE_OID, BCON_ENSURE_STORAGE (const_oid_ptr_ptr, (_val)) #define BCONE_BOOL(_val) \ BCONE_MAGIC, BCON_TYPE_BOOL, BCON_ENSURE_STORAGE (bool_ptr, (_val)) #define BCONE_DATE_TIME(_val) \ BCONE_MAGIC, BCON_TYPE_DATE_TIME, BCON_ENSURE_STORAGE (int64_ptr, (_val)) #define BCONE_NULL BCONE_MAGIC, BCON_TYPE_NULL #define BCONE_REGEX(_regex, _flags) \ BCONE_MAGIC, BCON_TYPE_REGEX, \ BCON_ENSURE_STORAGE (const_char_ptr_ptr, (_regex)), \ BCON_ENSURE_STORAGE (const_char_ptr_ptr, (_flags)) #define BCONE_DBPOINTER(_collection, _oid) \ BCONE_MAGIC, BCON_TYPE_DBPOINTER, \ BCON_ENSURE_STORAGE (const_char_ptr_ptr, (_collection)), \ BCON_ENSURE_STORAGE (const_oid_ptr_ptr, (_oid)) #define BCONE_CODE(_val) \ BCONE_MAGIC, BCON_TYPE_CODE, BCON_ENSURE_STORAGE (const_char_ptr_ptr, (_val)) #define BCONE_SYMBOL(_val) \ BCONE_MAGIC, BCON_TYPE_SYMBOL, \ BCON_ENSURE_STORAGE (const_char_ptr_ptr, (_val)) #define BCONE_CODEWSCOPE(_js, _scope) \ BCONE_MAGIC, BCON_TYPE_CODEWSCOPE, \ BCON_ENSURE_STORAGE (const_char_ptr_ptr, (_js)), \ BCON_ENSURE_STORAGE (bson_ptr, (_scope)) #define BCONE_INT32(_val) \ BCONE_MAGIC, BCON_TYPE_INT32, BCON_ENSURE_STORAGE (int32_ptr, (_val)) #define BCONE_TIMESTAMP(_timestamp, _increment) \ BCONE_MAGIC, BCON_TYPE_TIMESTAMP, \ BCON_ENSURE_STORAGE (int32_ptr, (_timestamp)), \ BCON_ENSURE_STORAGE (int32_ptr, (_increment)) #define BCONE_INT64(_val) \ BCONE_MAGIC, BCON_TYPE_INT64, BCON_ENSURE_STORAGE (int64_ptr, (_val)) #define BCONE_DECIMAL128(_val) \ BCONE_MAGIC, BCON_TYPE_DECIMAL128, \ BCON_ENSURE_STORAGE (const_decimal128_ptr, (_val)) #define BCONE_MAXKEY BCONE_MAGIC, BCON_TYPE_MAXKEY #define BCONE_MINKEY BCONE_MAGIC, BCON_TYPE_MINKEY #define BCONE_SKIP(_val) \ BCONE_MAGIC, BCON_TYPE_SKIP, BCON_ENSURE (bson_type, (_val)) #define BCONE_ITER(_val) \ BCONE_MAGIC, BCON_TYPE_ITER, BCON_ENSURE_STORAGE (bson_iter_ptr, (_val)) #define BCON_MAGIC bson_bcon_magic () #define BCONE_MAGIC bson_bcone_magic () typedef enum { BCON_TYPE_UTF8, BCON_TYPE_DOUBLE, BCON_TYPE_DOCUMENT, BCON_TYPE_ARRAY, BCON_TYPE_BIN, BCON_TYPE_UNDEFINED, BCON_TYPE_OID, BCON_TYPE_BOOL, BCON_TYPE_DATE_TIME, BCON_TYPE_NULL, BCON_TYPE_REGEX, BCON_TYPE_DBPOINTER, BCON_TYPE_CODE, BCON_TYPE_SYMBOL, BCON_TYPE_CODEWSCOPE, BCON_TYPE_INT32, BCON_TYPE_TIMESTAMP, BCON_TYPE_INT64, BCON_TYPE_DECIMAL128, BCON_TYPE_MAXKEY, BCON_TYPE_MINKEY, BCON_TYPE_BCON, BCON_TYPE_ARRAY_START, BCON_TYPE_ARRAY_END, BCON_TYPE_DOC_START, BCON_TYPE_DOC_END, BCON_TYPE_END, BCON_TYPE_RAW, BCON_TYPE_SKIP, BCON_TYPE_ITER, BCON_TYPE_ERROR, } bcon_type_t; typedef struct bcon_append_ctx_frame { int i; bool is_array; bson_t bson; } bcon_append_ctx_frame_t; typedef struct bcon_extract_ctx_frame { int i; bool is_array; bson_iter_t iter; } bcon_extract_ctx_frame_t; typedef struct _bcon_append_ctx_t { bcon_append_ctx_frame_t stack[BCON_STACK_MAX]; int n; } bcon_append_ctx_t; typedef struct _bcon_extract_ctx_t { bcon_extract_ctx_frame_t stack[BCON_STACK_MAX]; int n; } bcon_extract_ctx_t; BSON_EXPORT (void) bcon_append (bson_t *bson, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT (void) bcon_append_ctx (bson_t *bson, bcon_append_ctx_t *ctx, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT (void) bcon_append_ctx_va (bson_t *bson, bcon_append_ctx_t *ctx, va_list *va); BSON_EXPORT (void) bcon_append_ctx_init (bcon_append_ctx_t *ctx); BSON_EXPORT (void) bcon_extract_ctx_init (bcon_extract_ctx_t *ctx); BSON_EXPORT (void) bcon_extract_ctx (bson_t *bson, bcon_extract_ctx_t *ctx, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT (bool) bcon_extract_ctx_va (bson_t *bson, bcon_extract_ctx_t *ctx, va_list *ap); BSON_EXPORT (bool) bcon_extract (bson_t *bson, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT (bool) bcon_extract_va (bson_t *bson, bcon_extract_ctx_t *ctx, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT (bson_t *) bcon_new (void *unused, ...) BSON_GNUC_NULL_TERMINATED; /** * The bcon_..() functions are all declared with __attribute__((sentinel)). * * From GCC manual for "sentinel": "A valid NULL in this context is defined as * zero with any pointer type. If your system defines the NULL macro with an * integer type then you need to add an explicit cast." * Case in point: GCC on Solaris (at least) */ #define BCON_APPEND(_bson, ...) \ bcon_append ((_bson), __VA_ARGS__, (void *) NULL) #define BCON_APPEND_CTX(_bson, _ctx, ...) \ bcon_append_ctx ((_bson), (_ctx), __VA_ARGS__, (void *) NULL) #define BCON_EXTRACT(_bson, ...) \ bcon_extract ((_bson), __VA_ARGS__, (void *) NULL) #define BCON_EXTRACT_CTX(_bson, _ctx, ...) \ bcon_extract ((_bson), (_ctx), __VA_ARGS__, (void *) NULL) #define BCON_NEW(...) bcon_new (NULL, __VA_ARGS__, (void *) NULL) BSON_EXPORT (const char *) bson_bcon_magic (void) BSON_GNUC_PURE; BSON_EXPORT (const char *) bson_bcone_magic (void) BSON_GNUC_PURE; BSON_END_DECLS #endif mongo-c-driver-1.26.0/src/libbson/src/bson/bson-atomic.c000066400000000000000000000162301456567454500230050ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef BSON_OS_UNIX /* For sched_yield() */ #include #endif int32_t bson_atomic_int_add (volatile int32_t *p, int32_t n) { return n + bson_atomic_int32_fetch_add ((DECL_ATOMIC_INTEGRAL_INT32 *) p, n, bson_memory_order_seq_cst); } int64_t bson_atomic_int64_add (volatile int64_t *p, int64_t n) { return n + bson_atomic_int64_fetch_add (p, n, bson_memory_order_seq_cst); } void bson_thrd_yield (void) { BSON_IF_WINDOWS (SwitchToThread ();) BSON_IF_POSIX (sched_yield ();) } void bson_memory_barrier (void) { bson_atomic_thread_fence (); } /** * Some platforms do not support compiler intrinsics for atomic operations. * We emulate that here using a spin lock and regular arithmetic operations */ static int8_t gEmulAtomicLock = 0; static void _lock_emul_atomic (void) { int i; if (bson_atomic_int8_compare_exchange_weak ( &gEmulAtomicLock, 0, 1, bson_memory_order_acquire) == 0) { /* Successfully took the spinlock */ return; } /* Failed. Try taking ten more times, then begin sleeping. */ for (i = 0; i < 10; ++i) { if (bson_atomic_int8_compare_exchange_weak ( &gEmulAtomicLock, 0, 1, bson_memory_order_acquire) == 0) { /* Succeeded in taking the lock */ return; } } /* Still don't have the lock. Spin and yield */ while (bson_atomic_int8_compare_exchange_weak ( &gEmulAtomicLock, 0, 1, bson_memory_order_acquire) != 0) { bson_thrd_yield (); } } static void _unlock_emul_atomic (void) { int64_t rv = bson_atomic_int8_exchange ( &gEmulAtomicLock, 0, bson_memory_order_release); BSON_ASSERT (rv == 1 && "Released atomic lock while not holding it"); } int64_t _bson_emul_atomic_int64_fetch_add (volatile int64_t *p, int64_t n, enum bson_memory_order _unused) { int64_t ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; *p += n; _unlock_emul_atomic (); return ret; } int64_t _bson_emul_atomic_int64_exchange (volatile int64_t *p, int64_t n, enum bson_memory_order _unused) { int64_t ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; *p = n; _unlock_emul_atomic (); return ret; } int64_t _bson_emul_atomic_int64_compare_exchange_strong (volatile int64_t *p, int64_t expect_value, int64_t new_value, enum bson_memory_order _unused) { int64_t ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; if (ret == expect_value) { *p = new_value; } _unlock_emul_atomic (); return ret; } int64_t _bson_emul_atomic_int64_compare_exchange_weak (volatile int64_t *p, int64_t expect_value, int64_t new_value, enum bson_memory_order order) { /* We're emulating. We can't do a weak version. */ return _bson_emul_atomic_int64_compare_exchange_strong ( p, expect_value, new_value, order); } int32_t _bson_emul_atomic_int32_fetch_add (volatile int32_t *p, int32_t n, enum bson_memory_order _unused) { int32_t ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; *p += n; _unlock_emul_atomic (); return ret; } int32_t _bson_emul_atomic_int32_exchange (volatile int32_t *p, int32_t n, enum bson_memory_order _unused) { int32_t ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; *p = n; _unlock_emul_atomic (); return ret; } int32_t _bson_emul_atomic_int32_compare_exchange_strong (volatile int32_t *p, int32_t expect_value, int32_t new_value, enum bson_memory_order _unused) { int32_t ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; if (ret == expect_value) { *p = new_value; } _unlock_emul_atomic (); return ret; } int32_t _bson_emul_atomic_int32_compare_exchange_weak (volatile int32_t *p, int32_t expect_value, int32_t new_value, enum bson_memory_order order) { /* We're emulating. We can't do a weak version. */ return _bson_emul_atomic_int32_compare_exchange_strong ( p, expect_value, new_value, order); } int _bson_emul_atomic_int_fetch_add (volatile int *p, int n, enum bson_memory_order _unused) { int ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; *p += n; _unlock_emul_atomic (); return ret; } int _bson_emul_atomic_int_exchange (volatile int *p, int n, enum bson_memory_order _unused) { int ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; *p = n; _unlock_emul_atomic (); return ret; } int _bson_emul_atomic_int_compare_exchange_strong (volatile int *p, int expect_value, int new_value, enum bson_memory_order _unused) { int ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; if (ret == expect_value) { *p = new_value; } _unlock_emul_atomic (); return ret; } int _bson_emul_atomic_int_compare_exchange_weak (volatile int *p, int expect_value, int new_value, enum bson_memory_order order) { /* We're emulating. We can't do a weak version. */ return _bson_emul_atomic_int_compare_exchange_strong ( p, expect_value, new_value, order); } void * _bson_emul_atomic_ptr_exchange (void *volatile *p, void *n, enum bson_memory_order _unused) { void *ret; BSON_UNUSED (_unused); _lock_emul_atomic (); ret = *p; *p = n; _unlock_emul_atomic (); return ret; } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-atomic.h000066400000000000000000001114141456567454500230120ustar00rootroot00000000000000/* * Copyright 2013-2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_ATOMIC_H #define BSON_ATOMIC_H #include #include #include #ifdef _MSC_VER #include #endif BSON_BEGIN_DECLS enum bson_memory_order { bson_memory_order_seq_cst, bson_memory_order_acquire, bson_memory_order_release, bson_memory_order_relaxed, bson_memory_order_acq_rel, bson_memory_order_consume, }; #if defined(_M_ARM) /* MSVC memorder atomics are only avail on ARM */ #define MSVC_MEMORDER_SUFFIX(X) X #else #define MSVC_MEMORDER_SUFFIX(X) #endif #if defined(USE_LEGACY_GCC_ATOMICS) || \ (!defined(__clang__) && __GNUC__ == 4) || defined(__xlC__) #define BSON_USE_LEGACY_GCC_ATOMICS #else #undef BSON_USE_LEGACY_GCC_ATOMICS #endif /* Not all GCC-like compilers support the current __atomic built-ins. Older * GCC (pre-5) used different built-ins named with the __sync prefix. When * compiling with such older GCC versions, it is necessary to use the applicable * functions, which requires redefining BSON_IF_GNU_LIKE and defining the * additional BSON_IF_GNU_LEGACY_ATOMICS macro here. */ #ifdef BSON_USE_LEGACY_GCC_ATOMICS #undef BSON_IF_GNU_LIKE #define BSON_IF_GNU_LIKE(...) #define BSON_IF_MSVC(...) #define BSON_IF_GNU_LEGACY_ATOMICS(...) __VA_ARGS__ #else #define BSON_IF_GNU_LEGACY_ATOMICS(...) #endif /* CDRIVER-4229 zSeries with gcc 4.8.4 produces illegal instructions for int and * int32 atomic intrinsics. */ #if defined(__s390__) || defined(__s390x__) || defined(__zarch__) #define BSON_EMULATE_INT32 #define BSON_EMULATE_INT #endif /* CDRIVER-4264 Contrary to documentation, VS 2013 targeting x86 does not * correctly/consistently provide _InterlockedPointerExchange. */ #if defined(_MSC_VER) && _MSC_VER < 1900 && defined(_M_IX86) #define BSON_EMULATE_PTR #endif #define DEF_ATOMIC_OP( \ MSVC_Intrinsic, GNU_Intrinsic, GNU_Legacy_Intrinsic, Order, ...) \ do { \ switch (Order) { \ case bson_memory_order_acq_rel: \ BSON_IF_MSVC (return MSVC_Intrinsic (__VA_ARGS__);) \ BSON_IF_GNU_LIKE ( \ return GNU_Intrinsic (__VA_ARGS__, __ATOMIC_ACQ_REL);) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ return GNU_Legacy_Intrinsic (__VA_ARGS__);) \ case bson_memory_order_seq_cst: \ BSON_IF_MSVC (return MSVC_Intrinsic (__VA_ARGS__);) \ BSON_IF_GNU_LIKE ( \ return GNU_Intrinsic (__VA_ARGS__, __ATOMIC_SEQ_CST);) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ return GNU_Legacy_Intrinsic (__VA_ARGS__);) \ case bson_memory_order_acquire: \ BSON_IF_MSVC ( \ return BSON_CONCAT (MSVC_Intrinsic, \ MSVC_MEMORDER_SUFFIX (_acq)) (__VA_ARGS__);) \ BSON_IF_GNU_LIKE ( \ return GNU_Intrinsic (__VA_ARGS__, __ATOMIC_ACQUIRE);) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ return GNU_Legacy_Intrinsic (__VA_ARGS__);) \ case bson_memory_order_consume: \ BSON_IF_MSVC ( \ return BSON_CONCAT (MSVC_Intrinsic, \ MSVC_MEMORDER_SUFFIX (_acq)) (__VA_ARGS__);) \ BSON_IF_GNU_LIKE ( \ return GNU_Intrinsic (__VA_ARGS__, __ATOMIC_CONSUME);) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ return GNU_Legacy_Intrinsic (__VA_ARGS__);) \ case bson_memory_order_release: \ BSON_IF_MSVC ( \ return BSON_CONCAT (MSVC_Intrinsic, \ MSVC_MEMORDER_SUFFIX (_rel)) (__VA_ARGS__);) \ BSON_IF_GNU_LIKE ( \ return GNU_Intrinsic (__VA_ARGS__, __ATOMIC_RELEASE);) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ return GNU_Legacy_Intrinsic (__VA_ARGS__);) \ case bson_memory_order_relaxed: \ BSON_IF_MSVC ( \ return BSON_CONCAT (MSVC_Intrinsic, \ MSVC_MEMORDER_SUFFIX (_nf)) (__VA_ARGS__);) \ BSON_IF_GNU_LIKE ( \ return GNU_Intrinsic (__VA_ARGS__, __ATOMIC_RELAXED);) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ return GNU_Legacy_Intrinsic (__VA_ARGS__);) \ default: \ BSON_UNREACHABLE ("Invalid bson_memory_order value"); \ } \ } while (0) #define DEF_ATOMIC_CMPEXCH_STRONG( \ VCSuffix1, VCSuffix2, GNU_MemOrder, Ptr, ExpectActualVar, NewValue) \ do { \ BSON_IF_MSVC (ExpectActualVar = BSON_CONCAT3 ( \ _InterlockedCompareExchange, VCSuffix1, VCSuffix2) ( \ Ptr, NewValue, ExpectActualVar);) \ BSON_IF_GNU_LIKE ( \ (void) __atomic_compare_exchange_n (Ptr, \ &ExpectActualVar, \ NewValue, \ false, /* Not weak */ \ GNU_MemOrder, \ GNU_MemOrder);) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ __typeof__ (ExpectActualVar) _val; \ _val = __sync_val_compare_and_swap (Ptr, ExpectActualVar, NewValue); \ ExpectActualVar = _val;) \ } while (0) #define DEF_ATOMIC_CMPEXCH_WEAK( \ VCSuffix1, VCSuffix2, GNU_MemOrder, Ptr, ExpectActualVar, NewValue) \ do { \ BSON_IF_MSVC (ExpectActualVar = BSON_CONCAT3 ( \ _InterlockedCompareExchange, VCSuffix1, VCSuffix2) ( \ Ptr, NewValue, ExpectActualVar);) \ BSON_IF_GNU_LIKE ( \ (void) __atomic_compare_exchange_n (Ptr, \ &ExpectActualVar, \ NewValue, \ true, /* Yes weak */ \ GNU_MemOrder, \ GNU_MemOrder);) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ __typeof__ (ExpectActualVar) _val; \ _val = __sync_val_compare_and_swap (Ptr, ExpectActualVar, NewValue); \ ExpectActualVar = _val;) \ } while (0) #define DECL_ATOMIC_INTEGRAL(NamePart, Type, VCIntrinSuffix) \ static BSON_INLINE Type bson_atomic_##NamePart##_fetch_add ( \ Type volatile *a, Type addend, enum bson_memory_order ord) \ { \ DEF_ATOMIC_OP (BSON_CONCAT (_InterlockedExchangeAdd, VCIntrinSuffix), \ __atomic_fetch_add, \ __sync_fetch_and_add, \ ord, \ a, \ addend); \ } \ \ static BSON_INLINE Type bson_atomic_##NamePart##_fetch_sub ( \ Type volatile *a, Type subtrahend, enum bson_memory_order ord) \ { \ /* MSVC doesn't have a subtract intrinsic, so just reuse addition */ \ BSON_IF_MSVC ( \ return bson_atomic_##NamePart##_fetch_add (a, -subtrahend, ord);) \ BSON_IF_GNU_LIKE ( \ DEF_ATOMIC_OP (~, __atomic_fetch_sub, ~, ord, a, subtrahend);) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ DEF_ATOMIC_OP (~, ~, __sync_fetch_and_sub, ord, a, subtrahend);) \ } \ \ static BSON_INLINE Type bson_atomic_##NamePart##_fetch ( \ Type volatile const *a, enum bson_memory_order order) \ { \ /* MSVC doesn't have a load intrinsic, so just add zero */ \ BSON_IF_MSVC (return bson_atomic_##NamePart##_fetch_add ( \ (Type volatile *) a, 0, order);) \ /* GNU doesn't want RELEASE order for the fetch operation, so we can't \ * just use DEF_ATOMIC_OP. */ \ BSON_IF_GNU_LIKE (switch (order) { \ case bson_memory_order_release: /* Fall back to seqcst */ \ case bson_memory_order_acq_rel: /* Fall back to seqcst */ \ case bson_memory_order_seq_cst: \ return __atomic_load_n (a, __ATOMIC_SEQ_CST); \ case bson_memory_order_acquire: \ return __atomic_load_n (a, __ATOMIC_ACQUIRE); \ case bson_memory_order_consume: \ return __atomic_load_n (a, __ATOMIC_CONSUME); \ case bson_memory_order_relaxed: \ return __atomic_load_n (a, __ATOMIC_RELAXED); \ default: \ BSON_UNREACHABLE ("Invalid bson_memory_order value"); \ }) \ BSON_IF_GNU_LEGACY_ATOMICS ({ \ __sync_synchronize (); \ return *a; \ }) \ } \ \ static BSON_INLINE Type bson_atomic_##NamePart##_exchange ( \ Type volatile *a, Type value, enum bson_memory_order ord) \ { \ BSON_IF_MSVC ( \ DEF_ATOMIC_OP (BSON_CONCAT (_InterlockedExchange, VCIntrinSuffix), \ ~, \ ~, \ ord, \ a, \ value);) \ /* GNU doesn't want CONSUME order for the exchange operation, so we \ * cannot use DEF_ATOMIC_OP. */ \ BSON_IF_GNU_LIKE (switch (ord) { \ case bson_memory_order_acq_rel: \ return __atomic_exchange_n (a, value, __ATOMIC_ACQ_REL); \ case bson_memory_order_release: \ return __atomic_exchange_n (a, value, __ATOMIC_RELEASE); \ case bson_memory_order_seq_cst: \ return __atomic_exchange_n (a, value, __ATOMIC_SEQ_CST); \ case bson_memory_order_consume: /* Fall back to acquire */ \ case bson_memory_order_acquire: \ return __atomic_exchange_n (a, value, __ATOMIC_ACQUIRE); \ case bson_memory_order_relaxed: \ return __atomic_exchange_n (a, value, __ATOMIC_RELAXED); \ default: \ BSON_UNREACHABLE ("Invalid bson_memory_order value"); \ }) \ BSON_IF_GNU_LEGACY_ATOMICS ( \ return __sync_val_compare_and_swap (a, *a, value);) \ } \ \ static BSON_INLINE Type bson_atomic_##NamePart##_compare_exchange_strong ( \ Type volatile *a, \ Type expect, \ Type new_value, \ enum bson_memory_order ord) \ { \ Type actual = expect; \ switch (ord) { \ case bson_memory_order_release: \ case bson_memory_order_acq_rel: \ case bson_memory_order_seq_cst: \ DEF_ATOMIC_CMPEXCH_STRONG ( \ VCIntrinSuffix, , __ATOMIC_SEQ_CST, a, actual, new_value); \ break; \ case bson_memory_order_acquire: \ DEF_ATOMIC_CMPEXCH_STRONG (VCIntrinSuffix, \ MSVC_MEMORDER_SUFFIX (_acq), \ __ATOMIC_ACQUIRE, \ a, \ actual, \ new_value); \ break; \ case bson_memory_order_consume: \ DEF_ATOMIC_CMPEXCH_STRONG (VCIntrinSuffix, \ MSVC_MEMORDER_SUFFIX (_acq), \ __ATOMIC_CONSUME, \ a, \ actual, \ new_value); \ break; \ case bson_memory_order_relaxed: \ DEF_ATOMIC_CMPEXCH_STRONG (VCIntrinSuffix, \ MSVC_MEMORDER_SUFFIX (_nf), \ __ATOMIC_RELAXED, \ a, \ actual, \ new_value); \ break; \ default: \ BSON_UNREACHABLE ("Invalid bson_memory_order value"); \ } \ return actual; \ } \ \ static BSON_INLINE Type bson_atomic_##NamePart##_compare_exchange_weak ( \ Type volatile *a, \ Type expect, \ Type new_value, \ enum bson_memory_order ord) \ { \ Type actual = expect; \ switch (ord) { \ case bson_memory_order_release: \ case bson_memory_order_acq_rel: \ case bson_memory_order_seq_cst: \ DEF_ATOMIC_CMPEXCH_WEAK ( \ VCIntrinSuffix, , __ATOMIC_SEQ_CST, a, actual, new_value); \ break; \ case bson_memory_order_acquire: \ DEF_ATOMIC_CMPEXCH_WEAK (VCIntrinSuffix, \ MSVC_MEMORDER_SUFFIX (_acq), \ __ATOMIC_ACQUIRE, \ a, \ actual, \ new_value); \ break; \ case bson_memory_order_consume: \ DEF_ATOMIC_CMPEXCH_WEAK (VCIntrinSuffix, \ MSVC_MEMORDER_SUFFIX (_acq), \ __ATOMIC_CONSUME, \ a, \ actual, \ new_value); \ break; \ case bson_memory_order_relaxed: \ DEF_ATOMIC_CMPEXCH_WEAK (VCIntrinSuffix, \ MSVC_MEMORDER_SUFFIX (_nf), \ __ATOMIC_RELAXED, \ a, \ actual, \ new_value); \ break; \ default: \ BSON_UNREACHABLE ("Invalid bson_memory_order value"); \ } \ return actual; \ } #define DECL_ATOMIC_STDINT(Name, VCSuffix) \ DECL_ATOMIC_INTEGRAL (Name, Name##_t, VCSuffix) #if defined(_MSC_VER) || defined(BSON_USE_LEGACY_GCC_ATOMICS) /* MSVC and GCC require built-in types (not typedefs) for their atomic * intrinsics. */ #if defined(_MSC_VER) #define DECL_ATOMIC_INTEGRAL_INT8 char #define DECL_ATOMIC_INTEGRAL_INT32 long #define DECL_ATOMIC_INTEGRAL_INT long #else #define DECL_ATOMIC_INTEGRAL_INT8 signed char #define DECL_ATOMIC_INTEGRAL_INT32 int #define DECL_ATOMIC_INTEGRAL_INT int #endif DECL_ATOMIC_INTEGRAL (int8, DECL_ATOMIC_INTEGRAL_INT8, 8) DECL_ATOMIC_INTEGRAL (int16, short, 16) #if !defined(BSON_EMULATE_INT32) DECL_ATOMIC_INTEGRAL (int32, DECL_ATOMIC_INTEGRAL_INT32, ) #endif #if !defined(BSON_EMULATE_INT) DECL_ATOMIC_INTEGRAL (int, DECL_ATOMIC_INTEGRAL_INT, ) #endif #else /* Other compilers that we support provide generic intrinsics */ DECL_ATOMIC_STDINT (int8, 8) DECL_ATOMIC_STDINT (int16, 16) #if !defined(BSON_EMULATE_INT32) DECL_ATOMIC_STDINT (int32, ) #endif #if !defined(BSON_EMULATE_INT) DECL_ATOMIC_INTEGRAL (int, int, ) #endif #endif #ifndef DECL_ATOMIC_INTEGRAL_INT32 #define DECL_ATOMIC_INTEGRAL_INT32 int32_t #endif BSON_EXPORT (int64_t) _bson_emul_atomic_int64_fetch_add (int64_t volatile *val, int64_t v, enum bson_memory_order); BSON_EXPORT (int64_t) _bson_emul_atomic_int64_exchange (int64_t volatile *val, int64_t v, enum bson_memory_order); BSON_EXPORT (int64_t) _bson_emul_atomic_int64_compare_exchange_strong (int64_t volatile *val, int64_t expect_value, int64_t new_value, enum bson_memory_order); BSON_EXPORT (int64_t) _bson_emul_atomic_int64_compare_exchange_weak (int64_t volatile *val, int64_t expect_value, int64_t new_value, enum bson_memory_order); BSON_EXPORT (int32_t) _bson_emul_atomic_int32_fetch_add (int32_t volatile *val, int32_t v, enum bson_memory_order); BSON_EXPORT (int32_t) _bson_emul_atomic_int32_exchange (int32_t volatile *val, int32_t v, enum bson_memory_order); BSON_EXPORT (int32_t) _bson_emul_atomic_int32_compare_exchange_strong (int32_t volatile *val, int32_t expect_value, int32_t new_value, enum bson_memory_order); BSON_EXPORT (int32_t) _bson_emul_atomic_int32_compare_exchange_weak (int32_t volatile *val, int32_t expect_value, int32_t new_value, enum bson_memory_order); BSON_EXPORT (int) _bson_emul_atomic_int_fetch_add (int volatile *val, int v, enum bson_memory_order); BSON_EXPORT (int) _bson_emul_atomic_int_exchange (int volatile *val, int v, enum bson_memory_order); BSON_EXPORT (int) _bson_emul_atomic_int_compare_exchange_strong (int volatile *val, int expect_value, int new_value, enum bson_memory_order); BSON_EXPORT (int) _bson_emul_atomic_int_compare_exchange_weak (int volatile *val, int expect_value, int new_value, enum bson_memory_order); BSON_EXPORT (void *) _bson_emul_atomic_ptr_exchange (void *volatile *val, void *v, enum bson_memory_order); BSON_EXPORT (void) bson_thrd_yield (void); #if (defined(_MSC_VER) && !defined(_M_IX86)) || (defined(__LP64__) && __LP64__) /* (64-bit intrinsics are only available in x64) */ #ifdef _MSC_VER DECL_ATOMIC_INTEGRAL (int64, __int64, 64) #else DECL_ATOMIC_STDINT (int64, 64) #endif #else static BSON_INLINE int64_t bson_atomic_int64_fetch (const int64_t volatile *val, enum bson_memory_order order) { return _bson_emul_atomic_int64_fetch_add ( (int64_t volatile *) val, 0, order); } static BSON_INLINE int64_t bson_atomic_int64_fetch_add (int64_t volatile *val, int64_t v, enum bson_memory_order order) { return _bson_emul_atomic_int64_fetch_add (val, v, order); } static BSON_INLINE int64_t bson_atomic_int64_fetch_sub (int64_t volatile *val, int64_t v, enum bson_memory_order order) { return _bson_emul_atomic_int64_fetch_add (val, -v, order); } static BSON_INLINE int64_t bson_atomic_int64_exchange (int64_t volatile *val, int64_t v, enum bson_memory_order order) { return _bson_emul_atomic_int64_exchange (val, v, order); } static BSON_INLINE int64_t bson_atomic_int64_compare_exchange_strong (int64_t volatile *val, int64_t expect_value, int64_t new_value, enum bson_memory_order order) { return _bson_emul_atomic_int64_compare_exchange_strong ( val, expect_value, new_value, order); } static BSON_INLINE int64_t bson_atomic_int64_compare_exchange_weak (int64_t volatile *val, int64_t expect_value, int64_t new_value, enum bson_memory_order order) { return _bson_emul_atomic_int64_compare_exchange_weak ( val, expect_value, new_value, order); } #endif #if defined(BSON_EMULATE_INT32) static BSON_INLINE int32_t bson_atomic_int32_fetch (const int32_t volatile *val, enum bson_memory_order order) { return _bson_emul_atomic_int32_fetch_add ( (int32_t volatile *) val, 0, order); } static BSON_INLINE int32_t bson_atomic_int32_fetch_add (int32_t volatile *val, int32_t v, enum bson_memory_order order) { return _bson_emul_atomic_int32_fetch_add (val, v, order); } static BSON_INLINE int32_t bson_atomic_int32_fetch_sub (int32_t volatile *val, int32_t v, enum bson_memory_order order) { return _bson_emul_atomic_int32_fetch_add (val, -v, order); } static BSON_INLINE int32_t bson_atomic_int32_exchange (int32_t volatile *val, int32_t v, enum bson_memory_order order) { return _bson_emul_atomic_int32_exchange (val, v, order); } static BSON_INLINE int32_t bson_atomic_int32_compare_exchange_strong (int32_t volatile *val, int32_t expect_value, int32_t new_value, enum bson_memory_order order) { return _bson_emul_atomic_int32_compare_exchange_strong ( val, expect_value, new_value, order); } static BSON_INLINE int32_t bson_atomic_int32_compare_exchange_weak (int32_t volatile *val, int32_t expect_value, int32_t new_value, enum bson_memory_order order) { return _bson_emul_atomic_int32_compare_exchange_weak ( val, expect_value, new_value, order); } #endif /* BSON_EMULATE_INT32 */ #if defined(BSON_EMULATE_INT) static BSON_INLINE int bson_atomic_int_fetch (const int volatile *val, enum bson_memory_order order) { return _bson_emul_atomic_int_fetch_add ((int volatile *) val, 0, order); } static BSON_INLINE int bson_atomic_int_fetch_add (int volatile *val, int v, enum bson_memory_order order) { return _bson_emul_atomic_int_fetch_add (val, v, order); } static BSON_INLINE int bson_atomic_int_fetch_sub (int volatile *val, int v, enum bson_memory_order order) { return _bson_emul_atomic_int_fetch_add (val, -v, order); } static BSON_INLINE int bson_atomic_int_exchange (int volatile *val, int v, enum bson_memory_order order) { return _bson_emul_atomic_int_exchange (val, v, order); } static BSON_INLINE int bson_atomic_int_compare_exchange_strong (int volatile *val, int expect_value, int new_value, enum bson_memory_order order) { return _bson_emul_atomic_int_compare_exchange_strong ( val, expect_value, new_value, order); } static BSON_INLINE int bson_atomic_int_compare_exchange_weak (int volatile *val, int expect_value, int new_value, enum bson_memory_order order) { return _bson_emul_atomic_int_compare_exchange_weak ( val, expect_value, new_value, order); } #endif /* BSON_EMULATE_INT */ static BSON_INLINE void * bson_atomic_ptr_exchange (void *volatile *ptr, void *new_value, enum bson_memory_order ord) { #if defined(BSON_EMULATE_PTR) return _bson_emul_atomic_ptr_exchange (ptr, new_value, ord); #elif defined(BSON_USE_LEGACY_GCC_ATOMICS) /* The older __sync_val_compare_and_swap also takes oldval */ DEF_ATOMIC_OP (_InterlockedExchangePointer, , __sync_val_compare_and_swap, ord, ptr, *ptr, new_value); #else DEF_ATOMIC_OP ( _InterlockedExchangePointer, __atomic_exchange_n, , ord, ptr, new_value); #endif } static BSON_INLINE void * bson_atomic_ptr_compare_exchange_strong (void *volatile *ptr, void *expect, void *new_value, enum bson_memory_order ord) { switch (ord) { case bson_memory_order_release: case bson_memory_order_acq_rel: case bson_memory_order_seq_cst: DEF_ATOMIC_CMPEXCH_STRONG ( Pointer, , __ATOMIC_SEQ_CST, ptr, expect, new_value); return expect; case bson_memory_order_relaxed: DEF_ATOMIC_CMPEXCH_STRONG (Pointer, MSVC_MEMORDER_SUFFIX (_nf), __ATOMIC_RELAXED, ptr, expect, new_value); return expect; case bson_memory_order_consume: DEF_ATOMIC_CMPEXCH_STRONG (Pointer, MSVC_MEMORDER_SUFFIX (_acq), __ATOMIC_CONSUME, ptr, expect, new_value); return expect; case bson_memory_order_acquire: DEF_ATOMIC_CMPEXCH_STRONG (Pointer, MSVC_MEMORDER_SUFFIX (_acq), __ATOMIC_ACQUIRE, ptr, expect, new_value); return expect; default: BSON_UNREACHABLE ("Invalid bson_memory_order value"); } } static BSON_INLINE void * bson_atomic_ptr_compare_exchange_weak (void *volatile *ptr, void *expect, void *new_value, enum bson_memory_order ord) { switch (ord) { case bson_memory_order_release: case bson_memory_order_acq_rel: case bson_memory_order_seq_cst: DEF_ATOMIC_CMPEXCH_WEAK ( Pointer, , __ATOMIC_SEQ_CST, ptr, expect, new_value); return expect; case bson_memory_order_relaxed: DEF_ATOMIC_CMPEXCH_WEAK (Pointer, MSVC_MEMORDER_SUFFIX (_nf), __ATOMIC_RELAXED, ptr, expect, new_value); return expect; case bson_memory_order_consume: DEF_ATOMIC_CMPEXCH_WEAK (Pointer, MSVC_MEMORDER_SUFFIX (_acq), __ATOMIC_CONSUME, ptr, expect, new_value); return expect; case bson_memory_order_acquire: DEF_ATOMIC_CMPEXCH_WEAK (Pointer, MSVC_MEMORDER_SUFFIX (_acq), __ATOMIC_ACQUIRE, ptr, expect, new_value); return expect; default: BSON_UNREACHABLE ("Invalid bson_memory_order value"); } } static BSON_INLINE void * bson_atomic_ptr_fetch (void *volatile const *ptr, enum bson_memory_order ord) { return bson_atomic_ptr_compare_exchange_strong ( (void *volatile *) ptr, NULL, NULL, ord); } #undef DECL_ATOMIC_STDINT #undef DECL_ATOMIC_INTEGRAL #undef DEF_ATOMIC_OP #undef DEF_ATOMIC_CMPEXCH_STRONG #undef DEF_ATOMIC_CMPEXCH_WEAK #undef MSVC_MEMORDER_SUFFIX /** * @brief Generate a full-fence memory barrier at the call site. */ static BSON_INLINE void bson_atomic_thread_fence (void) { BSON_IF_MSVC (MemoryBarrier ();) BSON_IF_GNU_LIKE (__sync_synchronize ();) BSON_IF_GNU_LEGACY_ATOMICS (__sync_synchronize ();) } #ifdef BSON_USE_LEGACY_GCC_ATOMICS #undef BSON_IF_GNU_LIKE #define BSON_IF_GNU_LIKE(...) __VA_ARGS__ #endif #undef BSON_IF_GNU_LEGACY_ATOMICS #undef BSON_USE_LEGACY_GCC_ATOMICS BSON_GNUC_DEPRECATED_FOR ("bson_atomic_thread_fence") BSON_EXPORT (void) bson_memory_barrier (void); BSON_GNUC_DEPRECATED_FOR ("bson_atomic_int_fetch_add") BSON_EXPORT (int32_t) bson_atomic_int_add (volatile int32_t *p, int32_t n); BSON_GNUC_DEPRECATED_FOR ("bson_atomic_int64_fetch_add") BSON_EXPORT (int64_t) bson_atomic_int64_add (volatile int64_t *p, int64_t n); #undef BSON_EMULATE_PTR #undef BSON_EMULATE_INT32 #undef BSON_EMULATE_INT BSON_END_DECLS #endif /* BSON_ATOMIC_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-clock.c000066400000000000000000000066031456567454500226270ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #if defined(BSON_HAVE_CLOCK_GETTIME) #include #include #endif #include /* *-------------------------------------------------------------------------- * * bson_gettimeofday -- * * A wrapper around gettimeofday() with fallback support for Windows. * * Returns: * 0 if successful. * * Side effects: * @tv is set. * *-------------------------------------------------------------------------- */ int bson_gettimeofday (struct timeval *tv) /* OUT */ { #if defined(_WIN32) #if defined(_MSC_VER) #define DELTA_EPOCH_IN_MICROSEC 11644473600000000Ui64 #else #define DELTA_EPOCH_IN_MICROSEC 11644473600000000ULL #endif FILETIME ft; uint64_t tmp = 0; /* * The const value is shamelessly stolen from * http://www.boost.org/doc/libs/1_55_0/boost/chrono/detail/inlined/win/chrono.hpp * * File times are the number of 100 nanosecond intervals elapsed since * 12:00 am Jan 1, 1601 UTC. I haven't check the math particularly hard * * ... good luck */ if (tv) { GetSystemTimeAsFileTime (&ft); /* pull out of the filetime into a 64 bit uint */ tmp |= ft.dwHighDateTime; tmp <<= 32; tmp |= ft.dwLowDateTime; /* convert from 100's of nanosecs to microsecs */ tmp /= 10; /* adjust to unix epoch */ tmp -= DELTA_EPOCH_IN_MICROSEC; tv->tv_sec = (long) (tmp / 1000000UL); tv->tv_usec = (long) (tmp % 1000000UL); } return 0; #else return gettimeofday (tv, NULL); #endif } /* *-------------------------------------------------------------------------- * * bson_get_monotonic_time -- * * Returns the monotonic system time, if available. A best effort is * made to use the monotonic clock. However, some systems may not * support such a feature. * * Returns: * The monotonic clock in microseconds. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int64_t bson_get_monotonic_time (void) { #if defined(BSON_HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) struct timespec ts; /* ts.tv_sec may be a four-byte integer on 32 bit machines, so cast to * int64_t to avoid truncation. */ clock_gettime (CLOCK_MONOTONIC, &ts); return (((int64_t) ts.tv_sec * 1000000) + (ts.tv_nsec / 1000)); #elif defined(_WIN32) /* Despite it's name, this is in milliseconds! */ int64_t ticks = GetTickCount64 (); return (ticks * 1000); #elif defined(__hpux__) int64_t nanosec = gethrtime (); return (nanosec / 1000UL); #else #pragma message "Monotonic clock is not yet supported on your platform." struct timeval tv; bson_gettimeofday (&tv); return ((int64_t) tv.tv_sec * 1000000) + tv.tv_usec; #endif } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-clock.h000066400000000000000000000016541456567454500226350ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_CLOCK_H #define BSON_CLOCK_H #include #include #include BSON_BEGIN_DECLS BSON_EXPORT (int64_t) bson_get_monotonic_time (void); BSON_EXPORT (int) bson_gettimeofday (struct timeval *tv); BSON_END_DECLS #endif /* BSON_CLOCK_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-cmp.h000066400000000000000000000206461456567454500223230ustar00rootroot00000000000000/* * Copyright 2022 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_CMP_H #define BSON_CMP_H #include /* ssize_t */ #include /* BSON_CONCAT */ #include #include #include BSON_BEGIN_DECLS /* Based on the "Safe Integral Comparisons" proposal merged in C++20: * http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0586r2.html * * Due to lack of type deduction in C, relational comparison functions (e.g. * `cmp_less`) are defined in sets of four "functions" according to the * signedness of each value argument, e.g.: * - bson_cmp_less_ss (signed-value, signed-value) * - bson_cmp_less_uu (unsigned-value, unsigned-value) * - bson_cmp_less_su (signed-value, unsigned-value) * - bson_cmp_less_us (unsigned-value, signed-value) * * Similarly, the `in_range` function is defined as a set of two "functions" * according to the signedness of the value argument: * - bson_in_range_signed (Type, signed-value) * - bson_in_range_unsigned (Type, unsigned-value) * * The user must take care to use the correct signedness for the provided * argument(s). Enabling compiler warnings for implicit sign conversions is * recommended. */ #define BSON_CMP_SET(op, ss, uu, su, us) \ static BSON_INLINE bool BSON_CONCAT3 (bson_cmp_, op, _ss) (int64_t t, \ int64_t u) \ { \ return (ss); \ } \ \ static BSON_INLINE bool BSON_CONCAT3 (bson_cmp_, op, _uu) (uint64_t t, \ uint64_t u) \ { \ return (uu); \ } \ \ static BSON_INLINE bool BSON_CONCAT3 (bson_cmp_, op, _su) (int64_t t, \ uint64_t u) \ { \ return (su); \ } \ \ static BSON_INLINE bool BSON_CONCAT3 (bson_cmp_, op, _us) (uint64_t t, \ int64_t u) \ { \ return (us); \ } BSON_CMP_SET (equal, t == u, t == u, t < 0 ? false : (uint64_t) (t) == u, u < 0 ? false : t == (uint64_t) (u)) BSON_CMP_SET (not_equal, !bson_cmp_equal_ss (t, u), !bson_cmp_equal_uu (t, u), !bson_cmp_equal_su (t, u), !bson_cmp_equal_us (t, u)) BSON_CMP_SET (less, t < u, t < u, t < 0 ? true : (uint64_t) (t) < u, u < 0 ? false : t < (uint64_t) (u)) BSON_CMP_SET (greater, bson_cmp_less_ss (u, t), bson_cmp_less_uu (u, t), bson_cmp_less_us (u, t), bson_cmp_less_su (u, t)) BSON_CMP_SET (less_equal, !bson_cmp_greater_ss (t, u), !bson_cmp_greater_uu (t, u), !bson_cmp_greater_su (t, u), !bson_cmp_greater_us (t, u)) BSON_CMP_SET (greater_equal, !bson_cmp_less_ss (t, u), !bson_cmp_less_uu (t, u), !bson_cmp_less_su (t, u), !bson_cmp_less_us (t, u)) #undef BSON_CMP_SET /* Return true if the given value is within the range of the corresponding * signed type. The suffix must match the signedness of the given value. */ #define BSON_IN_RANGE_SET_SIGNED(Type, min, max) \ static BSON_INLINE bool BSON_CONCAT3 (bson_in_range, _##Type, _signed) ( \ int64_t value) \ { \ return bson_cmp_greater_equal_ss (value, min) && \ bson_cmp_less_equal_ss (value, max); \ } \ \ static BSON_INLINE bool BSON_CONCAT3 (bson_in_range, _##Type, _unsigned) ( \ uint64_t value) \ { \ return bson_cmp_greater_equal_us (value, min) && \ bson_cmp_less_equal_us (value, max); \ } /* Return true if the given value is within the range of the corresponding * unsigned type. The suffix must match the signedness of the given value. */ #define BSON_IN_RANGE_SET_UNSIGNED(Type, max) \ static BSON_INLINE bool BSON_CONCAT3 (bson_in_range, _##Type, _signed) ( \ int64_t value) \ { \ return bson_cmp_greater_equal_su (value, 0u) && \ bson_cmp_less_equal_su (value, max); \ } \ \ static BSON_INLINE bool BSON_CONCAT3 (bson_in_range, _##Type, _unsigned) ( \ uint64_t value) \ { \ return bson_cmp_less_equal_uu (value, max); \ } BSON_IN_RANGE_SET_SIGNED (signed_char, SCHAR_MIN, SCHAR_MAX) BSON_IN_RANGE_SET_SIGNED (short, SHRT_MIN, SHRT_MAX) BSON_IN_RANGE_SET_SIGNED (int, INT_MIN, INT_MAX) BSON_IN_RANGE_SET_SIGNED (long, LONG_MIN, LONG_MAX) BSON_IN_RANGE_SET_SIGNED (long_long, LLONG_MIN, LLONG_MAX) BSON_IN_RANGE_SET_UNSIGNED (unsigned_char, UCHAR_MAX) BSON_IN_RANGE_SET_UNSIGNED (unsigned_short, USHRT_MAX) BSON_IN_RANGE_SET_UNSIGNED (unsigned_int, UINT_MAX) BSON_IN_RANGE_SET_UNSIGNED (unsigned_long, ULONG_MAX) BSON_IN_RANGE_SET_UNSIGNED (unsigned_long_long, ULLONG_MAX) BSON_IN_RANGE_SET_SIGNED (int8_t, INT8_MIN, INT8_MAX) BSON_IN_RANGE_SET_SIGNED (int16_t, INT16_MIN, INT16_MAX) BSON_IN_RANGE_SET_SIGNED (int32_t, INT32_MIN, INT32_MAX) BSON_IN_RANGE_SET_SIGNED (int64_t, INT64_MIN, INT64_MAX) BSON_IN_RANGE_SET_UNSIGNED (uint8_t, UINT8_MAX) BSON_IN_RANGE_SET_UNSIGNED (uint16_t, UINT16_MAX) BSON_IN_RANGE_SET_UNSIGNED (uint32_t, UINT32_MAX) BSON_IN_RANGE_SET_UNSIGNED (uint64_t, UINT64_MAX) BSON_IN_RANGE_SET_SIGNED (ssize_t, SSIZE_MIN, SSIZE_MAX) BSON_IN_RANGE_SET_UNSIGNED (size_t, SIZE_MAX) #undef BSON_IN_RANGE_SET_SIGNED #undef BSON_IN_RANGE_SET_UNSIGNED /* Return true if the value with *signed* type is in the representable range of * Type and false otherwise. */ #define bson_in_range_signed(Type, value) \ BSON_CONCAT3 (bson_in_range, _##Type, _signed) (value) /* Return true if the value with *unsigned* type is in the representable range * of Type and false otherwise. */ #define bson_in_range_unsigned(Type, value) \ BSON_CONCAT3 (bson_in_range, _##Type, _unsigned) (value) BSON_END_DECLS #endif /* BSON_CMP_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-compat.h000066400000000000000000000127111456567454500230210ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_COMPAT_H #define BSON_COMPAT_H #if defined(__MINGW32__) #if defined(__USE_MINGW_ANSI_STDIO) #if __USE_MINGW_ANSI_STDIO < 1 #error "__USE_MINGW_ANSI_STDIO > 0 is required for correct PRI* macros" #endif #else #define __USE_MINGW_ANSI_STDIO 1 #endif #endif #include #include #ifdef BSON_OS_WIN32 #if defined(_WIN32_WINNT) && (_WIN32_WINNT < 0x0600) #undef _WIN32_WINNT #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0600 #endif #ifndef NOMINMAX #define NOMINMAX #endif #include #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN #else #include #endif #include #include #endif #ifdef BSON_OS_UNIX #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include BSON_BEGIN_DECLS #if !defined(_MSC_VER) || (_MSC_VER >= 1800) #include #endif #ifdef _MSC_VER #ifndef __cplusplus /* benign redefinition of type */ #pragma warning(disable : 4142) #ifndef _SSIZE_T_DEFINED #define _SSIZE_T_DEFINED typedef SSIZE_T ssize_t; #endif #ifndef _SIZE_T_DEFINED #define _SIZE_T_DEFINED typedef SIZE_T size_t; #endif #pragma warning(default : 4142) #else /* * MSVC++ does not include ssize_t, just size_t. * So we need to synthesize that as well. */ #pragma warning(disable : 4142) #ifndef _SSIZE_T_DEFINED #define _SSIZE_T_DEFINED typedef SSIZE_T ssize_t; #endif #pragma warning(default : 4142) #endif #ifndef PRIi32 #define PRIi32 "d" #endif #ifndef PRId32 #define PRId32 "d" #endif #ifndef PRIu32 #define PRIu32 "u" #endif #ifndef PRIi64 #define PRIi64 "I64i" #endif #ifndef PRId64 #define PRId64 "I64i" #endif #ifndef PRIu64 #define PRIu64 "I64u" #endif #endif /* Derive the maximum representable value of signed integer type T using the * formula 2^(N - 1) - 1 where N is the number of bits in type T. This assumes * T is represented using two's complement. */ #define BSON_NUMERIC_LIMITS_MAX_SIGNED(T) \ ((T) ((((size_t) 0x01u) << (sizeof (T) * (size_t) CHAR_BIT - 1u)) - 1u)) /* Derive the minimum representable value of signed integer type T as one less * than the negation of its maximum representable value. This assumes T is * represented using two's complement. */ #define BSON_NUMERIC_LIMITS_MIN_SIGNED(T, max) ((T) ((-(max)) - 1)) /* Derive the maximum representable value of unsigned integer type T by flipping * all its bits to 1. */ #define BSON_NUMERIC_LIMITS_MAX_UNSIGNED(T) ((T) (~((T) 0))) #ifndef SSIZE_MAX #define SSIZE_MAX BSON_NUMERIC_LIMITS_MAX_SIGNED (ssize_t) #endif #ifndef SSIZE_MIN #define SSIZE_MIN BSON_NUMERIC_LIMITS_MIN_SIGNED (ssize_t, SSIZE_MAX) #endif #if defined(__MINGW32__) && !defined(INIT_ONCE_STATIC_INIT) #define INIT_ONCE_STATIC_INIT RTL_RUN_ONCE_INIT typedef RTL_RUN_ONCE INIT_ONCE; #endif #ifdef BSON_HAVE_STDBOOL_H #include #elif !defined(__bool_true_false_are_defined) #ifndef __cplusplus typedef signed char bool; #define false 0 #define true 1 #endif #define __bool_true_false_are_defined 1 #endif #if defined(__GNUC__) #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) #define bson_sync_synchronize() __sync_synchronize () #elif defined(__i386__) || defined(__i486__) || defined(__i586__) || \ defined(__i686__) || defined(__x86_64__) #define bson_sync_synchronize() asm volatile ("mfence" ::: "memory") #else #define bson_sync_synchronize() asm volatile ("sync" ::: "memory") #endif #elif defined(_MSC_VER) #define bson_sync_synchronize() MemoryBarrier () #endif #if !defined(va_copy) && defined(__va_copy) #define va_copy(dst, src) __va_copy (dst, src) #endif #if !defined(va_copy) #define va_copy(dst, src) ((dst) = (src)) #endif #ifdef _MSC_VER /** Expands the arguments if compiling with MSVC, otherwise empty */ #define BSON_IF_MSVC(...) __VA_ARGS__ /** Expands the arguments if compiling with GCC or Clang, otherwise empty */ #define BSON_IF_GNU_LIKE(...) #elif defined(__GNUC__) || defined(__clang__) /** Expands the arguments if compiling with MSVC, otherwise empty */ #define BSON_IF_MSVC(...) /** Expands the arguments if compiling with GCC or Clang, otherwise empty */ #define BSON_IF_GNU_LIKE(...) __VA_ARGS__ #endif #ifdef BSON_OS_WIN32 /** Expands the arguments if compiling for Windows, otherwise empty */ #define BSON_IF_WINDOWS(...) __VA_ARGS__ /** Expands the arguments if compiling for POSIX, otherwise empty */ #define BSON_IF_POSIX(...) #elif defined(BSON_OS_UNIX) /** Expands the arguments if compiling for Windows, otherwise empty */ #define BSON_IF_WINDOWS(...) /** Expands the arguments if compiling for POSIX, otherwise empty */ #define BSON_IF_POSIX(...) __VA_ARGS__ #endif BSON_END_DECLS #endif /* BSON_COMPAT_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-config.h.in000066400000000000000000000053421456567454500234120ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(BSON_INSIDE) && !defined(BSON_COMPILATION) #error "Only can be included directly." #endif #ifndef BSON_CONFIG_H #define BSON_CONFIG_H /* * Define to 1234 for Little Endian, 4321 for Big Endian. */ #define BSON_BYTE_ORDER @BSON_BYTE_ORDER@ /* * Define to 1 if you have stdbool.h */ #define BSON_HAVE_STDBOOL_H @BSON_HAVE_STDBOOL_H@ #if BSON_HAVE_STDBOOL_H != 1 # undef BSON_HAVE_STDBOOL_H #endif /* * Define to 1 for POSIX-like systems, 2 for Windows. */ #define BSON_OS @BSON_OS@ /* * Define to 1 if you have clock_gettime() available. */ #define BSON_HAVE_CLOCK_GETTIME @BSON_HAVE_CLOCK_GETTIME@ #if BSON_HAVE_CLOCK_GETTIME != 1 # undef BSON_HAVE_CLOCK_GETTIME #endif /* * Define to 1 if you have strings.h available on your platform. */ #define BSON_HAVE_STRINGS_H @BSON_HAVE_STRINGS_H@ #if BSON_HAVE_STRINGS_H != 1 # undef BSON_HAVE_STRINGS_H #endif /* * Define to 1 if you have strnlen available on your platform. */ #define BSON_HAVE_STRNLEN @BSON_HAVE_STRNLEN@ #if BSON_HAVE_STRNLEN != 1 # undef BSON_HAVE_STRNLEN #endif /* * Define to 1 if you have snprintf available on your platform. */ #define BSON_HAVE_SNPRINTF @BSON_HAVE_SNPRINTF@ #if BSON_HAVE_SNPRINTF != 1 # undef BSON_HAVE_SNPRINTF #endif /* * Define to 1 if you have gmtime_r available on your platform. */ #define BSON_HAVE_GMTIME_R @BSON_HAVE_GMTIME_R@ #if BSON_HAVE_GMTIME_R != 1 # undef BSON_HAVE_GMTIME_R #endif /* * Define to 1 if you have struct timespec available on your platform. */ #define BSON_HAVE_TIMESPEC @BSON_HAVE_TIMESPEC@ #if BSON_HAVE_TIMESPEC != 1 # undef BSON_HAVE_TIMESPEC #endif /* * Define to 1 if you want extra aligned types in libbson */ #define BSON_EXTRA_ALIGN @BSON_EXTRA_ALIGN@ #if BSON_EXTRA_ALIGN != 1 # undef BSON_EXTRA_ALIGN #endif /* * Define to 1 if you have rand_r available on your platform. */ #define BSON_HAVE_RAND_R @BSON_HAVE_RAND_R@ #if BSON_HAVE_RAND_R != 1 # undef BSON_HAVE_RAND_R #endif /* * Define to 1 if you have strlcpy available on your platform. */ #define BSON_HAVE_STRLCPY @BSON_HAVE_STRLCPY@ #if BSON_HAVE_STRLCPY != 1 # undef BSON_HAVE_STRLCPY #endif #endif /* BSON_CONFIG_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-context-private.h000066400000000000000000000041131456567454500246670ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_CONTEXT_PRIVATE_H #define BSON_CONTEXT_PRIVATE_H #include #include "common-thread-private.h" BSON_BEGIN_DECLS enum { BSON_OID_RANDOMESS_OFFSET = 4, BSON_OID_RANDOMNESS_SIZE = 5, BSON_OID_SEQ32_OFFSET = 9, BSON_OID_SEQ32_SIZE = 3, BSON_OID_SEQ64_OFFSET = 4, BSON_OID_SEQ64_SIZE = 8 }; struct _bson_context_t { /* flags are defined in bson_context_flags_t */ int flags; uint32_t seq32; uint64_t seq64; uint8_t randomness[BSON_OID_RANDOMNESS_SIZE]; uint64_t pid; }; /** * @brief Insert the context's randomness data into the given OID * * @param context A context for some random data * @param oid The OID to update. */ void _bson_context_set_oid_rand (bson_context_t *context, bson_oid_t *oid); /** * @brief Insert the context's sequence counter into the given OID. Increments * the context's sequence counter. * * @param context The context with the counter to get+update * @param oid The OID to modify */ void _bson_context_set_oid_seq32 (bson_context_t *context, bson_oid_t *oid); /** * @brief Write a 64-bit counter from the given context into the OID. Increments * the context's sequence counter. * * @param context The context with the counter to get+update * @param oid The OID to modify * * @note Only used by the deprecated @ref bson_oid_init_sequence */ void _bson_context_set_oid_seq64 (bson_context_t *context, bson_oid_t *oid); BSON_END_DECLS #endif /* BSON_CONTEXT_PRIVATE_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-context.c000066400000000000000000000231061456567454500232150ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include "common-thread-private.h" #ifndef HOST_NAME_MAX #define HOST_NAME_MAX 256 #endif /* * Globals. */ static bson_context_t gContextDefault; static BSON_INLINE uint64_t _bson_getpid (void) { uint64_t pid; #ifdef BSON_OS_WIN32 DWORD real_pid; real_pid = GetCurrentProcessId (); pid = (real_pid & 0xFFFF) ^ ((real_pid >> 16) & 0xFFFF); #else pid = (uint64_t) getpid (); #endif return pid; } void _bson_context_set_oid_seq32 (bson_context_t *context, /* IN */ bson_oid_t *oid) /* OUT */ { uint32_t seq = (uint32_t) bson_atomic_int32_fetch_add ( (DECL_ATOMIC_INTEGRAL_INT32 *) &context->seq32, 1, bson_memory_order_seq_cst); seq = BSON_UINT32_TO_BE (seq); memcpy (&oid->bytes[BSON_OID_SEQ32_OFFSET], ((uint8_t *) &seq) + 1, BSON_OID_SEQ32_SIZE); } void _bson_context_set_oid_seq64 (bson_context_t *context, /* IN */ bson_oid_t *oid) /* OUT */ { uint64_t seq = (uint64_t) bson_atomic_int64_fetch_add ( (int64_t *) &context->seq64, 1, bson_memory_order_seq_cst); seq = BSON_UINT64_TO_BE (seq); memcpy (&oid->bytes[BSON_OID_SEQ64_OFFSET], &seq, BSON_OID_SEQ64_SIZE); } /* * -------------------------------------------------------------------------- * * _bson_context_get_hostname * * Gets the hostname of the machine, logs a warning on failure. "out" * must be an array of HOST_NAME_MAX bytes. * * -------------------------------------------------------------------------- */ static void _bson_context_get_hostname (char out[HOST_NAME_MAX]) { if (gethostname (out, HOST_NAME_MAX) != 0) { if (errno == ENAMETOOLONG) { fprintf (stderr, "hostname exceeds %d characters, truncating.", HOST_NAME_MAX); } else { fprintf (stderr, "unable to get hostname: %d", errno); } } out[HOST_NAME_MAX - 1] = '\0'; } /*** ======================================== * The below SipHash implementation is based on the original public-domain * reference implementation from Jean-Philippe Aumasson and DJB * (https://github.com/veorq/SipHash). */ /* in-place rotate a 64bit number */ void _bson_rotl_u64 (uint64_t *p, int nbits) { *p = (*p << nbits) | (*p >> (64 - nbits)); } /* Write the little-endian representation of 'val' into 'out' */ void _u64_into_u8x8_le (uint8_t out[8], uint64_t val) { val = BSON_UINT64_TO_LE (val); memcpy (out, &val, sizeof val); } /* Read a little-endian representation of a 64bit number from 'in' */ uint64_t _u8x8_le_to_u64 (const uint8_t in[8]) { uint64_t r; memcpy (&r, in, sizeof r); return BSON_UINT64_FROM_LE (r); } /* Perform one SipHash round */ void _sip_round (uint64_t *v0, uint64_t *v1, uint64_t *v2, uint64_t *v3) { *v0 += *v1; _bson_rotl_u64 (v1, 13); *v1 ^= *v0; _bson_rotl_u64 (v0, 32); *v2 += *v3; _bson_rotl_u64 (v3, 16); *v3 ^= *v2; *v0 += *v3; _bson_rotl_u64 (v3, 21); *v3 ^= *v0; *v2 += *v1; _bson_rotl_u64 (v1, 17); *v1 ^= *v2; _bson_rotl_u64 (v2, 32); } void _siphash (const void *in, const size_t inlen, const uint64_t key[2], uint64_t digest[2]) { const unsigned char *ni = (const unsigned char *) in; const unsigned char *kk = (const unsigned char *) key; uint8_t digest_buf[16] = {0}; const int C_ROUNDS = 2; const int D_ROUNDS = 4; uint64_t v0 = UINT64_C (0x736f6d6570736575); uint64_t v1 = UINT64_C (0x646f72616e646f6d); uint64_t v2 = UINT64_C (0x6c7967656e657261); uint64_t v3 = UINT64_C (0x7465646279746573); uint64_t k0 = _u8x8_le_to_u64 (kk); uint64_t k1 = _u8x8_le_to_u64 (kk + 8); uint64_t m; int i; const unsigned char *end = ni + inlen - (inlen % sizeof (uint64_t)); const int left = inlen & 7; uint64_t b = ((uint64_t) inlen) << 56; v3 ^= k1; v2 ^= k0; v1 ^= k1; v0 ^= k0; v1 ^= 0xee; for (; ni != end; ni += 8) { m = _u8x8_le_to_u64 (ni); v3 ^= m; for (i = 0; i < C_ROUNDS; ++i) _sip_round (&v0, &v1, &v2, &v3); v0 ^= m; } switch (left) { case 7: b |= ((uint64_t) ni[6]) << 48; /* FALLTHRU */ case 6: b |= ((uint64_t) ni[5]) << 40; /* FALLTHRU */ case 5: b |= ((uint64_t) ni[4]) << 32; /* FALLTHRU */ case 4: b |= ((uint64_t) ni[3]) << 24; /* FALLTHRU */ case 3: b |= ((uint64_t) ni[2]) << 16; /* FALLTHRU */ case 2: b |= ((uint64_t) ni[1]) << 8; /* FALLTHRU */ case 1: b |= ((uint64_t) ni[0]); break; default: BSON_UNREACHABLE ("Invalid remainder during SipHash"); case 0: break; } v3 ^= b; for (i = 0; i < C_ROUNDS; ++i) _sip_round (&v0, &v1, &v2, &v3); v0 ^= b; v2 ^= 0xee; for (i = 0; i < D_ROUNDS; ++i) _sip_round (&v0, &v1, &v2, &v3); b = v0 ^ v1 ^ v2 ^ v3; _u64_into_u8x8_le (digest_buf, b); v1 ^= 0xdd; for (i = 0; i < D_ROUNDS; ++i) _sip_round (&v0, &v1, &v2, &v3); b = v0 ^ v1 ^ v2 ^ v3; _u64_into_u8x8_le (digest_buf + 8, b); memcpy (digest, digest_buf, sizeof digest_buf); } /* * The seed consists of the following hashed together: * - current time (with microsecond resolution) * - current pid * - current hostname * - The init-call counter */ struct _init_rand_params { struct timeval time; uint64_t pid; char hostname[HOST_NAME_MAX]; int64_t rand_call_counter; }; static void _bson_context_init_random (bson_context_t *context, bool init_seq) { /* Keep an atomic counter of this function being called. This is used to add * additional input to the random hash, ensuring no two calls in a single * process will receive identical hash inputs, even occurring at the same * microsecond. */ static int64_t s_rand_call_counter = INT64_MIN; /* The message digest of the random params */ uint64_t digest[2] = {0}; uint64_t key[2] = {0}; /* The randomness parameters */ struct _init_rand_params rand_params; /* Init each part of the randomness source: */ memset (&rand_params, 0, sizeof rand_params); bson_gettimeofday (&rand_params.time); rand_params.pid = _bson_getpid (); _bson_context_get_hostname (rand_params.hostname); rand_params.rand_call_counter = bson_atomic_int64_fetch_add ( &s_rand_call_counter, 1, bson_memory_order_seq_cst); /* Generate a SipHash key. We do not care about secrecy or determinism, only * uniqueness. */ memcpy (key, &rand_params, sizeof key); key[1] = ~key[0]; /* Hash the param struct */ _siphash (&rand_params, sizeof rand_params, key, digest); /** Initialize the rand and sequence counters with our random digest */ memcpy (context->randomness, digest, sizeof context->randomness); if (init_seq) { memcpy (&context->seq32, digest + 1, sizeof context->seq32); memcpy (&context->seq64, digest + 1, sizeof context->seq64); /* Chop off some initial bits for nicer counter behavior. This allows the * low digit to start at a zero, and prevents immediately wrapping the * counter in subsequent calls to set_oid_seq. */ context->seq32 &= ~UINT32_C (0xf0000f); context->seq64 &= ~UINT64_C (0xf0000f); } /* Remember the PID we saw here. This may change in case of fork() */ context->pid = rand_params.pid; } static void _bson_context_init (bson_context_t *context, bson_context_flags_t flags) { context->flags = (int) flags; _bson_context_init_random (context, true /* Init counters */); } void _bson_context_set_oid_rand (bson_context_t *context, bson_oid_t *oid) { BSON_ASSERT (context); BSON_ASSERT (oid); if (context->flags & BSON_CONTEXT_DISABLE_PID_CACHE) { /* User has requested that we check if our PID has changed. This can occur * after a call to fork() */ uint64_t now_pid = _bson_getpid (); if (now_pid != context->pid) { _bson_context_init_random ( context, false /* Do not update the sequence counters */); } } /* Copy the stored randomness into the OID */ memcpy (oid->bytes + BSON_OID_RANDOMESS_OFFSET, &context->randomness, BSON_OID_RANDOMNESS_SIZE); } bson_context_t * bson_context_new (bson_context_flags_t flags) { bson_context_t *context; context = bson_malloc0 (sizeof *context); _bson_context_init (context, flags); return context; } void bson_context_destroy (bson_context_t *context) /* IN */ { bson_free (context); } static BSON_ONCE_FUN (_bson_context_init_default) { _bson_context_init (&gContextDefault, BSON_CONTEXT_DISABLE_PID_CACHE); BSON_ONCE_RETURN; } bson_context_t * bson_context_get_default (void) { static bson_once_t once = BSON_ONCE_INIT; bson_once (&once, _bson_context_init_default); return &gContextDefault; } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-context.h000066400000000000000000000032241456567454500232210ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_CONTEXT_H #define BSON_CONTEXT_H #include #include BSON_BEGIN_DECLS /** * @brief Initialize a new context with the given flags * * @param flags Flags used to configure the behavior of the context. For most * cases, this should be BSON_CONTEXT_NONE. * * @return A newly allocated context. Must be freed with bson_context_destroy() * * @note If you expect your pid to change without notice, such as from an * unexpected call to fork(), then specify BSON_CONTEXT_DISABLE_PID_CACHE in * `flags`. */ BSON_EXPORT (bson_context_t *) bson_context_new (bson_context_flags_t flags); /** * @brief Destroy and free a bson_context_t created by bson_context_new() */ BSON_EXPORT (void) bson_context_destroy (bson_context_t *context); /** * @brief Obtain a pointer to the application-default bson_context_t * * @note This context_t MUST NOT be passed to bson_context_destroy() */ BSON_EXPORT (bson_context_t *) bson_context_get_default (void); BSON_END_DECLS #endif /* BSON_CONTEXT_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-decimal128.c000066400000000000000000000565371456567454500234000ustar00rootroot00000000000000 /* * Copyright 2015 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #define BSON_DECIMAL128_EXPONENT_MAX 6111 #define BSON_DECIMAL128_EXPONENT_MIN -6176 #define BSON_DECIMAL128_EXPONENT_BIAS 6176 #define BSON_DECIMAL128_MAX_DIGITS 34 #define BSON_DECIMAL128_SET_NAN(dec) \ do { \ (dec).high = 0x7c00000000000000ull; \ (dec).low = 0; \ } while (0); #define BSON_DECIMAL128_SET_INF(dec, isneg) \ do { \ (dec).high = 0x7800000000000000ull + 0x8000000000000000ull * (isneg); \ (dec).low = 0; \ } while (0); /** * _bson_uint128_t: * * This struct represents a 128 bit integer. */ typedef struct { uint32_t parts[4]; /* 32-bit words stored high to low. */ } _bson_uint128_t; /** *------------------------------------------------------------------------------ * * _bson_uint128_divide1B -- * * This function divides a #_bson_uint128_t by 1000000000 (1 billion) and * computes the quotient and remainder. * * The remainder will contain 9 decimal digits for conversion to string. * * @value The #_bson_uint128_t operand. * @quotient A pointer to store the #_bson_uint128_t quotient. * @rem A pointer to store the #uint64_t remainder. * * Returns: * The quotient at @quotient and the remainder at @rem. * * Side effects: * None. * *------------------------------------------------------------------------------ */ static void _bson_uint128_divide1B (_bson_uint128_t value, /* IN */ _bson_uint128_t *quotient, /* OUT */ uint32_t *rem) /* OUT */ { const uint32_t DIVISOR = 1000 * 1000 * 1000; uint64_t _rem = 0; int i = 0; if (!value.parts[0] && !value.parts[1] && !value.parts[2] && !value.parts[3]) { *quotient = value; *rem = 0; return; } for (i = 0; i <= 3; i++) { _rem <<= 32; /* Adjust remainder to match value of next dividend */ _rem += value.parts[i]; /* Add the divided to _rem */ value.parts[i] = (uint32_t) (_rem / DIVISOR); _rem %= DIVISOR; /* Store the remainder */ } *quotient = value; *rem = (uint32_t) _rem; } /** *------------------------------------------------------------------------------ * * bson_decimal128_to_string -- * * This function converts a BID formatted decimal128 value to string, * accepting a &bson_decimal128_t as @dec. The string is stored at @str. * * @dec : The BID formatted decimal to convert. * @str : The output decimal128 string. At least %BSON_DECIMAL128_STRING *characters. * * Returns: * None. * * Side effects: * None. * *------------------------------------------------------------------------------ */ void bson_decimal128_to_string (const bson_decimal128_t *dec, /* IN */ char *str) /* OUT */ { uint32_t COMBINATION_MASK = 0x1f; /* Extract least significant 5 bits */ uint32_t EXPONENT_MASK = 0x3fff; /* Extract least significant 14 bits */ uint32_t COMBINATION_INFINITY = 30; /* Value of combination field for Inf */ uint32_t COMBINATION_NAN = 31; /* Value of combination field for NaN */ uint32_t EXPONENT_BIAS = 6176; /* decimal128 exponent bias */ char *str_out = str; /* output pointer in string */ char significand_str[35]; /* decoded significand digits */ /* Note: bits in this routine are referred to starting at 0, */ /* from the sign bit, towards the coefficient. */ uint32_t high; /* bits 0 - 31 */ uint32_t midh; /* bits 32 - 63 */ uint32_t midl; /* bits 64 - 95 */ uint32_t low; /* bits 96 - 127 */ uint32_t combination; /* bits 1 - 5 */ uint32_t biased_exponent; /* decoded biased exponent (14 bits) */ uint32_t significand_digits = 0; /* the number of significand digits */ uint32_t significand[36] = {0}; /* the base-10 digits in the significand */ uint32_t *significand_read = significand; /* read pointer into significand */ int32_t exponent; /* unbiased exponent */ int32_t scientific_exponent; /* the exponent if scientific notation is * used */ bool is_zero = false; /* true if the number is zero */ uint8_t significand_msb; /* the most signifcant significand bits (50-46) */ _bson_uint128_t significand128; /* temporary storage for significand decoding */ memset (significand_str, 0, sizeof (significand_str)); if ((int64_t) dec->high < 0) { /* negative */ *(str_out++) = '-'; } low = (uint32_t) dec->low, midl = (uint32_t) (dec->low >> 32), midh = (uint32_t) dec->high, high = (uint32_t) (dec->high >> 32); /* Decode combination field and exponent */ combination = (high >> 26) & COMBINATION_MASK; if (BSON_UNLIKELY ((combination >> 3) == 3)) { /* Check for 'special' values */ if (combination == COMBINATION_INFINITY) { /* Infinity */ strcpy (str_out, BSON_DECIMAL128_INF); return; } else if (combination == COMBINATION_NAN) { /* NaN */ /* str, not str_out, to erase the sign */ strcpy (str, BSON_DECIMAL128_NAN); /* we don't care about the NaN payload. */ return; } else { biased_exponent = (high >> 15) & EXPONENT_MASK; significand_msb = 0x8 + ((high >> 14) & 0x1); } } else { significand_msb = (high >> 14) & 0x7; biased_exponent = (high >> 17) & EXPONENT_MASK; } exponent = biased_exponent - EXPONENT_BIAS; /* Create string of significand digits */ /* Convert the 114-bit binary number represented by */ /* (high, midh, midl, low) to at most 34 decimal */ /* digits through modulo and division. */ significand128.parts[0] = (high & 0x3fff) + ((significand_msb & 0xf) << 14); significand128.parts[1] = midh; significand128.parts[2] = midl; significand128.parts[3] = low; if (significand128.parts[0] == 0 && significand128.parts[1] == 0 && significand128.parts[2] == 0 && significand128.parts[3] == 0) { is_zero = true; } else if (significand128.parts[0] >= (1 << 17)) { /* The significand is non-canonical or zero. * In order to preserve compatibility with the densely packed decimal * format, the maximum value for the significand of decimal128 is * 1e34 - 1. If the value is greater than 1e34 - 1, the IEEE 754 * standard dictates that the significand is interpreted as zero. */ is_zero = true; } else { for (int k = 3; k >= 0; k--) { uint32_t least_digits = 0; _bson_uint128_divide1B ( significand128, &significand128, &least_digits); /* We now have the 9 least significant digits (in base 2). */ /* Convert and output to string. */ if (!least_digits) { continue; } for (int j = 8; j >= 0; j--) { significand[k * 9 + j] = least_digits % 10; least_digits /= 10; } } } /* Output format options: */ /* Scientific - [-]d.dddE(+/-)dd or [-]dE(+/-)dd */ /* Regular - ddd.ddd */ if (is_zero) { significand_digits = 1; *significand_read = 0; } else { significand_digits = 36; while (!(*significand_read)) { significand_digits--; significand_read++; } } scientific_exponent = significand_digits - 1 + exponent; /* The scientific exponent checks are dictated by the string conversion * specification and are somewhat arbitrary cutoffs. * * We must check exponent > 0, because if this is the case, the number * has trailing zeros. However, we *cannot* output these trailing zeros, * because doing so would change the precision of the value, and would * change stored data if the string converted number is round tripped. */ if (scientific_exponent < -6 || exponent > 0) { /* Scientific format */ *(str_out++) = *(significand_read++) + '0'; significand_digits--; if (significand_digits) { *(str_out++) = '.'; } for (uint32_t i = 0; i < significand_digits && (str_out - str) < 36; i++) { *(str_out++) = *(significand_read++) + '0'; } /* Exponent */ *(str_out++) = 'E'; bson_snprintf (str_out, 6, "%+d", scientific_exponent); } else { /* Regular format with no decimal place */ if (exponent >= 0) { for (uint32_t i = 0; i < significand_digits && (str_out - str) < 36; i++) { *(str_out++) = *(significand_read++) + '0'; } *str_out = '\0'; } else { int32_t radix_position = significand_digits + exponent; if (radix_position > 0) { /* non-zero digits before radix */ for (int32_t i = 0; i < radix_position && (str_out - str) < BSON_DECIMAL128_STRING; i++) { *(str_out++) = *(significand_read++) + '0'; } } else { /* leading zero before radix point */ *(str_out++) = '0'; } *(str_out++) = '.'; while (radix_position++ < 0) { /* add leading zeros after radix */ *(str_out++) = '0'; } for (uint32_t i = 0; bson_cmp_greater_us (significand_digits - i, BSON_MAX (radix_position - 1, 0)) && (str_out - str) < BSON_DECIMAL128_STRING; i++) { *(str_out++) = *(significand_read++) + '0'; } *str_out = '\0'; } } } typedef struct { uint64_t high, low; } _bson_uint128_6464_t; /** *------------------------------------------------------------------------- * * mul64x64 -- * * This function multiplies two &uint64_t into a &_bson_uint128_6464_t. * * Returns: * The product of @left and @right. * * Side Effects: * None. * *------------------------------------------------------------------------- */ static void _mul_64x64 (uint64_t left, /* IN */ uint64_t right, /* IN */ _bson_uint128_6464_t *product) /* OUT */ { uint64_t left_high, left_low, right_high, right_low, product_high, product_mid, product_mid2, product_low; _bson_uint128_6464_t rt = {0}; if (!left && !right) { *product = rt; return; } left_high = left >> 32; left_low = (uint32_t) left; right_high = right >> 32; right_low = (uint32_t) right; product_high = left_high * right_high; product_mid = left_high * right_low; product_mid2 = left_low * right_high; product_low = left_low * right_low; product_high += product_mid >> 32; product_mid = (uint32_t) product_mid + product_mid2 + (product_low >> 32); product_high = product_high + (product_mid >> 32); product_low = (product_mid << 32) + (uint32_t) product_low; rt.high = product_high; rt.low = product_low; *product = rt; } /** *------------------------------------------------------------------------------ * * _dec128_tolower -- * * This function converts the ASCII character @c to lowercase. It is locale * insensitive (unlike the stdlib tolower). * * Returns: * The lowercased character. */ char _dec128_tolower (char c) { if (isupper (c)) { c += 32; } return c; } /** *------------------------------------------------------------------------------ * * _dec128_istreq -- * * This function compares the null-terminated *ASCII* strings @a and @b * for case-insensitive equality. * * Returns: * true if the strings are equal, false otherwise. */ bool _dec128_istreq (const char *a, /* IN */ const char *b /* IN */) { while (*a != '\0' || *b != '\0') { /* strings are different lengths. */ if (*a == '\0' || *b == '\0') { return false; } if (_dec128_tolower (*a) != _dec128_tolower (*b)) { return false; } a++; b++; } return true; } /** *------------------------------------------------------------------------------ * * bson_decimal128_from_string -- * * This function converts @string in the format [+-]ddd[.]ddd[E][+-]dddd to * decimal128. Out of range values are converted to +/-Infinity. Invalid * strings are converted to NaN. * * If more digits are provided than the available precision allows, * round to the nearest expressable decimal128 with ties going to even will * occur. * * Note: @string must be ASCII only! * * Returns: * true on success, or false on failure. @dec will be NaN if @str was invalid * The &bson_decimal128_t converted from @string at @dec. * * Side effects: * None. * *------------------------------------------------------------------------------ */ bool bson_decimal128_from_string (const char *string, /* IN */ bson_decimal128_t *dec) /* OUT */ { return bson_decimal128_from_string_w_len (string, -1, dec); } /** *------------------------------------------------------------------------------ * * bson_decimal128_from_string_w_len -- * * This function converts @string in the format [+-]ddd[.]ddd[E][+-]dddd to * decimal128. Out of range values are converted to +/-Infinity. Invalid * strings are converted to NaN. @len is the length of the string, or -1 * meaning the string is null-terminated. * * If more digits are provided than the available precision allows, * round to the nearest expressable decimal128 with ties going to even will * occur. * * Note: @string must be ASCII only! * * Returns: * true on success, or false on failure. @dec will be NaN if @str was invalid * The &bson_decimal128_t converted from @string at @dec. * * Side effects: * None. * *------------------------------------------------------------------------------ */ bool bson_decimal128_from_string_w_len (const char *string, /* IN */ int len, /* IN */ bson_decimal128_t *dec) /* OUT */ { _bson_uint128_6464_t significand = {0}; const char *str_read = string; /* Read pointer for consuming str. */ /* Parsing state tracking */ bool is_negative = false; bool saw_radix = false; bool includes_sign = false; /* True if the input string contains a sign. */ bool found_nonzero = false; size_t significant_digits = 0; /* Total number of significant digits * (no leading or trailing zero) */ size_t ndigits_read = 0; /* Total number of significand digits read */ size_t ndigits = 0; /* Total number of digits (no leading zeros) */ size_t radix_position = 0; /* The number of the digits after radix */ size_t first_nonzero = 0; /* The index of the first non-zero in *str* */ uint16_t digits[BSON_DECIMAL128_MAX_DIGITS] = {0}; uint16_t ndigits_stored = 0; /* The number of digits in digits */ uint16_t *digits_insert = digits; /* Insertion pointer for digits */ size_t first_digit = 0; /* The index of the first non-zero digit */ size_t last_digit = 0; /* The index of the last digit */ int32_t exponent = 0; uint64_t significand_high = 0; /* The high 17 digits of the significand */ uint64_t significand_low = 0; /* The low 17 digits of the significand */ uint16_t biased_exponent = 0; /* The biased exponent */ BSON_ASSERT (dec); dec->high = 0; dec->low = 0; if (*str_read == '+' || *str_read == '-') { is_negative = *(str_read++) == '-'; includes_sign = true; } /* Check for Infinity or NaN */ if (!isdigit (*str_read) && *str_read != '.') { if (_dec128_istreq (str_read, "inf") || _dec128_istreq (str_read, "infinity")) { BSON_DECIMAL128_SET_INF (*dec, is_negative); return true; } else if (_dec128_istreq (str_read, "nan")) { BSON_DECIMAL128_SET_NAN (*dec); return true; } BSON_DECIMAL128_SET_NAN (*dec); return false; } /* Read digits */ while (((isdigit (*str_read) || *str_read == '.')) && (len == -1 || str_read < string + len)) { if (*str_read == '.') { if (saw_radix) { BSON_DECIMAL128_SET_NAN (*dec); return false; } saw_radix = true; str_read++; continue; } if (ndigits_stored < BSON_DECIMAL128_MAX_DIGITS) { if (*str_read != '0' || found_nonzero) { if (!found_nonzero) { first_nonzero = ndigits_read; } found_nonzero = true; *(digits_insert++) = *(str_read) - '0'; /* Only store 34 digits */ ndigits_stored++; } } if (found_nonzero) { ndigits++; } if (saw_radix) { radix_position++; } ndigits_read++; str_read++; } if (saw_radix && !ndigits_read) { BSON_DECIMAL128_SET_NAN (*dec); return false; } /* Read exponent if exists */ if (*str_read == 'e' || *str_read == 'E') { int nread = 0; #ifdef _MSC_VER #define SSCANF sscanf_s #else #define SSCANF sscanf #endif int64_t temp_exponent = 0; int read_exponent = SSCANF (++str_read, "%" SCNd64 "%n", &temp_exponent, &nread); str_read += nread; if (!read_exponent || nread == 0 || !bson_in_range_int32_t_signed (temp_exponent)) { BSON_DECIMAL128_SET_NAN (*dec); return false; } exponent = (int32_t) temp_exponent; #undef SSCANF } if ((len == -1 || str_read < string + len) && *str_read) { BSON_DECIMAL128_SET_NAN (*dec); return false; } /* Done reading input. */ /* Find first non-zero digit in digits */ first_digit = 0; if (!ndigits_stored) { /* value is zero */ first_digit = 0; last_digit = 0; digits[0] = 0; ndigits = 1; ndigits_stored = 1; significant_digits = 0; } else { last_digit = ndigits_stored - 1; significant_digits = ndigits; /* Mark trailing zeros as non-significant */ while (string[first_nonzero + significant_digits - 1 + includes_sign + saw_radix] == '0') { significant_digits--; } } /* Normalization of exponent */ /* Correct exponent based on radix position, and shift significand as needed */ /* to represent user input */ /* Overflow prevention */ if (bson_cmp_less_equal_su (exponent, radix_position) && bson_cmp_greater_us (radix_position, exponent + (1 << 14))) { exponent = BSON_DECIMAL128_EXPONENT_MIN; } else { BSON_ASSERT (bson_in_range_unsigned (int32_t, radix_position)); exponent -= (int32_t) radix_position; } /* Attempt to normalize the exponent */ while (exponent > BSON_DECIMAL128_EXPONENT_MAX) { /* Shift exponent to significand and decrease */ last_digit++; if (last_digit - first_digit >= BSON_DECIMAL128_MAX_DIGITS) { /* The exponent is too great to shift into the significand. */ if (significant_digits == 0) { /* Value is zero, we are allowed to clamp the exponent. */ exponent = BSON_DECIMAL128_EXPONENT_MAX; break; } /* Overflow is not permitted, error. */ BSON_DECIMAL128_SET_NAN (*dec); return false; } exponent--; } while (exponent < BSON_DECIMAL128_EXPONENT_MIN || ndigits_stored < ndigits) { /* Shift last digit */ if (last_digit == 0) { /* underflow is not allowed, but zero clamping is */ if (significant_digits == 0) { exponent = BSON_DECIMAL128_EXPONENT_MIN; break; } BSON_DECIMAL128_SET_NAN (*dec); return false; } if (ndigits_stored < ndigits) { if (string[ndigits - 1 + includes_sign + saw_radix] - '0' != 0 && significant_digits != 0) { BSON_DECIMAL128_SET_NAN (*dec); return false; } ndigits--; /* adjust to match digits not stored */ } else { if (digits[last_digit] != 0) { /* Inexact rounding is not allowed. */ BSON_DECIMAL128_SET_NAN (*dec); return false; } last_digit--; /* adjust to round */ } if (exponent < BSON_DECIMAL128_EXPONENT_MAX) { exponent++; } else { BSON_DECIMAL128_SET_NAN (*dec); return false; } } /* Round */ /* We've normalized the exponent, but might still need to round. */ if (last_digit - first_digit + 1 < significant_digits) { uint8_t round_digit; /* There are non-zero digits after last_digit that need rounding. */ /* We round to nearest, ties to even */ round_digit = string[first_nonzero + last_digit + includes_sign + saw_radix + 1] - '0'; if (round_digit != 0) { /* Inexact (non-zero) rounding is not allowed */ BSON_DECIMAL128_SET_NAN (*dec); return false; } } /* Encode significand */ if (significant_digits == 0) { /* read a zero */ significand_high = 0; significand_low = 0; } else if (last_digit - first_digit < 17) { size_t d_idx = first_digit; significand_low = digits[d_idx++]; for (; d_idx <= last_digit; d_idx++) { significand_low *= 10; significand_low += digits[d_idx]; significand_high = 0; } } else { size_t d_idx = first_digit; significand_high = digits[d_idx++]; for (; d_idx <= last_digit - 17; d_idx++) { significand_high *= 10; significand_high += digits[d_idx]; } significand_low = digits[d_idx++]; for (; d_idx <= last_digit; d_idx++) { significand_low *= 10; significand_low += digits[d_idx]; } } _mul_64x64 (significand_high, 100000000000000000ull, &significand); significand.low += significand_low; if (significand.low < significand_low) { significand.high += 1; } biased_exponent = (exponent + (int16_t) BSON_DECIMAL128_EXPONENT_BIAS); /* Encode combination, exponent, and significand. */ if ((significand.high >> 49) & 1) { /* Encode '11' into bits 1 to 3 */ dec->high |= (0x3ull << 61); dec->high |= (biased_exponent & 0x3fffull) << 47; dec->high |= significand.high & 0x7fffffffffffull; } else { dec->high |= (biased_exponent & 0x3fffull) << 49; dec->high |= significand.high & 0x1ffffffffffffull; } dec->low = significand.low; /* Encode sign */ if (is_negative) { dec->high |= 0x8000000000000000ull; } return true; } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-decimal128.h000066400000000000000000000030741456567454500233710ustar00rootroot00000000000000/* * Copyright 2015 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_DECIMAL128_H #define BSON_DECIMAL128_H #include #include #include #include /** * BSON_DECIMAL128_STRING: * * The length of a decimal128 string (with null terminator). * * 1 for the sign * 35 for digits and radix * 2 for exponent indicator and sign * 4 for exponent digits */ #define BSON_DECIMAL128_STRING 43 #define BSON_DECIMAL128_INF "Infinity" #define BSON_DECIMAL128_NAN "NaN" BSON_BEGIN_DECLS BSON_EXPORT (void) bson_decimal128_to_string (const bson_decimal128_t *dec, char *str); /* Note: @string must be ASCII characters only! */ BSON_EXPORT (bool) bson_decimal128_from_string (const char *string, bson_decimal128_t *dec); BSON_EXPORT (bool) bson_decimal128_from_string_w_len (const char *string, int len, bson_decimal128_t *dec); BSON_END_DECLS #endif /* BSON_DECIMAL128_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-endian.h000066400000000000000000000144351456567454500230010ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_ENDIAN_H #define BSON_ENDIAN_H #if defined(__sun) #include #endif #include #include #include BSON_BEGIN_DECLS #define BSON_BIG_ENDIAN 4321 #define BSON_LITTLE_ENDIAN 1234 #if defined(__sun) #define BSON_UINT16_SWAP_LE_BE(v) BSWAP_16 ((uint16_t) v) #define BSON_UINT32_SWAP_LE_BE(v) BSWAP_32 ((uint32_t) v) #define BSON_UINT64_SWAP_LE_BE(v) BSWAP_64 ((uint64_t) v) #elif defined(__clang__) && defined(__clang_major__) && \ defined(__clang_minor__) && (__clang_major__ >= 3) && \ (__clang_minor__ >= 1) #if __has_builtin(__builtin_bswap16) #define BSON_UINT16_SWAP_LE_BE(v) __builtin_bswap16 (v) #endif #if __has_builtin(__builtin_bswap32) #define BSON_UINT32_SWAP_LE_BE(v) __builtin_bswap32 (v) #endif #if __has_builtin(__builtin_bswap64) #define BSON_UINT64_SWAP_LE_BE(v) __builtin_bswap64 (v) #endif #elif defined(__GNUC__) && (__GNUC__ >= 4) #if __GNUC__ > 4 || (defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 3) #define BSON_UINT32_SWAP_LE_BE(v) __builtin_bswap32 ((uint32_t) v) #define BSON_UINT64_SWAP_LE_BE(v) __builtin_bswap64 ((uint64_t) v) #endif #if __GNUC__ > 4 || (defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 8) #define BSON_UINT16_SWAP_LE_BE(v) __builtin_bswap16 ((uint32_t) v) #endif #endif #ifndef BSON_UINT16_SWAP_LE_BE #define BSON_UINT16_SWAP_LE_BE(v) __bson_uint16_swap_slow ((uint16_t) v) #endif #ifndef BSON_UINT32_SWAP_LE_BE #define BSON_UINT32_SWAP_LE_BE(v) __bson_uint32_swap_slow ((uint32_t) v) #endif #ifndef BSON_UINT64_SWAP_LE_BE #define BSON_UINT64_SWAP_LE_BE(v) __bson_uint64_swap_slow ((uint64_t) v) #endif #if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN #define BSON_UINT16_FROM_LE(v) ((uint16_t) v) #define BSON_UINT16_TO_LE(v) ((uint16_t) v) #define BSON_UINT16_FROM_BE(v) BSON_UINT16_SWAP_LE_BE (v) #define BSON_UINT16_TO_BE(v) BSON_UINT16_SWAP_LE_BE (v) #define BSON_UINT32_FROM_LE(v) ((uint32_t) v) #define BSON_UINT32_TO_LE(v) ((uint32_t) v) #define BSON_UINT32_FROM_BE(v) BSON_UINT32_SWAP_LE_BE (v) #define BSON_UINT32_TO_BE(v) BSON_UINT32_SWAP_LE_BE (v) #define BSON_UINT64_FROM_LE(v) ((uint64_t) v) #define BSON_UINT64_TO_LE(v) ((uint64_t) v) #define BSON_UINT64_FROM_BE(v) BSON_UINT64_SWAP_LE_BE (v) #define BSON_UINT64_TO_BE(v) BSON_UINT64_SWAP_LE_BE (v) #define BSON_DOUBLE_FROM_LE(v) ((double) v) #define BSON_DOUBLE_TO_LE(v) ((double) v) #elif BSON_BYTE_ORDER == BSON_BIG_ENDIAN #define BSON_UINT16_FROM_LE(v) BSON_UINT16_SWAP_LE_BE (v) #define BSON_UINT16_TO_LE(v) BSON_UINT16_SWAP_LE_BE (v) #define BSON_UINT16_FROM_BE(v) ((uint16_t) v) #define BSON_UINT16_TO_BE(v) ((uint16_t) v) #define BSON_UINT32_FROM_LE(v) BSON_UINT32_SWAP_LE_BE (v) #define BSON_UINT32_TO_LE(v) BSON_UINT32_SWAP_LE_BE (v) #define BSON_UINT32_FROM_BE(v) ((uint32_t) v) #define BSON_UINT32_TO_BE(v) ((uint32_t) v) #define BSON_UINT64_FROM_LE(v) BSON_UINT64_SWAP_LE_BE (v) #define BSON_UINT64_TO_LE(v) BSON_UINT64_SWAP_LE_BE (v) #define BSON_UINT64_FROM_BE(v) ((uint64_t) v) #define BSON_UINT64_TO_BE(v) ((uint64_t) v) #define BSON_DOUBLE_FROM_LE(v) (__bson_double_swap_slow (v)) #define BSON_DOUBLE_TO_LE(v) (__bson_double_swap_slow (v)) #else #error "The endianness of target architecture is unknown." #endif /* *-------------------------------------------------------------------------- * * __bson_uint16_swap_slow -- * * Fallback endianness conversion for 16-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE uint16_t __bson_uint16_swap_slow (uint16_t v) /* IN */ { return (uint16_t) ((v & 0x00FF) << 8) | (uint16_t) ((v & 0xFF00) >> 8); } /* *-------------------------------------------------------------------------- * * __bson_uint32_swap_slow -- * * Fallback endianness conversion for 32-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE uint32_t __bson_uint32_swap_slow (uint32_t v) /* IN */ { return ((v & 0x000000FFU) << 24) | ((v & 0x0000FF00U) << 8) | ((v & 0x00FF0000U) >> 8) | ((v & 0xFF000000U) >> 24); } /* *-------------------------------------------------------------------------- * * __bson_uint64_swap_slow -- * * Fallback endianness conversion for 64-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE uint64_t __bson_uint64_swap_slow (uint64_t v) /* IN */ { return ((v & 0x00000000000000FFULL) << 56) | ((v & 0x000000000000FF00ULL) << 40) | ((v & 0x0000000000FF0000ULL) << 24) | ((v & 0x00000000FF000000ULL) << 8) | ((v & 0x000000FF00000000ULL) >> 8) | ((v & 0x0000FF0000000000ULL) >> 24) | ((v & 0x00FF000000000000ULL) >> 40) | ((v & 0xFF00000000000000ULL) >> 56); } /* *-------------------------------------------------------------------------- * * __bson_double_swap_slow -- * * Fallback endianness conversion for double floating point. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ BSON_STATIC_ASSERT2 (sizeof_uint64_t, sizeof (double) == sizeof (uint64_t)); static BSON_INLINE double __bson_double_swap_slow (double v) /* IN */ { uint64_t uv; memcpy (&uv, &v, sizeof (v)); uv = BSON_UINT64_SWAP_LE_BE (uv); memcpy (&v, &uv, sizeof (v)); return v; } BSON_END_DECLS #endif /* BSON_ENDIAN_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-error.c000066400000000000000000000136571456567454500226740ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include // See `bson_strerror_r()` definition below. #if !defined(_WIN32) && !defined(__APPLE__) #include // uselocale() #endif /* *-------------------------------------------------------------------------- * * bson_set_error -- * * Initializes @error using the parameters specified. * * @domain is an application specific error domain which should * describe which module initiated the error. Think of this as the * exception type. * * @code is the @domain specific error code. * * @format is used to generate the format string. It uses vsnprintf() * internally so the format should match what you would use there. * * Parameters: * @error: A #bson_error_t. * @domain: The error domain. * @code: The error code. * @format: A printf style format string. * * Returns: * None. * * Side effects: * @error is initialized. * *-------------------------------------------------------------------------- */ void bson_set_error (bson_error_t *error, /* OUT */ uint32_t domain, /* IN */ uint32_t code, /* IN */ const char *format, /* IN */ ...) /* IN */ { va_list args; if (error) { error->domain = domain; error->code = code; va_start (args, format); bson_vsnprintf (error->message, sizeof error->message, format, args); va_end (args); error->message[sizeof error->message - 1] = '\0'; } } /* *-------------------------------------------------------------------------- * * bson_strerror_r -- * * This is a reentrant safe macro for strerror. * * The resulting string may be stored in @buf. * * Returns: * A pointer to a static string or @buf. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strerror_r (int err_code, /* IN */ char *buf BSON_MAYBE_UNUSED, /* IN */ size_t buflen BSON_MAYBE_UNUSED) /* IN */ { static const char *unknown_msg = "Unknown error"; char *ret = NULL; #if defined(_WIN32) // Windows does not provide `strerror_l` or `strerror_r`, but it does // unconditionally provide `strerror_s`. if (strerror_s (buf, buflen, err_code) != 0) { ret = buf; } #elif defined(_AIX) // AIX does not provide strerror_l, and its strerror_r isn't glibc's. // But it does provide a glibc compatible one called __linux_strerror_r ret = __linux_strerror_r (err_code, buf, buflen); #elif defined(__APPLE__) // Apple does not provide `strerror_l`, but it does unconditionally provide // the XSI-compliant `strerror_r`, but only when compiling with Apple Clang. // GNU extensions may still be a problem if we are being compiled with GCC on // Apple. Avoid the compatibility headaches with GNU extensions and the musl // library by assuming the implementation will not cause UB when reading the // error message string even when `strerror_r` fails, as encouraged (but not // required) by the POSIX spec (see: // https://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror.html#tag_16_574_08). (void) strerror_r (err_code, buf, buflen); #elif defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 700 // The behavior (of `strerror_l`) is undefined if the locale argument to // `strerror_l()` is the special locale object LC_GLOBAL_LOCALE or is not a // valid locale object handle. locale_t locale = uselocale ((locale_t) 0); // No need to test for error (it can only be [EINVAL]). if (locale == LC_GLOBAL_LOCALE) { // Only use our own locale if a thread-local locale was not already set. // This is just to satisfy `strerror_l`. We do NOT want to unconditionally // set a thread-local locale. locale = newlocale (LC_MESSAGES_MASK, "C", (locale_t) 0); } BSON_ASSERT (locale != LC_GLOBAL_LOCALE); // Avoid `strerror_r` compatibility headaches with GNU extensions and the // musl library by using `strerror_l` instead. Furthermore, `strerror_r` is // scheduled to be marked as obsolete in favor of `strerror_l` in the // upcoming POSIX Issue 8 (see: // https://www.austingroupbugs.net/view.php?id=655). // // POSIX Spec: since strerror_l() is required to return a string for some // errors, an application wishing to check for all error situations should // set errno to 0, then call strerror_l(), then check errno. if (locale != (locale_t) 0) { errno = 0; ret = strerror_l (err_code, locale); if (errno != 0) { ret = NULL; } freelocale (locale); } else { // Could not obtain a valid `locale_t` object to satisfy `strerror_l`. // Fallback to `bson_strncpy` below. } #elif defined(_GNU_SOURCE) // Unlikely, but continue supporting use of GNU extension in cases where the // C Driver is being built without _XOPEN_SOURCE=700. ret = strerror_r (err_code, buf, buflen); #else #error "Unable to find a supported strerror_r candidate" #endif if (!ret) { bson_strncpy (buf, unknown_msg, buflen); ret = buf; } return ret; } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-error.h000066400000000000000000000022521456567454500226660ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_ERROR_H #define BSON_ERROR_H #include #include #include BSON_BEGIN_DECLS #define BSON_ERROR_JSON 1 #define BSON_ERROR_READER 2 #define BSON_ERROR_INVALID 3 BSON_EXPORT (void) bson_set_error (bson_error_t *error, uint32_t domain, uint32_t code, const char *format, ...) BSON_GNUC_PRINTF (4, 5); BSON_EXPORT (char *) bson_strerror_r (int err_code, char *buf, size_t buflen); BSON_END_DECLS #endif /* BSON_ERROR_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-iso8601-private.h000066400000000000000000000025131456567454500243160ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_ISO8601_PRIVATE_H #define BSON_ISO8601_PRIVATE_H #include #include #include BSON_BEGIN_DECLS bool _bson_iso8601_date_parse (const char *str, int32_t len, int64_t *out, bson_error_t *error); /** * _bson_iso8601_date_format: * @msecs_since_epoch: A positive number of milliseconds since Jan 1, 1970. * @str: The string to append the ISO8601-formatted to. * * Appends a date formatted like "2012-12-24T12:15:30.500Z" to @str. */ void _bson_iso8601_date_format (int64_t msecs_since_epoch, bson_string_t *str); BSON_END_DECLS #endif /* BSON_ISO8601_PRIVATE_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-iso8601.c000066400000000000000000000210201456567454500226330ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include static bool get_tok (const char *terminals, const char **ptr, int32_t *remaining, const char **out, int32_t *out_len) { const char *terminal; bool found_terminal = false; if (!*remaining) { *out = ""; *out_len = 0; } *out = *ptr; *out_len = -1; for (; *remaining && !found_terminal; (*ptr)++, (*remaining)--, (*out_len)++) { for (terminal = terminals; *terminal; terminal++) { if (**ptr == *terminal) { found_terminal = true; break; } } } if (!found_terminal) { (*out_len)++; } return found_terminal; } static bool digits_only (const char *str, int32_t len) { int i; for (i = 0; i < len; i++) { if (!isdigit (str[i])) { return false; } } return true; } static bool parse_num (const char *str, int32_t len, int32_t digits, int32_t min, int32_t max, int32_t *out) { int i; int magnitude = 1; int32_t value = 0; if ((digits >= 0 && len != digits) || !digits_only (str, len)) { return false; } for (i = 1; i <= len; i++, magnitude *= 10) { value += (str[len - i] - '0') * magnitude; } if (value < min || value > max) { return false; } *out = value; return true; } bool _bson_iso8601_date_parse (const char *str, int32_t len, int64_t *out, bson_error_t *error) { const char *ptr; int32_t remaining = len; const char *year_ptr = NULL; const char *month_ptr = NULL; const char *day_ptr = NULL; const char *hour_ptr = NULL; const char *min_ptr = NULL; const char *sec_ptr = NULL; const char *millis_ptr = NULL; const char *tz_ptr = NULL; int32_t year_len = 0; int32_t month_len = 0; int32_t day_len = 0; int32_t hour_len = 0; int32_t min_len = 0; int32_t sec_len = 0; int32_t millis_len = 0; int32_t tz_len = 0; int32_t year; int32_t month; int32_t day; int32_t hour; int32_t min; int32_t sec = 0; int64_t millis = 0; int32_t tz_adjustment = 0; struct bson_tm posix_date = {0}; #define DATE_PARSE_ERR(msg) \ bson_set_error (error, \ BSON_ERROR_JSON, \ BSON_JSON_ERROR_READ_INVALID_PARAM, \ "Could not parse \"%s\" as date: " msg, \ str); \ return false #define DEFAULT_DATE_PARSE_ERR \ DATE_PARSE_ERR ("use ISO8601 format yyyy-mm-ddThh:mm plus timezone, either" \ " \"Z\" or like \"+0500\"") ptr = str; /* we have to match at least yyyy-mm-ddThh:mm */ if (!(get_tok ("-", &ptr, &remaining, &year_ptr, &year_len) && get_tok ("-", &ptr, &remaining, &month_ptr, &month_len) && get_tok ("T", &ptr, &remaining, &day_ptr, &day_len) && get_tok (":", &ptr, &remaining, &hour_ptr, &hour_len) && get_tok (":+-Z", &ptr, &remaining, &min_ptr, &min_len))) { DEFAULT_DATE_PARSE_ERR; } /* if the minute has a ':' at the end look for seconds */ if (min_ptr[min_len] == ':') { if (remaining < 2) { DATE_PARSE_ERR ("reached end of date while looking for seconds"); } get_tok (".+-Z", &ptr, &remaining, &sec_ptr, &sec_len); if (!sec_len) { DATE_PARSE_ERR ("minute ends in \":\" seconds is required"); } } /* if we had a second and it is followed by a '.' look for milliseconds */ if (sec_len && sec_ptr[sec_len] == '.') { if (remaining < 2) { DATE_PARSE_ERR ("reached end of date while looking for milliseconds"); } get_tok ("+-Z", &ptr, &remaining, &millis_ptr, &millis_len); if (!millis_len) { DATE_PARSE_ERR ("seconds ends in \".\", milliseconds is required"); } } /* backtrack by 1 to put ptr on the timezone */ ptr--; remaining++; get_tok ("", &ptr, &remaining, &tz_ptr, &tz_len); if (!parse_num (year_ptr, year_len, 4, -9999, 9999, &year)) { DATE_PARSE_ERR ("year must be an integer"); } /* values are as in struct tm */ year -= 1900; if (!parse_num (month_ptr, month_len, 2, 1, 12, &month)) { DATE_PARSE_ERR ("month must be an integer"); } /* values are as in struct tm */ month -= 1; if (!parse_num (day_ptr, day_len, 2, 1, 31, &day)) { DATE_PARSE_ERR ("day must be an integer"); } if (!parse_num (hour_ptr, hour_len, 2, 0, 23, &hour)) { DATE_PARSE_ERR ("hour must be an integer"); } if (!parse_num (min_ptr, min_len, 2, 0, 59, &min)) { DATE_PARSE_ERR ("minute must be an integer"); } if (sec_len && !parse_num (sec_ptr, sec_len, 2, 0, 60, &sec)) { DATE_PARSE_ERR ("seconds must be an integer"); } if (tz_len > 0) { if (tz_ptr[0] == 'Z' && tz_len == 1) { /* valid */ } else if (tz_ptr[0] == '+' || tz_ptr[0] == '-') { int32_t tz_hour; int32_t tz_min; if (tz_len != 5 || !digits_only (tz_ptr + 1, 4)) { DATE_PARSE_ERR ("could not parse timezone"); } if (!parse_num (tz_ptr + 1, 2, -1, -23, 23, &tz_hour)) { DATE_PARSE_ERR ("timezone hour must be at most 23"); } if (!parse_num (tz_ptr + 3, 2, -1, 0, 59, &tz_min)) { DATE_PARSE_ERR ("timezone minute must be at most 59"); } /* we inflect the meaning of a 'positive' timezone. Those are hours * we have to subtract, and vice versa */ tz_adjustment = (tz_ptr[0] == '-' ? 1 : -1) * ((tz_min * 60) + (tz_hour * 60 * 60)); if (!(tz_adjustment > -86400 && tz_adjustment < 86400)) { DATE_PARSE_ERR ("timezone offset must be less than 24 hours"); } } else { DATE_PARSE_ERR ("timezone is required"); } } if (millis_len > 0) { int i; int magnitude; millis = 0; if (millis_len > 3 || !digits_only (millis_ptr, millis_len)) { DATE_PARSE_ERR ("milliseconds must be an integer"); } for (i = 1, magnitude = 1; i <= millis_len; i++, magnitude *= 10) { millis += (millis_ptr[millis_len - i] - '0') * magnitude; } if (millis_len == 1) { millis *= 100; } else if (millis_len == 2) { millis *= 10; } if (millis < 0 || millis > 1000) { DATE_PARSE_ERR ("milliseconds must be at least 0 and less than 1000"); } } posix_date.tm_sec = sec; posix_date.tm_min = min; posix_date.tm_hour = hour; posix_date.tm_mday = day; posix_date.tm_mon = month; posix_date.tm_year = year; posix_date.tm_wday = 0; posix_date.tm_yday = 0; millis = 1000 * _bson_timegm (&posix_date) + millis; millis += tz_adjustment * 1000; *out = millis; return true; } void _bson_iso8601_date_format (int64_t msec_since_epoch, bson_string_t *str) { time_t t; int64_t msecs_part; char buf[64]; msecs_part = msec_since_epoch % 1000; t = (time_t) (msec_since_epoch / 1000); #ifdef BSON_HAVE_GMTIME_R { struct tm posix_date; gmtime_r (&t, &posix_date); strftime (buf, sizeof buf, "%Y-%m-%dT%H:%M:%S", &posix_date); } #elif defined(_MSC_VER) { /* Windows gmtime_s is thread-safe */ struct tm time_buf; gmtime_s (&time_buf, &t); strftime (buf, sizeof buf, "%Y-%m-%dT%H:%M:%S", &time_buf); } #else strftime (buf, sizeof buf, "%Y-%m-%dT%H:%M:%S", gmtime (&t)); #endif if (msecs_part) { bson_string_append_printf (str, "%s.%03" PRId64 "Z", buf, msecs_part); } else { bson_string_append (str, buf); bson_string_append_c (str, 'Z'); } } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-iter.c000066400000000000000000001703601456567454500225010ustar00rootroot00000000000000/* * Copyright 2013-2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #define ITER_TYPE(i) ((bson_type_t) * ((i)->raw + (i)->type)) /* *-------------------------------------------------------------------------- * * bson_iter_init -- * * Initializes @iter to be used to iterate @bson. * * Returns: * true if bson_iter_t was initialized. otherwise false. * * Side effects: * @iter is initialized. * *-------------------------------------------------------------------------- */ bool bson_iter_init (bson_iter_t *iter, /* OUT */ const bson_t *bson) /* IN */ { BSON_ASSERT (iter); BSON_ASSERT (bson); if (BSON_UNLIKELY (bson->len < 5)) { memset (iter, 0, sizeof *iter); return false; } iter->raw = bson_get_data (bson); iter->len = bson->len; iter->off = 0; iter->type = 0; iter->key = 0; iter->d1 = 0; iter->d2 = 0; iter->d3 = 0; iter->d4 = 0; iter->next_off = 4; iter->err_off = 0; return true; } /* *-------------------------------------------------------------------------- * * bson_iter_init_from_data -- * * Initializes @iter to be used to iterate @data of length @length * * Returns: * true if bson_iter_t was initialized. otherwise false. * * Side effects: * @iter is initialized. * *-------------------------------------------------------------------------- */ bool bson_iter_init_from_data (bson_iter_t *iter, /* OUT */ const uint8_t *data, /* IN */ size_t length) /* IN */ { uint32_t len_le; BSON_ASSERT (iter); BSON_ASSERT (data); if (BSON_UNLIKELY ((length < 5) || (length > INT_MAX))) { memset (iter, 0, sizeof *iter); return false; } memcpy (&len_le, data, sizeof (len_le)); if (BSON_UNLIKELY ((size_t) BSON_UINT32_FROM_LE (len_le) != length)) { memset (iter, 0, sizeof *iter); return false; } if (BSON_UNLIKELY (data[length - 1])) { memset (iter, 0, sizeof *iter); return false; } if (BSON_UNLIKELY (!bson_in_range_unsigned (uint32_t, length))) { memset (iter, 0, sizeof *iter); return false; } iter->raw = (uint8_t *) data; iter->len = (uint32_t) length; iter->off = 0; iter->type = 0; iter->key = 0; iter->d1 = 0; iter->d2 = 0; iter->d3 = 0; iter->d4 = 0; iter->next_off = 4; iter->err_off = 0; return true; } /* *-------------------------------------------------------------------------- * * bson_iter_recurse -- * * Creates a new sub-iter looking at the document or array that @iter * is currently pointing at. * * Returns: * true if successful and @child was initialized. * * Side effects: * @child is initialized. * *-------------------------------------------------------------------------- */ bool bson_iter_recurse (const bson_iter_t *iter, /* IN */ bson_iter_t *child) /* OUT */ { const uint8_t *data = NULL; uint32_t len = 0; BSON_ASSERT (iter); BSON_ASSERT (child); if (ITER_TYPE (iter) == BSON_TYPE_DOCUMENT) { bson_iter_document (iter, &len, &data); } else if (ITER_TYPE (iter) == BSON_TYPE_ARRAY) { bson_iter_array (iter, &len, &data); } else { return false; } child->raw = data; child->len = len; child->off = 0; child->type = 0; child->key = 0; child->d1 = 0; child->d2 = 0; child->d3 = 0; child->d4 = 0; child->next_off = 4; child->err_off = 0; return true; } /* *-------------------------------------------------------------------------- * * bson_iter_init_find -- * * Initializes a #bson_iter_t and moves the iter to the first field * matching @key. * * Returns: * true if the field named @key was found; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_init_find (bson_iter_t *iter, /* INOUT */ const bson_t *bson, /* IN */ const char *key) /* IN */ { BSON_ASSERT (iter); BSON_ASSERT (bson); BSON_ASSERT (key); return bson_iter_init (iter, bson) && bson_iter_find (iter, key); } /* *-------------------------------------------------------------------------- * * bson_iter_init_find_w_len -- * * Initializes a #bson_iter_t and moves the iter to the first field * matching @key. * * Returns: * true if the field named @key was found; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_init_find_w_len (bson_iter_t *iter, /* INOUT */ const bson_t *bson, /* IN */ const char *key, /* IN */ int keylen) /* IN */ { BSON_ASSERT (iter); BSON_ASSERT (bson); BSON_ASSERT (key); return bson_iter_init (iter, bson) && bson_iter_find_w_len (iter, key, keylen); } /* *-------------------------------------------------------------------------- * * bson_iter_init_find_case -- * * A case-insensitive version of bson_iter_init_find(). * * Returns: * true if the field was found and @iter is observing that field. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_init_find_case (bson_iter_t *iter, /* INOUT */ const bson_t *bson, /* IN */ const char *key) /* IN */ { BSON_ASSERT (iter); BSON_ASSERT (bson); BSON_ASSERT (key); return bson_iter_init (iter, bson) && bson_iter_find_case (iter, key); } /* *-------------------------------------------------------------------------- * * bson_iter_find_w_len -- * * Searches through @iter starting from the current position for a key * matching @key. @keylen indicates the length of @key, or -1 to * determine the length with strlen(). * * Returns: * true if the field @key was found. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_find_w_len (bson_iter_t *iter, /* INOUT */ const char *key, /* IN */ int keylen) /* IN */ { const char *ikey; if (keylen < 0) { keylen = (int) strlen (key); } while (bson_iter_next (iter)) { ikey = bson_iter_key (iter); if ((0 == strncmp (key, ikey, keylen)) && (ikey[keylen] == '\0')) { return true; } } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_find -- * * Searches through @iter starting from the current position for a key * matching @key. This is a case-sensitive search meaning "KEY" and * "key" would NOT match. * * Returns: * true if @key is found. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_find (bson_iter_t *iter, /* INOUT */ const char *key) /* IN */ { BSON_ASSERT (iter); BSON_ASSERT (key); return bson_iter_find_w_len (iter, key, -1); } /* *-------------------------------------------------------------------------- * * bson_iter_find_case -- * * Searches through @iter starting from the current position for a key * matching @key. This is a case-insensitive search meaning "KEY" and * "key" would match. * * Returns: * true if @key is found. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_find_case (bson_iter_t *iter, /* INOUT */ const char *key) /* IN */ { BSON_ASSERT (iter); BSON_ASSERT (key); while (bson_iter_next (iter)) { if (!bson_strcasecmp (key, bson_iter_key (iter))) { return true; } } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_find_descendant -- * * Locates a descendant using the "parent.child.key" notation. This * operates similar to bson_iter_find() except that it can recurse * into children documents using the dot notation. * * Returns: * true if the descendant was found and @descendant was initialized. * * Side effects: * @descendant may be initialized. * *-------------------------------------------------------------------------- */ bool bson_iter_find_descendant (bson_iter_t *iter, /* INOUT */ const char *dotkey, /* IN */ bson_iter_t *descendant) /* OUT */ { bson_iter_t tmp; const char *dot; size_t sublen; BSON_ASSERT (iter); BSON_ASSERT (dotkey); BSON_ASSERT (descendant); if ((dot = strchr (dotkey, '.'))) { sublen = dot - dotkey; } else { sublen = strlen (dotkey); } if (bson_iter_find_w_len (iter, dotkey, (int) sublen)) { if (!dot) { *descendant = *iter; return true; } if (BSON_ITER_HOLDS_DOCUMENT (iter) || BSON_ITER_HOLDS_ARRAY (iter)) { if (bson_iter_recurse (iter, &tmp)) { return bson_iter_find_descendant (&tmp, dot + 1, descendant); } } } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_key -- * * Retrieves the key of the current field. The resulting key is valid * while @iter is valid. * * Returns: * A string that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * bson_iter_key (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); return bson_iter_key_unsafe (iter); } /* *-------------------------------------------------------------------------- * * bson_iter_type -- * * Retrieves the type of the current field. It may be useful to check * the type using the BSON_ITER_HOLDS_*() macros. * * Returns: * A bson_type_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_type_t bson_iter_type (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); BSON_ASSERT (iter->raw); BSON_ASSERT (iter->len); return bson_iter_type_unsafe (iter); } /* *-------------------------------------------------------------------------- * * _bson_iter_next_internal -- * * Internal function to advance @iter to the next field and retrieve * the key and BSON type before error-checking. @next_keylen is * the key length of the next field being iterated or 0 if this is * not known. * * Return: * true if an element was decoded, else false. * * Side effects: * @key and @bson_type are set. * * If the return value is false: * - @iter is invalidated: @iter->raw is NULLed * - @unsupported is set to true if the bson type is unsupported * - otherwise if the BSON is corrupt, @iter->err_off is nonzero * - otherwise @bson_type is set to BSON_TYPE_EOD * *-------------------------------------------------------------------------- */ static bool _bson_iter_next_internal (bson_iter_t *iter, /* INOUT */ uint32_t next_keylen, /* IN */ const char **key, /* OUT */ uint32_t *bson_type, /* OUT */ bool *unsupported) /* OUT */ { const uint8_t *data; uint32_t o; unsigned int len; BSON_ASSERT (iter); *unsupported = false; if (!iter->raw) { *key = NULL; *bson_type = BSON_TYPE_EOD; return false; } data = iter->raw; len = iter->len; iter->off = iter->next_off; iter->type = iter->off; iter->key = iter->off + 1; iter->d1 = 0; iter->d2 = 0; iter->d3 = 0; iter->d4 = 0; if (next_keylen == 0) { /* iterate from start to end of NULL-terminated key string */ for (o = iter->key; o < len; o++) { if (!data[o]) { iter->d1 = ++o; goto fill_data_fields; } } } else { o = iter->key + next_keylen + 1; iter->d1 = o; goto fill_data_fields; } goto mark_invalid; fill_data_fields: *key = bson_iter_key_unsafe (iter); *bson_type = ITER_TYPE (iter); switch (*bson_type) { case BSON_TYPE_DATE_TIME: case BSON_TYPE_DOUBLE: case BSON_TYPE_INT64: case BSON_TYPE_TIMESTAMP: iter->next_off = o + 8; break; case BSON_TYPE_CODE: case BSON_TYPE_SYMBOL: case BSON_TYPE_UTF8: { uint32_t l; if ((o + 4) >= len) { iter->err_off = o; goto mark_invalid; } iter->d2 = o + 4; memcpy (&l, iter->raw + iter->d1, sizeof (l)); l = BSON_UINT32_FROM_LE (l); if (l > (len - (o + 4))) { iter->err_off = o; goto mark_invalid; } iter->next_off = o + 4 + l; /* * Make sure the string length includes the NUL byte. */ if (BSON_UNLIKELY ((l == 0) || (iter->next_off >= len))) { iter->err_off = o; goto mark_invalid; } /* * Make sure the last byte is a NUL byte. */ if (BSON_UNLIKELY ((iter->raw + iter->d2)[l - 1] != '\0')) { iter->err_off = o + 4 + l - 1; goto mark_invalid; } } break; case BSON_TYPE_BINARY: { bson_subtype_t subtype; uint32_t l; if (o >= (len - 4)) { iter->err_off = o; goto mark_invalid; } iter->d2 = o + 4; iter->d3 = o + 5; memcpy (&l, iter->raw + iter->d1, sizeof (l)); l = BSON_UINT32_FROM_LE (l); if (l >= (len - o - 4)) { iter->err_off = o; goto mark_invalid; } subtype = *(iter->raw + iter->d2); if (subtype == BSON_SUBTYPE_BINARY_DEPRECATED) { int32_t binary_len; if (l < 4) { iter->err_off = o; goto mark_invalid; } /* subtype 2 has a redundant length header in the data */ memcpy (&binary_len, (iter->raw + iter->d3), sizeof (binary_len)); binary_len = BSON_UINT32_FROM_LE (binary_len); if (binary_len + 4 != l) { iter->err_off = iter->d3; goto mark_invalid; } } iter->next_off = o + 5 + l; } break; case BSON_TYPE_ARRAY: case BSON_TYPE_DOCUMENT: { uint32_t l; if (o >= (len - 4)) { iter->err_off = o; goto mark_invalid; } memcpy (&l, iter->raw + iter->d1, sizeof (l)); l = BSON_UINT32_FROM_LE (l); if ((l > len) || (l > (len - o))) { iter->err_off = o; goto mark_invalid; } iter->next_off = o + l; } break; case BSON_TYPE_OID: iter->next_off = o + 12; break; case BSON_TYPE_BOOL: { char val; if (iter->d1 >= len) { iter->err_off = o; goto mark_invalid; } memcpy (&val, iter->raw + iter->d1, 1); if (val != 0x00 && val != 0x01) { iter->err_off = o; goto mark_invalid; } iter->next_off = o + 1; } break; case BSON_TYPE_REGEX: { bool eor = false; bool eoo = false; for (; o < len; o++) { if (!data[o]) { iter->d2 = ++o; eor = true; break; } } if (!eor) { iter->err_off = iter->next_off; goto mark_invalid; } for (; o < len; o++) { if (!data[o]) { eoo = true; break; } } if (!eoo) { iter->err_off = iter->next_off; goto mark_invalid; } iter->next_off = o + 1; } break; case BSON_TYPE_DBPOINTER: { uint32_t l; if (o >= (len - 4)) { iter->err_off = o; goto mark_invalid; } iter->d2 = o + 4; memcpy (&l, iter->raw + iter->d1, sizeof (l)); l = BSON_UINT32_FROM_LE (l); /* Check valid string length. l counts '\0' but not 4 bytes for itself. */ if (l == 0 || l > (len - o - 4)) { iter->err_off = o; goto mark_invalid; } if (*(iter->raw + o + l + 3)) { /* not null terminated */ iter->err_off = o + l + 3; goto mark_invalid; } iter->d3 = o + 4 + l; iter->next_off = o + 4 + l + 12; } break; case BSON_TYPE_CODEWSCOPE: { uint32_t l; uint32_t doclen; if ((len < 19) || (o >= (len - 14))) { iter->err_off = o; goto mark_invalid; } iter->d2 = o + 4; iter->d3 = o + 8; memcpy (&l, iter->raw + iter->d1, sizeof (l)); l = BSON_UINT32_FROM_LE (l); if ((l < 14) || (l >= (len - o))) { iter->err_off = o; goto mark_invalid; } iter->next_off = o + l; if (iter->next_off >= len) { iter->err_off = o; goto mark_invalid; } memcpy (&l, iter->raw + iter->d2, sizeof (l)); l = BSON_UINT32_FROM_LE (l); if (l == 0 || l >= (len - o - 4 - 4)) { iter->err_off = o; goto mark_invalid; } if ((o + 4 + 4 + l + 4) >= iter->next_off) { iter->err_off = o + 4; goto mark_invalid; } iter->d4 = o + 4 + 4 + l; memcpy (&doclen, iter->raw + iter->d4, sizeof (doclen)); doclen = BSON_UINT32_FROM_LE (doclen); if ((o + 4 + 4 + l + doclen) != iter->next_off) { iter->err_off = o + 4 + 4 + l; goto mark_invalid; } } break; case BSON_TYPE_INT32: iter->next_off = o + 4; break; case BSON_TYPE_DECIMAL128: iter->next_off = o + 16; break; case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: case BSON_TYPE_NULL: case BSON_TYPE_UNDEFINED: iter->next_off = o; break; default: *unsupported = true; /* FALL THROUGH */ case BSON_TYPE_EOD: iter->err_off = o; goto mark_invalid; } /* * Check to see if any of the field locations would overflow the * current BSON buffer. If so, set the error location to the offset * of where the field starts. */ if (iter->next_off >= len) { iter->err_off = o; goto mark_invalid; } iter->err_off = 0; return true; mark_invalid: iter->raw = NULL; iter->len = 0; iter->next_off = 0; return false; } /* *-------------------------------------------------------------------------- * * bson_iter_next -- * * Advances @iter to the next field of the underlying BSON document. * If all fields have been exhausted, then %false is returned. * * It is a programming error to use @iter after this function has * returned false. * * Returns: * true if the iter was advanced to the next record. * otherwise false and @iter should be considered invalid. * * Side effects: * @iter may be invalidated. * *-------------------------------------------------------------------------- */ bool bson_iter_next (bson_iter_t *iter) /* INOUT */ { uint32_t bson_type; const char *key; bool unsupported; return _bson_iter_next_internal (iter, 0, &key, &bson_type, &unsupported); } /* *-------------------------------------------------------------------------- * * bson_iter_binary -- * * Retrieves the BSON_TYPE_BINARY field. The subtype is stored in * @subtype. The length of @binary in bytes is stored in @binary_len. * * @binary should not be modified or freed and is only valid while * @iter's bson_t is valid and unmodified. * * Parameters: * @iter: A bson_iter_t * @subtype: A location for the binary subtype. * @binary_len: A location for the length of @binary. * @binary: A location for a pointer to the binary data. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_binary (const bson_iter_t *iter, /* IN */ bson_subtype_t *subtype, /* OUT */ uint32_t *binary_len, /* OUT */ const uint8_t **binary) /* OUT */ { bson_subtype_t backup; BSON_ASSERT (iter); BSON_ASSERT (!binary || binary_len); if (ITER_TYPE (iter) == BSON_TYPE_BINARY) { if (!subtype) { subtype = &backup; } *subtype = (bson_subtype_t) * (iter->raw + iter->d2); if (binary) { memcpy (binary_len, (iter->raw + iter->d1), sizeof (*binary_len)); *binary_len = BSON_UINT32_FROM_LE (*binary_len); *binary = iter->raw + iter->d3; if (*subtype == BSON_SUBTYPE_BINARY_DEPRECATED) { *binary_len -= sizeof (int32_t); *binary += sizeof (int32_t); } } return; } if (binary) { *binary = NULL; } if (binary_len) { *binary_len = 0; } if (subtype) { *subtype = BSON_SUBTYPE_BINARY; } } /* *-------------------------------------------------------------------------- * * bson_iter_bool -- * * Retrieves the current field of type BSON_TYPE_BOOL. * * Returns: * true or false, dependent on bson document. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_bool (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_BOOL) { return bson_iter_bool_unsafe (iter); } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_as_bool -- * * If @iter is on a boolean field, returns the boolean. If it is on a * non-boolean field such as int32, int64, or double, it will convert * the value to a boolean. * * Zero is false, and non-zero is true. * * Returns: * true or false, dependent on field type. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_as_bool (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); switch ((int) ITER_TYPE (iter)) { case BSON_TYPE_BOOL: return bson_iter_bool (iter); case BSON_TYPE_DOUBLE: return !(bson_iter_double (iter) == 0.0); case BSON_TYPE_INT64: return !(bson_iter_int64 (iter) == 0); case BSON_TYPE_INT32: return !(bson_iter_int32 (iter) == 0); case BSON_TYPE_UTF8: return true; case BSON_TYPE_NULL: case BSON_TYPE_UNDEFINED: return false; default: return true; } } /* *-------------------------------------------------------------------------- * * bson_iter_double -- * * Retrieves the current field of type BSON_TYPE_DOUBLE. * * Returns: * A double. * * Side effects: * None. * *-------------------------------------------------------------------------- */ double bson_iter_double (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_DOUBLE) { return bson_iter_double_unsafe (iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_as_double -- * * If @iter is on a field of type BSON_TYPE_DOUBLE, * returns the double. If it is on an integer field * such as int32, int64, or bool, it will convert * the value to a double. * * * Returns: * A double. * * Side effects: * None. * *-------------------------------------------------------------------------- */ double bson_iter_as_double (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); switch ((int) ITER_TYPE (iter)) { case BSON_TYPE_BOOL: return (double) bson_iter_bool (iter); case BSON_TYPE_DOUBLE: return bson_iter_double (iter); case BSON_TYPE_INT32: return (double) bson_iter_int32 (iter); case BSON_TYPE_INT64: return (double) bson_iter_int64 (iter); default: return 0; } } /* *-------------------------------------------------------------------------- * * bson_iter_int32 -- * * Retrieves the value of the field of type BSON_TYPE_INT32. * * Returns: * A 32-bit signed integer. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int32_t bson_iter_int32 (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_INT32) { return bson_iter_int32_unsafe (iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_int64 -- * * Retrieves a 64-bit signed integer for the current BSON_TYPE_INT64 * field. * * Returns: * A 64-bit signed integer. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int64_t bson_iter_int64 (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_INT64) { return bson_iter_int64_unsafe (iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_as_int64 -- * * If @iter is not an int64 field, it will try to convert the value to * an int64. Such field types include: * * - bool * - double * - int32 * * Returns: * An int64_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int64_t bson_iter_as_int64 (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); switch ((int) ITER_TYPE (iter)) { case BSON_TYPE_BOOL: return (int64_t) bson_iter_bool (iter); case BSON_TYPE_DOUBLE: return (int64_t) bson_iter_double (iter); case BSON_TYPE_INT64: return bson_iter_int64 (iter); case BSON_TYPE_INT32: return (int64_t) bson_iter_int32 (iter); default: return 0; } } /* *-------------------------------------------------------------------------- * * bson_iter_decimal128 -- * * This function retrieves the current field of type *%BSON_TYPE_DECIMAL128. * The result is valid while @iter is valid, and is stored in @dec. * * Returns: * * True on success, false on failure. * * Side Effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_decimal128 (const bson_iter_t *iter, /* IN */ bson_decimal128_t *dec) /* OUT */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_DECIMAL128) { bson_iter_decimal128_unsafe (iter, dec); return true; } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_oid -- * * Retrieves the current field of type %BSON_TYPE_OID. The result is * valid while @iter is valid. * * Returns: * A bson_oid_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const bson_oid_t * bson_iter_oid (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_OID) { return bson_iter_oid_unsafe (iter); } return NULL; } /* *-------------------------------------------------------------------------- * * bson_iter_regex -- * * Fetches the current field from the iter which should be of type * BSON_TYPE_REGEX. * * Returns: * Regex from @iter. This should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * bson_iter_regex (const bson_iter_t *iter, /* IN */ const char **options) /* IN */ { const char *ret = NULL; const char *ret_options = NULL; BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_REGEX) { ret = (const char *) (iter->raw + iter->d1); ret_options = (const char *) (iter->raw + iter->d2); } if (options) { *options = ret_options; } return ret; } /* *-------------------------------------------------------------------------- * * bson_iter_utf8 -- * * Retrieves the current field of type %BSON_TYPE_UTF8 as a UTF-8 * encoded string. * * Parameters: * @iter: A bson_iter_t. * @length: A location for the length of the string. * * Returns: * A string that should not be modified or freed. * * Side effects: * @length will be set to the result strings length if non-NULL. * *-------------------------------------------------------------------------- */ const char * bson_iter_utf8 (const bson_iter_t *iter, /* IN */ uint32_t *length) /* OUT */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_UTF8) { if (length) { *length = bson_iter_utf8_len_unsafe (iter); } return (const char *) (iter->raw + iter->d2); } if (length) { *length = 0; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_iter_dup_utf8 -- * * Copies the current UTF-8 element into a newly allocated string. The * string should be freed using bson_free() when the caller is * finished with it. * * Returns: * A newly allocated char* that should be freed with bson_free(). * * Side effects: * @length will be set to the result strings length if non-NULL. * *-------------------------------------------------------------------------- */ char * bson_iter_dup_utf8 (const bson_iter_t *iter, /* IN */ uint32_t *length) /* OUT */ { uint32_t local_length = 0; const char *str; char *ret = NULL; BSON_ASSERT (iter); if ((str = bson_iter_utf8 (iter, &local_length))) { ret = bson_malloc0 (local_length + 1); memcpy (ret, str, local_length); ret[local_length] = '\0'; } if (length) { *length = local_length; } return ret; } /* *-------------------------------------------------------------------------- * * bson_iter_code -- * * Retrieves the current field of type %BSON_TYPE_CODE. The length of * the resulting string is stored in @length. * * Parameters: * @iter: A bson_iter_t. * @length: A location for the code length. * * Returns: * A NUL-terminated string containing the code which should not be * modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * bson_iter_code (const bson_iter_t *iter, /* IN */ uint32_t *length) /* OUT */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_CODE) { if (length) { *length = bson_iter_utf8_len_unsafe (iter); } return (const char *) (iter->raw + iter->d2); } if (length) { *length = 0; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_iter_codewscope -- * * Similar to bson_iter_code() but with a scope associated encoded as * a BSON document. @scope should not be modified or freed. It is * valid while @iter is valid. * * Parameters: * @iter: A #bson_iter_t. * @length: A location for the length of resulting string. * @scope_len: A location for the length of @scope. * @scope: A location for the scope encoded as BSON. * * Returns: * A NUL-terminated string that should not be modified or freed. * * Side effects: * @length is set to the resulting string length in bytes. * @scope_len is set to the length of @scope in bytes. * @scope is set to the scope documents buffer which can be * turned into a bson document with bson_init_static(). * *-------------------------------------------------------------------------- */ const char * bson_iter_codewscope (const bson_iter_t *iter, /* IN */ uint32_t *length, /* OUT */ uint32_t *scope_len, /* OUT */ const uint8_t **scope) /* OUT */ { uint32_t len; BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_CODEWSCOPE) { if (length) { memcpy (&len, iter->raw + iter->d2, sizeof (len)); /* The string length was checked > 0 in _bson_iter_next_internal. */ len = BSON_UINT32_FROM_LE (len); BSON_ASSERT (len > 0); *length = len - 1; } memcpy (&len, iter->raw + iter->d4, sizeof (len)); *scope_len = BSON_UINT32_FROM_LE (len); *scope = iter->raw + iter->d4; return (const char *) (iter->raw + iter->d3); } if (length) { *length = 0; } if (scope_len) { *scope_len = 0; } if (scope) { *scope = NULL; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_iter_dbpointer -- * * Retrieves a BSON_TYPE_DBPOINTER field. @collection_len will be set * to the length of the collection name. The collection name will be * placed into @collection. The oid will be placed into @oid. * * @collection and @oid should not be modified. * * Parameters: * @iter: A #bson_iter_t. * @collection_len: A location for the length of @collection. * @collection: A location for the collection name. * @oid: A location for the oid. * * Returns: * None. * * Side effects: * @collection_len is set to the length of @collection in bytes * excluding the null byte. * @collection is set to the collection name, including a terminating * null byte. * @oid is initialized with the oid. * *-------------------------------------------------------------------------- */ void bson_iter_dbpointer (const bson_iter_t *iter, /* IN */ uint32_t *collection_len, /* OUT */ const char **collection, /* OUT */ const bson_oid_t **oid) /* OUT */ { BSON_ASSERT (iter); if (collection) { *collection = NULL; } if (oid) { *oid = NULL; } if (ITER_TYPE (iter) == BSON_TYPE_DBPOINTER) { if (collection_len) { memcpy ( collection_len, (iter->raw + iter->d1), sizeof (*collection_len)); *collection_len = BSON_UINT32_FROM_LE (*collection_len); if ((*collection_len) > 0) { (*collection_len)--; } } if (collection) { *collection = (const char *) (iter->raw + iter->d2); } if (oid) { *oid = (const bson_oid_t *) (iter->raw + iter->d3); } } } /* *-------------------------------------------------------------------------- * * bson_iter_symbol -- * * Retrieves the symbol of the current field of type BSON_TYPE_SYMBOL. * * Parameters: * @iter: A bson_iter_t. * @length: A location for the length of the symbol. * * Returns: * A string containing the symbol as UTF-8. The value should not be * modified or freed. * * Side effects: * @length is set to the resulting strings length in bytes, * excluding the null byte. * *-------------------------------------------------------------------------- */ const char * bson_iter_symbol (const bson_iter_t *iter, /* IN */ uint32_t *length) /* OUT */ { const char *ret = NULL; uint32_t ret_length = 0; BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_SYMBOL) { ret = (const char *) (iter->raw + iter->d2); ret_length = bson_iter_utf8_len_unsafe (iter); } if (length) { *length = ret_length; } return ret; } /* *-------------------------------------------------------------------------- * * bson_iter_date_time -- * * Fetches the number of milliseconds elapsed since the UNIX epoch. * This value can be negative as times before 1970 are valid. * * Returns: * A signed 64-bit integer containing the number of milliseconds. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int64_t bson_iter_date_time (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_DATE_TIME) { return bson_iter_int64_unsafe (iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_time_t -- * * Retrieves the current field of type BSON_TYPE_DATE_TIME as a * time_t. * * Returns: * A #time_t of the number of seconds since UNIX epoch in UTC. * * Side effects: * None. * *-------------------------------------------------------------------------- */ time_t bson_iter_time_t (const bson_iter_t *iter) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_DATE_TIME) { return bson_iter_time_t_unsafe (iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_timestamp -- * * Fetches the current field if it is a BSON_TYPE_TIMESTAMP. * * Parameters: * @iter: A #bson_iter_t. * @timestamp: a location for the timestamp. * @increment: A location for the increment. * * Returns: * None. * * Side effects: * @timestamp is initialized. * @increment is initialized. * *-------------------------------------------------------------------------- */ void bson_iter_timestamp (const bson_iter_t *iter, /* IN */ uint32_t *timestamp, /* OUT */ uint32_t *increment) /* OUT */ { uint64_t encoded; uint32_t ret_timestamp = 0; uint32_t ret_increment = 0; BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_TIMESTAMP) { memcpy (&encoded, iter->raw + iter->d1, sizeof (encoded)); encoded = BSON_UINT64_FROM_LE (encoded); ret_timestamp = (encoded >> 32) & 0xFFFFFFFF; ret_increment = encoded & 0xFFFFFFFF; } if (timestamp) { *timestamp = ret_timestamp; } if (increment) { *increment = ret_increment; } } /* *-------------------------------------------------------------------------- * * bson_iter_timeval -- * * Retrieves the current field of type BSON_TYPE_DATE_TIME and stores * it into the struct timeval provided. tv->tv_sec is set to the * number of seconds since the UNIX epoch in UTC. * * Since BSON_TYPE_DATE_TIME does not support fractions of a second, * tv->tv_usec will always be set to zero. * * Returns: * None. * * Side effects: * @tv is initialized. * *-------------------------------------------------------------------------- */ void bson_iter_timeval (const bson_iter_t *iter, /* IN */ struct timeval *tv) /* OUT */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_DATE_TIME) { bson_iter_timeval_unsafe (iter, tv); return; } memset (tv, 0, sizeof *tv); } /** * bson_iter_document: * @iter: a bson_iter_t. * @document_len: A location for the document length. * @document: A location for a pointer to the document buffer. * */ /* *-------------------------------------------------------------------------- * * bson_iter_document -- * * Retrieves the data to the document BSON structure and stores the * length of the document buffer in @document_len and the document * buffer in @document. * * If you would like to iterate over the child contents, you might * consider creating a bson_t on the stack such as the following. It * allows you to call functions taking a const bson_t* only. * * bson_t b; * uint32_t len; * const uint8_t *data; * * bson_iter_document(iter, &len, &data); * * if (bson_init_static (&b, data, len)) { * ... * } * * There is no need to cleanup the bson_t structure as no data can be * modified in the process of its use (as it is static/const). * * Returns: * None. * * Side effects: * @document_len is initialized. * @document is initialized. * *-------------------------------------------------------------------------- */ void bson_iter_document (const bson_iter_t *iter, /* IN */ uint32_t *document_len, /* OUT */ const uint8_t **document) /* OUT */ { BSON_ASSERT (iter); BSON_ASSERT (document_len); BSON_ASSERT (document); *document = NULL; *document_len = 0; if (ITER_TYPE (iter) == BSON_TYPE_DOCUMENT) { memcpy (document_len, (iter->raw + iter->d1), sizeof (*document_len)); *document_len = BSON_UINT32_FROM_LE (*document_len); *document = (iter->raw + iter->d1); } } /** * bson_iter_array: * @iter: a #bson_iter_t. * @array_len: A location for the array length. * @array: A location for a pointer to the array buffer. */ /* *-------------------------------------------------------------------------- * * bson_iter_array -- * * Retrieves the data to the array BSON structure and stores the * length of the array buffer in @array_len and the array buffer in * @array. * * If you would like to iterate over the child contents, you might * consider creating a bson_t on the stack such as the following. It * allows you to call functions taking a const bson_t* only. * * bson_t b; * uint32_t len; * const uint8_t *data; * * bson_iter_array (iter, &len, &data); * * if (bson_init_static (&b, data, len)) { * ... * } * * There is no need to cleanup the #bson_t structure as no data can be * modified in the process of its use. * * Returns: * None. * * Side effects: * @array_len is initialized. * @array is initialized. * *-------------------------------------------------------------------------- */ void bson_iter_array (const bson_iter_t *iter, /* IN */ uint32_t *array_len, /* OUT */ const uint8_t **array) /* OUT */ { BSON_ASSERT (iter); BSON_ASSERT (array_len); BSON_ASSERT (array); *array = NULL; *array_len = 0; if (ITER_TYPE (iter) == BSON_TYPE_ARRAY) { memcpy (array_len, (iter->raw + iter->d1), sizeof (*array_len)); *array_len = BSON_UINT32_FROM_LE (*array_len); *array = (iter->raw + iter->d1); } } #define VISIT_FIELD(name) visitor->visit_##name && visitor->visit_##name #define VISIT_AFTER VISIT_FIELD (after) #define VISIT_BEFORE VISIT_FIELD (before) #define VISIT_CORRUPT \ if (visitor->visit_corrupt) \ visitor->visit_corrupt #define VISIT_DOUBLE VISIT_FIELD (double) #define VISIT_UTF8 VISIT_FIELD (utf8) #define VISIT_DOCUMENT VISIT_FIELD (document) #define VISIT_ARRAY VISIT_FIELD (array) #define VISIT_BINARY VISIT_FIELD (binary) #define VISIT_UNDEFINED VISIT_FIELD (undefined) #define VISIT_OID VISIT_FIELD (oid) #define VISIT_BOOL VISIT_FIELD (bool) #define VISIT_DATE_TIME VISIT_FIELD (date_time) #define VISIT_NULL VISIT_FIELD (null) #define VISIT_REGEX VISIT_FIELD (regex) #define VISIT_DBPOINTER VISIT_FIELD (dbpointer) #define VISIT_CODE VISIT_FIELD (code) #define VISIT_SYMBOL VISIT_FIELD (symbol) #define VISIT_CODEWSCOPE VISIT_FIELD (codewscope) #define VISIT_INT32 VISIT_FIELD (int32) #define VISIT_TIMESTAMP VISIT_FIELD (timestamp) #define VISIT_INT64 VISIT_FIELD (int64) #define VISIT_DECIMAL128 VISIT_FIELD (decimal128) #define VISIT_MAXKEY VISIT_FIELD (maxkey) #define VISIT_MINKEY VISIT_FIELD (minkey) bool bson_iter_visit_all (bson_iter_t *iter, /* INOUT */ const bson_visitor_t *visitor, /* IN */ void *data) /* IN */ { uint32_t bson_type = 0; const char *key = NULL; bool unsupported; BSON_ASSERT (iter); BSON_ASSERT (visitor); while (_bson_iter_next_internal (iter, 0, &key, &bson_type, &unsupported)) { if (*key && !bson_utf8_validate (key, strlen (key), false)) { iter->err_off = iter->off; break; } if (VISIT_BEFORE (iter, key, data)) { return true; } switch (bson_type) { case BSON_TYPE_DOUBLE: if (VISIT_DOUBLE (iter, key, bson_iter_double (iter), data)) { return true; } break; case BSON_TYPE_UTF8: { uint32_t utf8_len; const char *utf8; utf8 = bson_iter_utf8 (iter, &utf8_len); if (!bson_utf8_validate (utf8, utf8_len, true)) { iter->err_off = iter->off; return true; } if (VISIT_UTF8 (iter, key, utf8_len, utf8, data)) { return true; } } break; case BSON_TYPE_DOCUMENT: { const uint8_t *docbuf = NULL; uint32_t doclen = 0; bson_t b; bson_iter_document (iter, &doclen, &docbuf); if (bson_init_static (&b, docbuf, doclen) && VISIT_DOCUMENT (iter, key, &b, data)) { return true; } } break; case BSON_TYPE_ARRAY: { const uint8_t *docbuf = NULL; uint32_t doclen = 0; bson_t b; bson_iter_array (iter, &doclen, &docbuf); if (bson_init_static (&b, docbuf, doclen) && VISIT_ARRAY (iter, key, &b, data)) { return true; } } break; case BSON_TYPE_BINARY: { const uint8_t *binary = NULL; bson_subtype_t subtype = BSON_SUBTYPE_BINARY; uint32_t binary_len = 0; bson_iter_binary (iter, &subtype, &binary_len, &binary); if (VISIT_BINARY (iter, key, subtype, binary_len, binary, data)) { return true; } } break; case BSON_TYPE_UNDEFINED: if (VISIT_UNDEFINED (iter, key, data)) { return true; } break; case BSON_TYPE_OID: if (VISIT_OID (iter, key, bson_iter_oid (iter), data)) { return true; } break; case BSON_TYPE_BOOL: if (VISIT_BOOL (iter, key, bson_iter_bool (iter), data)) { return true; } break; case BSON_TYPE_DATE_TIME: if (VISIT_DATE_TIME (iter, key, bson_iter_date_time (iter), data)) { return true; } break; case BSON_TYPE_NULL: if (VISIT_NULL (iter, key, data)) { return true; } break; case BSON_TYPE_REGEX: { const char *regex = NULL; const char *options = NULL; regex = bson_iter_regex (iter, &options); if (!bson_utf8_validate (regex, strlen (regex), true)) { iter->err_off = iter->off; return true; } if (VISIT_REGEX (iter, key, regex, options, data)) { return true; } } break; case BSON_TYPE_DBPOINTER: { uint32_t collection_len = 0; const char *collection = NULL; const bson_oid_t *oid = NULL; bson_iter_dbpointer (iter, &collection_len, &collection, &oid); if (!bson_utf8_validate (collection, collection_len, true)) { iter->err_off = iter->off; return true; } if (VISIT_DBPOINTER ( iter, key, collection_len, collection, oid, data)) { return true; } } break; case BSON_TYPE_CODE: { uint32_t code_len; const char *code; code = bson_iter_code (iter, &code_len); if (!bson_utf8_validate (code, code_len, true)) { iter->err_off = iter->off; return true; } if (VISIT_CODE (iter, key, code_len, code, data)) { return true; } } break; case BSON_TYPE_SYMBOL: { uint32_t symbol_len; const char *symbol; symbol = bson_iter_symbol (iter, &symbol_len); if (!bson_utf8_validate (symbol, symbol_len, true)) { iter->err_off = iter->off; return true; } if (VISIT_SYMBOL (iter, key, symbol_len, symbol, data)) { return true; } } break; case BSON_TYPE_CODEWSCOPE: { uint32_t length = 0; const char *code; const uint8_t *docbuf = NULL; uint32_t doclen = 0; bson_t b; code = bson_iter_codewscope (iter, &length, &doclen, &docbuf); if (!bson_utf8_validate (code, length, true)) { iter->err_off = iter->off; return true; } if (bson_init_static (&b, docbuf, doclen) && VISIT_CODEWSCOPE (iter, key, length, code, &b, data)) { return true; } } break; case BSON_TYPE_INT32: if (VISIT_INT32 (iter, key, bson_iter_int32 (iter), data)) { return true; } break; case BSON_TYPE_TIMESTAMP: { uint32_t timestamp; uint32_t increment; bson_iter_timestamp (iter, ×tamp, &increment); if (VISIT_TIMESTAMP (iter, key, timestamp, increment, data)) { return true; } } break; case BSON_TYPE_INT64: if (VISIT_INT64 (iter, key, bson_iter_int64 (iter), data)) { return true; } break; case BSON_TYPE_DECIMAL128: { bson_decimal128_t dec; bson_iter_decimal128 (iter, &dec); if (VISIT_DECIMAL128 (iter, key, &dec, data)) { return true; } } break; case BSON_TYPE_MAXKEY: if (VISIT_MAXKEY (iter, bson_iter_key_unsafe (iter), data)) { return true; } break; case BSON_TYPE_MINKEY: if (VISIT_MINKEY (iter, bson_iter_key_unsafe (iter), data)) { return true; } break; case BSON_TYPE_EOD: default: break; } if (VISIT_AFTER (iter, bson_iter_key_unsafe (iter), data)) { return true; } } if (iter->err_off) { if (unsupported && visitor->visit_unsupported_type && bson_utf8_validate (key, strlen (key), false)) { visitor->visit_unsupported_type (iter, key, bson_type, data); return false; } VISIT_CORRUPT (iter, data); } #undef VISIT_FIELD return false; } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_bool -- * * Overwrites the current BSON_TYPE_BOOLEAN field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_bool (bson_iter_t *iter, /* IN */ bool value) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_BOOL) { memcpy ((void *) (iter->raw + iter->d1), &value, 1); } } void bson_iter_overwrite_oid (bson_iter_t *iter, const bson_oid_t *value) { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_OID) { memcpy ( (void *) (iter->raw + iter->d1), value->bytes, sizeof (value->bytes)); } } void bson_iter_overwrite_timestamp (bson_iter_t *iter, uint32_t timestamp, uint32_t increment) { uint64_t value; BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_TIMESTAMP) { value = ((((uint64_t) timestamp) << 32U) | ((uint64_t) increment)); value = BSON_UINT64_TO_LE (value); memcpy ((void *) (iter->raw + iter->d1), &value, sizeof (value)); } } void bson_iter_overwrite_date_time (bson_iter_t *iter, int64_t value) { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_DATE_TIME) { value = BSON_UINT64_TO_LE (value); memcpy ((void *) (iter->raw + iter->d1), &value, sizeof (value)); } } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_int32 -- * * Overwrites the current BSON_TYPE_INT32 field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_int32 (bson_iter_t *iter, /* IN */ int32_t value) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_INT32) { #if BSON_BYTE_ORDER != BSON_LITTLE_ENDIAN value = BSON_UINT32_TO_LE (value); #endif memcpy ((void *) (iter->raw + iter->d1), &value, sizeof (value)); } } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_int64 -- * * Overwrites the current BSON_TYPE_INT64 field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_int64 (bson_iter_t *iter, /* IN */ int64_t value) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_INT64) { #if BSON_BYTE_ORDER != BSON_LITTLE_ENDIAN value = BSON_UINT64_TO_LE (value); #endif memcpy ((void *) (iter->raw + iter->d1), &value, sizeof (value)); } } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_double -- * * Overwrites the current BSON_TYPE_DOUBLE field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_double (bson_iter_t *iter, /* IN */ double value) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_DOUBLE) { value = BSON_DOUBLE_TO_LE (value); memcpy ((void *) (iter->raw + iter->d1), &value, sizeof (value)); } } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_decimal128 -- * * Overwrites the current BSON_TYPE_DECIMAL128 field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_decimal128 (bson_iter_t *iter, /* IN */ const bson_decimal128_t *value) /* IN */ { BSON_ASSERT (iter); if (ITER_TYPE (iter) == BSON_TYPE_DECIMAL128) { #if BSON_BYTE_ORDER != BSON_LITTLE_ENDIAN uint64_t data[2]; data[0] = BSON_UINT64_TO_LE (value->low); data[1] = BSON_UINT64_TO_LE (value->high); memcpy ((void *) (iter->raw + iter->d1), data, sizeof (data)); #else memcpy ((void *) (iter->raw + iter->d1), value, sizeof (*value)); #endif } } /* *-------------------------------------------------------------------------- * * bson_iter_value -- * * Retrieves a bson_value_t containing the boxed value of the current * element. The result of this function valid until the state of * iter has been changed (through the use of bson_iter_next()). * * Returns: * A bson_value_t that should not be modified or freed. If you need * to hold on to the value, use bson_value_copy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ const bson_value_t * bson_iter_value (bson_iter_t *iter) /* IN */ { bson_value_t *value; BSON_ASSERT (iter); value = &iter->value; value->value_type = ITER_TYPE (iter); switch (value->value_type) { case BSON_TYPE_DOUBLE: value->value.v_double = bson_iter_double (iter); break; case BSON_TYPE_UTF8: value->value.v_utf8.str = (char *) bson_iter_utf8 (iter, &value->value.v_utf8.len); break; case BSON_TYPE_DOCUMENT: bson_iter_document (iter, &value->value.v_doc.data_len, (const uint8_t **) &value->value.v_doc.data); break; case BSON_TYPE_ARRAY: bson_iter_array (iter, &value->value.v_doc.data_len, (const uint8_t **) &value->value.v_doc.data); break; case BSON_TYPE_BINARY: bson_iter_binary (iter, &value->value.v_binary.subtype, &value->value.v_binary.data_len, (const uint8_t **) &value->value.v_binary.data); break; case BSON_TYPE_OID: bson_oid_copy (bson_iter_oid (iter), &value->value.v_oid); break; case BSON_TYPE_BOOL: value->value.v_bool = bson_iter_bool (iter); break; case BSON_TYPE_DATE_TIME: value->value.v_datetime = bson_iter_date_time (iter); break; case BSON_TYPE_REGEX: value->value.v_regex.regex = (char *) bson_iter_regex ( iter, (const char **) &value->value.v_regex.options); break; case BSON_TYPE_DBPOINTER: { const bson_oid_t *oid; bson_iter_dbpointer (iter, &value->value.v_dbpointer.collection_len, (const char **) &value->value.v_dbpointer.collection, &oid); bson_oid_copy (oid, &value->value.v_dbpointer.oid); break; } case BSON_TYPE_CODE: value->value.v_code.code = (char *) bson_iter_code (iter, &value->value.v_code.code_len); break; case BSON_TYPE_SYMBOL: value->value.v_symbol.symbol = (char *) bson_iter_symbol (iter, &value->value.v_symbol.len); break; case BSON_TYPE_CODEWSCOPE: value->value.v_codewscope.code = (char *) bson_iter_codewscope ( iter, &value->value.v_codewscope.code_len, &value->value.v_codewscope.scope_len, (const uint8_t **) &value->value.v_codewscope.scope_data); break; case BSON_TYPE_INT32: value->value.v_int32 = bson_iter_int32 (iter); break; case BSON_TYPE_TIMESTAMP: bson_iter_timestamp (iter, &value->value.v_timestamp.timestamp, &value->value.v_timestamp.increment); break; case BSON_TYPE_INT64: value->value.v_int64 = bson_iter_int64 (iter); break; case BSON_TYPE_DECIMAL128: bson_iter_decimal128 (iter, &(value->value.v_decimal128)); break; case BSON_TYPE_NULL: case BSON_TYPE_UNDEFINED: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: break; case BSON_TYPE_EOD: default: return NULL; } return value; } uint32_t bson_iter_key_len (const bson_iter_t *iter) { /* * f i e l d n a m e \0 _ * ^ ^ * | | * iter->key iter->d1 * */ BSON_ASSERT (iter->d1 > iter->key); return iter->d1 - iter->key - 1; } bool bson_iter_init_from_data_at_offset (bson_iter_t *iter, const uint8_t *data, size_t length, uint32_t offset, uint32_t keylen) { const char *key; uint32_t bson_type; bool unsupported; BSON_ASSERT (iter); BSON_ASSERT (data); if (BSON_UNLIKELY ((length < 5) || (length > INT_MAX))) { memset (iter, 0, sizeof *iter); return false; } iter->raw = (uint8_t *) data; iter->len = (uint32_t) length; iter->off = 0; iter->type = 0; iter->key = 0; iter->next_off = offset; iter->err_off = 0; if (!_bson_iter_next_internal ( iter, keylen, &key, &bson_type, &unsupported)) { memset (iter, 0, sizeof *iter); return false; } return true; } uint32_t bson_iter_offset (bson_iter_t *iter) { return iter->off; } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-iter.h000066400000000000000000000323511456567454500225030ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_ITER_H #define BSON_ITER_H #include "bson.h" #include #include #include BSON_BEGIN_DECLS #define BSON_ITER_HOLDS_DOUBLE(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DOUBLE) #define BSON_ITER_HOLDS_UTF8(iter) (bson_iter_type ((iter)) == BSON_TYPE_UTF8) #define BSON_ITER_HOLDS_DOCUMENT(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DOCUMENT) #define BSON_ITER_HOLDS_ARRAY(iter) (bson_iter_type ((iter)) == BSON_TYPE_ARRAY) #define BSON_ITER_HOLDS_BINARY(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_BINARY) #define BSON_ITER_HOLDS_UNDEFINED(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_UNDEFINED) #define BSON_ITER_HOLDS_OID(iter) (bson_iter_type ((iter)) == BSON_TYPE_OID) #define BSON_ITER_HOLDS_BOOL(iter) (bson_iter_type ((iter)) == BSON_TYPE_BOOL) #define BSON_ITER_HOLDS_DATE_TIME(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DATE_TIME) #define BSON_ITER_HOLDS_NULL(iter) (bson_iter_type ((iter)) == BSON_TYPE_NULL) #define BSON_ITER_HOLDS_REGEX(iter) (bson_iter_type ((iter)) == BSON_TYPE_REGEX) #define BSON_ITER_HOLDS_DBPOINTER(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DBPOINTER) #define BSON_ITER_HOLDS_CODE(iter) (bson_iter_type ((iter)) == BSON_TYPE_CODE) #define BSON_ITER_HOLDS_SYMBOL(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_SYMBOL) #define BSON_ITER_HOLDS_CODEWSCOPE(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_CODEWSCOPE) #define BSON_ITER_HOLDS_INT32(iter) (bson_iter_type ((iter)) == BSON_TYPE_INT32) #define BSON_ITER_HOLDS_TIMESTAMP(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_TIMESTAMP) #define BSON_ITER_HOLDS_INT64(iter) (bson_iter_type ((iter)) == BSON_TYPE_INT64) #define BSON_ITER_HOLDS_DECIMAL128(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DECIMAL128) #define BSON_ITER_HOLDS_MAXKEY(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_MAXKEY) #define BSON_ITER_HOLDS_MINKEY(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_MINKEY) #define BSON_ITER_HOLDS_INT(iter) \ (BSON_ITER_HOLDS_INT32 (iter) || BSON_ITER_HOLDS_INT64 (iter)) #define BSON_ITER_HOLDS_NUMBER(iter) \ (BSON_ITER_HOLDS_INT (iter) || BSON_ITER_HOLDS_DOUBLE (iter)) #define BSON_ITER_IS_KEY(iter, key) \ (0 == strcmp ((key), bson_iter_key ((iter)))) BSON_EXPORT (const bson_value_t *) bson_iter_value (bson_iter_t *iter); /** * bson_iter_utf8_len_unsafe: * @iter: a bson_iter_t. * * Returns the length of a string currently pointed to by @iter. This performs * no validation so the is responsible for knowing the BSON is valid. Calling * bson_validate() is one way to do this ahead of time. */ static BSON_INLINE uint32_t bson_iter_utf8_len_unsafe (const bson_iter_t *iter) { uint32_t raw; memcpy (&raw, iter->raw + iter->d1, sizeof (raw)); const uint32_t native = BSON_UINT32_FROM_LE (raw); int32_t len; memcpy (&len, &native, sizeof (len)); return len <= 0 ? 0u : (uint32_t) (len - 1); } BSON_EXPORT (void) bson_iter_array (const bson_iter_t *iter, uint32_t *array_len, const uint8_t **array); BSON_EXPORT (void) bson_iter_binary (const bson_iter_t *iter, bson_subtype_t *subtype, uint32_t *binary_len, const uint8_t **binary); BSON_EXPORT (const char *) bson_iter_code (const bson_iter_t *iter, uint32_t *length); /** * bson_iter_code_unsafe: * @iter: A bson_iter_t. * @length: A location for the length of the resulting string. * * Like bson_iter_code() but performs no integrity checks. * * Returns: A string that should not be modified or freed. */ static BSON_INLINE const char * bson_iter_code_unsafe (const bson_iter_t *iter, uint32_t *length) { *length = bson_iter_utf8_len_unsafe (iter); return (const char *) (iter->raw + iter->d2); } BSON_EXPORT (const char *) bson_iter_codewscope (const bson_iter_t *iter, uint32_t *length, uint32_t *scope_len, const uint8_t **scope); BSON_EXPORT (void) bson_iter_dbpointer (const bson_iter_t *iter, uint32_t *collection_len, const char **collection, const bson_oid_t **oid); BSON_EXPORT (void) bson_iter_document (const bson_iter_t *iter, uint32_t *document_len, const uint8_t **document); BSON_EXPORT (double) bson_iter_double (const bson_iter_t *iter); BSON_EXPORT (double) bson_iter_as_double (const bson_iter_t *iter); /** * bson_iter_double_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_double() but does not perform an integrity checking. * * Returns: A double. */ static BSON_INLINE double bson_iter_double_unsafe (const bson_iter_t *iter) { double val; memcpy (&val, iter->raw + iter->d1, sizeof (val)); return BSON_DOUBLE_FROM_LE (val); } BSON_EXPORT (bool) bson_iter_init (bson_iter_t *iter, const bson_t *bson); BSON_EXPORT (bool) bson_iter_init_from_data (bson_iter_t *iter, const uint8_t *data, size_t length); BSON_EXPORT (bool) bson_iter_init_find (bson_iter_t *iter, const bson_t *bson, const char *key); BSON_EXPORT (bool) bson_iter_init_find_w_len (bson_iter_t *iter, const bson_t *bson, const char *key, int keylen); BSON_EXPORT (bool) bson_iter_init_find_case (bson_iter_t *iter, const bson_t *bson, const char *key); BSON_EXPORT (bool) bson_iter_init_from_data_at_offset (bson_iter_t *iter, const uint8_t *data, size_t length, uint32_t offset, uint32_t keylen); BSON_EXPORT (int32_t) bson_iter_int32 (const bson_iter_t *iter); /** * bson_iter_int32_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_int32() but with no integrity checking. * * Returns: A 32-bit signed integer. */ static BSON_INLINE int32_t bson_iter_int32_unsafe (const bson_iter_t *iter) { uint32_t raw; memcpy (&raw, iter->raw + iter->d1, sizeof (raw)); const uint32_t native = BSON_UINT32_FROM_LE (raw); int32_t res; memcpy (&res, &native, sizeof (res)); return res; } BSON_EXPORT (int64_t) bson_iter_int64 (const bson_iter_t *iter); BSON_EXPORT (int64_t) bson_iter_as_int64 (const bson_iter_t *iter); /** * bson_iter_int64_unsafe: * @iter: a bson_iter_t. * * Similar to bson_iter_int64() but without integrity checking. * * Returns: A 64-bit signed integer. */ static BSON_INLINE int64_t bson_iter_int64_unsafe (const bson_iter_t *iter) { uint64_t raw; memcpy (&raw, iter->raw + iter->d1, sizeof (raw)); const uint64_t native = BSON_UINT64_FROM_LE (raw); int64_t res; memcpy (&res, &native, sizeof (res)); return res; } BSON_EXPORT (bool) bson_iter_find (bson_iter_t *iter, const char *key); BSON_EXPORT (bool) bson_iter_find_w_len (bson_iter_t *iter, const char *key, int keylen); BSON_EXPORT (bool) bson_iter_find_case (bson_iter_t *iter, const char *key); BSON_EXPORT (bool) bson_iter_find_descendant (bson_iter_t *iter, const char *dotkey, bson_iter_t *descendant); BSON_EXPORT (bool) bson_iter_next (bson_iter_t *iter); BSON_EXPORT (const bson_oid_t *) bson_iter_oid (const bson_iter_t *iter); /** * bson_iter_oid_unsafe: * @iter: A #bson_iter_t. * * Similar to bson_iter_oid() but performs no integrity checks. * * Returns: A #bson_oid_t that should not be modified or freed. */ static BSON_INLINE const bson_oid_t * bson_iter_oid_unsafe (const bson_iter_t *iter) { return (const bson_oid_t *) (iter->raw + iter->d1); } BSON_EXPORT (bool) bson_iter_decimal128 (const bson_iter_t *iter, bson_decimal128_t *dec); /** * bson_iter_decimal128_unsafe: * @iter: A #bson_iter_t. * * Similar to bson_iter_decimal128() but performs no integrity checks. * * Returns: A #bson_decimal128_t. */ static BSON_INLINE void bson_iter_decimal128_unsafe (const bson_iter_t *iter, bson_decimal128_t *dec) { uint64_t low_le; uint64_t high_le; memcpy (&low_le, iter->raw + iter->d1, sizeof (low_le)); memcpy (&high_le, iter->raw + iter->d1 + 8, sizeof (high_le)); dec->low = BSON_UINT64_FROM_LE (low_le); dec->high = BSON_UINT64_FROM_LE (high_le); } BSON_EXPORT (const char *) bson_iter_key (const bson_iter_t *iter); BSON_EXPORT (uint32_t) bson_iter_key_len (const bson_iter_t *iter); /** * bson_iter_key_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_key() but performs no integrity checking. * * Returns: A string that should not be modified or freed. */ static BSON_INLINE const char * bson_iter_key_unsafe (const bson_iter_t *iter) { return (const char *) (iter->raw + iter->key); } BSON_EXPORT (const char *) bson_iter_utf8 (const bson_iter_t *iter, uint32_t *length); /** * bson_iter_utf8_unsafe: * * Similar to bson_iter_utf8() but performs no integrity checking. * * Returns: A string that should not be modified or freed. */ static BSON_INLINE const char * bson_iter_utf8_unsafe (const bson_iter_t *iter, size_t *length) { *length = bson_iter_utf8_len_unsafe (iter); return (const char *) (iter->raw + iter->d2); } BSON_EXPORT (char *) bson_iter_dup_utf8 (const bson_iter_t *iter, uint32_t *length); BSON_EXPORT (int64_t) bson_iter_date_time (const bson_iter_t *iter); BSON_EXPORT (time_t) bson_iter_time_t (const bson_iter_t *iter); /** * bson_iter_time_t_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_time_t() but performs no integrity checking. * * Returns: A time_t containing the number of seconds since UNIX epoch * in UTC. */ static BSON_INLINE time_t bson_iter_time_t_unsafe (const bson_iter_t *iter) { return (time_t) (bson_iter_int64_unsafe (iter) / 1000); } BSON_EXPORT (void) bson_iter_timeval (const bson_iter_t *iter, struct timeval *tv); /** * bson_iter_timeval_unsafe: * @iter: A bson_iter_t. * @tv: A struct timeval. * * Similar to bson_iter_timeval() but performs no integrity checking. */ static BSON_INLINE void bson_iter_timeval_unsafe (const bson_iter_t *iter, struct timeval *tv) { int64_t value = bson_iter_int64_unsafe (iter); #ifdef BSON_OS_WIN32 tv->tv_sec = (long) (value / 1000); tv->tv_usec = (long) (value % 1000) * 1000; #else tv->tv_sec = (time_t) (value / 1000); tv->tv_usec = (suseconds_t) (value % 1000) * 1000; #endif } BSON_EXPORT (void) bson_iter_timestamp (const bson_iter_t *iter, uint32_t *timestamp, uint32_t *increment); BSON_EXPORT (bool) bson_iter_bool (const bson_iter_t *iter); /** * bson_iter_bool_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_bool() but performs no integrity checking. * * Returns: true or false. */ static BSON_INLINE bool bson_iter_bool_unsafe (const bson_iter_t *iter) { char val; memcpy (&val, iter->raw + iter->d1, 1); return !!val; } BSON_EXPORT (bool) bson_iter_as_bool (const bson_iter_t *iter); BSON_EXPORT (const char *) bson_iter_regex (const bson_iter_t *iter, const char **options); BSON_EXPORT (const char *) bson_iter_symbol (const bson_iter_t *iter, uint32_t *length); BSON_EXPORT (bson_type_t) bson_iter_type (const bson_iter_t *iter); /** * bson_iter_type_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_type() but performs no integrity checking. * * Returns: A bson_type_t. */ static BSON_INLINE bson_type_t bson_iter_type_unsafe (const bson_iter_t *iter) { return (bson_type_t) (iter->raw + iter->type)[0]; } BSON_EXPORT (bool) bson_iter_recurse (const bson_iter_t *iter, bson_iter_t *child); BSON_EXPORT (void) bson_iter_overwrite_int32 (bson_iter_t *iter, int32_t value); BSON_EXPORT (void) bson_iter_overwrite_int64 (bson_iter_t *iter, int64_t value); BSON_EXPORT (void) bson_iter_overwrite_double (bson_iter_t *iter, double value); BSON_EXPORT (void) bson_iter_overwrite_decimal128 (bson_iter_t *iter, const bson_decimal128_t *value); BSON_EXPORT (void) bson_iter_overwrite_bool (bson_iter_t *iter, bool value); BSON_EXPORT (void) bson_iter_overwrite_oid (bson_iter_t *iter, const bson_oid_t *value); BSON_EXPORT (void) bson_iter_overwrite_timestamp (bson_iter_t *iter, uint32_t timestamp, uint32_t increment); BSON_EXPORT (void) bson_iter_overwrite_date_time (bson_iter_t *iter, int64_t value); BSON_EXPORT (bool) bson_iter_visit_all (bson_iter_t *iter, const bson_visitor_t *visitor, void *data); BSON_EXPORT (uint32_t) bson_iter_offset (bson_iter_t *iter); BSON_END_DECLS #endif /* BSON_ITER_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-json-private.h000066400000000000000000000014711456567454500241600ustar00rootroot00000000000000/* * Copyright 2020 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_JSON_PRIVATE_H #define BSON_JSON_PRIVATE_H struct _bson_json_opts_t { bson_json_mode_t mode; int32_t max_len; bool is_outermost_array; }; #endif /* BSON_JSON_PRIVATE_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-json.c000066400000000000000000002362571456567454500225170ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include "bson.h" #include #include #include #include #include "common-b64-private.h" #include "jsonsl/jsonsl.h" #ifdef _WIN32 #include #include #endif #ifndef _MSC_VER #include #endif #ifdef _MSC_VER #define SSCANF sscanf_s #else #define SSCANF sscanf #endif #define STACK_MAX 100 #define BSON_JSON_DEFAULT_BUF_SIZE (1 << 14) #define AT_LEAST_0(x) ((x) >= 0 ? (x) : 0) #define READ_STATE_ENUM(ENUM) BSON_JSON_##ENUM, #define GENERATE_STRING(STRING) #STRING, #define FOREACH_READ_STATE(RS) \ RS (REGULAR) \ RS (DONE) \ RS (ERROR) \ RS (IN_START_MAP) \ RS (IN_BSON_TYPE) \ RS (IN_BSON_TYPE_DATE_NUMBERLONG) \ RS (IN_BSON_TYPE_DATE_ENDMAP) \ RS (IN_BSON_TYPE_TIMESTAMP_STARTMAP) \ RS (IN_BSON_TYPE_TIMESTAMP_VALUES) \ RS (IN_BSON_TYPE_TIMESTAMP_ENDMAP) \ RS (IN_BSON_TYPE_REGEX_STARTMAP) \ RS (IN_BSON_TYPE_REGEX_VALUES) \ RS (IN_BSON_TYPE_REGEX_ENDMAP) \ RS (IN_BSON_TYPE_BINARY_VALUES) \ RS (IN_BSON_TYPE_BINARY_ENDMAP) \ RS (IN_BSON_TYPE_SCOPE_STARTMAP) \ RS (IN_BSON_TYPE_DBPOINTER_STARTMAP) \ RS (IN_SCOPE) \ RS (IN_DBPOINTER) typedef enum { FOREACH_READ_STATE (READ_STATE_ENUM) } bson_json_read_state_t; static const char *read_state_names[] = {FOREACH_READ_STATE (GENERATE_STRING)}; #define BSON_STATE_ENUM(ENUM) BSON_JSON_LF_##ENUM, #define FOREACH_BSON_STATE(BS) \ /* legacy {$regex: "...", $options: "..."} */ \ BS (REGEX) \ BS (OPTIONS) \ /* modern $regularExpression: {pattern: "...", options: "..."} */ \ BS (REGULAR_EXPRESSION_PATTERN) \ BS (REGULAR_EXPRESSION_OPTIONS) \ BS (CODE) \ BS (SCOPE) \ BS (OID) \ BS (BINARY) \ BS (TYPE) \ BS (DATE) \ BS (TIMESTAMP_T) \ BS (TIMESTAMP_I) \ BS (UNDEFINED) \ BS (MINKEY) \ BS (MAXKEY) \ BS (INT32) \ BS (INT64) \ BS (DOUBLE) \ BS (DECIMAL128) \ BS (DBPOINTER) \ BS (SYMBOL) \ BS (UUID) typedef enum { FOREACH_BSON_STATE (BSON_STATE_ENUM) } bson_json_read_bson_state_t; static const char *bson_state_names[] = {FOREACH_BSON_STATE (GENERATE_STRING)}; typedef struct { uint8_t *buf; size_t n_bytes; size_t len; } bson_json_buf_t; typedef enum { BSON_JSON_FRAME_INITIAL = 0, BSON_JSON_FRAME_ARRAY, BSON_JSON_FRAME_DOC, BSON_JSON_FRAME_SCOPE, BSON_JSON_FRAME_DBPOINTER, } bson_json_frame_type_t; typedef struct { int i; bson_json_frame_type_t type; bson_t bson; } bson_json_stack_frame_t; typedef union { struct { bool has_pattern; bool has_options; bool is_legacy; } regex; struct { bool has_oid; bson_oid_t oid; } oid; struct { bool has_binary; bool has_subtype; bson_subtype_t type; bool is_legacy; } binary; struct { bool has_date; int64_t date; } date; struct { bool has_t; bool has_i; uint32_t t; uint32_t i; } timestamp; struct { bool has_undefined; } undefined; struct { bool has_minkey; } minkey; struct { bool has_maxkey; } maxkey; struct { int32_t value; } v_int32; struct { int64_t value; } v_int64; struct { double value; } v_double; struct { bson_decimal128_t value; } v_decimal128; } bson_json_bson_data_t; /* collect info while parsing a {$code: "...", $scope: {...}} object */ typedef struct { bool has_code; bool has_scope; bool in_scope; bson_json_buf_t key_buf; bson_json_buf_t code_buf; } bson_json_code_t; static void _bson_json_code_cleanup (bson_json_code_t *code_data) { bson_free (code_data->key_buf.buf); bson_free (code_data->code_buf.buf); } typedef struct { bson_t *bson; bson_json_stack_frame_t stack[STACK_MAX]; int n; const char *key; bson_json_buf_t key_buf; bson_json_buf_t unescaped; bson_json_read_state_t read_state; bson_json_read_bson_state_t bson_state; bson_type_t bson_type; bson_json_buf_t bson_type_buf[3]; bson_json_bson_data_t bson_type_data; bson_json_code_t code_data; bson_json_buf_t dbpointer_key; } bson_json_reader_bson_t; typedef struct { void *data; bson_json_reader_cb cb; bson_json_destroy_cb dcb; uint8_t *buf; size_t buf_size; size_t bytes_read; size_t bytes_parsed; bool all_whitespace; } bson_json_reader_producer_t; struct _bson_json_reader_t { bson_json_reader_producer_t producer; bson_json_reader_bson_t bson; jsonsl_t json; ssize_t json_text_pos; bool should_reset; ssize_t advance; bson_json_buf_t tok_accumulator; bson_error_t *error; }; typedef struct { int fd; bool do_close; } bson_json_reader_handle_fd_t; /* forward decl */ static void _bson_json_save_map_key (bson_json_reader_bson_t *bson, const uint8_t *val, size_t len); static void _noop (void) { } #define STACK_ELE(_delta, _name) (bson->stack[(_delta) + bson->n]._name) #define STACK_BSON(_delta) \ (((_delta) + bson->n) == 0 ? bson->bson : &STACK_ELE (_delta, bson)) #define STACK_BSON_PARENT STACK_BSON (-1) #define STACK_BSON_CHILD STACK_BSON (0) #define STACK_I STACK_ELE (0, i) #define STACK_FRAME_TYPE STACK_ELE (0, type) #define STACK_IS_INITIAL (STACK_FRAME_TYPE == BSON_JSON_FRAME_INITIAL) #define STACK_IS_ARRAY (STACK_FRAME_TYPE == BSON_JSON_FRAME_ARRAY) #define STACK_IS_DOC (STACK_FRAME_TYPE == BSON_JSON_FRAME_DOC) #define STACK_IS_SCOPE (STACK_FRAME_TYPE == BSON_JSON_FRAME_SCOPE) #define STACK_IS_DBPOINTER (STACK_FRAME_TYPE == BSON_JSON_FRAME_DBPOINTER) #define FRAME_TYPE_HAS_BSON(_type) \ ((_type) == BSON_JSON_FRAME_SCOPE || (_type) == BSON_JSON_FRAME_DBPOINTER) #define STACK_HAS_BSON FRAME_TYPE_HAS_BSON (STACK_FRAME_TYPE) #define STACK_PUSH(frame_type) \ do { \ if (bson->n >= (STACK_MAX - 1)) { \ return; \ } \ bson->n++; \ if (STACK_HAS_BSON) { \ if (FRAME_TYPE_HAS_BSON (frame_type)) { \ bson_reinit (STACK_BSON_CHILD); \ } else { \ bson_destroy (STACK_BSON_CHILD); \ } \ } else if (FRAME_TYPE_HAS_BSON (frame_type)) { \ bson_init (STACK_BSON_CHILD); \ } \ STACK_FRAME_TYPE = frame_type; \ } while (0) #define STACK_PUSH_ARRAY(statement) \ do { \ STACK_PUSH (BSON_JSON_FRAME_ARRAY); \ STACK_I = 0; \ if (bson->n != 0) { \ statement; \ } \ } while (0) #define STACK_PUSH_DOC(statement) \ do { \ STACK_PUSH (BSON_JSON_FRAME_DOC); \ if (bson->n != 0) { \ statement; \ } \ } while (0) #define STACK_PUSH_SCOPE \ do { \ STACK_PUSH (BSON_JSON_FRAME_SCOPE); \ bson->code_data.in_scope = true; \ } while (0) #define STACK_PUSH_DBPOINTER \ do { \ STACK_PUSH (BSON_JSON_FRAME_DBPOINTER); \ } while (0) #define STACK_POP_ARRAY(statement) \ do { \ if (!STACK_IS_ARRAY) { \ return; \ } \ if (bson->n < 0) { \ return; \ } \ if (bson->n > 0) { \ statement; \ } \ bson->n--; \ } while (0) #define STACK_POP_DOC(statement) \ do { \ if (STACK_IS_ARRAY) { \ return; \ } \ if (bson->n < 0) { \ return; \ } \ if (bson->n > 0) { \ statement; \ } \ bson->n--; \ } while (0) #define STACK_POP_SCOPE \ do { \ STACK_POP_DOC (_noop ()); \ bson->code_data.in_scope = false; \ } while (0); #define STACK_POP_DBPOINTER STACK_POP_DOC (_noop ()) #define BASIC_CB_PREAMBLE \ const char *key; \ size_t len; \ bson_json_reader_bson_t *bson = &reader->bson; \ _bson_json_read_fixup_key (bson); \ key = bson->key; \ len = bson->key_buf.len; #define BASIC_CB_BAIL_IF_NOT_NORMAL(_type) \ if (bson->read_state != BSON_JSON_REGULAR) { \ _bson_json_read_set_error (reader, \ "Invalid read of %s in state %s", \ (_type), \ read_state_names[bson->read_state]); \ return; \ } else if (!key) { \ _bson_json_read_set_error (reader, \ "Invalid read of %s without key in state %s", \ (_type), \ read_state_names[bson->read_state]); \ return; \ } #define HANDLE_OPTION(_selection_statement, _key, _type, _state) \ _selection_statement (len == strlen (_key) && \ strncmp ((const char *) val, (_key), len) == 0) \ { \ if (bson->bson_type && bson->bson_type != (_type)) { \ _bson_json_read_set_error (reader, \ "Invalid key \"%s\". Looking for values " \ "for type \"%s\", got \"%s\"", \ (_key), \ _bson_json_type_name (bson->bson_type), \ _bson_json_type_name (_type)); \ return; \ } \ bson->bson_type = (_type); \ bson->bson_state = (_state); \ } bson_json_opts_t * bson_json_opts_new (bson_json_mode_t mode, int32_t max_len) { bson_json_opts_t *opts; opts = (bson_json_opts_t *) bson_malloc (sizeof *opts); *opts = (bson_json_opts_t){ .mode = mode, .max_len = max_len, .is_outermost_array = false, }; return opts; } void bson_json_opts_destroy (bson_json_opts_t *opts) { bson_free (opts); } static void _bson_json_read_set_error (bson_json_reader_t *reader, const char *fmt, ...) BSON_GNUC_PRINTF (2, 3); static void _bson_json_read_set_error (bson_json_reader_t *reader, /* IN */ const char *fmt, /* IN */ ...) { va_list ap; if (reader->error) { reader->error->domain = BSON_ERROR_JSON; reader->error->code = BSON_JSON_ERROR_READ_INVALID_PARAM; va_start (ap, fmt); bson_vsnprintf ( reader->error->message, sizeof reader->error->message, fmt, ap); va_end (ap); reader->error->message[sizeof reader->error->message - 1] = '\0'; } reader->bson.read_state = BSON_JSON_ERROR; jsonsl_stop (reader->json); } static void _bson_json_read_corrupt (bson_json_reader_t *reader, const char *fmt, ...) BSON_GNUC_PRINTF (2, 3); static void _bson_json_read_corrupt (bson_json_reader_t *reader, /* IN */ const char *fmt, /* IN */ ...) { va_list ap; if (reader->error) { reader->error->domain = BSON_ERROR_JSON; reader->error->code = BSON_JSON_ERROR_READ_CORRUPT_JS; va_start (ap, fmt); bson_vsnprintf ( reader->error->message, sizeof reader->error->message, fmt, ap); va_end (ap); reader->error->message[sizeof reader->error->message - 1] = '\0'; } reader->bson.read_state = BSON_JSON_ERROR; jsonsl_stop (reader->json); } static void _bson_json_buf_ensure (bson_json_buf_t *buf, /* IN */ size_t len) /* IN */ { if (buf->n_bytes < len) { bson_free (buf->buf); buf->n_bytes = bson_next_power_of_two (len); buf->buf = bson_malloc (buf->n_bytes); } } static void _bson_json_buf_set (bson_json_buf_t *buf, const void *from, size_t len) { _bson_json_buf_ensure (buf, len + 1); memcpy (buf->buf, from, len); buf->buf[len] = '\0'; buf->len = len; } static void _bson_json_buf_append (bson_json_buf_t *buf, const void *from, size_t len) { size_t len_with_null = len + 1; if (buf->len == 0) { _bson_json_buf_ensure (buf, len_with_null); } else if (buf->n_bytes < buf->len + len_with_null) { buf->n_bytes = bson_next_power_of_two (buf->len + len_with_null); buf->buf = bson_realloc (buf->buf, buf->n_bytes); } memcpy (buf->buf + buf->len, from, len); buf->len += len; buf->buf[buf->len] = '\0'; } static const char * _bson_json_type_name (bson_type_t type) { switch (type) { case BSON_TYPE_EOD: return "end of document"; case BSON_TYPE_DOUBLE: return "double"; case BSON_TYPE_UTF8: return "utf-8"; case BSON_TYPE_DOCUMENT: return "document"; case BSON_TYPE_ARRAY: return "array"; case BSON_TYPE_BINARY: return "binary"; case BSON_TYPE_UNDEFINED: return "undefined"; case BSON_TYPE_OID: return "objectid"; case BSON_TYPE_BOOL: return "bool"; case BSON_TYPE_DATE_TIME: return "datetime"; case BSON_TYPE_NULL: return "null"; case BSON_TYPE_REGEX: return "regex"; case BSON_TYPE_DBPOINTER: return "dbpointer"; case BSON_TYPE_CODE: return "code"; case BSON_TYPE_SYMBOL: return "symbol"; case BSON_TYPE_CODEWSCOPE: return "code with scope"; case BSON_TYPE_INT32: return "int32"; case BSON_TYPE_TIMESTAMP: return "timestamp"; case BSON_TYPE_INT64: return "int64"; case BSON_TYPE_DECIMAL128: return "decimal128"; case BSON_TYPE_MAXKEY: return "maxkey"; case BSON_TYPE_MINKEY: return "minkey"; default: return ""; } } static void _bson_json_read_fixup_key (bson_json_reader_bson_t *bson) /* IN */ { bson_json_read_state_t rs = bson->read_state; if (bson->n >= 0 && STACK_IS_ARRAY && rs == BSON_JSON_REGULAR) { _bson_json_buf_ensure (&bson->key_buf, 12); bson->key_buf.len = bson_uint32_to_string ( STACK_I, &bson->key, (char *) bson->key_buf.buf, 12); STACK_I++; } } static void _bson_json_read_null (bson_json_reader_t *reader) { BASIC_CB_PREAMBLE; BASIC_CB_BAIL_IF_NOT_NORMAL ("null"); bson_append_null (STACK_BSON_CHILD, key, (int) len); } static void _bson_json_read_boolean (bson_json_reader_t *reader, /* IN */ int val) /* IN */ { BASIC_CB_PREAMBLE; if (bson->read_state == BSON_JSON_IN_BSON_TYPE && bson->bson_state == BSON_JSON_LF_UNDEFINED) { bson->bson_type_data.undefined.has_undefined = true; return; } BASIC_CB_BAIL_IF_NOT_NORMAL ("boolean"); bson_append_bool (STACK_BSON_CHILD, key, (int) len, val); } /* sign is -1 or 1 */ static void _bson_json_read_integer (bson_json_reader_t *reader, uint64_t val, int64_t sign) { bson_json_read_state_t rs; bson_json_read_bson_state_t bs; BASIC_CB_PREAMBLE; if (sign == 1 && val > INT64_MAX) { _bson_json_read_set_error ( reader, "Number \"%" PRIu64 "\" is out of range", val); return; } else if (sign == -1 && val > ((uint64_t) INT64_MAX + 1)) { _bson_json_read_set_error ( reader, "Number \"-%" PRIu64 "\" is out of range", val); return; } rs = bson->read_state; bs = bson->bson_state; if (rs == BSON_JSON_REGULAR) { BASIC_CB_BAIL_IF_NOT_NORMAL ("integer"); if (val <= INT32_MAX || (sign == -1 && val <= (uint64_t) INT32_MAX + 1)) { bson_append_int32 ( STACK_BSON_CHILD, key, (int) len, (int) (val * sign)); } else if (sign == -1) { #if defined(_WIN32) && !defined(__MINGW32__) // Unary negation of unsigned integer is deliberate. #pragma warning(suppress : 4146) bson_append_int64 (STACK_BSON_CHILD, key, (int) len, (int64_t) -val); #else bson_append_int64 (STACK_BSON_CHILD, key, (int) len, (int64_t) -val); #endif // defined(_WIN32) && !defined(__MINGW32__) } else { bson_append_int64 (STACK_BSON_CHILD, key, (int) len, (int64_t) val); } } else if (rs == BSON_JSON_IN_BSON_TYPE || rs == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES) { switch (bs) { case BSON_JSON_LF_DATE: bson->bson_type_data.date.has_date = true; bson->bson_type_data.date.date = sign * val; break; case BSON_JSON_LF_TIMESTAMP_T: if (sign == -1) { _bson_json_read_set_error ( reader, "Invalid timestamp value: \"-%" PRIu64 "\"", val); return; } bson->bson_type_data.timestamp.has_t = true; bson->bson_type_data.timestamp.t = (uint32_t) val; break; case BSON_JSON_LF_TIMESTAMP_I: if (sign == -1) { _bson_json_read_set_error ( reader, "Invalid timestamp value: \"-%" PRIu64 "\"", val); return; } bson->bson_type_data.timestamp.has_i = true; bson->bson_type_data.timestamp.i = (uint32_t) val; break; case BSON_JSON_LF_MINKEY: if (sign == -1) { _bson_json_read_set_error ( reader, "Invalid MinKey value: \"-%" PRIu64 "\"", val); return; } else if (val != 1) { _bson_json_read_set_error ( reader, "Invalid MinKey value: \"%" PRIu64 "\"", val); } bson->bson_type_data.minkey.has_minkey = true; break; case BSON_JSON_LF_MAXKEY: if (sign == -1) { _bson_json_read_set_error ( reader, "Invalid MinKey value: \"-%" PRIu64 "\"", val); return; } else if (val != 1) { _bson_json_read_set_error ( reader, "Invalid MinKey value: \"%" PRIu64 "\"", val); } bson->bson_type_data.maxkey.has_maxkey = true; break; case BSON_JSON_LF_INT32: case BSON_JSON_LF_INT64: _bson_json_read_set_error ( reader, "Invalid state for integer read: %s, " "expected number as quoted string like \"123\"", bson_state_names[bs]); break; case BSON_JSON_LF_REGEX: case BSON_JSON_LF_OPTIONS: case BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN: case BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS: case BSON_JSON_LF_CODE: case BSON_JSON_LF_SCOPE: case BSON_JSON_LF_OID: case BSON_JSON_LF_BINARY: case BSON_JSON_LF_TYPE: case BSON_JSON_LF_UUID: case BSON_JSON_LF_UNDEFINED: case BSON_JSON_LF_DOUBLE: case BSON_JSON_LF_DECIMAL128: case BSON_JSON_LF_DBPOINTER: case BSON_JSON_LF_SYMBOL: default: _bson_json_read_set_error (reader, "Unexpected integer %s%" PRIu64 " in type \"%s\"", sign == -1 ? "-" : "", val, _bson_json_type_name (bson->bson_type)); } } else { _bson_json_read_set_error (reader, "Unexpected integer %s%" PRIu64 " in state \"%s\"", sign == -1 ? "-" : "", val, read_state_names[rs]); } } static bool _bson_json_parse_double (bson_json_reader_t *reader, const char *val, size_t vlen, double *d) { errno = 0; *d = strtod (val, NULL); #ifdef _MSC_VER const double pos_inf = INFINITY; const double neg_inf = -pos_inf; /* Microsoft's strtod parses "NaN", "Infinity", "-Infinity" as 0 */ if (*d == 0.0) { if (!_strnicmp (val, "nan", vlen)) { *d = NAN; return true; } else if (!_strnicmp (val, "infinity", vlen)) { *d = pos_inf; return true; } else if (!_strnicmp (val, "-infinity", vlen)) { *d = neg_inf; return true; } } if ((*d == HUGE_VAL || *d == -HUGE_VAL) && errno == ERANGE) { _bson_json_read_set_error ( reader, "Number \"%.*s\" is out of range", (int) vlen, val); return false; } #else /* not MSVC - set err on overflow, but avoid err for infinity */ if ((*d == HUGE_VAL || *d == -HUGE_VAL) && errno == ERANGE && strncasecmp (val, "infinity", vlen) && strncasecmp (val, "-infinity", vlen)) { _bson_json_read_set_error ( reader, "Number \"%.*s\" is out of range", (int) vlen, val); return false; } #endif /* _MSC_VER */ return true; } static void _bson_json_read_double (bson_json_reader_t *reader, /* IN */ double val) /* IN */ { BASIC_CB_PREAMBLE; BASIC_CB_BAIL_IF_NOT_NORMAL ("double"); if (!bson_append_double (STACK_BSON_CHILD, key, (int) len, val)) { _bson_json_read_set_error (reader, "Cannot append double value %g", val); } } static bool _bson_json_read_int64_or_set_error (bson_json_reader_t *reader, /* IN */ const unsigned char *val, /* IN */ size_t vlen, /* IN */ int64_t *v64) /* OUT */ { bson_json_reader_bson_t *bson = &reader->bson; char *endptr = NULL; _bson_json_read_fixup_key (bson); errno = 0; *v64 = bson_ascii_strtoll ((const char *) val, &endptr, 10); if (((*v64 == INT64_MIN) || (*v64 == INT64_MAX)) && (errno == ERANGE)) { _bson_json_read_set_error (reader, "Number \"%s\" is out of range", val); return false; } if (endptr != ((const char *) val + vlen)) { _bson_json_read_set_error (reader, "Number \"%s\" is invalid", val); return false; } return true; } static bool _unhexlify_uuid (const char *uuid, uint8_t *out, size_t max) { unsigned int byte; size_t x = 0; int i = 0; BSON_ASSERT (strlen (uuid) == 32); while (SSCANF (&uuid[i], "%2x", &byte) == 1) { if (x >= max) { return false; } out[x++] = (uint8_t) byte; i += 2; } return i == 32; } /* parse a value for "base64", "subType", legacy "$binary" or "$type", or * "$uuid" */ static void _bson_json_parse_binary_elem (bson_json_reader_t *reader, const char *val_w_null, size_t vlen) { bson_json_read_bson_state_t bs; bson_json_bson_data_t *data; int binary_len; BASIC_CB_PREAMBLE; bs = bson->bson_state; data = &bson->bson_type_data; if (bs == BSON_JSON_LF_BINARY) { data->binary.has_binary = true; binary_len = mcommon_b64_pton (val_w_null, NULL, 0); if (binary_len < 0) { _bson_json_read_set_error ( reader, "Invalid input string \"%s\", looking for base64-encoded binary", val_w_null); } _bson_json_buf_ensure (&bson->bson_type_buf[0], (size_t) binary_len + 1); if (mcommon_b64_pton (val_w_null, bson->bson_type_buf[0].buf, (size_t) binary_len + 1) < 0) { _bson_json_read_set_error ( reader, "Invalid input string \"%s\", looking for base64-encoded binary", val_w_null); } bson->bson_type_buf[0].len = (size_t) binary_len; } else if (bs == BSON_JSON_LF_TYPE) { data->binary.has_subtype = true; if (SSCANF (val_w_null, "%02x", &data->binary.type) != 1) { if (!data->binary.is_legacy || data->binary.has_binary) { /* misformatted subtype, like {$binary: {base64: "", subType: "x"}}, * or legacy {$binary: "", $type: "x"} */ _bson_json_read_set_error ( reader, "Invalid input string \"%s\", looking for binary subtype", val_w_null); } else { /* actually a query operator: {x: {$type: "array"}}*/ bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DOC (bson_append_document_begin ( STACK_BSON_PARENT, key, (int) len, STACK_BSON_CHILD)); bson_append_utf8 (STACK_BSON_CHILD, "$type", 5, (const char *) val_w_null, (int) vlen); } } } else if (bs == BSON_JSON_LF_UUID) { int nread = 0; char uuid[33]; data->binary.has_binary = true; data->binary.has_subtype = true; data->binary.type = BSON_SUBTYPE_UUID; /* Validate the UUID and extract relevant portions */ /* We can't use %x here as it allows +, -, and 0x prefixes */ #ifdef _MSC_VER SSCANF (val_w_null, "%8c-%4c-%4c-%4c-%12c%n", &uuid[0], 8, &uuid[8], 4, &uuid[12], 4, &uuid[16], 4, &uuid[20], 12, &nread); #else SSCANF (val_w_null, "%8c-%4c-%4c-%4c-%12c%n", &uuid[0], &uuid[8], &uuid[12], &uuid[16], &uuid[20], &nread); #endif uuid[32] = '\0'; if (nread != 36 || val_w_null[nread] != '\0') { _bson_json_read_set_error (reader, "Invalid input string \"%s\", looking for " "a dash-separated UUID string", val_w_null); return; } binary_len = 16; _bson_json_buf_ensure (&bson->bson_type_buf[0], (size_t) binary_len + 1); if (!_unhexlify_uuid ( &uuid[0], bson->bson_type_buf[0].buf, (size_t) binary_len)) { _bson_json_read_set_error (reader, "Invalid input string \"%s\", looking for " "a dash-separated UUID string", val_w_null); } bson->bson_type_buf[0].len = (size_t) binary_len; } } static bool _bson_json_allow_embedded_nulls (bson_json_reader_t const *reader) { const bson_json_read_state_t read_state = reader->bson.read_state; const bson_json_read_bson_state_t bson_state = reader->bson.bson_state; if (read_state == BSON_JSON_IN_BSON_TYPE_REGEX_VALUES) { if (bson_state == BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN || bson_state == BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS) { /* Prohibit embedded NULL bytes for canonical extended regex: * { $regularExpression: { pattern: "pattern", options: "options" } } */ return false; } } if (read_state == BSON_JSON_IN_BSON_TYPE) { if (bson_state == BSON_JSON_LF_REGEX || bson_state == BSON_JSON_LF_OPTIONS) { /* Prohibit embedded NULL bytes for legacy regex: * { $regex: "pattern", $options: "options" } */ return false; } } /* Embedded nulls are okay in any other context */ return true; } static void _bson_json_read_string (bson_json_reader_t *reader, /* IN */ const unsigned char *val, /* IN */ size_t vlen) /* IN */ { bson_json_read_state_t rs; bson_json_read_bson_state_t bs; const bool allow_null = _bson_json_allow_embedded_nulls (reader); BASIC_CB_PREAMBLE; rs = bson->read_state; bs = bson->bson_state; if (!bson_utf8_validate ((const char *) val, vlen, allow_null)) { _bson_json_read_corrupt (reader, "invalid bytes in UTF8 string"); return; } if (rs == BSON_JSON_REGULAR) { BASIC_CB_BAIL_IF_NOT_NORMAL ("string"); bson_append_utf8 ( STACK_BSON_CHILD, key, (int) len, (const char *) val, (int) vlen); } else if (rs == BSON_JSON_IN_BSON_TYPE_SCOPE_STARTMAP || rs == BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP) { _bson_json_read_set_error (reader, "Invalid read of \"%s\" in state \"%s\"", val, read_state_names[rs]); } else if (rs == BSON_JSON_IN_BSON_TYPE_BINARY_VALUES) { const char *val_w_null; _bson_json_buf_set (&bson->bson_type_buf[2], val, vlen); val_w_null = (const char *) bson->bson_type_buf[2].buf; _bson_json_parse_binary_elem (reader, val_w_null, vlen); } else if (rs == BSON_JSON_IN_BSON_TYPE || rs == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES || rs == BSON_JSON_IN_BSON_TYPE_REGEX_VALUES || rs == BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG) { const char *val_w_null; _bson_json_buf_set (&bson->bson_type_buf[2], val, vlen); val_w_null = (const char *) bson->bson_type_buf[2].buf; switch (bs) { case BSON_JSON_LF_REGEX: bson->bson_type_data.regex.is_legacy = true; /* FALL THROUGH */ case BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN: bson->bson_type_data.regex.has_pattern = true; _bson_json_buf_set (&bson->bson_type_buf[0], val, vlen); break; case BSON_JSON_LF_OPTIONS: bson->bson_type_data.regex.is_legacy = true; /* FALL THROUGH */ case BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS: bson->bson_type_data.regex.has_options = true; _bson_json_buf_set (&bson->bson_type_buf[1], val, vlen); break; case BSON_JSON_LF_OID: if (vlen != 24) { goto BAD_PARSE; } bson->bson_type_data.oid.has_oid = true; bson_oid_init_from_string (&bson->bson_type_data.oid.oid, val_w_null); break; case BSON_JSON_LF_BINARY: case BSON_JSON_LF_TYPE: bson->bson_type_data.binary.is_legacy = true; /* FALL THROUGH */ case BSON_JSON_LF_UUID: _bson_json_parse_binary_elem (reader, val_w_null, vlen); break; case BSON_JSON_LF_INT32: { int64_t v64; if (!_bson_json_read_int64_or_set_error (reader, val, vlen, &v64)) { /* the error is set, return and let the reader exit */ return; } if (v64 < INT32_MIN || v64 > INT32_MAX) { goto BAD_PARSE; } if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { bson->bson_type_data.v_int32.value = (int32_t) v64; } else { goto BAD_PARSE; } } break; case BSON_JSON_LF_INT64: { int64_t v64; if (!_bson_json_read_int64_or_set_error (reader, val, vlen, &v64)) { /* the error is set, return and let the reader exit */ return; } if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { bson->bson_type_data.v_int64.value = v64; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG) { bson->bson_type_data.date.has_date = true; bson->bson_type_data.date.date = v64; } else { goto BAD_PARSE; } } break; case BSON_JSON_LF_DOUBLE: { if (!_bson_json_parse_double (reader, (const char *) val, vlen, &bson->bson_type_data.v_double.value)) { /* the error is set, return and let the reader exit */ return; } } break; case BSON_JSON_LF_DATE: { int64_t v64; if (!_bson_iso8601_date_parse ( (char *) val, (int) vlen, &v64, reader->error)) { jsonsl_stop (reader->json); } else { bson->bson_type_data.date.has_date = true; bson->bson_type_data.date.date = v64; } } break; case BSON_JSON_LF_DECIMAL128: { bson_decimal128_t decimal128; if (bson_decimal128_from_string (val_w_null, &decimal128) && bson->read_state == BSON_JSON_IN_BSON_TYPE) { bson->bson_type_data.v_decimal128.value = decimal128; } else { goto BAD_PARSE; } } break; case BSON_JSON_LF_CODE: _bson_json_buf_set (&bson->code_data.code_buf, val, vlen); break; case BSON_JSON_LF_SYMBOL: bson_append_symbol ( STACK_BSON_CHILD, key, (int) len, (const char *) val, (int) vlen); break; case BSON_JSON_LF_SCOPE: case BSON_JSON_LF_TIMESTAMP_T: case BSON_JSON_LF_TIMESTAMP_I: case BSON_JSON_LF_UNDEFINED: case BSON_JSON_LF_MINKEY: case BSON_JSON_LF_MAXKEY: case BSON_JSON_LF_DBPOINTER: default: goto BAD_PARSE; } return; BAD_PARSE: _bson_json_read_set_error (reader, "Invalid input string \"%s\", looking for %s", val_w_null, bson_state_names[bs]); } else { _bson_json_read_set_error ( reader, "Invalid state to look for string: %s", read_state_names[rs]); } } static void _bson_json_read_start_map (bson_json_reader_t *reader) /* IN */ { BASIC_CB_PREAMBLE; if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { switch (bson->bson_state) { case BSON_JSON_LF_DATE: bson->read_state = BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG; break; case BSON_JSON_LF_BINARY: bson->read_state = BSON_JSON_IN_BSON_TYPE_BINARY_VALUES; break; case BSON_JSON_LF_TYPE: /* special case, we started parsing {$type: {$numberInt: "2"}} and we * expected a legacy Binary format. now we see the second "{", so * backtrack and parse $type query operator. */ bson->read_state = BSON_JSON_IN_START_MAP; BSON_ASSERT (bson_in_range_unsigned (int, len)); STACK_PUSH_DOC (bson_append_document_begin ( STACK_BSON_PARENT, key, (int) len, STACK_BSON_CHILD)); _bson_json_save_map_key (bson, (const uint8_t *) "$type", 5); break; case BSON_JSON_LF_CODE: case BSON_JSON_LF_DECIMAL128: case BSON_JSON_LF_DOUBLE: case BSON_JSON_LF_INT32: case BSON_JSON_LF_INT64: case BSON_JSON_LF_MAXKEY: case BSON_JSON_LF_MINKEY: case BSON_JSON_LF_OID: case BSON_JSON_LF_OPTIONS: case BSON_JSON_LF_REGEX: /** * NOTE: A read_state of BSON_JSON_IN_BSON_TYPE is used when "$regex" is * found, but BSON_JSON_IN_BSON_TYPE_REGEX_STARTMAP is used for * "$regularExpression", which will instead go to a below 'if else' branch * instead of this switch statement. They're both called "regex" in their * respective enumerators, but they behave differently when parsing. */ // fallthrough case BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS: case BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN: case BSON_JSON_LF_SYMBOL: case BSON_JSON_LF_UNDEFINED: case BSON_JSON_LF_UUID: // These special keys do not expect objects as their values. Fail. _bson_json_read_set_error ( reader, "Unexpected nested object value for \"%s\" key", reader->bson.unescaped.buf); break; case BSON_JSON_LF_DBPOINTER: case BSON_JSON_LF_SCOPE: case BSON_JSON_LF_TIMESTAMP_I: case BSON_JSON_LF_TIMESTAMP_T: default: // These special LF keys aren't handled with BSON_JSON_IN_BSON_TYPE BSON_UNREACHABLE ( "These LF values are handled with a different read_state"); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_STARTMAP) { bson->read_state = BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_SCOPE_STARTMAP) { bson->read_state = BSON_JSON_IN_SCOPE; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP) { bson->read_state = BSON_JSON_IN_DBPOINTER; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_REGEX_STARTMAP) { bson->read_state = BSON_JSON_IN_BSON_TYPE_REGEX_VALUES; } else { bson->read_state = BSON_JSON_IN_START_MAP; } /* silence some warnings */ (void) len; (void) key; } static bool _is_known_key (const char *key, size_t len) { bool ret; #define IS_KEY(k) (len == strlen (k) && (0 == memcmp (k, key, len))) ret = (IS_KEY ("$regularExpression") || IS_KEY ("$regex") || IS_KEY ("$options") || IS_KEY ("$code") || IS_KEY ("$scope") || IS_KEY ("$oid") || IS_KEY ("$binary") || IS_KEY ("$type") || IS_KEY ("$date") || IS_KEY ("$undefined") || IS_KEY ("$maxKey") || IS_KEY ("$minKey") || IS_KEY ("$timestamp") || IS_KEY ("$numberInt") || IS_KEY ("$numberLong") || IS_KEY ("$numberDouble") || IS_KEY ("$numberDecimal") || IS_KEY ("$numberInt") || IS_KEY ("$numberLong") || IS_KEY ("$numberDouble") || IS_KEY ("$numberDecimal") || IS_KEY ("$dbPointer") || IS_KEY ("$symbol") || IS_KEY ("$uuid")); #undef IS_KEY return ret; } static void _bson_json_save_map_key (bson_json_reader_bson_t *bson, const uint8_t *val, size_t len) { _bson_json_buf_set (&bson->key_buf, val, len); bson->key = (const char *) bson->key_buf.buf; } static void _bson_json_read_code_or_scope_key (bson_json_reader_bson_t *bson, bool is_scope, const uint8_t *val, size_t len) { bson_json_code_t *code = &bson->code_data; if (code->in_scope) { /* we're reading something weirdly nested, e.g. we just read "$code" in * "$scope: {x: {$code: {}}}". just create the subdoc within the scope. */ bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DOC (bson_append_document_begin (STACK_BSON_PARENT, bson->key, (int) bson->key_buf.len, STACK_BSON_CHILD)); _bson_json_save_map_key (bson, val, len); } else { if (!bson->code_data.key_buf.len) { /* save the key, e.g. {"key": {"$code": "return x", "$scope":{"x":1}}}, * in case it is overwritten while parsing scope sub-object */ _bson_json_buf_set ( &bson->code_data.key_buf, bson->key, bson->key_buf.len); } if (is_scope) { bson->bson_type = BSON_TYPE_CODEWSCOPE; bson->read_state = BSON_JSON_IN_BSON_TYPE_SCOPE_STARTMAP; bson->bson_state = BSON_JSON_LF_SCOPE; bson->code_data.has_scope = true; } else { bson->bson_type = BSON_TYPE_CODE; bson->bson_state = BSON_JSON_LF_CODE; bson->code_data.has_code = true; } } } static void _bson_json_bad_key_in_type (bson_json_reader_t *reader, /* IN */ const uint8_t *val) /* IN */ { bson_json_reader_bson_t *bson = &reader->bson; _bson_json_read_set_error ( reader, "Invalid key \"%s\". Looking for values for type \"%s\"", val, _bson_json_type_name (bson->bson_type)); } static void _bson_json_read_map_key (bson_json_reader_t *reader, /* IN */ const uint8_t *val, /* IN */ size_t len) /* IN */ { bson_json_reader_bson_t *bson = &reader->bson; if (!bson_utf8_validate ((const char *) val, len, false /* allow null */)) { _bson_json_read_corrupt (reader, "invalid bytes in UTF8 string"); return; } if (bson->read_state == BSON_JSON_IN_START_MAP) { if (len > 0 && val[0] == '$' && _is_known_key ((const char *) val, len) && bson->n >= 0 /* key is in subdocument */) { bson->read_state = BSON_JSON_IN_BSON_TYPE; bson->bson_type = (bson_type_t) 0; memset (&bson->bson_type_data, 0, sizeof bson->bson_type_data); } else { bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DOC (bson_append_document_begin (STACK_BSON_PARENT, bson->key, (int) bson->key_buf.len, STACK_BSON_CHILD)); } } else if (bson->read_state == BSON_JSON_IN_SCOPE) { /* we've read "key" in {$code: "", $scope: {key: ""}}*/ bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_SCOPE; _bson_json_save_map_key (bson, val, len); } else if (bson->read_state == BSON_JSON_IN_DBPOINTER) { /* we've read "$ref" or "$id" in {$dbPointer: {$ref: ..., $id: ...}} */ bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DBPOINTER; _bson_json_save_map_key (bson, val, len); } if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { HANDLE_OPTION (if, "$regex", BSON_TYPE_REGEX, BSON_JSON_LF_REGEX) HANDLE_OPTION (else if, "$options", BSON_TYPE_REGEX, BSON_JSON_LF_OPTIONS) HANDLE_OPTION (else if, "$oid", BSON_TYPE_OID, BSON_JSON_LF_OID) HANDLE_OPTION (else if, "$binary", BSON_TYPE_BINARY, BSON_JSON_LF_BINARY) HANDLE_OPTION (else if, "$type", BSON_TYPE_BINARY, BSON_JSON_LF_TYPE) HANDLE_OPTION (else if, "$uuid", BSON_TYPE_BINARY, BSON_JSON_LF_UUID) HANDLE_OPTION (else if, "$date", BSON_TYPE_DATE_TIME, BSON_JSON_LF_DATE) HANDLE_OPTION ( else if, "$undefined", BSON_TYPE_UNDEFINED, BSON_JSON_LF_UNDEFINED) HANDLE_OPTION (else if, "$minKey", BSON_TYPE_MINKEY, BSON_JSON_LF_MINKEY) HANDLE_OPTION (else if, "$maxKey", BSON_TYPE_MAXKEY, BSON_JSON_LF_MAXKEY) HANDLE_OPTION (else if, "$numberInt", BSON_TYPE_INT32, BSON_JSON_LF_INT32) HANDLE_OPTION ( else if, "$numberLong", BSON_TYPE_INT64, BSON_JSON_LF_INT64) HANDLE_OPTION ( else if, "$numberDouble", BSON_TYPE_DOUBLE, BSON_JSON_LF_DOUBLE) HANDLE_OPTION (else if, "$symbol", BSON_TYPE_SYMBOL, BSON_JSON_LF_SYMBOL) HANDLE_OPTION (else if, "$numberDecimal", BSON_TYPE_DECIMAL128, BSON_JSON_LF_DECIMAL128) else if (!strcmp ("$timestamp", (const char *) val)) { bson->bson_type = BSON_TYPE_TIMESTAMP; bson->read_state = BSON_JSON_IN_BSON_TYPE_TIMESTAMP_STARTMAP; } else if (!strcmp ("$regularExpression", (const char *) val)) { bson->bson_type = BSON_TYPE_REGEX; bson->read_state = BSON_JSON_IN_BSON_TYPE_REGEX_STARTMAP; } else if (!strcmp ("$dbPointer", (const char *) val)) { /* start parsing "key": {"$dbPointer": {...}}, save "key" for later */ _bson_json_buf_set ( &bson->dbpointer_key, bson->key, bson->key_buf.len); bson->bson_type = BSON_TYPE_DBPOINTER; bson->read_state = BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP; } else if (!strcmp ("$code", (const char *) val)) { _bson_json_read_code_or_scope_key ( bson, false /* is_scope */, val, len); } else if (!strcmp ("$scope", (const char *) val)) { _bson_json_read_code_or_scope_key ( bson, true /* is_scope */, val, len); } else { _bson_json_bad_key_in_type (reader, val); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG) { HANDLE_OPTION (if, "$numberLong", BSON_TYPE_DATE_TIME, BSON_JSON_LF_INT64) else { _bson_json_bad_key_in_type (reader, val); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES) { HANDLE_OPTION (if, "t", BSON_TYPE_TIMESTAMP, BSON_JSON_LF_TIMESTAMP_T) HANDLE_OPTION ( else if, "i", BSON_TYPE_TIMESTAMP, BSON_JSON_LF_TIMESTAMP_I) else { _bson_json_bad_key_in_type (reader, val); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_REGEX_VALUES) { HANDLE_OPTION (if, "pattern", BSON_TYPE_REGEX, BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN) HANDLE_OPTION (else if, "options", BSON_TYPE_REGEX, BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS) else { _bson_json_bad_key_in_type (reader, val); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_BINARY_VALUES) { HANDLE_OPTION (if, "base64", BSON_TYPE_BINARY, BSON_JSON_LF_BINARY) HANDLE_OPTION (else if, "subType", BSON_TYPE_BINARY, BSON_JSON_LF_TYPE) else { _bson_json_bad_key_in_type (reader, val); } } else { _bson_json_save_map_key (bson, val, len); } } static void _bson_json_read_append_binary (bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { bson_json_bson_data_t *data = &bson->bson_type_data; if (data->binary.is_legacy) { if (!data->binary.has_binary) { _bson_json_read_set_error ( reader, "Missing \"$binary\" after \"$type\" reading type \"binary\""); return; } else if (!data->binary.has_subtype) { _bson_json_read_set_error ( reader, "Missing \"$type\" after \"$binary\" reading type \"binary\""); return; } } else { if (!data->binary.has_binary) { _bson_json_read_set_error ( reader, "Missing \"base64\" after \"subType\" reading type \"binary\""); return; } else if (!data->binary.has_subtype) { _bson_json_read_set_error ( reader, "Missing \"subType\" after \"base64\" reading type \"binary\""); return; } } if (!bson_append_binary (STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len, data->binary.type, bson->bson_type_buf[0].buf, (uint32_t) bson->bson_type_buf[0].len)) { _bson_json_read_set_error (reader, "Error storing binary data"); } } static void _bson_json_read_append_regex (bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { bson_json_bson_data_t *data = &bson->bson_type_data; if (data->regex.is_legacy) { if (!data->regex.has_pattern) { _bson_json_read_set_error (reader, "Missing \"$regex\" after \"$options\""); return; } } else if (!data->regex.has_pattern) { _bson_json_read_set_error ( reader, "Missing \"pattern\" after \"options\" in regular expression"); return; } else if (!data->regex.has_options) { _bson_json_read_set_error ( reader, "Missing \"options\" after \"pattern\" in regular expression"); return; } if (!bson_append_regex (STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len, (char *) bson->bson_type_buf[0].buf, (char *) bson->bson_type_buf[1].buf)) { _bson_json_read_set_error (reader, "Error storing regex"); } } static void _bson_json_read_append_code (bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { bson_json_code_t *code_data; char *code = NULL; bson_t *scope = NULL; bool r; code_data = &bson->code_data; BSON_ASSERT (!code_data->in_scope); if (!code_data->has_code) { _bson_json_read_set_error (reader, "Missing $code after $scope"); return; } code = (char *) code_data->code_buf.buf; if (code_data->has_scope) { scope = STACK_BSON (1); } /* creates BSON "code" elem, or "code with scope" if scope is not NULL */ r = bson_append_code_with_scope (STACK_BSON_CHILD, (const char *) code_data->key_buf.buf, (int) code_data->key_buf.len, code, scope); if (!r) { _bson_json_read_set_error (reader, "Error storing Javascript code"); } /* keep the buffer but truncate it */ code_data->key_buf.len = 0; code_data->has_code = code_data->has_scope = false; } static void _bson_json_read_append_dbpointer (bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { bson_t *db_pointer; bson_iter_t iter; const char *ns = NULL; const bson_oid_t *oid = NULL; bool r; BSON_ASSERT (reader->bson.dbpointer_key.buf); db_pointer = STACK_BSON (1); if (!bson_iter_init (&iter, db_pointer)) { _bson_json_read_set_error (reader, "Error storing DBPointer"); return; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "$id")) { if (!BSON_ITER_HOLDS_OID (&iter)) { _bson_json_read_set_error ( reader, "$dbPointer.$id must be like {\"$oid\": ...\"}"); return; } oid = bson_iter_oid (&iter); } else if (!strcmp (bson_iter_key (&iter), "$ref")) { if (!BSON_ITER_HOLDS_UTF8 (&iter)) { _bson_json_read_set_error ( reader, "$dbPointer.$ref must be a string like \"db.collection\""); return; } ns = bson_iter_utf8 (&iter, NULL); } else { _bson_json_read_set_error (reader, "$dbPointer contains invalid key: \"%s\"", bson_iter_key (&iter)); return; } } if (!oid || !ns) { _bson_json_read_set_error (reader, "$dbPointer requires both $id and $ref"); return; } r = bson_append_dbpointer (STACK_BSON_CHILD, (char *) reader->bson.dbpointer_key.buf, (int) reader->bson.dbpointer_key.len, ns, oid); if (!r) { _bson_json_read_set_error (reader, "Error storing DBPointer"); } } static void _bson_json_read_append_oid (bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { if (!bson_append_oid (STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len, &bson->bson_type_data.oid.oid)) { _bson_json_read_set_error (reader, "Error storing ObjectId"); } } static void _bson_json_read_append_date_time (bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { if (!bson_append_date_time (STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len, bson->bson_type_data.date.date)) { _bson_json_read_set_error (reader, "Error storing datetime"); } } static void _bson_json_read_append_timestamp (bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { if (!bson->bson_type_data.timestamp.has_t) { _bson_json_read_set_error ( reader, "Missing t after $timestamp in BSON_TYPE_TIMESTAMP"); return; } else if (!bson->bson_type_data.timestamp.has_i) { _bson_json_read_set_error ( reader, "Missing i after $timestamp in BSON_TYPE_TIMESTAMP"); return; } bson_append_timestamp (STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len, bson->bson_type_data.timestamp.t, bson->bson_type_data.timestamp.i); } static void _bad_extended_json (bson_json_reader_t *reader) { _bson_json_read_corrupt (reader, "Invalid MongoDB extended JSON"); } static void _bson_json_read_end_map (bson_json_reader_t *reader) /* IN */ { bson_json_reader_bson_t *bson = &reader->bson; bool r = true; if (bson->read_state == BSON_JSON_IN_START_MAP) { bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DOC (bson_append_document_begin (STACK_BSON_PARENT, bson->key, (int) bson->key_buf.len, STACK_BSON_CHILD)); } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_SCOPE_STARTMAP) { bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_SCOPE; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP) { /* we've read last "}" in "{$dbPointer: {$id: ..., $ref: ...}}" */ _bson_json_read_append_dbpointer (reader, bson); bson->read_state = BSON_JSON_REGULAR; return; } if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { if (!bson->key) { /* invalid, like {$numberLong: "1"} at the document top level */ _bad_extended_json (reader); return; } bson->read_state = BSON_JSON_REGULAR; switch (bson->bson_type) { case BSON_TYPE_REGEX: _bson_json_read_append_regex (reader, bson); break; case BSON_TYPE_CODE: case BSON_TYPE_CODEWSCOPE: /* we've read the closing "}" in "{$code: ..., $scope: ...}" */ _bson_json_read_append_code (reader, bson); break; case BSON_TYPE_OID: _bson_json_read_append_oid (reader, bson); break; case BSON_TYPE_BINARY: _bson_json_read_append_binary (reader, bson); break; case BSON_TYPE_DATE_TIME: _bson_json_read_append_date_time (reader, bson); break; case BSON_TYPE_UNDEFINED: r = bson_append_undefined ( STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len); break; case BSON_TYPE_MINKEY: r = bson_append_minkey ( STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len); break; case BSON_TYPE_MAXKEY: r = bson_append_maxkey ( STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len); break; case BSON_TYPE_INT32: r = bson_append_int32 (STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len, bson->bson_type_data.v_int32.value); break; case BSON_TYPE_INT64: r = bson_append_int64 (STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len, bson->bson_type_data.v_int64.value); break; case BSON_TYPE_DOUBLE: r = bson_append_double (STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len, bson->bson_type_data.v_double.value); break; case BSON_TYPE_DECIMAL128: r = bson_append_decimal128 (STACK_BSON_CHILD, bson->key, (int) bson->key_buf.len, &bson->bson_type_data.v_decimal128.value); break; case BSON_TYPE_DBPOINTER: /* shouldn't set type to DBPointer unless inside $dbPointer: {...} */ _bson_json_read_set_error ( reader, "Internal error: shouldn't be in state BSON_TYPE_DBPOINTER"); break; case BSON_TYPE_SYMBOL: break; case BSON_TYPE_EOD: case BSON_TYPE_UTF8: case BSON_TYPE_DOCUMENT: case BSON_TYPE_ARRAY: case BSON_TYPE_BOOL: case BSON_TYPE_NULL: case BSON_TYPE_TIMESTAMP: default: _bson_json_read_set_error ( reader, "Internal error: can't parse JSON wrapper for type \"%s\"", _bson_json_type_name (bson->bson_type)); break; } if (!r) { _bson_json_read_set_error ( reader, "Cannot append value at end of JSON object for key %s", bson->key); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES) { if (!bson->key) { _bad_extended_json (reader); return; } bson->read_state = BSON_JSON_IN_BSON_TYPE_TIMESTAMP_ENDMAP; _bson_json_read_append_timestamp (reader, bson); return; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_REGEX_VALUES) { if (!bson->key) { _bad_extended_json (reader); return; } bson->read_state = BSON_JSON_IN_BSON_TYPE_REGEX_ENDMAP; _bson_json_read_append_regex (reader, bson); return; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_BINARY_VALUES) { if (!bson->key) { _bad_extended_json (reader); return; } bson->read_state = BSON_JSON_IN_BSON_TYPE_BINARY_ENDMAP; _bson_json_read_append_binary (reader, bson); return; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_ENDMAP) { bson->read_state = BSON_JSON_REGULAR; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_REGEX_ENDMAP) { bson->read_state = BSON_JSON_REGULAR; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_BINARY_ENDMAP) { bson->read_state = BSON_JSON_REGULAR; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG) { if (!bson->key) { _bad_extended_json (reader); return; } bson->read_state = BSON_JSON_IN_BSON_TYPE_DATE_ENDMAP; _bson_json_read_append_date_time (reader, bson); return; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DATE_ENDMAP) { bson->read_state = BSON_JSON_REGULAR; } else if (bson->read_state == BSON_JSON_REGULAR) { if (STACK_IS_SCOPE) { bson->read_state = BSON_JSON_IN_BSON_TYPE; bson->bson_type = BSON_TYPE_CODE; STACK_POP_SCOPE; } else if (STACK_IS_DBPOINTER) { bson->read_state = BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP; STACK_POP_DBPOINTER; } else { STACK_POP_DOC ( bson_append_document_end (STACK_BSON_PARENT, STACK_BSON_CHILD)); } if (bson->n == -1) { bson->read_state = BSON_JSON_DONE; } } else if (bson->read_state == BSON_JSON_IN_SCOPE) { /* empty $scope */ BSON_ASSERT (bson->code_data.has_scope); STACK_PUSH_SCOPE; STACK_POP_SCOPE; bson->read_state = BSON_JSON_IN_BSON_TYPE; bson->bson_type = BSON_TYPE_CODE; } else if (bson->read_state == BSON_JSON_IN_DBPOINTER) { /* empty $dbPointer??? */ _bson_json_read_set_error (reader, "Empty $dbPointer"); } else { _bson_json_read_set_error ( reader, "Invalid state \"%s\"", read_state_names[bson->read_state]); } } static void _bson_json_read_start_array (bson_json_reader_t *reader) /* IN */ { const char *key; size_t len; bson_json_reader_bson_t *bson = &reader->bson; if (bson->read_state != BSON_JSON_REGULAR) { _bson_json_read_set_error (reader, "Invalid read of \"[\" in state \"%s\"", read_state_names[bson->read_state]); return; } if (bson->n == -1) { STACK_PUSH_ARRAY (_noop ()); } else { _bson_json_read_fixup_key (bson); key = bson->key; len = bson->key_buf.len; STACK_PUSH_ARRAY (bson_append_array_begin ( STACK_BSON_PARENT, key, (int) len, STACK_BSON_CHILD)); } } static void _bson_json_read_end_array (bson_json_reader_t *reader) /* IN */ { bson_json_reader_bson_t *bson = &reader->bson; if (bson->read_state != BSON_JSON_REGULAR) { _bson_json_read_set_error (reader, "Invalid read of \"]\" in state \"%s\"", read_state_names[bson->read_state]); return; } STACK_POP_ARRAY ( bson_append_array_end (STACK_BSON_PARENT, STACK_BSON_CHILD)); if (bson->n == -1) { bson->read_state = BSON_JSON_DONE; } } /* put unescaped text in reader->bson.unescaped, or set reader->error. * json_text has length len and it is not null-terminated. */ static bool _bson_json_unescape (bson_json_reader_t *reader, struct jsonsl_state_st *state, const char *json_text, ssize_t len) { bson_json_reader_bson_t *reader_bson; jsonsl_error_t err; reader_bson = &reader->bson; /* add 1 for NULL */ _bson_json_buf_ensure (&reader_bson->unescaped, (size_t) len + 1); /* length of unescaped str is always <= len */ reader_bson->unescaped.len = jsonsl_util_unescape ( json_text, (char *) reader_bson->unescaped.buf, (size_t) len, NULL, &err); if (err != JSONSL_ERROR_SUCCESS) { bson_set_error (reader->error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "error near position %d: \"%s\"", (int) state->pos_begin, jsonsl_strerror (err)); return false; } reader_bson->unescaped.buf[reader_bson->unescaped.len] = '\0'; return true; } /* read the buffered JSON plus new data, and fill out @len with its length */ static const char * _get_json_text (jsonsl_t json, /* IN */ struct jsonsl_state_st *state, /* IN */ const char *buf /* IN */, ssize_t *len /* OUT */) { bson_json_reader_t *reader; ssize_t bytes_available; reader = (bson_json_reader_t *) json->data; BSON_ASSERT (state->pos_cur > state->pos_begin); *len = (ssize_t) (state->pos_cur - state->pos_begin); bytes_available = buf - json->base; if (*len <= bytes_available) { /* read directly from stream, not from saved JSON */ return buf - (size_t) *len; } else { /* combine saved text with new data from the jsonsl_t */ ssize_t append = buf - json->base; if (append > 0) { _bson_json_buf_append ( &reader->tok_accumulator, buf - append, (size_t) append); } return (const char *) reader->tok_accumulator.buf; } } static void _push_callback (jsonsl_t json, jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf) { bson_json_reader_t *reader = (bson_json_reader_t *) json->data; BSON_UNUSED (action); BSON_UNUSED (buf); switch (state->type) { case JSONSL_T_STRING: case JSONSL_T_HKEY: case JSONSL_T_SPECIAL: case JSONSL_T_UESCAPE: reader->json_text_pos = state->pos_begin; break; case JSONSL_T_OBJECT: _bson_json_read_start_map (reader); break; case JSONSL_T_LIST: _bson_json_read_start_array (reader); break; default: break; } } static void _pop_callback (jsonsl_t json, jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf) { bson_json_reader_t *reader; bson_json_reader_bson_t *reader_bson; ssize_t len; double d; const char *obj_text; BSON_UNUSED (action); reader = (bson_json_reader_t *) json->data; reader_bson = &reader->bson; switch (state->type) { case JSONSL_T_HKEY: case JSONSL_T_STRING: obj_text = _get_json_text (json, state, buf, &len); BSON_ASSERT (obj_text[0] == '"'); /* remove start/end quotes, replace backslash-escapes, null-terminate */ /* you'd think it would be faster to check if state->nescapes > 0 first, * but tests show no improvement */ if (!_bson_json_unescape (reader, state, obj_text + 1, len - 1)) { /* reader->error is set */ jsonsl_stop (json); break; } if (state->type == JSONSL_T_HKEY) { _bson_json_read_map_key ( reader, reader_bson->unescaped.buf, reader_bson->unescaped.len); } else { _bson_json_read_string ( reader, reader_bson->unescaped.buf, reader_bson->unescaped.len); } break; case JSONSL_T_OBJECT: _bson_json_read_end_map (reader); break; case JSONSL_T_LIST: _bson_json_read_end_array (reader); break; case JSONSL_T_SPECIAL: obj_text = _get_json_text (json, state, buf, &len); if (state->special_flags & JSONSL_SPECIALf_NUMNOINT) { if (_bson_json_parse_double (reader, obj_text, (size_t) len, &d)) { _bson_json_read_double (reader, d); } } else if (state->special_flags & JSONSL_SPECIALf_NUMERIC) { /* jsonsl puts the unsigned value in state->nelem */ _bson_json_read_integer ( reader, state->nelem, state->special_flags & JSONSL_SPECIALf_SIGNED ? -1 : 1); } else if (state->special_flags & JSONSL_SPECIALf_BOOLEAN) { _bson_json_read_boolean (reader, obj_text[0] == 't' ? 1 : 0); } else if (state->special_flags & JSONSL_SPECIALf_NULL) { _bson_json_read_null (reader); } break; default: break; } reader->json_text_pos = -1; reader->tok_accumulator.len = 0; } static int _error_callback (jsonsl_t json, jsonsl_error_t err, struct jsonsl_state_st *state, char *errat) { bson_json_reader_t *reader = (bson_json_reader_t *) json->data; BSON_UNUSED (state); if (err == JSONSL_ERROR_CANT_INSERT && *errat == '{') { /* start the next document */ reader->should_reset = true; reader->advance = errat - json->base; return 0; } bson_set_error (reader->error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error at \"%c\", position %d: \"%s\"", *errat, (int) json->pos, jsonsl_strerror (err)); return 0; } /* *-------------------------------------------------------------------------- * * bson_json_reader_read -- * * Read the next json document from @reader and write its value * into @bson. @bson will be allocated as part of this process. * * @bson MUST be initialized before calling this function as it * will not be initialized automatically. The reasoning for this * is so that you can chain together bson_json_reader_t with * other components like bson_writer_t. * * Returns: * 1 if successful and data was read. * 0 if successful and no data was read. * -1 if there was an error and @error is set. * * Side effects: * @error may be set. * *-------------------------------------------------------------------------- */ int bson_json_reader_read (bson_json_reader_t *reader, /* IN */ bson_t *bson, /* IN */ bson_error_t *error) /* OUT */ { bson_json_reader_producer_t *p; ssize_t start_pos; ssize_t r; ssize_t buf_offset; ssize_t accum; bson_error_t error_tmp; int ret = 0; BSON_ASSERT (reader); BSON_ASSERT (bson); p = &reader->producer; reader->bson.bson = bson; reader->bson.n = -1; reader->bson.read_state = BSON_JSON_REGULAR; reader->error = error ? error : &error_tmp; memset (reader->error, 0, sizeof (bson_error_t)); for (;;) { start_pos = reader->json->pos; if (p->bytes_read > 0) { /* leftover data from previous JSON doc in the stream */ r = p->bytes_read; } else { /* read a chunk of bytes by executing the callback */ r = p->cb (p->data, p->buf, p->buf_size); } if (r < 0) { if (error) { bson_set_error (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CB_FAILURE, "reader cb failed"); } ret = -1; goto cleanup; } else if (r == 0) { break; } else { ret = 1; p->bytes_read = (size_t) r; jsonsl_feed (reader->json, (const jsonsl_char_t *) p->buf, (size_t) r); if (reader->should_reset) { /* end of a document */ jsonsl_reset (reader->json); reader->should_reset = false; /* advance past already-parsed data */ memmove (p->buf, p->buf + reader->advance, r - reader->advance); p->bytes_read -= reader->advance; ret = 1; goto cleanup; } if (reader->error->domain) { ret = -1; goto cleanup; } /* accumulate a key or string value */ if (reader->json_text_pos != -1) { if (bson_cmp_less_su (reader->json_text_pos, reader->json->pos)) { BSON_ASSERT ( bson_in_range_unsigned (ssize_t, reader->json->pos)); accum = BSON_MIN ( (ssize_t) reader->json->pos - reader->json_text_pos, r); /* if this chunk stopped mid-token, buf_offset is how far into * our current chunk the token begins. */ buf_offset = AT_LEAST_0 (reader->json_text_pos - start_pos); _bson_json_buf_append (&reader->tok_accumulator, p->buf + buf_offset, (size_t) accum); } } p->bytes_read = 0; } } cleanup: if (ret == 1 && reader->bson.read_state != BSON_JSON_DONE) { /* data ended in the middle */ _bson_json_read_corrupt (reader, "%s", "Incomplete JSON"); return -1; } return ret; } bson_json_reader_t * bson_json_reader_new (void *data, /* IN */ bson_json_reader_cb cb, /* IN */ bson_json_destroy_cb dcb, /* IN */ bool allow_multiple, /* unused */ size_t buf_size) /* IN */ { bson_json_reader_t *r; bson_json_reader_producer_t *p; BSON_UNUSED (allow_multiple); r = BSON_ALIGNED_ALLOC0 (bson_json_reader_t); r->json = jsonsl_new (STACK_MAX); r->json->error_callback = _error_callback; r->json->action_callback_PUSH = _push_callback; r->json->action_callback_POP = _pop_callback; r->json->data = r; r->json_text_pos = -1; jsonsl_enable_all_callbacks (r->json); p = &r->producer; p->data = data; p->cb = cb; p->dcb = dcb; p->buf_size = buf_size ? buf_size : BSON_JSON_DEFAULT_BUF_SIZE; p->buf = bson_malloc (p->buf_size); return r; } void bson_json_reader_destroy (bson_json_reader_t *reader) /* IN */ { int i; bson_json_reader_producer_t *p; bson_json_reader_bson_t *b; if (!reader) { return; } p = &reader->producer; b = &reader->bson; if (reader->producer.dcb) { reader->producer.dcb (reader->producer.data); } bson_free (p->buf); bson_free (b->key_buf.buf); bson_free (b->unescaped.buf); bson_free (b->dbpointer_key.buf); /* destroy each bson_t initialized in parser stack frames */ for (i = 1; i < STACK_MAX; i++) { if (b->stack[i].type == BSON_JSON_FRAME_INITIAL) { /* highest the stack grew */ break; } if (FRAME_TYPE_HAS_BSON (b->stack[i].type)) { bson_destroy (&b->stack[i].bson); } } for (i = 0; i < 3; i++) { bson_free (b->bson_type_buf[i].buf); } _bson_json_code_cleanup (&b->code_data); jsonsl_destroy (reader->json); bson_free (reader->tok_accumulator.buf); bson_free (reader); } void bson_json_opts_set_outermost_array (bson_json_opts_t *opts, bool is_outermost_array) { opts->is_outermost_array = is_outermost_array; } typedef struct { const uint8_t *data; size_t len; size_t bytes_parsed; } bson_json_data_reader_t; static ssize_t _bson_json_data_reader_cb (void *_ctx, uint8_t *buf, size_t len) { size_t bytes; bson_json_data_reader_t *ctx = (bson_json_data_reader_t *) _ctx; if (!ctx->data) { return -1; } bytes = BSON_MIN (len, ctx->len - ctx->bytes_parsed); memcpy (buf, ctx->data + ctx->bytes_parsed, bytes); ctx->bytes_parsed += bytes; return bytes; } bson_json_reader_t * bson_json_data_reader_new (bool allow_multiple, /* IN */ size_t size) /* IN */ { bson_json_data_reader_t *dr = bson_malloc0 (sizeof *dr); return bson_json_reader_new ( dr, &_bson_json_data_reader_cb, &bson_free, allow_multiple, size); } void bson_json_data_reader_ingest (bson_json_reader_t *reader, /* IN */ const uint8_t *data, /* IN */ size_t len) /* IN */ { bson_json_data_reader_t *ctx = (bson_json_data_reader_t *) reader->producer.data; ctx->data = data; ctx->len = len; ctx->bytes_parsed = 0; } bson_t * bson_new_from_json (const uint8_t *data, /* IN */ ssize_t len, /* IN */ bson_error_t *error) /* OUT */ { bson_json_reader_t *reader; bson_t *bson; int r; BSON_ASSERT (data); if (len < 0) { len = (ssize_t) strlen ((const char *) data); } bson = bson_new (); reader = bson_json_data_reader_new (false, BSON_JSON_DEFAULT_BUF_SIZE); bson_json_data_reader_ingest (reader, data, len); r = bson_json_reader_read (reader, bson, error); bson_json_reader_destroy (reader); if (r == 0) { bson_set_error (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Empty JSON string"); } if (r != 1) { bson_destroy (bson); return NULL; } return bson; } bool bson_init_from_json (bson_t *bson, /* OUT */ const char *data, /* IN */ ssize_t len, /* IN */ bson_error_t *error) /* OUT */ { bson_json_reader_t *reader; int r; BSON_ASSERT (bson); BSON_ASSERT (data); if (len < 0) { len = strlen (data); } bson_init (bson); reader = bson_json_data_reader_new (false, BSON_JSON_DEFAULT_BUF_SIZE); bson_json_data_reader_ingest (reader, (const uint8_t *) data, len); r = bson_json_reader_read (reader, bson, error); bson_json_reader_destroy (reader); if (r == 0) { bson_set_error (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Empty JSON string"); } if (r != 1) { bson_destroy (bson); return false; } return true; } static void _bson_json_reader_handle_fd_destroy (void *handle) /* IN */ { bson_json_reader_handle_fd_t *fd = handle; if (fd) { if ((fd->fd != -1) && fd->do_close) { #ifdef _WIN32 _close (fd->fd); #else close (fd->fd); #endif } bson_free (fd); } } static ssize_t _bson_json_reader_handle_fd_read (void *handle, /* IN */ uint8_t *buf, /* IN */ size_t len) /* IN */ { bson_json_reader_handle_fd_t *fd = handle; ssize_t ret = -1; if (fd && (fd->fd != -1)) { again: #ifdef BSON_OS_WIN32 ret = _read (fd->fd, buf, (unsigned int) len); #else ret = read (fd->fd, buf, len); #endif if ((ret == -1) && (errno == EAGAIN)) { goto again; } } return ret; } bson_json_reader_t * bson_json_reader_new_from_fd (int fd, /* IN */ bool close_on_destroy) /* IN */ { bson_json_reader_handle_fd_t *handle; BSON_ASSERT (fd != -1); handle = bson_malloc0 (sizeof *handle); handle->fd = fd; handle->do_close = close_on_destroy; return bson_json_reader_new (handle, _bson_json_reader_handle_fd_read, _bson_json_reader_handle_fd_destroy, true, BSON_JSON_DEFAULT_BUF_SIZE); } bson_json_reader_t * bson_json_reader_new_from_file (const char *path, /* IN */ bson_error_t *error) /* OUT */ { char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; char *errmsg; int fd = -1; BSON_ASSERT (path); #ifdef BSON_OS_WIN32 _sopen_s (&fd, path, (_O_RDONLY | _O_BINARY), _SH_DENYNO, _S_IREAD); #else fd = open (path, O_RDONLY); #endif if (fd == -1) { errmsg = bson_strerror_r (errno, errmsg_buf, sizeof errmsg_buf); bson_set_error ( error, BSON_ERROR_READER, BSON_ERROR_READER_BADFD, "%s", errmsg); return NULL; } return bson_json_reader_new_from_fd (fd, true); } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-json.h000066400000000000000000000053771456567454500225210ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_JSON_H #define BSON_JSON_H #include "bson.h" BSON_BEGIN_DECLS typedef struct _bson_json_reader_t bson_json_reader_t; typedef enum { BSON_JSON_ERROR_READ_CORRUPT_JS = 1, BSON_JSON_ERROR_READ_INVALID_PARAM, BSON_JSON_ERROR_READ_CB_FAILURE, } bson_json_error_code_t; /** * BSON_MAX_LEN_UNLIMITED * * Denotes unlimited length limit when converting BSON to JSON. */ #define BSON_MAX_LEN_UNLIMITED -1 /** * bson_json_mode_t: * * This enumeration contains the different modes to serialize BSON into extended * JSON. */ typedef enum { BSON_JSON_MODE_LEGACY, BSON_JSON_MODE_CANONICAL, BSON_JSON_MODE_RELAXED, } bson_json_mode_t; BSON_EXPORT (bson_json_opts_t *) bson_json_opts_new (bson_json_mode_t mode, int32_t max_len); BSON_EXPORT (void) bson_json_opts_destroy (bson_json_opts_t *opts); BSON_EXPORT (void) bson_json_opts_set_outermost_array (bson_json_opts_t *opts, bool is_outermost_array); typedef ssize_t (*bson_json_reader_cb) (void *handle, uint8_t *buf, size_t count); typedef void (*bson_json_destroy_cb) (void *handle); BSON_EXPORT (bson_json_reader_t *) bson_json_reader_new (void *data, bson_json_reader_cb cb, bson_json_destroy_cb dcb, bool allow_multiple, size_t buf_size); BSON_EXPORT (bson_json_reader_t *) bson_json_reader_new_from_fd (int fd, bool close_on_destroy); BSON_EXPORT (bson_json_reader_t *) bson_json_reader_new_from_file (const char *filename, bson_error_t *error); BSON_EXPORT (void) bson_json_reader_destroy (bson_json_reader_t *reader); BSON_EXPORT (int) bson_json_reader_read (bson_json_reader_t *reader, bson_t *bson, bson_error_t *error); BSON_EXPORT (bson_json_reader_t *) bson_json_data_reader_new (bool allow_multiple, size_t size); BSON_EXPORT (void) bson_json_data_reader_ingest (bson_json_reader_t *reader, const uint8_t *data, size_t len); BSON_END_DECLS #endif /* BSON_JSON_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-keys.c000066400000000000000000000226751456567454500225160ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include static const char *gUint32Strs[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100", "101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "123", "124", "125", "126", "127", "128", "129", "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "140", "141", "142", "143", "144", "145", "146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156", "157", "158", "159", "160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172", "173", "174", "175", "176", "177", "178", "179", "180", "181", "182", "183", "184", "185", "186", "187", "188", "189", "190", "191", "192", "193", "194", "195", "196", "197", "198", "199", "200", "201", "202", "203", "204", "205", "206", "207", "208", "209", "210", "211", "212", "213", "214", "215", "216", "217", "218", "219", "220", "221", "222", "223", "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", "254", "255", "256", "257", "258", "259", "260", "261", "262", "263", "264", "265", "266", "267", "268", "269", "270", "271", "272", "273", "274", "275", "276", "277", "278", "279", "280", "281", "282", "283", "284", "285", "286", "287", "288", "289", "290", "291", "292", "293", "294", "295", "296", "297", "298", "299", "300", "301", "302", "303", "304", "305", "306", "307", "308", "309", "310", "311", "312", "313", "314", "315", "316", "317", "318", "319", "320", "321", "322", "323", "324", "325", "326", "327", "328", "329", "330", "331", "332", "333", "334", "335", "336", "337", "338", "339", "340", "341", "342", "343", "344", "345", "346", "347", "348", "349", "350", "351", "352", "353", "354", "355", "356", "357", "358", "359", "360", "361", "362", "363", "364", "365", "366", "367", "368", "369", "370", "371", "372", "373", "374", "375", "376", "377", "378", "379", "380", "381", "382", "383", "384", "385", "386", "387", "388", "389", "390", "391", "392", "393", "394", "395", "396", "397", "398", "399", "400", "401", "402", "403", "404", "405", "406", "407", "408", "409", "410", "411", "412", "413", "414", "415", "416", "417", "418", "419", "420", "421", "422", "423", "424", "425", "426", "427", "428", "429", "430", "431", "432", "433", "434", "435", "436", "437", "438", "439", "440", "441", "442", "443", "444", "445", "446", "447", "448", "449", "450", "451", "452", "453", "454", "455", "456", "457", "458", "459", "460", "461", "462", "463", "464", "465", "466", "467", "468", "469", "470", "471", "472", "473", "474", "475", "476", "477", "478", "479", "480", "481", "482", "483", "484", "485", "486", "487", "488", "489", "490", "491", "492", "493", "494", "495", "496", "497", "498", "499", "500", "501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "511", "512", "513", "514", "515", "516", "517", "518", "519", "520", "521", "522", "523", "524", "525", "526", "527", "528", "529", "530", "531", "532", "533", "534", "535", "536", "537", "538", "539", "540", "541", "542", "543", "544", "545", "546", "547", "548", "549", "550", "551", "552", "553", "554", "555", "556", "557", "558", "559", "560", "561", "562", "563", "564", "565", "566", "567", "568", "569", "570", "571", "572", "573", "574", "575", "576", "577", "578", "579", "580", "581", "582", "583", "584", "585", "586", "587", "588", "589", "590", "591", "592", "593", "594", "595", "596", "597", "598", "599", "600", "601", "602", "603", "604", "605", "606", "607", "608", "609", "610", "611", "612", "613", "614", "615", "616", "617", "618", "619", "620", "621", "622", "623", "624", "625", "626", "627", "628", "629", "630", "631", "632", "633", "634", "635", "636", "637", "638", "639", "640", "641", "642", "643", "644", "645", "646", "647", "648", "649", "650", "651", "652", "653", "654", "655", "656", "657", "658", "659", "660", "661", "662", "663", "664", "665", "666", "667", "668", "669", "670", "671", "672", "673", "674", "675", "676", "677", "678", "679", "680", "681", "682", "683", "684", "685", "686", "687", "688", "689", "690", "691", "692", "693", "694", "695", "696", "697", "698", "699", "700", "701", "702", "703", "704", "705", "706", "707", "708", "709", "710", "711", "712", "713", "714", "715", "716", "717", "718", "719", "720", "721", "722", "723", "724", "725", "726", "727", "728", "729", "730", "731", "732", "733", "734", "735", "736", "737", "738", "739", "740", "741", "742", "743", "744", "745", "746", "747", "748", "749", "750", "751", "752", "753", "754", "755", "756", "757", "758", "759", "760", "761", "762", "763", "764", "765", "766", "767", "768", "769", "770", "771", "772", "773", "774", "775", "776", "777", "778", "779", "780", "781", "782", "783", "784", "785", "786", "787", "788", "789", "790", "791", "792", "793", "794", "795", "796", "797", "798", "799", "800", "801", "802", "803", "804", "805", "806", "807", "808", "809", "810", "811", "812", "813", "814", "815", "816", "817", "818", "819", "820", "821", "822", "823", "824", "825", "826", "827", "828", "829", "830", "831", "832", "833", "834", "835", "836", "837", "838", "839", "840", "841", "842", "843", "844", "845", "846", "847", "848", "849", "850", "851", "852", "853", "854", "855", "856", "857", "858", "859", "860", "861", "862", "863", "864", "865", "866", "867", "868", "869", "870", "871", "872", "873", "874", "875", "876", "877", "878", "879", "880", "881", "882", "883", "884", "885", "886", "887", "888", "889", "890", "891", "892", "893", "894", "895", "896", "897", "898", "899", "900", "901", "902", "903", "904", "905", "906", "907", "908", "909", "910", "911", "912", "913", "914", "915", "916", "917", "918", "919", "920", "921", "922", "923", "924", "925", "926", "927", "928", "929", "930", "931", "932", "933", "934", "935", "936", "937", "938", "939", "940", "941", "942", "943", "944", "945", "946", "947", "948", "949", "950", "951", "952", "953", "954", "955", "956", "957", "958", "959", "960", "961", "962", "963", "964", "965", "966", "967", "968", "969", "970", "971", "972", "973", "974", "975", "976", "977", "978", "979", "980", "981", "982", "983", "984", "985", "986", "987", "988", "989", "990", "991", "992", "993", "994", "995", "996", "997", "998", "999"}; /* *-------------------------------------------------------------------------- * * bson_uint32_to_string -- * * Converts @value to a string. * * If @value is from 0 to 1000, it will use a constant string in the * data section of the library. * * If not, a string will be formatted using @str and snprintf(). This * is much slower, of course and therefore we try to optimize it out. * * @strptr will always be set. It will either point to @str or a * constant string. You will want to use this as your key. * * Parameters: * @value: A #uint32_t to convert to string. * @strptr: (out): A pointer to the resulting string. * @str: (out): Storage for a string made with snprintf. * @size: Size of @str. * * Returns: * The number of bytes in the resulting string excluding the NULL * terminator. If the output requires more than @size bytes, then @size * bytes are written and the result is the number of bytes required * (excluding the NULL terminator) * * Side effects: * None. * *-------------------------------------------------------------------------- */ size_t bson_uint32_to_string (uint32_t value, /* IN */ const char **strptr, /* OUT */ char *str, /* OUT */ size_t size) /* IN */ { if (value < 1000) { *strptr = gUint32Strs[value]; if (value < 10) { return 1; } else if (value < 100) { return 2; } else { return 3; } } *strptr = str; return bson_snprintf (str, size, "%u", value); } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-keys.h000066400000000000000000000017121456567454500225100ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_KEYS_H #define BSON_KEYS_H #include #include BSON_BEGIN_DECLS BSON_EXPORT (size_t) bson_uint32_to_string (uint32_t value, const char **strptr, char *str, size_t size); BSON_END_DECLS #endif /* BSON_KEYS_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-macros.h000066400000000000000000000257571456567454500230400ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_MACROS_H #define BSON_MACROS_H #include #ifdef __cplusplus #include #endif #include #if BSON_OS == 1 #define BSON_OS_UNIX #elif BSON_OS == 2 #define BSON_OS_WIN32 #else #error "Unknown operating system." #endif #ifdef __cplusplus #define BSON_BEGIN_DECLS extern "C" { #define BSON_END_DECLS } #else #define BSON_BEGIN_DECLS #define BSON_END_DECLS #endif #if defined(__GNUC__) #define BSON_GNUC_CHECK_VERSION(major, minor) \ ((__GNUC__ > (major)) || \ ((__GNUC__ == (major)) && (__GNUC_MINOR__ >= (minor)))) #else #define BSON_GNUC_CHECK_VERSION(major, minor) 0 #endif #if defined(__GNUC__) #define BSON_GNUC_IS_VERSION(major, minor) \ ((__GNUC__ == (major)) && (__GNUC_MINOR__ == (minor))) #else #define BSON_GNUC_IS_VERSION(major, minor) 0 #endif /* Decorate public functions: * - if BSON_STATIC, we're compiling a static libbson or a program * that uses libbson as a static library. Don't decorate functions. * - else if BSON_COMPILATION, we're compiling a shared libbson, mark * public functions for export from the shared lib * - else, we're compiling a program that uses libbson as a shared library, * mark public functions as DLL imports for Microsoft Visual C */ #ifdef _MSC_VER /* * Microsoft Visual C */ #ifdef BSON_STATIC #define BSON_API #elif defined(BSON_COMPILATION) #define BSON_API __declspec (dllexport) #else #define BSON_API __declspec (dllimport) #endif #define BSON_CALL __cdecl #elif defined(__GNUC__) /* * GCC */ #ifdef BSON_STATIC #define BSON_API #elif defined(BSON_COMPILATION) #define BSON_API __attribute__ ((visibility ("default"))) #else #define BSON_API #endif #define BSON_CALL #else /* * Other compilers */ #define BSON_API #define BSON_CALL #endif #define BSON_EXPORT(type) BSON_API type BSON_CALL #ifdef MIN #define BSON_MIN MIN #elif defined(__cplusplus) #define BSON_MIN(a, b) ((std::min) (a, b)) #elif defined(_MSC_VER) #define BSON_MIN(a, b) ((a) < (b) ? (a) : (b)) #else #define BSON_MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #ifdef MAX #define BSON_MAX MAX #elif defined(__cplusplus) #define BSON_MAX(a, b) ((std::max) (a, b)) #elif defined(_MSC_VER) #define BSON_MAX(a, b) ((a) > (b) ? (a) : (b)) #else #define BSON_MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifdef ABS #define BSON_ABS ABS #else #define BSON_ABS(a) (((a) < 0) ? ((a) * -1) : (a)) #endif #if defined(__cplusplus) && (__cplusplus >= 201103L || defined(_MSVC_LANG)) #define BSON_ALIGNOF(expr) alignof (expr) #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #define BSON_ALIGNOF(expr) _Alignof (expr) #else #if defined(_MSC_VER) #define BSON_ALIGNOF(expr) __alignof (expr) #else #define BSON_ALIGNOF(expr) __alignof__ (expr) #endif #endif // __STDC_VERSION__ >= 201112L #ifdef _MSC_VER // __declspec (align (_N)) only permits integer literals as _N. #ifdef _WIN64 #define BSON_ALIGN_OF_PTR 8 #else #define BSON_ALIGN_OF_PTR 4 #endif #else #define BSON_ALIGN_OF_PTR (BSON_ALIGNOF (void *)) #endif #ifdef BSON_EXTRA_ALIGN #if defined(_MSC_VER) #define BSON_ALIGNED_BEGIN(_N) __declspec (align (_N)) #define BSON_ALIGNED_END(_N) #else #define BSON_ALIGNED_BEGIN(_N) #define BSON_ALIGNED_END(_N) __attribute__ ((aligned (_N))) #endif #else #if defined(_MSC_VER) #define BSON_ALIGNED_BEGIN(_N) __declspec (align (BSON_ALIGN_OF_PTR)) #define BSON_ALIGNED_END(_N) #else #define BSON_ALIGNED_BEGIN(_N) #define BSON_ALIGNED_END(_N) \ __attribute__ (( \ aligned ((_N) > BSON_ALIGN_OF_PTR ? BSON_ALIGN_OF_PTR : (_N)))) #endif #endif #define bson_str_empty(s) (!s[0]) #define bson_str_empty0(s) (!s || !s[0]) #if defined(_MSC_VER) #define BSON_FUNC __FUNCTION__ #else #define BSON_FUNC __func__ #endif #define BSON_ASSERT(test) \ do { \ if (!(BSON_LIKELY (test))) { \ fprintf (stderr, \ "%s:%d %s(): precondition failed: %s\n", \ __FILE__, \ __LINE__, \ BSON_FUNC, \ #test); \ abort (); \ } \ } while (0) /** * @brief Assert the expression `Assertion`, and evaluates to `Value` on * success. */ #define BSON_ASSERT_INLINE(Assertion, Value) \ ((void) ((Assertion) ? (0) \ : ((fprintf (stderr, \ "%s:%d %s(): Assertion '%s' failed", \ __FILE__, \ __LINE__, \ BSON_FUNC, \ #Assertion), \ abort ()), \ 0)), \ Value) /** * @brief Assert that the given pointer is non-NULL, while also evaluating to * that pointer. * * Can be used to inline assertions with a pointer dereference: * * ``` * foo* f = get_foo(); * bar* b = BSON_ASSERT_PTR_INLINE(f)->bar_value; * ``` */ #define BSON_ASSERT_PTR_INLINE(Pointer) \ BSON_ASSERT_INLINE ((Pointer) != NULL, (Pointer)) /* Used for asserting parameters to provide a more precise error message */ #define BSON_ASSERT_PARAM(param) \ do { \ if ((BSON_UNLIKELY (param == NULL))) { \ fprintf (stderr, \ "The parameter: %s, in function %s, cannot be NULL\n", \ #param, \ BSON_FUNC); \ abort (); \ } \ } while (0) /* obsolete macros, preserved for compatibility */ #define BSON_STATIC_ASSERT(s) BSON_STATIC_ASSERT_ (s, __LINE__) #define BSON_STATIC_ASSERT_JOIN(a, b) BSON_STATIC_ASSERT_JOIN2 (a, b) #define BSON_STATIC_ASSERT_JOIN2(a, b) a##b #define BSON_STATIC_ASSERT_(s, l) \ typedef char BSON_STATIC_ASSERT_JOIN (static_assert_test_, \ __LINE__)[(s) ? 1 : -1] /* modern macros */ #define BSON_STATIC_ASSERT2(_name, _s) \ BSON_STATIC_ASSERT2_ (_s, __LINE__, _name) #define BSON_STATIC_ASSERT_JOIN3(_a, _b, _name) \ BSON_STATIC_ASSERT_JOIN4 (_a, _b, _name) #define BSON_STATIC_ASSERT_JOIN4(_a, _b, _name) _a##_b##_name #define BSON_STATIC_ASSERT2_(_s, _l, _name) \ typedef char BSON_STATIC_ASSERT_JOIN3 ( \ static_assert_test_, __LINE__, _name)[(_s) ? 1 : -1] #if defined(__GNUC__) #define BSON_GNUC_PURE __attribute__ ((pure)) #define BSON_GNUC_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) #else #define BSON_GNUC_PURE #define BSON_GNUC_WARN_UNUSED_RESULT #endif #if BSON_GNUC_CHECK_VERSION(4, 0) && !defined(_WIN32) #define BSON_GNUC_NULL_TERMINATED __attribute__ ((sentinel)) #define BSON_GNUC_INTERNAL __attribute__ ((visibility ("hidden"))) #else #define BSON_GNUC_NULL_TERMINATED #define BSON_GNUC_INTERNAL #endif #if defined(__GNUC__) #define BSON_LIKELY(x) __builtin_expect (!!(x), 1) #define BSON_UNLIKELY(x) __builtin_expect (!!(x), 0) #else #define BSON_LIKELY(v) v #define BSON_UNLIKELY(v) v #endif #if defined(__clang__) #define BSON_GNUC_PRINTF(f, v) __attribute__ ((format (printf, f, v))) #elif BSON_GNUC_CHECK_VERSION(4, 4) #define BSON_GNUC_PRINTF(f, v) __attribute__ ((format (gnu_printf, f, v))) #else #define BSON_GNUC_PRINTF(f, v) #endif #if defined(__LP64__) || defined(_LP64) #define BSON_WORD_SIZE 64 #else #define BSON_WORD_SIZE 32 #endif #if defined(_MSC_VER) #define BSON_INLINE __inline #else #define BSON_INLINE __inline__ #endif #ifdef _MSC_VER #define BSON_ENSURE_ARRAY_PARAM_SIZE(_n) #define BSON_TYPEOF decltype #else #define BSON_ENSURE_ARRAY_PARAM_SIZE(_n) static (_n) #define BSON_TYPEOF typeof #endif #if BSON_GNUC_CHECK_VERSION(3, 1) #define BSON_GNUC_DEPRECATED __attribute__ ((__deprecated__)) #else #define BSON_GNUC_DEPRECATED #endif #define BSON_CONCAT_IMPL(a, ...) a##__VA_ARGS__ #define BSON_CONCAT(a, ...) BSON_CONCAT_IMPL (a, __VA_ARGS__) #define BSON_CONCAT3(a, b, c) BSON_CONCAT (a, BSON_CONCAT (b, c)) #define BSON_CONCAT4(a, b, c, d) \ BSON_CONCAT (BSON_CONCAT (a, b), BSON_CONCAT (c, d)) #if BSON_GNUC_CHECK_VERSION(4, 5) #define BSON_GNUC_DEPRECATED_FOR(f) \ __attribute__ ((deprecated ("Use " #f " instead"))) #else #define BSON_GNUC_DEPRECATED_FOR(f) BSON_GNUC_DEPRECATED #endif /** * @brief String-ify the given argument */ #define BSON_STR(...) #__VA_ARGS__ /** * @brief Mark the attached declared entity as "possibly-unused." * * Does nothing on MSVC. */ #if defined(__GNUC__) || defined(__clang__) #define BSON_MAYBE_UNUSED __attribute__ ((unused)) #else #define BSON_MAYBE_UNUSED /* Nothing for other compilers */ #endif /** * @brief Mark a point in the code as unreachable. If the point is reached, the * program will abort with an error message. * * @param What A string to include in the error message if this point is ever * executed. */ #define BSON_UNREACHABLE(What) \ do { \ fprintf (stderr, \ "%s:%d %s(): Unreachable code reached: %s\n", \ __FILE__, \ __LINE__, \ BSON_FUNC, \ What); \ abort (); \ } while (0) /** * @brief Silence warnings for deliberately unused variables or parameters. * * @param expr An unused variable or parameter. * */ #define BSON_UNUSED(expr) \ do { \ (void) (expr); \ } while (0) #endif /* BSON_MACROS_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-md5.c000066400000000000000000000006031456567454500222130ustar00rootroot00000000000000#include #include #include "common-md5-private.h" void bson_md5_init (bson_md5_t *pms) { mcommon_md5_init (pms); } void bson_md5_append (bson_md5_t *pms, const uint8_t *data, uint32_t nbytes) { mcommon_md5_append (pms, data, nbytes); } void bson_md5_finish (bson_md5_t *pms, uint8_t digest[16]) { mcommon_md5_finish (pms, digest); } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-md5.h000066400000000000000000000054521456567454500222270ustar00rootroot00000000000000/* Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgement in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com */ /* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.h is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Removed support for non-ANSI compilers; removed references to Ghostscript; clarified derivation from RFC 1321; now handles byte order either statically or dynamically. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); added conditionalization for C++ compilation from Martin Purschke . 1999-05-03 lpd Original version. */ /* * The following MD5 implementation has been modified to use types as * specified in libbson. */ #include #ifndef BSON_MD5_H #define BSON_MD5_H #include BSON_BEGIN_DECLS typedef struct { uint32_t count[2]; /* message length in bits, lsw first */ uint32_t abcd[4]; /* digest buffer */ uint8_t buf[64]; /* accumulate block */ } bson_md5_t; BSON_EXPORT (void) bson_md5_init (bson_md5_t *pms) BSON_GNUC_DEPRECATED; BSON_EXPORT (void) bson_md5_append (bson_md5_t *pms, const uint8_t *data, uint32_t nbytes) BSON_GNUC_DEPRECATED; BSON_EXPORT (void) bson_md5_finish (bson_md5_t *pms, uint8_t digest[16]) BSON_GNUC_DEPRECATED; BSON_END_DECLS #endif /* BSON_MD5_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-memory.c000066400000000000000000000261101456567454500230370ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include // Ensure size of exported structs are stable. BSON_STATIC_ASSERT2 (bson_mem_vtable_t, sizeof (bson_mem_vtable_t) == sizeof (void *) * 8u); // For compatibility with C standards prior to C11. static void * _aligned_alloc_impl (size_t alignment, size_t num_bytes) #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && \ !defined(_WIN32) && !defined(__ANDROID__) && !defined(_AIX) { return aligned_alloc (alignment, num_bytes); } #elif defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L { void *mem = NULL; // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425. BSON_MAYBE_UNUSED int ret = posix_memalign (&mem, alignment, num_bytes); return mem; } #else { // Fallback to simple malloc even if it does not satisfy alignment // requirements. Note: Visual C++ _aligned_malloc requires using // _aligned_free instead of free and modifies errno on failure, both of which // breaks symmetry with C11 aligned_alloc, so it is deliberately not used. BSON_UNUSED (alignment); return malloc (num_bytes); } #endif static bson_mem_vtable_t gMemVtable = {.malloc = malloc, .calloc = calloc, .realloc = realloc, .free = free, .aligned_alloc = _aligned_alloc_impl, .padding = {0}}; /* *-------------------------------------------------------------------------- * * bson_malloc -- * * Allocates @num_bytes of memory and returns a pointer to it. If * malloc failed to allocate the memory, abort() is called. * * Libbson does not try to handle OOM conditions as it is beyond the * scope of this library to handle so appropriately. * * Parameters: * @num_bytes: The number of bytes to allocate. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_malloc (size_t num_bytes) /* IN */ { void *mem = NULL; if (BSON_LIKELY (num_bytes)) { if (BSON_UNLIKELY (!(mem = gMemVtable.malloc (num_bytes)))) { fprintf (stderr, "Failure to allocate memory in bson_malloc(). errno: %d.\n", errno); abort (); } } return mem; } /* *-------------------------------------------------------------------------- * * bson_malloc0 -- * * Like bson_malloc() except the memory is zeroed first. This is * similar to calloc() except that abort() is called in case of * failure to allocate memory. * * Parameters: * @num_bytes: The number of bytes to allocate. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_malloc0 (size_t num_bytes) /* IN */ { void *mem = NULL; if (BSON_LIKELY (num_bytes)) { if (BSON_UNLIKELY (!(mem = gMemVtable.calloc (1, num_bytes)))) { fprintf (stderr, "Failure to allocate memory in bson_malloc0(). errno: %d.\n", errno); abort (); } } return mem; } /* *-------------------------------------------------------------------------- * * bson_aligned_alloc -- * * Allocates @num_bytes of memory with an alignment of @alignment and * returns a pointer to it. If malloc failed to allocate the memory, * abort() is called. * * Libbson does not try to handle OOM conditions as it is beyond the * scope of this library to handle so appropriately. * * Parameters: * @alignment: The alignment of the allocated bytes of memory. * @num_bytes: The number of bytes to allocate. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_aligned_alloc (size_t alignment /* IN */, size_t num_bytes /* IN */) { void *mem = NULL; if (BSON_LIKELY (num_bytes)) { if (BSON_UNLIKELY ( !(mem = gMemVtable.aligned_alloc (alignment, num_bytes)))) { fprintf (stderr, "Failure to allocate memory in bson_aligned_alloc()\n"); abort (); } } return mem; } /* *-------------------------------------------------------------------------- * * bson_aligned_alloc0 -- * * Like bson_aligned_alloc() except the memory is zeroed after allocation * for convenience. * * Parameters: * @alignment: The alignment of the allocated bytes of memory. * @num_bytes: The number of bytes to allocate. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_aligned_alloc0 (size_t alignment /* IN */, size_t num_bytes /* IN */) { void *mem = NULL; if (BSON_LIKELY (num_bytes)) { if (BSON_UNLIKELY ( !(mem = gMemVtable.aligned_alloc (alignment, num_bytes)))) { fprintf (stderr, "Failure to allocate memory in bson_aligned_alloc0()\n"); abort (); } memset (mem, 0, num_bytes); } return mem; } /* *-------------------------------------------------------------------------- * * bson_realloc -- * * This function behaves similar to realloc() except that if there is * a failure abort() is called. * * Parameters: * @mem: The memory to realloc, or NULL. * @num_bytes: The size of the new allocation or 0 to free. * * Returns: * The new allocation if successful; otherwise abort() is called and * this function never returns. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_realloc (void *mem, /* IN */ size_t num_bytes) /* IN */ { /* * Not all platforms are guaranteed to free() the memory if a call to * realloc() with a size of zero occurs. Windows, Linux, and FreeBSD do, * however, OS X does not. */ if (BSON_UNLIKELY (num_bytes == 0)) { gMemVtable.free (mem); return NULL; } mem = gMemVtable.realloc (mem, num_bytes); if (BSON_UNLIKELY (!mem)) { fprintf (stderr, "Failure to re-allocate memory in bson_realloc(). errno: %d.\n", errno); abort (); } return mem; } /* *-------------------------------------------------------------------------- * * bson_realloc_ctx -- * * This wraps bson_realloc and provides a compatible api for similar * functions with a context * * Parameters: * @mem: The memory to realloc, or NULL. * @num_bytes: The size of the new allocation or 0 to free. * @ctx: Ignored * * Returns: * The new allocation if successful; otherwise abort() is called and * this function never returns. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_realloc_ctx (void *mem, /* IN */ size_t num_bytes, /* IN */ void *ctx) /* IN */ { BSON_UNUSED (ctx); return bson_realloc (mem, num_bytes); } /* *-------------------------------------------------------------------------- * * bson_free -- * * Frees @mem using the underlying allocator. * * Currently, this only calls free() directly, but that is subject to * change. * * Parameters: * @mem: An allocation to free. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_free (void *mem) /* IN */ { gMemVtable.free (mem); } /* *-------------------------------------------------------------------------- * * bson_zero_free -- * * Frees @mem using the underlying allocator. @size bytes of @mem will * be zeroed before freeing the memory. This is useful in scenarios * where @mem contains passwords or other sensitive information. * * Parameters: * @mem: An allocation to free. * @size: The number of bytes in @mem. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_zero_free (void *mem, /* IN */ size_t size) /* IN */ { if (BSON_LIKELY (mem)) { memset (mem, 0, size); gMemVtable.free (mem); } } static void * _aligned_alloc_as_malloc (size_t alignment, size_t num_bytes) { BSON_UNUSED (alignment); return gMemVtable.malloc (num_bytes); } /* *-------------------------------------------------------------------------- * * bson_mem_set_vtable -- * * This function will change our allocation vtable. * * It is imperative that this is called at the beginning of the * process before any memory has been allocated by the default * allocator. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_mem_set_vtable (const bson_mem_vtable_t *vtable) { BSON_ASSERT (vtable); if (!vtable->malloc || !vtable->calloc || !vtable->realloc || !vtable->free) { fprintf (stderr, "Failure to install BSON vtable, " "missing functions.\n"); return; } gMemVtable = *vtable; // Backwards compatibility with code prior to addition of aligned_alloc. if (!gMemVtable.aligned_alloc) { gMemVtable.aligned_alloc = _aligned_alloc_as_malloc; } } void bson_mem_restore_vtable (void) { bson_mem_vtable_t vtable = {.malloc = malloc, .calloc = calloc, .realloc = realloc, .free = free, .aligned_alloc = _aligned_alloc_impl, .padding = {0}}; bson_mem_set_vtable (&vtable); } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-memory.h000066400000000000000000000037561456567454500230570ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_MEMORY_H #define BSON_MEMORY_H #include #include BSON_BEGIN_DECLS typedef void *(*bson_realloc_func) (void *mem, size_t num_bytes, void *ctx); typedef struct _bson_mem_vtable_t { void *(*malloc) (size_t num_bytes); void *(*calloc) (size_t n_members, size_t num_bytes); void *(*realloc) (void *mem, size_t num_bytes); void (*free) (void *mem); void *(*aligned_alloc) (size_t alignment, size_t num_bytes); void *padding[3]; } bson_mem_vtable_t; BSON_EXPORT (void) bson_mem_set_vtable (const bson_mem_vtable_t *vtable); BSON_EXPORT (void) bson_mem_restore_vtable (void); BSON_EXPORT (void *) bson_malloc (size_t num_bytes); BSON_EXPORT (void *) bson_malloc0 (size_t num_bytes); BSON_EXPORT (void *) bson_aligned_alloc (size_t alignment, size_t num_bytes); BSON_EXPORT (void *) bson_aligned_alloc0 (size_t alignment, size_t num_bytes); BSON_EXPORT (void *) bson_realloc (void *mem, size_t num_bytes); BSON_EXPORT (void *) bson_realloc_ctx (void *mem, size_t num_bytes, void *ctx); BSON_EXPORT (void) bson_free (void *mem); BSON_EXPORT (void) bson_zero_free (void *mem, size_t size); #define BSON_ALIGNED_ALLOC(T) \ ((T *) (bson_aligned_alloc (BSON_ALIGNOF (T), sizeof (T)))) #define BSON_ALIGNED_ALLOC0(T) \ ((T *) (bson_aligned_alloc0 (BSON_ALIGNOF (T), sizeof (T)))) BSON_END_DECLS #endif /* BSON_MEMORY_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-oid.c000066400000000000000000000217551456567454500223140ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include /* * This table contains an array of two character pairs for every possible * uint8_t. It is used as a lookup table when encoding a bson_oid_t * to hex formatted ASCII. Performing two characters at a time roughly * reduces the number of operations by one-half. */ BSON_MAYBE_UNUSED static const uint16_t gHexCharPairs[] = { #if BSON_BYTE_ORDER == BSON_BIG_ENDIAN 12336, 12337, 12338, 12339, 12340, 12341, 12342, 12343, 12344, 12345, 12385, 12386, 12387, 12388, 12389, 12390, 12592, 12593, 12594, 12595, 12596, 12597, 12598, 12599, 12600, 12601, 12641, 12642, 12643, 12644, 12645, 12646, 12848, 12849, 12850, 12851, 12852, 12853, 12854, 12855, 12856, 12857, 12897, 12898, 12899, 12900, 12901, 12902, 13104, 13105, 13106, 13107, 13108, 13109, 13110, 13111, 13112, 13113, 13153, 13154, 13155, 13156, 13157, 13158, 13360, 13361, 13362, 13363, 13364, 13365, 13366, 13367, 13368, 13369, 13409, 13410, 13411, 13412, 13413, 13414, 13616, 13617, 13618, 13619, 13620, 13621, 13622, 13623, 13624, 13625, 13665, 13666, 13667, 13668, 13669, 13670, 13872, 13873, 13874, 13875, 13876, 13877, 13878, 13879, 13880, 13881, 13921, 13922, 13923, 13924, 13925, 13926, 14128, 14129, 14130, 14131, 14132, 14133, 14134, 14135, 14136, 14137, 14177, 14178, 14179, 14180, 14181, 14182, 14384, 14385, 14386, 14387, 14388, 14389, 14390, 14391, 14392, 14393, 14433, 14434, 14435, 14436, 14437, 14438, 14640, 14641, 14642, 14643, 14644, 14645, 14646, 14647, 14648, 14649, 14689, 14690, 14691, 14692, 14693, 14694, 24880, 24881, 24882, 24883, 24884, 24885, 24886, 24887, 24888, 24889, 24929, 24930, 24931, 24932, 24933, 24934, 25136, 25137, 25138, 25139, 25140, 25141, 25142, 25143, 25144, 25145, 25185, 25186, 25187, 25188, 25189, 25190, 25392, 25393, 25394, 25395, 25396, 25397, 25398, 25399, 25400, 25401, 25441, 25442, 25443, 25444, 25445, 25446, 25648, 25649, 25650, 25651, 25652, 25653, 25654, 25655, 25656, 25657, 25697, 25698, 25699, 25700, 25701, 25702, 25904, 25905, 25906, 25907, 25908, 25909, 25910, 25911, 25912, 25913, 25953, 25954, 25955, 25956, 25957, 25958, 26160, 26161, 26162, 26163, 26164, 26165, 26166, 26167, 26168, 26169, 26209, 26210, 26211, 26212, 26213, 26214 #else 12336, 12592, 12848, 13104, 13360, 13616, 13872, 14128, 14384, 14640, 24880, 25136, 25392, 25648, 25904, 26160, 12337, 12593, 12849, 13105, 13361, 13617, 13873, 14129, 14385, 14641, 24881, 25137, 25393, 25649, 25905, 26161, 12338, 12594, 12850, 13106, 13362, 13618, 13874, 14130, 14386, 14642, 24882, 25138, 25394, 25650, 25906, 26162, 12339, 12595, 12851, 13107, 13363, 13619, 13875, 14131, 14387, 14643, 24883, 25139, 25395, 25651, 25907, 26163, 12340, 12596, 12852, 13108, 13364, 13620, 13876, 14132, 14388, 14644, 24884, 25140, 25396, 25652, 25908, 26164, 12341, 12597, 12853, 13109, 13365, 13621, 13877, 14133, 14389, 14645, 24885, 25141, 25397, 25653, 25909, 26165, 12342, 12598, 12854, 13110, 13366, 13622, 13878, 14134, 14390, 14646, 24886, 25142, 25398, 25654, 25910, 26166, 12343, 12599, 12855, 13111, 13367, 13623, 13879, 14135, 14391, 14647, 24887, 25143, 25399, 25655, 25911, 26167, 12344, 12600, 12856, 13112, 13368, 13624, 13880, 14136, 14392, 14648, 24888, 25144, 25400, 25656, 25912, 26168, 12345, 12601, 12857, 13113, 13369, 13625, 13881, 14137, 14393, 14649, 24889, 25145, 25401, 25657, 25913, 26169, 12385, 12641, 12897, 13153, 13409, 13665, 13921, 14177, 14433, 14689, 24929, 25185, 25441, 25697, 25953, 26209, 12386, 12642, 12898, 13154, 13410, 13666, 13922, 14178, 14434, 14690, 24930, 25186, 25442, 25698, 25954, 26210, 12387, 12643, 12899, 13155, 13411, 13667, 13923, 14179, 14435, 14691, 24931, 25187, 25443, 25699, 25955, 26211, 12388, 12644, 12900, 13156, 13412, 13668, 13924, 14180, 14436, 14692, 24932, 25188, 25444, 25700, 25956, 26212, 12389, 12645, 12901, 13157, 13413, 13669, 13925, 14181, 14437, 14693, 24933, 25189, 25445, 25701, 25957, 26213, 12390, 12646, 12902, 13158, 13414, 13670, 13926, 14182, 14438, 14694, 24934, 25190, 25446, 25702, 25958, 26214 #endif }; void bson_oid_init_sequence (bson_oid_t *oid, /* OUT */ bson_context_t *context) /* IN */ { uint32_t now = (uint32_t) (time (NULL)); if (!context) { context = bson_context_get_default (); } now = BSON_UINT32_TO_BE (now); memcpy (&oid->bytes[0], &now, sizeof (now)); _bson_context_set_oid_seq64 (context, oid); } void bson_oid_init (bson_oid_t *oid, /* OUT */ bson_context_t *context) /* IN */ { uint32_t now = (uint32_t) (time (NULL)); BSON_ASSERT (oid); if (!context) { context = bson_context_get_default (); } now = BSON_UINT32_TO_BE (now); memcpy (&oid->bytes[0], &now, sizeof (now)); _bson_context_set_oid_rand (context, oid); _bson_context_set_oid_seq32 (context, oid); } void bson_oid_init_from_data (bson_oid_t *oid, /* OUT */ const uint8_t *data) /* IN */ { BSON_ASSERT (oid); BSON_ASSERT (data); memcpy (oid, data, 12); } void bson_oid_init_from_string (bson_oid_t *oid, /* OUT */ const char *str) /* IN */ { BSON_ASSERT (oid); BSON_ASSERT (str); bson_oid_init_from_string_unsafe (oid, str); } time_t bson_oid_get_time_t (const bson_oid_t *oid) /* IN */ { BSON_ASSERT (oid); return bson_oid_get_time_t_unsafe (oid); } void bson_oid_to_string (const bson_oid_t *oid, /* IN */ char str[BSON_ENSURE_ARRAY_PARAM_SIZE (25)]) /* OUT */ { #if !defined(__i386__) && !defined(__x86_64__) && !defined(_M_IX86) && \ !defined(_M_X64) BSON_ASSERT (oid); BSON_ASSERT (str); bson_snprintf (str, 25, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", oid->bytes[0], oid->bytes[1], oid->bytes[2], oid->bytes[3], oid->bytes[4], oid->bytes[5], oid->bytes[6], oid->bytes[7], oid->bytes[8], oid->bytes[9], oid->bytes[10], oid->bytes[11]); #else uint16_t *dst; uint8_t *id = (uint8_t *) oid; BSON_ASSERT (oid); BSON_ASSERT (str); dst = (uint16_t *) (void *) str; dst[0] = gHexCharPairs[id[0]]; dst[1] = gHexCharPairs[id[1]]; dst[2] = gHexCharPairs[id[2]]; dst[3] = gHexCharPairs[id[3]]; dst[4] = gHexCharPairs[id[4]]; dst[5] = gHexCharPairs[id[5]]; dst[6] = gHexCharPairs[id[6]]; dst[7] = gHexCharPairs[id[7]]; dst[8] = gHexCharPairs[id[8]]; dst[9] = gHexCharPairs[id[9]]; dst[10] = gHexCharPairs[id[10]]; dst[11] = gHexCharPairs[id[11]]; str[24] = '\0'; #endif } uint32_t bson_oid_hash (const bson_oid_t *oid) /* IN */ { BSON_ASSERT (oid); return bson_oid_hash_unsafe (oid); } int bson_oid_compare (const bson_oid_t *oid1, /* IN */ const bson_oid_t *oid2) /* IN */ { BSON_ASSERT (oid1); BSON_ASSERT (oid2); return bson_oid_compare_unsafe (oid1, oid2); } bool bson_oid_equal (const bson_oid_t *oid1, /* IN */ const bson_oid_t *oid2) /* IN */ { BSON_ASSERT (oid1); BSON_ASSERT (oid2); return bson_oid_equal_unsafe (oid1, oid2); } void bson_oid_copy (const bson_oid_t *src, /* IN */ bson_oid_t *dst) /* OUT */ { BSON_ASSERT (src); BSON_ASSERT (dst); bson_oid_copy_unsafe (src, dst); } bool bson_oid_is_valid (const char *str, /* IN */ size_t length) /* IN */ { size_t i; BSON_ASSERT (str); if ((length == 25) && (str[24] == '\0')) { length = 24; } if (length == 24) { for (i = 0; i < length; i++) { switch (str[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': break; default: return false; } } return true; } return false; } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-oid.h000066400000000000000000000137351456567454500223200ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_OID_H #define BSON_OID_H #include #include #include #include #include BSON_BEGIN_DECLS BSON_EXPORT (int) bson_oid_compare (const bson_oid_t *oid1, const bson_oid_t *oid2); BSON_EXPORT (void) bson_oid_copy (const bson_oid_t *src, bson_oid_t *dst); BSON_EXPORT (bool) bson_oid_equal (const bson_oid_t *oid1, const bson_oid_t *oid2); BSON_EXPORT (bool) bson_oid_is_valid (const char *str, size_t length); BSON_EXPORT (time_t) bson_oid_get_time_t (const bson_oid_t *oid); BSON_EXPORT (uint32_t) bson_oid_hash (const bson_oid_t *oid); BSON_EXPORT (void) bson_oid_init (bson_oid_t *oid, bson_context_t *context); BSON_EXPORT (void) bson_oid_init_from_data (bson_oid_t *oid, const uint8_t *data); BSON_EXPORT (void) bson_oid_init_from_string (bson_oid_t *oid, const char *str); BSON_EXPORT (void) bson_oid_init_sequence (bson_oid_t *oid, bson_context_t *context) BSON_GNUC_DEPRECATED_FOR (bson_oid_init); BSON_EXPORT (void) bson_oid_to_string (const bson_oid_t *oid, char str[25]); /** * bson_oid_compare_unsafe: * @oid1: A bson_oid_t. * @oid2: A bson_oid_t. * * Performs a qsort() style comparison between @oid1 and @oid2. * * This function is meant to be as fast as possible and therefore performs * no argument validation. That is the callers responsibility. * * Returns: An integer < 0 if @oid1 is less than @oid2. Zero if they are equal. * An integer > 0 if @oid1 is greater than @oid2. */ static BSON_INLINE int bson_oid_compare_unsafe (const bson_oid_t *oid1, const bson_oid_t *oid2) { return memcmp (oid1, oid2, sizeof *oid1); } /** * bson_oid_equal_unsafe: * @oid1: A bson_oid_t. * @oid2: A bson_oid_t. * * Checks the equality of @oid1 and @oid2. * * This function is meant to be as fast as possible and therefore performs * no checks for argument validity. That is the callers responsibility. * * Returns: true if @oid1 and @oid2 are equal; otherwise false. */ static BSON_INLINE bool bson_oid_equal_unsafe (const bson_oid_t *oid1, const bson_oid_t *oid2) { return !memcmp (oid1, oid2, sizeof *oid1); } /** * bson_oid_hash_unsafe: * @oid: A bson_oid_t. * * This function performs a DJB style hash upon the bytes contained in @oid. * The result is a hash key suitable for use in a hashtable. * * This function is meant to be as fast as possible and therefore performs no * validation of arguments. The caller is responsible to ensure they are * passing valid arguments. * * Returns: A uint32_t containing a hash code. */ static BSON_INLINE uint32_t bson_oid_hash_unsafe (const bson_oid_t *oid) { uint32_t hash = 5381; uint32_t i; for (i = 0; i < sizeof oid->bytes; i++) { hash = ((hash << 5) + hash) + oid->bytes[i]; } return hash; } /** * bson_oid_copy_unsafe: * @src: A bson_oid_t to copy from. * @dst: A bson_oid_t to copy into. * * Copies the contents of @src into @dst. This function is meant to be as * fast as possible and therefore performs no argument checking. It is the * callers responsibility to ensure they are passing valid data into the * function. */ static BSON_INLINE void bson_oid_copy_unsafe (const bson_oid_t *src, bson_oid_t *dst) { memcpy (dst, src, sizeof *src); } /** * bson_oid_parse_hex_char: * @hex: A character to parse to its integer value. * * This function contains a jump table to return the integer value for a * character containing a hexadecimal value (0-9, a-f, A-F). If the character * is not a hexadecimal character then zero is returned. * * Returns: An integer between 0 and 15. */ static BSON_INLINE uint8_t bson_oid_parse_hex_char (char hex) { switch (hex) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; case 'a': case 'A': return 0xa; case 'b': case 'B': return 0xb; case 'c': case 'C': return 0xc; case 'd': case 'D': return 0xd; case 'e': case 'E': return 0xe; case 'f': case 'F': return 0xf; default: return 0; } } /** * bson_oid_init_from_string_unsafe: * @oid: A bson_oid_t to store the result. * @str: A 24-character hexadecimal encoded string. * * Parses a string containing 24 hexadecimal encoded bytes into a bson_oid_t. * This function is meant to be as fast as possible and inlined into your * code. For that purpose, the function does not perform any sort of bounds * checking and it is the callers responsibility to ensure they are passing * valid input to the function. */ static BSON_INLINE void bson_oid_init_from_string_unsafe (bson_oid_t *oid, const char *str) { int i; for (i = 0; i < 12; i++) { oid->bytes[i] = (uint8_t) ((bson_oid_parse_hex_char (str[2 * i]) << 4) | (bson_oid_parse_hex_char (str[2 * i + 1]))); } } /** * bson_oid_get_time_t_unsafe: * @oid: A bson_oid_t. * * Fetches the time @oid was generated. * * Returns: A time_t containing the UNIX timestamp of generation. */ static BSON_INLINE time_t bson_oid_get_time_t_unsafe (const bson_oid_t *oid) { uint32_t t; memcpy (&t, oid, sizeof (t)); return BSON_UINT32_FROM_BE (t); } BSON_END_DECLS #endif /* BSON_OID_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-prelude.h000066400000000000000000000013211456567454500231710ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(BSON_INSIDE) && !defined(BSON_COMPILATION) #error "Only can be included directly." #endif mongo-c-driver-1.26.0/src/libbson/src/bson/bson-private.h000066400000000000000000000061561456567454500232160ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_PRIVATE_H #define BSON_PRIVATE_H #include #include #include #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) #define BEGIN_IGNORE_DEPRECATIONS \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"") #define END_IGNORE_DEPRECATIONS _Pragma ("GCC diagnostic pop") #elif defined(__clang__) #define BEGIN_IGNORE_DEPRECATIONS \ _Pragma ("clang diagnostic push") \ _Pragma ("clang diagnostic ignored \"-Wdeprecated-declarations\"") #define END_IGNORE_DEPRECATIONS _Pragma ("clang diagnostic pop") #else #define BEGIN_IGNORE_DEPRECATIONS #define END_IGNORE_DEPRECATIONS #endif BSON_BEGIN_DECLS typedef enum { BSON_FLAG_NONE = 0, BSON_FLAG_INLINE = (1 << 0), BSON_FLAG_STATIC = (1 << 1), BSON_FLAG_RDONLY = (1 << 2), BSON_FLAG_CHILD = (1 << 3), BSON_FLAG_IN_CHILD = (1 << 4), BSON_FLAG_NO_FREE = (1 << 5), } bson_flags_t; #ifdef BSON_MEMCHECK #define BSON_INLINE_DATA_SIZE (120 - sizeof (char *)) #else #define BSON_INLINE_DATA_SIZE 120 #endif BSON_ALIGNED_BEGIN (128) typedef struct { bson_flags_t flags; uint32_t len; #ifdef BSON_MEMCHECK char *canary; #endif uint8_t data[BSON_INLINE_DATA_SIZE]; } bson_impl_inline_t BSON_ALIGNED_END (128); BSON_STATIC_ASSERT2 (impl_inline_t, sizeof (bson_impl_inline_t) == 128); BSON_ALIGNED_BEGIN (128) typedef struct { bson_flags_t flags; /* flags describing the bson_t */ /* len is part of the public bson_t declaration. It is not * exposed through an accessor function. Plus, it's redundant since * BSON self describes the length in the first four bytes of the * buffer. */ uint32_t len; /* length of bson document in bytes */ bson_t *parent; /* parent bson if a child */ uint32_t depth; /* Subdocument depth. */ uint8_t **buf; /* pointer to buffer pointer */ size_t *buflen; /* pointer to buffer length */ size_t offset; /* our offset inside *buf */ uint8_t *alloc; /* buffer that we own. */ size_t alloclen; /* length of buffer that we own. */ bson_realloc_func realloc; /* our realloc implementation */ void *realloc_func_ctx; /* context for our realloc func */ } bson_impl_alloc_t BSON_ALIGNED_END (128); BSON_STATIC_ASSERT2 (impl_alloc_t, sizeof (bson_impl_alloc_t) <= 128); #define BSON_REGEX_OPTIONS_SORTED "ilmsux" BSON_END_DECLS #endif /* BSON_PRIVATE_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-reader.c000066400000000000000000000460571456567454500230050ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "bson.h" #include #include #ifdef BSON_OS_WIN32 #include #include #endif #include #include #include #include #include #include typedef enum { BSON_READER_HANDLE = 1, BSON_READER_DATA = 2, } bson_reader_type_t; typedef struct { bson_reader_type_t type; void *handle; bool done : 1; bool failed : 1; size_t end; size_t len; size_t offset; size_t bytes_read; bson_t inline_bson; uint8_t *data; bson_reader_read_func_t read_func; bson_reader_destroy_func_t destroy_func; } bson_reader_handle_t; typedef struct { int fd; bool do_close; } bson_reader_handle_fd_t; typedef struct { bson_reader_type_t type; const uint8_t *data; size_t length; size_t offset; bson_t inline_bson; } bson_reader_data_t; /* *-------------------------------------------------------------------------- * * _bson_reader_handle_fill_buffer -- * * Attempt to read as much as possible until the underlying buffer * in @reader is filled or we have reached end-of-stream or * read failure. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _bson_reader_handle_fill_buffer (bson_reader_handle_t *reader) /* IN */ { ssize_t ret; /* * Handle first read specially. */ if ((!reader->done) && (!reader->offset) && (!reader->end)) { ret = reader->read_func (reader->handle, &reader->data[0], reader->len); if (ret <= 0) { reader->done = true; return; } reader->bytes_read += ret; reader->end = ret; return; } /* * Move valid data to head. */ memmove (&reader->data[0], &reader->data[reader->offset], reader->end - reader->offset); reader->end = reader->end - reader->offset; reader->offset = 0; /* * Read in data to fill the buffer. */ ret = reader->read_func ( reader->handle, &reader->data[reader->end], reader->len - reader->end); if (ret <= 0) { reader->done = true; reader->failed = (ret < 0); } else { reader->bytes_read += ret; reader->end += ret; } BSON_ASSERT (reader->offset == 0); BSON_ASSERT (reader->end <= reader->len); } /* *-------------------------------------------------------------------------- * * bson_reader_new_from_handle -- * * Allocates and initializes a new bson_reader_t using the opaque * handle provided. * * Parameters: * @handle: an opaque handle to use to read data. * @rf: a function to perform reads on @handle. * @df: a function to release @handle, or NULL. * * Returns: * A newly allocated bson_reader_t if successful, otherwise NULL. * Free the successful result with bson_reader_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_reader_t * bson_reader_new_from_handle (void *handle, bson_reader_read_func_t rf, bson_reader_destroy_func_t df) { bson_reader_handle_t *real; BSON_ASSERT (handle); BSON_ASSERT (rf); real = BSON_ALIGNED_ALLOC0 (bson_reader_handle_t); real->type = BSON_READER_HANDLE; real->data = bson_malloc0 (1024); real->handle = handle; real->len = 1024; real->offset = 0; bson_reader_set_read_func ((bson_reader_t *) real, rf); if (df) { bson_reader_set_destroy_func ((bson_reader_t *) real, df); } _bson_reader_handle_fill_buffer (real); return (bson_reader_t *) real; } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_fd_destroy -- * * Cleanup allocations associated with state created in * bson_reader_new_from_fd(). * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _bson_reader_handle_fd_destroy (void *handle) /* IN */ { bson_reader_handle_fd_t *fd = handle; if (fd) { if ((fd->fd != -1) && fd->do_close) { #ifdef _WIN32 _close (fd->fd); #else close (fd->fd); #endif } bson_free (fd); } } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_fd_read -- * * Perform read on opaque handle created in * bson_reader_new_from_fd(). * * The underlying file descriptor is read from the current position * using the bson_reader_handle_fd_t allocated. * * Returns: * -1 on failure. * 0 on end of stream. * Greater than zero on success. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static ssize_t _bson_reader_handle_fd_read (void *handle, /* IN */ void *buf, /* IN */ size_t len) /* IN */ { bson_reader_handle_fd_t *fd = handle; ssize_t ret = -1; if (fd && (fd->fd != -1)) { again: #ifdef BSON_OS_WIN32 ret = _read (fd->fd, buf, (unsigned int) len); #else ret = read (fd->fd, buf, len); #endif if ((ret == -1) && (errno == EAGAIN)) { goto again; } } return ret; } /* *-------------------------------------------------------------------------- * * bson_reader_new_from_fd -- * * Create a new bson_reader_t using the file-descriptor provided. * * Parameters: * @fd: a libc style file-descriptor. * @close_on_destroy: if close() should be called on @fd when * bson_reader_destroy() is called. * * Returns: * A newly allocated bson_reader_t on success; otherwise NULL. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_reader_t * bson_reader_new_from_fd (int fd, /* IN */ bool close_on_destroy) /* IN */ { bson_reader_handle_fd_t *handle; BSON_ASSERT (fd != -1); handle = bson_malloc0 (sizeof *handle); handle->fd = fd; handle->do_close = close_on_destroy; return bson_reader_new_from_handle ( handle, _bson_reader_handle_fd_read, _bson_reader_handle_fd_destroy); } /** * bson_reader_set_read_func: * @reader: A bson_reader_t. * * Note that @reader must be initialized by bson_reader_init_from_handle(), or * data * will be destroyed. */ /* *-------------------------------------------------------------------------- * * bson_reader_set_read_func -- * * Set the read func to be provided for @reader. * * You probably want to use bson_reader_new_from_handle() or * bson_reader_new_from_fd() instead. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_reader_set_read_func (bson_reader_t *reader, /* IN */ bson_reader_read_func_t func) /* IN */ { bson_reader_handle_t *real = (bson_reader_handle_t *) reader; BSON_ASSERT (reader->type == BSON_READER_HANDLE); real->read_func = func; } /* *-------------------------------------------------------------------------- * * bson_reader_set_destroy_func -- * * Set the function to cleanup state when @reader is destroyed. * * You probably want bson_reader_new_from_fd() or * bson_reader_new_from_handle() instead. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_reader_set_destroy_func (bson_reader_t *reader, /* IN */ bson_reader_destroy_func_t func) /* IN */ { bson_reader_handle_t *real = (bson_reader_handle_t *) reader; BSON_ASSERT (reader->type == BSON_READER_HANDLE); real->destroy_func = func; } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_grow_buffer -- * * Grow the buffer to the next power of two. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _bson_reader_handle_grow_buffer (bson_reader_handle_t *reader) /* IN */ { size_t size; size = reader->len * 2; reader->data = bson_realloc (reader->data, size); reader->len = size; } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_tell -- * * Tell the current position within the underlying file-descriptor. * * Returns: * An off_t containing the current offset. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static off_t _bson_reader_handle_tell (bson_reader_handle_t *reader) /* IN */ { off_t off; off = (off_t) reader->bytes_read; off -= (off_t) reader->end; off += (off_t) reader->offset; return off; } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_read -- * * Read the next chunk of data from the underlying file descriptor * and return a bson_t which should not be modified. * * There was a failure if NULL is returned and @reached_eof is * not set to true. * * Returns: * NULL on failure or end of stream. * * Side effects: * @reached_eof is set if non-NULL. * *-------------------------------------------------------------------------- */ static const bson_t * _bson_reader_handle_read (bson_reader_handle_t *reader, /* IN */ bool *reached_eof) /* IN */ { int32_t blen; if (reached_eof) { *reached_eof = false; } while (!reader->done) { if ((reader->end - reader->offset) < 4) { _bson_reader_handle_fill_buffer (reader); continue; } memcpy (&blen, &reader->data[reader->offset], sizeof blen); blen = BSON_UINT32_FROM_LE (blen); if (blen < 5) { return NULL; } if (blen > (int32_t) (reader->end - reader->offset)) { if (blen > (int32_t) reader->len) { _bson_reader_handle_grow_buffer (reader); } _bson_reader_handle_fill_buffer (reader); continue; } if (!bson_init_static (&reader->inline_bson, &reader->data[reader->offset], (uint32_t) blen)) { return NULL; } reader->offset += blen; return &reader->inline_bson; } if (reached_eof) { *reached_eof = reader->done && !reader->failed; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_reader_new_from_data -- * * Allocates and initializes a new bson_reader_t that reads the memory * provided as a stream of BSON documents. * * Parameters: * @data: A buffer to read BSON documents from. * @length: The length of @data. * * Returns: * A newly allocated bson_reader_t that should be freed with * bson_reader_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_reader_t * bson_reader_new_from_data (const uint8_t *data, /* IN */ size_t length) /* IN */ { bson_reader_data_t *real; BSON_ASSERT (data); real = BSON_ALIGNED_ALLOC0 (bson_reader_data_t); real->type = BSON_READER_DATA; real->data = data; real->length = length; real->offset = 0; return (bson_reader_t *) real; } /* *-------------------------------------------------------------------------- * * _bson_reader_data_read -- * * Read the next document from the underlying buffer. * * Returns: * NULL on failure or end of stream. * a bson_t which should not be modified. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static const bson_t * _bson_reader_data_read (bson_reader_data_t *reader, /* IN */ bool *reached_eof) /* IN */ { int32_t blen; if (reached_eof) { *reached_eof = false; } if ((reader->offset + 4) < reader->length) { memcpy (&blen, &reader->data[reader->offset], sizeof blen); blen = BSON_UINT32_FROM_LE (blen); if (blen < 5) { return NULL; } if (blen > (int32_t) (reader->length - reader->offset)) { return NULL; } if (!bson_init_static (&reader->inline_bson, &reader->data[reader->offset], (uint32_t) blen)) { return NULL; } reader->offset += blen; return &reader->inline_bson; } if (reached_eof) { *reached_eof = (reader->offset == reader->length); } return NULL; } /* *-------------------------------------------------------------------------- * * _bson_reader_data_tell -- * * Tell the current position in the underlying buffer. * * Returns: * An off_t of the current offset. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static off_t _bson_reader_data_tell (bson_reader_data_t *reader) /* IN */ { return (off_t) reader->offset; } /* *-------------------------------------------------------------------------- * * bson_reader_destroy -- * * Release a bson_reader_t created with bson_reader_new_from_data(), * bson_reader_new_from_fd(), or bson_reader_new_from_handle(). * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_reader_destroy (bson_reader_t *reader) /* IN */ { if (!reader) { return; } switch (reader->type) { case 0: break; case BSON_READER_HANDLE: { bson_reader_handle_t *handle = (bson_reader_handle_t *) reader; if (handle->destroy_func) { handle->destroy_func (handle->handle); } bson_free (handle->data); } break; case BSON_READER_DATA: break; default: fprintf (stderr, "No such reader type: %02x\n", reader->type); break; } reader->type = 0; bson_free (reader); } /* *-------------------------------------------------------------------------- * * bson_reader_read -- * * Reads the next bson_t in the underlying memory or storage. The * resulting bson_t should not be modified or freed. You may copy it * and iterate over it. Functions that take a const bson_t* are safe * to use. * * This structure does not survive calls to bson_reader_read() or * bson_reader_destroy() as it uses memory allocated by the reader or * underlying storage/memory. * * If NULL is returned then @reached_eof will be set to true if the * end of the file or buffer was reached. This indicates if there was * an error parsing the document stream. * * Returns: * A const bson_t that should not be modified or freed. * NULL on failure or end of stream. * * Side effects: * @reached_eof is set if non-NULL. * *-------------------------------------------------------------------------- */ const bson_t * bson_reader_read (bson_reader_t *reader, /* IN */ bool *reached_eof) /* OUT */ { BSON_ASSERT (reader); switch (reader->type) { case BSON_READER_HANDLE: return _bson_reader_handle_read ((bson_reader_handle_t *) reader, reached_eof); case BSON_READER_DATA: return _bson_reader_data_read ((bson_reader_data_t *) reader, reached_eof); default: fprintf (stderr, "No such reader type: %02x\n", reader->type); break; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_reader_tell -- * * Return the current position in the underlying reader. This will * always be at the beginning of a bson document or end of file. * * Returns: * An off_t containing the current offset. * * Side effects: * None. * *-------------------------------------------------------------------------- */ off_t bson_reader_tell (bson_reader_t *reader) /* IN */ { BSON_ASSERT (reader); switch (reader->type) { case BSON_READER_HANDLE: return _bson_reader_handle_tell ((bson_reader_handle_t *) reader); case BSON_READER_DATA: return _bson_reader_data_tell ((bson_reader_data_t *) reader); default: fprintf (stderr, "No such reader type: %02x\n", reader->type); return -1; } } /* *-------------------------------------------------------------------------- * * bson_reader_new_from_file -- * * A convenience function to open a file containing sequential * bson documents and read them using bson_reader_t. * * Returns: * A new bson_reader_t if successful, otherwise NULL and * @error is set. Free the non-NULL result with * bson_reader_destroy(). * * Side effects: * @error may be set. * *-------------------------------------------------------------------------- */ bson_reader_t * bson_reader_new_from_file (const char *path, /* IN */ bson_error_t *error) /* OUT */ { char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; char *errmsg; int fd; BSON_ASSERT (path); #ifdef BSON_OS_WIN32 if (_sopen_s (&fd, path, (_O_RDONLY | _O_BINARY), _SH_DENYNO, 0) != 0) { fd = -1; } #else fd = open (path, O_RDONLY); #endif if (fd == -1) { errmsg = bson_strerror_r (errno, errmsg_buf, sizeof errmsg_buf); bson_set_error ( error, BSON_ERROR_READER, BSON_ERROR_READER_BADFD, "%s", errmsg); return NULL; } return bson_reader_new_from_fd (fd, true); } /* *-------------------------------------------------------------------------- * * bson_reader_reset -- * * Restore the reader to its initial state. Valid only for readers * created with bson_reader_new_from_data. * *-------------------------------------------------------------------------- */ void bson_reader_reset (bson_reader_t *reader) { bson_reader_data_t *real = (bson_reader_data_t *) reader; if (real->type != BSON_READER_DATA) { fprintf (stderr, "Reader type cannot be reset\n"); return; } real->offset = 0; } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-reader.h000066400000000000000000000064441456567454500230060ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_READER_H #define BSON_READER_H #include #include #include BSON_BEGIN_DECLS #define BSON_ERROR_READER_BADFD 1 /* *-------------------------------------------------------------------------- * * bson_reader_read_func_t -- * * This function is a callback used by bson_reader_t to read the * next chunk of data from the underlying opaque file descriptor. * * This function is meant to operate similar to the read() function * as part of libc on UNIX-like systems. * * Parameters: * @handle: The handle to read from. * @buf: The buffer to read into. * @count: The number of bytes to read. * * Returns: * 0 for end of stream. * -1 for read failure. * Greater than zero for number of bytes read into @buf. * * Side effects: * None. * *-------------------------------------------------------------------------- */ typedef ssize_t (*bson_reader_read_func_t) (void *handle, /* IN */ void *buf, /* IN */ size_t count); /* IN */ /* *-------------------------------------------------------------------------- * * bson_reader_destroy_func_t -- * * Destroy callback to release any resources associated with the * opaque handle. * * Parameters: * @handle: the handle provided to bson_reader_new_from_handle(). * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ typedef void (*bson_reader_destroy_func_t) (void *handle); /* IN */ BSON_EXPORT (bson_reader_t *) bson_reader_new_from_handle (void *handle, bson_reader_read_func_t rf, bson_reader_destroy_func_t df); BSON_EXPORT (bson_reader_t *) bson_reader_new_from_fd (int fd, bool close_on_destroy); BSON_EXPORT (bson_reader_t *) bson_reader_new_from_file (const char *path, bson_error_t *error); BSON_EXPORT (bson_reader_t *) bson_reader_new_from_data (const uint8_t *data, size_t length); BSON_EXPORT (void) bson_reader_destroy (bson_reader_t *reader); BSON_EXPORT (void) bson_reader_set_read_func (bson_reader_t *reader, bson_reader_read_func_t func); BSON_EXPORT (void) bson_reader_set_destroy_func (bson_reader_t *reader, bson_reader_destroy_func_t func); BSON_EXPORT (const bson_t *) bson_reader_read (bson_reader_t *reader, bool *reached_eof); BSON_EXPORT (off_t) bson_reader_tell (bson_reader_t *reader); BSON_EXPORT (void) bson_reader_reset (bson_reader_t *reader); BSON_END_DECLS #endif /* BSON_READER_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-string.c000066400000000000000000000412641456567454500230440ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #ifdef BSON_HAVE_STRINGS_H #include #else #include #endif /* *-------------------------------------------------------------------------- * * bson_string_new -- * * Create a new bson_string_t. * * bson_string_t is a power-of-2 allocation growing string. Every * time data is appended the next power of two size is chosen for * the allocation. Pretty standard stuff. * * It is UTF-8 aware through the use of bson_string_append_unichar(). * The proper UTF-8 character sequence will be used. * * Parameters: * @str: a string to copy or NULL. * * Returns: * A newly allocated bson_string_t that should be freed with * bson_string_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_string_t * bson_string_new (const char *str) /* IN */ { bson_string_t *ret; ret = bson_malloc0 (sizeof *ret); ret->len = str ? (int) strlen (str) : 0; ret->alloc = ret->len + 1; if (!bson_is_power_of_two (ret->alloc)) { ret->alloc = (uint32_t) bson_next_power_of_two ((size_t) ret->alloc); } BSON_ASSERT (ret->alloc >= 1); ret->str = bson_malloc (ret->alloc); if (str) { memcpy (ret->str, str, ret->len); } ret->str[ret->len] = '\0'; return ret; } char * bson_string_free (bson_string_t *string, /* IN */ bool free_segment) /* IN */ { char *ret = NULL; if (!string) { return NULL; } if (!free_segment) { ret = string->str; } else { bson_free (string->str); } bson_free (string); return ret; } /* *-------------------------------------------------------------------------- * * bson_string_append -- * * Append the UTF-8 string @str to @string. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_string_append (bson_string_t *string, /* IN */ const char *str) /* IN */ { uint32_t len; BSON_ASSERT (string); BSON_ASSERT (str); len = (uint32_t) strlen (str); if ((string->alloc - string->len - 1) < len) { string->alloc += len; if (!bson_is_power_of_two (string->alloc)) { string->alloc = (uint32_t) bson_next_power_of_two ((size_t) string->alloc); } string->str = bson_realloc (string->str, string->alloc); } memcpy (string->str + string->len, str, len); string->len += len; string->str[string->len] = '\0'; } /* *-------------------------------------------------------------------------- * * bson_string_append_c -- * * Append the ASCII character @c to @string. * * Do not use this if you are working with UTF-8 sequences, * use bson_string_append_unichar(). * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_string_append_c (bson_string_t *string, /* IN */ char c) /* IN */ { char cc[2]; BSON_ASSERT (string); if (BSON_UNLIKELY (string->alloc == (string->len + 1))) { cc[0] = c; cc[1] = '\0'; bson_string_append (string, cc); return; } string->str[string->len++] = c; string->str[string->len] = '\0'; } /* *-------------------------------------------------------------------------- * * bson_string_append_unichar -- * * Append the bson_unichar_t @unichar to the string @string. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_string_append_unichar (bson_string_t *string, /* IN */ bson_unichar_t unichar) /* IN */ { uint32_t len; char str[8]; BSON_ASSERT (string); BSON_ASSERT (unichar); bson_utf8_from_unichar (unichar, str, &len); if (len <= 6) { str[len] = '\0'; bson_string_append (string, str); } } /* *-------------------------------------------------------------------------- * * bson_string_append_printf -- * * Format a string according to @format and append it to @string. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_string_append_printf (bson_string_t *string, const char *format, ...) { va_list args; char *ret; BSON_ASSERT (string); BSON_ASSERT (format); va_start (args, format); ret = bson_strdupv_printf (format, args); va_end (args); bson_string_append (string, ret); bson_free (ret); } /* *-------------------------------------------------------------------------- * * bson_string_truncate -- * * Truncate the string @string to @len bytes. * * The underlying memory will be released via realloc() down to * the minimum required size specified by @len. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_string_truncate (bson_string_t *string, /* IN */ uint32_t len) /* IN */ { uint32_t alloc; BSON_ASSERT (string); BSON_ASSERT (len < INT_MAX); alloc = len + 1; if (alloc < 16) { alloc = 16; } if (!bson_is_power_of_two (alloc)) { alloc = (uint32_t) bson_next_power_of_two ((size_t) alloc); } string->str = bson_realloc (string->str, alloc); string->alloc = alloc; string->len = len; string->str[string->len] = '\0'; } /* *-------------------------------------------------------------------------- * * bson_strdup -- * * Portable strdup(). * * Returns: * A newly allocated string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strdup (const char *str) /* IN */ { long len; char *out; if (!str) { return NULL; } len = (long) strlen (str); out = bson_malloc (len + 1); if (!out) { return NULL; } memcpy (out, str, len + 1); return out; } /* *-------------------------------------------------------------------------- * * bson_strdupv_printf -- * * Like bson_strdup_printf() but takes a va_list. * * Returns: * A newly allocated string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strdupv_printf (const char *format, /* IN */ va_list args) /* IN */ { va_list my_args; char *buf; int len = 32; int n; BSON_ASSERT (format); buf = bson_malloc0 (len); while (true) { va_copy (my_args, args); n = bson_vsnprintf (buf, len, format, my_args); va_end (my_args); if (n > -1 && n < len) { return buf; } if (n > -1) { len = n + 1; } else { len *= 2; } buf = bson_realloc (buf, len); } } /* *-------------------------------------------------------------------------- * * bson_strdup_printf -- * * Convenience function that formats a string according to @format * and returns a copy of it. * * Returns: * A newly created string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strdup_printf (const char *format, /* IN */ ...) /* IN */ { va_list args; char *ret; BSON_ASSERT (format); va_start (args, format); ret = bson_strdupv_printf (format, args); va_end (args); return ret; } /* *-------------------------------------------------------------------------- * * bson_strndup -- * * A portable strndup(). * * Returns: * A newly allocated string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strndup (const char *str, /* IN */ size_t n_bytes) /* IN */ { char *ret; BSON_ASSERT (str); ret = bson_malloc (n_bytes + 1); bson_strncpy (ret, str, n_bytes + 1); return ret; } /* *-------------------------------------------------------------------------- * * bson_strfreev -- * * Frees each string in a NULL terminated array of strings. * This also frees the underlying array. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_strfreev (char **str) /* IN */ { int i; if (str) { for (i = 0; str[i]; i++) bson_free (str[i]); bson_free (str); } } /* *-------------------------------------------------------------------------- * * bson_strnlen -- * * A portable strnlen(). * * Returns: * The length of @s up to @maxlen. * * Side effects: * None. * *-------------------------------------------------------------------------- */ size_t bson_strnlen (const char *s, /* IN */ size_t maxlen) /* IN */ { #ifdef BSON_HAVE_STRNLEN return strnlen (s, maxlen); #else size_t i; for (i = 0; i < maxlen; i++) { if (s[i] == '\0') { return i; } } return maxlen; #endif } /* *-------------------------------------------------------------------------- * * bson_strncpy -- * * A portable strncpy. * * Copies @src into @dst, which must be @size bytes or larger. * The result is guaranteed to be \0 terminated. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_strncpy (char *dst, /* IN */ const char *src, /* IN */ size_t size) /* IN */ { if (size == 0) { return; } /* Prefer strncpy_s for MSVC, or strlcpy, which has additional checks and only * adds one trailing \0 */ #ifdef _MSC_VER strncpy_s (dst, size, src, _TRUNCATE); #elif defined(BSON_HAVE_STRLCPY) strlcpy (dst, src, size); #else strncpy (dst, src, size); dst[size - 1] = '\0'; #endif } /* *-------------------------------------------------------------------------- * * bson_vsnprintf -- * * A portable vsnprintf. * * If more than @size bytes are required (exluding the null byte), * then @size bytes will be written to @string and the return value * is the number of bytes required. * * This function will always return a NULL terminated string. * * Returns: * The number of bytes required for @format excluding the null byte. * * Side effects: * @str is initialized with the formatted string. * *-------------------------------------------------------------------------- */ int bson_vsnprintf (char *str, /* IN */ size_t size, /* IN */ const char *format, /* IN */ va_list ap) /* IN */ { #ifdef _MSC_VER int r = -1; BSON_ASSERT (str); if (size == 0) { return 0; } r = _vsnprintf_s (str, size, _TRUNCATE, format, ap); if (r == -1) { r = _vscprintf (format, ap); } str[size - 1] = '\0'; return r; #else int r; BSON_ASSERT (str); if (size == 0) { return 0; } r = vsnprintf (str, size, format, ap); str[size - 1] = '\0'; return r; #endif } /* *-------------------------------------------------------------------------- * * bson_snprintf -- * * A portable snprintf. * * If @format requires more than @size bytes, then @size bytes are * written and the result is the number of bytes required (excluding * the null byte). * * This function will always return a NULL terminated string. * * Returns: * The number of bytes required for @format. * * Side effects: * @str is initialized. * *-------------------------------------------------------------------------- */ int bson_snprintf (char *str, /* IN */ size_t size, /* IN */ const char *format, /* IN */ ...) { int r; va_list ap; BSON_ASSERT (str); va_start (ap, format); r = bson_vsnprintf (str, size, format, ap); va_end (ap); return r; } /* *-------------------------------------------------------------------------- * * bson_ascii_strtoll -- * * A portable strtoll. * * Convert a string to a 64-bit signed integer according to the given * @base, which must be 16, 10, or 8. Leading whitespace will be ignored. * * If base is 0 is passed in, the base is inferred from the string's * leading characters. Base-16 numbers start with "0x" or "0X", base-8 * numbers start with "0", base-10 numbers start with a digit from 1 to 9. * * If @e is not NULL, it will be assigned the address of the first invalid * character of @s, or its null terminating byte if the entire string was * valid. * * If an invalid value is encountered, errno will be set to EINVAL and * zero will be returned. If the number is out of range, errno is set to * ERANGE and LLONG_MAX or LLONG_MIN is returned. * * Returns: * The result of the conversion. * * Side effects: * errno will be set on error. * *-------------------------------------------------------------------------- */ int64_t bson_ascii_strtoll (const char *s, char **e, int base) { char *tok = (char *) s; char *digits_start; char c; int64_t number = 0; int64_t sign = 1; int64_t cutoff; int64_t cutlim; errno = 0; if (!s) { errno = EINVAL; return 0; } c = *tok; while (bson_isspace (c)) { c = *++tok; } if (c == '-') { sign = -1; c = *++tok; } else if (c == '+') { c = *++tok; } else if (!isdigit (c)) { errno = EINVAL; return 0; } /* from here down, inspired by NetBSD's strtoll */ if ((base == 0 || base == 16) && c == '0' && (tok[1] == 'x' || tok[1] == 'X')) { tok += 2; c = *tok; base = 16; } if (base == 0) { base = c == '0' ? 8 : 10; } /* Cutoff is the greatest magnitude we'll be able to multiply by base without * range error. If the current number is past cutoff and we see valid digit, * fail. If the number is *equal* to cutoff, then the next digit must be less * than cutlim, otherwise fail. */ cutoff = sign == -1 ? INT64_MIN : INT64_MAX; cutlim = (int) (cutoff % base); cutoff /= base; if (sign == -1) { if (cutlim > 0) { cutlim -= base; cutoff += 1; } cutlim = -cutlim; } digits_start = tok; while ((c = *tok)) { if (isdigit (c)) { c -= '0'; } else if (isalpha (c)) { c -= isupper (c) ? 'A' - 10 : 'a' - 10; } else { /* end of number string */ break; } if (c >= base) { break; } if (sign == -1) { if (number < cutoff || (number == cutoff && c > cutlim)) { number = INT64_MIN; errno = ERANGE; break; } else { number *= base; number -= c; } } else { if (number > cutoff || (number == cutoff && c > cutlim)) { number = INT64_MAX; errno = ERANGE; break; } else { number *= base; number += c; } } tok++; } /* did we parse any digits at all? */ if (e != NULL && tok > digits_start) { *e = tok; } return number; } int bson_strcasecmp (const char *s1, const char *s2) { #ifdef BSON_OS_WIN32 return _stricmp (s1, s2); #else return strcasecmp (s1, s2); #endif } bool bson_isspace (int c) { return c >= -1 && c <= 255 && isspace (c); } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-string.h000066400000000000000000000045761456567454500230560ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_STRING_H #define BSON_STRING_H #include #include #include BSON_BEGIN_DECLS typedef struct { char *str; uint32_t len; uint32_t alloc; } bson_string_t; BSON_EXPORT (bson_string_t *) bson_string_new (const char *str); BSON_EXPORT (char *) bson_string_free (bson_string_t *string, bool free_segment); BSON_EXPORT (void) bson_string_append (bson_string_t *string, const char *str); BSON_EXPORT (void) bson_string_append_c (bson_string_t *string, char str); BSON_EXPORT (void) bson_string_append_unichar (bson_string_t *string, bson_unichar_t unichar); BSON_EXPORT (void) bson_string_append_printf (bson_string_t *string, const char *format, ...) BSON_GNUC_PRINTF (2, 3); BSON_EXPORT (void) bson_string_truncate (bson_string_t *string, uint32_t len); BSON_EXPORT (char *) bson_strdup (const char *str); BSON_EXPORT (char *) bson_strdup_printf (const char *format, ...) BSON_GNUC_PRINTF (1, 2); BSON_EXPORT (char *) bson_strdupv_printf (const char *format, va_list args) BSON_GNUC_PRINTF (1, 0); BSON_EXPORT (char *) bson_strndup (const char *str, size_t n_bytes); BSON_EXPORT (void) bson_strncpy (char *dst, const char *src, size_t size); BSON_EXPORT (int) bson_vsnprintf (char *str, size_t size, const char *format, va_list ap) BSON_GNUC_PRINTF (3, 0); BSON_EXPORT (int) bson_snprintf (char *str, size_t size, const char *format, ...) BSON_GNUC_PRINTF (3, 4); BSON_EXPORT (void) bson_strfreev (char **strv); BSON_EXPORT (size_t) bson_strnlen (const char *s, size_t maxlen); BSON_EXPORT (int64_t) bson_ascii_strtoll (const char *str, char **endptr, int base); BSON_EXPORT (int) bson_strcasecmp (const char *s1, const char *s2); BSON_EXPORT (bool) bson_isspace (int c); BSON_END_DECLS #endif /* BSON_STRING_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-timegm-private.h000066400000000000000000000030341456567454500244660ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_TIMEGM_PRIVATE_H #define BSON_TIMEGM_PRIVATE_H #include #include BSON_BEGIN_DECLS /* avoid system-dependent struct tm definitions */ struct bson_tm { int64_t tm_sec; /* seconds after the minute [0-60] */ int64_t tm_min; /* minutes after the hour [0-59] */ int64_t tm_hour; /* hours since midnight [0-23] */ int64_t tm_mday; /* day of the month [1-31] */ int64_t tm_mon; /* months since January [0-11] */ int64_t tm_year; /* years since 1900 */ int64_t tm_wday; /* days since Sunday [0-6] */ int64_t tm_yday; /* days since January 1 [0-365] */ int64_t tm_isdst; /* Daylight Savings Time flag */ int64_t tm_gmtoff; /* offset from CUT in seconds */ const char *tm_zone; /* timezone abbreviation */ }; int64_t _bson_timegm (struct bson_tm *const tmp); BSON_END_DECLS #endif /* BSON_TIMEGM_PRIVATE_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-timegm.c000066400000000000000000000564041456567454500230220ustar00rootroot00000000000000/* ** The original version of this file is in the public domain, so clarified as of ** 1996-06-05 by Arthur David Olson. */ /* ** Leap second handling from Bradley White. ** POSIX-style TZ environment variable handling from Guy Harris. ** Updated to use int64_t's instead of system-dependent definitions of int64_t ** and struct tm by A. Jesse Jiryu Davis for MongoDB, Inc. */ #include #include #include #include "errno.h" #include "string.h" #include /* for INT64_MAX and INT64_MIN */ /* Unlike 's isdigit, this also works if c < 0 | c > UCHAR_MAX. */ #define is_digit(c) ((unsigned) (c) - '0' <= 9) #if 2 < __GNUC__ + (96 <= __GNUC_MINOR__) #define ATTRIBUTE_CONST __attribute__ ((const)) #define ATTRIBUTE_PURE __attribute__ ((__pure__)) #define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else #define ATTRIBUTE_CONST /* empty */ #define ATTRIBUTE_PURE /* empty */ #define ATTRIBUTE_FORMAT(spec) /* empty */ #endif #if !defined _Noreturn && \ (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112) #if 2 < __GNUC__ + (8 <= __GNUC_MINOR__) #define _Noreturn __attribute__ ((__noreturn__)) #else #define _Noreturn #endif #endif #if !defined(__STDC_VERSION__) && !defined restrict #define restrict /* empty */ #endif #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunknown-pragmas" #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wshift-negative-value" #endif /* The minimum and maximum finite time values. */ static int64_t const time_t_min = INT64_MIN; static int64_t const time_t_max = INT64_MAX; #ifdef __clang__ #pragma clang diagnostic pop #pragma clang diagnostic pop #endif #ifndef TZ_MAX_TIMES #define TZ_MAX_TIMES 2000 #endif /* !defined TZ_MAX_TIMES */ #ifndef TZ_MAX_TYPES /* This must be at least 17 for Europe/Samara and Europe/Vilnius. */ #define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ #endif /* !defined TZ_MAX_TYPES */ #ifndef TZ_MAX_CHARS #define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ /* (limited by what unsigned chars can hold) */ #endif /* !defined TZ_MAX_CHARS */ #ifndef TZ_MAX_LEAPS #define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ #endif /* !defined TZ_MAX_LEAPS */ #define SECSPERMIN 60 #define MINSPERHOUR 60 #define HOURSPERDAY 24 #define DAYSPERWEEK 7 #define DAYSPERNYEAR 365 #define DAYSPERLYEAR 366 #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) #define SECSPERDAY ((int_fast32_t) SECSPERHOUR * HOURSPERDAY) #define MONSPERYEAR 12 #define TM_SUNDAY 0 #define TM_MONDAY 1 #define TM_TUESDAY 2 #define TM_WEDNESDAY 3 #define TM_THURSDAY 4 #define TM_FRIDAY 5 #define TM_SATURDAY 6 #define TM_JANUARY 0 #define TM_FEBRUARY 1 #define TM_MARCH 2 #define TM_APRIL 3 #define TM_MAY 4 #define TM_JUNE 5 #define TM_JULY 6 #define TM_AUGUST 7 #define TM_SEPTEMBER 8 #define TM_OCTOBER 9 #define TM_NOVEMBER 10 #define TM_DECEMBER 11 #define TM_YEAR_BASE 1900 #define EPOCH_YEAR 1970 #define EPOCH_WDAY TM_THURSDAY #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) /* ** Since everything in isleap is modulo 400 (or a factor of 400), we know that ** isleap(y) == isleap(y % 400) ** and so ** isleap(a + b) == isleap((a + b) % 400) ** or ** isleap(a + b) == isleap(a % 400 + b % 400) ** This is true even if % means modulo rather than Fortran remainder ** (which is allowed by C89 but not C99). ** We use this to avoid addition overflow problems. */ #define isleap_sum(a, b) isleap ((a) % 400 + (b) % 400) #ifndef TZ_ABBR_MAX_LEN #define TZ_ABBR_MAX_LEN 16 #endif /* !defined TZ_ABBR_MAX_LEN */ #ifndef TZ_ABBR_CHAR_SET #define TZ_ABBR_CHAR_SET \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :+-._" #endif /* !defined TZ_ABBR_CHAR_SET */ #ifndef TZ_ABBR_ERR_CHAR #define TZ_ABBR_ERR_CHAR '_' #endif /* !defined TZ_ABBR_ERR_CHAR */ #ifndef WILDABBR /* ** Someone might make incorrect use of a time zone abbreviation: ** 1. They might reference tzname[0] before calling tzset (explicitly ** or implicitly). ** 2. They might reference tzname[1] before calling tzset (explicitly ** or implicitly). ** 3. They might reference tzname[1] after setting to a time zone ** in which Daylight Saving Time is never observed. ** 4. They might reference tzname[0] after setting to a time zone ** in which Standard Time is never observed. ** 5. They might reference tm.TM_ZONE after calling offtime. ** What's best to do in the above cases is open to debate; ** for now, we just set things up so that in any of the five cases ** WILDABBR is used. Another possibility: initialize tzname[0] to the ** string "tzname[0] used before set", and similarly for the other cases. ** And another: initialize tzname[0] to "ERA", with an explanation in the ** manual page of what this "time zone abbreviation" means (doing this so ** that tzname[0] has the "normal" length of three characters). */ #define WILDABBR " " #endif /* !defined WILDABBR */ #ifdef TM_ZONE static const char wildabbr[] = WILDABBR; static const char gmt[] = "GMT"; #endif struct ttinfo { /* time type information */ int_fast32_t tt_gmtoff; /* UT offset in seconds */ int tt_isdst; /* used to set tm_isdst */ int tt_abbrind; /* abbreviation list index */ int tt_ttisstd; /* true if transition is std time */ int tt_ttisgmt; /* true if transition is UT */ }; struct lsinfo { /* leap second information */ int64_t ls_trans; /* transition time */ int_fast64_t ls_corr; /* correction to apply */ }; #define BIGGEST(a, b) (((a) > (b)) ? (a) : (b)) #ifdef TZNAME_MAX #define MY_TZNAME_MAX TZNAME_MAX #endif /* defined TZNAME_MAX */ #ifndef TZNAME_MAX #define MY_TZNAME_MAX 255 #endif /* !defined TZNAME_MAX */ struct state { int leapcnt; int timecnt; int typecnt; int charcnt; int goback; int goahead; int64_t ats[TZ_MAX_TIMES]; unsigned char types[TZ_MAX_TIMES]; struct ttinfo ttis[TZ_MAX_TYPES]; char chars[BIGGEST (TZ_MAX_CHARS + 1, (2 * (MY_TZNAME_MAX + 1)))]; struct lsinfo lsis[TZ_MAX_LEAPS]; int defaulttype; /* for early times or if no transitions */ }; struct rule { int r_type; /* type of rule--see below */ int r_day; /* day number of rule */ int r_week; /* week number of rule */ int r_mon; /* month number of rule */ int_fast32_t r_time; /* transition time of rule */ }; #define JULIAN_DAY 0 /* Jn - Julian day */ #define DAY_OF_YEAR 1 /* n - day of year */ #define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of week */ /* ** Prototypes for static functions. */ static void gmtload (struct state *const sp); static struct bson_tm * gmtsub (const int64_t *const timep, const int_fast32_t offset, struct bson_tm *const tmp); static int64_t increment_overflow (int64_t *const ip, int64_t j); static int64_t leaps_thru_end_of (const int64_t y) ATTRIBUTE_PURE; static int64_t increment_overflow32 (int_fast32_t *const lp, int64_t const m); static int64_t normalize_overflow32 (int_fast32_t *const tensptr, int64_t *const unitsptr, const int64_t base); static int64_t normalize_overflow (int64_t *const tensptr, int64_t *const unitsptr, const int64_t base); static int64_t time1 (struct bson_tm *const tmp, struct bson_tm *(*const funcp) (const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset); static int64_t time2 (struct bson_tm *const tmp, struct bson_tm *(*const funcp) (const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset, int64_t *const okayp); static int64_t time2sub (struct bson_tm *const tmp, struct bson_tm *(*const funcp) (const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset, int64_t *const okayp, const int64_t do_norm_secs); static struct bson_tm * timesub (const int64_t *const timep, const int_fast32_t offset, const struct state *const sp, struct bson_tm *const tmp); static int64_t tmcomp (const struct bson_tm *const atmp, const struct bson_tm *const btmp); static struct state gmtmem; #define gmtptr (&gmtmem) static int gmt_is_set; static const int mon_lengths[2][MONSPERYEAR] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; static const int year_lengths[2] = {DAYSPERNYEAR, DAYSPERLYEAR}; static void gmtload (struct state *const sp) { memset (sp, 0, sizeof (struct state)); sp->typecnt = 1; sp->charcnt = 4; sp->chars[0] = 'G'; sp->chars[1] = 'M'; sp->chars[2] = 'T'; } /* ** gmtsub is to gmtime as localsub is to localtime. */ static struct bson_tm * gmtsub (const int64_t *const timep, const int_fast32_t offset, struct bson_tm *const tmp) { struct bson_tm *result; if (!gmt_is_set) { gmt_is_set = true; gmtload (gmtptr); } result = timesub (timep, offset, gmtptr, tmp); #ifdef TM_ZONE /* ** Could get fancy here and deliver something such as ** "UT+xxxx" or "UT-xxxx" if offset is non-zero, ** but this is no time for a treasure hunt. */ tmp->TM_ZONE = offset ? wildabbr : gmtptr ? gmtptr->chars : gmt; #endif /* defined TM_ZONE */ return result; } /* ** Return the number of leap years through the end of the given year ** where, to make the math easy, the answer for year zero is defined as zero. */ static int64_t leaps_thru_end_of (const int64_t y) { return (y >= 0) ? (y / 4 - y / 100 + y / 400) : -(leaps_thru_end_of (-(y + 1)) + 1); } static struct bson_tm * timesub (const int64_t *const timep, const int_fast32_t offset, const struct state *const sp, struct bson_tm *const tmp) { const struct lsinfo *lp; int64_t tdays; int64_t idays; /* unsigned would be so 2003 */ int_fast64_t rem; int64_t y; const int (*ip)[MONSPERYEAR]; int_fast64_t corr; int64_t hit; int64_t i; corr = 0; hit = 0; i = (sp == NULL) ? 0 : sp->leapcnt; while (--i >= 0) { lp = &sp->lsis[i]; if (*timep >= lp->ls_trans) { if (*timep == lp->ls_trans) { hit = ((i == 0 && lp->ls_corr > 0) || lp->ls_corr > sp->lsis[i - 1].ls_corr); if (hit) while (i > 0 && sp->lsis[i].ls_trans == sp->lsis[i - 1].ls_trans + 1 && sp->lsis[i].ls_corr == sp->lsis[i - 1].ls_corr + 1) { ++hit; --i; } } corr = lp->ls_corr; break; } } y = EPOCH_YEAR; tdays = *timep / SECSPERDAY; rem = *timep - tdays * SECSPERDAY; while (tdays < 0 || tdays >= year_lengths[isleap (y)]) { int64_t newy; int64_t tdelta; int64_t idelta; int64_t leapdays; tdelta = tdays / DAYSPERLYEAR; idelta = tdelta; if (idelta == 0) idelta = (tdays < 0) ? -1 : 1; newy = y; if (increment_overflow (&newy, idelta)) return NULL; leapdays = leaps_thru_end_of (newy - 1) - leaps_thru_end_of (y - 1); tdays -= ((int64_t) newy - y) * DAYSPERNYEAR; tdays -= leapdays; y = newy; } { int_fast32_t seconds; seconds = (int_fast32_t) (tdays * SECSPERDAY); tdays = seconds / SECSPERDAY; rem += seconds - tdays * SECSPERDAY; } /* ** Given the range, we can now fearlessly cast... */ idays = (int64_t) tdays; rem += offset - corr; while (rem < 0) { rem += SECSPERDAY; --idays; } while (rem >= SECSPERDAY) { rem -= SECSPERDAY; ++idays; } while (idays < 0) { if (increment_overflow (&y, -1)) return NULL; idays += year_lengths[isleap (y)]; } while (idays >= year_lengths[isleap (y)]) { idays -= year_lengths[isleap (y)]; if (increment_overflow (&y, 1)) return NULL; } tmp->tm_year = y; if (increment_overflow (&tmp->tm_year, -TM_YEAR_BASE)) return NULL; tmp->tm_yday = idays; /* ** The "extra" mods below avoid overflow problems. */ tmp->tm_wday = EPOCH_WDAY + ((y - EPOCH_YEAR) % DAYSPERWEEK) * (DAYSPERNYEAR % DAYSPERWEEK) + leaps_thru_end_of (y - 1) - leaps_thru_end_of (EPOCH_YEAR - 1) + idays; tmp->tm_wday %= DAYSPERWEEK; if (tmp->tm_wday < 0) tmp->tm_wday += DAYSPERWEEK; tmp->tm_hour = (int64_t) (rem / SECSPERHOUR); rem %= SECSPERHOUR; tmp->tm_min = (int64_t) (rem / SECSPERMIN); /* ** A positive leap second requires a special ** representation. This uses "... ??:59:60" et seq. */ tmp->tm_sec = (int64_t) (rem % SECSPERMIN) + hit; ip = mon_lengths + (isleap (y) ? 1 : 0); tmp->tm_mon = 0; while (idays >= (*ip)[tmp->tm_mon]) { idays -= (*ip)[tmp->tm_mon++]; BSON_ASSERT (tmp->tm_mon < MONSPERYEAR); } tmp->tm_mday = (int64_t) (idays + 1); tmp->tm_isdst = 0; #ifdef TM_GMTOFF tmp->TM_GMTOFF = offset; #endif /* defined TM_GMTOFF */ return tmp; } /* ** Adapted from code provided by Robert Elz, who writes: ** The "best" way to do mktime I think is based on an idea of Bob ** Kridle's (so its said...) from a long time ago. ** It does a binary search of the int64_t space. Since int64_t's are ** just 32 bits, its a max of 32 iterations (even at 64 bits it ** would still be very reasonable). */ #ifndef WRONG #define WRONG (-1) #endif /* !defined WRONG */ /* ** Normalize logic courtesy Paul Eggert. */ static int64_t increment_overflow (int64_t *const ip, int64_t j) { int64_t const i = *ip; /* ** If i >= 0 there can only be overflow if i + j > INT_MAX ** or if j > INT_MAX - i; given i >= 0, INT_MAX - i cannot overflow. ** If i < 0 there can only be overflow if i + j < INT_MIN ** or if j < INT_MIN - i; given i < 0, INT_MIN - i cannot overflow. */ if ((i >= 0) ? (j > INT_MAX - i) : (j < INT_MIN - i)) return true; *ip += j; return false; } static int64_t increment_overflow32 (int_fast32_t *const lp, int64_t const m) { int_fast32_t const l = *lp; if ((l >= 0) ? (m > INT_FAST32_MAX - l) : (m < INT_FAST32_MIN - l)) return true; *lp += (int_fast32_t) m; return false; } static int64_t normalize_overflow (int64_t *const tensptr, int64_t *const unitsptr, const int64_t base) { int64_t tensdelta; tensdelta = (*unitsptr >= 0) ? (*unitsptr / base) : (-1 - (-1 - *unitsptr) / base); *unitsptr -= tensdelta * base; return increment_overflow (tensptr, tensdelta); } static int64_t normalize_overflow32 (int_fast32_t *const tensptr, int64_t *const unitsptr, const int64_t base) { int64_t tensdelta; tensdelta = (*unitsptr >= 0) ? (*unitsptr / base) : (-1 - (-1 - *unitsptr) / base); *unitsptr -= tensdelta * base; return increment_overflow32 (tensptr, tensdelta); } static int64_t tmcomp (const struct bson_tm *const atmp, const struct bson_tm *const btmp) { int64_t result; if (atmp->tm_year != btmp->tm_year) return atmp->tm_year < btmp->tm_year ? -1 : 1; if ((result = (atmp->tm_mon - btmp->tm_mon)) == 0 && (result = (atmp->tm_mday - btmp->tm_mday)) == 0 && (result = (atmp->tm_hour - btmp->tm_hour)) == 0 && (result = (atmp->tm_min - btmp->tm_min)) == 0) result = atmp->tm_sec - btmp->tm_sec; return result; } static int64_t time2sub (struct bson_tm *const tmp, struct bson_tm *(*const funcp) (const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset, int64_t *const okayp, const int64_t do_norm_secs) { const struct state *sp; int64_t dir; int64_t i, j; int64_t saved_seconds; int_fast32_t li; int64_t lo; int64_t hi; int_fast32_t y; int64_t newt; int64_t t; struct bson_tm yourtm, mytm; *okayp = false; yourtm = *tmp; if (do_norm_secs) { if (normalize_overflow (&yourtm.tm_min, &yourtm.tm_sec, SECSPERMIN)) return WRONG; } if (normalize_overflow (&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR)) return WRONG; if (normalize_overflow (&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY)) return WRONG; y = (int_fast32_t) yourtm.tm_year; if (normalize_overflow32 (&y, &yourtm.tm_mon, MONSPERYEAR)) return WRONG; /* ** Turn y into an actual year number for now. ** It is converted back to an offset from TM_YEAR_BASE later. */ if (increment_overflow32 (&y, TM_YEAR_BASE)) return WRONG; while (yourtm.tm_mday <= 0) { if (increment_overflow32 (&y, -1)) return WRONG; li = y + (1 < yourtm.tm_mon); yourtm.tm_mday += year_lengths[isleap (li)]; } while (yourtm.tm_mday > DAYSPERLYEAR) { li = y + (1 < yourtm.tm_mon); yourtm.tm_mday -= year_lengths[isleap (li)]; if (increment_overflow32 (&y, 1)) return WRONG; } for (;;) { i = mon_lengths[isleap (y)][yourtm.tm_mon]; if (yourtm.tm_mday <= i) break; yourtm.tm_mday -= i; if (++yourtm.tm_mon >= MONSPERYEAR) { yourtm.tm_mon = 0; if (increment_overflow32 (&y, 1)) return WRONG; } } if (increment_overflow32 (&y, -TM_YEAR_BASE)) return WRONG; yourtm.tm_year = y; if (yourtm.tm_year != y) return WRONG; if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN) saved_seconds = 0; else if (y + TM_YEAR_BASE < EPOCH_YEAR) { /* ** We can't set tm_sec to 0, because that might push the ** time below the minimum representable time. ** Set tm_sec to 59 instead. ** This assumes that the minimum representable time is ** not in the same minute that a leap second was deleted from, ** which is a safer assumption than using 58 would be. */ if (increment_overflow (&yourtm.tm_sec, 1 - SECSPERMIN)) return WRONG; saved_seconds = yourtm.tm_sec; yourtm.tm_sec = SECSPERMIN - 1; } else { saved_seconds = yourtm.tm_sec; yourtm.tm_sec = 0; } /* ** Do a binary search. */ lo = INT64_MIN; hi = INT64_MAX; for (;;) { t = lo / 2 + hi / 2; if (t < lo) t = lo; else if (t > hi) t = hi; if ((*funcp) (&t, offset, &mytm) == NULL) { /* ** Assume that t is too extreme to be represented in ** a struct bson_tm; arrange things so that it is less ** extreme on the next pass. */ dir = (t > 0) ? 1 : -1; } else dir = tmcomp (&mytm, &yourtm); if (dir != 0) { if (t == lo) { if (t == time_t_max) return WRONG; ++t; ++lo; } else if (t == hi) { if (t == time_t_min) return WRONG; --t; --hi; } if (lo > hi) return WRONG; if (dir > 0) hi = t; else lo = t; continue; } if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst) break; /* ** Right time, wrong type. ** Hunt for right time, right type. ** It's okay to guess wrong since the guess ** gets checked. */ sp = (const struct state *) gmtptr; if (sp == NULL) return WRONG; for (i = sp->typecnt - 1; i >= 0; --i) { if (sp->ttis[i].tt_isdst != yourtm.tm_isdst) continue; for (j = sp->typecnt - 1; j >= 0; --j) { if (sp->ttis[j].tt_isdst == yourtm.tm_isdst) continue; newt = t + sp->ttis[j].tt_gmtoff - sp->ttis[i].tt_gmtoff; if ((*funcp) (&newt, offset, &mytm) == NULL) continue; if (tmcomp (&mytm, &yourtm) != 0) continue; if (mytm.tm_isdst != yourtm.tm_isdst) continue; /* ** We have a match. */ t = newt; goto label; } } return WRONG; } label: newt = t + saved_seconds; if ((newt < t) != (saved_seconds < 0)) return WRONG; t = newt; if ((*funcp) (&t, offset, tmp)) *okayp = true; return t; } static int64_t time2 (struct bson_tm *const tmp, struct bson_tm *(*const funcp) (const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset, int64_t *const okayp) { int64_t t; /* ** First try without normalization of seconds ** (in case tm_sec contains a value associated with a leap second). ** If that fails, try with normalization of seconds. */ t = time2sub (tmp, funcp, offset, okayp, false); return *okayp ? t : time2sub (tmp, funcp, offset, okayp, true); } static int64_t time1 (struct bson_tm *const tmp, struct bson_tm *(*const funcp) (const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset) { int64_t t; const struct state *sp; int64_t samei, otheri; int64_t sameind, otherind; int64_t i; int64_t nseen; int64_t seen[TZ_MAX_TYPES]; int64_t types[TZ_MAX_TYPES]; int64_t okay; if (tmp == NULL) { errno = EINVAL; return WRONG; } if (tmp->tm_isdst > 1) tmp->tm_isdst = 1; t = time2 (tmp, funcp, offset, &okay); if (okay) return t; if (tmp->tm_isdst < 0) #ifdef PCTS /* ** POSIX Conformance Test Suite code courtesy Grant Sullivan. */ tmp->tm_isdst = 0; /* reset to std and try again */ #else return t; #endif /* !defined PCTS */ /* ** We're supposed to assume that somebody took a time of one type ** and did some math on it that yielded a "struct tm" that's bad. ** We try to divine the type they started from and adjust to the ** type they need. */ sp = (const struct state *) gmtptr; if (sp == NULL) return WRONG; for (i = 0; i < sp->typecnt; ++i) seen[i] = false; nseen = 0; for (i = sp->timecnt - 1; i >= 0; --i) if (!seen[sp->types[i]]) { seen[sp->types[i]] = true; types[nseen++] = sp->types[i]; } for (sameind = 0; sameind < nseen; ++sameind) { samei = types[sameind]; if (sp->ttis[samei].tt_isdst != tmp->tm_isdst) continue; for (otherind = 0; otherind < nseen; ++otherind) { otheri = types[otherind]; if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst) continue; tmp->tm_sec += sp->ttis[otheri].tt_gmtoff - sp->ttis[samei].tt_gmtoff; tmp->tm_isdst = !tmp->tm_isdst; t = time2 (tmp, funcp, offset, &okay); if (okay) return t; tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff - sp->ttis[samei].tt_gmtoff; tmp->tm_isdst = !tmp->tm_isdst; } } return WRONG; } int64_t _bson_timegm (struct bson_tm *const tmp) { if (tmp != NULL) tmp->tm_isdst = 0; return time1 (tmp, gmtsub, 0L); } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-types.h000066400000000000000000000426401456567454500227060ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_TYPES_H #define BSON_TYPES_H #include #include #include #include #include #include BSON_BEGIN_DECLS /* *-------------------------------------------------------------------------- * * bson_unichar_t -- * * bson_unichar_t provides an unsigned 32-bit type for containing * unicode characters. When iterating UTF-8 sequences, this should * be used to avoid losing the high-bits of non-ascii characters. * * See also: * bson_string_append_unichar() * *-------------------------------------------------------------------------- */ typedef uint32_t bson_unichar_t; /** * @brief Flags configuring the creation of a bson_context_t */ typedef enum { /** Use default options */ BSON_CONTEXT_NONE = 0, /* Deprecated: Generating new OIDs from a bson_context_t is always thread-safe */ BSON_CONTEXT_THREAD_SAFE = (1 << 0), /* Deprecated: Does nothing and is ignored */ BSON_CONTEXT_DISABLE_HOST_CACHE = (1 << 1), /* Call getpid() instead of remembering the result of getpid() when using the context */ BSON_CONTEXT_DISABLE_PID_CACHE = (1 << 2), /* Deprecated: Does nothing */ BSON_CONTEXT_USE_TASK_ID = (1 << 3), } bson_context_flags_t; /** * bson_context_t: * * This structure manages context for the bson library. It handles * configuration for thread-safety and other performance related requirements. * Consumers will create a context and may use multiple under a variety of * situations. * * If your program calls fork(), you should initialize a new bson_context_t * using bson_context_init(). * * If you are using threading, it is suggested that you use a bson_context_t * per thread for best performance. Alternatively, you can initialize the * bson_context_t with BSON_CONTEXT_THREAD_SAFE, although a performance penalty * will be incurred. * * Many functions will require that you provide a bson_context_t such as OID * generation. * * This structure is opaque in that you cannot see the contents of the * structure. However, it is stack allocatable in that enough padding is * provided in _bson_context_t to hold the structure. */ typedef struct _bson_context_t bson_context_t; /** * bson_json_opts_t: * * This structure is used to pass options for serializing BSON into extended * JSON to the respective serialization methods. * * max_len can be either a non-negative integer, or BSON_MAX_LEN_UNLIMITED to * set no limit for serialization length. */ typedef struct _bson_json_opts_t bson_json_opts_t; /** * bson_t: * * This structure manages a buffer whose contents are a properly formatted * BSON document. You may perform various transforms on the BSON documents. * Additionally, it can be iterated over using bson_iter_t. * * See bson_iter_init() for iterating the contents of a bson_t. * * When building a bson_t structure using the various append functions, * memory allocations may occur. That is performed using power of two * allocations and realloc(). * * See http://bsonspec.org for the BSON document spec. * * This structure is meant to fit in two sequential 64-byte cachelines. */ #ifdef BSON_MEMCHECK BSON_ALIGNED_BEGIN (128) typedef struct _bson_t { uint32_t flags; /* Internal flags for the bson_t. */ uint32_t len; /* Length of BSON data. */ char *canary; /* For leak checks. */ uint8_t padding[120 - sizeof (char *)]; } bson_t BSON_ALIGNED_END (128); #else BSON_ALIGNED_BEGIN (128) typedef struct _bson_t { uint32_t flags; /* Internal flags for the bson_t. */ uint32_t len; /* Length of BSON data. */ uint8_t padding[120]; /* Padding for stack allocation. */ } bson_t BSON_ALIGNED_END (128); #endif /** * BSON_INITIALIZER: * * This macro can be used to initialize a #bson_t structure on the stack * without calling bson_init(). * * |[ * bson_t b = BSON_INITIALIZER; * ]| */ #ifdef BSON_MEMCHECK #define BSON_INITIALIZER \ { \ 3, 5, bson_malloc (1), {5}, \ } #else #define BSON_INITIALIZER \ { \ 3, 5, \ { \ 5 \ } \ } #endif BSON_STATIC_ASSERT2 (bson_t, sizeof (bson_t) == 128); /** * bson_oid_t: * * This structure contains the binary form of a BSON Object Id as specified * on http://bsonspec.org. If you would like the bson_oid_t in string form * see bson_oid_to_string() or bson_oid_to_string_r(). */ typedef struct { uint8_t bytes[12]; } bson_oid_t; BSON_STATIC_ASSERT2 (oid_t, sizeof (bson_oid_t) == 12); /** * bson_decimal128_t: * * @high The high-order bytes of the decimal128. This field contains sign, * combination bits, exponent, and part of the coefficient continuation. * @low The low-order bytes of the decimal128. This field contains the second * part of the coefficient continuation. * * This structure is a boxed type containing the value for the BSON decimal128 * type. The structure stores the 128 bits such that they correspond to the * native format for the IEEE decimal128 type, if it is implemented. **/ typedef struct { #if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN uint64_t low; uint64_t high; #elif BSON_BYTE_ORDER == BSON_BIG_ENDIAN uint64_t high; uint64_t low; #endif } bson_decimal128_t; /** * bson_validate_flags_t: * * This enumeration is used for validation of BSON documents. It allows * selective control on what you wish to validate. * * %BSON_VALIDATE_NONE: No additional validation occurs. * %BSON_VALIDATE_UTF8: Check that strings are valid UTF-8. * %BSON_VALIDATE_DOLLAR_KEYS: Check that keys do not start with $. * %BSON_VALIDATE_DOT_KEYS: Check that keys do not contain a period. * %BSON_VALIDATE_UTF8_ALLOW_NULL: Allow NUL bytes in UTF-8 text. * %BSON_VALIDATE_EMPTY_KEYS: Prohibit zero-length field names */ typedef enum { BSON_VALIDATE_NONE = 0, BSON_VALIDATE_UTF8 = (1 << 0), BSON_VALIDATE_DOLLAR_KEYS = (1 << 1), BSON_VALIDATE_DOT_KEYS = (1 << 2), BSON_VALIDATE_UTF8_ALLOW_NULL = (1 << 3), BSON_VALIDATE_EMPTY_KEYS = (1 << 4), } bson_validate_flags_t; /** * bson_type_t: * * This enumeration contains all of the possible types within a BSON document. * Use bson_iter_type() to fetch the type of a field while iterating over it. */ typedef enum { BSON_TYPE_EOD = 0x00, BSON_TYPE_DOUBLE = 0x01, BSON_TYPE_UTF8 = 0x02, BSON_TYPE_DOCUMENT = 0x03, BSON_TYPE_ARRAY = 0x04, BSON_TYPE_BINARY = 0x05, BSON_TYPE_UNDEFINED = 0x06, BSON_TYPE_OID = 0x07, BSON_TYPE_BOOL = 0x08, BSON_TYPE_DATE_TIME = 0x09, BSON_TYPE_NULL = 0x0A, BSON_TYPE_REGEX = 0x0B, BSON_TYPE_DBPOINTER = 0x0C, BSON_TYPE_CODE = 0x0D, BSON_TYPE_SYMBOL = 0x0E, BSON_TYPE_CODEWSCOPE = 0x0F, BSON_TYPE_INT32 = 0x10, BSON_TYPE_TIMESTAMP = 0x11, BSON_TYPE_INT64 = 0x12, BSON_TYPE_DECIMAL128 = 0x13, BSON_TYPE_MAXKEY = 0x7F, BSON_TYPE_MINKEY = 0xFF, } bson_type_t; /** * bson_subtype_t: * * This enumeration contains the various subtypes that may be used in a binary * field. See http://bsonspec.org for more information. */ typedef enum { BSON_SUBTYPE_BINARY = 0x00, BSON_SUBTYPE_FUNCTION = 0x01, BSON_SUBTYPE_BINARY_DEPRECATED = 0x02, BSON_SUBTYPE_UUID_DEPRECATED = 0x03, BSON_SUBTYPE_UUID = 0x04, BSON_SUBTYPE_MD5 = 0x05, BSON_SUBTYPE_ENCRYPTED = 0x06, BSON_SUBTYPE_COLUMN = 0x07, BSON_SUBTYPE_SENSITIVE = 0x08, BSON_SUBTYPE_USER = 0x80, } bson_subtype_t; /* *-------------------------------------------------------------------------- * * bson_value_t -- * * A boxed type to contain various bson_type_t types. * * See also: * bson_value_copy() * bson_value_destroy() * *-------------------------------------------------------------------------- */ BSON_ALIGNED_BEGIN (8) typedef struct _bson_value_t { bson_type_t value_type; int32_t padding; union { bson_oid_t v_oid; int64_t v_int64; int32_t v_int32; int8_t v_int8; double v_double; bool v_bool; int64_t v_datetime; struct { uint32_t timestamp; uint32_t increment; } v_timestamp; struct { char *str; uint32_t len; } v_utf8; struct { uint8_t *data; uint32_t data_len; } v_doc; struct { uint8_t *data; uint32_t data_len; bson_subtype_t subtype; } v_binary; struct { char *regex; char *options; } v_regex; struct { char *collection; uint32_t collection_len; bson_oid_t oid; } v_dbpointer; struct { char *code; uint32_t code_len; } v_code; struct { char *code; uint8_t *scope_data; uint32_t code_len; uint32_t scope_len; } v_codewscope; struct { char *symbol; uint32_t len; } v_symbol; bson_decimal128_t v_decimal128; } value; } bson_value_t BSON_ALIGNED_END (8); /** * bson_iter_t: * * This structure manages iteration over a bson_t structure. It keeps track * of the location of the current key and value within the buffer. Using the * various functions to get the value of the iter will read from these * locations. * * This structure is safe to discard on the stack. No cleanup is necessary * after using it. */ BSON_ALIGNED_BEGIN (128) typedef struct { const uint8_t *raw; /* The raw buffer being iterated. */ uint32_t len; /* The length of raw. */ uint32_t off; /* The offset within the buffer. */ uint32_t type; /* The offset of the type byte. */ uint32_t key; /* The offset of the key byte. */ uint32_t d1; /* The offset of the first data byte. */ uint32_t d2; /* The offset of the second data byte. */ uint32_t d3; /* The offset of the third data byte. */ uint32_t d4; /* The offset of the fourth data byte. */ uint32_t next_off; /* The offset of the next field. */ uint32_t err_off; /* The offset of the error. */ bson_value_t value; /* Internal value for various state. */ } bson_iter_t BSON_ALIGNED_END (128); /** * bson_reader_t: * * This structure is used to iterate over a sequence of BSON documents. It * allows for them to be iterated with the possibility of no additional * memory allocations under certain circumstances such as reading from an * incoming mongo packet. */ BSON_ALIGNED_BEGIN (BSON_ALIGN_OF_PTR) typedef struct { uint32_t type; /*< private >*/ } bson_reader_t BSON_ALIGNED_END (BSON_ALIGN_OF_PTR); /** * bson_visitor_t: * * This structure contains a series of pointers that can be executed for * each field of a BSON document based on the field type. * * For example, if an int32 field is found, visit_int32 will be called. * * When visiting each field using bson_iter_visit_all(), you may provide a * data pointer that will be provided with each callback. This might be useful * if you are marshaling to another language. * * You may pre-maturely stop the visitation of fields by returning true in your * visitor. Returning false will continue visitation to further fields. */ BSON_ALIGNED_BEGIN (8) typedef struct { /* run before / after descending into a document */ bool (*visit_before) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_after) (const bson_iter_t *iter, const char *key, void *data); /* corrupt BSON, or unsupported type and visit_unsupported_type not set */ void (*visit_corrupt) (const bson_iter_t *iter, void *data); /* normal bson field callbacks */ bool (*visit_double) (const bson_iter_t *iter, const char *key, double v_double, void *data); bool (*visit_utf8) (const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data); bool (*visit_document) (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); bool (*visit_array) (const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data); bool (*visit_binary) (const bson_iter_t *iter, const char *key, bson_subtype_t v_subtype, size_t v_binary_len, const uint8_t *v_binary, void *data); /* normal field with deprecated "Undefined" BSON type */ bool (*visit_undefined) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_oid) (const bson_iter_t *iter, const char *key, const bson_oid_t *v_oid, void *data); bool (*visit_bool) (const bson_iter_t *iter, const char *key, bool v_bool, void *data); bool (*visit_date_time) (const bson_iter_t *iter, const char *key, int64_t msec_since_epoch, void *data); bool (*visit_null) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_regex) (const bson_iter_t *iter, const char *key, const char *v_regex, const char *v_options, void *data); bool (*visit_dbpointer) (const bson_iter_t *iter, const char *key, size_t v_collection_len, const char *v_collection, const bson_oid_t *v_oid, void *data); bool (*visit_code) (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, void *data); bool (*visit_symbol) (const bson_iter_t *iter, const char *key, size_t v_symbol_len, const char *v_symbol, void *data); bool (*visit_codewscope) (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, const bson_t *v_scope, void *data); bool (*visit_int32) (const bson_iter_t *iter, const char *key, int32_t v_int32, void *data); bool (*visit_timestamp) (const bson_iter_t *iter, const char *key, uint32_t v_timestamp, uint32_t v_increment, void *data); bool (*visit_int64) (const bson_iter_t *iter, const char *key, int64_t v_int64, void *data); bool (*visit_maxkey) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_minkey) (const bson_iter_t *iter, const char *key, void *data); /* if set, called instead of visit_corrupt when an apparently valid BSON * includes an unrecognized field type (reading future version of BSON) */ void (*visit_unsupported_type) (const bson_iter_t *iter, const char *key, uint32_t type_code, void *data); bool (*visit_decimal128) (const bson_iter_t *iter, const char *key, const bson_decimal128_t *v_decimal128, void *data); void *padding[7]; } bson_visitor_t BSON_ALIGNED_END (8); #define BSON_ERROR_BUFFER_SIZE 504 BSON_ALIGNED_BEGIN (8) typedef struct _bson_error_t { uint32_t domain; uint32_t code; char message[BSON_ERROR_BUFFER_SIZE]; } bson_error_t BSON_ALIGNED_END (8); BSON_STATIC_ASSERT2 (error_t, sizeof (bson_error_t) == 512); /** * bson_next_power_of_two: * @v: A 32-bit unsigned integer of required bytes. * * Determines the next larger power of two for the value of @v * in a constant number of operations. * * It is up to the caller to guarantee this will not overflow. * * Returns: The next power of 2 from @v. */ static BSON_INLINE size_t bson_next_power_of_two (size_t v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; #if BSON_WORD_SIZE == 64 v |= v >> 32; #endif v++; return v; } static BSON_INLINE bool bson_is_power_of_two (uint32_t v) { return ((v != 0) && ((v & (v - 1)) == 0)); } BSON_END_DECLS #endif /* BSON_TYPES_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-utf8.c000066400000000000000000000263211456567454500224210ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include /* *-------------------------------------------------------------------------- * * _bson_utf8_get_sequence -- * * Determine the sequence length of the first UTF-8 character in * @utf8. The sequence length is stored in @seq_length and the mask * for the first character is stored in @first_mask. * * Returns: * None. * * Side effects: * @seq_length is set. * @first_mask is set. * *-------------------------------------------------------------------------- */ static BSON_INLINE void _bson_utf8_get_sequence (const char *utf8, /* IN */ uint8_t *seq_length, /* OUT */ uint8_t *first_mask) /* OUT */ { unsigned char c = *(const unsigned char *) utf8; uint8_t m; uint8_t n; /* * See the following[1] for a description of what the given multi-byte * sequences will be based on the bits set of the first byte. We also need * to mask the first byte based on that. All subsequent bytes are masked * against 0x3F. * * [1] http://www.joelonsoftware.com/articles/Unicode.html */ if ((c & 0x80) == 0) { n = 1; m = 0x7F; } else if ((c & 0xE0) == 0xC0) { n = 2; m = 0x1F; } else if ((c & 0xF0) == 0xE0) { n = 3; m = 0x0F; } else if ((c & 0xF8) == 0xF0) { n = 4; m = 0x07; } else { n = 0; m = 0; } *seq_length = n; *first_mask = m; } /* *-------------------------------------------------------------------------- * * bson_utf8_validate -- * * Validates that @utf8 is a valid UTF-8 string. Note that we only * support UTF-8 characters which have sequence length less than or equal * to 4 bytes (RFC 3629). * * If @allow_null is true, then \0 is allowed within @utf8_len bytes * of @utf8. Generally, this is bad practice since the main point of * UTF-8 strings is that they can be used with strlen() and friends. * However, some languages such as Python can send UTF-8 encoded * strings with NUL's in them. * * Parameters: * @utf8: A UTF-8 encoded string. * @utf8_len: The length of @utf8 in bytes. * @allow_null: If \0 is allowed within @utf8, excluding trailing \0. * * Returns: * true if @utf8 is valid UTF-8. otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_utf8_validate (const char *utf8, /* IN */ size_t utf8_len, /* IN */ bool allow_null) /* IN */ { bson_unichar_t c; uint8_t first_mask; uint8_t seq_length; size_t i; size_t j; BSON_ASSERT (utf8); for (i = 0; i < utf8_len; i += seq_length) { _bson_utf8_get_sequence (&utf8[i], &seq_length, &first_mask); /* * Ensure we have a valid multi-byte sequence length. */ if (!seq_length) { return false; } /* * Ensure we have enough bytes left. */ if ((utf8_len - i) < seq_length) { return false; } /* * Also calculate the next char as a unichar so we can * check code ranges for non-shortest form. */ c = utf8[i] & first_mask; /* * Check the high-bits for each additional sequence byte. */ for (j = i + 1; j < (i + seq_length); j++) { c = (c << 6) | (utf8[j] & 0x3F); if ((utf8[j] & 0xC0) != 0x80) { return false; } } /* * Check for NULL bytes afterwards. * * Hint: if you want to optimize this function, starting here to do * this in the same pass as the data above would probably be a good * idea. You would add a branch into the inner loop, but save possibly * on cache-line bouncing on larger strings. Just a thought. */ if (!allow_null) { for (j = 0; j < seq_length; j++) { if (((i + j) > utf8_len) || !utf8[i + j]) { return false; } } } /* * Code point won't fit in utf-16, not allowed. */ if (c > 0x0010FFFF) { return false; } /* * Byte is in reserved range for UTF-16 high-marks * for surrogate pairs. */ if ((c & 0xFFFFF800) == 0xD800) { return false; } /* * Check non-shortest form unicode. */ switch (seq_length) { case 1: if (c <= 0x007F) { continue; } return false; case 2: if ((c >= 0x0080) && (c <= 0x07FF)) { continue; } else if (c == 0) { /* Two-byte representation for NULL. */ if (!allow_null) { return false; } continue; } return false; case 3: if (((c >= 0x0800) && (c <= 0x0FFF)) || ((c >= 0x1000) && (c <= 0xFFFF))) { continue; } return false; case 4: if (((c >= 0x10000) && (c <= 0x3FFFF)) || ((c >= 0x40000) && (c <= 0xFFFFF)) || ((c >= 0x100000) && (c <= 0x10FFFF))) { continue; } return false; default: return false; } } return true; } /* *-------------------------------------------------------------------------- * * bson_utf8_escape_for_json -- * * Allocates a new string matching @utf8 except that special * characters in JSON will be escaped. The resulting string is also * UTF-8 encoded. * * Both " and \ characters will be escaped. Additionally, if a NUL * byte is found before @utf8_len bytes, it will be converted to the * two byte UTF-8 sequence. * * Parameters: * @utf8: A UTF-8 encoded string. * @utf8_len: The length of @utf8 in bytes or -1 if NUL terminated. * * Returns: * A newly allocated string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_utf8_escape_for_json (const char *utf8, /* IN */ ssize_t utf8_len) /* IN */ { bson_unichar_t c; bson_string_t *str; bool length_provided = true; const char *end; BSON_ASSERT (utf8); str = bson_string_new (NULL); if (utf8_len < 0) { length_provided = false; utf8_len = strlen (utf8); } end = utf8 + utf8_len; while (utf8 < end) { c = bson_utf8_get_char (utf8); switch (c) { case '\\': case '"': bson_string_append_c (str, '\\'); bson_string_append_unichar (str, c); break; case '\b': bson_string_append (str, "\\b"); break; case '\f': bson_string_append (str, "\\f"); break; case '\n': bson_string_append (str, "\\n"); break; case '\r': bson_string_append (str, "\\r"); break; case '\t': bson_string_append (str, "\\t"); break; default: if (c < ' ') { bson_string_append_printf (str, "\\u%04x", (unsigned) c); } else { bson_string_append_unichar (str, c); } break; } if (c) { utf8 = bson_utf8_next_char (utf8); } else { if (length_provided && !*utf8) { /* we escaped nil as '\u0000', now advance past it */ utf8++; } else { /* invalid UTF-8 */ bson_string_free (str, true); return NULL; } } } return bson_string_free (str, false); } /* *-------------------------------------------------------------------------- * * bson_utf8_get_char -- * * Fetches the next UTF-8 character from the UTF-8 sequence. * * Parameters: * @utf8: A string containing validated UTF-8. * * Returns: * A 32-bit bson_unichar_t reprsenting the multi-byte sequence. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_unichar_t bson_utf8_get_char (const char *utf8) /* IN */ { bson_unichar_t c; uint8_t mask; uint8_t num; int i; BSON_ASSERT (utf8); _bson_utf8_get_sequence (utf8, &num, &mask); c = (*utf8) & mask; for (i = 1; i < num; i++) { c = (c << 6) | (utf8[i] & 0x3F); } return c; } /* *-------------------------------------------------------------------------- * * bson_utf8_next_char -- * * Returns an incremented pointer to the beginning of the next * multi-byte sequence in @utf8. * * Parameters: * @utf8: A string containing validated UTF-8. * * Returns: * An incremented pointer in @utf8. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * bson_utf8_next_char (const char *utf8) /* IN */ { uint8_t mask; uint8_t num; BSON_ASSERT (utf8); _bson_utf8_get_sequence (utf8, &num, &mask); return utf8 + num; } /* *-------------------------------------------------------------------------- * * bson_utf8_from_unichar -- * * Converts the unichar to a sequence of utf8 bytes and stores those * in @utf8. The number of bytes in the sequence are stored in @len. * * Parameters: * @unichar: A bson_unichar_t. * @utf8: A location for the multi-byte sequence. * @len: A location for number of bytes stored in @utf8. * * Returns: * None. * * Side effects: * @utf8 is set. * @len is set. * *-------------------------------------------------------------------------- */ void bson_utf8_from_unichar (bson_unichar_t unichar, /* IN */ char utf8[BSON_ENSURE_ARRAY_PARAM_SIZE (6)], /* OUT */ uint32_t *len) /* OUT */ { BSON_ASSERT (utf8); BSON_ASSERT (len); if (unichar <= 0x7F) { utf8[0] = unichar; *len = 1; } else if (unichar <= 0x7FF) { *len = 2; utf8[0] = 0xC0 | ((unichar >> 6) & 0x3F); utf8[1] = 0x80 | ((unichar) &0x3F); } else if (unichar <= 0xFFFF) { *len = 3; utf8[0] = 0xE0 | ((unichar >> 12) & 0xF); utf8[1] = 0x80 | ((unichar >> 6) & 0x3F); utf8[2] = 0x80 | ((unichar) &0x3F); } else if (unichar <= 0x1FFFFF) { *len = 4; utf8[0] = 0xF0 | ((unichar >> 18) & 0x7); utf8[1] = 0x80 | ((unichar >> 12) & 0x3F); utf8[2] = 0x80 | ((unichar >> 6) & 0x3F); utf8[3] = 0x80 | ((unichar) &0x3F); } else { *len = 0; } } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-utf8.h000066400000000000000000000022641456567454500224260ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_UTF8_H #define BSON_UTF8_H #include #include BSON_BEGIN_DECLS BSON_EXPORT (bool) bson_utf8_validate (const char *utf8, size_t utf8_len, bool allow_null); BSON_EXPORT (char *) bson_utf8_escape_for_json (const char *utf8, ssize_t utf8_len); BSON_EXPORT (bson_unichar_t) bson_utf8_get_char (const char *utf8); BSON_EXPORT (const char *) bson_utf8_next_char (const char *utf8); BSON_EXPORT (void) bson_utf8_from_unichar (bson_unichar_t unichar, char utf8[6], uint32_t *len); BSON_END_DECLS #endif /* BSON_UTF8_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-value.c000066400000000000000000000146711456567454500226540ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include void bson_value_copy (const bson_value_t *src, /* IN */ bson_value_t *dst) /* OUT */ { BSON_ASSERT (src); BSON_ASSERT (dst); dst->value_type = src->value_type; switch (src->value_type) { case BSON_TYPE_DOUBLE: dst->value.v_double = src->value.v_double; break; case BSON_TYPE_UTF8: dst->value.v_utf8.len = src->value.v_utf8.len; dst->value.v_utf8.str = bson_malloc (src->value.v_utf8.len + 1); memcpy ( dst->value.v_utf8.str, src->value.v_utf8.str, dst->value.v_utf8.len); dst->value.v_utf8.str[dst->value.v_utf8.len] = '\0'; break; case BSON_TYPE_DOCUMENT: case BSON_TYPE_ARRAY: dst->value.v_doc.data_len = src->value.v_doc.data_len; dst->value.v_doc.data = bson_malloc (src->value.v_doc.data_len); memcpy (dst->value.v_doc.data, src->value.v_doc.data, dst->value.v_doc.data_len); break; case BSON_TYPE_BINARY: dst->value.v_binary.subtype = src->value.v_binary.subtype; dst->value.v_binary.data_len = src->value.v_binary.data_len; dst->value.v_binary.data = bson_malloc (src->value.v_binary.data_len); if (dst->value.v_binary.data_len) { memcpy (dst->value.v_binary.data, src->value.v_binary.data, dst->value.v_binary.data_len); } break; case BSON_TYPE_OID: bson_oid_copy (&src->value.v_oid, &dst->value.v_oid); break; case BSON_TYPE_BOOL: dst->value.v_bool = src->value.v_bool; break; case BSON_TYPE_DATE_TIME: dst->value.v_datetime = src->value.v_datetime; break; case BSON_TYPE_REGEX: dst->value.v_regex.regex = bson_strdup (src->value.v_regex.regex); dst->value.v_regex.options = bson_strdup (src->value.v_regex.options); break; case BSON_TYPE_DBPOINTER: dst->value.v_dbpointer.collection_len = src->value.v_dbpointer.collection_len; dst->value.v_dbpointer.collection = bson_malloc (src->value.v_dbpointer.collection_len + 1); memcpy (dst->value.v_dbpointer.collection, src->value.v_dbpointer.collection, dst->value.v_dbpointer.collection_len); dst->value.v_dbpointer.collection[dst->value.v_dbpointer.collection_len] = '\0'; bson_oid_copy (&src->value.v_dbpointer.oid, &dst->value.v_dbpointer.oid); break; case BSON_TYPE_CODE: dst->value.v_code.code_len = src->value.v_code.code_len; dst->value.v_code.code = bson_malloc (src->value.v_code.code_len + 1); memcpy (dst->value.v_code.code, src->value.v_code.code, dst->value.v_code.code_len); dst->value.v_code.code[dst->value.v_code.code_len] = '\0'; break; case BSON_TYPE_SYMBOL: dst->value.v_symbol.len = src->value.v_symbol.len; dst->value.v_symbol.symbol = bson_malloc (src->value.v_symbol.len + 1); memcpy (dst->value.v_symbol.symbol, src->value.v_symbol.symbol, dst->value.v_symbol.len); dst->value.v_symbol.symbol[dst->value.v_symbol.len] = '\0'; break; case BSON_TYPE_CODEWSCOPE: dst->value.v_codewscope.code_len = src->value.v_codewscope.code_len; dst->value.v_codewscope.code = bson_malloc (src->value.v_codewscope.code_len + 1); memcpy (dst->value.v_codewscope.code, src->value.v_codewscope.code, dst->value.v_codewscope.code_len); dst->value.v_codewscope.code[dst->value.v_codewscope.code_len] = '\0'; dst->value.v_codewscope.scope_len = src->value.v_codewscope.scope_len; dst->value.v_codewscope.scope_data = bson_malloc (src->value.v_codewscope.scope_len); memcpy (dst->value.v_codewscope.scope_data, src->value.v_codewscope.scope_data, dst->value.v_codewscope.scope_len); break; case BSON_TYPE_INT32: dst->value.v_int32 = src->value.v_int32; break; case BSON_TYPE_TIMESTAMP: dst->value.v_timestamp.timestamp = src->value.v_timestamp.timestamp; dst->value.v_timestamp.increment = src->value.v_timestamp.increment; break; case BSON_TYPE_INT64: dst->value.v_int64 = src->value.v_int64; break; case BSON_TYPE_DECIMAL128: dst->value.v_decimal128 = src->value.v_decimal128; break; case BSON_TYPE_UNDEFINED: case BSON_TYPE_NULL: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: break; case BSON_TYPE_EOD: default: BSON_ASSERT (false); return; } } void bson_value_destroy (bson_value_t *value) /* IN */ { if (!value) { return; } switch (value->value_type) { case BSON_TYPE_UTF8: bson_free (value->value.v_utf8.str); break; case BSON_TYPE_DOCUMENT: case BSON_TYPE_ARRAY: bson_free (value->value.v_doc.data); break; case BSON_TYPE_BINARY: bson_free (value->value.v_binary.data); break; case BSON_TYPE_REGEX: bson_free (value->value.v_regex.regex); bson_free (value->value.v_regex.options); break; case BSON_TYPE_DBPOINTER: bson_free (value->value.v_dbpointer.collection); break; case BSON_TYPE_CODE: bson_free (value->value.v_code.code); break; case BSON_TYPE_SYMBOL: bson_free (value->value.v_symbol.symbol); break; case BSON_TYPE_CODEWSCOPE: bson_free (value->value.v_codewscope.code); bson_free (value->value.v_codewscope.scope_data); break; case BSON_TYPE_DOUBLE: case BSON_TYPE_UNDEFINED: case BSON_TYPE_OID: case BSON_TYPE_BOOL: case BSON_TYPE_DATE_TIME: case BSON_TYPE_NULL: case BSON_TYPE_INT32: case BSON_TYPE_TIMESTAMP: case BSON_TYPE_INT64: case BSON_TYPE_DECIMAL128: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: case BSON_TYPE_EOD: default: break; } } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-value.h000066400000000000000000000016541456567454500226560ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_VALUE_H #define BSON_VALUE_H #include #include BSON_BEGIN_DECLS BSON_EXPORT (void) bson_value_copy (const bson_value_t *src, bson_value_t *dst); BSON_EXPORT (void) bson_value_destroy (bson_value_t *value); BSON_END_DECLS #endif /* BSON_VALUE_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-version-functions.c000066400000000000000000000032001456567454500252150ustar00rootroot00000000000000/* * Copyright 2015 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include /** * bson_get_major_version: * * Helper function to return the runtime major version of the library. */ int bson_get_major_version (void) { return BSON_MAJOR_VERSION; } /** * bson_get_minor_version: * * Helper function to return the runtime minor version of the library. */ int bson_get_minor_version (void) { return BSON_MINOR_VERSION; } /** * bson_get_micro_version: * * Helper function to return the runtime micro version of the library. */ int bson_get_micro_version (void) { return BSON_MICRO_VERSION; } /** * bson_get_version: * * Helper function to return the runtime string version of the library. */ const char * bson_get_version (void) { return BSON_VERSION_S; } /** * bson_check_version: * * True if libmongoc's version is greater than or equal to the required * version. */ bool bson_check_version (int required_major, int required_minor, int required_micro) { return BSON_CHECK_VERSION (required_major, required_minor, required_micro); } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-version-functions.h000066400000000000000000000021131456567454500252240ustar00rootroot00000000000000/* * Copyright 2015 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_VERSION_FUNCTIONS_H #define BSON_VERSION_FUNCTIONS_H #include BSON_BEGIN_DECLS BSON_EXPORT (int) bson_get_major_version (void); BSON_EXPORT (int) bson_get_minor_version (void); BSON_EXPORT (int) bson_get_micro_version (void); BSON_EXPORT (const char *) bson_get_version (void); BSON_EXPORT (bool) bson_check_version (int required_major, int required_minor, int required_micro); BSON_END_DECLS #endif /* BSON_VERSION_FUNCTIONS_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-version.h.in000066400000000000000000000047641456567454500236410ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(BSON_INSIDE) && !defined(BSON_COMPILATION) #error "Only can be included directly." #endif // clang-format off #ifndef BSON_VERSION_H #define BSON_VERSION_H /** * BSON_MAJOR_VERSION: * * BSON major version component (e.g. 1 if %BSON_VERSION is 1.2.3) */ #define BSON_MAJOR_VERSION (@libbson_VERSION_MAJOR@) /** * BSON_MINOR_VERSION: * * BSON minor version component (e.g. 2 if %BSON_VERSION is 1.2.3) */ #define BSON_MINOR_VERSION (@libbson_VERSION_MINOR@) /** * BSON_MICRO_VERSION: * * BSON micro version component (e.g. 3 if %BSON_VERSION is 1.2.3) */ #define BSON_MICRO_VERSION (@libbson_VERSION_PATCH@) /** * BSON_PRERELEASE_VERSION: * * BSON prerelease version component (e.g. pre if %BSON_VERSION is 1.2.3-pre) */ #define BSON_PRERELEASE_VERSION (@libbson_VERSION_PRERELEASE@) /** * BSON_VERSION: * * BSON version. */ #define BSON_VERSION (@libbson_VERSION_FULL@) /** * BSON_VERSION_S: * * BSON version, encoded as a string, useful for printing and * concatenation. */ #define BSON_VERSION_S "@libbson_VERSION_FULL@" /** * BSON_VERSION_HEX: * * BSON version, encoded as an hexadecimal number, useful for * integer comparisons. */ #define BSON_VERSION_HEX (BSON_MAJOR_VERSION << 24 | \ BSON_MINOR_VERSION << 16 | \ BSON_MICRO_VERSION << 8) /** * BSON_CHECK_VERSION: * @major: required major version * @minor: required minor version * @micro: required micro version * * Compile-time version checking. Evaluates to %TRUE if the version * of BSON is greater than or equal to the required one. */ #define BSON_CHECK_VERSION(major,minor,micro) \ (BSON_MAJOR_VERSION > (major) || \ (BSON_MAJOR_VERSION == (major) && BSON_MINOR_VERSION > (minor)) || \ (BSON_MAJOR_VERSION == (major) && BSON_MINOR_VERSION == (minor) && \ BSON_MICRO_VERSION >= (micro))) #endif /* BSON_VERSION_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson-writer.c000066400000000000000000000153171456567454500230520ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include struct _bson_writer_t { bool ready; uint8_t **buf; size_t *buflen; size_t offset; bson_realloc_func realloc_func; void *realloc_func_ctx; bson_t b; }; /* *-------------------------------------------------------------------------- * * bson_writer_new -- * * Creates a new instance of bson_writer_t using the buffer, length, * offset, and realloc() function supplied. * * The caller is expected to clean up the structure when finished * using bson_writer_destroy(). * * Parameters: * @buf: (inout): A pointer to a target buffer. * @buflen: (inout): A pointer to the buffer length. * @offset: The offset in the target buffer to start from. * @realloc_func: A realloc() style function or NULL. * * Returns: * A newly allocated bson_writer_t that should be freed with * bson_writer_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_writer_t * bson_writer_new (uint8_t **buf, /* IN */ size_t *buflen, /* IN */ size_t offset, /* IN */ bson_realloc_func realloc_func, /* IN */ void *realloc_func_ctx) /* IN */ { bson_writer_t *writer; writer = BSON_ALIGNED_ALLOC0 (bson_writer_t); writer->buf = buf; writer->buflen = buflen; writer->offset = offset; writer->realloc_func = realloc_func; writer->realloc_func_ctx = realloc_func_ctx; writer->ready = true; return writer; } /* *-------------------------------------------------------------------------- * * bson_writer_destroy -- * * Cleanup after @writer and release any allocated memory. Note that * the buffer supplied to bson_writer_new() is NOT freed from this * method. The caller is responsible for that. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_writer_destroy (bson_writer_t *writer) /* IN */ { bson_free (writer); } /* *-------------------------------------------------------------------------- * * bson_writer_get_length -- * * Fetches the current length of the content written by the buffer * (including the initial offset). This includes a partly written * document currently being written. * * This is useful if you want to check to see if you've passed a given * memory boundary that cannot be sent in a packet. See * bson_writer_rollback() to abort the current document being written. * * Returns: * The number of bytes written plus initial offset. * * Side effects: * None. * *-------------------------------------------------------------------------- */ size_t bson_writer_get_length (bson_writer_t *writer) /* IN */ { return writer->offset + writer->b.len; } /* *-------------------------------------------------------------------------- * * bson_writer_begin -- * * Begins writing a new document. The caller may use the bson * structure to write out a new BSON document. When completed, the * caller must call either bson_writer_end() or * bson_writer_rollback(). * * Parameters: * @writer: A bson_writer_t. * @bson: (out): A location for a bson_t*. * * Returns: * true if the underlying realloc was successful; otherwise false. * * Side effects: * @bson is initialized if true is returned. * *-------------------------------------------------------------------------- */ bool bson_writer_begin (bson_writer_t *writer, /* IN */ bson_t **bson) /* OUT */ { bson_impl_alloc_t *b; bool grown = false; BSON_ASSERT (writer); BSON_ASSERT (writer->ready); BSON_ASSERT (bson); writer->ready = false; memset (&writer->b, 0, sizeof (bson_t)); b = (bson_impl_alloc_t *) &writer->b; b->flags = BSON_FLAG_STATIC | BSON_FLAG_NO_FREE; b->len = 5; b->parent = NULL; b->buf = writer->buf; b->buflen = writer->buflen; b->offset = writer->offset; b->alloc = NULL; b->alloclen = 0; b->realloc = writer->realloc_func; b->realloc_func_ctx = writer->realloc_func_ctx; while ((writer->offset + writer->b.len) > *writer->buflen) { if (!writer->realloc_func) { memset (&writer->b, 0, sizeof (bson_t)); writer->ready = true; return false; } grown = true; if (!*writer->buflen) { *writer->buflen = 64; } else { (*writer->buflen) *= 2; } } if (grown) { *writer->buf = writer->realloc_func ( *writer->buf, *writer->buflen, writer->realloc_func_ctx); } memset ((*writer->buf) + writer->offset + 1, 0, 5); (*writer->buf)[writer->offset] = 5; *bson = &writer->b; return true; } /* *-------------------------------------------------------------------------- * * bson_writer_end -- * * Complete writing of a bson_writer_t to the buffer supplied. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_writer_end (bson_writer_t *writer) /* IN */ { BSON_ASSERT (writer); BSON_ASSERT (!writer->ready); writer->offset += writer->b.len; memset (&writer->b, 0, sizeof (bson_t)); writer->ready = true; } /* *-------------------------------------------------------------------------- * * bson_writer_rollback -- * * Abort the appending of the current bson_t to the memory region * managed by @writer. This is useful if you detected that you went * past a particular memory limit. For example, MongoDB has 48MB * message limits. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_writer_rollback (bson_writer_t *writer) /* IN */ { BSON_ASSERT (writer); if (writer->b.len) { memset (&writer->b, 0, sizeof (bson_t)); } writer->ready = true; } mongo-c-driver-1.26.0/src/libbson/src/bson/bson-writer.h000066400000000000000000000033671456567454500230610ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_WRITER_H #define BSON_WRITER_H #include "bson.h" BSON_BEGIN_DECLS /** * bson_writer_t: * * The bson_writer_t structure is a helper for writing a series of BSON * documents to a single malloc() buffer. You can provide a realloc() style * function to grow the buffer as you go. * * This is useful if you want to build a series of BSON documents right into * the target buffer for an outgoing packet. The offset parameter allows you to * start at an offset of the target buffer. */ typedef struct _bson_writer_t bson_writer_t; BSON_EXPORT (bson_writer_t *) bson_writer_new (uint8_t **buf, size_t *buflen, size_t offset, bson_realloc_func realloc_func, void *realloc_func_ctx); BSON_EXPORT (void) bson_writer_destroy (bson_writer_t *writer); BSON_EXPORT (size_t) bson_writer_get_length (bson_writer_t *writer); BSON_EXPORT (bool) bson_writer_begin (bson_writer_t *writer, bson_t **bson); BSON_EXPORT (void) bson_writer_end (bson_writer_t *writer); BSON_EXPORT (void) bson_writer_rollback (bson_writer_t *writer); BSON_END_DECLS #endif /* BSON_WRITER_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/bson.c000066400000000000000000003147511456567454500215440ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "bson.h" #include #include #include #include #include #include "common-b64-private.h" #include #include #ifndef BSON_MAX_RECURSION #define BSON_MAX_RECURSION 200 #endif typedef enum { BSON_VALIDATE_PHASE_START, BSON_VALIDATE_PHASE_TOP, BSON_VALIDATE_PHASE_LF_REF_KEY, BSON_VALIDATE_PHASE_LF_REF_UTF8, BSON_VALIDATE_PHASE_LF_ID_KEY, BSON_VALIDATE_PHASE_LF_DB_KEY, BSON_VALIDATE_PHASE_LF_DB_UTF8, BSON_VALIDATE_PHASE_NOT_DBREF, } bson_validate_phase_t; /* * Structures. */ typedef struct { bson_validate_flags_t flags; ssize_t err_offset; bson_validate_phase_t phase; bson_error_t error; } bson_validate_state_t; typedef struct { uint32_t count; bool keys; ssize_t *err_offset; uint32_t depth; bson_string_t *str; bson_json_mode_t mode; int32_t max_len; bool max_len_reached; } bson_json_state_t; /* * Forward declarations. */ static bool _bson_as_json_visit_array (const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data); static bool _bson_as_json_visit_document (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); static char * _bson_as_json_visit_all (const bson_t *bson, size_t *length, bson_json_mode_t mode, int32_t max_len, bool is_outermost_array); /* * Globals. */ static const uint8_t gZero; /* *-------------------------------------------------------------------------- * * _bson_impl_inline_grow -- * * Document growth implementation for documents that currently * contain stack based buffers. The document may be switched to * a malloc based buffer. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _bson_impl_inline_grow (bson_impl_inline_t *impl, /* IN */ size_t size) /* IN */ { bson_impl_alloc_t *alloc = (bson_impl_alloc_t *) impl; uint8_t *data; size_t req; if (((size_t) impl->len + size) <= sizeof impl->data) { return true; } req = bson_next_power_of_two (impl->len + size); if (req <= BSON_MAX_SIZE) { data = bson_malloc (req); memcpy (data, impl->data, impl->len); #ifdef BSON_MEMCHECK bson_free (impl->canary); #endif alloc->flags &= ~BSON_FLAG_INLINE; alloc->parent = NULL; alloc->depth = 0; alloc->buf = &alloc->alloc; alloc->buflen = &alloc->alloclen; alloc->offset = 0; alloc->alloc = data; alloc->alloclen = req; alloc->realloc = bson_realloc_ctx; alloc->realloc_func_ctx = NULL; return true; } return false; } /* *-------------------------------------------------------------------------- * * _bson_impl_alloc_grow -- * * Document growth implementation for documents containing malloc * based buffers. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _bson_impl_alloc_grow (bson_impl_alloc_t *impl, /* IN */ size_t size) /* IN */ { size_t req; /* * Determine how many bytes we need for this document in the buffer * including necessary trailing bytes for parent documents. */ req = (impl->offset + impl->len + size + impl->depth); if (req <= *impl->buflen) { return true; } req = bson_next_power_of_two (req); if ((req <= BSON_MAX_SIZE) && impl->realloc) { *impl->buf = impl->realloc (*impl->buf, req, impl->realloc_func_ctx); *impl->buflen = req; return true; } return false; } /* *-------------------------------------------------------------------------- * * _bson_grow -- * * Grows the bson_t structure to be large enough to contain @size * bytes. * * Returns: * true if successful, false if the size would overflow. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _bson_grow (bson_t *bson, /* IN */ uint32_t size) /* IN */ { if ((bson->flags & BSON_FLAG_INLINE)) { return _bson_impl_inline_grow ((bson_impl_inline_t *) bson, size); } return _bson_impl_alloc_grow ((bson_impl_alloc_t *) bson, size); } /* *-------------------------------------------------------------------------- * * _bson_data -- * * A helper function to return the contents of the bson document * taking into account the polymorphic nature of bson_t. * * Returns: * A buffer which should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE uint8_t * _bson_data (const bson_t *bson) /* IN */ { if ((bson->flags & BSON_FLAG_INLINE)) { return ((bson_impl_inline_t *) bson)->data; } else { bson_impl_alloc_t *impl = (bson_impl_alloc_t *) bson; return (*impl->buf) + impl->offset; } } /* *-------------------------------------------------------------------------- * * _bson_encode_length -- * * Helper to encode the length of the bson_t in the first 4 bytes * of the bson document. Little endian format is used as specified * by bsonspec. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE void _bson_encode_length (bson_t *bson) /* IN */ { #if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN memcpy (_bson_data (bson), &bson->len, sizeof (bson->len)); #else uint32_t length_le = BSON_UINT32_TO_LE (bson->len); memcpy (_bson_data (bson), &length_le, sizeof (length_le)); #endif } /* *-------------------------------------------------------------------------- * * _bson_append_va -- * * Appends the length,buffer pairs to the bson_t. @n_bytes is an * optimization to perform one array growth rather than many small * growths. * * @bson: A bson_t * @n_bytes: The number of bytes to append to the document. * @n_pairs: The number of length,buffer pairs. * @first_len: Length of first buffer. * @first_data: First buffer. * @args: va_list of additional tuples. * * Returns: * true if the bytes were appended successfully. * false if it bson would overflow BSON_MAX_SIZE. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE bool _bson_append_va (bson_t *bson, /* IN */ uint32_t n_bytes, /* IN */ uint32_t n_pairs, /* IN */ uint32_t first_len, /* IN */ const uint8_t *first_data, /* IN */ va_list args) /* IN */ { const uint8_t *data; uint32_t data_len; uint8_t *buf; BSON_ASSERT (!(bson->flags & BSON_FLAG_IN_CHILD)); BSON_ASSERT (!(bson->flags & BSON_FLAG_RDONLY)); if (BSON_UNLIKELY (!_bson_grow (bson, n_bytes))) { return false; } data = first_data; data_len = first_len; buf = _bson_data (bson) + bson->len - 1; do { n_pairs--; /* data may be NULL if data_len is 0. memcpy is not safe to call with * NULL. */ if (BSON_LIKELY (data_len != 0 && data != NULL)) { memcpy (buf, data, data_len); bson->len += data_len; buf += data_len; } else if (BSON_UNLIKELY (data_len != 0 && data == NULL)) { /* error, user appending NULL with non-zero length. */ return false; } if (n_pairs) { data_len = va_arg (args, uint32_t); data = va_arg (args, const uint8_t *); } } while (n_pairs); _bson_encode_length (bson); *buf = '\0'; return true; } /* *-------------------------------------------------------------------------- * * _bson_append -- * * Variadic function to append length,buffer pairs to a bson_t. If the * append would cause the bson_t to overflow a 32-bit length, it will * return false and no append will have occurred. * * Parameters: * @bson: A bson_t. * @n_pairs: Number of length,buffer pairs. * @n_bytes: the total number of bytes being appended. * @first_len: Length of first buffer. * @first_data: First buffer. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _bson_append (bson_t *bson, /* IN */ uint32_t n_pairs, /* IN */ uint32_t n_bytes, /* IN */ uint32_t first_len, /* IN */ const uint8_t *first_data, /* IN */ ...) { va_list args; bool ok; BSON_ASSERT (n_pairs); BSON_ASSERT (first_len); BSON_ASSERT (first_data); /* * Check to see if this append would overflow 32-bit signed integer. I know * what you're thinking. BSON uses a signed 32-bit length field? Yeah. It * does. */ if (BSON_UNLIKELY (n_bytes > (BSON_MAX_SIZE - bson->len))) { return false; } va_start (args, first_data); ok = _bson_append_va (bson, n_bytes, n_pairs, first_len, first_data, args); va_end (args); return ok; } static BSON_INLINE bool _string_contains_null (const char *str, size_t len) { for (; len; ++str, --len) { if (*str == 0) { return true; } } return false; } #define HANDLE_KEY_LENGTH(key, key_length) \ do { \ if (key_length < 0) { \ key_length = (int) strlen (key); \ } else { \ /* Necessary to validate embedded NULL is not present in key. */ \ if (_string_contains_null (key, key_length)) { \ return false; \ } \ } \ } while (0) /* *-------------------------------------------------------------------------- * * _bson_append_bson_begin -- * * Begin appending a subdocument or subarray to the document using * the key provided by @key. * * If @key_length is < 0, then strlen() will be called on @key * to determine the length. * * @key_type MUST be either BSON_TYPE_DOCUMENT or BSON_TYPE_ARRAY. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * @child is initialized if true is returned. * *-------------------------------------------------------------------------- */ static bool _bson_append_bson_begin (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_type_t child_type, /* IN */ bson_t *child) /* OUT */ { const uint8_t type = child_type; const uint8_t empty[5] = {5}; bson_impl_alloc_t *aparent = (bson_impl_alloc_t *) bson; bson_impl_alloc_t *achild = (bson_impl_alloc_t *) child; BSON_ASSERT (!(bson->flags & BSON_FLAG_RDONLY)); BSON_ASSERT (!(bson->flags & BSON_FLAG_IN_CHILD)); BSON_ASSERT (key); BSON_ASSERT ((child_type == BSON_TYPE_DOCUMENT) || (child_type == BSON_TYPE_ARRAY)); BSON_ASSERT (child); HANDLE_KEY_LENGTH (key, key_length); /* * If the parent is an inline bson_t, then we need to convert * it to a heap allocated buffer. This makes extending buffers * of child bson documents much simpler logic, as they can just * realloc the *buf pointer. */ if ((bson->flags & BSON_FLAG_INLINE)) { BSON_ASSERT (bson->len <= 120); if (!_bson_grow (bson, 128 - bson->len)) { return false; } BSON_ASSERT (!(bson->flags & BSON_FLAG_INLINE)); } /* * Append the type and key for the field. */ if (!_bson_append (bson, 4, (1 + key_length + 1 + 5), 1, &type, key_length, key, 1, &gZero, 5, empty)) { return false; } /* * Mark the document as working on a child document so that no * further modifications can happen until the caller has called * bson_append_{document,array}_end(). */ bson->flags |= BSON_FLAG_IN_CHILD; /* * Initialize the child bson_t structure and point it at the parents * buffers. This allows us to realloc directly from the child without * walking up to the parent bson_t. */ achild->flags = (BSON_FLAG_CHILD | BSON_FLAG_NO_FREE | BSON_FLAG_STATIC); if ((bson->flags & BSON_FLAG_CHILD)) { achild->depth = ((bson_impl_alloc_t *) bson)->depth + 1; } else { achild->depth = 1; } achild->parent = bson; achild->buf = aparent->buf; achild->buflen = aparent->buflen; achild->offset = aparent->offset + aparent->len - 1 - 5; achild->len = 5; achild->alloc = NULL; achild->alloclen = 0; achild->realloc = aparent->realloc; achild->realloc_func_ctx = aparent->realloc_func_ctx; return true; } /* *-------------------------------------------------------------------------- * * _bson_append_bson_end -- * * Complete a call to _bson_append_bson_begin. * * Returns: * true if successful. * * Side effects: * @child is destroyed and no longer valid after calling this * function. * *-------------------------------------------------------------------------- */ static bool _bson_append_bson_end (bson_t *bson, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT (bson); BSON_ASSERT ((bson->flags & BSON_FLAG_IN_CHILD)); BSON_ASSERT (!(child->flags & BSON_FLAG_IN_CHILD)); /* * Unmark the IN_CHILD flag. */ bson->flags &= ~BSON_FLAG_IN_CHILD; /* * Now that we are done building the sub-document, add the size to the * parent, not including the default 5 byte empty document already added. */ bson->len = (bson->len + child->len - 5); /* * Ensure we have a \0 byte at the end and proper length encoded at * the beginning of the document. */ _bson_data (bson)[bson->len - 1] = '\0'; _bson_encode_length (bson); return true; } /* *-------------------------------------------------------------------------- * * bson_append_array_begin -- * * Start appending a new array. * * Use @child to append to the data area for the given field. * * It is a programming error to call any other bson function on * @bson until bson_append_array_end() has been called. It is * valid to call bson_append*() functions on @child. * * This function is useful to allow building nested documents using * a single buffer owned by the top-level bson document. * * Returns: * true if successful; otherwise false and @child is invalid. * * Side effects: * @child is initialized if true is returned. * *-------------------------------------------------------------------------- */ bool bson_append_array_begin (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (child); return _bson_append_bson_begin ( bson, key, key_length, BSON_TYPE_ARRAY, child); } /* *-------------------------------------------------------------------------- * * bson_append_array_end -- * * Complete a call to bson_append_array_begin(). * * It is safe to append other fields to @bson after calling this * function. * * Returns: * true if successful. * * Side effects: * @child is invalid after calling this function. * *-------------------------------------------------------------------------- */ bool bson_append_array_end (bson_t *bson, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT (bson); BSON_ASSERT (child); return _bson_append_bson_end (bson, child); } /* *-------------------------------------------------------------------------- * * bson_append_document_begin -- * * Start appending a new document. * * Use @child to append to the data area for the given field. * * It is a programming error to call any other bson function on * @bson until bson_append_document_end() has been called. It is * valid to call bson_append*() functions on @child. * * This function is useful to allow building nested documents using * a single buffer owned by the top-level bson document. * * Returns: * true if successful; otherwise false and @child is invalid. * * Side effects: * @child is initialized if true is returned. * *-------------------------------------------------------------------------- */ bool bson_append_document_begin (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (child); return _bson_append_bson_begin ( bson, key, key_length, BSON_TYPE_DOCUMENT, child); } /* *-------------------------------------------------------------------------- * * bson_append_document_end -- * * Complete a call to bson_append_document_begin(). * * It is safe to append new fields to @bson after calling this * function, if true is returned. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * @child is destroyed and invalid after calling this function. * *-------------------------------------------------------------------------- */ bool bson_append_document_end (bson_t *bson, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT (bson); BSON_ASSERT (child); return _bson_append_bson_end (bson, child); } /* *-------------------------------------------------------------------------- * * bson_append_array -- * * Append an array to @bson. * * Generally, bson_append_array_begin() will result in faster code * since few buffers need to be malloced. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_array (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const bson_t *array) /* IN */ { static const uint8_t type = BSON_TYPE_ARRAY; BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (array); HANDLE_KEY_LENGTH (key, key_length); /* * Let's be a bit pedantic and ensure the array has properly formatted key * names. We will verify this simply by checking the first element for "0" * if the array is non-empty. */ if (array && !bson_empty (array)) { bson_iter_t iter; if (bson_iter_init (&iter, array) && bson_iter_next (&iter)) { if (0 != strcmp ("0", bson_iter_key (&iter))) { fprintf (stderr, "%s(): invalid array detected. first element of array " "parameter is not \"0\".\n", BSON_FUNC); } } } return _bson_append (bson, 4, (1 + key_length + 1 + array->len), 1, &type, key_length, key, 1, &gZero, array->len, _bson_data (array)); } /* *-------------------------------------------------------------------------- * * bson_append_binary -- * * Append binary data to @bson. The field will have the * BSON_TYPE_BINARY type. * * Parameters: * @subtype: the BSON Binary Subtype. See bsonspec.org for more * information. * @binary: a pointer to the raw binary data. * @length: the size of @binary in bytes. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_binary (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_subtype_t subtype, /* IN */ const uint8_t *binary, /* IN */ uint32_t length) /* IN */ { static const uint8_t type = BSON_TYPE_BINARY; uint32_t length_le; uint32_t deprecated_length_le; uint8_t subtype8 = 0; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); subtype8 = subtype; if (subtype == BSON_SUBTYPE_BINARY_DEPRECATED) { length_le = BSON_UINT32_TO_LE (length + 4); deprecated_length_le = BSON_UINT32_TO_LE (length); return _bson_append (bson, 7, (1 + key_length + 1 + 4 + 1 + 4 + length), 1, &type, key_length, key, 1, &gZero, 4, &length_le, 1, &subtype8, 4, &deprecated_length_le, length, binary); } else { length_le = BSON_UINT32_TO_LE (length); return _bson_append (bson, 6, (1 + key_length + 1 + 4 + 1 + length), 1, &type, key_length, key, 1, &gZero, 4, &length_le, 1, &subtype8, length, binary); } } /* *-------------------------------------------------------------------------- * * bson_append_bool -- * * Append a new field to @bson with the name @key. The value is * a boolean indicated by @value. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_bool (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bool value) /* IN */ { static const uint8_t type = BSON_TYPE_BOOL; uint8_t abyte = !!value; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); return _bson_append (bson, 4, (1 + key_length + 1 + 1), 1, &type, key_length, key, 1, &gZero, 1, &abyte); } /* *-------------------------------------------------------------------------- * * bson_append_code -- * * Append a new field to @bson containing javascript code. * * @javascript MUST be a zero terminated UTF-8 string. It MUST NOT * containing embedded \0 characters. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * * See also: * bson_append_code_with_scope(). * *-------------------------------------------------------------------------- */ bool bson_append_code (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const char *javascript) /* IN */ { static const uint8_t type = BSON_TYPE_CODE; uint32_t length; uint32_t length_le; BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (javascript); HANDLE_KEY_LENGTH (key, key_length); length = (int) strlen (javascript) + 1; length_le = BSON_UINT32_TO_LE (length); return _bson_append (bson, 5, (1 + key_length + 1 + 4 + length), 1, &type, key_length, key, 1, &gZero, 4, &length_le, length, javascript); } /* *-------------------------------------------------------------------------- * * bson_append_code_with_scope -- * * Append a new field to @bson containing javascript code with * supplied scope. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_code_with_scope (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const char *javascript, /* IN */ const bson_t *scope) /* IN */ { static const uint8_t type = BSON_TYPE_CODEWSCOPE; uint32_t codews_length_le; uint32_t codews_length; uint32_t js_length_le; uint32_t js_length; BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (javascript); if (scope == NULL) { return bson_append_code (bson, key, key_length, javascript); } HANDLE_KEY_LENGTH (key, key_length); js_length = (int) strlen (javascript) + 1; js_length_le = BSON_UINT32_TO_LE (js_length); codews_length = 4 + 4 + js_length + scope->len; codews_length_le = BSON_UINT32_TO_LE (codews_length); return _bson_append (bson, 7, (1 + key_length + 1 + 4 + 4 + js_length + scope->len), 1, &type, key_length, key, 1, &gZero, 4, &codews_length_le, 4, &js_length_le, js_length, javascript, scope->len, _bson_data (scope)); } /* *-------------------------------------------------------------------------- * * bson_append_dbpointer -- * * This BSON data type is DEPRECATED. * * Append a BSON dbpointer field to @bson. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_dbpointer (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const char *collection, /* IN */ const bson_oid_t *oid) { static const uint8_t type = BSON_TYPE_DBPOINTER; uint32_t length; uint32_t length_le; BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (collection); BSON_ASSERT (oid); HANDLE_KEY_LENGTH (key, key_length); length = (int) strlen (collection) + 1; length_le = BSON_UINT32_TO_LE (length); return _bson_append (bson, 6, (1 + key_length + 1 + 4 + length + 12), 1, &type, key_length, key, 1, &gZero, 4, &length_le, length, collection, 12, oid); } /* *-------------------------------------------------------------------------- * * bson_append_document -- * * Append a new field to @bson containing a BSON document. * * In general, using bson_append_document_begin() results in faster * code and less memory fragmentation. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * * See also: * bson_append_document_begin(). * *-------------------------------------------------------------------------- */ bool bson_append_document (bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const bson_t *value) /* IN */ { static const uint8_t type = BSON_TYPE_DOCUMENT; BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (value); HANDLE_KEY_LENGTH (key, key_length); return _bson_append (bson, 4, (1 + key_length + 1 + value->len), 1, &type, key_length, key, 1, &gZero, value->len, _bson_data (value)); } bool bson_append_double (bson_t *bson, const char *key, int key_length, double value) { static const uint8_t type = BSON_TYPE_DOUBLE; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); #if BSON_BYTE_ORDER == BSON_BIG_ENDIAN value = BSON_DOUBLE_TO_LE (value); #endif return _bson_append (bson, 4, (1 + key_length + 1 + 8), 1, &type, key_length, key, 1, &gZero, 8, &value); } bool bson_append_int32 (bson_t *bson, const char *key, int key_length, int32_t value) { static const uint8_t type = BSON_TYPE_INT32; uint32_t value_le; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); value_le = BSON_UINT32_TO_LE (value); return _bson_append (bson, 4, (1 + key_length + 1 + 4), 1, &type, key_length, key, 1, &gZero, 4, &value_le); } bool bson_append_int64 (bson_t *bson, const char *key, int key_length, int64_t value) { static const uint8_t type = BSON_TYPE_INT64; uint64_t value_le; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); value_le = BSON_UINT64_TO_LE (value); return _bson_append (bson, 4, (1 + key_length + 1 + 8), 1, &type, key_length, key, 1, &gZero, 8, &value_le); } bool bson_append_decimal128 (bson_t *bson, const char *key, int key_length, const bson_decimal128_t *value) { static const uint8_t type = BSON_TYPE_DECIMAL128; uint64_t value_le[2]; BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (value); HANDLE_KEY_LENGTH (key, key_length); value_le[0] = BSON_UINT64_TO_LE (value->low); value_le[1] = BSON_UINT64_TO_LE (value->high); return _bson_append (bson, 4, (1 + key_length + 1 + 16), 1, &type, key_length, key, 1, &gZero, 16, value_le); } bool bson_append_iter (bson_t *bson, const char *key, int key_length, const bson_iter_t *iter) { bool ret = false; BSON_ASSERT (bson); BSON_ASSERT (iter); if (!key) { key = bson_iter_key (iter); key_length = -1; } switch (bson_iter_type_unsafe (iter)) { case BSON_TYPE_EOD: return false; case BSON_TYPE_DOUBLE: ret = bson_append_double (bson, key, key_length, bson_iter_double (iter)); break; case BSON_TYPE_UTF8: { uint32_t len = 0; const char *str; str = bson_iter_utf8 (iter, &len); ret = bson_append_utf8 (bson, key, key_length, str, len); } break; case BSON_TYPE_DOCUMENT: { const uint8_t *buf = NULL; uint32_t len = 0; bson_t doc; bson_iter_document (iter, &len, &buf); if (bson_init_static (&doc, buf, len)) { ret = bson_append_document (bson, key, key_length, &doc); bson_destroy (&doc); } } break; case BSON_TYPE_ARRAY: { const uint8_t *buf = NULL; uint32_t len = 0; bson_t doc; bson_iter_array (iter, &len, &buf); if (bson_init_static (&doc, buf, len)) { ret = bson_append_array (bson, key, key_length, &doc); bson_destroy (&doc); } } break; case BSON_TYPE_BINARY: { const uint8_t *binary = NULL; bson_subtype_t subtype = BSON_SUBTYPE_BINARY; uint32_t len = 0; bson_iter_binary (iter, &subtype, &len, &binary); ret = bson_append_binary (bson, key, key_length, subtype, binary, len); } break; case BSON_TYPE_UNDEFINED: ret = bson_append_undefined (bson, key, key_length); break; case BSON_TYPE_OID: ret = bson_append_oid (bson, key, key_length, bson_iter_oid (iter)); break; case BSON_TYPE_BOOL: ret = bson_append_bool (bson, key, key_length, bson_iter_bool (iter)); break; case BSON_TYPE_DATE_TIME: ret = bson_append_date_time ( bson, key, key_length, bson_iter_date_time (iter)); break; case BSON_TYPE_NULL: ret = bson_append_null (bson, key, key_length); break; case BSON_TYPE_REGEX: { const char *regex; const char *options; regex = bson_iter_regex (iter, &options); ret = bson_append_regex (bson, key, key_length, regex, options); } break; case BSON_TYPE_DBPOINTER: { const bson_oid_t *oid; uint32_t len; const char *collection; bson_iter_dbpointer (iter, &len, &collection, &oid); ret = bson_append_dbpointer (bson, key, key_length, collection, oid); } break; case BSON_TYPE_CODE: { uint32_t len; const char *code; code = bson_iter_code (iter, &len); ret = bson_append_code (bson, key, key_length, code); } break; case BSON_TYPE_SYMBOL: { uint32_t len; const char *symbol; symbol = bson_iter_symbol (iter, &len); ret = bson_append_symbol (bson, key, key_length, symbol, len); } break; case BSON_TYPE_CODEWSCOPE: { const uint8_t *scope = NULL; uint32_t scope_len = 0; uint32_t len = 0; const char *javascript = NULL; bson_t doc; javascript = bson_iter_codewscope (iter, &len, &scope_len, &scope); if (bson_init_static (&doc, scope, scope_len)) { ret = bson_append_code_with_scope ( bson, key, key_length, javascript, &doc); bson_destroy (&doc); } } break; case BSON_TYPE_INT32: ret = bson_append_int32 (bson, key, key_length, bson_iter_int32 (iter)); break; case BSON_TYPE_TIMESTAMP: { uint32_t ts; uint32_t inc; bson_iter_timestamp (iter, &ts, &inc); ret = bson_append_timestamp (bson, key, key_length, ts, inc); } break; case BSON_TYPE_INT64: ret = bson_append_int64 (bson, key, key_length, bson_iter_int64 (iter)); break; case BSON_TYPE_DECIMAL128: { bson_decimal128_t dec; if (!bson_iter_decimal128 (iter, &dec)) { return false; } ret = bson_append_decimal128 (bson, key, key_length, &dec); } break; case BSON_TYPE_MAXKEY: ret = bson_append_maxkey (bson, key, key_length); break; case BSON_TYPE_MINKEY: ret = bson_append_minkey (bson, key, key_length); break; default: break; } return ret; } bool bson_append_maxkey (bson_t *bson, const char *key, int key_length) { static const uint8_t type = BSON_TYPE_MAXKEY; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); return _bson_append ( bson, 3, (1 + key_length + 1), 1, &type, key_length, key, 1, &gZero); } bool bson_append_minkey (bson_t *bson, const char *key, int key_length) { static const uint8_t type = BSON_TYPE_MINKEY; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); return _bson_append ( bson, 3, (1 + key_length + 1), 1, &type, key_length, key, 1, &gZero); } bool bson_append_null (bson_t *bson, const char *key, int key_length) { static const uint8_t type = BSON_TYPE_NULL; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); return _bson_append ( bson, 3, (1 + key_length + 1), 1, &type, key_length, key, 1, &gZero); } bool bson_append_oid (bson_t *bson, const char *key, int key_length, const bson_oid_t *value) { static const uint8_t type = BSON_TYPE_OID; BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (value); HANDLE_KEY_LENGTH (key, key_length); return _bson_append (bson, 4, (1 + key_length + 1 + 12), 1, &type, key_length, key, 1, &gZero, 12, value); } /* *-------------------------------------------------------------------------- * * _bson_append_regex_options_sorted -- * * Helper to append regex options to a buffer in a sorted order. * Any duplicate or unsupported options will be ignored. * * Parameters: * @buffer: Buffer to which sorted options will be appended * @options: Regex options * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE void _bson_append_regex_options_sorted (bson_string_t *buffer, /* IN */ const char *options) /* IN */ { const char *c; for (c = BSON_REGEX_OPTIONS_SORTED; *c; c++) { if (strchr (options, *c)) { bson_string_append_c (buffer, *c); } } } bool bson_append_regex (bson_t *bson, const char *key, int key_length, const char *regex, const char *options) { return bson_append_regex_w_len (bson, key, key_length, regex, -1, options); } bool bson_append_regex_w_len (bson_t *bson, const char *key, int key_length, const char *regex, int regex_length, const char *options) { static const uint8_t type = BSON_TYPE_REGEX; bson_string_t *options_sorted; bool r; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); if (regex_length < 0) { regex_length = (int) strlen (regex); } else { /* Necessary to validate embedded NULL is not present in key. */ if (_string_contains_null (regex, regex_length)) { return false; } } if (!regex) { regex = ""; } if (!options) { options = ""; } options_sorted = bson_string_new (NULL); _bson_append_regex_options_sorted (options_sorted, options); r = _bson_append ( bson, 6, (1 + key_length + 1 + regex_length + 1 + options_sorted->len + 1), 1, &type, key_length, key, 1, &gZero, regex_length, regex, 1, &gZero, options_sorted->len + 1, options_sorted->str); bson_string_free (options_sorted, true); return r; } bool bson_append_utf8 ( bson_t *bson, const char *key, int key_length, const char *value, int length) { static const uint8_t type = BSON_TYPE_UTF8; uint32_t length_le; BSON_ASSERT (bson); BSON_ASSERT (key); if (BSON_UNLIKELY (!value)) { return bson_append_null (bson, key, key_length); } HANDLE_KEY_LENGTH (key, key_length); if (BSON_UNLIKELY (length < 0)) { length = (int) strlen (value); } length_le = BSON_UINT32_TO_LE (length + 1); return _bson_append (bson, 6, (1 + key_length + 1 + 4 + length + 1), 1, &type, key_length, key, 1, &gZero, 4, &length_le, length, value, 1, &gZero); } bool bson_append_symbol ( bson_t *bson, const char *key, int key_length, const char *value, int length) { static const uint8_t type = BSON_TYPE_SYMBOL; uint32_t length_le; BSON_ASSERT (bson); BSON_ASSERT (key); if (!value) { return bson_append_null (bson, key, key_length); } HANDLE_KEY_LENGTH (key, key_length); if (length < 0) { length = (int) strlen (value); } length_le = BSON_UINT32_TO_LE (length + 1); return _bson_append (bson, 6, (1 + key_length + 1 + 4 + length + 1), 1, &type, key_length, key, 1, &gZero, 4, &length_le, length, value, 1, &gZero); } bool bson_append_time_t (bson_t *bson, const char *key, int key_length, time_t value) { #ifdef BSON_OS_WIN32 struct timeval tv = {(long) value, 0}; #else struct timeval tv = {value, 0}; #endif BSON_ASSERT (bson); BSON_ASSERT (key); return bson_append_timeval (bson, key, key_length, &tv); } bool bson_append_timestamp (bson_t *bson, const char *key, int key_length, uint32_t timestamp, uint32_t increment) { static const uint8_t type = BSON_TYPE_TIMESTAMP; uint64_t value; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); value = ((((uint64_t) timestamp) << 32) | ((uint64_t) increment)); value = BSON_UINT64_TO_LE (value); return _bson_append (bson, 4, (1 + key_length + 1 + 8), 1, &type, key_length, key, 1, &gZero, 8, &value); } bool bson_append_now_utc (bson_t *bson, const char *key, int key_length) { BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (key_length >= -1); return bson_append_time_t (bson, key, key_length, time (NULL)); } bool bson_append_date_time (bson_t *bson, const char *key, int key_length, int64_t value) { static const uint8_t type = BSON_TYPE_DATE_TIME; uint64_t value_le; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); value_le = BSON_UINT64_TO_LE (value); return _bson_append (bson, 4, (1 + key_length + 1 + 8), 1, &type, key_length, key, 1, &gZero, 8, &value_le); } bool bson_append_timeval (bson_t *bson, const char *key, int key_length, struct timeval *value) { uint64_t unix_msec; BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (value); unix_msec = (((uint64_t) value->tv_sec) * 1000UL) + (value->tv_usec / 1000UL); return bson_append_date_time (bson, key, key_length, unix_msec); } bool bson_append_undefined (bson_t *bson, const char *key, int key_length) { static const uint8_t type = BSON_TYPE_UNDEFINED; BSON_ASSERT (bson); BSON_ASSERT (key); HANDLE_KEY_LENGTH (key, key_length); return _bson_append ( bson, 3, (1 + key_length + 1), 1, &type, key_length, key, 1, &gZero); } bool bson_append_value (bson_t *bson, const char *key, int key_length, const bson_value_t *value) { bson_t local; bool ret = false; BSON_ASSERT (bson); BSON_ASSERT (key); BSON_ASSERT (value); switch (value->value_type) { case BSON_TYPE_DOUBLE: ret = bson_append_double (bson, key, key_length, value->value.v_double); break; case BSON_TYPE_UTF8: ret = bson_append_utf8 (bson, key, key_length, value->value.v_utf8.str, value->value.v_utf8.len); break; case BSON_TYPE_DOCUMENT: if (bson_init_static ( &local, value->value.v_doc.data, value->value.v_doc.data_len)) { ret = bson_append_document (bson, key, key_length, &local); bson_destroy (&local); } break; case BSON_TYPE_ARRAY: if (bson_init_static ( &local, value->value.v_doc.data, value->value.v_doc.data_len)) { ret = bson_append_array (bson, key, key_length, &local); bson_destroy (&local); } break; case BSON_TYPE_BINARY: ret = bson_append_binary (bson, key, key_length, value->value.v_binary.subtype, value->value.v_binary.data, value->value.v_binary.data_len); break; case BSON_TYPE_UNDEFINED: ret = bson_append_undefined (bson, key, key_length); break; case BSON_TYPE_OID: ret = bson_append_oid (bson, key, key_length, &value->value.v_oid); break; case BSON_TYPE_BOOL: ret = bson_append_bool (bson, key, key_length, value->value.v_bool); break; case BSON_TYPE_DATE_TIME: ret = bson_append_date_time (bson, key, key_length, value->value.v_datetime); break; case BSON_TYPE_NULL: ret = bson_append_null (bson, key, key_length); break; case BSON_TYPE_REGEX: ret = bson_append_regex (bson, key, key_length, value->value.v_regex.regex, value->value.v_regex.options); break; case BSON_TYPE_DBPOINTER: ret = bson_append_dbpointer (bson, key, key_length, value->value.v_dbpointer.collection, &value->value.v_dbpointer.oid); break; case BSON_TYPE_CODE: ret = bson_append_code (bson, key, key_length, value->value.v_code.code); break; case BSON_TYPE_SYMBOL: ret = bson_append_symbol (bson, key, key_length, value->value.v_symbol.symbol, value->value.v_symbol.len); break; case BSON_TYPE_CODEWSCOPE: if (bson_init_static (&local, value->value.v_codewscope.scope_data, value->value.v_codewscope.scope_len)) { ret = bson_append_code_with_scope ( bson, key, key_length, value->value.v_codewscope.code, &local); bson_destroy (&local); } break; case BSON_TYPE_INT32: ret = bson_append_int32 (bson, key, key_length, value->value.v_int32); break; case BSON_TYPE_TIMESTAMP: ret = bson_append_timestamp (bson, key, key_length, value->value.v_timestamp.timestamp, value->value.v_timestamp.increment); break; case BSON_TYPE_INT64: ret = bson_append_int64 (bson, key, key_length, value->value.v_int64); break; case BSON_TYPE_DECIMAL128: ret = bson_append_decimal128 ( bson, key, key_length, &(value->value.v_decimal128)); break; case BSON_TYPE_MAXKEY: ret = bson_append_maxkey (bson, key, key_length); break; case BSON_TYPE_MINKEY: ret = bson_append_minkey (bson, key, key_length); break; case BSON_TYPE_EOD: default: break; } return ret; } void bson_init (bson_t *bson) { bson_impl_inline_t *impl = (bson_impl_inline_t *) bson; BSON_ASSERT (bson); #ifdef BSON_MEMCHECK impl->canary = bson_malloc (1); #endif impl->flags = BSON_FLAG_INLINE | BSON_FLAG_STATIC; impl->len = 5; impl->data[0] = 5; impl->data[1] = 0; impl->data[2] = 0; impl->data[3] = 0; impl->data[4] = 0; } void bson_reinit (bson_t *bson) { uint8_t *data; BSON_ASSERT (bson); data = _bson_data (bson); bson->len = 5; data[0] = 5; data[1] = 0; data[2] = 0; data[3] = 0; data[4] = 0; } bool bson_init_static (bson_t *bson, const uint8_t *data, size_t length) { bson_impl_alloc_t *impl = (bson_impl_alloc_t *) bson; uint32_t len_le; BSON_ASSERT (bson); BSON_ASSERT (data); if ((length < 5) || (length > BSON_MAX_SIZE)) { return false; } memcpy (&len_le, data, sizeof (len_le)); if ((size_t) BSON_UINT32_FROM_LE (len_le) != length) { return false; } if (data[length - 1]) { return false; } impl->flags = BSON_FLAG_STATIC | BSON_FLAG_RDONLY; impl->len = (uint32_t) length; impl->parent = NULL; impl->depth = 0; impl->buf = &impl->alloc; impl->buflen = &impl->alloclen; impl->offset = 0; impl->alloc = (uint8_t *) data; impl->alloclen = length; impl->realloc = NULL; impl->realloc_func_ctx = NULL; return true; } bson_t * bson_new (void) { bson_impl_inline_t *impl; bson_t *bson; bson = BSON_ALIGNED_ALLOC (bson_t); impl = (bson_impl_inline_t *) bson; impl->flags = BSON_FLAG_INLINE; impl->len = 5; #ifdef BSON_MEMCHECK impl->canary = bson_malloc (1); #endif impl->data[0] = 5; impl->data[1] = 0; impl->data[2] = 0; impl->data[3] = 0; impl->data[4] = 0; return bson; } bson_t * bson_sized_new (size_t size) { bson_impl_alloc_t *impl_a; bson_t *b; BSON_ASSERT (size <= BSON_MAX_SIZE); { b = BSON_ALIGNED_ALLOC (bson_t); impl_a = (bson_impl_alloc_t *) b; } if (size <= BSON_INLINE_DATA_SIZE) { bson_init (b); b->flags &= ~BSON_FLAG_STATIC; } else { impl_a->flags = BSON_FLAG_NONE; impl_a->len = 5; impl_a->parent = NULL; impl_a->depth = 0; impl_a->buf = &impl_a->alloc; impl_a->buflen = &impl_a->alloclen; impl_a->offset = 0; impl_a->alloclen = BSON_MAX (5, size); impl_a->alloc = bson_malloc (impl_a->alloclen); impl_a->alloc[0] = 5; impl_a->alloc[1] = 0; impl_a->alloc[2] = 0; impl_a->alloc[3] = 0; impl_a->alloc[4] = 0; impl_a->realloc = bson_realloc_ctx; impl_a->realloc_func_ctx = NULL; } return b; } bson_t * bson_new_from_data (const uint8_t *data, size_t length) { uint32_t len_le; bson_t *bson; BSON_ASSERT (data); if ((length < 5) || (length > BSON_MAX_SIZE) || data[length - 1]) { return NULL; } memcpy (&len_le, data, sizeof (len_le)); if (length != (size_t) BSON_UINT32_FROM_LE (len_le)) { return NULL; } bson = bson_sized_new (length); memcpy (_bson_data (bson), data, length); bson->len = (uint32_t) length; return bson; } bson_t * bson_new_from_buffer (uint8_t **buf, size_t *buf_len, bson_realloc_func realloc_func, void *realloc_func_ctx) { bson_impl_alloc_t *impl; uint32_t len_le; uint32_t length; bson_t *bson; BSON_ASSERT (buf); BSON_ASSERT (buf_len); if (!realloc_func) { realloc_func = bson_realloc_ctx; } bson = BSON_ALIGNED_ALLOC0 (bson_t); impl = (bson_impl_alloc_t *) bson; if (!*buf) { length = 5; len_le = BSON_UINT32_TO_LE (length); *buf_len = 5; *buf = realloc_func (*buf, *buf_len, realloc_func_ctx); memcpy (*buf, &len_le, sizeof (len_le)); (*buf)[4] = '\0'; } else { if ((*buf_len < 5) || (*buf_len > BSON_MAX_SIZE)) { bson_free (bson); return NULL; } memcpy (&len_le, *buf, sizeof (len_le)); length = BSON_UINT32_FROM_LE (len_le); } if ((*buf)[length - 1]) { bson_free (bson); return NULL; } impl->flags = BSON_FLAG_NO_FREE; impl->len = length; impl->buf = buf; impl->buflen = buf_len; impl->realloc = realloc_func; impl->realloc_func_ctx = realloc_func_ctx; return bson; } bson_t * bson_copy (const bson_t *bson) { const uint8_t *data; BSON_ASSERT (bson); data = _bson_data (bson); return bson_new_from_data (data, bson->len); } void bson_copy_to (const bson_t *src, bson_t *dst) { const uint8_t *data; bson_impl_alloc_t *adst; size_t len; BSON_ASSERT (src); BSON_ASSERT (dst); if ((src->flags & BSON_FLAG_INLINE)) { #ifdef BSON_MEMCHECK dst->len = src->len; dst->canary = bson_malloc (1); memcpy (dst->padding, src->padding, sizeof dst->padding); #else memcpy (dst, src, sizeof *dst); #endif dst->flags = (BSON_FLAG_STATIC | BSON_FLAG_INLINE); return; } data = _bson_data (src); len = bson_next_power_of_two ((size_t) src->len); adst = (bson_impl_alloc_t *) dst; adst->flags = BSON_FLAG_STATIC; adst->len = src->len; adst->parent = NULL; adst->depth = 0; adst->buf = &adst->alloc; adst->buflen = &adst->alloclen; adst->offset = 0; adst->alloc = bson_malloc (len); adst->alloclen = len; adst->realloc = bson_realloc_ctx; adst->realloc_func_ctx = NULL; memcpy (adst->alloc, data, src->len); } static bool should_ignore (const char *first_exclude, va_list args, const char *name) { bool ret = false; const char *exclude = first_exclude; va_list args_copy; va_copy (args_copy, args); do { if (!strcmp (name, exclude)) { ret = true; break; } } while ((exclude = va_arg (args_copy, const char *))); va_end (args_copy); return ret; } void bson_copy_to_excluding_noinit_va (const bson_t *src, bson_t *dst, const char *first_exclude, va_list args) { bson_iter_t iter; if (bson_iter_init (&iter, src)) { while (bson_iter_next (&iter)) { if (!should_ignore (first_exclude, args, bson_iter_key (&iter))) { if (!bson_append_iter (dst, NULL, 0, &iter)) { /* * This should not be able to happen since we are copying * from within a valid bson_t. */ BSON_ASSERT (false); return; } } } } } void bson_copy_to_excluding (const bson_t *src, bson_t *dst, const char *first_exclude, ...) { va_list args; BSON_ASSERT (src); BSON_ASSERT (dst); BSON_ASSERT (first_exclude); bson_init (dst); va_start (args, first_exclude); bson_copy_to_excluding_noinit_va (src, dst, first_exclude, args); va_end (args); } void bson_copy_to_excluding_noinit (const bson_t *src, bson_t *dst, const char *first_exclude, ...) { va_list args; BSON_ASSERT (src); BSON_ASSERT (dst); BSON_ASSERT (first_exclude); va_start (args, first_exclude); bson_copy_to_excluding_noinit_va (src, dst, first_exclude, args); va_end (args); } void bson_destroy (bson_t *bson) { if (!bson) { return; } if (!(bson->flags & (BSON_FLAG_RDONLY | BSON_FLAG_INLINE | BSON_FLAG_NO_FREE))) { bson_free (*((bson_impl_alloc_t *) bson)->buf); } #ifdef BSON_MEMCHECK if (bson->flags & BSON_FLAG_INLINE) { bson_free (bson->canary); } #endif if (!(bson->flags & BSON_FLAG_STATIC)) { bson_free (bson); } } uint8_t * bson_reserve_buffer (bson_t *bson, uint32_t size) { if (bson->flags & (BSON_FLAG_CHILD | BSON_FLAG_IN_CHILD | BSON_FLAG_RDONLY)) { return NULL; } if (!_bson_grow (bson, size)) { return NULL; } if (bson->flags & BSON_FLAG_INLINE) { /* bson_grow didn't spill over */ ((bson_impl_inline_t *) bson)->len = size; } else { ((bson_impl_alloc_t *) bson)->len = size; } return _bson_data (bson); } bool bson_steal (bson_t *dst, bson_t *src) { bson_impl_inline_t *src_inline; bson_impl_inline_t *dst_inline; bson_impl_alloc_t *alloc; BSON_ASSERT (dst); BSON_ASSERT (src); bson_init (dst); if (src->flags & (BSON_FLAG_CHILD | BSON_FLAG_IN_CHILD | BSON_FLAG_RDONLY)) { return false; } if (src->flags & BSON_FLAG_INLINE) { src_inline = (bson_impl_inline_t *) src; dst_inline = (bson_impl_inline_t *) dst; dst_inline->len = src_inline->len; memcpy (dst_inline->data, src_inline->data, sizeof src_inline->data); /* for consistency, src is always invalid after steal, even if inline */ src->len = 0; #ifdef BSON_MEMCHECK bson_free (src->canary); #endif } else { #ifdef BSON_MEMCHECK bson_free (dst->canary); #endif memcpy (dst, src, sizeof (bson_t)); alloc = (bson_impl_alloc_t *) dst; alloc->flags |= BSON_FLAG_STATIC; alloc->buf = &alloc->alloc; alloc->buflen = &alloc->alloclen; } if (!(src->flags & BSON_FLAG_STATIC)) { bson_free (src); } else { /* src is invalid after steal */ src->len = 0; } return true; } uint8_t * bson_destroy_with_steal (bson_t *bson, bool steal, uint32_t *length) { uint8_t *ret = NULL; BSON_ASSERT (bson); if (length) { *length = bson->len; } if (!steal) { bson_destroy (bson); return NULL; } if ((bson->flags & (BSON_FLAG_CHILD | BSON_FLAG_IN_CHILD | BSON_FLAG_RDONLY))) { /* Do nothing */ } else if ((bson->flags & BSON_FLAG_INLINE)) { bson_impl_inline_t *inl; inl = (bson_impl_inline_t *) bson; ret = bson_malloc (bson->len); memcpy (ret, inl->data, bson->len); } else { bson_impl_alloc_t *alloc; alloc = (bson_impl_alloc_t *) bson; ret = *alloc->buf; *alloc->buf = NULL; } bson_destroy (bson); return ret; } const uint8_t * bson_get_data (const bson_t *bson) { BSON_ASSERT (bson); return _bson_data (bson); } uint32_t bson_count_keys (const bson_t *bson) { uint32_t count = 0; bson_iter_t iter; BSON_ASSERT (bson); if (bson_iter_init (&iter, bson)) { while (bson_iter_next (&iter)) { count++; } } return count; } bool bson_has_field (const bson_t *bson, const char *key) { bson_iter_t iter; bson_iter_t child; BSON_ASSERT (bson); BSON_ASSERT (key); if (NULL != strchr (key, '.')) { return (bson_iter_init (&iter, bson) && bson_iter_find_descendant (&iter, key, &child)); } return bson_iter_init_find (&iter, bson, key); } int bson_compare (const bson_t *bson, const bson_t *other) { const uint8_t *data1; const uint8_t *data2; size_t len1; size_t len2; int64_t ret; data1 = _bson_data (bson) + 4; len1 = bson->len - 4; data2 = _bson_data (other) + 4; len2 = other->len - 4; if (len1 == len2) { return memcmp (data1, data2, len1); } ret = memcmp (data1, data2, BSON_MIN (len1, len2)); if (ret == 0) { ret = (int64_t) len1 - (int64_t) len2; } return (ret < 0) ? -1 : (ret > 0); } bool bson_equal (const bson_t *bson, const bson_t *other) { return !bson_compare (bson, other); } static bool _bson_as_json_visit_utf8 (const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data) { bson_json_state_t *state = data; char *escaped; BSON_UNUSED (iter); BSON_UNUSED (key); escaped = bson_utf8_escape_for_json (v_utf8, v_utf8_len); if (escaped) { bson_string_append (state->str, "\""); bson_string_append (state->str, escaped); bson_string_append (state->str, "\""); bson_free (escaped); return false; } return true; } static bool _bson_as_json_visit_int32 (const bson_iter_t *iter, const char *key, int32_t v_int32, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); if (state->mode == BSON_JSON_MODE_CANONICAL) { bson_string_append_printf ( state->str, "{ \"$numberInt\" : \"%" PRId32 "\" }", v_int32); } else { bson_string_append_printf (state->str, "%" PRId32, v_int32); } return false; } static bool _bson_as_json_visit_int64 (const bson_iter_t *iter, const char *key, int64_t v_int64, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); if (state->mode == BSON_JSON_MODE_CANONICAL) { bson_string_append_printf ( state->str, "{ \"$numberLong\" : \"%" PRId64 "\" }", v_int64); } else { bson_string_append_printf (state->str, "%" PRId64, v_int64); } return false; } static bool _bson_as_json_visit_decimal128 (const bson_iter_t *iter, const char *key, const bson_decimal128_t *value, void *data) { bson_json_state_t *state = data; char decimal128_string[BSON_DECIMAL128_STRING]; BSON_UNUSED (iter); BSON_UNUSED (key); bson_decimal128_to_string (value, decimal128_string); bson_string_append (state->str, "{ \"$numberDecimal\" : \""); bson_string_append (state->str, decimal128_string); bson_string_append (state->str, "\" }"); return false; } static bool _bson_as_json_visit_double (const bson_iter_t *iter, const char *key, double v_double, void *data) { bson_json_state_t *state = data; bson_string_t *str = state->str; uint32_t start_len; bool legacy; BSON_UNUSED (iter); BSON_UNUSED (key); /* Determine if legacy (i.e. unwrapped) output should be used. Relaxed mode * will use this for nan and inf values, which we check manually since old * platforms may not have isinf or isnan. */ legacy = state->mode == BSON_JSON_MODE_LEGACY || (state->mode == BSON_JSON_MODE_RELAXED && !(v_double != v_double || v_double * 0 != 0)); if (!legacy) { bson_string_append (state->str, "{ \"$numberDouble\" : \""); } if (!legacy && v_double != v_double) { bson_string_append (str, "NaN"); } else if (!legacy && v_double * 0 != 0) { if (v_double > 0) { bson_string_append (str, "Infinity"); } else { bson_string_append (str, "-Infinity"); } } else { start_len = str->len; bson_string_append_printf (str, "%.20g", v_double); /* ensure trailing ".0" to distinguish "3" from "3.0" */ if (strspn (&str->str[start_len], "0123456789-") == str->len - start_len) { bson_string_append (str, ".0"); } } if (!legacy) { bson_string_append (state->str, "\" }"); } return false; } static bool _bson_as_json_visit_undefined (const bson_iter_t *iter, const char *key, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); bson_string_append (state->str, "{ \"$undefined\" : true }"); return false; } static bool _bson_as_json_visit_null (const bson_iter_t *iter, const char *key, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); bson_string_append (state->str, "null"); return false; } static bool _bson_as_json_visit_oid (const bson_iter_t *iter, const char *key, const bson_oid_t *oid, void *data) { bson_json_state_t *state = data; char str[25]; BSON_UNUSED (iter); BSON_UNUSED (key); bson_oid_to_string (oid, str); bson_string_append (state->str, "{ \"$oid\" : \""); bson_string_append (state->str, str); bson_string_append (state->str, "\" }"); return false; } static bool _bson_as_json_visit_binary (const bson_iter_t *iter, const char *key, bson_subtype_t v_subtype, size_t v_binary_len, const uint8_t *v_binary, void *data) { bson_json_state_t *state = data; size_t b64_len; char *b64; BSON_UNUSED (iter); BSON_UNUSED (key); b64_len = mcommon_b64_ntop_calculate_target_size (v_binary_len); b64 = bson_malloc0 (b64_len); BSON_ASSERT (mcommon_b64_ntop (v_binary, v_binary_len, b64, b64_len) != -1); if (state->mode == BSON_JSON_MODE_CANONICAL || state->mode == BSON_JSON_MODE_RELAXED) { bson_string_append (state->str, "{ \"$binary\" : { \"base64\" : \""); bson_string_append (state->str, b64); bson_string_append (state->str, "\", \"subType\" : \""); bson_string_append_printf (state->str, "%02x", v_subtype); bson_string_append (state->str, "\" } }"); } else { bson_string_append (state->str, "{ \"$binary\" : \""); bson_string_append (state->str, b64); bson_string_append (state->str, "\", \"$type\" : \""); bson_string_append_printf (state->str, "%02x", v_subtype); bson_string_append (state->str, "\" }"); } bson_free (b64); return false; } static bool _bson_as_json_visit_bool (const bson_iter_t *iter, const char *key, bool v_bool, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); bson_string_append (state->str, v_bool ? "true" : "false"); return false; } static bool _bson_as_json_visit_date_time (const bson_iter_t *iter, const char *key, int64_t msec_since_epoch, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); if (state->mode == BSON_JSON_MODE_CANONICAL || (state->mode == BSON_JSON_MODE_RELAXED && msec_since_epoch < 0)) { bson_string_append (state->str, "{ \"$date\" : { \"$numberLong\" : \""); bson_string_append_printf (state->str, "%" PRId64, msec_since_epoch); bson_string_append (state->str, "\" } }"); } else if (state->mode == BSON_JSON_MODE_RELAXED) { bson_string_append (state->str, "{ \"$date\" : \""); _bson_iso8601_date_format (msec_since_epoch, state->str); bson_string_append (state->str, "\" }"); } else { bson_string_append (state->str, "{ \"$date\" : "); bson_string_append_printf (state->str, "%" PRId64, msec_since_epoch); bson_string_append (state->str, " }"); } return false; } static bool _bson_as_json_visit_regex (const bson_iter_t *iter, const char *key, const char *v_regex, const char *v_options, void *data) { bson_json_state_t *state = data; char *escaped; BSON_UNUSED (iter); BSON_UNUSED (key); escaped = bson_utf8_escape_for_json (v_regex, -1); if (!escaped) { return true; } if (state->mode == BSON_JSON_MODE_CANONICAL || state->mode == BSON_JSON_MODE_RELAXED) { bson_string_append (state->str, "{ \"$regularExpression\" : { \"pattern\" : \""); bson_string_append (state->str, escaped); bson_string_append (state->str, "\", \"options\" : \""); _bson_append_regex_options_sorted (state->str, v_options); bson_string_append (state->str, "\" } }"); } else { bson_string_append (state->str, "{ \"$regex\" : \""); bson_string_append (state->str, escaped); bson_string_append (state->str, "\", \"$options\" : \""); _bson_append_regex_options_sorted (state->str, v_options); bson_string_append (state->str, "\" }"); } bson_free (escaped); return false; } static bool _bson_as_json_visit_timestamp (const bson_iter_t *iter, const char *key, uint32_t v_timestamp, uint32_t v_increment, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); bson_string_append (state->str, "{ \"$timestamp\" : { \"t\" : "); bson_string_append_printf (state->str, "%u", v_timestamp); bson_string_append (state->str, ", \"i\" : "); bson_string_append_printf (state->str, "%u", v_increment); bson_string_append (state->str, " } }"); return false; } static bool _bson_as_json_visit_dbpointer (const bson_iter_t *iter, const char *key, size_t v_collection_len, const char *v_collection, const bson_oid_t *v_oid, void *data) { bson_json_state_t *state = data; char *escaped; char str[25]; BSON_UNUSED (iter); BSON_UNUSED (key); BSON_UNUSED (v_collection_len); escaped = bson_utf8_escape_for_json (v_collection, -1); if (!escaped) { return true; } if (state->mode == BSON_JSON_MODE_CANONICAL || state->mode == BSON_JSON_MODE_RELAXED) { bson_string_append (state->str, "{ \"$dbPointer\" : { \"$ref\" : \""); bson_string_append (state->str, escaped); bson_string_append (state->str, "\""); if (v_oid) { bson_oid_to_string (v_oid, str); bson_string_append (state->str, ", \"$id\" : { \"$oid\" : \""); bson_string_append (state->str, str); bson_string_append (state->str, "\" }"); } bson_string_append (state->str, " } }"); } else { bson_string_append (state->str, "{ \"$ref\" : \""); bson_string_append (state->str, escaped); bson_string_append (state->str, "\""); if (v_oid) { bson_oid_to_string (v_oid, str); bson_string_append (state->str, ", \"$id\" : \""); bson_string_append (state->str, str); bson_string_append (state->str, "\""); } bson_string_append (state->str, " }"); } bson_free (escaped); return false; } static bool _bson_as_json_visit_minkey (const bson_iter_t *iter, const char *key, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); bson_string_append (state->str, "{ \"$minKey\" : 1 }"); return false; } static bool _bson_as_json_visit_maxkey (const bson_iter_t *iter, const char *key, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); bson_string_append (state->str, "{ \"$maxKey\" : 1 }"); return false; } static bool _bson_as_json_visit_before (const bson_iter_t *iter, const char *key, void *data) { bson_json_state_t *state = data; char *escaped; BSON_UNUSED (iter); if (state->max_len_reached) { return true; } if (state->count) { bson_string_append (state->str, ", "); } if (state->keys) { escaped = bson_utf8_escape_for_json (key, -1); if (escaped) { bson_string_append (state->str, "\""); bson_string_append (state->str, escaped); bson_string_append (state->str, "\" : "); bson_free (escaped); } else { return true; } } state->count++; return false; } static bool _bson_as_json_visit_after (const bson_iter_t *iter, const char *key, void *data) { bson_json_state_t *state = data; BSON_UNUSED (iter); BSON_UNUSED (key); if (state->max_len == BSON_MAX_LEN_UNLIMITED) { return false; } if (bson_cmp_greater_equal_us (state->str->len, state->max_len)) { state->max_len_reached = true; if (bson_cmp_greater_us (state->str->len, state->max_len)) { BSON_ASSERT (bson_in_range_signed (uint32_t, state->max_len)); /* Truncate string to maximum length */ bson_string_truncate (state->str, (uint32_t) state->max_len); } return true; } return false; } static void _bson_as_json_visit_corrupt (const bson_iter_t *iter, void *data) { *(((bson_json_state_t *) data)->err_offset) = iter->off; } static bool _bson_as_json_visit_code (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, void *data) { bson_json_state_t *state = data; char *escaped; BSON_UNUSED (iter); BSON_UNUSED (key); escaped = bson_utf8_escape_for_json (v_code, v_code_len); if (!escaped) { return true; } bson_string_append (state->str, "{ \"$code\" : \""); bson_string_append (state->str, escaped); bson_string_append (state->str, "\" }"); bson_free (escaped); return false; } static bool _bson_as_json_visit_symbol (const bson_iter_t *iter, const char *key, size_t v_symbol_len, const char *v_symbol, void *data) { bson_json_state_t *state = data; char *escaped; BSON_UNUSED (iter); BSON_UNUSED (key); escaped = bson_utf8_escape_for_json (v_symbol, v_symbol_len); if (!escaped) { return true; } if (state->mode == BSON_JSON_MODE_CANONICAL || state->mode == BSON_JSON_MODE_RELAXED) { bson_string_append (state->str, "{ \"$symbol\" : \""); bson_string_append (state->str, escaped); bson_string_append (state->str, "\" }"); } else { bson_string_append (state->str, "\""); bson_string_append (state->str, escaped); bson_string_append (state->str, "\""); } bson_free (escaped); return false; } static bool _bson_as_json_visit_codewscope (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, const bson_t *v_scope, void *data) { bson_json_state_t *state = data; char *code_escaped; char *scope; int32_t max_scope_len = BSON_MAX_LEN_UNLIMITED; BSON_UNUSED (iter); BSON_UNUSED (key); code_escaped = bson_utf8_escape_for_json (v_code, v_code_len); if (!code_escaped) { return true; } bson_string_append (state->str, "{ \"$code\" : \""); bson_string_append (state->str, code_escaped); bson_string_append (state->str, "\", \"$scope\" : "); bson_free (code_escaped); /* Encode scope with the same mode */ if (state->max_len != BSON_MAX_LEN_UNLIMITED) { BSON_ASSERT (bson_in_range_unsigned (int32_t, state->str->len)); max_scope_len = BSON_MAX (0, state->max_len - (int32_t) state->str->len); } scope = _bson_as_json_visit_all ( v_scope, NULL, state->mode, max_scope_len, false); if (!scope) { return true; } bson_string_append (state->str, scope); bson_string_append (state->str, " }"); bson_free (scope); return false; } static const bson_visitor_t bson_as_json_visitors = { _bson_as_json_visit_before, _bson_as_json_visit_after, _bson_as_json_visit_corrupt, _bson_as_json_visit_double, _bson_as_json_visit_utf8, _bson_as_json_visit_document, _bson_as_json_visit_array, _bson_as_json_visit_binary, _bson_as_json_visit_undefined, _bson_as_json_visit_oid, _bson_as_json_visit_bool, _bson_as_json_visit_date_time, _bson_as_json_visit_null, _bson_as_json_visit_regex, _bson_as_json_visit_dbpointer, _bson_as_json_visit_code, _bson_as_json_visit_symbol, _bson_as_json_visit_codewscope, _bson_as_json_visit_int32, _bson_as_json_visit_timestamp, _bson_as_json_visit_int64, _bson_as_json_visit_maxkey, _bson_as_json_visit_minkey, NULL, /* visit_unsupported_type */ _bson_as_json_visit_decimal128, }; static bool _bson_as_json_visit_document (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data) { bson_json_state_t *state = data; bson_json_state_t child_state = {0, true, state->err_offset}; bson_iter_t child; BSON_UNUSED (iter); BSON_UNUSED (key); if (state->depth >= BSON_MAX_RECURSION) { bson_string_append (state->str, "{ ... }"); return false; } if (bson_iter_init (&child, v_document)) { child_state.str = bson_string_new ("{ "); child_state.depth = state->depth + 1; child_state.mode = state->mode; child_state.max_len = BSON_MAX_LEN_UNLIMITED; if (state->max_len != BSON_MAX_LEN_UNLIMITED) { BSON_ASSERT (bson_in_range_unsigned (int32_t, state->str->len)); child_state.max_len = BSON_MAX (0, state->max_len - (int32_t) state->str->len); } child_state.max_len_reached = child_state.max_len == 0; if (bson_iter_visit_all (&child, &bson_as_json_visitors, &child_state)) { if (child_state.max_len_reached) { bson_string_append (state->str, child_state.str->str); } bson_string_free (child_state.str, true); /* If max_len was reached, we return a success state to ensure that * VISIT_AFTER is still called */ return !child_state.max_len_reached; } bson_string_append (child_state.str, " }"); bson_string_append (state->str, child_state.str->str); bson_string_free (child_state.str, true); } return false; } static bool _bson_as_json_visit_array (const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data) { bson_json_state_t *state = data; bson_json_state_t child_state = {0, false, state->err_offset}; bson_iter_t child; BSON_UNUSED (iter); BSON_UNUSED (key); if (state->depth >= BSON_MAX_RECURSION) { bson_string_append (state->str, "{ ... }"); return false; } if (bson_iter_init (&child, v_array)) { child_state.str = bson_string_new ("[ "); child_state.depth = state->depth + 1; child_state.mode = state->mode; child_state.max_len = BSON_MAX_LEN_UNLIMITED; if (state->max_len != BSON_MAX_LEN_UNLIMITED) { BSON_ASSERT (bson_in_range_unsigned (int32_t, state->str->len)); child_state.max_len = BSON_MAX (0, state->max_len - (int32_t) state->str->len); } child_state.max_len_reached = child_state.max_len == 0; if (bson_iter_visit_all (&child, &bson_as_json_visitors, &child_state)) { if (child_state.max_len_reached) { bson_string_append (state->str, child_state.str->str); } bson_string_free (child_state.str, true); /* If max_len was reached, we return a success state to ensure that * VISIT_AFTER is still called */ return !child_state.max_len_reached; } bson_string_append (child_state.str, " ]"); bson_string_append (state->str, child_state.str->str); bson_string_free (child_state.str, true); } return false; } static char * _bson_as_json_visit_all (const bson_t *bson, size_t *length, bson_json_mode_t mode, int32_t max_len, bool is_outermost_array) { bson_json_state_t state; bson_iter_t iter; ssize_t err_offset = -1; int32_t remaining; BSON_ASSERT (bson); if (length) { *length = 0; } if (bson_empty0 (bson)) { if (length) { *length = 3; } return bson_strdup (is_outermost_array ? "[ ]" : "{ }"); } if (!bson_iter_init (&iter, bson)) { return NULL; } state.count = 0; state.keys = !is_outermost_array; state.str = bson_string_new (is_outermost_array ? "[ " : "{ "); state.depth = 0; state.err_offset = &err_offset; state.mode = mode; state.max_len = max_len; state.max_len_reached = false; if ((bson_iter_visit_all (&iter, &bson_as_json_visitors, &state) || err_offset != -1) && !state.max_len_reached) { /* * We were prematurely exited due to corruption or failed visitor. */ bson_string_free (state.str, true); if (length) { *length = 0; } return NULL; } /* Append closing space and } separately, in case we hit the max in between. */ remaining = state.max_len - state.str->len; if (state.max_len == BSON_MAX_LEN_UNLIMITED || remaining > 1) { bson_string_append (state.str, is_outermost_array ? " ]" : " }"); } else if (remaining == 1) { bson_string_append (state.str, " "); } if (length) { *length = state.str->len; } return bson_string_free (state.str, false); } char * bson_as_json_with_opts (const bson_t *bson, size_t *length, const bson_json_opts_t *opts) { return _bson_as_json_visit_all ( bson, length, opts->mode, opts->max_len, opts->is_outermost_array); } char * bson_as_canonical_extended_json (const bson_t *bson, size_t *length) { const bson_json_opts_t opts = { BSON_JSON_MODE_CANONICAL, BSON_MAX_LEN_UNLIMITED, false}; return bson_as_json_with_opts (bson, length, &opts); } char * bson_as_json (const bson_t *bson, size_t *length) { const bson_json_opts_t opts = { BSON_JSON_MODE_LEGACY, BSON_MAX_LEN_UNLIMITED, false}; return bson_as_json_with_opts (bson, length, &opts); } char * bson_as_relaxed_extended_json (const bson_t *bson, size_t *length) { const bson_json_opts_t opts = { BSON_JSON_MODE_RELAXED, BSON_MAX_LEN_UNLIMITED, false}; return bson_as_json_with_opts (bson, length, &opts); } char * bson_array_as_json (const bson_t *bson, size_t *length) { const bson_json_opts_t opts = { BSON_JSON_MODE_LEGACY, BSON_MAX_LEN_UNLIMITED, true}; return bson_as_json_with_opts (bson, length, &opts); } char * bson_array_as_relaxed_extended_json (const bson_t *bson, size_t *length) { const bson_json_opts_t opts = { BSON_JSON_MODE_RELAXED, BSON_MAX_LEN_UNLIMITED, true}; return bson_as_json_with_opts (bson, length, &opts); } char * bson_array_as_canonical_extended_json (const bson_t *bson, size_t *length) { const bson_json_opts_t opts = { BSON_JSON_MODE_CANONICAL, BSON_MAX_LEN_UNLIMITED, true}; return bson_as_json_with_opts (bson, length, &opts); } #define VALIDATION_ERR(_flag, _msg, ...) \ bson_set_error (&state->error, BSON_ERROR_INVALID, _flag, _msg, __VA_ARGS__) static bool _bson_iter_validate_utf8 (const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data) { bson_validate_state_t *state = data; bool allow_null; if ((state->flags & BSON_VALIDATE_UTF8)) { allow_null = !!(state->flags & BSON_VALIDATE_UTF8_ALLOW_NULL); if (!bson_utf8_validate (v_utf8, v_utf8_len, allow_null)) { state->err_offset = iter->off; VALIDATION_ERR ( BSON_VALIDATE_UTF8, "invalid utf8 string for key \"%s\"", key); return true; } } if ((state->flags & BSON_VALIDATE_DOLLAR_KEYS)) { if (state->phase == BSON_VALIDATE_PHASE_LF_REF_UTF8) { state->phase = BSON_VALIDATE_PHASE_LF_ID_KEY; } else if (state->phase == BSON_VALIDATE_PHASE_LF_DB_UTF8) { state->phase = BSON_VALIDATE_PHASE_NOT_DBREF; } } return false; } static void _bson_iter_validate_corrupt (const bson_iter_t *iter, void *data) { bson_validate_state_t *state = data; state->err_offset = iter->err_off; VALIDATION_ERR (BSON_VALIDATE_NONE, "%s", "corrupt BSON"); } static bool _bson_iter_validate_before (const bson_iter_t *iter, const char *key, void *data) { bson_validate_state_t *state = data; if ((state->flags & BSON_VALIDATE_EMPTY_KEYS)) { if (key[0] == '\0') { state->err_offset = iter->off; VALIDATION_ERR (BSON_VALIDATE_EMPTY_KEYS, "%s", "empty key"); return true; } } if ((state->flags & BSON_VALIDATE_DOLLAR_KEYS)) { if (key[0] == '$') { if (state->phase == BSON_VALIDATE_PHASE_LF_REF_KEY && strcmp (key, "$ref") == 0) { state->phase = BSON_VALIDATE_PHASE_LF_REF_UTF8; } else if (state->phase == BSON_VALIDATE_PHASE_LF_ID_KEY && strcmp (key, "$id") == 0) { state->phase = BSON_VALIDATE_PHASE_LF_DB_KEY; } else if (state->phase == BSON_VALIDATE_PHASE_LF_DB_KEY && strcmp (key, "$db") == 0) { state->phase = BSON_VALIDATE_PHASE_LF_DB_UTF8; } else { state->err_offset = iter->off; VALIDATION_ERR (BSON_VALIDATE_DOLLAR_KEYS, "keys cannot begin with \"$\": \"%s\"", key); return true; } } else if (state->phase == BSON_VALIDATE_PHASE_LF_ID_KEY || state->phase == BSON_VALIDATE_PHASE_LF_REF_UTF8 || state->phase == BSON_VALIDATE_PHASE_LF_DB_UTF8) { state->err_offset = iter->off; VALIDATION_ERR (BSON_VALIDATE_DOLLAR_KEYS, "invalid key within DBRef subdocument: \"%s\"", key); return true; } else { state->phase = BSON_VALIDATE_PHASE_NOT_DBREF; } } if ((state->flags & BSON_VALIDATE_DOT_KEYS)) { if (strstr (key, ".")) { state->err_offset = iter->off; VALIDATION_ERR ( BSON_VALIDATE_DOT_KEYS, "keys cannot contain \".\": \"%s\"", key); return true; } } return false; } static bool _bson_iter_validate_codewscope (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, const bson_t *v_scope, void *data) { bson_validate_state_t *state = data; size_t offset = 0; BSON_UNUSED (key); BSON_UNUSED (v_code_len); BSON_UNUSED (v_code); if (!bson_validate (v_scope, state->flags, &offset)) { state->err_offset = iter->off + offset; VALIDATION_ERR (BSON_VALIDATE_NONE, "%s", "corrupt code-with-scope"); return false; } return true; } static bool _bson_iter_validate_document (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); static const bson_visitor_t bson_validate_funcs = { _bson_iter_validate_before, NULL, /* visit_after */ _bson_iter_validate_corrupt, NULL, /* visit_double */ _bson_iter_validate_utf8, _bson_iter_validate_document, _bson_iter_validate_document, /* visit_array */ NULL, /* visit_binary */ NULL, /* visit_undefined */ NULL, /* visit_oid */ NULL, /* visit_bool */ NULL, /* visit_date_time */ NULL, /* visit_null */ NULL, /* visit_regex */ NULL, /* visit_dbpoint */ NULL, /* visit_code */ NULL, /* visit_symbol */ _bson_iter_validate_codewscope, }; static bool _bson_iter_validate_document (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data) { bson_validate_state_t *state = data; bson_iter_t child; bson_validate_phase_t phase = state->phase; BSON_UNUSED (key); if (!bson_iter_init (&child, v_document)) { state->err_offset = iter->off; return true; } if (state->phase == BSON_VALIDATE_PHASE_START) { state->phase = BSON_VALIDATE_PHASE_TOP; } else { state->phase = BSON_VALIDATE_PHASE_LF_REF_KEY; } (void) bson_iter_visit_all (&child, &bson_validate_funcs, state); if (state->phase == BSON_VALIDATE_PHASE_LF_ID_KEY || state->phase == BSON_VALIDATE_PHASE_LF_REF_UTF8 || state->phase == BSON_VALIDATE_PHASE_LF_DB_UTF8) { if (state->err_offset <= 0) { state->err_offset = iter->off; } return true; } state->phase = phase; return false; } static void _bson_validate_internal (const bson_t *bson, bson_validate_state_t *state) { bson_iter_t iter; state->err_offset = -1; state->phase = BSON_VALIDATE_PHASE_START; memset (&state->error, 0, sizeof state->error); if (!bson_iter_init (&iter, bson)) { state->err_offset = 0; VALIDATION_ERR (BSON_VALIDATE_NONE, "%s", "corrupt BSON"); } else { _bson_iter_validate_document (&iter, NULL, bson, state); } } bool bson_validate (const bson_t *bson, bson_validate_flags_t flags, size_t *offset) { bson_validate_state_t state; state.flags = flags; _bson_validate_internal (bson, &state); if (state.err_offset > 0 && offset) { *offset = (size_t) state.err_offset; } return state.err_offset < 0; } bool bson_validate_with_error (const bson_t *bson, bson_validate_flags_t flags, bson_error_t *error) { bson_validate_state_t state; state.flags = flags; _bson_validate_internal (bson, &state); if (state.err_offset > 0 && error) { memcpy (error, &state.error, sizeof *error); } return state.err_offset < 0; } bool bson_concat (bson_t *dst, const bson_t *src) { BSON_ASSERT (dst); BSON_ASSERT (src); if (!bson_empty (src)) { return _bson_append ( dst, 1, src->len - 5, src->len - 5, _bson_data (src) + 4); } return true; } struct _bson_array_builder_t { uint32_t index; bson_t bson; }; bson_array_builder_t * bson_array_builder_new (void) { bson_array_builder_t *bab = bson_malloc0 (sizeof (bson_array_builder_t)); bson_init (&bab->bson); return bab; } // `bson_array_builder_append_impl` generates the next key index, calls // `append_fn`, and may update the tracked next index. #define bson_array_builder_append_impl(append_fn, ...) \ if (1) { \ BSON_ASSERT_PARAM (bab); \ const char *key; \ char buf[16]; \ size_t key_length = \ bson_uint32_to_string (bab->index, &key, buf, sizeof buf); \ /* Expect enough room in `buf` for key string. UINT32_MAX is 10 digits. \ * With the NULL terminator, 11 is expected maximum number of \ * characters. */ \ BSON_ASSERT (key_length < sizeof buf); \ bool ok = append_fn (&bab->bson, key, (int) key_length, __VA_ARGS__); \ if (ok) { \ bab->index += 1; \ } \ return ok; \ } else \ (void) 0 #define bson_array_builder_append_impl_noargs(append_fn) \ if (1) { \ BSON_ASSERT_PARAM (bab); \ const char *key; \ char buf[16]; \ size_t key_length = \ bson_uint32_to_string (bab->index, &key, buf, sizeof buf); \ /* Expect enough room in `buf` for key string. UINT32_MAX is 10 digits. \ * With the NULL terminator, 11 is expected maximum number of \ * characters. */ \ BSON_ASSERT (key_length < sizeof buf); \ bool ok = append_fn (&bab->bson, key, (int) key_length); \ if (ok) { \ bab->index += 1; \ } \ return ok; \ } else \ (void) 0 bool bson_array_builder_append_value (bson_array_builder_t *bab, const bson_value_t *value) { bson_array_builder_append_impl (bson_append_value, value); } bool bson_array_builder_append_array (bson_array_builder_t *bab, const bson_t *array) { bson_array_builder_append_impl (bson_append_array, array); } bool bson_array_builder_append_binary (bson_array_builder_t *bab, bson_subtype_t subtype, const uint8_t *binary, uint32_t length) { bson_array_builder_append_impl (bson_append_binary, subtype, binary, length); } bool bson_array_builder_append_bool (bson_array_builder_t *bab, bool value) { bson_array_builder_append_impl (bson_append_bool, value); } bool bson_array_builder_append_code (bson_array_builder_t *bab, const char *javascript) { bson_array_builder_append_impl (bson_append_code, javascript); } bool bson_array_builder_append_code_with_scope (bson_array_builder_t *bab, const char *javascript, const bson_t *scope) { bson_array_builder_append_impl ( bson_append_code_with_scope, javascript, scope); } bool bson_array_builder_append_dbpointer (bson_array_builder_t *bab, const char *collection, const bson_oid_t *oid) { bson_array_builder_append_impl (bson_append_dbpointer, collection, oid); } bool bson_array_builder_append_double (bson_array_builder_t *bab, double value) { bson_array_builder_append_impl (bson_append_double, value); } bool bson_array_builder_append_document (bson_array_builder_t *bab, const bson_t *value) { bson_array_builder_append_impl (bson_append_document, value); } bool bson_array_builder_append_document_begin (bson_array_builder_t *bab, bson_t *child) { bson_array_builder_append_impl (bson_append_document_begin, child); } bool bson_array_builder_append_document_end (bson_array_builder_t *bab, bson_t *child) { return bson_append_document_end (&bab->bson, child); } bool bson_array_builder_append_int32 (bson_array_builder_t *bab, int32_t value) { bson_array_builder_append_impl (bson_append_int32, value); } bool bson_array_builder_append_int64 (bson_array_builder_t *bab, int64_t value) { bson_array_builder_append_impl (bson_append_int64, value); } bool bson_array_builder_append_decimal128 (bson_array_builder_t *bab, const bson_decimal128_t *value) { bson_array_builder_append_impl (bson_append_decimal128, value); } bool bson_array_builder_append_iter (bson_array_builder_t *bab, const bson_iter_t *iter) { bson_array_builder_append_impl (bson_append_iter, iter); } bool bson_array_builder_append_minkey (bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs (bson_append_minkey); } bool bson_array_builder_append_maxkey (bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs (bson_append_maxkey); } bool bson_array_builder_append_null (bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs (bson_append_null); } bool bson_array_builder_append_oid (bson_array_builder_t *bab, const bson_oid_t *oid) { bson_array_builder_append_impl (bson_append_oid, oid); } bool bson_array_builder_append_regex (bson_array_builder_t *bab, const char *regex, const char *options) { bson_array_builder_append_impl (bson_append_regex, regex, options); } bool bson_array_builder_append_regex_w_len (bson_array_builder_t *bab, const char *regex, int regex_length, const char *options) { bson_array_builder_append_impl ( bson_append_regex_w_len, regex, regex_length, options); } bool bson_array_builder_append_utf8 (bson_array_builder_t *bab, const char *value, int length) { bson_array_builder_append_impl (bson_append_utf8, value, length); } bool bson_array_builder_append_symbol (bson_array_builder_t *bab, const char *value, int length) { bson_array_builder_append_impl (bson_append_symbol, value, length); } bool bson_array_builder_append_time_t (bson_array_builder_t *bab, time_t value) { bson_array_builder_append_impl (bson_append_time_t, value); } bool bson_array_builder_append_timeval (bson_array_builder_t *bab, struct timeval *value) { bson_array_builder_append_impl (bson_append_timeval, value); } bool bson_array_builder_append_date_time (bson_array_builder_t *bab, int64_t value) { bson_array_builder_append_impl (bson_append_date_time, value); } bool bson_array_builder_append_now_utc (bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs (bson_append_now_utc); } bool bson_array_builder_append_timestamp (bson_array_builder_t *bab, uint32_t timestamp, uint32_t increment) { bson_array_builder_append_impl (bson_append_timestamp, timestamp, increment); } bool bson_array_builder_append_undefined (bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs (bson_append_undefined); } bool bson_array_builder_append_array_builder_begin (bson_array_builder_t *bab, bson_array_builder_t **child) { bson_array_builder_append_impl (bson_append_array_builder_begin, child); } bool bson_array_builder_append_array_builder_end (bson_array_builder_t *bab, bson_array_builder_t *child) { return bson_append_array_builder_end (&bab->bson, child); } bool bson_array_builder_build (bson_array_builder_t *bab, bson_t *out) { BSON_ASSERT_PARAM (bab); BSON_ASSERT_PARAM (out); if (!bson_steal (out, &bab->bson)) { return false; } bson_init (&bab->bson); bab->index = 0; return true; } void bson_array_builder_destroy (bson_array_builder_t *bab) { if (!bab) { return; } bson_destroy (&bab->bson); bson_free (bab); } bool bson_append_array_builder_begin (bson_t *bson, const char *key, int key_length, bson_array_builder_t **child) { BSON_ASSERT_PARAM (bson); BSON_ASSERT_PARAM (key); BSON_ASSERT_PARAM (child); *child = bson_array_builder_new (); return bson_append_array_begin (bson, key, key_length, &(*child)->bson); } bool bson_append_array_builder_end (bson_t *bson, bson_array_builder_t *child) { bool ok = bson_append_array_end (bson, &child->bson); bson_array_builder_destroy (child); return ok; } mongo-c-driver-1.26.0/src/libbson/src/bson/bson.h000066400000000000000000001247551456567454500215540ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSON_H #define BSON_H #define BSON_INSIDE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef BSON_INSIDE BSON_BEGIN_DECLS /** * bson_empty: * @b: a bson_t. * * Checks to see if @b is an empty BSON document. An empty BSON document is * a 5 byte document which contains the length (4 bytes) and a single NUL * byte indicating end of fields. */ #define bson_empty(b) (((b)->len == 5) || !bson_get_data ((b))[4]) /** * bson_empty0: * * Like bson_empty() but treats NULL the same as an empty bson_t document. */ #define bson_empty0(b) (!(b) || bson_empty (b)) /** * bson_clear: * * Easily free a bson document and set it to NULL. Use like: * * bson_t *doc = bson_new(); * bson_clear (&doc); * BSON_ASSERT (doc == NULL); */ #define bson_clear(bptr) \ do { \ if (*(bptr)) { \ bson_destroy (*(bptr)); \ *(bptr) = NULL; \ } \ } while (0) /** * BSON_MAX_SIZE: * * The maximum size in bytes of a BSON document. */ #define BSON_MAX_SIZE ((size_t) ((1U << 31) - 1)) #define BSON_APPEND_ARRAY(b, key, val) \ bson_append_array (b, key, (int) strlen (key), val) #define BSON_APPEND_ARRAY_BEGIN(b, key, child) \ bson_append_array_begin (b, key, (int) strlen (key), child) #define BSON_APPEND_BINARY(b, key, subtype, val, len) \ bson_append_binary (b, key, (int) strlen (key), subtype, val, len) #define BSON_APPEND_BOOL(b, key, val) \ bson_append_bool (b, key, (int) strlen (key), val) #define BSON_APPEND_CODE(b, key, val) \ bson_append_code (b, key, (int) strlen (key), val) #define BSON_APPEND_CODE_WITH_SCOPE(b, key, val, scope) \ bson_append_code_with_scope (b, key, (int) strlen (key), val, scope) #define BSON_APPEND_DBPOINTER(b, key, coll, oid) \ bson_append_dbpointer (b, key, (int) strlen (key), coll, oid) #define BSON_APPEND_DOCUMENT_BEGIN(b, key, child) \ bson_append_document_begin (b, key, (int) strlen (key), child) #define BSON_APPEND_DOUBLE(b, key, val) \ bson_append_double (b, key, (int) strlen (key), val) #define BSON_APPEND_DOCUMENT(b, key, val) \ bson_append_document (b, key, (int) strlen (key), val) #define BSON_APPEND_INT32(b, key, val) \ bson_append_int32 (b, key, (int) strlen (key), val) #define BSON_APPEND_INT64(b, key, val) \ bson_append_int64 (b, key, (int) strlen (key), val) #define BSON_APPEND_MINKEY(b, key) \ bson_append_minkey (b, key, (int) strlen (key)) #define BSON_APPEND_DECIMAL128(b, key, val) \ bson_append_decimal128 (b, key, (int) strlen (key), val) #define BSON_APPEND_MAXKEY(b, key) \ bson_append_maxkey (b, key, (int) strlen (key)) #define BSON_APPEND_NULL(b, key) bson_append_null (b, key, (int) strlen (key)) #define BSON_APPEND_OID(b, key, val) \ bson_append_oid (b, key, (int) strlen (key), val) #define BSON_APPEND_REGEX(b, key, val, opt) \ bson_append_regex (b, key, (int) strlen (key), val, opt) #define BSON_APPEND_UTF8(b, key, val) \ bson_append_utf8 (b, key, (int) strlen (key), val, (int) strlen (val)) #define BSON_APPEND_SYMBOL(b, key, val) \ bson_append_symbol (b, key, (int) strlen (key), val, (int) strlen (val)) #define BSON_APPEND_TIME_T(b, key, val) \ bson_append_time_t (b, key, (int) strlen (key), val) #define BSON_APPEND_TIMEVAL(b, key, val) \ bson_append_timeval (b, key, (int) strlen (key), val) #define BSON_APPEND_DATE_TIME(b, key, val) \ bson_append_date_time (b, key, (int) strlen (key), val) #define BSON_APPEND_TIMESTAMP(b, key, val, inc) \ bson_append_timestamp (b, key, (int) strlen (key), val, inc) #define BSON_APPEND_UNDEFINED(b, key) \ bson_append_undefined (b, key, (int) strlen (key)) #define BSON_APPEND_VALUE(b, key, val) \ bson_append_value (b, key, (int) strlen (key), (val)) /** * bson_new: * * Allocates a new bson_t structure. Call the various bson_append_*() * functions to add fields to the bson. You can iterate the bson_t at any * time using a bson_iter_t and bson_iter_init(). * * Returns: A newly allocated bson_t that should be freed with bson_destroy(). */ BSON_EXPORT (bson_t *) bson_new (void); BSON_EXPORT (bson_t *) bson_new_from_json (const uint8_t *data, ssize_t len, bson_error_t *error); BSON_EXPORT (bool) bson_init_from_json (bson_t *bson, const char *data, ssize_t len, bson_error_t *error); /** * bson_init_static: * @b: A pointer to a bson_t. * @data: The data buffer to use. * @length: The length of @data. * * Initializes a bson_t using @data and @length. This is ideal if you would * like to use a stack allocation for your bson and do not need to grow the * buffer. @data must be valid for the life of @b. * * Returns: true if initialized successfully; otherwise false. */ BSON_EXPORT (bool) bson_init_static (bson_t *b, const uint8_t *data, size_t length); /** * bson_init: * @b: A pointer to a bson_t. * * Initializes a bson_t for use. This function is useful to those that want a * stack allocated bson_t. The usefulness of a stack allocated bson_t is * marginal as the target buffer for content will still require heap * allocations. It can help reduce heap fragmentation on allocators that do * not employ SLAB/magazine semantics. * * You must call bson_destroy() with @b to release resources when you are done * using @b. */ BSON_EXPORT (void) bson_init (bson_t *b); /** * bson_reinit: * @b: (inout): A bson_t. * * This is equivalent to calling bson_destroy() and bson_init() on a #bson_t. * However, it will try to persist the existing malloc'd buffer if one exists. * This is useful in cases where you want to reduce malloc overhead while * building many documents. */ BSON_EXPORT (void) bson_reinit (bson_t *b); /** * bson_new_from_data: * @data: A buffer containing a serialized bson document. * @length: The length of the document in bytes. * * Creates a new bson_t structure using the data provided. @data should contain * at least @length bytes that can be copied into the new bson_t structure. * * Returns: A newly allocated bson_t that should be freed with bson_destroy(). * If the first four bytes (little-endian) of data do not match @length, * then NULL will be returned. */ BSON_EXPORT (bson_t *) bson_new_from_data (const uint8_t *data, size_t length); /** * bson_new_from_buffer: * @buf: A pointer to a buffer containing a serialized bson document. * @buf_len: The length of the buffer in bytes. * @realloc_fun: a realloc like function * @realloc_fun_ctx: a context for the realloc function * * Creates a new bson_t structure using the data provided. @buf should contain * a bson document, or null pointer should be passed for new allocations. * * Returns: A newly allocated bson_t that should be freed with bson_destroy(). * The underlying buffer will be used and not be freed in destroy. */ BSON_EXPORT (bson_t *) bson_new_from_buffer (uint8_t **buf, size_t *buf_len, bson_realloc_func realloc_func, void *realloc_func_ctx); /** * bson_sized_new: * @size: A size_t containing the number of bytes to allocate. * * This will allocate a new bson_t with enough bytes to hold a buffer * sized @size. @size must be smaller than INT_MAX bytes. * * Returns: A newly allocated bson_t that should be freed with bson_destroy(). */ BSON_EXPORT (bson_t *) bson_sized_new (size_t size); /** * bson_copy: * @bson: A bson_t. * * Copies @bson into a newly allocated bson_t. You must call bson_destroy() * when you are done with the resulting value to free its resources. * * Returns: A newly allocated bson_t that should be free'd with bson_destroy() */ BSON_EXPORT (bson_t *) bson_copy (const bson_t *bson); /** * bson_copy_to: * @src: The source bson_t. * @dst: The destination bson_t. * * Initializes @dst and copies the content from @src into @dst. */ BSON_EXPORT (void) bson_copy_to (const bson_t *src, bson_t *dst); /** * bson_copy_to_excluding: * @src: A bson_t. * @dst: A bson_t to initialize and copy into. * @first_exclude: First field name to exclude. * * Copies @src into @dst excluding any field that is provided. * This is handy for situations when you need to remove one or * more fields in a bson_t. Note that bson_init() will be called * on dst. */ BSON_EXPORT (void) bson_copy_to_excluding (const bson_t *src, bson_t *dst, const char *first_exclude, ...) BSON_GNUC_NULL_TERMINATED BSON_GNUC_DEPRECATED_FOR (bson_copy_to_excluding_noinit); /** * bson_copy_to_excluding_noinit: * @src: A bson_t. * @dst: A bson_t to initialize and copy into. * @first_exclude: First field name to exclude. * * The same as bson_copy_to_excluding, but does not call bson_init() * on the dst. This version should be preferred in new code, but the * old function is left for backwards compatibility. */ BSON_EXPORT (void) bson_copy_to_excluding_noinit (const bson_t *src, bson_t *dst, const char *first_exclude, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT (void) bson_copy_to_excluding_noinit_va (const bson_t *src, bson_t *dst, const char *first_exclude, va_list args); /** * bson_destroy: * @bson: A bson_t. * * Frees the resources associated with @bson. */ BSON_EXPORT (void) bson_destroy (bson_t *bson); BSON_EXPORT (uint8_t *) bson_reserve_buffer (bson_t *bson, uint32_t size); BSON_EXPORT (bool) bson_steal (bson_t *dst, bson_t *src); /** * bson_destroy_with_steal: * @bson: A #bson_t. * @steal: If ownership of the data buffer should be transferred to caller. * @length: (out): location for the length of the buffer. * * Destroys @bson similar to calling bson_destroy() except that the underlying * buffer will be returned and ownership transferred to the caller if @steal * is non-zero. * * If length is non-NULL, the length of @bson will be stored in @length. * * It is a programming error to call this function with any bson that has * been initialized static, or is being used to create a subdocument with * functions such as bson_append_document_begin() or bson_append_array_begin(). * * Returns: a buffer owned by the caller if @steal is true. Otherwise NULL. * If there was an error, NULL is returned. */ BSON_EXPORT (uint8_t *) bson_destroy_with_steal (bson_t *bson, bool steal, uint32_t *length); /** * bson_get_data: * @bson: A bson_t. * * Fetched the data buffer for @bson of @bson->len bytes in length. * * Returns: A buffer that should not be modified or freed. */ BSON_EXPORT (const uint8_t *) bson_get_data (const bson_t *bson); /** * bson_count_keys: * @bson: A bson_t. * * Counts the number of elements found in @bson. */ BSON_EXPORT (uint32_t) bson_count_keys (const bson_t *bson); /** * bson_has_field: * @bson: A bson_t. * @key: The key to lookup. * * Checks to see if @bson contains a field named @key. * * This function is case-sensitive. * * Returns: true if @key exists in @bson; otherwise false. */ BSON_EXPORT (bool) bson_has_field (const bson_t *bson, const char *key); /** * bson_compare: * @bson: A bson_t. * @other: A bson_t. * * Compares @bson to @other in a qsort() style comparison. * See qsort() for information on how this function works. * * Returns: Less than zero, zero, or greater than zero. */ BSON_EXPORT (int) bson_compare (const bson_t *bson, const bson_t *other); /* * bson_equal: * @bson: A bson_t. * @other: A bson_t. * * Checks to see if @bson and @other are equal. * * Returns: true if equal; otherwise false. */ BSON_EXPORT (bool) bson_equal (const bson_t *bson, const bson_t *other); /** * bson_validate: * @bson: A bson_t. * @offset: A location for the error offset. * * Validates a BSON document by walking through the document and inspecting * the fields for valid content. * * Returns: true if @bson is valid; otherwise false and @offset is set. */ BSON_EXPORT (bool) bson_validate (const bson_t *bson, bson_validate_flags_t flags, size_t *offset); /** * bson_validate_with_error: * @bson: A bson_t. * @error: A location for the error info. * * Validates a BSON document by walking through the document and inspecting * the fields for valid content. * * Returns: true if @bson is valid; otherwise false and @error is filled out. */ BSON_EXPORT (bool) bson_validate_with_error (const bson_t *bson, bson_validate_flags_t flags, bson_error_t *error); /** * bson_as_json_with_opts: * @bson: A bson_t. * @length: A location for the string length, or NULL. * @opts: A bson_t_json_opts_t defining options for the conversion * * Creates a new string containing @bson in the selected JSON format, * conforming to the MongoDB Extended JSON Spec: * * github.com/mongodb/specifications/blob/master/source/extended-json.rst * * The caller is responsible for freeing the resulting string. If @length is * non-NULL, then the length of the resulting string will be placed in @length. * * See https://www.mongodb.com/docs/manual/reference/mongodb-extended-json/ for * more information on extended JSON. * * Returns: A newly allocated string that should be freed with bson_free(). */ BSON_EXPORT (char *) bson_as_json_with_opts (const bson_t *bson, size_t *length, const bson_json_opts_t *opts); /** * bson_as_canonical_extended_json: * @bson: A bson_t. * @length: A location for the string length, or NULL. * * Creates a new string containing @bson in canonical extended JSON format, * conforming to the MongoDB Extended JSON Spec: * * github.com/mongodb/specifications/blob/master/source/extended-json.rst * * The caller is responsible for freeing the resulting string. If @length is * non-NULL, then the length of the resulting string will be placed in @length. * * See https://www.mongodb.com/docs/manual/reference/mongodb-extended-json/ for * more information on extended JSON. * * Returns: A newly allocated string that should be freed with bson_free(). */ BSON_EXPORT (char *) bson_as_canonical_extended_json (const bson_t *bson, size_t *length); /** * bson_as_json: * @bson: A bson_t. * @length: A location for the string length, or NULL. * * Creates a new string containing @bson in libbson's legacy JSON format. * Superseded by bson_as_canonical_extended_json and * bson_as_relaxed_extended_json. The caller is * responsible for freeing the resulting string. If @length is non-NULL, then * the length of the resulting string will be placed in @length. * * Returns: A newly allocated string that should be freed with bson_free(). */ BSON_EXPORT (char *) bson_as_json (const bson_t *bson, size_t *length); /** * bson_as_relaxed_extended_json: * @bson: A bson_t. * @length: A location for the string length, or NULL. * * Creates a new string containing @bson in relaxed extended JSON format, * conforming to the MongoDB Extended JSON Spec: * * github.com/mongodb/specifications/blob/master/source/extended-json.rst * * The caller is responsible for freeing the resulting string. If @length is * non-NULL, then the length of the resulting string will be placed in @length. * * See https://www.mongodb.com/docs/manual/reference/mongodb-extended-json/ for * more information on extended JSON. * * Returns: A newly allocated string that should be freed with bson_free(). */ BSON_EXPORT (char *) bson_as_relaxed_extended_json (const bson_t *bson, size_t *length); /* like bson_as_json() but for outermost arrays. */ BSON_EXPORT (char *) bson_array_as_json (const bson_t *bson, size_t *length); /* like bson_as_relaxed_extended_json() but for outermost arrays. */ BSON_EXPORT (char *) bson_array_as_relaxed_extended_json (const bson_t *bson, size_t *length); /* like bson_as_canonical_extended_json() but for outermost arrays. */ BSON_EXPORT (char *) bson_array_as_canonical_extended_json (const bson_t *bson, size_t *length); // bson_array_builder_t defines an API for building arrays. // BSON arrays require sequential numeric keys "0", "1", "2", ... typedef struct _bson_array_builder_t bson_array_builder_t; // bson_array_builder_new may be used to build a top-level BSON array. Example: // `[1,2,3]`. // To append an array field to a document (Example: `{ "field": [1,2,3] }`), use // `bson_append_array_builder_begin`. BSON_EXPORT (bson_array_builder_t *) bson_array_builder_new (void); // bson_array_builder_build initializes and moves BSON data to `out`. // `bab` may be reused and will start appending a new array at index "0". BSON_EXPORT (bool) bson_array_builder_build (bson_array_builder_t *bab, bson_t *out); BSON_EXPORT (void) bson_array_builder_destroy (bson_array_builder_t *bab); BSON_EXPORT (bool) bson_append_value (bson_t *bson, const char *key, int key_length, const bson_value_t *value); #define BSON_APPEND_VALUE(b, key, val) \ bson_append_value (b, key, (int) strlen (key), (val)) BSON_EXPORT (bool) bson_array_builder_append_value (bson_array_builder_t *bab, const bson_value_t *value); /** * bson_append_array: * @bson: A bson_t. * @key: The key for the field. * @array: A bson_t containing the array. * * Appends a BSON array to @bson. BSON arrays are like documents where the * key is the string version of the index. For example, the first item of the * array would have the key "0". The second item would have the index "1". * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_array (bson_t *bson, const char *key, int key_length, const bson_t *array); #define BSON_APPEND_ARRAY(b, key, val) \ bson_append_array (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_array (bson_array_builder_t *bab, const bson_t *array); /** * bson_append_binary: * @bson: A bson_t to append. * @key: The key for the field. * @subtype: The bson_subtype_t of the binary. * @binary: The binary buffer to append. * @length: The length of @binary. * * Appends a binary buffer to the BSON document. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_binary (bson_t *bson, const char *key, int key_length, bson_subtype_t subtype, const uint8_t *binary, uint32_t length); #define BSON_APPEND_BINARY(b, key, subtype, val, len) \ bson_append_binary (b, key, (int) strlen (key), subtype, val, len) BSON_EXPORT (bool) bson_array_builder_append_binary (bson_array_builder_t *bab, bson_subtype_t subtype, const uint8_t *binary, uint32_t length); /** * bson_append_bool: * @bson: A bson_t. * @key: The key for the field. * @value: The boolean value. * * Appends a new field to @bson of type BSON_TYPE_BOOL. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_bool (bson_t *bson, const char *key, int key_length, bool value); #define BSON_APPEND_BOOL(b, key, val) \ bson_append_bool (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_bool (bson_array_builder_t *bab, bool value); /** * bson_append_code: * @bson: A bson_t. * @key: The key for the document. * @javascript: JavaScript code to be executed. * * Appends a field of type BSON_TYPE_CODE to the BSON document. @javascript * should contain a script in javascript to be executed. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_code (bson_t *bson, const char *key, int key_length, const char *javascript); #define BSON_APPEND_CODE(b, key, val) \ bson_append_code (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_code (bson_array_builder_t *bab, const char *javascript); /** * bson_append_code_with_scope: * @bson: A bson_t. * @key: The key for the document. * @javascript: JavaScript code to be executed. * @scope: A bson_t containing the scope for @javascript. * * Appends a field of type BSON_TYPE_CODEWSCOPE to the BSON document. * @javascript should contain a script in javascript to be executed. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_code_with_scope (bson_t *bson, const char *key, int key_length, const char *javascript, const bson_t *scope); #define BSON_APPEND_CODE_WITH_SCOPE(b, key, val, scope) \ bson_append_code_with_scope (b, key, (int) strlen (key), val, scope) BSON_EXPORT (bool) bson_array_builder_append_code_with_scope (bson_array_builder_t *bab, const char *javascript, const bson_t *scope); /** * bson_append_dbpointer: * @bson: A bson_t. * @key: The key for the field. * @collection: The collection name. * @oid: The oid to the reference. * * Appends a new field of type BSON_TYPE_DBPOINTER. This datum type is * deprecated in the BSON spec and should not be used in new code. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_dbpointer (bson_t *bson, const char *key, int key_length, const char *collection, const bson_oid_t *oid); #define BSON_APPEND_DBPOINTER(b, key, coll, oid) \ bson_append_dbpointer (b, key, (int) strlen (key), coll, oid) BSON_EXPORT (bool) bson_array_builder_append_dbpointer (bson_array_builder_t *bab, const char *collection, const bson_oid_t *oid); /** * bson_append_double: * @bson: A bson_t. * @key: The key for the field. * * Appends a new field to @bson of the type BSON_TYPE_DOUBLE. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_double (bson_t *bson, const char *key, int key_length, double value); #define BSON_APPEND_DOUBLE(b, key, val) \ bson_append_double (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_double (bson_array_builder_t *bab, double value); /** * bson_append_document: * @bson: A bson_t. * @key: The key for the field. * @value: A bson_t containing the subdocument. * * Appends a new field to @bson of the type BSON_TYPE_DOCUMENT. * The documents contents will be copied into @bson. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_document (bson_t *bson, const char *key, int key_length, const bson_t *value); #define BSON_APPEND_DOCUMENT(b, key, val) \ bson_append_document (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_document (bson_array_builder_t *bab, const bson_t *value); /** * bson_append_document_begin: * @bson: A bson_t. * @key: The key for the field. * @key_length: The length of @key in bytes not including NUL or -1 * if @key_length is NUL terminated. * @child: A location to an uninitialized bson_t. * * Appends a new field named @key to @bson. The field is, however, * incomplete. @child will be initialized so that you may add fields to the * child document. Child will use a memory buffer owned by @bson and * therefore grow the parent buffer as additional space is used. This allows * a single malloc'd buffer to be used when building documents which can help * reduce memory fragmentation. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_document_begin (bson_t *bson, const char *key, int key_length, bson_t *child); #define BSON_APPEND_DOCUMENT_BEGIN(b, key, child) \ bson_append_document_begin (b, key, (int) strlen (key), child) BSON_EXPORT (bool) bson_array_builder_append_document_begin (bson_array_builder_t *bab, bson_t *child); /** * bson_append_document_end: * @bson: A bson_t. * @child: A bson_t supplied to bson_append_document_begin(). * * Finishes the appending of a document to a @bson. @child is considered * disposed after this call and should not be used any further. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_document_end (bson_t *bson, bson_t *child); BSON_EXPORT (bool) bson_array_builder_append_document_end (bson_array_builder_t *bab, bson_t *child); /** * bson_append_array_begin: * @bson: A bson_t. * @key: The key for the field. * @key_length: The length of @key in bytes not including NUL or -1 * if @key_length is NUL terminated. * @child: A location to an uninitialized bson_t. * * Appends a new field named @key to @bson. The field is, however, * incomplete. @child will be initialized so that you may add fields to the * child array. Child will use a memory buffer owned by @bson and * therefore grow the parent buffer as additional space is used. This allows * a single malloc'd buffer to be used when building arrays which can help * reduce memory fragmentation. * * The type of @child will be BSON_TYPE_ARRAY and therefore the keys inside * of it MUST be "0", "1", etc. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_array_begin (bson_t *bson, const char *key, int key_length, bson_t *child); #define BSON_APPEND_ARRAY_BEGIN(b, key, child) \ bson_append_array_begin (b, key, (int) strlen (key), child) /** * bson_append_array_end: * @bson: A bson_t. * @child: A bson_t supplied to bson_append_array_begin(). * * Finishes the appending of a array to a @bson. @child is considered * disposed after this call and should not be used any further. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_array_end (bson_t *bson, bson_t *child); /** * bson_append_int32: * @bson: A bson_t. * @key: The key for the field. * @value: The int32_t 32-bit integer value. * * Appends a new field of type BSON_TYPE_INT32 to @bson. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_int32 (bson_t *bson, const char *key, int key_length, int32_t value); #define BSON_APPEND_INT32(b, key, val) \ bson_append_int32 (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_int32 (bson_array_builder_t *bab, int32_t value); /** * bson_append_int64: * @bson: A bson_t. * @key: The key for the field. * @value: The int64_t 64-bit integer value. * * Appends a new field of type BSON_TYPE_INT64 to @bson. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_int64 (bson_t *bson, const char *key, int key_length, int64_t value); #define BSON_APPEND_INT64(b, key, val) \ bson_append_int64 (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_int64 (bson_array_builder_t *bab, int64_t value); /** * bson_append_decimal128: * @bson: A bson_t. * @key: The key for the field. * @value: The bson_decimal128_t decimal128 value. * * Appends a new field of type BSON_TYPE_DECIMAL128 to @bson. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_decimal128 (bson_t *bson, const char *key, int key_length, const bson_decimal128_t *value); #define BSON_APPEND_DECIMAL128(b, key, val) \ bson_append_decimal128 (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_decimal128 (bson_array_builder_t *bab, const bson_decimal128_t *value); /** * bson_append_iter: * @bson: A bson_t to append to. * @key: The key name or %NULL to take current key from @iter. * @key_length: The key length or -1 to use strlen(). * @iter: The iter located on the position of the element to append. * * Appends a new field to @bson that is equivalent to the field currently * pointed to by @iter. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_iter (bson_t *bson, const char *key, int key_length, const bson_iter_t *iter); #define BSON_APPEND_ITER(b, key, val) \ bson_append_iter (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_iter (bson_array_builder_t *bab, const bson_iter_t *iter); /** * bson_append_minkey: * @bson: A bson_t. * @key: The key for the field. * * Appends a new field of type BSON_TYPE_MINKEY to @bson. This is a special * type that compares lower than all other possible BSON element values. * * See http://bsonspec.org for more information on this type. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_minkey (bson_t *bson, const char *key, int key_length); #define BSON_APPEND_MINKEY(b, key) \ bson_append_minkey (b, key, (int) strlen (key)) BSON_EXPORT (bool) bson_array_builder_append_minkey (bson_array_builder_t *bab); /** * bson_append_maxkey: * @bson: A bson_t. * @key: The key for the field. * * Appends a new field of type BSON_TYPE_MAXKEY to @bson. This is a special * type that compares higher than all other possible BSON element values. * * See http://bsonspec.org for more information on this type. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_maxkey (bson_t *bson, const char *key, int key_length); #define BSON_APPEND_MAXKEY(b, key) \ bson_append_maxkey (b, key, (int) strlen (key)) BSON_EXPORT (bool) bson_array_builder_append_maxkey (bson_array_builder_t *bab); /** * bson_append_null: * @bson: A bson_t. * @key: The key for the field. * * Appends a new field to @bson with NULL for the value. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_null (bson_t *bson, const char *key, int key_length); #define BSON_APPEND_NULL(b, key) bson_append_null (b, key, (int) strlen (key)) BSON_EXPORT (bool) bson_array_builder_append_null (bson_array_builder_t *bab); /** * bson_append_oid: * @bson: A bson_t. * @key: The key for the field. * @oid: bson_oid_t. * * Appends a new field to the @bson of type BSON_TYPE_OID using the contents of * @oid. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_oid (bson_t *bson, const char *key, int key_length, const bson_oid_t *oid); #define BSON_APPEND_OID(b, key, val) \ bson_append_oid (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_oid (bson_array_builder_t *bab, const bson_oid_t *oid); /** * bson_append_regex: * @bson: A bson_t. * @key: The key of the field. * @regex: The regex to append to the bson. * @options: Options for @regex. * * Appends a new field to @bson of type BSON_TYPE_REGEX. @regex should * be the regex string. @options should contain the options for the regex. * * Valid options for @options are: * * 'i' for case-insensitive. * 'm' for multiple matching. * 'x' for verbose mode. * 'l' to make \w and \W locale dependent. * 's' for dotall mode ('.' matches everything) * 'u' to make \w and \W match unicode. * * For more detailed information about BSON regex elements, see bsonspec.org. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_regex (bson_t *bson, const char *key, int key_length, const char *regex, const char *options); #define BSON_APPEND_REGEX(b, key, val, opt) \ bson_append_regex (b, key, (int) strlen (key), val, opt) BSON_EXPORT (bool) bson_array_builder_append_regex (bson_array_builder_t *bab, const char *regex, const char *options); /** * bson_append_regex: * @bson: A bson_t. * @key: The key of the field. * @key_length: The length of the key string. * @regex: The regex to append to the bson. * @regex_length: The length of the regex string. * @options: Options for @regex. * * Appends a new field to @bson of type BSON_TYPE_REGEX. @regex should * be the regex string. @options should contain the options for the regex. * * Valid options for @options are: * * 'i' for case-insensitive. * 'm' for multiple matching. * 'x' for verbose mode. * 'l' to make \w and \W locale dependent. * 's' for dotall mode ('.' matches everything) * 'u' to make \w and \W match unicode. * * For more detailed information about BSON regex elements, see bsonspec.org. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_regex_w_len (bson_t *bson, const char *key, int key_length, const char *regex, int regex_length, const char *options); BSON_EXPORT (bool) bson_array_builder_append_regex_w_len (bson_array_builder_t *bab, const char *regex, int regex_length, const char *options); /** * bson_append_utf8: * @bson: A bson_t. * @key: The key for the field. * @value: A UTF-8 encoded string. * @length: The length of @value or -1 if it is NUL terminated. * * Appends a new field to @bson using @key as the key and @value as the UTF-8 * encoded value. * * It is the callers responsibility to ensure @value is valid UTF-8. You can * use bson_utf8_validate() to perform this check. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_utf8 (bson_t *bson, const char *key, int key_length, const char *value, int length); #define BSON_APPEND_UTF8(b, key, val) \ bson_append_utf8 (b, key, (int) strlen (key), val, (int) strlen (val)) BSON_EXPORT (bool) bson_array_builder_append_utf8 (bson_array_builder_t *bab, const char *value, int length); /** * bson_append_symbol: * @bson: A bson_t. * @key: The key for the field. * @value: The symbol as a string. * @length: The length of @value or -1 if NUL-terminated. * * Appends a new field to @bson of type BSON_TYPE_SYMBOL. This BSON type is * deprecated and should not be used in new code. * * See http://bsonspec.org for more information on this type. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_symbol (bson_t *bson, const char *key, int key_length, const char *value, int length); #define BSON_APPEND_SYMBOL(b, key, val) \ bson_append_symbol (b, key, (int) strlen (key), val, (int) strlen (val)) BSON_EXPORT (bool) bson_array_builder_append_symbol (bson_array_builder_t *bab, const char *value, int length); /** * bson_append_time_t: * @bson: A bson_t. * @key: The key for the field. * @value: A time_t. * * Appends a BSON_TYPE_DATE_TIME field to @bson using the time_t @value for the * number of seconds since UNIX epoch in UTC. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_time_t (bson_t *bson, const char *key, int key_length, time_t value); #define BSON_APPEND_TIME_T(b, key, val) \ bson_append_time_t (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_time_t (bson_array_builder_t *bab, time_t value); /** * bson_append_timeval: * @bson: A bson_t. * @key: The key for the field. * @value: A struct timeval containing the date and time. * * Appends a BSON_TYPE_DATE_TIME field to @bson using the struct timeval * provided. The time is persisted in milliseconds since the UNIX epoch in UTC. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_timeval (bson_t *bson, const char *key, int key_length, struct timeval *value); #define BSON_APPEND_TIMEVAL(b, key, val) \ bson_append_timeval (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_timeval (bson_array_builder_t *bab, struct timeval *value); /** * bson_append_date_time: * @bson: A bson_t. * @key: The key for the field. * @key_length: The length of @key in bytes or -1 if \0 terminated. * @value: The number of milliseconds elapsed since UNIX epoch. * * Appends a new field to @bson of type BSON_TYPE_DATE_TIME. * * Returns: true if successful; otherwise false. */ BSON_EXPORT (bool) bson_append_date_time (bson_t *bson, const char *key, int key_length, int64_t value); #define BSON_APPEND_DATE_TIME(b, key, val) \ bson_append_date_time (b, key, (int) strlen (key), val) BSON_EXPORT (bool) bson_array_builder_append_date_time (bson_array_builder_t *bab, int64_t value); /** * bson_append_now_utc: * @bson: A bson_t. * @key: The key for the field. * @key_length: The length of @key or -1 if it is NULL terminated. * * Appends a BSON_TYPE_DATE_TIME field to @bson using the current time in UTC * as the field value. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_now_utc (bson_t *bson, const char *key, int key_length); #define BSON_APPEND_NOW_UTC(b, key) \ bson_append_now_utc (b, key, (int) strlen (key)) BSON_EXPORT (bool) bson_array_builder_append_now_utc (bson_array_builder_t *bab); /** * bson_append_timestamp: * @bson: A bson_t. * @key: The key for the field. * @timestamp: 4 byte timestamp. * @increment: 4 byte increment for timestamp. * * Appends a field of type BSON_TYPE_TIMESTAMP to @bson. This is a special type * used by MongoDB replication and sharding. If you need generic time and date * fields use bson_append_time_t() or bson_append_timeval(). * * Setting @increment and @timestamp to zero has special semantics. See * http://bsonspec.org for more information on this field type. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_timestamp (bson_t *bson, const char *key, int key_length, uint32_t timestamp, uint32_t increment); #define BSON_APPEND_TIMESTAMP(b, key, val, inc) \ bson_append_timestamp (b, key, (int) strlen (key), val, inc) BSON_EXPORT (bool) bson_array_builder_append_timestamp (bson_array_builder_t *bab, uint32_t timestamp, uint32_t increment); /** * bson_append_undefined: * @bson: A bson_t. * @key: The key for the field. * * Appends a field of type BSON_TYPE_UNDEFINED. This type is deprecated in the * spec and should not be used for new code. However, it is provided for those * needing to interact with legacy systems. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT (bool) bson_append_undefined (bson_t *bson, const char *key, int key_length); #define BSON_APPEND_UNDEFINED(b, key) \ bson_append_undefined (b, key, (int) strlen (key)) BSON_EXPORT (bool) bson_array_builder_append_undefined (bson_array_builder_t *bab); BSON_EXPORT (bool) bson_concat (bson_t *dst, const bson_t *src); BSON_EXPORT (bool) bson_append_array_builder_begin (bson_t *bson, const char *key, int key_length, bson_array_builder_t **child); #define BSON_APPEND_ARRAY_BUILDER_BEGIN(b, key, child) \ bson_append_array_builder_begin (b, key, (int) strlen (key), child) BSON_EXPORT (bool) bson_array_builder_append_array_builder_begin (bson_array_builder_t *bab, bson_array_builder_t **child); BSON_EXPORT (bool) bson_append_array_builder_end (bson_t *bson, bson_array_builder_t *child); BSON_EXPORT (bool) bson_array_builder_append_array_builder_end (bson_array_builder_t *bab, bson_array_builder_t *child); BSON_END_DECLS #endif /* BSON_H */ mongo-c-driver-1.26.0/src/libbson/src/bson/forwarding/000077500000000000000000000000001456567454500225665ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/src/bson/forwarding/bson.h000066400000000000000000000012611456567454500237000ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* Including bson.h is superseded. Use bson/bson.h instead. */ #include "bson/bson.h"mongo-c-driver-1.26.0/src/libbson/src/bson/modules/000077500000000000000000000000001456567454500220745ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/src/bson/modules/module.modulemap.in000066400000000000000000000001211456567454500256650ustar00rootroot00000000000000framework module bson [system] { umbrella header "bson.h" export * }mongo-c-driver-1.26.0/src/libbson/src/jsonsl/000077500000000000000000000000001456567454500207735ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/src/jsonsl/LICENSE000066400000000000000000000020721456567454500220010ustar00rootroot00000000000000Copyright (c) 2012-2015 M. Nunberg, mnunberg@haskalah.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mongo-c-driver-1.26.0/src/libbson/src/jsonsl/jsonsl.c000066400000000000000000001520411456567454500224520ustar00rootroot00000000000000/* Copyright (C) 2012-2015 Mark Nunberg. * * See included LICENSE file for license details. */ #include "jsonsl.h" #include "bson/bson-memory.h" #include #include #ifdef JSONSL_USE_METRICS #define XMETRICS \ X(STRINGY_INSIGNIFICANT) \ X(STRINGY_SLOWPATH) \ X(ALLOWED_WHITESPACE) \ X(QUOTE_FASTPATH) \ X(SPECIAL_FASTPATH) \ X(SPECIAL_WSPOP) \ X(SPECIAL_SLOWPATH) \ X(GENERIC) \ X(STRUCTURAL_TOKEN) \ X(SPECIAL_SWITCHFIRST) \ X(STRINGY_CATCH) \ X(NUMBER_FASTPATH) \ X(ESCAPES) \ X(TOTAL) \ struct jsonsl_metrics_st { #define X(m) \ unsigned long metric_##m; XMETRICS #undef X }; static struct jsonsl_metrics_st GlobalMetrics = { 0 }; static unsigned long GenericCounter[0x100] = { 0 }; static unsigned long StringyCatchCounter[0x100] = { 0 }; #define INCR_METRIC(m) \ GlobalMetrics.metric_##m++; #define INCR_GENERIC(c) \ INCR_METRIC(GENERIC); \ GenericCounter[c]++; \ #define INCR_STRINGY_CATCH(c) \ INCR_METRIC(STRINGY_CATCH); \ StringyCatchCounter[c]++; JSONSL_API void jsonsl_dump_global_metrics(void) { int ii; printf("JSONSL Metrics:\n"); #define X(m) \ printf("\t%-30s %20lu (%0.2f%%)\n", #m, GlobalMetrics.metric_##m, \ (float)((float)(GlobalMetrics.metric_##m/(float)GlobalMetrics.metric_TOTAL)) * 100); XMETRICS #undef X printf("Generic Characters:\n"); for (ii = 0; ii < 0xff; ii++) { if (GenericCounter[ii]) { printf("\t[ %c ] %lu\n", ii, GenericCounter[ii]); } } printf("Weird string loop\n"); for (ii = 0; ii < 0xff; ii++) { if (StringyCatchCounter[ii]) { printf("\t[ %c ] %lu\n", ii, StringyCatchCounter[ii]); } } } #else #define INCR_METRIC(m) #define INCR_GENERIC(c) #define INCR_STRINGY_CATCH(c) JSONSL_API void jsonsl_dump_global_metrics(void) { } #endif /* JSONSL_USE_METRICS */ #define CASE_DIGITS \ case '1': \ case '2': \ case '3': \ case '4': \ case '5': \ case '6': \ case '7': \ case '8': \ case '9': \ case '0': static unsigned extract_special(unsigned); static int is_special_end(unsigned); static int is_allowed_whitespace(unsigned); static int is_allowed_escape(unsigned); static int is_simple_char(unsigned); static char get_escape_equiv(unsigned); JSONSL_API jsonsl_t jsonsl_new(int nlevels) { unsigned int ii; struct jsonsl_st * jsn; if (nlevels < 2) { return NULL; } jsn = (struct jsonsl_st *) bson_malloc0(sizeof (*jsn) + ( (nlevels-1) * sizeof (struct jsonsl_state_st) ) ); jsn->levels_max = (unsigned int) nlevels; jsn->max_callback_level = UINT_MAX; jsonsl_reset(jsn); for (ii = 0; ii < jsn->levels_max; ii++) { jsn->stack[ii].level = ii; } return jsn; } JSONSL_API void jsonsl_reset(jsonsl_t jsn) { jsn->tok_last = 0; jsn->can_insert = 1; jsn->pos = 0; jsn->level = 0; jsn->stopfl = 0; jsn->in_escape = 0; jsn->expecting = 0; } JSONSL_API void jsonsl_destroy(jsonsl_t jsn) { if (jsn) { bson_free(jsn); } } #define FASTPARSE_EXHAUSTED 1 #define FASTPARSE_BREAK 0 /* * This function is meant to accelerate string parsing, reducing the main loop's * check if we are indeed a string. * * @param jsn the parser * @param[in,out] bytes_p A pointer to the current buffer (i.e. current position) * @param[in,out] nbytes_p A pointer to the current size of the buffer * @return true if all bytes have been exhausted (and thus the main loop can * return), false if a special character was examined which requires greater * examination. */ static int jsonsl__str_fastparse(jsonsl_t jsn, const jsonsl_uchar_t **bytes_p, size_t *nbytes_p) { const jsonsl_uchar_t *bytes = *bytes_p; const jsonsl_uchar_t *end; for (end = bytes + *nbytes_p; bytes != end; bytes++) { if ( #ifdef JSONSL_USE_WCHAR *bytes >= 0x100 || #endif /* JSONSL_USE_WCHAR */ (is_simple_char(*bytes))) { INCR_METRIC(TOTAL); INCR_METRIC(STRINGY_INSIGNIFICANT); } else { /* Once we're done here, re-calculate the position variables */ jsn->pos += (bytes - *bytes_p); *nbytes_p -= (bytes - *bytes_p); *bytes_p = bytes; return FASTPARSE_BREAK; } } /* Once we're done here, re-calculate the position variables */ jsn->pos += (bytes - *bytes_p); return FASTPARSE_EXHAUSTED; } /* Functions exactly like str_fastparse, except it also accepts a 'state' * argument, since the number's value is updated in the state. */ static int jsonsl__num_fastparse(jsonsl_t jsn, const jsonsl_uchar_t **bytes_p, size_t *nbytes_p, struct jsonsl_state_st *state) { int exhausted = 1; size_t nbytes = *nbytes_p; const jsonsl_uchar_t *bytes = *bytes_p; for (; nbytes; nbytes--, bytes++) { jsonsl_uchar_t c = *bytes; if (isdigit(c)) { INCR_METRIC(TOTAL); INCR_METRIC(NUMBER_FASTPATH); state->nelem = (state->nelem * 10) + (c - 0x30); } else { exhausted = 0; break; } } jsn->pos += (*nbytes_p - nbytes); if (exhausted) { return FASTPARSE_EXHAUSTED; } *nbytes_p = nbytes; *bytes_p = bytes; return FASTPARSE_BREAK; } JSONSL_API void jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) { #define INVOKE_ERROR(eb) \ if (jsn->error_callback(jsn, JSONSL_ERROR_##eb, state, (char*)c)) { \ goto GT_AGAIN; \ } \ return; #define STACK_PUSH \ if (jsn->level >= (levels_max-1)) { \ jsn->error_callback(jsn, JSONSL_ERROR_LEVELS_EXCEEDED, state, (char*)c); \ return; \ } \ state = jsn->stack + (++jsn->level); \ state->ignore_callback = jsn->stack[jsn->level-1].ignore_callback; \ state->pos_begin = jsn->pos; #define STACK_POP_NOPOS \ state->pos_cur = jsn->pos; \ state = jsn->stack + (--jsn->level); #define STACK_POP \ STACK_POP_NOPOS; \ state->pos_cur = jsn->pos; #define CALLBACK_AND_POP_NOPOS(T) \ state->pos_cur = jsn->pos; \ DO_CALLBACK(T, POP); \ state->nescapes = 0; \ state = jsn->stack + (--jsn->level); #define CALLBACK_AND_POP(T) \ CALLBACK_AND_POP_NOPOS(T); \ state->pos_cur = jsn->pos; #define SPECIAL_POP \ CALLBACK_AND_POP(SPECIAL); \ jsn->expecting = 0; \ jsn->tok_last = 0; \ #define CUR_CHAR (*(jsonsl_uchar_t*)c) #define DO_CALLBACK(T, action) \ if (jsn->call_##T && \ jsn->max_callback_level > state->level && \ state->ignore_callback == 0) { \ \ if (jsn->action_callback_##action) { \ jsn->action_callback_##action(jsn, JSONSL_ACTION_##action, state, (jsonsl_char_t*)c); \ } else if (jsn->action_callback) { \ jsn->action_callback(jsn, JSONSL_ACTION_##action, state, (jsonsl_char_t*)c); \ } \ if (jsn->stopfl) { return; } \ } /** * Verifies that we are able to insert the (non-string) item into a hash. */ #define ENSURE_HVAL \ if (state->nelem % 2 == 0 && state->type == JSONSL_T_OBJECT) { \ INVOKE_ERROR(HKEY_EXPECTED); \ } #define VERIFY_SPECIAL(lit, lit_len) \ if ((jsn->pos - state->pos_begin) > lit_len \ || CUR_CHAR != (lit)[jsn->pos - state->pos_begin]) { \ INVOKE_ERROR(SPECIAL_EXPECTED); \ } #define VERIFY_SPECIAL_CI(lit, lit_len) \ if ((jsn->pos - state->pos_begin) > lit_len \ || tolower(CUR_CHAR) != (lit)[jsn->pos - state->pos_begin]) { \ INVOKE_ERROR(SPECIAL_EXPECTED); \ } #define STATE_SPECIAL_LENGTH \ (state)->nescapes #define IS_NORMAL_NUMBER \ ((state)->special_flags == JSONSL_SPECIALf_UNSIGNED || \ (state)->special_flags == JSONSL_SPECIALf_SIGNED) #define STATE_NUM_LAST jsn->tok_last #define CONTINUE_NEXT_CHAR() continue const jsonsl_uchar_t *c = (jsonsl_uchar_t*)bytes; size_t levels_max = jsn->levels_max; struct jsonsl_state_st *state = jsn->stack + jsn->level; jsn->base = bytes; for (; nbytes; nbytes--, jsn->pos++, c++) { unsigned state_type; INCR_METRIC(TOTAL); GT_AGAIN: state_type = state->type; /* Most common type is typically a string: */ if (state_type & JSONSL_Tf_STRINGY) { /* Special escape handling for some stuff */ if (jsn->in_escape) { jsn->in_escape = 0; if (!is_allowed_escape(CUR_CHAR)) { INVOKE_ERROR(ESCAPE_INVALID); } else if (CUR_CHAR == 'u') { DO_CALLBACK(UESCAPE, UESCAPE); if (jsn->return_UESCAPE) { return; } } CONTINUE_NEXT_CHAR(); } if (jsonsl__str_fastparse(jsn, &c, &nbytes) == FASTPARSE_EXHAUSTED) { /* No need to readjust variables as we've exhausted the iterator */ return; } else { if (CUR_CHAR == '"') { goto GT_QUOTE; } else if (CUR_CHAR == '\\') { goto GT_ESCAPE; } else { INVOKE_ERROR(WEIRD_WHITESPACE); } } INCR_METRIC(STRINGY_SLOWPATH); } else if (state_type == JSONSL_T_SPECIAL) { /* Fast track for signed/unsigned */ if (IS_NORMAL_NUMBER) { if (jsonsl__num_fastparse(jsn, &c, &nbytes, state) == FASTPARSE_EXHAUSTED) { return; } else { goto GT_SPECIAL_NUMERIC; } } else if (state->special_flags == JSONSL_SPECIALf_DASH) { #ifdef JSONSL_PARSE_NAN if (CUR_CHAR == 'I' || CUR_CHAR == 'i') { /* parsing -Infinity? */ state->special_flags = JSONSL_SPECIALf_NEG_INF; CONTINUE_NEXT_CHAR(); } #endif if (!isdigit(CUR_CHAR)) { INVOKE_ERROR(INVALID_NUMBER); } if (CUR_CHAR == '0') { state->special_flags = JSONSL_SPECIALf_ZERO|JSONSL_SPECIALf_SIGNED; } else if (isdigit(CUR_CHAR)) { state->special_flags = JSONSL_SPECIALf_SIGNED; state->nelem = CUR_CHAR - 0x30; } else { INVOKE_ERROR(INVALID_NUMBER); } CONTINUE_NEXT_CHAR(); } else if (state->special_flags == JSONSL_SPECIALf_ZERO) { if (isdigit(CUR_CHAR)) { /* Following a zero! */ INVOKE_ERROR(INVALID_NUMBER); } /* Unset the 'zero' flag: */ if (state->special_flags & JSONSL_SPECIALf_SIGNED) { state->special_flags = JSONSL_SPECIALf_SIGNED; } else { state->special_flags = JSONSL_SPECIALf_UNSIGNED; } goto GT_SPECIAL_NUMERIC; } if ((state->special_flags & JSONSL_SPECIALf_NUMERIC) && !(state->special_flags & JSONSL_SPECIALf_INF)) { GT_SPECIAL_NUMERIC: switch (CUR_CHAR) { CASE_DIGITS STATE_NUM_LAST = '1'; CONTINUE_NEXT_CHAR(); case '.': if (state->special_flags & JSONSL_SPECIALf_FLOAT) { INVOKE_ERROR(INVALID_NUMBER); } state->special_flags |= JSONSL_SPECIALf_FLOAT; STATE_NUM_LAST = '.'; CONTINUE_NEXT_CHAR(); case 'e': case 'E': if (state->special_flags & JSONSL_SPECIALf_EXPONENT) { INVOKE_ERROR(INVALID_NUMBER); } state->special_flags |= JSONSL_SPECIALf_EXPONENT; STATE_NUM_LAST = 'e'; CONTINUE_NEXT_CHAR(); case '-': case '+': if (STATE_NUM_LAST != 'e') { INVOKE_ERROR(INVALID_NUMBER); } STATE_NUM_LAST = '-'; CONTINUE_NEXT_CHAR(); default: if (is_special_end(CUR_CHAR)) { goto GT_SPECIAL_POP; } INVOKE_ERROR(INVALID_NUMBER); break; } } /* else if (!NUMERIC) */ if (!is_special_end(CUR_CHAR)) { STATE_SPECIAL_LENGTH++; /* Verify TRUE, FALSE, NULL */ if (state->special_flags == JSONSL_SPECIALf_TRUE) { VERIFY_SPECIAL("true", 4 /* strlen("true") */); } else if (state->special_flags == JSONSL_SPECIALf_FALSE) { VERIFY_SPECIAL("false", 5 /* strlen("false") */); } else if (state->special_flags == JSONSL_SPECIALf_NULL) { VERIFY_SPECIAL("null", 4 /* strlen("null") */); #ifdef JSONSL_PARSE_NAN } else if (state->special_flags == JSONSL_SPECIALf_POS_INF) { VERIFY_SPECIAL_CI("infinity", 8 /* strlen("infinity") */); } else if (state->special_flags == JSONSL_SPECIALf_NEG_INF) { VERIFY_SPECIAL_CI("-infinity", 9 /* strlen("-infinity") */); } else if (state->special_flags == JSONSL_SPECIALf_NAN) { VERIFY_SPECIAL_CI("nan", 3 /* strlen("nan") */); } else if (state->special_flags & JSONSL_SPECIALf_NULL || state->special_flags & JSONSL_SPECIALf_NAN) { /* previous char was "n", are we parsing null or nan? */ const bool not_u = CUR_CHAR != 'u'; const bool not_a = tolower (CUR_CHAR) != 'a'; if (not_u) { state->special_flags &= ~JSONSL_SPECIALf_NULL; } if (not_a) { state->special_flags &= ~JSONSL_SPECIALf_NAN; } if (not_u && not_a) { /* This verify will always fail, as we have an 'n' * followed by a character that is neither 'a' nor 'u' * (and hence cannot be "null"). The purpose of this * VERIFY_SPECIAL is to generate an error in tokenization * that stops if a bare 'n' cannot possibly be a "nan" or * a "null". */ VERIFY_SPECIAL ("null", 4); } #endif } INCR_METRIC(SPECIAL_FASTPATH); CONTINUE_NEXT_CHAR(); } GT_SPECIAL_POP: jsn->can_insert = 0; if (IS_NORMAL_NUMBER) { /* Nothing */ } else if (state->special_flags == JSONSL_SPECIALf_ZERO || state->special_flags == (JSONSL_SPECIALf_ZERO|JSONSL_SPECIALf_SIGNED)) { /* 0 is unsigned! */ state->special_flags = JSONSL_SPECIALf_UNSIGNED; } else if (state->special_flags == JSONSL_SPECIALf_DASH) { /* Still in dash! */ INVOKE_ERROR(INVALID_NUMBER); } else if (state->special_flags & JSONSL_SPECIALf_INF) { if (STATE_SPECIAL_LENGTH != 8) { INVOKE_ERROR(SPECIAL_INCOMPLETE); } state->nelem = 1; } else if (state->special_flags & JSONSL_SPECIALf_NUMERIC) { /* Check that we're not at the end of a token */ if (STATE_NUM_LAST != '1') { INVOKE_ERROR(INVALID_NUMBER); } } else if (state->special_flags == JSONSL_SPECIALf_TRUE) { if (STATE_SPECIAL_LENGTH != 4) { INVOKE_ERROR(SPECIAL_INCOMPLETE); } state->nelem = 1; } else if (state->special_flags == JSONSL_SPECIALf_FALSE) { if (STATE_SPECIAL_LENGTH != 5) { INVOKE_ERROR(SPECIAL_INCOMPLETE); } } else if (state->special_flags == JSONSL_SPECIALf_NULL) { if (STATE_SPECIAL_LENGTH != 4) { INVOKE_ERROR(SPECIAL_INCOMPLETE); } } SPECIAL_POP; jsn->expecting = ','; if (is_allowed_whitespace(CUR_CHAR)) { CONTINUE_NEXT_CHAR(); } /** * This works because we have a non-whitespace token * which is not a special token. If this is a structural * character then it will be gracefully handled by the * switch statement. Otherwise it will default to the 'special' * state again, */ goto GT_STRUCTURAL_TOKEN; } else if (is_allowed_whitespace(CUR_CHAR)) { INCR_METRIC(ALLOWED_WHITESPACE); /* So we're not special. Harmless insignificant whitespace * passthrough */ CONTINUE_NEXT_CHAR(); } else if (extract_special(CUR_CHAR)) { /* not a string, whitespace, or structural token. must be special */ goto GT_SPECIAL_BEGIN; } INCR_GENERIC(CUR_CHAR); if (CUR_CHAR == '"') { GT_QUOTE: jsn->can_insert = 0; switch (state_type) { /* the end of a string or hash key */ case JSONSL_T_STRING: CALLBACK_AND_POP(STRING); CONTINUE_NEXT_CHAR(); case JSONSL_T_HKEY: CALLBACK_AND_POP(HKEY); CONTINUE_NEXT_CHAR(); case JSONSL_T_OBJECT: state->nelem++; if ( (state->nelem-1) % 2 ) { /* Odd, this must be a hash value */ if (jsn->tok_last != ':') { INVOKE_ERROR(MISSING_TOKEN); } jsn->expecting = ','; /* Can't figure out what to expect next */ jsn->tok_last = 0; STACK_PUSH; state->type = JSONSL_T_STRING; DO_CALLBACK(STRING, PUSH); } else { /* hash key */ if (jsn->expecting != '"') { INVOKE_ERROR(STRAY_TOKEN); } jsn->tok_last = 0; jsn->expecting = ':'; STACK_PUSH; state->type = JSONSL_T_HKEY; DO_CALLBACK(HKEY, PUSH); } CONTINUE_NEXT_CHAR(); case JSONSL_T_LIST: state->nelem++; STACK_PUSH; state->type = JSONSL_T_STRING; jsn->expecting = ','; jsn->tok_last = 0; DO_CALLBACK(STRING, PUSH); CONTINUE_NEXT_CHAR(); case JSONSL_T_SPECIAL: INVOKE_ERROR(STRAY_TOKEN); break; default: INVOKE_ERROR(STRING_OUTSIDE_CONTAINER); break; } /* switch(state->type) */ } else if (CUR_CHAR == '\\') { GT_ESCAPE: INCR_METRIC(ESCAPES); /* Escape */ if ( (state->type & JSONSL_Tf_STRINGY) == 0 ) { INVOKE_ERROR(ESCAPE_OUTSIDE_STRING); } state->nescapes++; jsn->in_escape = 1; CONTINUE_NEXT_CHAR(); } /* " or \ */ GT_STRUCTURAL_TOKEN: switch (CUR_CHAR) { case ':': INCR_METRIC(STRUCTURAL_TOKEN); if (jsn->expecting != CUR_CHAR) { INVOKE_ERROR(STRAY_TOKEN); } jsn->tok_last = ':'; jsn->can_insert = 1; jsn->expecting = '"'; CONTINUE_NEXT_CHAR(); case ',': INCR_METRIC(STRUCTURAL_TOKEN); /** * The comma is one of the more generic tokens. * In the context of an OBJECT, the can_insert flag * should never be set, and no other action is * necessary. */ if (jsn->expecting != CUR_CHAR) { /* make this branch execute only when we haven't manually * just placed the ',' in the expecting register. */ INVOKE_ERROR(STRAY_TOKEN); } if (state->type == JSONSL_T_OBJECT) { /* end of hash value, expect a string as a hash key */ jsn->expecting = '"'; } else { jsn->can_insert = 1; } jsn->tok_last = ','; jsn->expecting = '"'; CONTINUE_NEXT_CHAR(); /* new list or object */ /* hashes are more common */ case '{': case '[': INCR_METRIC(STRUCTURAL_TOKEN); if (!jsn->can_insert) { INVOKE_ERROR(CANT_INSERT); } ENSURE_HVAL; state->nelem++; STACK_PUSH; /* because the constants match the opening delimiters, we can do this: */ state->type = CUR_CHAR; state->nelem = 0; jsn->can_insert = 1; if (CUR_CHAR == '{') { /* If we're a hash, we expect a key first, which is quouted */ jsn->expecting = '"'; } if (CUR_CHAR == JSONSL_T_OBJECT) { DO_CALLBACK(OBJECT, PUSH); } else { DO_CALLBACK(LIST, PUSH); } jsn->tok_last = 0; CONTINUE_NEXT_CHAR(); /* closing of list or object */ case '}': case ']': INCR_METRIC(STRUCTURAL_TOKEN); if (jsn->tok_last == ',' && jsn->options.allow_trailing_comma == 0) { INVOKE_ERROR(TRAILING_COMMA); } jsn->can_insert = 0; jsn->level--; jsn->expecting = ','; jsn->tok_last = 0; if (CUR_CHAR == ']') { if (state->type != '[') { INVOKE_ERROR(BRACKET_MISMATCH); } DO_CALLBACK(LIST, POP); } else { if (state->type != '{') { INVOKE_ERROR(BRACKET_MISMATCH); } else if (state->nelem && state->nelem % 2 != 0) { INVOKE_ERROR(VALUE_EXPECTED); } DO_CALLBACK(OBJECT, POP); } state = jsn->stack + jsn->level; state->pos_cur = jsn->pos; CONTINUE_NEXT_CHAR(); default: GT_SPECIAL_BEGIN: /** * Not a string, not a structural token, and not benign whitespace. * Technically we should iterate over the character always, but since * we are not doing full numerical/value decoding anyway (but only hinting), * we only check upon entry. */ if (state->type != JSONSL_T_SPECIAL) { int special_flags = extract_special(CUR_CHAR); if (!special_flags) { /** * Try to do some heuristics here anyway to figure out what kind of * error this is. The 'special' case is a fallback scenario anyway. */ if (CUR_CHAR == '\0') { INVOKE_ERROR(FOUND_NULL_BYTE); } else if (CUR_CHAR < 0x20) { INVOKE_ERROR(WEIRD_WHITESPACE); } else { INVOKE_ERROR(SPECIAL_EXPECTED); } } ENSURE_HVAL; state->nelem++; if (!jsn->can_insert) { INVOKE_ERROR(CANT_INSERT); } STACK_PUSH; state->type = JSONSL_T_SPECIAL; state->special_flags = special_flags; STATE_SPECIAL_LENGTH = 1; if (special_flags == JSONSL_SPECIALf_UNSIGNED) { state->nelem = CUR_CHAR - 0x30; STATE_NUM_LAST = '1'; } else { STATE_NUM_LAST = '-'; state->nelem = 0; } DO_CALLBACK(SPECIAL, PUSH); } CONTINUE_NEXT_CHAR(); } } } JSONSL_API const char* jsonsl_strerror(jsonsl_error_t err) { if (err == JSONSL_ERROR_SUCCESS) { return "SUCCESS"; } #define X(t) \ if (err == JSONSL_ERROR_##t) \ return #t; JSONSL_XERR; #undef X return ""; } JSONSL_API const char *jsonsl_strtype(jsonsl_type_t type) { #define X(o,c) \ if (type == JSONSL_T_##o) \ return #o; JSONSL_XTYPE #undef X return "UNKNOWN TYPE"; } /* * * JPR/JSONPointer functions * * */ #ifndef JSONSL_NO_JPR static jsonsl_jpr_type_t populate_component(char *in, struct jsonsl_jpr_component_st *component, char **next, jsonsl_error_t *errp) { unsigned long pctval; char *c = NULL, *outp = NULL, *end = NULL; size_t input_len; jsonsl_jpr_type_t ret = JSONSL_PATH_NONE; if (*next == NULL || *(*next) == '\0') { return JSONSL_PATH_NONE; } /* Replace the next / with a NULL */ *next = strstr(in, "/"); if (*next != NULL) { *(*next) = '\0'; /* drop the forward slash */ input_len = *next - in; end = *next; *next += 1; /* next character after the '/' */ } else { input_len = strlen(in); end = in + input_len + 1; } component->pstr = in; /* Check for special components of interest */ if (*in == JSONSL_PATH_WILDCARD_CHAR && input_len == 1) { /* Lone wildcard */ ret = JSONSL_PATH_WILDCARD; goto GT_RET; } else if (isdigit(*in)) { /* ASCII Numeric */ char *endptr; component->idx = strtoul(in, &endptr, 10); if (endptr && *endptr == '\0') { ret = JSONSL_PATH_NUMERIC; goto GT_RET; } } /* Default, it's a string */ ret = JSONSL_PATH_STRING; for (c = outp = in; c < end; c++, outp++) { char origc; if (*c != '%') { goto GT_ASSIGN; } /* * c = { [+0] = '%', [+1] = 'b', [+2] = 'e', [+3] = '\0' } */ /* Need %XX */ if (c+2 >= end) { *errp = JSONSL_ERROR_PERCENT_BADHEX; return JSONSL_PATH_INVALID; } if (! (isxdigit(*(c+1)) && isxdigit(*(c+2))) ) { *errp = JSONSL_ERROR_PERCENT_BADHEX; return JSONSL_PATH_INVALID; } /* Temporarily null-terminate the characters */ origc = *(c+3); *(c+3) = '\0'; pctval = strtoul(c+1, NULL, 16); *(c+3) = origc; *outp = (char) pctval; c += 2; continue; GT_ASSIGN: *outp = *c; } /* Null-terminate the string */ for (; outp < c; outp++) { *outp = '\0'; } GT_RET: component->ptype = ret; if (ret != JSONSL_PATH_WILDCARD) { component->len = strlen(component->pstr); } return ret; } JSONSL_API jsonsl_jpr_t jsonsl_jpr_new(const char *path, jsonsl_error_t *errp) { char *my_copy = NULL; int count, curidx; struct jsonsl_jpr_st *ret = NULL; struct jsonsl_jpr_component_st *components = NULL; size_t origlen; jsonsl_error_t errstacked; #define JPR_BAIL(err) *errp = err; goto GT_ERROR; if (errp == NULL) { errp = &errstacked; } if (path == NULL || *path != '/') { JPR_BAIL(JSONSL_ERROR_JPR_NOROOT); } count = 1; path++; { const char *c = path; for (; *c; c++) { if (*c == '/') { count++; if (*(c+1) == '/') { JPR_BAIL(JSONSL_ERROR_JPR_DUPSLASH); } } } } if(*path) { count++; } components = (struct jsonsl_jpr_component_st *) malloc(sizeof(*components) * count); if (!components) { JPR_BAIL(JSONSL_ERROR_ENOMEM); } my_copy = (char *)malloc(strlen(path) + 1); if (!my_copy) { JPR_BAIL(JSONSL_ERROR_ENOMEM); } strcpy(my_copy, path); components[0].ptype = JSONSL_PATH_ROOT; if (*my_copy) { char *cur = my_copy; int pathret = JSONSL_PATH_STRING; curidx = 1; while (curidx < count) { pathret = populate_component(cur, components + curidx, &cur, errp); if (pathret > 0) { curidx++; } else { break; } } if (pathret == JSONSL_PATH_INVALID) { JPR_BAIL(JSONSL_ERROR_JPR_BADPATH); } } else { curidx = 1; } path--; /*revert path to leading '/' */ origlen = strlen(path) + 1; ret = (struct jsonsl_jpr_st *)malloc(sizeof(*ret)); if (!ret) { JPR_BAIL(JSONSL_ERROR_ENOMEM); } ret->orig = (char *)malloc(origlen); if (!ret->orig) { JPR_BAIL(JSONSL_ERROR_ENOMEM); } ret->components = components; ret->ncomponents = curidx; ret->basestr = my_copy; ret->norig = origlen-1; strcpy(ret->orig, path); return ret; GT_ERROR: free(my_copy); free(components); if (ret) { free(ret->orig); } free(ret); return NULL; #undef JPR_BAIL } void jsonsl_jpr_destroy(jsonsl_jpr_t jpr) { free(jpr->components); free(jpr->basestr); free(jpr->orig); free(jpr); } /** * Call when there is a possibility of a match, either as a final match or * as a path within a match * @param jpr The JPR path * @param component Component corresponding to the current element * @param prlevel The level of the *parent* * @param chtype The type of the child * @return Match status */ static jsonsl_jpr_match_t jsonsl__match_continue(jsonsl_jpr_t jpr, const struct jsonsl_jpr_component_st *component, unsigned prlevel, unsigned chtype) { const struct jsonsl_jpr_component_st *next_comp = component + 1; if (prlevel == jpr->ncomponents - 1) { /* This is the match. Check the expected type of the match against * the child */ if (jpr->match_type == 0 || jpr->match_type == chtype) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_TYPE_MISMATCH; } } if (chtype == JSONSL_T_LIST) { if (next_comp->ptype == JSONSL_PATH_NUMERIC) { return JSONSL_MATCH_POSSIBLE; } else { return JSONSL_MATCH_TYPE_MISMATCH; } } else if (chtype == JSONSL_T_OBJECT) { if (next_comp->ptype == JSONSL_PATH_NUMERIC) { return JSONSL_MATCH_TYPE_MISMATCH; } else { return JSONSL_MATCH_POSSIBLE; } } else { return JSONSL_MATCH_TYPE_MISMATCH; } } JSONSL_API jsonsl_jpr_match_t jsonsl_path_match(jsonsl_jpr_t jpr, const struct jsonsl_state_st *parent, const struct jsonsl_state_st *child, const char *key, size_t nkey) { const struct jsonsl_jpr_component_st *comp; if (!parent) { /* No parent. Return immediately since it's always a match */ return jsonsl__match_continue(jpr, jpr->components, 0, child->type); } comp = jpr->components + parent->level; /* note that we don't need to verify the type of the match, this is * always done through the previous call to jsonsl__match_continue. * If we are in a POSSIBLE tree then we can be certain the types (at * least at this level) are correct */ if (parent->type == JSONSL_T_OBJECT) { if (comp->len != nkey || strncmp(key, comp->pstr, nkey) != 0) { return JSONSL_MATCH_NOMATCH; } } else { if (comp->idx != parent->nelem - 1) { return JSONSL_MATCH_NOMATCH; } } return jsonsl__match_continue(jpr, comp, parent->level, child->type); } JSONSL_API jsonsl_jpr_match_t jsonsl_jpr_match(jsonsl_jpr_t jpr, unsigned int parent_type, unsigned int parent_level, const char *key, size_t nkey) { /* find our current component. This is the child level */ int cmpret; struct jsonsl_jpr_component_st *p_component; p_component = jpr->components + parent_level; if (parent_level >= jpr->ncomponents) { return JSONSL_MATCH_NOMATCH; } /* Lone query for 'root' element. Always matches */ if (parent_level == 0) { if (jpr->ncomponents == 1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } /* Wildcard, always matches */ if (p_component->ptype == JSONSL_PATH_WILDCARD) { if (parent_level == jpr->ncomponents-1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } /* Check numeric array index. This gets its special block so we can avoid * string comparisons */ if (p_component->ptype == JSONSL_PATH_NUMERIC) { if (parent_type == JSONSL_T_LIST) { if (p_component->idx != nkey) { /* Wrong index */ return JSONSL_MATCH_NOMATCH; } else { if (parent_level == jpr->ncomponents-1) { /* This is the last element of the path */ return JSONSL_MATCH_COMPLETE; } else { /* Intermediate element */ return JSONSL_MATCH_POSSIBLE; } } } else if (p_component->is_arridx) { /* Numeric and an array index (set explicitly by user). But not * a list for a parent */ return JSONSL_MATCH_TYPE_MISMATCH; } } else if (parent_type == JSONSL_T_LIST) { return JSONSL_MATCH_TYPE_MISMATCH; } /* Check lengths */ if (p_component->len != nkey) { return JSONSL_MATCH_NOMATCH; } /* Check string comparison */ cmpret = strncmp(p_component->pstr, key, nkey); if (cmpret == 0) { if (parent_level == jpr->ncomponents-1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } return JSONSL_MATCH_NOMATCH; } JSONSL_API void jsonsl_jpr_match_state_init(jsonsl_t jsn, jsonsl_jpr_t *jprs, size_t njprs) { size_t ii, *firstjmp; if (njprs == 0) { return; } jsn->jprs = (jsonsl_jpr_t *)malloc(sizeof(jsonsl_jpr_t) * njprs); jsn->jpr_count = njprs; jsn->jpr_root = (size_t*)calloc(1, sizeof(size_t) * njprs * jsn->levels_max); memcpy(jsn->jprs, jprs, sizeof(jsonsl_jpr_t) * njprs); /* Set the initial jump table values */ firstjmp = jsn->jpr_root; for (ii = 0; ii < njprs; ii++) { firstjmp[ii] = ii+1; } } JSONSL_API void jsonsl_jpr_match_state_cleanup(jsonsl_t jsn) { if (jsn->jpr_count == 0) { return; } free(jsn->jpr_root); free(jsn->jprs); jsn->jprs = NULL; jsn->jpr_root = NULL; jsn->jpr_count = 0; } /** * This function should be called exactly once on each element... * This should also be called in recursive order, since we rely * on the parent having been initialized for a match. * * Since the parent is checked for a match as well, we maintain a 'serial' counter. * Whenever we traverse an element, we expect the serial to be the same as a global * integer. If they do not match, we re-initialize the context, and set the serial. * * This ensures a type of consistency without having a proactive reset by the * main lexer itself. * */ JSONSL_API jsonsl_jpr_t jsonsl_jpr_match_state(jsonsl_t jsn, struct jsonsl_state_st *state, const char *key, size_t nkey, jsonsl_jpr_match_t *out) { struct jsonsl_state_st *parent_state; jsonsl_jpr_t ret = NULL; /* Jump and JPR tables for our own state and the parent state */ size_t *jmptable, *pjmptable; size_t jmp_cur, ii, ourjmpidx; if (!jsn->jpr_root) { *out = JSONSL_MATCH_NOMATCH; return NULL; } pjmptable = jsn->jpr_root + (jsn->jpr_count * (state->level-1)); jmptable = pjmptable + jsn->jpr_count; /* If the parent cannot match, then invalidate it */ if (*pjmptable == 0) { *jmptable = 0; *out = JSONSL_MATCH_NOMATCH; return NULL; } parent_state = jsn->stack + state->level - 1; if (parent_state->type == JSONSL_T_LIST) { nkey = (size_t) parent_state->nelem; } *jmptable = 0; ourjmpidx = 0; memset(jmptable, 0, sizeof(int) * jsn->jpr_count); for (ii = 0; ii < jsn->jpr_count; ii++) { jmp_cur = pjmptable[ii]; if (jmp_cur) { jsonsl_jpr_t jpr = jsn->jprs[jmp_cur-1]; *out = jsonsl_jpr_match(jpr, parent_state->type, parent_state->level, key, nkey); if (*out == JSONSL_MATCH_COMPLETE) { ret = jpr; *jmptable = 0; return ret; } else if (*out == JSONSL_MATCH_POSSIBLE) { jmptable[ourjmpidx] = ii+1; ourjmpidx++; } } else { break; } } if (!*jmptable) { *out = JSONSL_MATCH_NOMATCH; } return NULL; } JSONSL_API const char *jsonsl_strmatchtype(jsonsl_jpr_match_t match) { #define X(T,v) \ if ( match == JSONSL_MATCH_##T ) \ return #T; JSONSL_XMATCH #undef X return ""; } #endif /* JSONSL_WITH_JPR */ static char * jsonsl__writeutf8(uint32_t pt, char *out) { #define ADD_OUTPUT(c) *out = (char)(c); out++; if (pt < 0x80) { ADD_OUTPUT(pt); } else if (pt < 0x800) { ADD_OUTPUT((pt >> 6) | 0xC0); ADD_OUTPUT((pt & 0x3F) | 0x80); } else if (pt < 0x10000) { ADD_OUTPUT((pt >> 12) | 0xE0); ADD_OUTPUT(((pt >> 6) & 0x3F) | 0x80); ADD_OUTPUT((pt & 0x3F) | 0x80); } else { ADD_OUTPUT((pt >> 18) | 0xF0); ADD_OUTPUT(((pt >> 12) & 0x3F) | 0x80); ADD_OUTPUT(((pt >> 6) & 0x3F) | 0x80); ADD_OUTPUT((pt & 0x3F) | 0x80); } return out; #undef ADD_OUTPUT } /* Thanks snej (https://github.com/mnunberg/jsonsl/issues/9) */ static int jsonsl__digit2int(char ch) { int d = ch - '0'; if ((unsigned) d < 10) { return d; } d = ch - 'a'; if ((unsigned) d < 6) { return d + 10; } d = ch - 'A'; if ((unsigned) d < 6) { return d + 10; } return -1; } /* Assume 's' is at least 4 bytes long */ static int jsonsl__get_uescape_16(const char *s) { int ret = 0; int cur; #define GET_DIGIT(off) \ cur = jsonsl__digit2int(s[off]); \ if (cur == -1) { return -1; } \ ret |= (cur << (12 - (off * 4))); GET_DIGIT(0); GET_DIGIT(1); GET_DIGIT(2); GET_DIGIT(3); #undef GET_DIGIT return ret; } /** * Utility function to convert escape sequences */ JSONSL_API size_t jsonsl_util_unescape_ex(const char *in, char *out, size_t len, const int toEscape[128], unsigned *oflags, jsonsl_error_t *err, const char **errat) { const unsigned char *c = (const unsigned char*)in; char *begin_p = out; unsigned oflags_s; uint16_t last_codepoint = 0; if (!oflags) { oflags = &oflags_s; } *oflags = 0; #define UNESCAPE_BAIL(e,offset) \ *err = JSONSL_ERROR_##e; \ if (errat) { \ *errat = (const char*)(c+ (ptrdiff_t)(offset)); \ } \ return 0; for (; len; len--, c++, out++) { int uescval; if (*c != '\\') { /* Not an escape, so we don't care about this */ goto GT_ASSIGN; } if (len < 2) { UNESCAPE_BAIL(ESCAPE_INVALID, 0); } if (!is_allowed_escape(c[1])) { UNESCAPE_BAIL(ESCAPE_INVALID, 1) } if ((toEscape && toEscape[(unsigned char)c[1] & 0x7f] == 0 && c[1] != '\\' && c[1] != '"')) { /* if we don't want to unescape this string, write the escape sequence to the output */ *out++ = *c++; --len; goto GT_ASSIGN; } if (c[1] != 'u') { /* simple skip-and-replace using pre-defined maps. * TODO: should the maps actually reflect the desired * replacement character in toEscape? */ char esctmp = get_escape_equiv(c[1]); if (esctmp) { /* Check if there is a corresponding replacement */ *out = esctmp; } else { /* Just gobble up the 'reverse-solidus' */ *out = c[1]; } len--; c++; /* do not assign, just continue */ continue; } /* next == 'u' */ if (len < 6) { /* Need at least six characters.. */ UNESCAPE_BAIL(UESCAPE_TOOSHORT, 2); } uescval = jsonsl__get_uescape_16((const char *)c + 2); if (uescval == -1) { UNESCAPE_BAIL(PERCENT_BADHEX, -1); } if (last_codepoint) { uint16_t w1 = last_codepoint, w2 = (uint16_t)uescval; uint32_t cp; if (uescval < 0xDC00 || uescval > 0xDFFF) { UNESCAPE_BAIL(INVALID_CODEPOINT, -1); } cp = (w1 & 0x3FF) << 10; cp |= (w2 & 0x3FF); cp += 0x10000; out = jsonsl__writeutf8(cp, out) - 1; last_codepoint = 0; } else if (uescval < 0xD800 || uescval > 0xDFFF) { *oflags |= JSONSL_SPECIALf_NONASCII; out = jsonsl__writeutf8(uescval, out) - 1; } else if (uescval < 0xDC00) { *oflags |= JSONSL_SPECIALf_NONASCII; last_codepoint = (uint16_t)uescval; out--; } else { UNESCAPE_BAIL(INVALID_CODEPOINT, 2); } /* Post uescape cleanup */ len -= 5; /* Gobble up 5 chars after 'u' */ c += 5; continue; /* Only reached by previous branches */ GT_ASSIGN: *out = *c; } if (last_codepoint) { *err = JSONSL_ERROR_INVALID_CODEPOINT; return 0; } *err = JSONSL_ERROR_SUCCESS; return out - begin_p; } /** * Character Table definitions. * These were all generated via srcutil/genchartables.pl */ /** * This table contains the beginnings of non-string * allowable (bareword) values. */ static unsigned short Special_Table[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x2c */ /* 0x2d */ JSONSL_SPECIALf_DASH /* <-> */, /* 0x2d */ /* 0x2e */ 0,0, /* 0x2f */ /* 0x30 */ JSONSL_SPECIALf_ZERO /* <0> */, /* 0x30 */ /* 0x31 */ JSONSL_SPECIALf_UNSIGNED /* <1> */, /* 0x31 */ /* 0x32 */ JSONSL_SPECIALf_UNSIGNED /* <2> */, /* 0x32 */ /* 0x33 */ JSONSL_SPECIALf_UNSIGNED /* <3> */, /* 0x33 */ /* 0x34 */ JSONSL_SPECIALf_UNSIGNED /* <4> */, /* 0x34 */ /* 0x35 */ JSONSL_SPECIALf_UNSIGNED /* <5> */, /* 0x35 */ /* 0x36 */ JSONSL_SPECIALf_UNSIGNED /* <6> */, /* 0x36 */ /* 0x37 */ JSONSL_SPECIALf_UNSIGNED /* <7> */, /* 0x37 */ /* 0x38 */ JSONSL_SPECIALf_UNSIGNED /* <8> */, /* 0x38 */ /* 0x39 */ JSONSL_SPECIALf_UNSIGNED /* <9> */, /* 0x39 */ /* 0x3a */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x48 */ /* 0x49 */ JSONSL__INF_PROXY /* */, /* 0x49 */ /* 0x4a */ 0,0,0,0, /* 0x4d */ /* 0x4e */ JSONSL__NAN_PROXY /* */, /* 0x4e */ /* 0x4f */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x65 */ /* 0x66 */ JSONSL_SPECIALf_FALSE /* */, /* 0x66 */ /* 0x67 */ 0,0, /* 0x68 */ /* 0x69 */ JSONSL__INF_PROXY /* */, /* 0x69 */ /* 0x6a */ 0,0,0,0, /* 0x6d */ /* 0x6e */ JSONSL_SPECIALf_NULL|JSONSL__NAN_PROXY /* */, /* 0x6e */ /* 0x6f */ 0,0,0,0,0, /* 0x73 */ /* 0x74 */ JSONSL_SPECIALf_TRUE /* */, /* 0x74 */ /* 0x75 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x94 */ /* 0x95 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xb4 */ /* 0xb5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xd4 */ /* 0xd5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xf4 */ /* 0xf5 */ 0,0,0,0,0,0,0,0,0,0, /* 0xfe */ }; /** * Contains characters which signal the termination of any of the 'special' bareword * values. */ static int Special_Endings[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0, /* 0x08 */ /* 0x09 */ 1 /* */, /* 0x09 */ /* 0x0a */ 1 /* */, /* 0x0a */ /* 0x0b */ 0,0, /* 0x0c */ /* 0x0d */ 1 /* */, /* 0x0d */ /* 0x0e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 1 /* */, /* 0x20 */ /* 0x21 */ 0, /* 0x21 */ /* 0x22 */ 1 /* " */, /* 0x22 */ /* 0x23 */ 0,0,0,0,0,0,0,0,0, /* 0x2b */ /* 0x2c */ 1 /* , */, /* 0x2c */ /* 0x2d */ 0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x39 */ /* 0x3a */ 1 /* : */, /* 0x3a */ /* 0x3b */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5a */ /* 0x5b */ 1 /* [ */, /* 0x5b */ /* 0x5c */ 1 /* \ */, /* 0x5c */ /* 0x5d */ 1 /* ] */, /* 0x5d */ /* 0x5e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x7a */ /* 0x7b */ 1 /* { */, /* 0x7b */ /* 0x7c */ 0, /* 0x7c */ /* 0x7d */ 1 /* } */, /* 0x7d */ /* 0x7e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x9d */ /* 0x9e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xbd */ /* 0xbe */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xdd */ /* 0xde */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xfd */ /* 0xfe */ 0 /* 0xfe */ }; /** * This table contains entries for the allowed whitespace as per RFC 4627 */ static int Allowed_Whitespace[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0, /* 0x08 */ /* 0x09 */ 1 /* */, /* 0x09 */ /* 0x0a */ 1 /* */, /* 0x0a */ /* 0x0b */ 0,0, /* 0x0c */ /* 0x0d */ 1 /* */, /* 0x0d */ /* 0x0e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 1 /* */, /* 0x20 */ /* 0x21 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x40 */ /* 0x41 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x60 */ /* 0x61 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x80 */ /* 0x81 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xa0 */ /* 0xa1 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xc0 */ /* 0xc1 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xe0 */ /* 0xe1 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* 0xfe */ }; static const int String_No_Passthrough[0x100] = { /* 0x00 */ 1 /* */, /* 0x00 */ /* 0x01 */ 1 /* */, /* 0x01 */ /* 0x02 */ 1 /* */, /* 0x02 */ /* 0x03 */ 1 /* */, /* 0x03 */ /* 0x04 */ 1 /* */, /* 0x04 */ /* 0x05 */ 1 /* */, /* 0x05 */ /* 0x06 */ 1 /* */, /* 0x06 */ /* 0x07 */ 1 /* */, /* 0x07 */ /* 0x08 */ 1 /* */, /* 0x08 */ /* 0x09 */ 1 /* */, /* 0x09 */ /* 0x0a */ 1 /* */, /* 0x0a */ /* 0x0b */ 1 /* */, /* 0x0b */ /* 0x0c */ 1 /* */, /* 0x0c */ /* 0x0d */ 1 /* */, /* 0x0d */ /* 0x0e */ 1 /* */, /* 0x0e */ /* 0x0f */ 1 /* */, /* 0x0f */ /* 0x10 */ 1 /* */, /* 0x10 */ /* 0x11 */ 1 /* */, /* 0x11 */ /* 0x12 */ 1 /* */, /* 0x12 */ /* 0x13 */ 1 /* */, /* 0x13 */ /* 0x14 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x21 */ /* 0x22 */ 1 /* <"> */, /* 0x22 */ /* 0x23 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x42 */ /* 0x43 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5b */ /* 0x5c */ 1 /* <\> */, /* 0x5c */ /* 0x5d */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x7c */ /* 0x7d */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x9c */ /* 0x9d */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xbc */ /* 0xbd */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xdc */ /* 0xdd */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xfc */ /* 0xfd */ 0,0, /* 0xfe */ }; /** * Allowable two-character 'common' escapes: */ static int Allowed_Escapes[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 0,0, /* 0x21 */ /* 0x22 */ 1 /* <"> */, /* 0x22 */ /* 0x23 */ 0,0,0,0,0,0,0,0,0,0,0,0, /* 0x2e */ /* 0x2f */ 1 /* */, /* 0x2f */ /* 0x30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4f */ /* 0x50 */ 0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5b */ /* 0x5c */ 1 /* <\> */, /* 0x5c */ /* 0x5d */ 0,0,0,0,0, /* 0x61 */ /* 0x62 */ 1 /* */, /* 0x62 */ /* 0x63 */ 0,0,0, /* 0x65 */ /* 0x66 */ 1 /* */, /* 0x66 */ /* 0x67 */ 0,0,0,0,0,0,0, /* 0x6d */ /* 0x6e */ 1 /* */, /* 0x6e */ /* 0x6f */ 0,0,0, /* 0x71 */ /* 0x72 */ 1 /* */, /* 0x72 */ /* 0x73 */ 0, /* 0x73 */ /* 0x74 */ 1 /* */, /* 0x74 */ /* 0x75 */ 1 /* */, /* 0x75 */ /* 0x76 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x95 */ /* 0x96 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xb5 */ /* 0xb6 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xd5 */ /* 0xd6 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xf5 */ /* 0xf6 */ 0,0,0,0,0,0,0,0,0, /* 0xfe */ }; /** * This table contains the _values_ for a given (single) escaped character. */ static unsigned char Escape_Equivs[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x3f */ /* 0x40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5f */ /* 0x60 */ 0,0, /* 0x61 */ /* 0x62 */ 8 /* */, /* 0x62 */ /* 0x63 */ 0,0,0, /* 0x65 */ /* 0x66 */ 12 /* */, /* 0x66 */ /* 0x67 */ 0,0,0,0,0,0,0, /* 0x6d */ /* 0x6e */ 10 /* */, /* 0x6e */ /* 0x6f */ 0,0,0, /* 0x71 */ /* 0x72 */ 13 /* */, /* 0x72 */ /* 0x73 */ 0, /* 0x73 */ /* 0x74 */ 9 /* */, /* 0x74 */ /* 0x75 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x94 */ /* 0x95 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xb4 */ /* 0xb5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xd4 */ /* 0xd5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xf4 */ /* 0xf5 */ 0,0,0,0,0,0,0,0,0,0 /* 0xfe */ }; /* Definitions of above-declared static functions */ static char get_escape_equiv(unsigned c) { return Escape_Equivs[c & 0xff]; } static unsigned extract_special(unsigned c) { return Special_Table[c & 0xff]; } static int is_special_end(unsigned c) { return Special_Endings[c & 0xff]; } static int is_allowed_whitespace(unsigned c) { return c == ' ' || Allowed_Whitespace[c & 0xff]; } static int is_allowed_escape(unsigned c) { return Allowed_Escapes[c & 0xff]; } static int is_simple_char(unsigned c) { return !String_No_Passthrough[c & 0xff]; } /* Clean up all our macros! */ #undef INCR_METRIC #undef INCR_GENERIC #undef INCR_STRINGY_CATCH #undef CASE_DIGITS #undef INVOKE_ERROR #undef STACK_PUSH #undef STACK_POP_NOPOS #undef STACK_POP #undef CALLBACK_AND_POP_NOPOS #undef CALLBACK_AND_POP #undef SPECIAL_POP #undef CUR_CHAR #undef DO_CALLBACK #undef ENSURE_HVAL #undef VERIFY_SPECIAL #undef STATE_SPECIAL_LENGTH #undef IS_NORMAL_NUMBER #undef STATE_NUM_LAST #undef FASTPARSE_EXHAUSTED #undef FASTPARSE_BREAK mongo-c-driver-1.26.0/src/libbson/src/jsonsl/jsonsl.h000066400000000000000000000744511456567454500224670ustar00rootroot00000000000000/** * JSON Simple/Stacked/Stateful Lexer. * - Does not buffer data * - Maintains state * - Callback oriented * - Lightweight and fast. One source file and one header file * * Copyright (C) 2012-2015 Mark Nunberg * See included LICENSE file for license details. */ #include "../bson/bson-prelude.h" #ifndef JSONSL_H_ #define JSONSL_H_ #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifdef JSONSL_USE_WCHAR typedef jsonsl_char_t wchar_t; typedef jsonsl_uchar_t unsigned wchar_t; #else typedef char jsonsl_char_t; typedef unsigned char jsonsl_uchar_t; #endif /* JSONSL_USE_WCHAR */ #ifdef JSONSL_PARSE_NAN #define JSONSL__NAN_PROXY JSONSL_SPECIALf_NAN #define JSONSL__INF_PROXY JSONSL_SPECIALf_INF #else #define JSONSL__NAN_PROXY 0 #define JSONSL__INF_PROXY 0 #endif /* Stolen from http-parser.h, and possibly others */ #if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) typedef __int8 int8_t; typedef unsigned __int8 uint8_t; typedef __int16 int16_t; typedef unsigned __int16 uint16_t; typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #if !defined(_MSC_VER) || _MSC_VER<1400 typedef unsigned int size_t; typedef int ssize_t; #endif #else #include #endif #if (!defined(JSONSL_STATE_GENERIC)) && (!defined(JSONSL_STATE_USER_FIELDS)) #define JSONSL_STATE_GENERIC #endif /* !defined JSONSL_STATE_GENERIC */ #ifdef JSONSL_STATE_GENERIC #define JSONSL_STATE_USER_FIELDS #endif /* JSONSL_STATE_GENERIC */ /* Additional fields for component object */ #ifndef JSONSL_JPR_COMPONENT_USER_FIELDS #define JSONSL_JPR_COMPONENT_USER_FIELDS #endif #ifndef JSONSL_API /** * We require a /DJSONSL_DLL so that users already using this as a static * or embedded library don't get confused */ #if defined(_WIN32) && defined(JSONSL_DLL) #define JSONSL_API __declspec(dllexport) #else #define JSONSL_API #endif /* _WIN32 */ #endif /* !JSONSL_API */ #ifndef JSONSL_INLINE #if defined(_MSC_VER) #define JSONSL_INLINE __inline #elif defined(__GNUC__) #define JSONSL_INLINE __inline__ #else #define JSONSL_INLINE inline #endif /* _MSC_VER or __GNUC__ */ #endif /* JSONSL_INLINE */ #define JSONSL_MAX_LEVELS 512 struct jsonsl_st; typedef struct jsonsl_st *jsonsl_t; typedef struct jsonsl_jpr_st* jsonsl_jpr_t; /** * This flag is true when AND'd against a type whose value * must be in "quoutes" i.e. T_HKEY and T_STRING */ #define JSONSL_Tf_STRINGY 0xffff00 /** * Constant representing the special JSON types. * The values are special and aid in speed (the OBJECT and LIST * values are the char literals of their openings). * * Their actual value is a character which attempts to resemble * some mnemonic reference to the actual type. * * If new types are added, they must fit into the ASCII printable * range (so they should be AND'd with 0x7f and yield something * meaningful) */ #define JSONSL_XTYPE \ X(STRING, '"'|JSONSL_Tf_STRINGY) \ X(HKEY, '#'|JSONSL_Tf_STRINGY) \ X(OBJECT, '{') \ X(LIST, '[') \ X(SPECIAL, '^') \ X(UESCAPE, 'u') typedef enum { #define X(o, c) \ JSONSL_T_##o = c, JSONSL_XTYPE JSONSL_T_UNKNOWN = '?', /* Abstract 'root' object */ JSONSL_T_ROOT = 0 #undef X } jsonsl_type_t; /** * Subtypes for T_SPECIAL. We define them as flags * because more than one type can be applied to a * given object. */ #define JSONSL_XSPECIAL \ X(NONE, 0) \ X(SIGNED, 1<<0) \ X(UNSIGNED, 1<<1) \ X(TRUE, 1<<2) \ X(FALSE, 1<<3) \ X(NULL, 1<<4) \ X(FLOAT, 1<<5) \ X(EXPONENT, 1<<6) \ X(NONASCII, 1<<7) \ X(NAN, 1<<8) \ X(INF, 1<<9) typedef enum { #define X(o,b) \ JSONSL_SPECIALf_##o = b, JSONSL_XSPECIAL #undef X /* Handy flags for checking */ JSONSL_SPECIALf_UNKNOWN = 1 << 10, /** @private Private */ JSONSL_SPECIALf_ZERO = 1 << 11 | JSONSL_SPECIALf_UNSIGNED, /** @private */ JSONSL_SPECIALf_DASH = 1 << 12, /** @private */ JSONSL_SPECIALf_POS_INF = (JSONSL_SPECIALf_INF), JSONSL_SPECIALf_NEG_INF = (JSONSL_SPECIALf_INF|JSONSL_SPECIALf_SIGNED), /** Type is numeric */ JSONSL_SPECIALf_NUMERIC = (JSONSL_SPECIALf_SIGNED| JSONSL_SPECIALf_UNSIGNED), /** Type is a boolean */ JSONSL_SPECIALf_BOOLEAN = (JSONSL_SPECIALf_TRUE|JSONSL_SPECIALf_FALSE), /** Type is an "extended", not integral type (but numeric) */ JSONSL_SPECIALf_NUMNOINT = (JSONSL_SPECIALf_FLOAT|JSONSL_SPECIALf_EXPONENT|JSONSL_SPECIALf_NAN |JSONSL_SPECIALf_INF) } jsonsl_special_t; /** * These are the various types of stack (or other) events * which will trigger a callback. * Like the type constants, this are also mnemonic */ #define JSONSL_XACTION \ X(PUSH, '+') \ X(POP, '-') \ X(UESCAPE, 'U') \ X(ERROR, '!') typedef enum { #define X(a,c) \ JSONSL_ACTION_##a = c, JSONSL_XACTION JSONSL_ACTION_UNKNOWN = '?' #undef X } jsonsl_action_t; /** * Various errors which may be thrown while parsing JSON */ #define JSONSL_XERR \ /* Trailing garbage characters */ \ X(GARBAGE_TRAILING) \ /* We were expecting a 'special' (numeric, true, false, null) */ \ X(SPECIAL_EXPECTED) \ /* The 'special' value was incomplete */ \ X(SPECIAL_INCOMPLETE) \ /* Found a stray token */ \ X(STRAY_TOKEN) \ /* We were expecting a token before this one */ \ X(MISSING_TOKEN) \ /* Cannot insert because the container is not ready */ \ X(CANT_INSERT) \ /* Found a '\' outside a string */ \ X(ESCAPE_OUTSIDE_STRING) \ /* Found a ':' outside of a hash */ \ X(KEY_OUTSIDE_OBJECT) \ /* found a string outside of a container */ \ X(STRING_OUTSIDE_CONTAINER) \ /* Found a null byte in middle of string */ \ X(FOUND_NULL_BYTE) \ /* Current level exceeds limit specified in constructor */ \ X(LEVELS_EXCEEDED) \ /* Got a } as a result of an opening [ or vice versa */ \ X(BRACKET_MISMATCH) \ /* We expected a key, but got something else instead */ \ X(HKEY_EXPECTED) \ /* We got an illegal control character (bad whitespace or something) */ \ X(WEIRD_WHITESPACE) \ /* Found a \u-escape, but there were less than 4 following hex digits */ \ X(UESCAPE_TOOSHORT) \ /* Invalid two-character escape */ \ X(ESCAPE_INVALID) \ /* Trailing comma */ \ X(TRAILING_COMMA) \ /* An invalid number was passed in a numeric field */ \ X(INVALID_NUMBER) \ /* Value is missing for object */ \ X(VALUE_EXPECTED) \ /* The following are for JPR Stuff */ \ \ /* Found a literal '%' but it was only followed by a single valid hex digit */ \ X(PERCENT_BADHEX) \ /* jsonpointer URI is malformed '/' */ \ X(JPR_BADPATH) \ /* Duplicate slash */ \ X(JPR_DUPSLASH) \ /* No leading root */ \ X(JPR_NOROOT) \ /* Allocation failure */ \ X(ENOMEM) \ /* Invalid unicode codepoint detected (in case of escapes) */ \ X(INVALID_CODEPOINT) typedef enum { JSONSL_ERROR_SUCCESS = 0, #define X(e) \ JSONSL_ERROR_##e, JSONSL_XERR #undef X JSONSL_ERROR_GENERIC } jsonsl_error_t; /** * A state is a single level of the stack. * Non-private data (i.e. the 'data' field, see the STATE_GENERIC section) * will remain in tact until the item is popped. * * As a result, it means a parent state object may be accessed from a child * object, (the parents fields will all be valid). This allows a user to create * an ad-hoc hierarchy on top of the JSON one. * */ struct jsonsl_state_st { /** * The JSON object type */ unsigned type; /** If this element is special, then its extended type is here */ unsigned special_flags; /** * The position (in terms of number of bytes since the first call to * jsonsl_feed()) at which the state was first pushed. This includes * opening tokens, if applicable. * * @note For strings (i.e. type & JSONSL_Tf_STRINGY is nonzero) this will * be the position of the first quote. * * @see jsonsl_st::pos which contains the _current_ position and can be * used during a POP callback to get the length of the element. */ size_t pos_begin; /**FIXME: This is redundant as the same information can be derived from * jsonsl_st::pos at pop-time */ size_t pos_cur; /** * Level of recursion into nesting. This is mainly a convenience * variable, as this can technically be deduced from the lexer's * level parameter (though the logic is not that simple) */ unsigned int level; /** * how many elements in the object/list. * For objects (hashes), an element is either * a key or a value. Thus for one complete pair, * nelem will be 2. * * For special types, this will hold the sum of the digits. * This only holds true for values which are simple signed/unsigned * numbers. Otherwise a special flag is set, and extra handling is not * performed. */ uint64_t nelem; /*TODO: merge this and special_flags into a union */ /** * Useful for an opening nest, this will prevent a callback from being * invoked on this item or any of its children */ int ignore_callback; /** * Counter which is incremented each time an escape ('\') is encountered. * This is used internally for non-string types and should only be * inspected by the user if the state actually represents a string * type. */ unsigned int nescapes; /** * Put anything you want here. if JSONSL_STATE_USER_FIELDS is here, then * the macro expansion happens here. * * You can use these fields to store hierarchical or 'tagging' information * for specific objects. * * See the documentation above for the lifetime of the state object (i.e. * if the private data points to allocated memory, it should be freed * when the object is popped, as the state object will be re-used) */ #ifndef JSONSL_STATE_GENERIC JSONSL_STATE_USER_FIELDS #else /** * Otherwise, this is a simple void * pointer for anything you want */ void *data; #endif /* JSONSL_STATE_USER_FIELDS */ }; /**Gets the number of elements in the list. * @param st The state. Must be of type JSONSL_T_LIST * @return number of elements in the list */ #define JSONSL_LIST_SIZE(st) ((st)->nelem) /**Gets the number of key-value pairs in an object * @param st The state. Must be of type JSONSL_T_OBJECT * @return the number of key-value pairs in the object */ #define JSONSL_OBJECT_SIZE(st) ((st)->nelem / 2) /**Gets the numeric value. * @param st The state. Must be of type JSONSL_T_SPECIAL and * special_flags must have the JSONSL_SPECIALf_NUMERIC flag * set. * @return the numeric value of the state. */ #define JSONSL_NUMERIC_VALUE(st) ((st)->nelem) /* * So now we need some special structure for keeping the * JPR info in sync. Preferably all in a single block * of memory (there's no need for separate allocations. * So we will define a 'table' with the following layout * * Level nPosbl JPR1_last JPR2_last JPR3_last * * 0 1 NOMATCH POSSIBLE POSSIBLE * 1 0 NOMATCH NOMATCH COMPLETE * [ table ends here because no further path is possible] * * Where the JPR..n corresponds to the number of JPRs * requested, and nPosble is a quick flag to determine * * the number of possibilities. In the future this might * be made into a proper 'jump' table, * * Since we always mark JPRs from the higher levels descending * into the lower ones, a prospective child match would first * look at the parent table to check the possibilities, and then * see which ones were possible.. * * Thus, the size of this blob would be (and these are all ints here) * nLevels * nJPR * 2. * * the 'Width' of the table would be nJPR*2, and the 'height' would be * nlevels */ /** * This is called when a stack change ocurs. * * @param jsn The lexer * @param action The type of action, this can be PUSH or POP * @param state A pointer to the stack currently affected by the action * @param at A pointer to the position of the input buffer which triggered * this action. */ typedef void (*jsonsl_stack_callback)( jsonsl_t jsn, jsonsl_action_t action, struct jsonsl_state_st* state, const jsonsl_char_t *at); /** * This is called when an error is encountered. * Sometimes it's possible to 'erase' characters (by replacing them * with whitespace). If you think you have corrected the error, you * can return a true value, in which case the parser will backtrack * and try again. * * @param jsn The lexer * @param error The error which was thrown * @param state the current state * @param a pointer to the position of the input buffer which triggered * the error. Note that this is not const, this is because you have the * possibility of modifying the character in an attempt to correct the * error * * @return zero to bail, nonzero to try again (this only makes sense if * the input buffer has been modified by this callback) */ typedef int (*jsonsl_error_callback)( jsonsl_t jsn, jsonsl_error_t error, struct jsonsl_state_st* state, jsonsl_char_t *at); struct jsonsl_st { /** Public, read-only */ /** This is the current level of the stack */ unsigned int level; /** Flag set to indicate we should stop processing */ unsigned int stopfl; /** * This is the current position, relative to the beginning * of the stream. */ size_t pos; /** This is the 'bytes' variable passed to feed() */ const jsonsl_char_t *base; /** Callback invoked for PUSH actions */ jsonsl_stack_callback action_callback_PUSH; /** Callback invoked for POP actions */ jsonsl_stack_callback action_callback_POP; /** Default callback for any action, if neither PUSH or POP callbacks are defined */ jsonsl_stack_callback action_callback; /** * Do not invoke callbacks for objects deeper than this level. * NOTE: This field establishes the lower bound for ignored callbacks, * and is thus misnamed. `min_ignore_level` would actually make more * sense, but we don't want to break API. */ unsigned int max_callback_level; /** The error callback. Invoked when an error happens. Should not be NULL */ jsonsl_error_callback error_callback; /* these are boolean flags you can modify. You will be called * about notification for each of these types if the corresponding * variable is true. */ /** * @name Callback Booleans. * These determine whether a callback is to be invoked for certain types of objects * @{*/ /** Boolean flag to enable or disable the invokcation for events on this type*/ int call_SPECIAL; int call_OBJECT; int call_LIST; int call_STRING; int call_HKEY; /*@}*/ /** * @name u-Escape handling * Special handling for the \\u-f00d type sequences. These are meant * to be translated back into the corresponding octet(s). * A special callback (if set) is invoked with *at=='u'. An application * may wish to temporarily suspend parsing and handle the 'u-' sequence * internally (or not). */ /*@{*/ /** Callback to be invoked for a u-escape */ jsonsl_stack_callback action_callback_UESCAPE; /** Boolean flag, whether to invoke the callback */ int call_UESCAPE; /** Boolean flag, whether we should return after encountering a u-escape: * the callback is invoked and then we return if this is true */ int return_UESCAPE; /*@}*/ struct { int allow_trailing_comma; } options; /** Put anything here */ void *data; /*@{*/ /** Private */ int in_escape; char expecting; char tok_last; int can_insert; unsigned int levels_max; #ifndef JSONSL_NO_JPR size_t jpr_count; jsonsl_jpr_t *jprs; /* Root pointer for JPR matching information */ size_t *jpr_root; #endif /* JSONSL_NO_JPR */ /*@}*/ /** * This is the stack. Its upper bound is levels_max, or the * nlevels argument passed to jsonsl_new. If you modify this structure, * make sure that this member is last. */ struct jsonsl_state_st stack[1]; }; /** * Creates a new lexer object, with capacity for recursion up to nlevels * * @param nlevels maximum recursion depth */ JSONSL_API jsonsl_t jsonsl_new(int nlevels); /** * Feeds data into the lexer. * * @param jsn the lexer object * @param bytes new data to be fed * @param nbytes size of new data */ JSONSL_API void jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes); /** * Resets the internal parser state. This does not free the parser * but does clean it internally, so that the next time feed() is called, * it will be treated as a new stream * * @param jsn the lexer */ JSONSL_API void jsonsl_reset(jsonsl_t jsn); /** * Frees the lexer, cleaning any allocated memory taken * * @param jsn the lexer */ JSONSL_API void jsonsl_destroy(jsonsl_t jsn); /** * Gets the 'parent' element, given the current one * * @param jsn the lexer * @param cur the current nest, which should be a struct jsonsl_nest_st */ static JSONSL_INLINE struct jsonsl_state_st *jsonsl_last_state(const jsonsl_t jsn, const struct jsonsl_state_st *state) { /* Don't complain about overriding array bounds */ if (state->level > 1) { return jsn->stack + state->level - 1; } else { return NULL; } } /** * Gets the state of the last fully consumed child of this parent. This is * only valid in the parent's POP callback. * * @param the lexer * @return A pointer to the child. */ static JSONSL_INLINE struct jsonsl_state_st *jsonsl_last_child(const jsonsl_t jsn, const struct jsonsl_state_st *parent) { return jsn->stack + (parent->level + 1); } /**Call to instruct the parser to stop parsing and return. This is valid * only from within a callback */ static JSONSL_INLINE void jsonsl_stop(jsonsl_t jsn) { jsn->stopfl = 1; } /** * This enables receiving callbacks on all events. Doesn't do * anything special but helps avoid some boilerplate. * This does not touch the UESCAPE callbacks or flags. */ static JSONSL_INLINE void jsonsl_enable_all_callbacks(jsonsl_t jsn) { jsn->call_HKEY = 1; jsn->call_STRING = 1; jsn->call_OBJECT = 1; jsn->call_SPECIAL = 1; jsn->call_LIST = 1; } /** * A macro which returns true if the current state object can * have children. This means a list type or an object type. */ #define JSONSL_STATE_IS_CONTAINER(state) \ (state->type == JSONSL_T_OBJECT || state->type == JSONSL_T_LIST) /** * These two functions, dump a string representation * of the error or type, respectively. They will never * return NULL */ JSONSL_API const char* jsonsl_strerror(jsonsl_error_t err); JSONSL_API const char* jsonsl_strtype(jsonsl_type_t jt); /** * Dumps global metrics to the screen. This is a noop unless * jsonsl was compiled with JSONSL_USE_METRICS */ JSONSL_API void jsonsl_dump_global_metrics(void); /* This macro just here for editors to do code folding */ #ifndef JSONSL_NO_JPR /** * @name JSON Pointer API * * JSONPointer API. This isn't really related to the lexer (at least not yet) * JSONPointer provides an extremely simple specification for providing * locations within JSON objects. We will extend it a bit and allow for * providing 'wildcard' characters by which to be able to 'query' the stream. * * See http://tools.ietf.org/html/draft-pbryan-zyp-json-pointer-00 * * Currently I'm implementing the 'single query' API which can only use a single * query component. In the future I will integrate my yet-to-be-published * Boyer-Moore-esque prefix searching implementation, in order to allow * multiple paths to be merged into one for quick and efficient searching. * * * JPR (as we'll refer to it within the source) can be used by splitting * the components into multiple sections, and incrementally 'track' each * component. When JSONSL delivers a 'pop' callback for a string, or a 'push' * callback for an object, we will check to see whether the index matching * the component corresponding to the current level contains a match * for our path. * * In order to do this properly, a structure must be maintained within the * parent indicating whether its children are possible matches. This flag * will be 'inherited' by call children which may conform to the match * specification, and discarded by all which do not (thereby eliminating * their children from inheriting it). * * A successful match is a complete one. One can provide multiple paths with * multiple levels of matches e.g. * /foo/bar/baz/^/blah * * @{ */ /** The wildcard character */ #ifndef JSONSL_PATH_WILDCARD_CHAR #define JSONSL_PATH_WILDCARD_CHAR '^' #endif /* WILDCARD_CHAR */ #define JSONSL_XMATCH \ X(COMPLETE,1) \ X(POSSIBLE,0) \ X(NOMATCH,-1) \ X(TYPE_MISMATCH, -2) typedef enum { #define X(T,v) \ JSONSL_MATCH_##T = v, JSONSL_XMATCH #undef X JSONSL_MATCH_UNKNOWN } jsonsl_jpr_match_t; typedef enum { JSONSL_PATH_STRING = 1, JSONSL_PATH_WILDCARD, JSONSL_PATH_NUMERIC, JSONSL_PATH_ROOT, /* Special */ JSONSL_PATH_INVALID = -1, JSONSL_PATH_NONE = 0 } jsonsl_jpr_type_t; struct jsonsl_jpr_component_st { /** The string the component points to */ char *pstr; /** if this is a numeric type, the number is 'cached' here */ unsigned long idx; /** The length of the string */ size_t len; /** The type of component (NUMERIC or STRING) */ jsonsl_jpr_type_t ptype; /** Set this to true to enforce type checking between dict keys and array * indices. jsonsl_jpr_match() will return TYPE_MISMATCH if it detects * that an array index is actually a child of a dictionary. */ short is_arridx; /* Extra fields (for more advanced searches. Default is empty) */ JSONSL_JPR_COMPONENT_USER_FIELDS }; struct jsonsl_jpr_st { /** Path components */ struct jsonsl_jpr_component_st *components; size_t ncomponents; /**Type of the match to be expected. If nonzero, will be compared against * the actual type */ unsigned match_type; /** Base of allocated string for components */ char *basestr; /** The original match string. Useful for returning to the user */ char *orig; size_t norig; }; /** * Create a new JPR object. * * @param path the JSONPointer path specification. * @param errp a pointer to a jsonsl_error_t. If this function returns NULL, * then more details will be in this variable. * * @return a new jsonsl_jpr_t object, or NULL on error. */ JSONSL_API jsonsl_jpr_t jsonsl_jpr_new(const char *path, jsonsl_error_t *errp); /** * Destroy a JPR object */ JSONSL_API void jsonsl_jpr_destroy(jsonsl_jpr_t jpr); /** * Match a JSON object against a type and specific level * * @param jpr the JPR object * @param parent_type the type of the parent (should be T_LIST or T_OBJECT) * @param parent_level the level of the parent * @param key the 'key' of the child. If the parent is an array, this should be * empty. * @param nkey - the length of the key. If the parent is an array (T_LIST), then * this should be the current index. * * NOTE: The key of the child means any kind of associative data related to the * element. Thus: <<< { "foo" : [ >>, * the opening array's key is "foo". * * @return a status constant. This indicates whether a match was excluded, possible, * or successful. */ JSONSL_API jsonsl_jpr_match_t jsonsl_jpr_match(jsonsl_jpr_t jpr, unsigned int parent_type, unsigned int parent_level, const char *key, size_t nkey); /** * Alternate matching algorithm. This matching algorithm does not use * JSONPointer but relies on a more structured searching mechanism. It * assumes that there is a clear distinction between array indices and * object keys. In this case, the jsonsl_path_component_st::ptype should * be set to @ref JSONSL_PATH_NUMERIC for an array index (the * jsonsl_path_comonent_st::is_arridx field will be removed in a future * version). * * @param jpr The path * @param parent The parent structure. Can be NULL if this is the root object * @param child The child structure. Should not be NULL * @param key Object key, if an object * @param nkey Length of object key * @return Status constant if successful * * @note * For successful matching, both the key and the path itself should be normalized * to contain 'proper' utf8 sequences rather than utf16 '\uXXXX' escapes. This * should currently be done in the application. Another version of this function * may use a temporary buffer in such circumstances (allocated by the application). * * Since this function also checks the state of the child, it should only * be called on PUSH callbacks, and not POP callbacks */ JSONSL_API jsonsl_jpr_match_t jsonsl_path_match(jsonsl_jpr_t jpr, const struct jsonsl_state_st *parent, const struct jsonsl_state_st *child, const char *key, size_t nkey); /** * Associate a set of JPR objects with a lexer instance. * This should be called before the lexer has been fed any data (and * behavior is undefined if you don't adhere to this). * * After using this function, you may subsequently call match_state() on * given states (presumably from within the callbacks). * * Note that currently the first JPR is the quickest and comes * pre-allocated with the state structure. Further JPR objects * are chained. * * @param jsn The lexer * @param jprs An array of jsonsl_jpr_t objects * @param njprs How many elements in the jprs array. */ JSONSL_API void jsonsl_jpr_match_state_init(jsonsl_t jsn, jsonsl_jpr_t *jprs, size_t njprs); /** * This follows the same semantics as the normal match, * except we infer parent and type information from the relevant state objects. * The match status (for all possible JPR objects) is set in the *out parameter. * * If a match has succeeded, then its JPR object will be returned. In all other * instances, NULL is returned; * * @param jpr The jsonsl_jpr_t handle * @param state The jsonsl_state_st which is a candidate * @param key The hash key (if applicable, can be NULL if parent is list) * @param nkey Length of hash key (if applicable, can be zero if parent is list) * @param out A pointer to a jsonsl_jpr_match_t. This will be populated with * the match result * * @return If a match was completed in full, then the JPR object containing * the matching path will be returned. Otherwise, the return is NULL (note, this * does not mean matching has failed, it can still be part of the match: check * the out parameter). */ JSONSL_API jsonsl_jpr_t jsonsl_jpr_match_state(jsonsl_t jsn, struct jsonsl_state_st *state, const char *key, size_t nkey, jsonsl_jpr_match_t *out); /** * Cleanup any memory allocated and any states set by * match_state_init() and match_state() * @param jsn The lexer */ JSONSL_API void jsonsl_jpr_match_state_cleanup(jsonsl_t jsn); /** * Return a string representation of the match result returned by match() */ JSONSL_API const char *jsonsl_strmatchtype(jsonsl_jpr_match_t match); /* @}*/ /** * Utility function to convert escape sequences into their original form. * * The decoders I've sampled do not seem to specify a standard behavior of what * to escape/unescape. * * RFC 4627 Mandates only that the quoute, backslash, and ASCII control * characters (0x00-0x1f) be escaped. It is often common for applications * to escape a '/' - however this may also be desired behavior. the JSON * spec is not clear on this, and therefore jsonsl leaves it up to you. * * Additionally, sometimes you may wish to _normalize_ JSON. This is specifically * true when dealing with 'u-escapes' which can be expressed perfectly fine * as utf8. One use case for normalization is JPR string comparison, in which * case two effectively equivalent strings may not match because one is using * u-escapes and the other proper utf8. To normalize u-escapes only, pass in * an empty `toEscape` table, enabling only the `u` index. * * @param in The input string. * @param out An allocated output (should be the same size as in) * @param len the size of the buffer * @param toEscape - A sparse array of characters to unescape. Characters * which are not present in this array, e.g. toEscape['c'] == 0 will be * ignored and passed to the output in their original form. * @param oflags If not null, and a \uXXXX escape expands to a non-ascii byte, * then this variable will have the SPECIALf_NONASCII flag on. * * @param err A pointer to an error variable. If an error ocurrs, it will be * set in this variable * @param errat If not null and an error occurs, this will be set to point * to the position within the string at which the offending character was * encountered. * * @return The effective size of the output buffer. * * @note * This function now encodes the UTF8 equivalents of utf16 escapes (i.e. * 'u-escapes'). Previously this would encode the escapes as utf16 literals, * which while still correct in some sense was confusing for many (especially * considering that the inputs were variations of char). * * @note * The output buffer will never be larger than the input buffer, since * standard escape sequences (i.e. '\t') occupy two bytes in the source * but only one byte (when unescaped) in the output. Likewise u-escapes * (i.e. \uXXXX) will occupy six bytes in the source, but at the most * two bytes when escaped. */ JSONSL_API size_t jsonsl_util_unescape_ex(const char *in, char *out, size_t len, const int toEscape[128], unsigned *oflags, jsonsl_error_t *err, const char **errat); /** * Convenience macro to avoid passing too many parameters */ #define jsonsl_util_unescape(in, out, len, toEscape, err) \ jsonsl_util_unescape_ex(in, out, len, toEscape, NULL, err, NULL) #endif /* JSONSL_NO_JPR */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* JSONSL_H_ */ mongo-c-driver-1.26.0/src/libbson/tests/000077500000000000000000000000001456567454500200365ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/tests/binary/000077500000000000000000000000001456567454500213225ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/tests/binary/binary_deprecated.bson000066400000000000000000000000321456567454500256440ustar00rootroot00000000000000binary1234mongo-c-driver-1.26.0/src/libbson/tests/binary/cdriver2269.bson000066400000000000000000000000341456567454500241630ustar00rootroot00000000000000興mongo-c-driver-1.26.0/src/libbson/tests/binary/code_w_empty_scope.bson000066400000000000000000000000441456567454500260520ustar00rootroot00000000000000$code var a = {};mongo-c-driver-1.26.0/src/libbson/tests/binary/codewscope.bson000066400000000000000000000000331456567454500243340ustar00rootroot00000000000000foofoomongo-c-driver-1.26.0/src/libbson/tests/binary/dollarquery.bson000066400000000000000000000000221456567454500245420ustar00rootroot00000000000000$querymongo-c-driver-1.26.0/src/libbson/tests/binary/dotkey.bson000066400000000000000000000000621456567454500235020ustar00rootroot000000000000002a*b"c012mongo-c-driver-1.26.0/src/libbson/tests/binary/dotquery.bson000066400000000000000000000000171456567454500240570ustar00rootroot00000000000000abc.defmongo-c-driver-1.26.0/src/libbson/tests/binary/empty_key.bson000066400000000000000000000000211456567454500242040ustar00rootroot00000000000000valuemongo-c-driver-1.26.0/src/libbson/tests/binary/eurokey.bson000066400000000000000000000000521456567454500236650ustar00rootroot00000000000000*€€€€€€€€€€mongo-c-driver-1.26.0/src/libbson/tests/binary/overflow1.bson000066400000000000000000000000221456567454500241230ustar00rootroot00000000000000foobarmongo-c-driver-1.26.0/src/libbson/tests/binary/overflow2.bson000066400000000000000000000000301456567454500241230ustar00rootroot00000000000000foobarmongo-c-driver-1.26.0/src/libbson/tests/binary/overflow3.bson000066400000000000000000000000251456567454500241300ustar00rootroot00000000000000foo barmongo-c-driver-1.26.0/src/libbson/tests/binary/overflow4.bson000066400000000000000000000000341456567454500241310ustar00rootroot00000000000000foobarbazmongo-c-driver-1.26.0/src/libbson/tests/binary/readergrow.bson000066400000000000000000000234351456567454500243550ustar00rootroot00000000000000'a'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamongo-c-driver-1.26.0/src/libbson/tests/binary/stackoverflow.bson000066400000000000000001000000041456567454500250710ustar00rootroot00000000000000xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$߿߿߿߿߿߿߿߿߿߿߿߿߿߿߿߿߿߿|߿u߿n߿g߿`߿Y߿R߿K߿D߿=߿6߿/߿(߿!߿߿߿ ߿߿޿޿޿޿޿޿޿޿޿޿޿޿޿޿޿޿޿޿޿y޿r޿k޿d޿]޿V޿O޿H޿A޿:޿3޿,޿%޿޿޿޿ ޿޿ݿݿݿݿݿݿݿݿݿݿݿݿݿݿݿݿݿݿ}ݿvݿoݿhݿaݿZݿSݿLݿEݿ>ݿ7ݿ0ݿ)ݿ"ݿݿݿ ݿݿܿܿܿܿܿܿܿܿܿܿܿܿܿܿܿܿܿܿܿzܿsܿlܿeܿ^ܿWܿPܿIܿBܿ;ܿ4ܿ-ܿ&ܿܿܿܿ ܿܿۿۿۿۿۿۿۿۿۿۿۿۿۿۿۿۿۿۿ~ۿwۿpۿiۿbۿ[ۿTۿMۿFۿ?ۿ8ۿ1ۿ*ۿ#ۿۿۿۿۿۿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿ{ڿtڿmڿfڿ_ڿXڿQڿJڿCڿ<ڿ5ڿ.ڿ'ڿ ڿڿڿ ڿڿٿٿٿٿٿٿٿٿٿٿٿٿٿٿٿٿٿٿٿxٿqٿjٿcٿ\ٿUٿNٿGٿ@ٿ9ٿ2ٿ+ٿ$ٿٿٿٿٿٿؿؿؿؿؿؿؿؿؿؿؿؿؿؿؿؿؿؿ|ؿuؿnؿgؿ`ؿYؿRؿKؿDؿ=ؿ6ؿ/ؿ(ؿ!ؿؿؿ ؿؿ׿׿׿׿׿׿׿׿׿׿׿׿׿׿׿׿׿׿׿y׿r׿k׿d׿]׿V׿O׿H׿A׿:׿3׿,׿%׿׿׿׿ ׿׿ֿֿֿֿֿֿֿֿֿֿֿֿֿֿֿֿֿֿ}ֿvֿoֿhֿaֿZֿSֿLֿEֿ>ֿ7ֿ0ֿ)ֿ"ֿֿֿ ֿֿտտտտտտտտտտտտտտտտտտտzտsտlտeտ^տWտPտIտBտ;տ4տ-տ&տտտտ տտԿԿԿԿԿԿԿԿԿԿԿԿԿԿԿԿԿԿ~ԿwԿpԿiԿbԿ[ԿTԿMԿFԿ?Կ8Կ1Կ*Կ#ԿԿԿԿԿԿӿӿӿӿӿӿӿӿӿӿӿӿӿӿӿӿӿӿ{ӿtӿmӿfӿ_ӿXӿQӿJӿCӿ<ӿ5ӿ.ӿ'ӿ ӿӿӿ ӿӿҿҿҿҿҿҿҿҿҿҿҿҿҿҿҿҿҿҿҿxҿqҿjҿcҿ\ҿUҿNҿGҿ@ҿ9ҿ2ҿ+ҿ$ҿҿҿҿҿҿѿѿѿѿѿѿѿѿѿѿѿѿѿѿѿѿѿѿ|ѿuѿnѿgѿ`ѿYѿRѿKѿDѿ=ѿ6ѿ/ѿ(ѿ!ѿѿѿ ѿѿпппппппппппппппппппyпrпkпdп]пVпOпHпAп:п3п,п%пппп ппϿϿϿϿϿϿϿϿϿϿϿϿϿϿϿϿϿϿ}ϿvϿoϿhϿaϿZϿSϿLϿEϿ>Ͽ7Ͽ0Ͽ)Ͽ"ϿϿϿ ϿϿοοοοοοοοοοοοοοοοοοοzοsοlοeο^οWοPοIοBο;ο4ο-ο&οοοο οοͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿ~ͿwͿpͿiͿbͿ[ͿTͿMͿFͿ?Ϳ8Ϳ1Ϳ*Ϳ#ͿͿͿͿͿͿ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿{̿t̿m̿f̿_̿X̿Q̿J̿C̿<̿5̿.̿'̿ ̿̿̿ ̿̿˿˿˿˿˿˿˿˿˿˿˿˿˿˿˿˿˿˿˿x˿q˿j˿c˿\˿U˿N˿G˿@˿9˿2˿+˿$˿˿˿˿˿˿ʿʿʿʿʿʿʿʿʿʿʿʿʿʿʿʿʿʿ|ʿuʿnʿgʿ`ʿYʿRʿKʿDʿ=ʿ6ʿ/ʿ(ʿ!ʿʿʿ ʿʿɿɿɿɿɿɿɿɿɿɿɿɿɿɿɿɿɿɿɿyɿrɿkɿdɿ]ɿVɿOɿHɿAɿ:ɿ3ɿ,ɿ%ɿɿɿɿ ɿɿȿȿȿȿȿȿȿȿȿȿȿȿȿȿȿȿȿȿ}ȿvȿoȿhȿaȿZȿSȿLȿEȿ>ȿ7ȿ0ȿ)ȿ"ȿȿȿ ȿȿǿǿǿǿǿǿǿǿǿǿǿǿǿǿǿǿǿǿǿzǿsǿlǿeǿ^ǿWǿPǿIǿBǿ;ǿ4ǿ-ǿ&ǿǿǿǿ ǿǿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿ~ƿwƿpƿiƿbƿ[ƿTƿMƿFƿ?ƿ8ƿ1ƿ*ƿ#ƿƿƿƿƿƿſſſſſſſſſſſſſſſſſſ{ſtſmſfſ_ſXſQſJſCſ<ſ5ſ.ſ'ſ ſſſ ſſĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿĿxĿqĿjĿcĿ\ĿUĿNĿGĿ@Ŀ9Ŀ2Ŀ+Ŀ$ĿĿĿĿĿĿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿}vohaZSLE>70)" zsle^WPIB;4-& 翿࿿ٿҿ˿Ŀ~wpib[TMF?81*#뾿便ݾ־ϾȾ{tmf_XQJC<5.'  ソ轿὿ڽӽ̽Žxqjc\UNG@92+$켿弿޼׼мɼ¼|ung`YRKD=6/(! 黿⻿ۻԻͻƻyrkd]VOHA:3,% 溿ߺغѺʺú}vohaZSLE>70)" 깿㹿ܹչιǹzsle^WPIB;4-& 縿฿ٸҸ˸ĸ~wpib[TMF?81*#뷿䷿ݷַϷȷ{tmf_XQJC<5.'  ﶿ趿ᶿڶӶ̶Ŷxqjc\UNG@92+$쵿嵿޵׵еɵµ|ung`YRKD=6/(! 鴿ⴿ۴Դʹƴyrkd]VOHA:3,% 泿߳سѳʳó}vohaZSLE>70)" 겿㲿ܲղβDzzsle^WPIB;4-& 籿౿ٱұ˱ı~wpib[TMF?81*#밿䰿ݰְϰȰ{tmf_XQJC<5.'  ﯿ诿᯿گӯ̯ůxqjc\UNG@92+$쮿宿ޮ׮Юɮ®|ung`YRKD=6/(! 魿⭿ۭԭͭƭyrkd]VOHA:3,% 欿߬جѬʬì}vohaZSLE>70)" ꫿㫿ܫիΫǫzsle^WPIB;4-& 窿િ٪Ҫ˪Ī~wpib[TMF?81*#멿䩿ݩ֩ϩȩ{tmf_XQJC<5.'  憎訿ᨿڨӨ̨Ũxqjc\UNG@92+$짿姿ާקЧɧ§|ung`YRKD=6/(! 馿⦿ۦԦͦƦyrkd]VOHA:3,% 楿ߥإѥʥå}vohaZSLE>70)" ꤿ㤿ܤդΤǤzsle^WPIB;4-& 磿ࣿ٣ңˣģ~wpib[TMF?81*#뢿䢿ݢ֢ϢȢ{tmf_XQJC<5.'  衿᡿ڡӡ̡šxqjc\UNG@92+$젿堿ޠנРɠ |ung`YRKD=6/(! 響⟿۟ԟ͟Ɵyrkd]VOHA:3,% ힿ枿ߞ؞ўʞÞ}vohaZSLE>70)" ꝿ㝿ܝ՝Νǝzsle^WPIB;4-& 眿ٜҜ˜Ĝ~wpib[TMF?81*#뛿䛿ݛ֛ϛț{tmf_XQJC<5.'  蚿ᚿښӚ̚Śxqjc\UNG@92+$왿噿ޙיЙə™|ung`YRKD=6/(! 阿☿ۘԘ͘Ƙyrkd]VOHA:3,% 헿旿ߗؗїʗ×}vohaZSLE>70)" ꖿ㖿ܖՖΖǖzsle^WPIB;4-& 畿ٕҕ˕ĕ~wpib[TMF?81*#딿䔿ݔ֔ϔȔ{tmf_XQJC<5.'  蓿ᓿړӓ̓œxqjc\UNG@92+$쒿咿ޒגВɒ’|ung`YRKD=6/(! 鑿⑿ۑԑ͑Ƒyrkd]VOHA:3,% 퐿搿ߐؐѐʐÐ}vohaZSLE>70)" ꏿ㏿܏ՏΏǏzsle^WPIB;4-& 玿َҎˎĎ~wpib[TMF?81*#덿䍿ݍ֍ύȍ{tmf_XQJC<5.'  茿ጿڌӌ̌Ōxqjc\UNG@92+$싿勿ދ׋Ћɋ‹|ung`YRKD=6/(! 銿⊿ۊԊ͊Ɗyrkd]VOHA:3,% 퉿承߉؉щʉÉ}vohaZSLE>70)" ꈿ㈿܈ՈΈLjzsle^WPIB;4-& 燿ه҇ˇć~wpib[TMF?81*#놿䆿݆ֆφȆ{tmf_XQJC<5.'  腿ᅿڅӅ̅Ņxqjc\UNG@92+$섿儿ބׄЄɄ„|ung`YRKD=6/(! 郿⃿ۃԃ̓ƃyrkd]VOHA:3,% 킿悿߂؂тʂÂ}vohaZSLE>70)" ꁿみ܁Ձ΁ǁzsle^WPIB;4-& 瀿ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ߾߾߾߾߾߾߾߾߾߾߾߾߾߾߾߾߾߾~߾w߾p߾i߾b߾[߾T߾M߾F߾?߾8߾1߾*߾#߾߾߾߾߾߾޾޾޾޾޾޾޾޾޾޾޾޾޾޾޾޾޾޾{޾t޾m޾f޾_޾X޾Q޾J޾C޾<޾5޾.޾'޾ ޾޾޾ ޾޾ݾݾݾݾݾݾݾݾݾݾݾݾݾݾݾݾݾݾݾxݾqݾjݾcݾ\ݾUݾNݾGݾ@ݾ9ݾ2ݾ+ݾ$ݾݾݾݾݾݾܾܾܾܾܾܾܾܾܾܾܾܾܾܾܾܾܾܾ|ܾuܾnܾgܾ`ܾYܾRܾKܾDܾ=ܾ6ܾ/ܾ(ܾ!ܾܾܾ ܾܾ۾۾۾۾۾۾۾۾۾۾۾۾۾۾۾۾۾۾۾y۾r۾k۾d۾]۾V۾O۾H۾A۾:۾3۾,۾%۾۾۾۾ ۾۾ھھھھھھھھھھھھھھھھھھ}ھvھoھhھaھZھSھLھEھ>ھ7ھ0ھ)ھ"ھھھ ھھپپپپپپپپپپپپپپپپپپپzپsپlپeپ^پWپPپIپBپ;پ4پ-پ&پپپپ پپؾؾؾؾؾؾؾؾؾؾؾؾؾؾؾؾؾؾ~ؾwؾpؾiؾbؾ[ؾTؾMؾFؾ?ؾ8ؾ1ؾ*ؾ#ؾؾؾؾؾؾ׾׾׾׾׾׾׾׾׾׾׾׾׾׾׾׾׾׾{׾t׾m׾f׾_׾X׾Q׾J׾C׾<׾5׾.׾'׾ ׾׾׾ ׾׾־־־־־־־־־־־־־־־־־־־x־q־j־c־\־U־N־G־@־9־2־+־$־־־־־־վվվվվվվվվվվվվվվվվվ|վuվnվgվ`վYվRվKվDվ=վ6վ/վ(վ!վվվ վվԾԾԾԾԾԾԾԾԾԾԾԾԾԾԾԾԾԾԾyԾrԾkԾdԾ]ԾVԾOԾHԾAԾ:Ծ3Ծ,Ծ%ԾԾԾԾ ԾԾӾӾӾӾӾӾӾӾӾӾӾӾӾӾӾӾӾӾ}ӾvӾoӾhӾaӾZӾSӾLӾEӾ>Ӿ7Ӿ0Ӿ)Ӿ"ӾӾӾ ӾӾҾҾҾҾҾҾҾҾҾҾҾҾҾҾҾҾҾҾҾzҾsҾlҾeҾ^ҾWҾPҾIҾBҾ;Ҿ4Ҿ-Ҿ&ҾҾҾҾ ҾҾѾѾѾѾѾѾѾѾѾѾѾѾѾѾѾѾѾѾ~ѾwѾpѾiѾbѾ[ѾTѾMѾFѾ?Ѿ8Ѿ1Ѿ*Ѿ#ѾѾѾѾѾѾоооооооооооооооооо{оtоmоfо_оXоQоJоCо<о5о.о'о ооо ооϾϾϾϾϾϾϾϾϾϾϾϾϾϾϾϾϾϾϾxϾqϾjϾcϾ\ϾUϾNϾGϾ@Ͼ9Ͼ2Ͼ+Ͼ$ϾϾϾϾϾϾξξξξξξξξξξξξξξξξξξ|ξuξnξgξ`ξYξRξKξDξ=ξ6ξ/ξ(ξ!ξξξ ξξ;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾}̾v̾o̾h̾a̾Z̾S̾L̾E̾>̾7̾0̾)̾"̾̾̾ ̾̾˾˾˾˾˾˾˾˾˾˾˾˾˾˾˾˾˾˾˾z˾s˾l˾e˾^˾W˾P˾I˾B˾;˾4˾-˾&˾˾˾˾ ˾˾ʾʾʾʾʾʾʾʾʾʾʾʾʾʾʾʾʾʾ~ʾwʾpʾiʾbʾ[ʾTʾMʾFʾ?ʾ8ʾ1ʾ*ʾ#ʾʾʾʾʾʾɾɾɾɾɾɾɾɾɾɾɾɾɾɾɾɾɾɾ{ɾtɾmɾfɾ_ɾXɾQɾJɾCɾ<ɾ5ɾ.ɾ'ɾ ɾɾɾ ɾɾȾȾȾȾȾȾȾȾȾȾȾȾȾȾȾȾȾȾȾxȾqȾjȾcȾ\ȾUȾNȾGȾ@Ⱦ9Ⱦ2Ⱦ+Ⱦ$ȾȾȾȾȾȾǾǾǾǾǾǾǾǾǾǾǾǾǾǾǾǾǾǾ|ǾuǾnǾgǾ`ǾYǾRǾKǾDǾ=Ǿ6Ǿ/Ǿ(Ǿ!ǾǾǾ ǾǾƾƾƾƾƾƾƾƾƾƾƾƾƾƾƾƾƾƾƾyƾrƾkƾdƾ]ƾVƾOƾHƾAƾ:ƾ3ƾ,ƾ%ƾƾƾƾ ƾƾžžžžžžžžžžžžžžžžžž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžľľľľľľľľľľľľľľľľľľľzľsľlľeľ^ľWľPľIľBľ;ľ4ľ-ľ&ľľľľ ľľþþþþþþþþþþþþþþþþþþ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþ¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾{¾t¾m¾f¾_¾X¾Q¾J¾C¾<¾5¾.¾'¾ ¾¾¾ ¾¾xqjc\UNG@92+$|ung`YRKD=6/(! 鿾⿾ۿԿͿƿyrkd]VOHA:3,% 澾߾ؾѾʾþ}vohaZSLE>70)" 꽾㽾ܽսνǽzsle^WPIB;4-& 缾༾ټҼ˼ļ~wpib[TMF?81*#뻾仾ݻֻϻȻ{tmf_XQJC<5.'  ﺾ躾ẾںӺ̺źxqjc\UNG@92+$칾幾޹׹йɹ¹|ung`YRKD=6/(! 鸾⸾۸Ը͸Ƹyrkd]VOHA:3,% 淾߷طѷʷ÷}vohaZSLE>70)" 궾㶾ܶնζǶzsle^WPIB;4-& 絾ൾٵҵ˵ĵ~wpib[TMF?81*#봾䴾ݴִϴȴ{tmf_XQJC<5.'  ﳾ賾᳾ڳӳ̳ųxqjc\UNG@92+$첾岾޲ײвɲ²|ung`YRKD=6/(! 鱾Ȿ۱ԱͱƱyrkd]VOHA:3,% 氾߰ذѰʰð}vohaZSLE>70)" ꯾㯾ܯկίǯzsle^WPIB;4-& 箾ாٮҮˮĮ~wpib[TMF?81*#뭾䭾ݭ֭ϭȭ{tmf_XQJC<5.'  מּ謾ᬾڬӬ̬Ŭxqjc\UNG@92+$쫾嫾ޫ׫Ыɫ«|ung`YRKD=6/(! 骾⪾۪Ԫͪƪyrkd]VOHA:3,% 橾ߩةѩʩé}vohaZSLE>70)" ꨾㨾ܨըΨǨzsle^WPIB;4-& 秾৾٧ҧ˧ħ~wpib[TMF?81*#릾䦾ݦ֦ϦȦ{tmf_XQJC<5.'  量襾᥾ڥӥ̥ťxqjc\UNG@92+$줾夾ޤפФɤ¤|ung`YRKD=6/(! 飾⣾ۣԣͣƣyrkd]VOHA:3,% 梾ߢآѢʢâ}vohaZSLE>70)" ꡾㡾ܡաΡǡzsle^WPIB;4-& 砾࠾٠ҠˠĠ~wpib[TMF?81*#럾䟾ݟ֟ϟȟ{tmf_XQJC<5.'  螾ើڞӞ̞Şxqjc\UNG@92+$읾坾ޝםНɝ|ung`YRKD=6/(! 霾✾ۜԜ͜Ɯyrkd]VOHA:3,% 훾曾ߛ؛ћʛÛ}vohaZSLE>70)" ꚾ㚾ܚ՚Κǚzsle^WPIB;4-& 百ٙҙ˙ę~wpib[TMF?81*#똾䘾ݘ֘ϘȘ{tmf_XQJC<5.'  藾ᗾڗӗ̗ŗxqjc\UNG@92+$얾喾ޖזЖɖ–|ung`YRKD=6/(! 镾╾ەԕ͕ƕyrkd]VOHA:3,% 픾放ߔؔєʔÔ}vohaZSLE>70)" ꓾㓾ܓՓΓǓzsle^WPIB;4-& 璾ْҒ˒Ē~wpib[TMF?81*#둾䑾ݑ֑ϑȑ{tmf_XQJC<5.'  萾ᐾڐӐ̐Őxqjc\UNG@92+$쏾叾ޏ׏Џɏ|ung`YRKD=6/(! 鎾⎾ێԎ͎Ǝyrkd]VOHA:3,% 퍾捾ߍ؍эʍÍ}vohaZSLE>70)" ꌾ㌾܌ՌΌnjzsle^WPIB;4-& 狾ًҋˋċ~wpib[TMF?81*#늾䊾݊֊ϊȊ{tmf_XQJC<5.'  艾ቾډӉ̉ʼnxqjc\UNG@92+$숾刾ވ׈ЈɈˆ|ung`YRKD=6/(! 釾⇾ۇԇ͇Ƈyrkd]VOHA:3,% 톾憾߆؆цʆÆ}vohaZSLE>70)" ꅾㅾ܅Յ΅Džzsle^WPIB;4-& 焾ل҄˄Ą~wpib[TMF?81*#냾䃾݃փσȃ{tmf_XQJC<5.'  肾Ⴞڂӂ̂łxqjc\UNG@92+$쁾偾ށׁЁɁ|ung`YRKD=6/(! 逾‾ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ߽߽߽߽߽߽߽߽߽߽߽߽߽߽߽߽߽߽߽y߽r߽k߽d߽]߽V߽O߽H߽A߽:߽3߽,߽%߽߽߽߽ ߽߽޽޽޽޽޽޽޽޽޽޽޽޽޽޽޽޽޽޽}޽v޽o޽h޽a޽Z޽S޽L޽E޽>޽7޽0޽)޽"޽޽޽ ޽޽ݽݽݽݽݽݽݽݽݽݽݽݽݽݽݽݽݽݽݽzݽsݽlݽeݽ^ݽWݽPݽIݽBݽ;ݽ4ݽ-ݽ&ݽݽݽݽ ݽݽܽܽܽܽܽܽܽܽܽܽܽܽܽܽܽܽܽܽ~ܽwܽpܽiܽbܽ[ܽTܽMܽFܽ?ܽ8ܽ1ܽ*ܽ#ܽܽܽܽܽܽ۽۽۽۽۽۽۽۽۽۽۽۽۽۽۽۽۽۽{۽t۽m۽f۽_۽X۽Q۽J۽C۽<۽5۽.۽'۽ ۽۽۽ ۽۽ڽڽڽڽڽڽڽڽڽڽڽڽڽڽڽڽڽڽڽxڽqڽjڽcڽ\ڽUڽNڽGڽ@ڽ9ڽ2ڽ+ڽ$ڽڽڽڽڽڽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽ|ٽuٽnٽgٽ`ٽYٽRٽKٽDٽ=ٽ6ٽ/ٽ(ٽ!ٽٽٽ ٽٽؽؽؽؽؽؽؽؽؽؽؽؽؽؽؽؽؽؽؽyؽrؽkؽdؽ]ؽVؽOؽHؽAؽ:ؽ3ؽ,ؽ%ؽؽؽؽ ؽؽ׽׽׽׽׽׽׽׽׽׽׽׽׽׽׽׽׽׽}׽v׽o׽h׽a׽Z׽S׽L׽E׽>׽7׽0׽)׽"׽׽׽ ׽׽ֽֽֽֽֽֽֽֽֽֽֽֽֽֽֽֽֽֽֽzֽsֽlֽeֽ^ֽWֽPֽIֽBֽ;ֽ4ֽ-ֽ&ֽֽֽֽ ֽֽսսսսսսսսսսսսսսսսսս~սwսpսiսbս[սTսMսFս?ս8ս1ս*ս#սսսսսսԽԽԽԽԽԽԽԽԽԽԽԽԽԽԽԽԽԽ{ԽtԽmԽfԽ_ԽXԽQԽJԽCԽ<Խ5Խ.Խ'Խ ԽԽԽ ԽԽӽӽӽӽӽӽӽӽӽӽӽӽӽӽӽӽӽӽӽxӽqӽjӽcӽ\ӽUӽNӽGӽ@ӽ9ӽ2ӽ+ӽ$ӽӽӽӽӽӽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽ|ҽuҽnҽgҽ`ҽYҽRҽKҽDҽ=ҽ6ҽ/ҽ(ҽ!ҽҽҽ ҽҽѽѽѽѽѽѽѽѽѽѽѽѽѽѽѽѽѽѽѽyѽrѽkѽdѽ]ѽVѽOѽHѽAѽ:ѽ3ѽ,ѽ%ѽѽѽѽ ѽѽнннннннннннннннннн}нvнoнhнaнZнSнLнEн>н7н0н)н"ннн ннϽϽϽϽϽϽϽϽϽϽϽϽϽϽϽϽϽϽϽzϽsϽlϽeϽ^ϽWϽPϽIϽBϽ;Ͻ4Ͻ-Ͻ&ϽϽϽϽ ϽϽνννννννννννννννννν~νwνpνiνbν[νTνMνFν?ν8ν1ν*ν#ννννννͽͽͽͽͽͽͽͽͽͽͽͽͽͽͽͽͽͽ{ͽtͽmͽfͽ_ͽXͽQͽJͽCͽ<ͽ5ͽ.ͽ'ͽ ͽͽͽ ͽͽ̽̽̽̽̽̽̽̽̽̽̽̽̽̽̽̽̽̽̽x̽q̽j̽c̽\̽U̽N̽G̽@̽9̽2̽+̽$̽̽̽̽̽̽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽|˽u˽n˽g˽`˽Y˽R˽K˽D˽=˽6˽/˽(˽!˽˽˽ ˽˽ʽʽʽʽʽʽʽʽʽʽʽʽʽʽʽʽʽʽʽyʽrʽkʽdʽ]ʽVʽOʽHʽAʽ:ʽ3ʽ,ʽ%ʽʽʽʽ ʽʽɽɽɽɽɽɽɽɽɽɽɽɽɽɽɽɽɽɽ}ɽvɽoɽhɽaɽZɽSɽLɽEɽ>ɽ7ɽ0ɽ)ɽ"ɽɽɽ ɽɽȽȽȽȽȽȽȽȽȽȽȽȽȽȽȽȽȽȽȽzȽsȽlȽeȽ^ȽWȽPȽIȽBȽ;Ƚ4Ƚ-Ƚ&ȽȽȽȽ ȽȽǽǽǽǽǽǽǽǽǽǽǽǽǽǽǽǽǽǽ~ǽwǽpǽiǽbǽ[ǽTǽMǽFǽ?ǽ8ǽ1ǽ*ǽ#ǽǽǽǽǽǽƽƽƽƽƽƽƽƽƽƽƽƽƽƽƽƽƽƽ{ƽtƽmƽfƽ_ƽXƽQƽJƽCƽ<ƽ5ƽ.ƽ'ƽ ƽƽƽ ƽƽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽ|ĽuĽnĽgĽ`ĽYĽRĽKĽDĽ=Ľ6Ľ/Ľ(Ľ!ĽĽĽ ĽĽýýýýýýýýýýýýýýýýýýýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýý½½½½½½½½½½½½½½½½½½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½zsle^WPIB;4-& ~wpib[TMF?81*#뿽俽ݿֿϿȿ{tmf_XQJC<5.'  ᄑ辽᾽ھӾ̾žxqjc\UNG@92+$콽彽޽׽нɽ½|ung`YRKD=6/(! 鼽⼽ۼԼͼƼyrkd]VOHA:3,% 滽߻ػѻʻû}vohaZSLE>70)" 꺽㺽ܺպκǺzsle^WPIB;4-& 繽๽ٹҹ˹Ĺ~wpib[TMF?81*#븽丽ݸָϸȸ{tmf_XQJC<5.'  ﷽跽᷽ڷӷ̷ŷxqjc\UNG@92+$춽嶽޶׶жɶ¶|ung`YRKD=6/(! 鵽⵽۵Ե͵Ƶyrkd]VOHA:3,% 洽ߴشѴʴô}vohaZSLE>70)" 곽㳽ܳճγdzzsle^WPIB;4-& 粽ಽٲҲ˲IJ~wpib[TMF?81*#뱽䱽ݱֱϱȱ{tmf_XQJC<5.'  ﰽ谽᰽ڰӰ̰Űxqjc\UNG@92+$쯽寽ޯׯЯɯ¯|ung`YRKD=6/(! 鮽⮽ۮԮͮƮyrkd]VOHA:3,% 歽߭حѭʭí}vohaZSLE>70)" ꬽ㬽ܬլάǬzsle^WPIB;4-& 竽૽٫ҫ˫ī~wpib[TMF?81*#몽䪽ݪ֪ϪȪ{tmf_XQJC<5.'  墳詽᩽کө̩ũxqjc\UNG@92+$쨽娽ިרШɨ¨|ung`YRKD=6/(! 駽⧽ۧԧͧƧyrkd]VOHA:3,% 榽ߦئѦʦæ}vohaZSLE>70)" ꥽㥽ܥեΥǥzsle^WPIB;4-& 礽ऽ٤ҤˤĤ~wpib[TMF?81*#룽䣽ݣ֣ϣȣ{tmf_XQJC<5.'  袽ᢽڢӢ̢Ţxqjc\UNG@92+$졽塽ޡסСɡ¡|ung`YRKD=6/(! 頽⠽۠Ԡ͠Ơyrkd]VOHA:3,% ퟽柽ߟ؟џʟß}vohaZSLE>70)" ꞽ㞽ܞ՞ΞǞzsle^WPIB;4-& 睽ٝҝ˝ĝ~wpib[TMF?81*#뜽䜽ݜ֜ϜȜ{tmf_XQJC<5.'  蛽᛽ڛӛ̛śxqjc\UNG@92+$욽嚽ޚךКɚš|ung`YRKD=6/(! 陽♽ۙԙ͙ƙyrkd]VOHA:3,% 혽昽ߘؘјʘØ}vohaZSLE>70)" ꗽ㗽ܗ՗ΗǗzsle^WPIB;4-& 疽ٖҖ˖Ė~wpib[TMF?81*#땽䕽ݕ֕ϕȕ{tmf_XQJC<5.'  蔽ᔽڔӔ̔Ŕxqjc\UNG@92+$쓽哽ޓדГɓ“|ung`YRKD=6/(! 钽ⒽےԒ͒ƒyrkd]VOHA:3,% 푽摽ߑؑёʑÑ}vohaZSLE>70)" ꐽ㐽ܐՐΐǐzsle^WPIB;4-& 珽ُҏˏď~wpib[TMF?81*#뎽䎽ݎ֎ώȎ{tmf_XQJC<5.'  荽፽ڍӍ̍ōxqjc\UNG@92+$쌽匽ތ׌ЌɌŒ|ung`YRKD=6/(! 鋽⋽ۋԋ͋Ƌyrkd]VOHA:3,% 튽抽ߊ؊ъʊÊ}vohaZSLE>70)" ꉽ㉽܉ՉΉljzsle^WPIB;4-& 爽و҈ˈĈ~wpib[TMF?81*#뇽䇽݇ևχȇ{tmf_XQJC<5.'  膽ᆽچӆ̆ņxqjc\UNG@92+$셽兽ޅׅЅɅ…|ung`YRKD=6/(! 鄽ℽۄԄ̈́Ƅyrkd]VOHA:3,% 탽惽߃؃уʃÃ}vohaZSLE>70)" ꂽソ܂Ղ΂ǂzsle^WPIB;4-& 災فҁˁā~wpib[TMF?81*#뀽䀽݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#߼߼߼߼߼߼߼߼߼߼߼߼߼߼߼߼߼߼{߼t߼m߼f߼_߼X߼Q߼J߼C߼<߼5߼.߼'߼ ߼߼߼ ߼߼޼޼޼޼޼޼޼޼޼޼޼޼޼޼޼޼޼޼޼x޼q޼j޼c޼\޼U޼N޼G޼@޼9޼2޼+޼$޼޼޼޼޼޼ݼݼݼݼݼݼݼݼݼݼݼݼݼݼݼݼݼݼ|ݼuݼnݼgݼ`ݼYݼRݼKݼDݼ=ݼ6ݼ/ݼ(ݼ!ݼݼݼ ݼݼܼܼܼܼܼܼܼܼܼܼܼܼܼܼܼܼܼܼܼyܼrܼkܼdܼ]ܼVܼOܼHܼAܼ:ܼ3ܼ,ܼ%ܼܼܼܼ ܼܼۼۼۼۼۼۼۼۼۼۼۼۼۼۼۼۼۼۼ}ۼvۼoۼhۼaۼZۼSۼLۼEۼ>ۼ7ۼ0ۼ)ۼ"ۼۼۼ ۼۼڼڼڼڼڼڼڼڼڼڼڼڼڼڼڼڼڼڼڼzڼsڼlڼeڼ^ڼWڼPڼIڼBڼ;ڼ4ڼ-ڼ&ڼڼڼڼ ڼڼټټټټټټټټټټټټټټټټټټ~ټwټpټiټbټ[ټTټMټFټ?ټ8ټ1ټ*ټ#ټټټټټټؼؼؼؼؼؼؼؼؼؼؼؼؼؼؼؼؼؼ{ؼtؼmؼfؼ_ؼXؼQؼJؼCؼ<ؼ5ؼ.ؼ'ؼ ؼؼؼ ؼؼ׼׼׼׼׼׼׼׼׼׼׼׼׼׼׼׼׼׼׼x׼q׼j׼c׼\׼U׼N׼G׼@׼9׼2׼+׼$׼׼׼׼׼׼ּּּּּּּּּּּּּּּּּּ|ּuּnּgּ`ּYּRּKּDּ=ּ6ּ/ּ(ּ!ּּּ ּּռռռռռռռռռռռռռռռռռռռyռrռkռdռ]ռVռOռHռAռ:ռ3ռ,ռ%ռռռռ ռռԼԼԼԼԼԼԼԼԼԼԼԼԼԼԼԼԼԼ}ԼvԼoԼhԼaԼZԼSԼLԼEԼ>Լ7Լ0Լ)Լ"ԼԼԼ ԼԼӼӼӼӼӼӼӼӼӼӼӼӼӼӼӼӼӼӼӼzӼsӼlӼeӼ^ӼWӼPӼIӼBӼ;Ӽ4Ӽ-Ӽ&ӼӼӼӼ ӼӼҼҼҼҼҼҼҼҼҼҼҼҼҼҼҼҼҼҼ~ҼwҼpҼiҼbҼ[ҼTҼMҼFҼ?Ҽ8Ҽ1Ҽ*Ҽ#ҼҼҼҼҼҼѼѼѼѼѼѼѼѼѼѼѼѼѼѼѼѼѼѼ{ѼtѼmѼfѼ_ѼXѼQѼJѼCѼ<Ѽ5Ѽ.Ѽ'Ѽ ѼѼѼ ѼѼмммммммммммммммммммxмqмjмcм\мUмNмGм@м9м2м+м$ммммммϼϼϼϼϼϼϼϼϼϼϼϼϼϼϼϼϼϼ|ϼuϼnϼgϼ`ϼYϼRϼKϼDϼ=ϼ6ϼ/ϼ(ϼ!ϼϼϼ ϼϼμμμμμμμμμμμμμμμμμμμyμrμkμdμ]μVμOμHμAμ:μ3μ,μ%μμμμ μμͼͼͼͼͼͼͼͼͼͼͼͼͼͼͼͼͼͼ}ͼvͼoͼhͼaͼZͼSͼLͼEͼ>ͼ7ͼ0ͼ)ͼ"ͼͼͼ ͼͼ̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼z̼s̼l̼e̼^̼W̼P̼I̼B̼;̼4̼-̼&̼̼̼̼ ̼̼˼˼˼˼˼˼˼˼˼˼˼˼˼˼˼˼˼˼~˼w˼p˼i˼b˼[˼T˼M˼F˼?˼8˼1˼*˼#˼˼˼˼˼˼ʼʼʼʼʼʼʼʼʼʼʼʼʼʼʼʼʼʼ{ʼtʼmʼfʼ_ʼXʼQʼJʼCʼ<ʼ5ʼ.ʼ'ʼ ʼʼʼ ʼʼɼɼɼɼɼɼɼɼɼɼɼɼɼɼɼɼɼɼɼxɼqɼjɼcɼ\ɼUɼNɼGɼ@ɼ9ɼ2ɼ+ɼ$ɼɼɼɼɼɼȼȼȼȼȼȼȼȼȼȼȼȼȼȼȼȼȼȼ|ȼuȼnȼgȼ`ȼYȼRȼKȼDȼ=ȼ6ȼ/ȼ(ȼ!ȼȼȼ ȼȼǼǼǼǼǼǼǼǼǼǼǼǼǼǼǼǼǼǼǼyǼrǼkǼdǼ]ǼVǼOǼHǼAǼ:Ǽ3Ǽ,Ǽ%ǼǼǼǼ ǼǼƼƼƼƼƼƼƼƼƼƼƼƼƼƼƼƼƼƼ}ƼvƼoƼhƼaƼZƼSƼLƼEƼ>Ƽ7Ƽ0Ƽ)Ƽ"ƼƼƼ ƼƼżżżżżżżżżżżżżżżżżżżzżsżlżeż^żWżPżIżBż;ż4ż-ż&żżżż żżļļļļļļļļļļļļļļļļļļ~ļwļpļiļbļ[ļTļMļFļ?ļ8ļ1ļ*ļ#ļļļļļļüüüüüüüüüüüüüüüüüü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üü¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼x¼q¼j¼c¼\¼U¼N¼G¼@¼9¼2¼+¼$¼¼¼¼¼¼|ung`YRKD=6/(! yrkd]VOHA:3,% 濼߿ؿѿʿÿ}vohaZSLE>70)" 꾼㾼ܾվξǾzsle^WPIB;4-& 罼ོٽҽ˽Ľ~wpib[TMF?81*#뼼似ݼּϼȼ{tmf_XQJC<5.'  ﻼ軼Ỽڻӻ̻Żxqjc\UNG@92+$캼庼޺׺кɺº|ung`YRKD=6/(! 鹼⹼۹Թ͹ƹyrkd]VOHA:3,% 渼߸ظѸʸø}vohaZSLE>70)" 근㷼ܷշηǷzsle^WPIB;4-& 綼඼ٶҶ˶Ķ~wpib[TMF?81*#뵼䵼ݵֵϵȵ{tmf_XQJC<5.'  ﴼ贼ᴼڴӴ̴Ŵxqjc\UNG@92+$쳼峼޳׳гɳ³|ung`YRKD=6/(! 鲼Ⲽ۲ԲͲƲyrkd]VOHA:3,% 汼߱رѱʱñ}vohaZSLE>70)" 갼㰼ܰհΰǰzsle^WPIB;4-& 篼௼ٯү˯į~wpib[TMF?81*#뮼䮼ݮ֮ϮȮ{tmf_XQJC<5.'  ﭼ譼᭼ڭӭ̭ŭxqjc\UNG@92+$쬼嬼ެ׬Ьɬ¬|ung`YRKD=6/(! 髼⫼۫ԫͫƫyrkd]VOHA:3,% 檼ߪتѪʪê}vohaZSLE>70)" ꩼ㩼ܩթΩǩzsle^WPIB;4-& 稼਼٨Ҩ˨Ĩ~wpib[TMF?81*#맼䧼ݧ֧ϧȧ{tmf_XQJC<5.'  寮覼ᦼڦӦ̦Ŧxqjc\UNG@92+$쥼奼ޥץХɥ¥|ung`YRKD=6/(! 餼⤼ۤԤͤƤyrkd]VOHA:3,% 棼ߣأѣʣã}vohaZSLE>70)" ꢼ㢼ܢբ΢Ǣzsle^WPIB;4-& 硼ࡼ١ҡˡġ~wpib[TMF?81*#렼䠼ݠ֠ϠȠ{tmf_XQJC<5.'  蟼៼ڟӟ̟şxqjc\UNG@92+$잼垼ޞמОɞž|ung`YRKD=6/(! 靼❼۝ԝ͝Ɲyrkd]VOHA:3,% 휼朼ߜ؜ќʜÜ}vohaZSLE>70)" ꛼㛼ܛ՛ΛǛzsle^WPIB;4-& 皼ٚҚ˚Ě~wpib[TMF?81*#뙼䙼ݙ֙ϙș{tmf_XQJC<5.'  蘼ᘼژӘ̘Řxqjc\UNG@92+$염嗼ޗחЗɗ—|ung`YRKD=6/(! 閼▼ۖԖ͖Ɩyrkd]VOHA:3,% 핼敼ߕؕѕʕÕ}vohaZSLE>70)" ꔼ㔼ܔՔΔǔzsle^WPIB;4-& 瓼ٓғ˓ē~wpib[TMF?81*#뒼䒼ݒ֒ϒȒ{tmf_XQJC<5.'  葼ᑼڑӑ̑őxqjc\UNG@92+$쐼吼ސאАɐ|ung`YRKD=6/(! 鏼⏼ۏԏ͏Əyrkd]VOHA:3,% 펼掼ߎ؎юʎÎ}vohaZSLE>70)" ꍼ㍼܍Ս΍Ǎzsle^WPIB;4-& 猼ٌҌˌČ~wpib[TMF?81*#닼䋼݋֋ϋȋ{tmf_XQJC<5.'  芼ኼڊӊ̊Ŋxqjc\UNG@92+$쉼剼މ׉Љɉ‰|ung`YRKD=6/(! 鈼∼ۈԈ͈ƈyrkd]VOHA:3,% 퇼懼߇؇чʇÇ}vohaZSLE>70)" ꆼㆼ܆ՆΆdžzsle^WPIB;4-& 煼م҅˅ą~wpib[TMF?81*#넼䄼݄քτȄ{tmf_XQJC<5.'  胼ჼڃӃ̃Ńxqjc\UNG@92+$삼傼ނׂЂɂ‚|ung`YRKD=6/(! 遼⁼ہԁ́Ɓyrkd]VOHA:3,% 퀼怼߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻}߻v߻o߻h߻a߻Z߻S߻L߻E߻>߻7߻0߻)߻"߻߻߻ ߻߻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻z޻s޻l޻e޻^޻W޻P޻I޻B޻;޻4޻-޻&޻޻޻޻ ޻޻ݻݻݻݻݻݻݻݻݻݻݻݻݻݻݻݻݻݻ~ݻwݻpݻiݻbݻ[ݻTݻMݻFݻ?ݻ8ݻ1ݻ*ݻ#ݻݻݻݻݻݻܻܻܻܻܻܻܻܻܻܻܻܻܻܻܻܻܻܻ{ܻtܻmܻfܻ_ܻXܻQܻJܻCܻ<ܻ5ܻ.ܻ'ܻ ܻܻܻ ܻܻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻxۻqۻjۻcۻ\ۻUۻNۻGۻ@ۻ9ۻ2ۻ+ۻ$ۻۻۻۻۻۻڻڻڻڻڻڻڻڻڻڻڻڻڻڻڻڻڻڻ|ڻuڻnڻgڻ`ڻYڻRڻKڻDڻ=ڻ6ڻ/ڻ(ڻ!ڻڻڻ ڻڻٻٻٻٻٻٻٻٻٻٻٻٻٻٻٻٻٻٻٻyٻrٻkٻdٻ]ٻVٻOٻHٻAٻ:ٻ3ٻ,ٻ%ٻٻٻٻ ٻٻػػػػػػػػػػػػػػػػػػ}ػvػoػhػaػZػSػLػEػ>ػ7ػ0ػ)ػ"ػػػ ػػ׻׻׻׻׻׻׻׻׻׻׻׻׻׻׻׻׻׻׻z׻s׻l׻e׻^׻W׻P׻I׻B׻;׻4׻-׻&׻׻׻׻ ׻׻ֻֻֻֻֻֻֻֻֻֻֻֻֻֻֻֻֻֻ~ֻwֻpֻiֻbֻ[ֻTֻMֻFֻ?ֻ8ֻ1ֻ*ֻ#ֻֻֻֻֻֻջջջջջջջջջջջջջջջջջջ{ջtջmջfջ_ջXջQջJջCջ<ջ5ջ.ջ'ջ ջջջ ջջԻԻԻԻԻԻԻԻԻԻԻԻԻԻԻԻԻԻԻxԻqԻjԻcԻ\ԻUԻNԻGԻ@Ի9Ի2Ի+Ի$ԻԻԻԻԻԻӻӻӻӻӻӻӻӻӻӻӻӻӻӻӻӻӻӻ|ӻuӻnӻgӻ`ӻYӻRӻKӻDӻ=ӻ6ӻ/ӻ(ӻ!ӻӻӻ ӻӻһһһһһһһһһһһһһһһһһһһyһrһkһdһ]һVһOһHһAһ:һ3һ,һ%һһһһ һһѻѻѻѻѻѻѻѻѻѻѻѻѻѻѻѻѻѻ}ѻvѻoѻhѻaѻZѻSѻLѻEѻ>ѻ7ѻ0ѻ)ѻ"ѻѻѻ ѻѻлллллллллллллллллллzлsлlлeл^лWлPлIлBл;л4л-л&лллл ллϻϻϻϻϻϻϻϻϻϻϻϻϻϻϻϻϻϻ~ϻwϻpϻiϻbϻ[ϻTϻMϻFϻ?ϻ8ϻ1ϻ*ϻ#ϻϻϻϻϻϻλλλλλλλλλλλλλλλλλλ{λtλmλfλ_λXλQλJλCλ<λ5λ.λ'λ λλλ λλͻͻͻͻͻͻͻͻͻͻͻͻͻͻͻͻͻͻͻxͻqͻjͻcͻ\ͻUͻNͻGͻ@ͻ9ͻ2ͻ+ͻ$ͻͻͻͻͻͻ̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻|̻u̻n̻g̻`̻Y̻R̻K̻D̻=̻6̻/̻(̻!̻̻̻ ̻̻˻˻˻˻˻˻˻˻˻˻˻˻˻˻˻˻˻˻˻y˻r˻k˻d˻]˻V˻O˻H˻A˻:˻3˻,˻%˻˻˻˻ ˻˻ʻʻʻʻʻʻʻʻʻʻʻʻʻʻʻʻʻʻ}ʻvʻoʻhʻaʻZʻSʻLʻEʻ>ʻ7ʻ0ʻ)ʻ"ʻʻʻ ʻʻɻɻɻɻɻɻɻɻɻɻɻɻɻɻɻɻɻɻɻzɻsɻlɻeɻ^ɻWɻPɻIɻBɻ;ɻ4ɻ-ɻ&ɻɻɻɻ ɻɻȻȻȻȻȻȻȻȻȻȻȻȻȻȻȻȻȻȻ~ȻwȻpȻiȻbȻ[ȻTȻMȻFȻ?Ȼ8Ȼ1Ȼ*Ȼ#ȻȻȻȻȻȻǻǻǻǻǻǻǻǻǻǻǻǻǻǻǻǻǻǻ{ǻtǻmǻfǻ_ǻXǻQǻJǻCǻ<ǻ5ǻ.ǻ'ǻ ǻǻǻ ǻǻƻƻƻƻƻƻƻƻƻƻƻƻƻƻƻƻƻƻƻxƻqƻjƻcƻ\ƻUƻNƻGƻ@ƻ9ƻ2ƻ+ƻ$ƻƻƻƻƻƻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ|ŻuŻnŻgŻ`ŻYŻRŻKŻDŻ=Ż6Ż/Ż(Ż!ŻŻŻ ŻŻĻĻĻĻĻĻĻĻĻĻĻĻĻĻĻĻĻĻĻyĻrĻkĻdĻ]ĻVĻOĻHĻAĻ:Ļ3Ļ,Ļ%ĻĻĻĻ ĻĻûûûûûûûûûûûûûûûûûû}ûvûoûhûaûZûSûLûEû>û7û0û)û"ûûû ûû»»»»»»»»»»»»»»»»»»»z»s»l»e»^»W»P»I»B»;»4»-»&»»»» »»~wpib[TMF?81*#{tmf_XQJC<5.'  迻Ώڿӿ̿ſxqjc\UNG@92+$쾻徻޾׾оɾ¾|ung`YRKD=6/(! 齻⽻۽Խͽƽyrkd]VOHA:3,% 漻߼ؼѼʼü}vohaZSLE>70)" 껻㻻ܻջλǻzsle^WPIB;4-& 纻ົٺҺ˺ĺ~wpib[TMF?81*#빻乻ݹֹϹȹ{tmf_XQJC<5.'  ︻踻ḻڸӸ̸Ÿxqjc\UNG@92+$췻巻޷׷зɷ·|ung`YRKD=6/(! 鶻ⶻ۶ԶͶƶyrkd]VOHA:3,% 浻ߵصѵʵõ}vohaZSLE>70)" 괻㴻ܴմδǴzsle^WPIB;4-& 系೻ٳҳ˳ij~wpib[TMF?81*#벻䲻ݲֲϲȲ{tmf_XQJC<5.'  ﱻ豻ᱻڱӱ̱űxqjc\UNG@92+$찻尻ްװаɰ°|ung`YRKD=6/(! 鯻⯻ۯԯͯƯyrkd]VOHA:3,% 殻߮خѮʮî}vohaZSLE>70)" ꭻ㭻ܭխέǭzsle^WPIB;4-& 笻଻٬ҬˬĬ~wpib[TMF?81*#뫻䫻ݫ֫ϫȫ{tmf_XQJC<5.'  請誻᪻ڪӪ̪Ūxqjc\UNG@92+$쩻婻ީשЩɩ©|ung`YRKD=6/(! 騻⨻ۨԨͨƨyrkd]VOHA:3,% 槻ߧاѧʧç}vohaZSLE>70)" ꦻ㦻ܦզΦǦzsle^WPIB;4-& 祻ॻ٥ҥ˥ĥ~wpib[TMF?81*#뤻䤻ݤ֤ϤȤ{tmf_XQJC<5.'  裻᣻ڣӣ̣ţxqjc\UNG@92+$좻墻ޢעТɢ¢|ung`YRKD=6/(! 须⡻ۡԡ͡ơyrkd]VOHA:3,% 栻ߠؠѠʠà}vohaZSLE>70)" ꟻ㟻ܟ՟Οǟzsle^WPIB;4-& 瞻ٞҞ˞Ğ~wpib[TMF?81*#띻䝻ݝ֝ϝȝ{tmf_XQJC<5.'  蜻᜻ڜӜ̜Ŝxqjc\UNG@92+$웻囻ޛכЛɛ›|ung`YRKD=6/(! 隻⚻ۚԚ͚ƚyrkd]VOHA:3,% 홻晻ߙؙљʙÙ}vohaZSLE>70)" ꘻㘻ܘ՘Θǘzsle^WPIB;4-& 痻ٗҗ˗ė~wpib[TMF?81*#떻䖻ݖ֖ϖȖ{tmf_XQJC<5.'  蕻ᕻڕӕ̕ŕxqjc\UNG@92+$씻唻ޔהДɔ”|ung`YRKD=6/(! 铻⓻ۓԓ͓Ɠyrkd]VOHA:3,% 풻撻ߒؒђʒÒ}vohaZSLE>70)" ꑻ㑻ܑՑΑǑzsle^WPIB;4-& 琻ِҐːĐ~wpib[TMF?81*#돻䏻ݏ֏Ϗȏ{tmf_XQJC<5.'  莻Ꮋڎӎ̎Ŏxqjc\UNG@92+$썻卻ލ׍Ѝɍ|ung`YRKD=6/(! 錻⌻یԌ͌ƌyrkd]VOHA:3,% 틻拻ߋ؋ыʋË}vohaZSLE>70)" ꊻ㊻܊ՊΊNJzsle^WPIB;4-& 牻ى҉ˉĉ~wpib[TMF?81*#눻䈻݈ֈψȈ{tmf_XQJC<5.'  臻ᇻڇӇ̇Ňxqjc\UNG@92+$솻冻ކ׆ІɆ†|ung`YRKD=6/(! 酻ⅻۅԅͅƅyrkd]VOHA:3,% 턻愻߄؄фʄÄ}vohaZSLE>70)" ꃻ・܃Ճ΃ǃzsle^WPIB;4-& 炻ق҂˂Ă~wpib[TMF?81*#끻䁻݁ցρȁ{tmf_XQJC<5.'  耻ျڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺxߺqߺjߺcߺ\ߺUߺNߺGߺ@ߺ9ߺ2ߺ+ߺ$ߺߺߺߺߺߺ޺޺޺޺޺޺޺޺޺޺޺޺޺޺޺޺޺޺|޺u޺n޺g޺`޺Y޺R޺K޺D޺=޺6޺/޺(޺!޺޺޺ ޺޺ݺݺݺݺݺݺݺݺݺݺݺݺݺݺݺݺݺݺݺyݺrݺkݺdݺ]ݺVݺOݺHݺAݺ:ݺ3ݺ,ݺ%ݺݺݺݺ ݺݺܺܺܺܺܺܺܺܺܺܺܺܺܺܺܺܺܺܺ}ܺvܺoܺhܺaܺZܺSܺLܺEܺ>ܺ7ܺ0ܺ)ܺ"ܺܺܺ ܺܺۺۺۺۺۺۺۺۺۺۺۺۺۺۺۺۺۺۺۺzۺsۺlۺeۺ^ۺWۺPۺIۺBۺ;ۺ4ۺ-ۺ&ۺۺۺۺ ۺۺںںںںںںںںںںںںںںںںںں~ںwںpںiںbں[ںTںMںFں?ں8ں1ں*ں#ںںںںںںٺٺٺٺٺٺٺٺٺٺٺٺٺٺٺٺٺٺ{ٺtٺmٺfٺ_ٺXٺQٺJٺCٺ<ٺ5ٺ.ٺ'ٺ ٺٺٺ ٺٺغغغغغغغغغغغغغغغغغغغxغqغjغcغ\غUغNغGغ@غ9غ2غ+غ$غغغغغغ׺׺׺׺׺׺׺׺׺׺׺׺׺׺׺׺׺׺|׺u׺n׺g׺`׺Y׺R׺K׺D׺=׺6׺/׺(׺!׺׺׺ ׺׺ֺֺֺֺֺֺֺֺֺֺֺֺֺֺֺֺֺֺֺyֺrֺkֺdֺ]ֺVֺOֺHֺAֺ:ֺ3ֺ,ֺ%ֺֺֺֺ ֺֺպպպպպպպպպպպպպպպպպպ}պvպoպhպaպZպSպLպEպ>պ7պ0պ)պ"պպպ պպԺԺԺԺԺԺԺԺԺԺԺԺԺԺԺԺԺԺԺzԺsԺlԺeԺ^ԺWԺPԺIԺBԺ;Ժ4Ժ-Ժ&ԺԺԺԺ ԺԺӺӺӺӺӺӺӺӺӺӺӺӺӺӺӺӺӺӺ~ӺwӺpӺiӺbӺ[ӺTӺMӺFӺ?Ӻ8Ӻ1Ӻ*Ӻ#ӺӺӺӺӺӺҺҺҺҺҺҺҺҺҺҺҺҺҺҺҺҺҺҺ{ҺtҺmҺfҺ_ҺXҺQҺJҺCҺ<Һ5Һ.Һ'Һ ҺҺҺ ҺҺѺѺѺѺѺѺѺѺѺѺѺѺѺѺѺѺѺѺѺxѺqѺjѺcѺ\ѺUѺNѺGѺ@Ѻ9Ѻ2Ѻ+Ѻ$ѺѺѺѺѺѺкккккккккккккккккк|кuкnкgк`кYкRкKкDк=к6к/к(к!ккк ккϺϺϺϺϺϺϺϺϺϺϺϺϺϺϺϺϺϺϺyϺrϺkϺdϺ]ϺVϺOϺHϺAϺ:Ϻ3Ϻ,Ϻ%ϺϺϺϺ ϺϺκκκκκκκκκκκκκκκκκκ}κvκoκhκaκZκSκLκEκ>κ7κ0κ)κ"κκκ κκͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺzͺsͺlͺeͺ^ͺWͺPͺIͺBͺ;ͺ4ͺ-ͺ&ͺͺͺͺ ͺͺ̺̺̺̺̺̺̺̺̺̺̺̺̺̺̺̺̺̺~̺w̺p̺i̺b̺[̺T̺M̺F̺?̺8̺1̺*̺#̺̺̺̺̺̺˺˺˺˺˺˺˺˺˺˺˺˺˺˺˺˺˺˺{˺t˺m˺f˺_˺X˺Q˺J˺C˺<˺5˺.˺'˺ ˺˺˺ ˺˺ʺʺʺʺʺʺʺʺʺʺʺʺʺʺʺʺʺʺʺxʺqʺjʺcʺ\ʺUʺNʺGʺ@ʺ9ʺ2ʺ+ʺ$ʺʺʺʺʺʺɺɺɺɺɺɺɺɺɺɺɺɺɺɺɺɺɺɺ|ɺuɺnɺgɺ`ɺYɺRɺKɺDɺ=ɺ6ɺ/ɺ(ɺ!ɺɺɺ ɺɺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺyȺrȺkȺdȺ]ȺVȺOȺHȺAȺ:Ⱥ3Ⱥ,Ⱥ%ȺȺȺȺ ȺȺǺǺǺǺǺǺǺǺǺǺǺǺǺǺǺǺǺǺ}ǺvǺoǺhǺaǺZǺSǺLǺEǺ>Ǻ7Ǻ0Ǻ)Ǻ"ǺǺǺ ǺǺƺƺƺƺƺƺƺƺƺƺƺƺƺƺƺƺƺƺƺzƺsƺlƺeƺ^ƺWƺPƺIƺBƺ;ƺ4ƺ-ƺ&ƺƺƺƺ ƺƺźźźźźźźźźźźźźźźźźź~źwźpźiźbź[źTźMźFź?ź8ź1ź*ź#źźźźźźĺĺĺĺĺĺĺĺĺĺĺĺĺĺĺĺĺĺ{ĺtĺmĺfĺ_ĺXĺQĺJĺCĺ<ĺ5ĺ.ĺ'ĺ ĺĺĺ ĺĺúúúúúúúúúúúúúúúúúúúxúqújúcú\úUúNúGú@ú9ú2ú+ú$úúúúúúºººººººººººººººººº|ºuºnºgº`ºYºRºKºDº=º6º/º(º!ººº ººyrkd]VOHA:3,% }vohaZSLE>70)" 꿺㿺ܿտοǿzsle^WPIB;4-& 羺ྺپҾ˾ľ~wpib[TMF?81*#뽺佺ݽֽϽȽ{tmf_XQJC<5.'  Z輺ἺڼӼ̼żxqjc\UNG@92+$컺建޻׻лɻ»|ung`YRKD=6/(! 麺⺺ۺԺͺƺyrkd]VOHA:3,% 湺߹عѹʹù}vohaZSLE>70)" 긺㸺ܸոθǸzsle^WPIB;4-& 緺෺ٷҷ˷ķ~wpib[TMF?81*#붺䶺ݶֶ϶ȶ{tmf_XQJC<5.'  ﵺ赺ᵺڵӵ̵ŵxqjc\UNG@92+$촺崺޴״дɴ´|ung`YRKD=6/(! 鳺⳺۳ԳͳƳyrkd]VOHA:3,% 沺߲زѲʲò}vohaZSLE>70)" 걺㱺ܱձαDZzsle^WPIB;4-& 簺఺ٰҰ˰İ~wpib[TMF?81*#믺䯺ݯ֯ϯȯ{tmf_XQJC<5.'  ﮺论ᮺڮӮ̮Ůxqjc\UNG@92+$쭺孺ޭ׭Эɭ­|ung`YRKD=6/(! 鬺⬺۬ԬͬƬyrkd]VOHA:3,% 櫺߫ثѫʫë}vohaZSLE>70)" ꪺ㪺ܪժΪǪzsle^WPIB;4-& 空੺٩ҩ˩ĩ~wpib[TMF?81*#먺䨺ݨ֨ϨȨ{tmf_XQJC<5.'  狀觺᧺ڧӧ̧ŧxqjc\UNG@92+$즺妺ަצЦɦ¦|ung`YRKD=6/(! 饺⥺ۥԥͥƥyrkd]VOHA:3,% 椺ߤؤѤʤä}vohaZSLE>70)" ꣺㣺ܣգΣǣzsle^WPIB;4-& 確ࢺ٢ҢˢĢ~wpib[TMF?81*#롺䡺ݡ֡ϡȡ{tmf_XQJC<5.'  蠺ᠺڠӠ̠Šxqjc\UNG@92+$쟺基ޟןПɟŸ|ung`YRKD=6/(! 鞺➺۞Ԟ͞ƞyrkd]VOHA:3,% 흺杺ߝ؝ѝʝÝ}vohaZSLE>70)" Ꜻ㜺ܜ՜Μǜzsle^WPIB;4-& 盺ٛқ˛ě~wpib[TMF?81*#뚺䚺ݚ֚ϚȚ{tmf_XQJC<5.'  虺ᙺڙә̙řxqjc\UNG@92+$옺嘺ޘטИɘ˜|ung`YRKD=6/(! 闺◺ۗԗ͗Ɨyrkd]VOHA:3,% 햺斺ߖؖіʖÖ}vohaZSLE>70)" ꕺ㕺ܕՕΕǕzsle^WPIB;4-& 町ٔҔ˔Ĕ~wpib[TMF?81*#듺䓺ݓ֓ϓȓ{tmf_XQJC<5.'  蒺ᒺڒӒ̒Œxqjc\UNG@92+$쑺呺ޑבБɑ‘|ung`YRKD=6/(! 鐺␺ېԐ͐Ɛyrkd]VOHA:3,% 폺揺ߏ؏яʏÏ}vohaZSLE>70)" ꎺ㎺܎ՎΎǎzsle^WPIB;4-& 獺ٍҍˍč~wpib[TMF?81*#댺䌺݌֌όȌ{tmf_XQJC<5.'  苺ዺڋӋ̋ŋxqjc\UNG@92+$슺劺ފ׊ЊɊŠ|ung`YRKD=6/(! 鉺≺ۉԉ͉Ɖyrkd]VOHA:3,% 툺戺߈؈шʈÈ}vohaZSLE>70)" ꇺㇺ܇Շ·LJzsle^WPIB;4-& 熺ن҆ˆĆ~wpib[TMF?81*#녺䅺݅օυȅ{tmf_XQJC<5.'  脺ᄺڄӄ̄ńxqjc\UNG@92+$샺僺ރ׃ЃɃƒ|ung`YRKD=6/(! 邺₺ۂԂ͂Ƃyrkd]VOHA:3,% 큺恺߁؁сʁÁ}vohaZSLE>70)" ꀺ〺܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹z߹s߹l߹e߹^߹W߹P߹I߹B߹;߹4߹-߹&߹߹߹߹ ߹߹޹޹޹޹޹޹޹޹޹޹޹޹޹޹޹޹޹޹~޹w޹p޹i޹b޹[޹T޹M޹F޹?޹8޹1޹*޹#޹޹޹޹޹޹ݹݹݹݹݹݹݹݹݹݹݹݹݹݹݹݹݹݹ{ݹtݹmݹfݹ_ݹXݹQݹJݹCݹ<ݹ5ݹ.ݹ'ݹ ݹݹݹ ݹݹܹܹܹܹܹܹܹܹܹܹܹܹܹܹܹܹܹܹܹxܹqܹjܹcܹ\ܹUܹNܹGܹ@ܹ9ܹ2ܹ+ܹ$ܹܹܹܹܹܹ۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹|۹u۹n۹g۹`۹Y۹R۹K۹D۹=۹6۹/۹(۹!۹۹۹ ۹۹ڹڹڹڹڹڹڹڹڹڹڹڹڹڹڹڹڹڹڹyڹrڹkڹdڹ]ڹVڹOڹHڹAڹ:ڹ3ڹ,ڹ%ڹڹڹڹ ڹڹٹٹٹٹٹٹٹٹٹٹٹٹٹٹٹٹٹٹ}ٹvٹoٹhٹaٹZٹSٹLٹEٹ>ٹ7ٹ0ٹ)ٹ"ٹٹٹ ٹٹعععععععععععععععععععzعsعlعeع^عWعPعIعBع;ع4ع-ع&عععع عع׹׹׹׹׹׹׹׹׹׹׹׹׹׹׹׹׹׹~׹w׹p׹i׹b׹[׹T׹M׹F׹?׹8׹1׹*׹#׹׹׹׹׹׹ֹֹֹֹֹֹֹֹֹֹֹֹֹֹֹֹֹֹ{ֹtֹmֹfֹ_ֹXֹQֹJֹCֹ<ֹ5ֹ.ֹ'ֹ ֹֹֹ ֹֹչչչչչչչչչչչչչչչչչչչxչqչjչcչ\չUչNչGչ@չ9չ2չ+չ$չչչչչչԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹ|ԹuԹnԹgԹ`ԹYԹRԹKԹDԹ=Թ6Թ/Թ(Թ!ԹԹԹ ԹԹӹӹӹӹӹӹӹӹӹӹӹӹӹӹӹӹӹӹӹyӹrӹkӹdӹ]ӹVӹOӹHӹAӹ:ӹ3ӹ,ӹ%ӹӹӹӹ ӹӹҹҹҹҹҹҹҹҹҹҹҹҹҹҹҹҹҹҹ}ҹvҹoҹhҹaҹZҹSҹLҹEҹ>ҹ7ҹ0ҹ)ҹ"ҹҹҹ ҹҹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹzѹsѹlѹeѹ^ѹWѹPѹIѹBѹ;ѹ4ѹ-ѹ&ѹѹѹѹ ѹѹйййййййййййййййййй~йwйpйiйbй[йTйMйFй?й8й1й*й#ййййййϹϹϹϹϹϹϹϹϹϹϹϹϹϹϹϹϹϹ{ϹtϹmϹfϹ_ϹXϹQϹJϹCϹ<Ϲ5Ϲ.Ϲ'Ϲ ϹϹϹ ϹϹιιιιιιιιιιιιιιιιιιιxιqιjιcι\ιUιNιGι@ι9ι2ι+ι$ιιιιιι͹͹͹͹͹͹͹͹͹͹͹͹͹͹͹͹͹͹|͹u͹n͹g͹`͹Y͹R͹K͹D͹=͹6͹/͹(͹!͹͹͹ ͹͹̹̹̹̹̹̹̹̹̹̹̹̹̹̹̹̹̹̹̹y̹r̹k̹d̹]̹V̹O̹H̹A̹:̹3̹,̹%̹̹̹̹ ̹̹˹˹˹˹˹˹˹˹˹˹˹˹˹˹˹˹˹˹}˹v˹o˹h˹a˹Z˹S˹L˹E˹>˹7˹0˹)˹"˹˹˹ ˹˹ʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹzʹsʹlʹeʹ^ʹWʹPʹIʹBʹ;ʹ4ʹ-ʹ&ʹʹʹʹ ʹʹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹ~ɹwɹpɹiɹbɹ[ɹTɹMɹFɹ?ɹ8ɹ1ɹ*ɹ#ɹɹɹɹɹɹȹȹȹȹȹȹȹȹȹȹȹȹȹȹȹȹȹȹ{ȹtȹmȹfȹ_ȹXȹQȹJȹCȹ<ȹ5ȹ.ȹ'ȹ ȹȹȹ ȹȹǹǹǹǹǹǹǹǹǹǹǹǹǹǹǹǹǹǹǹxǹqǹjǹcǹ\ǹUǹNǹGǹ@ǹ9ǹ2ǹ+ǹ$ǹǹǹǹǹǹƹƹƹƹƹƹƹƹƹƹƹƹƹƹƹƹƹƹ|ƹuƹnƹgƹ`ƹYƹRƹKƹDƹ=ƹ6ƹ/ƹ(ƹ!ƹƹƹ ƹƹŹŹŹŹŹŹŹŹŹŹŹŹŹŹŹŹŹŹŹyŹrŹkŹdŹ]ŹVŹOŹHŹAŹ:Ź3Ź,Ź%ŹŹŹŹ ŹŹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹ}ĹvĹoĹhĹaĹZĹSĹLĹEĹ>Ĺ7Ĺ0Ĺ)Ĺ"ĹĹĹ ĹĹùùùùùùùùùùùùùùùùùùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùù¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹{tmf_XQJC<5.'  xqjc\UNG@92+$쿹忹޿׿пɿ¿|ung`YRKD=6/(! 龹⾹۾Ծ;ƾyrkd]VOHA:3,% 潹߽ؽѽʽý}vohaZSLE>70)" 꼹㼹ܼռμǼzsle^WPIB;4-& 绹໹ٻһ˻Ļ~wpib[TMF?81*#뺹亹ݺֺϺȺ{tmf_XQJC<5.'  ﹹ蹹ṹڹӹ̹Źxqjc\UNG@92+$츹帹޸׸иɸ¸|ung`YRKD=6/(! 鷹ⷹ۷ԷͷƷyrkd]VOHA:3,% 涹߶ضѶʶö}vohaZSLE>70)" 굹㵹ܵյεǵzsle^WPIB;4-& 紹ഹٴҴ˴Ĵ~wpib[TMF?81*#볹䳹ݳֳϳȳ{tmf_XQJC<5.'  ﲹ貹ᲹڲӲ̲Ųxqjc\UNG@92+$챹屹ޱױбɱ±|ung`YRKD=6/(! 鰹ⰹ۰԰Ͱưyrkd]VOHA:3,% 毹߯دѯʯï}vohaZSLE>70)" ꮹ㮹ܮծήǮzsle^WPIB;4-& 筹୹٭ҭ˭ĭ~wpib[TMF?81*#묹䬹ݬ֬ϬȬ{tmf_XQJC<5.'  﫹諹᫹ګӫ̫ūxqjc\UNG@92+$쪹媹ުתЪɪª|ung`YRKD=6/(! 驹⩹۩ԩͩƩyrkd]VOHA:3,% 樹ߨبѨʨè}vohaZSLE>70)" ꧹㧹ܧէΧǧzsle^WPIB;4-& 禹হ٦Ҧ˦Ħ~wpib[TMF?81*#륹䥹ݥ֥ϥȥ{tmf_XQJC<5.'  魯褹᤹ڤӤ̤Ťxqjc\UNG@92+$죹壹ޣףУɣ£|ung`YRKD=6/(! 颹⢹ۢԢ͢Ƣyrkd]VOHA:3,% 桹ߡءѡʡá}vohaZSLE>70)" ꠹㠹ܠՠΠǠzsle^WPIB;4-& 矹ٟҟ˟ğ~wpib[TMF?81*#랹䞹ݞ֞ϞȞ{tmf_XQJC<5.'  蝹᝹ڝӝ̝ŝxqjc\UNG@92+$윹圹ޜלМɜœ|ung`YRKD=6/(! 雹⛹ۛԛ͛ƛyrkd]VOHA:3,% 횹暹ߚؚњʚÚ}vohaZSLE>70)" ꙹ㙹ܙՙΙǙzsle^WPIB;4-& 瘹٘Ҙ˘Ę~wpib[TMF?81*#뗹䗹ݗ֗ϗȗ{tmf_XQJC<5.'  薹ᖹږӖ̖Ŗxqjc\UNG@92+$앹啹ޕוЕɕ•|ung`YRKD=6/(! 锹┹۔Ԕ͔Ɣyrkd]VOHA:3,% 퓹擹ߓؓѓʓÓ}vohaZSLE>70)" ꒹㒹ܒՒΒǒzsle^WPIB;4-& 瑹ّґˑđ~wpib[TMF?81*#됹䐹ݐ֐ϐȐ{tmf_XQJC<5.'  菹ᏹڏӏ̏ŏxqjc\UNG@92+$쎹厹ގ׎ЎɎŽ|ung`YRKD=6/(! 鍹⍹ۍԍ͍ƍyrkd]VOHA:3,% 팹挹ߌ،ьʌÌ}vohaZSLE>70)" ꋹ㋹܋Ջ΋Njzsle^WPIB;4-& 犹يҊˊĊ~wpib[TMF?81*#뉹䉹݉։ωȉ{tmf_XQJC<5.'  船ሹڈӈ̈ňxqjc\UNG@92+$쇹凹އׇЇɇ‡|ung`YRKD=6/(! 醹↹ۆԆ͆Ɔyrkd]VOHA:3,% 텹慹߅؅хʅÅ}vohaZSLE>70)" ꄹㄹ܄Մ΄DŽzsle^WPIB;4-& 烹ك҃˃ă~wpib[TMF?81*#낹䂹݂ւςȂ{tmf_XQJC<5.'  聹ၹځӁ́Łxqjc\UNG@92+$쀹倹ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$߸߸߸߸߸߸߸߸߸߸߸߸߸߸߸߸߸߸|߸u߸n߸g߸`߸Y߸R߸K߸D߸=߸6߸/߸(߸!߸߸߸ ߸߸޸޸޸޸޸޸޸޸޸޸޸޸޸޸޸޸޸޸޸y޸r޸k޸d޸]޸V޸O޸H޸A޸:޸3޸,޸%޸޸޸޸ ޸޸ݸݸݸݸݸݸݸݸݸݸݸݸݸݸݸݸݸݸ}ݸvݸoݸhݸaݸZݸSݸLݸEݸ>ݸ7ݸ0ݸ)ݸ"ݸݸݸ ݸݸܸܸܸܸܸܸܸܸܸܸܸܸܸܸܸܸܸܸܸzܸsܸlܸeܸ^ܸWܸPܸIܸBܸ;ܸ4ܸ-ܸ&ܸܸܸܸ ܸܸ۸۸۸۸۸۸۸۸۸۸۸۸۸۸۸۸۸۸~۸w۸p۸i۸b۸[۸T۸M۸F۸?۸8۸1۸*۸#۸۸۸۸۸۸ڸڸڸڸڸڸڸڸڸڸڸڸڸڸڸڸڸڸ{ڸtڸmڸfڸ_ڸXڸQڸJڸCڸ<ڸ5ڸ.ڸ'ڸ ڸڸڸ ڸڸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸxٸqٸjٸcٸ\ٸUٸNٸGٸ@ٸ9ٸ2ٸ+ٸ$ٸٸٸٸٸٸظظظظظظظظظظظظظظظظظظ|ظuظnظgظ`ظYظRظKظDظ=ظ6ظ/ظ(ظ!ظظظ ظظ׸׸׸׸׸׸׸׸׸׸׸׸׸׸׸׸׸׸׸y׸r׸k׸d׸]׸V׸O׸H׸A׸:׸3׸,׸%׸׸׸׸ ׸׸ָָָָָָָָָָָָָָָָָָ}ָvָoָhָaָZָSָLָEָ>ָ7ָ0ָ)ָ"ָָָ ָָոոոոոոոոոոոոոոոոոոոzոsոlոeո^ոWոPոIոBո;ո4ո-ո&ոոոո ոոԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸ~ԸwԸpԸiԸbԸ[ԸTԸMԸFԸ?Ը8Ը1Ը*Ը#ԸԸԸԸԸԸӸӸӸӸӸӸӸӸӸӸӸӸӸӸӸӸӸӸ{ӸtӸmӸfӸ_ӸXӸQӸJӸCӸ<Ӹ5Ӹ.Ӹ'Ӹ ӸӸӸ ӸӸҸҸҸҸҸҸҸҸҸҸҸҸҸҸҸҸҸҸҸxҸqҸjҸcҸ\ҸUҸNҸGҸ@Ҹ9Ҹ2Ҹ+Ҹ$ҸҸҸҸҸҸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸ|ѸuѸnѸgѸ`ѸYѸRѸKѸDѸ=Ѹ6Ѹ/Ѹ(Ѹ!ѸѸѸ ѸѸиииииииииииииииииииyиrиkиdи]иVиOиHиAи:и3и,и%ииии ииϸϸϸϸϸϸϸϸϸϸϸϸϸϸϸϸϸϸ}ϸvϸoϸhϸaϸZϸSϸLϸEϸ>ϸ7ϸ0ϸ)ϸ"ϸϸϸ ϸϸθθθθθθθθθθθθθθθθθθθzθsθlθeθ^θWθPθIθBθ;θ4θ-θ&θθθθ θθ͸͸͸͸͸͸͸͸͸͸͸͸͸͸͸͸͸͸~͸w͸p͸i͸b͸[͸T͸M͸F͸?͸8͸1͸*͸#͸͸͸͸͸͸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸{̸t̸m̸f̸_̸X̸Q̸J̸C̸≮5̸.̸'̸ ̸̸̸ ̸̸˸˸˸˸˸˸˸˸˸˸˸˸˸˸˸˸˸˸˸x˸q˸j˸c˸\˸U˸N˸G˸@˸9˸2˸+˸$˸˸˸˸˸˸ʸʸʸʸʸʸʸʸʸʸʸʸʸʸʸʸʸʸ|ʸuʸnʸgʸ`ʸYʸRʸKʸDʸ=ʸ6ʸ/ʸ(ʸ!ʸʸʸ ʸʸɸɸɸɸɸɸɸɸɸɸɸɸɸɸɸɸɸɸɸyɸrɸkɸdɸ]ɸVɸOɸHɸAɸ:ɸ3ɸ,ɸ%ɸɸɸɸ ɸɸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸ}ȸvȸoȸhȸaȸZȸSȸLȸEȸ>ȸ7ȸ0ȸ)ȸ"ȸȸȸ ȸȸǸǸǸǸǸǸǸǸǸǸǸǸǸǸǸǸǸǸǸzǸsǸlǸeǸ^ǸWǸPǸIǸBǸ;Ǹ4Ǹ-Ǹ&ǸǸǸǸ ǸǸƸƸƸƸƸƸƸƸƸƸƸƸƸƸƸƸƸƸ~ƸwƸpƸiƸbƸ[ƸTƸMƸFƸ?Ƹ8Ƹ1Ƹ*Ƹ#ƸƸƸƸƸƸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸxĸqĸjĸcĸ\ĸUĸNĸGĸ@ĸ9ĸ2ĸ+ĸ$ĸĸĸĸĸĸøøøøøøøøøøøøøøøøøø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øø¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸}vohaZSLE>70)" zsle^WPIB;4-& 翸࿸ٿҿ˿Ŀ~wpib[TMF?81*#뾸侸ݾ־ϾȾ{tmf_XQJC<5.'  ク轸ὸڽӽ̽Žxqjc\UNG@92+$켸弸޼׼мɼ¼|ung`YRKD=6/(! 黸⻸ۻԻͻƻyrkd]VOHA:3,% 溸ߺغѺʺú}vohaZSLE>70)" 깸㹸ܹչιǹzsle^WPIB;4-& 縸ุٸҸ˸ĸ~wpib[TMF?81*#뷸䷸ݷַϷȷ{tmf_XQJC<5.'  ﶸ趸ᶸڶӶ̶Ŷxqjc\UNG@92+$쵸嵸޵׵еɵµ|ung`YRKD=6/(! 鴸ⴸ۴Դʹƴyrkd]VOHA:3,% 泸߳سѳʳó}vohaZSLE>70)" 겸㲸ܲղβDzzsle^WPIB;4-& 籸౸ٱұ˱ı~wpib[TMF?81*#밸䰸ݰְϰȰ{tmf_XQJC<5.'  ﯸ诸᯸گӯ̯ůxqjc\UNG@92+$쮸宸ޮ׮Юɮ®|ung`YRKD=6/(! 魸⭸ۭԭͭƭyrkd]VOHA:3,% 欸߬جѬʬì}vohaZSLE>70)" ꫸㫸ܫիΫǫzsle^WPIB;4-& 窸સ٪Ҫ˪Ī~wpib[TMF?81*#멸䩸ݩ֩ϩȩ{tmf_XQJC<5.'  器訸ᨸڨӨ̨Ũxqjc\UNG@92+$째姸ާקЧɧ§|ung`YRKD=6/(! 馸⦸ۦԦͦƦyrkd]VOHA:3,% 楸ߥإѥʥå}vohaZSLE>70)" ꤸ㤸ܤդΤǤzsle^WPIB;4-& 磸ࣸ٣ңˣģ~wpib[TMF?81*#뢸䢸ݢ֢ϢȢ{tmf_XQJC<5.'  衸ᡸڡӡ̡šxqjc\UNG@92+$져堸ޠנРɠ |ung`YRKD=6/(! 韸⟸۟ԟ͟Ɵyrkd]VOHA:3,% ힸ枸ߞ؞ўʞÞ}vohaZSLE>70)" ꝸ㝸ܝ՝Νǝzsle^WPIB;4-& 眸ٜҜ˜Ĝ~wpib[TMF?81*#뛸䛸ݛ֛ϛț{tmf_XQJC<5.'  蚸ᚸښӚ̚Śxqjc\UNG@92+$외噸ޙיЙə™|ung`YRKD=6/(! 阸☸ۘԘ͘Ƙyrkd]VOHA:3,% 헸旸ߗؗїʗ×}vohaZSLE>70)" ꖸ㖸ܖՖΖǖzsle^WPIB;4-& 畸ٕҕ˕ĕ~wpib[TMF?81*#딸䔸ݔ֔ϔȔ{tmf_XQJC<5.'  蓸ᓸړӓ̓œxqjc\UNG@92+$쒸咸ޒגВɒ’|ung`YRKD=6/(! 鑸⑸ۑԑ͑Ƒyrkd]VOHA:3,% 퐸搸ߐؐѐʐÐ}vohaZSLE>70)" ꏸ㏸܏ՏΏǏzsle^WPIB;4-& 玸َҎˎĎ~wpib[TMF?81*#델䍸ݍ֍ύȍ{tmf_XQJC<5.'  茸ጸڌӌ̌Ōxqjc\UNG@92+$싸勸ދ׋Ћɋ‹|ung`YRKD=6/(! 銸⊸ۊԊ͊Ɗyrkd]VOHA:3,% 퉸扸߉؉щʉÉ}vohaZSLE>70)" ꈸ㈸܈ՈΈLjzsle^WPIB;4-& 燸ه҇ˇć~wpib[TMF?81*#놸䆸݆ֆφȆ{tmf_XQJC<5.'  腸ᅸڅӅ̅Ņxqjc\UNG@92+$세儸ބׄЄɄ„|ung`YRKD=6/(! 郸⃸ۃԃ̓ƃyrkd]VOHA:3,% 킸悸߂؂тʂÂ}vohaZSLE>70)" ꁸへ܁Ձ΁ǁzsle^WPIB;4-& 瀸ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ߷߷߷߷߷߷߷߷߷߷߷߷߷߷߷߷߷߷~߷w߷p߷i߷b߷[߷T߷M߷F߷?߷8߷1߷*߷#߷߷߷߷߷߷޷޷޷޷޷޷޷޷޷޷޷޷޷޷޷޷޷޷{޷t޷m޷f޷_޷X޷Q޷J޷C޷<޷5޷.޷'޷ ޷޷޷ ޷޷ݷݷݷݷݷݷݷݷݷݷݷݷݷݷݷݷݷݷݷxݷqݷjݷcݷ\ݷUݷNݷGݷ@ݷ9ݷ2ݷ+ݷ$ݷݷݷݷݷݷܷܷܷܷܷܷܷܷܷܷܷܷܷܷܷܷܷܷ|ܷuܷnܷgܷ`ܷYܷRܷKܷDܷ=ܷ6ܷ/ܷ(ܷ!ܷܷܷ ܷܷ۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷y۷r۷k۷d۷]۷V۷O۷H۷A۷:۷3۷,۷%۷۷۷۷ ۷۷ڷڷڷڷڷڷڷڷڷڷڷڷڷڷڷڷڷڷ}ڷvڷoڷhڷaڷZڷSڷLڷEڷ>ڷ7ڷ0ڷ)ڷ"ڷڷڷ ڷڷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷzٷsٷlٷeٷ^ٷWٷPٷIٷBٷ;ٷ4ٷ-ٷ&ٷٷٷٷ ٷٷطططططططططططططططططط~طwطpطiطbط[طTطMطFط?ط8ط1ط*ط#طططططط׷׷׷׷׷׷׷׷׷׷׷׷׷׷׷׷׷׷{׷t׷m׷f׷_׷X׷Q׷J׷C׷<׷5׷.׷'׷ ׷׷׷ ׷׷ַַַַַַַַַַַַַַַַַַַxַqַjַcַ\ַUַNַGַ@ַ9ַ2ַ+ַ$ַַַַַַշշշշշշշշշշշշշշշշշշ|շuշnշgշ`շYշRշKշDշ=շ6շ/շ(շ!շշշ շշԷԷԷԷԷԷԷԷԷԷԷԷԷԷԷԷԷԷԷyԷrԷkԷdԷ]ԷVԷOԷHԷAԷ:Է3Է,Է%ԷԷԷԷ ԷԷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷ}ӷvӷoӷhӷaӷZӷSӷLӷEӷ>ӷ7ӷ0ӷ)ӷ"ӷӷӷ ӷӷҷҷҷҷҷҷҷҷҷҷҷҷҷҷҷҷҷҷҷzҷsҷlҷeҷ^ҷWҷPҷIҷBҷ;ҷ4ҷ-ҷ&ҷҷҷҷ ҷҷѷѷѷѷѷѷѷѷѷѷѷѷѷѷѷѷѷѷ~ѷwѷpѷiѷbѷ[ѷTѷMѷFѷ?ѷ8ѷ1ѷ*ѷ#ѷѷѷѷѷѷзззззззззззззззззз{зtзmзfз_зXзQзJзCз<з5з.з'з ззз ззϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷxϷqϷjϷcϷ\ϷUϷNϷGϷ@Ϸ9Ϸ2Ϸ+Ϸ$ϷϷϷϷϷϷηηηηηηηηηηηηηηηηηη|ηuηnηgη`ηYηRηKηDη=η6η/η(η!ηηη ηηͷͷͷͷͷͷͷͷͷͷͷͷͷͷͷͷͷͷͷyͷrͷkͷdͷ]ͷVͷOͷHͷAͷ:ͷ3ͷ,ͷ%ͷͷͷͷ ͷͷ̷̷̷̷̷̷̷̷̷̷̷̷̷̷̷̷̷̷}̷v̷o̷h̷a̷Z̷S̷L̷E̷>̷7̷0̷)̷"̷̷̷ ̷̷˷˷˷˷˷˷˷˷˷˷˷˷˷˷˷˷˷˷˷z˷s˷l˷e˷^˷W˷P˷I˷B˷;˷4˷-˷&˷˷˷˷ ˷˷ʷʷʷʷʷʷʷʷʷʷʷʷʷʷʷʷʷʷ~ʷwʷpʷiʷbʷ[ʷTʷMʷFʷ?ʷ8ʷ1ʷ*ʷ#ʷʷʷʷʷʷɷɷɷɷɷɷɷɷɷɷɷɷɷɷɷɷɷɷ{ɷtɷmɷfɷ_ɷXɷQɷJɷCɷ<ɷ5ɷ.ɷ'ɷ ɷɷɷ ɷɷȷȷȷȷȷȷȷȷȷȷȷȷȷȷȷȷȷȷȷxȷqȷjȷcȷ\ȷUȷNȷGȷ@ȷ9ȷ2ȷ+ȷ$ȷȷȷȷȷȷǷǷǷǷǷǷǷǷǷǷǷǷǷǷǷǷǷǷ|ǷuǷnǷgǷ`ǷYǷRǷKǷDǷ=Ƿ6Ƿ/Ƿ(Ƿ!ǷǷǷ ǷǷƷƷƷƷƷƷƷƷƷƷƷƷƷƷƷƷƷƷƷyƷrƷkƷdƷ]ƷVƷOƷHƷAƷ:Ʒ3Ʒ,Ʒ%ƷƷƷƷ ƷƷŷŷŷŷŷŷŷŷŷŷŷŷŷŷŷŷŷŷ}ŷvŷoŷhŷaŷZŷSŷLŷEŷ>ŷ7ŷ0ŷ)ŷ"ŷŷŷ ŷŷķķķķķķķķķķķķķķķķķķķzķsķlķeķ^ķWķPķIķBķ;ķ4ķ-ķ&ķķķķ ķķ÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷··················{·t·m·f·_·X·Q·J·C·<·5·.·'· ··· ··xqjc\UNG@92+$|ung`YRKD=6/(! 鿷⿷ۿԿͿƿyrkd]VOHA:3,% 澷߾ؾѾʾþ}vohaZSLE>70)" 꽷㽷ܽսνǽzsle^WPIB;4-& 缷༷ټҼ˼ļ~wpib[TMF?81*#뻷价ݻֻϻȻ{tmf_XQJC<5.'  ﺷ躷ặںӺ̺źxqjc\UNG@92+$칷幷޹׹йɹ¹|ung`YRKD=6/(! 鸷⸷۸Ը͸Ƹyrkd]VOHA:3,% 混߷طѷʷ÷}vohaZSLE>70)" 궷㶷ܶնζǶzsle^WPIB;4-& 絷൷ٵҵ˵ĵ~wpib[TMF?81*#봷䴷ݴִϴȴ{tmf_XQJC<5.'  ﳷ賷᳷ڳӳ̳ųxqjc\UNG@92+$첷岷޲ײвɲ²|ung`YRKD=6/(! 鱷ⱷ۱ԱͱƱyrkd]VOHA:3,% 氷߰ذѰʰð}vohaZSLE>70)" ꯷㯷ܯկίǯzsle^WPIB;4-& 箷ஷٮҮˮĮ~wpib[TMF?81*#뭷䭷ݭ֭ϭȭ{tmf_XQJC<5.'  ﬷謷ᬷڬӬ̬Ŭxqjc\UNG@92+$쫷嫷ޫ׫Ыɫ«|ung`YRKD=6/(! 骷⪷۪Ԫͪƪyrkd]VOHA:3,% 橷ߩةѩʩé}vohaZSLE>70)" ꨷㨷ܨըΨǨzsle^WPIB;4-& 秷৷٧ҧ˧ħ~wpib[TMF?81*#릷䦷ݦ֦ϦȦ{tmf_XQJC<5.'  亮襷᥷ڥӥ̥ťxqjc\UNG@92+$줷夷ޤפФɤ¤|ung`YRKD=6/(! 飷⣷ۣԣͣƣyrkd]VOHA:3,% 梷ߢآѢʢâ}vohaZSLE>70)" ꡷㡷ܡաΡǡzsle^WPIB;4-& 砷࠷٠ҠˠĠ~wpib[TMF?81*#럷䟷ݟ֟ϟȟ{tmf_XQJC<5.'  螷ិڞӞ̞Şxqjc\UNG@92+$읷坷ޝםНɝ|ung`YRKD=6/(! 霷✷ۜԜ͜Ɯyrkd]VOHA:3,% 훷曷ߛ؛ћʛÛ}vohaZSLE>70)" ꚷ㚷ܚ՚Κǚzsle^WPIB;4-& 癷ٙҙ˙ę~wpib[TMF?81*#똷䘷ݘ֘ϘȘ{tmf_XQJC<5.'  藷ᗷڗӗ̗ŗxqjc\UNG@92+$얷喷ޖזЖɖ–|ung`YRKD=6/(! 長╷ەԕ͕ƕyrkd]VOHA:3,% 픷攷ߔؔєʔÔ}vohaZSLE>70)" ꓷ㓷ܓՓΓǓzsle^WPIB;4-& 璷ْҒ˒Ē~wpib[TMF?81*#둷䑷ݑ֑ϑȑ{tmf_XQJC<5.'  萷ᐷڐӐ̐Őxqjc\UNG@92+$쏷号ޏ׏Џɏ|ung`YRKD=6/(! 鎷⎷ێԎ͎Ǝyrkd]VOHA:3,% 퍷捷ߍ؍эʍÍ}vohaZSLE>70)" ꌷ㌷܌ՌΌnjzsle^WPIB;4-& 狷ًҋˋċ~wpib[TMF?81*#늷䊷݊֊ϊȊ{tmf_XQJC<5.'  艷ቷډӉ̉ʼnxqjc\UNG@92+$숷刷ވ׈ЈɈˆ|ung`YRKD=6/(! 釷⇷ۇԇ͇Ƈyrkd]VOHA:3,% 톷憷߆؆цʆÆ}vohaZSLE>70)" ꅷㅷ܅Յ΅Džzsle^WPIB;4-& 焷ل҄˄Ą~wpib[TMF?81*#냷䃷݃փσȃ{tmf_XQJC<5.'  肷Ⴗڂӂ̂łxqjc\UNG@92+$쁷偷ށׁЁɁ|ung`YRKD=6/(! 逷‷ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ߶߶߶߶߶߶߶߶߶߶߶߶߶߶߶߶߶߶߶y߶r߶k߶d߶]߶V߶O߶H߶A߶:߶3߶,߶%߶߶߶߶ ߶߶޶޶޶޶޶޶޶޶޶޶޶޶޶޶޶޶޶޶}޶v޶o޶h޶a޶Z޶S޶L޶E޶>޶7޶0޶)޶"޶޶޶ ޶޶ݶݶݶݶݶݶݶݶݶݶݶݶݶݶݶݶݶݶݶzݶsݶlݶeݶ^ݶWݶPݶIݶBݶ;ݶ4ݶ-ݶ&ݶݶݶݶ ݶݶܶܶܶܶܶܶܶܶܶܶܶܶܶܶܶܶܶܶ~ܶwܶpܶiܶbܶ[ܶTܶMܶFܶ?ܶ8ܶ1ܶ*ܶ#ܶܶܶܶܶܶ۶۶۶۶۶۶۶۶۶۶۶۶۶۶۶۶۶۶{۶t۶m۶f۶_۶X۶Q۶J۶C۶<۶5۶.۶'۶ ۶۶۶ ۶۶ڶڶڶڶڶڶڶڶڶڶڶڶڶڶڶڶڶڶڶxڶqڶjڶcڶ\ڶUڶNڶGڶ@ڶ9ڶ2ڶ+ڶ$ڶڶڶڶڶڶٶٶٶٶٶٶٶٶٶٶٶٶٶٶٶٶٶٶ|ٶuٶnٶgٶ`ٶYٶRٶKٶDٶ=ٶ6ٶ/ٶ(ٶ!ٶٶٶ ٶٶضضضضضضضضضضضضضضضضضضضyضrضkضdض]ضVضOضHضAض:ض3ض,ض%ضضضض ضض׶׶׶׶׶׶׶׶׶׶׶׶׶׶׶׶׶׶}׶v׶o׶h׶a׶Z׶S׶L׶E׶>׶7׶0׶)׶"׶׶׶ ׶׶ֶֶֶֶֶֶֶֶֶֶֶֶֶֶֶֶֶֶֶzֶsֶlֶeֶ^ֶWֶPֶIֶBֶ;ֶ4ֶ-ֶ&ֶֶֶֶ ֶֶնննննննննննննննննն~նwնpնiնbն[նTնMնFն?ն8ն1ն*ն#ննննննԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶ{ԶtԶmԶfԶ_ԶXԶQԶJԶCԶ<Զ5Զ.Զ'Զ ԶԶԶ ԶԶӶӶӶӶӶӶӶӶӶӶӶӶӶӶӶӶӶӶӶxӶqӶjӶcӶ\ӶUӶNӶGӶ@Ӷ9Ӷ2Ӷ+Ӷ$ӶӶӶӶӶӶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶ|ҶuҶnҶgҶ`ҶYҶRҶKҶDҶ=Ҷ6Ҷ/Ҷ(Ҷ!ҶҶҶ ҶҶѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶyѶrѶkѶdѶ]ѶVѶOѶHѶAѶ:Ѷ3Ѷ,Ѷ%ѶѶѶѶ ѶѶжжжжжжжжжжжжжжжжжж}жvжoжhжaжZжSжLжEж>ж7ж0ж)ж"жжж жж϶϶϶϶϶϶϶϶϶϶϶϶϶϶϶϶϶϶϶z϶s϶l϶e϶^϶W϶P϶I϶B϶;϶4϶-϶&϶϶϶϶ ϶϶ζζζζζζζζζζζζζζζζζζ~ζwζpζiζbζ[ζTζMζFζ?ζ8ζ1ζ*ζ#ζζζζζζͶͶͶͶͶͶͶͶͶͶͶͶͶͶͶͶͶͶ{ͶtͶmͶfͶ_ͶXͶQͶJͶCͶ<Ͷ5Ͷ.Ͷ'Ͷ ͶͶͶ ͶͶ̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶x̶q̶j̶c̶\̶U̶N̶G̶@̶9̶2̶+̶$̶̶̶̶̶̶˶˶˶˶˶˶˶˶˶˶˶˶˶˶˶˶˶˶|˶u˶n˶g˶`˶Y˶R˶K˶D˶=˶6˶/˶(˶!˶˶˶ ˶˶ʶʶʶʶʶʶʶʶʶʶʶʶʶʶʶʶʶʶʶyʶrʶkʶdʶ]ʶVʶOʶHʶAʶ:ʶ3ʶ,ʶ%ʶʶʶʶ ʶʶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶ}ɶvɶoɶhɶaɶZɶSɶLɶEɶ>ɶ7ɶ0ɶ)ɶ"ɶɶɶ ɶɶȶȶȶȶȶȶȶȶȶȶȶȶȶȶȶȶȶȶȶzȶsȶlȶeȶ^ȶWȶPȶIȶBȶ;ȶ4ȶ-ȶ&ȶȶȶȶ ȶȶǶǶǶǶǶǶǶǶǶǶǶǶǶǶǶǶǶǶ~ǶwǶpǶiǶbǶ[ǶTǶMǶFǶ?Ƕ8Ƕ1Ƕ*Ƕ#ǶǶǶǶǶǶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶ{ƶtƶmƶfƶ_ƶXƶQƶJƶCƶ<ƶ5ƶ.ƶ'ƶ ƶƶƶ ƶƶŶŶŶŶŶŶŶŶŶŶŶŶŶŶŶŶŶŶŶxŶqŶjŶcŶ\ŶUŶNŶGŶ@Ŷ9Ŷ2Ŷ+Ŷ$ŶŶŶŶŶŶĶĶĶĶĶĶĶĶĶĶĶĶĶĶĶĶĶĶ|ĶuĶnĶgĶ`ĶYĶRĶKĶDĶ=Ķ6Ķ/Ķ(Ķ!ĶĶĶ ĶĶöööööööööööööööööööyöröködö]öVöOöHöAö:ö3ö,ö%öööö öö¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶zsle^WPIB;4-& ~wpib[TMF?81*#뿶俶ݿֿϿȿ{tmf_XQJC<5.'  ᄊ辶ᾶھӾ̾žxqjc\UNG@92+$콶彶޽׽нɽ½|ung`YRKD=6/(! 鼶⼶ۼԼͼƼyrkd]VOHA:3,% 滶߻ػѻʻû}vohaZSLE>70)" 꺶㺶ܺպκǺzsle^WPIB;4-& 繶๶ٹҹ˹Ĺ~wpib[TMF?81*#븶丶ݸָϸȸ{tmf_XQJC<5.'  ﷶ跶᷶ڷӷ̷ŷxqjc\UNG@92+$춶嶶޶׶жɶ¶|ung`YRKD=6/(! 鵶⵶۵Ե͵Ƶyrkd]VOHA:3,% 洶ߴشѴʴô}vohaZSLE>70)" 곶㳶ܳճγdzzsle^WPIB;4-& 粶ಶٲҲ˲IJ~wpib[TMF?81*#뱶䱶ݱֱϱȱ{tmf_XQJC<5.'  ﰶ谶ᰶڰӰ̰Űxqjc\UNG@92+$쯶寶ޯׯЯɯ¯|ung`YRKD=6/(! 鮶⮶ۮԮͮƮyrkd]VOHA:3,% 歶߭حѭʭí}vohaZSLE>70)" ꬶ㬶ܬլάǬzsle^WPIB;4-& 競૶٫ҫ˫ī~wpib[TMF?81*#몶䪶ݪ֪ϪȪ{tmf_XQJC<5.'  勇詶᩶کө̩ũxqjc\UNG@92+$쨶娶ިרШɨ¨|ung`YRKD=6/(! 駶⧶ۧԧͧƧyrkd]VOHA:3,% 榶ߦئѦʦæ}vohaZSLE>70)" ꥶ㥶ܥեΥǥzsle^WPIB;4-& 礶श٤ҤˤĤ~wpib[TMF?81*#룶䣶ݣ֣ϣȣ{tmf_XQJC<5.'  袶ᢶڢӢ̢Ţxqjc\UNG@92+$졶塶ޡסСɡ¡|ung`YRKD=6/(! 頶⠶۠Ԡ͠Ơyrkd]VOHA:3,% ퟶ柶ߟ؟џʟß}vohaZSLE>70)" Ꞷ㞶ܞ՞ΞǞzsle^WPIB;4-& 睶ٝҝ˝ĝ~wpib[TMF?81*#뜶䜶ݜ֜ϜȜ{tmf_XQJC<5.'  蛶ᛶڛӛ̛śxqjc\UNG@92+$욶嚶ޚךКɚš|ung`YRKD=6/(! 陶♶ۙԙ͙ƙyrkd]VOHA:3,% 혶昶ߘؘјʘØ}vohaZSLE>70)" ꗶ㗶ܗ՗ΗǗzsle^WPIB;4-& 疶ٖҖ˖Ė~wpib[TMF?81*#땶䕶ݕ֕ϕȕ{tmf_XQJC<5.'  蔶ᔶڔӔ̔Ŕxqjc\UNG@92+$쓶哶ޓדГɓ“|ung`YRKD=6/(! 钶ⒶےԒ͒ƒyrkd]VOHA:3,% 푶摶ߑؑёʑÑ}vohaZSLE>70)" ꐶ㐶ܐՐΐǐzsle^WPIB;4-& 珶ُҏˏď~wpib[TMF?81*#뎶䎶ݎ֎ώȎ{tmf_XQJC<5.'  荶፶ڍӍ̍ōxqjc\UNG@92+$쌶匶ތ׌ЌɌŒ|ung`YRKD=6/(! 鋶⋶ۋԋ͋Ƌyrkd]VOHA:3,% 튶抶ߊ؊ъʊÊ}vohaZSLE>70)" ꉶ㉶܉ՉΉljzsle^WPIB;4-& 父و҈ˈĈ~wpib[TMF?81*#뇶䇶݇ևχȇ{tmf_XQJC<5.'  膶ᆶچӆ̆ņxqjc\UNG@92+$셶其ޅׅЅɅ…|ung`YRKD=6/(! 鄶ℶۄԄ̈́Ƅyrkd]VOHA:3,% 탶惶߃؃уʃÃ}vohaZSLE>70)" ꂶザ܂Ղ΂ǂzsle^WPIB;4-& 灶فҁˁā~wpib[TMF?81*#뀶䀶݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ߵߵߵߵߵߵߵߵߵߵߵߵߵߵߵߵߵߵ{ߵtߵmߵfߵ_ߵXߵQߵJߵCߵ<ߵ5ߵ.ߵ'ߵ ߵߵߵ ߵߵ޵޵޵޵޵޵޵޵޵޵޵޵޵޵޵޵޵޵޵x޵q޵j޵c޵\޵U޵N޵G޵@޵9޵2޵+޵$޵޵޵޵޵޵ݵݵݵݵݵݵݵݵݵݵݵݵݵݵݵݵݵݵ|ݵuݵnݵgݵ`ݵYݵRݵKݵDݵ=ݵ6ݵ/ݵ(ݵ!ݵݵݵ ݵݵܵܵܵܵܵܵܵܵܵܵܵܵܵܵܵܵܵܵܵyܵrܵkܵdܵ]ܵVܵOܵHܵAܵ:ܵ3ܵ,ܵ%ܵܵܵܵ ܵܵ۵۵۵۵۵۵۵۵۵۵۵۵۵۵۵۵۵۵}۵v۵o۵h۵a۵Z۵S۵L۵E۵>۵7۵0۵)۵"۵۵۵ ۵۵ڵڵڵڵڵڵڵڵڵڵڵڵڵڵڵڵڵڵڵzڵsڵlڵeڵ^ڵWڵPڵIڵBڵ;ڵ4ڵ-ڵ&ڵڵڵڵ ڵڵٵٵٵٵٵٵٵٵٵٵٵٵٵٵٵٵٵٵ~ٵwٵpٵiٵbٵ[ٵTٵMٵFٵ?ٵ8ٵ1ٵ*ٵ#ٵٵٵٵٵٵصصصصصصصصصصصصصصصصصص{صtصmصfص_صXصQصJصCص<ص5ص.ص'ص صصص صص׵׵׵׵׵׵׵׵׵׵׵׵׵׵׵׵׵׵׵x׵q׵j׵c׵\׵U׵N׵G׵@׵9׵2׵+׵$׵׵׵׵׵׵ֵֵֵֵֵֵֵֵֵֵֵֵֵֵֵֵֵֵ|ֵuֵnֵgֵ`ֵYֵRֵKֵDֵ=ֵ6ֵ/ֵ(ֵ!ֵֵֵ ֵֵյյյյյյյյյյյյյյյյյյյyյrյkյdյ]յVյOյHյAյ:յ3յ,յ%յյյյ յյԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵ}ԵvԵoԵhԵaԵZԵSԵLԵEԵ>Ե7Ե0Ե)Ե"ԵԵԵ ԵԵӵӵӵӵӵӵӵӵӵӵӵӵӵӵӵӵӵӵӵzӵsӵlӵeӵ^ӵWӵPӵIӵBӵ;ӵ4ӵ-ӵ&ӵӵӵӵ ӵӵҵҵҵҵҵҵҵҵҵҵҵҵҵҵҵҵҵҵ~ҵwҵpҵiҵbҵ[ҵTҵMҵFҵ?ҵ8ҵ1ҵ*ҵ#ҵҵҵҵҵҵѵѵѵѵѵѵѵѵѵѵѵѵѵѵѵѵѵѵ{ѵtѵmѵfѵ_ѵXѵQѵJѵCѵ<ѵ5ѵ.ѵ'ѵ ѵѵѵ ѵѵеееееееееееееееееееxеqеjеcе\еUеNеGе@е9е2е+е$ееееееϵϵϵϵϵϵϵϵϵϵϵϵϵϵϵϵϵϵ|ϵuϵnϵgϵ`ϵYϵRϵKϵDϵ=ϵ6ϵ/ϵ(ϵ!ϵϵϵ ϵϵεεεεεεεεεεεεεεεεεεεyεrεkεdε]εVεOεHεAε:ε3ε,ε%εεεε εε͵͵͵͵͵͵͵͵͵͵͵͵͵͵͵͵͵͵}͵v͵o͵h͵a͵Z͵S͵L͵E͵>͵7͵0͵)͵"͵͵͵ ͵͵̵̵̵̵̵̵̵̵̵̵̵̵̵̵̵̵̵̵̵z̵s̵l̵e̵^̵W̵P̵I̵B̵;̵4̵-̵&̵̵̵̵ ̵̵˵˵˵˵˵˵˵˵˵˵˵˵˵˵˵˵˵˵~˵w˵p˵i˵b˵[˵T˵M˵F˵?˵8˵1˵*˵#˵˵˵˵˵˵ʵʵʵʵʵʵʵʵʵʵʵʵʵʵʵʵʵʵ{ʵtʵmʵfʵ_ʵXʵQʵJʵCʵ<ʵ5ʵ.ʵ'ʵ ʵʵʵ ʵʵɵɵɵɵɵɵɵɵɵɵɵɵɵɵɵɵɵɵɵxɵqɵjɵcɵ\ɵUɵNɵGɵ@ɵ9ɵ2ɵ+ɵ$ɵɵɵɵɵɵȵȵȵȵȵȵȵȵȵȵȵȵȵȵȵȵȵȵ|ȵuȵnȵgȵ`ȵYȵRȵKȵDȵ=ȵ6ȵ/ȵ(ȵ!ȵȵȵ ȵȵǵǵǵǵǵǵǵǵǵǵǵǵǵǵǵǵǵǵǵyǵrǵkǵdǵ]ǵVǵOǵHǵAǵ:ǵ3ǵ,ǵ%ǵǵǵǵ ǵǵƵƵƵƵƵƵƵƵƵƵƵƵƵƵƵƵƵƵ}ƵvƵoƵhƵaƵZƵSƵLƵEƵ>Ƶ7Ƶ0Ƶ)Ƶ"ƵƵƵ ƵƵŵŵŵŵŵŵŵŵŵŵŵŵŵŵŵŵŵŵŵzŵsŵlŵeŵ^ŵWŵPŵIŵBŵ;ŵ4ŵ-ŵ&ŵŵŵŵ ŵŵĵĵĵĵĵĵĵĵĵĵĵĵĵĵĵĵĵĵ~ĵwĵpĵiĵbĵ[ĵTĵMĵFĵ?ĵ8ĵ1ĵ*ĵ#ĵĵĵĵĵĵõõõõõõõõõõõõõõõõõõ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõµµµµµµµµµµµµµµµµµµµxµqµjµcµ\µUµNµGµ@µ9µ2µ+µ$µµµµµµ|ung`YRKD=6/(! yrkd]VOHA:3,% 濵߿ؿѿʿÿ}vohaZSLE>70)" 꾵㾵ܾվξǾzsle^WPIB;4-& 罵ཱུٽҽ˽Ľ~wpib[TMF?81*#뼵伵ݼּϼȼ{tmf_XQJC<5.'  ﻵ軵ỵڻӻ̻Żxqjc\UNG@92+$캵庵޺׺кɺº|ung`YRKD=6/(! 鹵⹵۹Թ͹ƹyrkd]VOHA:3,% 渵߸ظѸʸø}vohaZSLE>70)" 귵㷵ܷշηǷzsle^WPIB;4-& 綵ඵٶҶ˶Ķ~wpib[TMF?81*#뵵䵵ݵֵϵȵ{tmf_XQJC<5.'  ﴵ贵ᴵڴӴ̴Ŵxqjc\UNG@92+$쳵峵޳׳гɳ³|ung`YRKD=6/(! 鲵ⲵ۲ԲͲƲyrkd]VOHA:3,% 汵߱رѱʱñ}vohaZSLE>70)" 갵㰵ܰհΰǰzsle^WPIB;4-& 篵௵ٯү˯į~wpib[TMF?81*#뮵䮵ݮ֮ϮȮ{tmf_XQJC<5.'  ﭵ譵᭵ڭӭ̭ŭxqjc\UNG@92+$쬵嬵ެ׬Ьɬ¬|ung`YRKD=6/(! 髵⫵۫ԫͫƫyrkd]VOHA:3,% 檵ߪتѪʪê}vohaZSLE>70)" ꩵ㩵ܩթΩǩzsle^WPIB;4-& 稵ਵ٨Ҩ˨Ĩ~wpib[TMF?81*#맵䧵ݧ֧ϧȧ{tmf_XQJC<5.'  例覵ᦵڦӦ̦Ŧxqjc\UNG@92+$쥵奵ޥץХɥ¥|ung`YRKD=6/(! 餵⤵ۤԤͤƤyrkd]VOHA:3,% 棵ߣأѣʣã}vohaZSLE>70)" ꢵ㢵ܢբ΢Ǣzsle^WPIB;4-& 硵ࡵ١ҡˡġ~wpib[TMF?81*#렵䠵ݠ֠ϠȠ{tmf_XQJC<5.'  蟵៵ڟӟ̟şxqjc\UNG@92+$잵垵ޞמОɞž|ung`YRKD=6/(! 靵❵۝ԝ͝Ɲyrkd]VOHA:3,% 휵朵ߜ؜ќʜÜ}vohaZSLE>70)" ꛵㛵ܛ՛ΛǛzsle^WPIB;4-& 皵ٚҚ˚Ě~wpib[TMF?81*#뙵䙵ݙ֙ϙș{tmf_XQJC<5.'  蘵ᘵژӘ̘Řxqjc\UNG@92+$엵嗵ޗחЗɗ—|ung`YRKD=6/(! 閵▵ۖԖ͖Ɩyrkd]VOHA:3,% 핵敵ߕؕѕʕÕ}vohaZSLE>70)" ꔵ㔵ܔՔΔǔzsle^WPIB;4-& 瓵ٓғ˓ē~wpib[TMF?81*#뒵䒵ݒ֒ϒȒ{tmf_XQJC<5.'  葵ᑵڑӑ̑őxqjc\UNG@92+$쐵吵ސאАɐ|ung`YRKD=6/(! 鏵⏵ۏԏ͏Əyrkd]VOHA:3,% 펵掵ߎ؎юʎÎ}vohaZSLE>70)" ꍵ㍵܍Ս΍Ǎzsle^WPIB;4-& 猵ٌҌˌČ~wpib[TMF?81*#답䋵݋֋ϋȋ{tmf_XQJC<5.'  芵ኵڊӊ̊Ŋxqjc\UNG@92+$쉵創މ׉Љɉ‰|ung`YRKD=6/(! 鈵∵ۈԈ͈ƈyrkd]VOHA:3,% 퇵懵߇؇чʇÇ}vohaZSLE>70)" ꆵㆵ܆ՆΆdžzsle^WPIB;4-& 煵م҅˅ą~wpib[TMF?81*#넵䄵݄քτȄ{tmf_XQJC<5.'  胵ჵڃӃ̃Ńxqjc\UNG@92+$삵債ނׂЂɂ‚|ung`YRKD=6/(! 遵⁵ہԁ́Ɓyrkd]VOHA:3,% 퀵怵߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߴߴߴߴߴߴߴߴߴߴߴߴߴߴߴߴߴߴ}ߴvߴoߴhߴaߴZߴSߴLߴEߴ>ߴ7ߴ0ߴ)ߴ"ߴߴߴ ߴߴ޴޴޴޴޴޴޴޴޴޴޴޴޴޴޴޴޴޴޴z޴s޴l޴e޴^޴W޴P޴I޴B޴;޴4޴-޴&޴޴޴޴ ޴޴ݴݴݴݴݴݴݴݴݴݴݴݴݴݴݴݴݴݴ~ݴwݴpݴiݴbݴ[ݴTݴMݴFݴ?ݴ8ݴ1ݴ*ݴ#ݴݴݴݴݴݴܴܴܴܴܴܴܴܴܴܴܴܴܴܴܴܴܴܴ{ܴtܴmܴfܴ_ܴXܴQܴJܴCܴ<ܴ5ܴ.ܴ'ܴ ܴܴܴ ܴܴ۴۴۴۴۴۴۴۴۴۴۴۴۴۴۴۴۴۴۴x۴q۴j۴c۴\۴U۴N۴G۴@۴9۴2۴+۴$۴۴۴۴۴۴ڴڴڴڴڴڴڴڴڴڴڴڴڴڴڴڴڴڴ|ڴuڴnڴgڴ`ڴYڴRڴKڴDڴ=ڴ6ڴ/ڴ(ڴ!ڴڴڴ ڴڴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴyٴrٴkٴdٴ]ٴVٴOٴHٴAٴ:ٴ3ٴ,ٴ%ٴٴٴٴ ٴٴشششششششششششششششششش}شvشoشhشaشZشSشLشEش>ش7ش0ش)ش"ششش شش״״״״״״״״״״״״״״״״״״״z״s״l״e״^״W״P״I״B״;״4״-״&״״״״ ״״ִִִִִִִִִִִִִִִִִִ~ִwִpִiִbִ[ִTִMִFִ?ִ8ִ1ִ*ִ#ִִִִִִմմմմմմմմմմմմմմմմմմ{մtմmմfմ_մXմQմJմCմ<մ5մ.մ'մ մմմ մմԴԴԴԴԴԴԴԴԴԴԴԴԴԴԴԴԴԴԴxԴqԴjԴcԴ\ԴUԴNԴGԴ@Դ9Դ2Դ+Դ$ԴԴԴԴԴԴӴӴӴӴӴӴӴӴӴӴӴӴӴӴӴӴӴӴ|ӴuӴnӴgӴ`ӴYӴRӴKӴDӴ=Ӵ6Ӵ/Ӵ(Ӵ!ӴӴӴ ӴӴҴҴҴҴҴҴҴҴҴҴҴҴҴҴҴҴҴҴҴyҴrҴkҴdҴ]ҴVҴOҴHҴAҴ:Ҵ3Ҵ,Ҵ%ҴҴҴҴ ҴҴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴ}ѴvѴoѴhѴaѴZѴSѴLѴEѴ>Ѵ7Ѵ0Ѵ)Ѵ"ѴѴѴ ѴѴдддддддддддддддддддzдsдlдeд^дWдPдIдBд;д4д-д&дддд ддϴϴϴϴϴϴϴϴϴϴϴϴϴϴϴϴϴϴ~ϴwϴpϴiϴbϴ[ϴTϴMϴFϴ?ϴ8ϴ1ϴ*ϴ#ϴϴϴϴϴϴδδδδδδδδδδδδδδδδδδ{δtδmδfδ_δXδQδJδCδ<δ5δ.δ'δ δδδ δδʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹxʹqʹjʹcʹ\ʹUʹNʹGʹ@ʹ9ʹ2ʹ+ʹ$ʹʹʹʹʹʹ̴̴̴̴̴̴̴̴̴̴̴̴̴̴̴̴̴̴|̴u̴n̴g̴`̴Y̴R̴K̴D̴=̴6̴/̴(̴!̴̴̴ ̴̴˴˴˴˴˴˴˴˴˴˴˴˴˴˴˴˴˴˴˴y˴r˴k˴d˴]˴V˴O˴H˴A˴:˴3˴,˴%˴˴˴˴ ˴˴ʴʴʴʴʴʴʴʴʴʴʴʴʴʴʴʴʴʴ}ʴvʴoʴhʴaʴZʴSʴLʴEʴ>ʴ7ʴ0ʴ)ʴ"ʴʴʴ ʴʴɴɴɴɴɴɴɴɴɴɴɴɴɴɴɴɴɴɴɴzɴsɴlɴeɴ^ɴWɴPɴIɴBɴ;ɴ4ɴ-ɴ&ɴɴɴɴ ɴɴȴȴȴȴȴȴȴȴȴȴȴȴȴȴȴȴȴȴ~ȴwȴpȴiȴbȴ[ȴTȴMȴFȴ?ȴ8ȴ1ȴ*ȴ#ȴȴȴȴȴȴǴǴǴǴǴǴǴǴǴǴǴǴǴǴǴǴǴǴ{ǴtǴmǴfǴ_ǴXǴQǴJǴCǴ<Ǵ5Ǵ.Ǵ'Ǵ ǴǴǴ ǴǴƴƴƴƴƴƴƴƴƴƴƴƴƴƴƴƴƴƴƴxƴqƴjƴcƴ\ƴUƴNƴGƴ@ƴ9ƴ2ƴ+ƴ$ƴƴƴƴƴƴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴ|ŴuŴnŴgŴ`ŴYŴRŴKŴDŴ=Ŵ6Ŵ/Ŵ(Ŵ!ŴŴŴ ŴŴĴĴĴĴĴĴĴĴĴĴĴĴĴĴĴĴĴĴĴyĴrĴkĴdĴ]ĴVĴOĴHĴAĴ:Ĵ3Ĵ,Ĵ%ĴĴĴĴ ĴĴôôôôôôôôôôôôôôôôôô}ôvôoôhôaôZôSôLôEô>ô7ô0ô)ô"ôôô ôô´´´´´´´´´´´´´´´´´´´z´s´l´e´^´W´P´I´B´;´4´-´&´´´´ ´´~wpib[TMF?81*#{tmf_XQJC<5.'  ￴迴ῴڿӿ̿ſxqjc\UNG@92+$쾴徴޾׾оɾ¾|ung`YRKD=6/(! 齴⽴۽Խͽƽyrkd]VOHA:3,% 漴߼ؼѼʼü}vohaZSLE>70)" 껴㻴ܻջλǻzsle^WPIB;4-& 纴ິٺҺ˺ĺ~wpib[TMF?81*#빴乴ݹֹϹȹ{tmf_XQJC<5.'  ︴踴ḴڸӸ̸Ÿxqjc\UNG@92+$췴巴޷׷зɷ·|ung`YRKD=6/(! 鶴ⶴ۶ԶͶƶyrkd]VOHA:3,% 浴ߵصѵʵõ}vohaZSLE>70)" 괴㴴ܴմδǴzsle^WPIB;4-& 糴೴ٳҳ˳ij~wpib[TMF?81*#벴䲴ݲֲϲȲ{tmf_XQJC<5.'  ﱴ豴ᱴڱӱ̱űxqjc\UNG@92+$찴尴ްװаɰ°|ung`YRKD=6/(! 鯴⯴ۯԯͯƯyrkd]VOHA:3,% 殴߮خѮʮî}vohaZSLE>70)" ꭴ㭴ܭխέǭzsle^WPIB;4-& 笴଴٬ҬˬĬ~wpib[TMF?81*#뫴䫴ݫ֫ϫȫ{tmf_XQJC<5.'  華誴᪴ڪӪ̪Ūxqjc\UNG@92+$쩴婴ީשЩɩ©|ung`YRKD=6/(! 騴⨴ۨԨͨƨyrkd]VOHA:3,% 槴ߧاѧʧç}vohaZSLE>70)" ꦴ㦴ܦզΦǦzsle^WPIB;4-& 祴ॴ٥ҥ˥ĥ~wpib[TMF?81*#뤴䤴ݤ֤ϤȤ{tmf_XQJC<5.'  裴ᣴڣӣ̣ţxqjc\UNG@92+$좴墴ޢעТɢ¢|ung`YRKD=6/(! 顴⡴ۡԡ͡ơyrkd]VOHA:3,% 栴ߠؠѠʠà}vohaZSLE>70)" ꟴ㟴ܟ՟Οǟzsle^WPIB;4-& 瞴ٞҞ˞Ğ~wpib[TMF?81*#띴䝴ݝ֝ϝȝ{tmf_XQJC<5.'  蜴᜴ڜӜ̜Ŝxqjc\UNG@92+$웴围ޛכЛɛ›|ung`YRKD=6/(! 隴⚴ۚԚ͚ƚyrkd]VOHA:3,% 홴晴ߙؙљʙÙ}vohaZSLE>70)" ꘴㘴ܘ՘Θǘzsle^WPIB;4-& 痴ٗҗ˗ė~wpib[TMF?81*#떴䖴ݖ֖ϖȖ{tmf_XQJC<5.'  蕴ᕴڕӕ̕ŕxqjc\UNG@92+$씴唴ޔהДɔ”|ung`YRKD=6/(! 铴⓴ۓԓ͓Ɠyrkd]VOHA:3,% 풴撴ߒؒђʒÒ}vohaZSLE>70)" ꑴ㑴ܑՑΑǑzsle^WPIB;4-& 琴ِҐːĐ~wpib[TMF?81*#돴䏴ݏ֏Ϗȏ{tmf_XQJC<5.'  莴Ꮄڎӎ̎Ŏxqjc\UNG@92+$썴却ލ׍Ѝɍ|ung`YRKD=6/(! 錴⌴یԌ͌ƌyrkd]VOHA:3,% 틴拴ߋ؋ыʋË}vohaZSLE>70)" ꊴ㊴܊ՊΊNJzsle^WPIB;4-& 牴ى҉ˉĉ~wpib[TMF?81*#눴䈴݈ֈψȈ{tmf_XQJC<5.'  致ᇴڇӇ̇Ňxqjc\UNG@92+$솴冴ކ׆ІɆ†|ung`YRKD=6/(! 酴ⅴۅԅͅƅyrkd]VOHA:3,% 턴愴߄؄фʄÄ}vohaZSLE>70)" ꃴヴ܃Ճ΃ǃzsle^WPIB;4-& 炴ق҂˂Ă~wpib[TMF?81*#끴䁴݁ցρȁ{tmf_XQJC<5.'  耴ဴڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ߳߳߳߳߳߳߳߳߳߳߳߳߳߳߳߳߳߳߳x߳q߳j߳c߳\߳U߳N߳G߳@߳9߳2߳+߳$߳߳߳߳߳߳޳޳޳޳޳޳޳޳޳޳޳޳޳޳޳޳޳޳|޳u޳n޳g޳`޳Y޳R޳K޳D޳=޳6޳/޳(޳!޳޳޳ ޳޳ݳݳݳݳݳݳݳݳݳݳݳݳݳݳݳݳݳݳݳyݳrݳkݳdݳ]ݳVݳOݳHݳAݳ:ݳ3ݳ,ݳ%ݳݳݳݳ ݳݳܳܳܳܳܳܳܳܳܳܳܳܳܳܳܳܳܳܳ}ܳvܳoܳhܳaܳZܳSܳLܳEܳ>ܳ7ܳ0ܳ)ܳ"ܳܳܳ ܳܳ۳۳۳۳۳۳۳۳۳۳۳۳۳۳۳۳۳۳۳z۳s۳l۳e۳^۳W۳P۳I۳B۳;۳4۳-۳&۳۳۳۳ ۳۳ڳڳڳڳڳڳڳڳڳڳڳڳڳڳڳڳڳڳ~ڳwڳpڳiڳbڳ[ڳTڳMڳFڳ?ڳ8ڳ1ڳ*ڳ#ڳڳڳڳڳڳٳٳٳٳٳٳٳٳٳٳٳٳٳٳٳٳٳٳ{ٳtٳmٳfٳ_ٳXٳQٳJٳCٳ<ٳ5ٳ.ٳ'ٳ ٳٳٳ ٳٳسسسسسسسسسسسسسسسسسسسxسqسjسcس\سUسNسGس@س9س2س+س$سسسسسس׳׳׳׳׳׳׳׳׳׳׳׳׳׳׳׳׳׳|׳u׳n׳g׳`׳Y׳R׳K׳D׳=׳6׳/׳(׳!׳׳׳ ׳׳ֳֳֳֳֳֳֳֳֳֳֳֳֳֳֳֳֳֳֳyֳrֳkֳdֳ]ֳVֳOֳHֳAֳ:ֳ3ֳ,ֳ%ֳֳֳֳ ֳֳճճճճճճճճճճճճճճճճճճ}ճvճoճhճaճZճSճLճEճ>ճ7ճ0ճ)ճ"ճճճ ճճԳԳԳԳԳԳԳԳԳԳԳԳԳԳԳԳԳԳԳzԳsԳlԳeԳ^ԳWԳPԳIԳBԳ;Գ4Գ-Գ&ԳԳԳԳ ԳԳӳӳӳӳӳӳӳӳӳӳӳӳӳӳӳӳӳӳ~ӳwӳpӳiӳbӳ[ӳTӳMӳFӳ?ӳ8ӳ1ӳ*ӳ#ӳӳӳӳӳӳҳҳҳҳҳҳҳҳҳҳҳҳҳҳҳҳҳҳ{ҳtҳmҳfҳ_ҳXҳQҳJҳCҳ<ҳ5ҳ.ҳ'ҳ ҳҳҳ ҳҳѳѳѳѳѳѳѳѳѳѳѳѳѳѳѳѳѳѳѳxѳqѳjѳcѳ\ѳUѳNѳGѳ@ѳ9ѳ2ѳ+ѳ$ѳѳѳѳѳѳгггггггггггггггггг|гuгnгgг`гYгRгKгDг=г6г/г(г!ггг ггϳϳϳϳϳϳϳϳϳϳϳϳϳϳϳϳϳϳϳyϳrϳkϳdϳ]ϳVϳOϳHϳAϳ:ϳ3ϳ,ϳ%ϳϳϳϳ ϳϳγγγγγγγγγγγγγγγγγγ}γvγoγhγaγZγSγLγEγ>γ7γ0γ)γ"γγγ γγͳͳͳͳͳͳͳͳͳͳͳͳͳͳͳͳͳͳͳzͳsͳlͳeͳ^ͳWͳPͳIͳBͳ;ͳ4ͳ-ͳ&ͳͳͳͳ ͳͳ̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳~̳w̳p̳i̳b̳[̳T̳M̳F̳?̳8̳1̳*̳#̳̳̳̳̳̳˳˳˳˳˳˳˳˳˳˳˳˳˳˳˳˳˳˳{˳t˳m˳f˳_˳X˳Q˳J˳C˳<˳5˳.˳'˳ ˳˳˳ ˳˳ʳʳʳʳʳʳʳʳʳʳʳʳʳʳʳʳʳʳʳxʳqʳjʳcʳ\ʳUʳNʳGʳ@ʳ9ʳ2ʳ+ʳ$ʳʳʳʳʳʳɳɳɳɳɳɳɳɳɳɳɳɳɳɳɳɳɳɳ|ɳuɳnɳgɳ`ɳYɳRɳKɳDɳ=ɳ6ɳ/ɳ(ɳ!ɳɳɳ ɳɳȳȳȳȳȳȳȳȳȳȳȳȳȳȳȳȳȳȳȳyȳrȳkȳdȳ]ȳVȳOȳHȳAȳ:ȳ3ȳ,ȳ%ȳȳȳȳ ȳȳdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdz}dzvdzodzhdzadzZdzSdzLdzEdz>dz7dz0dz)dz"dzdzdz dzdzƳƳƳƳƳƳƳƳƳƳƳƳƳƳƳƳƳƳƳzƳsƳlƳeƳ^ƳWƳPƳIƳBƳ;Ƴ4Ƴ-Ƴ&ƳƳƳƳ ƳƳųųųųųųųųųųųųųųųųųų~ųwųpųiųbų[ųTųMųFų?ų8ų1ų*ų#ųųųųųųijijijijijijijijijijijijijijijijijij{ijtijmijfij_ijXijQijJijCij<ij5ij.ij'ij ijijij ijijóóóóóóóóóóóóóóóóóóóxóqójócó\óUóNóGó@ó9ó2ó+ó$óóóóóó³³³³³³³³³³³³³³³³³³|³u³n³g³`³Y³R³K³D³=³6³/³(³!³³³ ³³yrkd]VOHA:3,% }vohaZSLE>70)" 꿳㿳ܿտοǿzsle^WPIB;4-& 羳ླپҾ˾ľ~wpib[TMF?81*#뽳佳ݽֽϽȽ{tmf_XQJC<5.'  S輳ἳڼӼ̼żxqjc\UNG@92+$컳廳޻׻лɻ»|ung`YRKD=6/(! 麳⺳ۺԺͺƺyrkd]VOHA:3,% 湳߹عѹʹù}vohaZSLE>70)" 긳㸳ܸոθǸzsle^WPIB;4-& 緳ෳٷҷ˷ķ~wpib[TMF?81*#붳䶳ݶֶ϶ȶ{tmf_XQJC<5.'  ﵳ赳ᵳڵӵ̵ŵxqjc\UNG@92+$촳崳޴״дɴ´|ung`YRKD=6/(! 鳳ⳳ۳ԳͳƳyrkd]VOHA:3,% 河߲زѲʲò}vohaZSLE>70)" 걳㱳ܱձαDZzsle^WPIB;4-& 簳ళٰҰ˰İ~wpib[TMF?81*#믳䯳ݯ֯ϯȯ{tmf_XQJC<5.'  ﮳讳᮳ڮӮ̮Ůxqjc\UNG@92+$쭳孳ޭ׭Эɭ­|ung`YRKD=6/(! 鬳⬳۬ԬͬƬyrkd]VOHA:3,% 櫳߫ثѫʫë}vohaZSLE>70)" ꪳ㪳ܪժΪǪzsle^WPIB;4-& 穳ੳ٩ҩ˩ĩ~wpib[TMF?81*#먳䨳ݨ֨ϨȨ{tmf_XQJC<5.'  麟觳᧳ڧӧ̧ŧxqjc\UNG@92+$즳妳ަצЦɦ¦|ung`YRKD=6/(! 饳⥳ۥԥͥƥyrkd]VOHA:3,% 椳ߤؤѤʤä}vohaZSLE>70)" ꣳ㣳ܣգΣǣzsle^WPIB;4-& 碳ࢳ٢ҢˢĢ~wpib[TMF?81*#롳䡳ݡ֡ϡȡ{tmf_XQJC<5.'  蠳ᠳڠӠ̠Šxqjc\UNG@92+$쟳埳ޟןПɟŸ|ung`YRKD=6/(! 鞳➳۞Ԟ͞ƞyrkd]VOHA:3,% 흳杳ߝ؝ѝʝÝ}vohaZSLE>70)" ꜳ㜳ܜ՜Μǜzsle^WPIB;4-& 盳ٛқ˛ě~wpib[TMF?81*#뚳䚳ݚ֚ϚȚ{tmf_XQJC<5.'  虳ᙳڙә̙řxqjc\UNG@92+$옳嘳ޘטИɘ˜|ung`YRKD=6/(! 闳◳ۗԗ͗Ɨyrkd]VOHA:3,% 햳斳ߖؖіʖÖ}vohaZSLE>70)" ꕳ㕳ܕՕΕǕzsle^WPIB;4-& 申ٔҔ˔Ĕ~wpib[TMF?81*#듳䓳ݓ֓ϓȓ{tmf_XQJC<5.'  蒳ᒳڒӒ̒Œxqjc\UNG@92+$쑳味ޑבБɑ‘|ung`YRKD=6/(! 鐳␳ېԐ͐Ɛyrkd]VOHA:3,% 폳揳ߏ؏яʏÏ}vohaZSLE>70)" ꎳ㎳܎ՎΎǎzsle^WPIB;4-& 獳ٍҍˍč~wpib[TMF?81*#댳䌳݌֌όȌ{tmf_XQJC<5.'  苳ዳڋӋ̋ŋxqjc\UNG@92+$슳劳ފ׊ЊɊŠ|ung`YRKD=6/(! 鉳≳ۉԉ͉Ɖyrkd]VOHA:3,% 툳戳߈؈шʈÈ}vohaZSLE>70)" ꇳㇳ܇Շ·LJzsle^WPIB;4-& 熳ن҆ˆĆ~wpib[TMF?81*#녳䅳݅օυȅ{tmf_XQJC<5.'  脳ᄳڄӄ̄ńxqjc\UNG@92+$샳僳ރ׃ЃɃƒ|ung`YRKD=6/(! 邳₳ۂԂ͂Ƃyrkd]VOHA:3,% 큳恳߁؁сʁÁ}vohaZSLE>70)" ꀳ〳܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ߲߲߲߲߲߲߲߲߲߲߲߲߲߲߲߲߲߲߲z߲s߲l߲e߲^߲W߲P߲I߲B߲;߲4߲-߲&߲߲߲߲ ߲߲޲޲޲޲޲޲޲޲޲޲޲޲޲޲޲޲޲޲~޲w޲p޲i޲b޲[޲T޲M޲F޲?޲8޲1޲*޲#޲޲޲޲޲޲ݲݲݲݲݲݲݲݲݲݲݲݲݲݲݲݲݲݲ{ݲtݲmݲfݲ_ݲXݲQݲJݲCݲ<ݲ5ݲ.ݲ'ݲ ݲݲݲ ݲݲܲܲܲܲܲܲܲܲܲܲܲܲܲܲܲܲܲܲܲxܲqܲjܲcܲ\ܲUܲNܲGܲ@ܲ9ܲ2ܲ+ܲ$ܲܲܲܲܲܲ۲۲۲۲۲۲۲۲۲۲۲۲۲۲۲۲۲۲|۲u۲n۲g۲`۲Y۲R۲K۲D۲=۲6۲/۲(۲!۲۲۲ ۲۲ڲڲڲڲڲڲڲڲڲڲڲڲڲڲڲڲڲڲڲyڲrڲkڲdڲ]ڲVڲOڲHڲAڲ:ڲ3ڲ,ڲ%ڲڲڲڲ ڲڲٲٲٲٲٲٲٲٲٲٲٲٲٲٲٲٲٲٲ}ٲvٲoٲhٲaٲZٲSٲLٲEٲ>ٲ7ٲ0ٲ)ٲ"ٲٲٲ ٲٲزززززززززززززززززززzزsزlزeز^زWزPزIزBز;ز4ز-ز&زززز ززײײײײײײײײײײײײײײײײײײ~ײwײpײiײbײ[ײTײMײFײ?ײ8ײ1ײ*ײ#ײײײײײײֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲ{ֲtֲmֲfֲ_ֲXֲQֲJֲCֲ<ֲ5ֲ.ֲ'ֲ ֲֲֲ ֲֲղղղղղղղղղղղղղղղղղղղxղqղjղcղ\ղUղNղGղ@ղ9ղ2ղ+ղ$ղղղղղղԲԲԲԲԲԲԲԲԲԲԲԲԲԲԲԲԲԲ|ԲuԲnԲgԲ`ԲYԲRԲKԲDԲ=Բ6Բ/Բ(Բ!ԲԲԲ ԲԲӲӲӲӲӲӲӲӲӲӲӲӲӲӲӲӲӲӲӲyӲrӲkӲdӲ]ӲVӲOӲHӲAӲ:Ӳ3Ӳ,Ӳ%ӲӲӲӲ ӲӲҲҲҲҲҲҲҲҲҲҲҲҲҲҲҲҲҲҲ}ҲvҲoҲhҲaҲZҲSҲLҲEҲ>Ҳ7Ҳ0Ҳ)Ҳ"ҲҲҲ ҲҲѲѲѲѲѲѲѲѲѲѲѲѲѲѲѲѲѲѲѲzѲsѲlѲeѲ^ѲWѲPѲIѲBѲ;Ѳ4Ѳ-Ѳ&ѲѲѲѲ ѲѲвввввввввввввввввв~вwвpвiвbв[вTвMвFв?в8в1в*в#ввввввϲϲϲϲϲϲϲϲϲϲϲϲϲϲϲϲϲϲ{ϲtϲmϲfϲ_ϲXϲQϲJϲCϲ<ϲ5ϲ.ϲ'ϲ ϲϲϲ ϲϲβββββββββββββββββββxβqβjβcβ\βUβNβGβ@β9β2β+β$ββββββͲͲͲͲͲͲͲͲͲͲͲͲͲͲͲͲͲͲ|ͲuͲnͲgͲ`ͲYͲRͲKͲDͲ=Ͳ6Ͳ/Ͳ(Ͳ!ͲͲͲ ͲͲ̲̲̲̲̲̲̲̲̲̲̲̲̲̲̲̲̲̲̲y̲r̲k̲d̲]̲V̲O̲H̲A̲:̲3̲,̲%̲̲̲̲ ̲̲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲}˲v˲o˲h˲a˲Z˲S˲L˲E˲>˲7˲0˲)˲"˲˲˲ ˲˲ʲʲʲʲʲʲʲʲʲʲʲʲʲʲʲʲʲʲʲzʲsʲlʲeʲ^ʲWʲPʲIʲBʲ;ʲ4ʲ-ʲ&ʲʲʲʲ ʲʲɲɲɲɲɲɲɲɲɲɲɲɲɲɲɲɲɲɲ~ɲwɲpɲiɲbɲ[ɲTɲMɲFɲ?ɲ8ɲ1ɲ*ɲ#ɲɲɲɲɲɲȲȲȲȲȲȲȲȲȲȲȲȲȲȲȲȲȲȲ{ȲtȲmȲfȲ_ȲXȲQȲJȲCȲ<Ȳ5Ȳ.Ȳ'Ȳ ȲȲȲ ȲȲDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzxDzqDzjDzcDz\DzUDzNDzGDz@Dz9Dz2Dz+Dz$DzDzDzDzDzDzƲƲƲƲƲƲƲƲƲƲƲƲƲƲƲƲƲƲ|ƲuƲnƲgƲ`ƲYƲRƲKƲDƲ=Ʋ6Ʋ/Ʋ(Ʋ!ƲƲƲ ƲƲŲŲŲŲŲŲŲŲŲŲŲŲŲŲŲŲŲŲŲyŲrŲkŲdŲ]ŲVŲOŲHŲAŲ:Ų3Ų,Ų%ŲŲŲŲ ŲŲIJIJIJIJIJIJIJIJIJIJIJIJIJIJIJIJIJIJ}IJvIJoIJhIJaIJZIJSIJLIJEIJ>IJ7IJ0IJ)IJ"IJIJIJ IJIJòòòòòòòòòòòòòòòòòòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òò²²²²²²²²²²²²²²²²²²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²{tmf_XQJC<5.'  xqjc\UNG@92+$쿲忲޿׿пɿ¿|ung`YRKD=6/(! 龲⾲۾Ծ;ƾyrkd]VOHA:3,% 潲߽ؽѽʽý}vohaZSLE>70)" 꼲㼲ܼռμǼzsle^WPIB;4-& 绲໲ٻһ˻Ļ~wpib[TMF?81*#뺲亲ݺֺϺȺ{tmf_XQJC<5.'  ﹲ蹲Ṳڹӹ̹Źxqjc\UNG@92+$츲帲޸׸иɸ¸|ung`YRKD=6/(! 鷲ⷲ۷ԷͷƷyrkd]VOHA:3,% 液߶ضѶʶö}vohaZSLE>70)" 굲㵲ܵյεǵzsle^WPIB;4-& 紲ലٴҴ˴Ĵ~wpib[TMF?81*#볲䳲ݳֳϳȳ{tmf_XQJC<5.'  ﲲ貲ᲲڲӲ̲Ųxqjc\UNG@92+$챲屲ޱױбɱ±|ung`YRKD=6/(! 鰲ⰲ۰԰Ͱưyrkd]VOHA:3,% 毲߯دѯʯï}vohaZSLE>70)" ꮲ㮲ܮծήǮzsle^WPIB;4-& 筲୲٭ҭ˭ĭ~wpib[TMF?81*#묲䬲ݬ֬ϬȬ{tmf_XQJC<5.'  﫲諲᫲ګӫ̫ūxqjc\UNG@92+$쪲媲ުתЪɪª|ung`YRKD=6/(! 驲⩲۩ԩͩƩyrkd]VOHA:3,% 樲ߨبѨʨè}vohaZSLE>70)" ꧲㧲ܧէΧǧzsle^WPIB;4-& 禲ল٦Ҧ˦Ħ~wpib[TMF?81*#륲䥲ݥ֥ϥȥ{tmf_XQJC<5.'  爐褲ᤲڤӤ̤Ťxqjc\UNG@92+$죲売ޣףУɣ£|ung`YRKD=6/(! 颲⢲ۢԢ͢Ƣyrkd]VOHA:3,% 桲ߡءѡʡá}vohaZSLE>70)" ꠲㠲ܠՠΠǠzsle^WPIB;4-& 矲ٟҟ˟ğ~wpib[TMF?81*#랲䞲ݞ֞ϞȞ{tmf_XQJC<5.'  蝲ᝲڝӝ̝ŝxqjc\UNG@92+$윲圲ޜלМɜœ|ung`YRKD=6/(! 雲⛲ۛԛ͛ƛyrkd]VOHA:3,% 횲暲ߚؚњʚÚ}vohaZSLE>70)" ꙲㙲ܙՙΙǙzsle^WPIB;4-& 瘲٘Ҙ˘Ę~wpib[TMF?81*#뗲䗲ݗ֗ϗȗ{tmf_XQJC<5.'  薲ᖲږӖ̖Ŗxqjc\UNG@92+$앲啲ޕוЕɕ•|ung`YRKD=6/(! 锲┲۔Ԕ͔Ɣyrkd]VOHA:3,% 퓲擲ߓؓѓʓÓ}vohaZSLE>70)" ꒲㒲ܒՒΒǒzsle^WPIB;4-& 瑲ّґˑđ~wpib[TMF?81*#됲䐲ݐ֐ϐȐ{tmf_XQJC<5.'  菲Ᏺڏӏ̏ŏxqjc\UNG@92+$쎲厲ގ׎ЎɎŽ|ung`YRKD=6/(! 鍲⍲ۍԍ͍ƍyrkd]VOHA:3,% 팲挲ߌ،ьʌÌ}vohaZSLE>70)" ꋲ㋲܋Ջ΋Njzsle^WPIB;4-& 犲يҊˊĊ~wpib[TMF?81*#뉲䉲݉։ωȉ{tmf_XQJC<5.'  舲ሲڈӈ̈ňxqjc\UNG@92+$쇲凲އׇЇɇ‡|ung`YRKD=6/(! 醲↲ۆԆ͆Ɔyrkd]VOHA:3,% 텲慲߅؅хʅÅ}vohaZSLE>70)" ꄲㄲ܄Մ΄DŽzsle^WPIB;4-& 烲ك҃˃ă~wpib[TMF?81*#낲䂲݂ւςȂ{tmf_XQJC<5.'  聲ၲځӁ́Łxqjc\UNG@92+$쀲倲ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$߱߱߱߱߱߱߱߱߱߱߱߱߱߱߱߱߱߱|߱u߱n߱g߱`߱Y߱R߱K߱D߱=߱6߱/߱(߱!߱߱߱ ߱߱ޱޱޱޱޱޱޱޱޱޱޱޱޱޱޱޱޱޱޱyޱrޱkޱdޱ]ޱVޱOޱHޱAޱ:ޱ3ޱ,ޱ%ޱޱޱޱ ޱޱݱݱݱݱݱݱݱݱݱݱݱݱݱݱݱݱݱݱ}ݱvݱoݱhݱaݱZݱSݱLݱEݱ>ݱ7ݱ0ݱ)ݱ"ݱݱݱ ݱݱܱܱܱܱܱܱܱܱܱܱܱܱܱܱܱܱܱܱܱzܱsܱlܱeܱ^ܱWܱPܱIܱBܱ;ܱ4ܱ-ܱ&ܱܱܱܱ ܱܱ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱~۱w۱p۱i۱b۱[۱T۱M۱F۱?۱8۱1۱*۱#۱۱۱۱۱۱ڱڱڱڱڱڱڱڱڱڱڱڱڱڱڱڱڱڱ{ڱtڱmڱfڱ_ڱXڱQڱJڱCڱ<ڱ5ڱ.ڱ'ڱ ڱڱڱ ڱڱٱٱٱٱٱٱٱٱٱٱٱٱٱٱٱٱٱٱٱxٱqٱjٱcٱ\ٱUٱNٱGٱ@ٱ9ٱ2ٱ+ٱ$ٱٱٱٱٱٱرررررررررررررررررر|رuرnرgر`رYرRرKرDر=ر6ر/ر(ر!ررر ررױױױױױױױױױױױױױױױױױױױyױrױkױdױ]ױVױOױHױAױ:ױ3ױ,ױ%ױױױױ ױױֱֱֱֱֱֱֱֱֱֱֱֱֱֱֱֱֱֱ}ֱvֱoֱhֱaֱZֱSֱLֱEֱ>ֱ7ֱ0ֱ)ֱ"ֱֱֱ ֱֱձձձձձձձձձձձձձձձձձձձzձsձlձeձ^ձWձPձIձBձ;ձ4ձ-ձ&ձձձձ ձձԱԱԱԱԱԱԱԱԱԱԱԱԱԱԱԱԱԱ~ԱwԱpԱiԱbԱ[ԱTԱMԱFԱ?Ա8Ա1Ա*Ա#ԱԱԱԱԱԱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱ{ӱtӱmӱfӱ_ӱXӱQӱJӱCӱ<ӱ5ӱ.ӱ'ӱ ӱӱӱ ӱӱұұұұұұұұұұұұұұұұұұұxұqұjұcұ\ұUұNұGұ@ұ9ұ2ұ+ұ$ұұұұұұѱѱѱѱѱѱѱѱѱѱѱѱѱѱѱѱѱѱ|ѱuѱnѱgѱ`ѱYѱRѱKѱDѱ=ѱ6ѱ/ѱ(ѱ!ѱѱѱ ѱѱбббббббббббббббббббyбrбkбdб]бVбOбHбAб:б3б,б%бббб ббϱϱϱϱϱϱϱϱϱϱϱϱϱϱϱϱϱϱ}ϱvϱoϱhϱaϱZϱSϱLϱEϱ>ϱ7ϱ0ϱ)ϱ"ϱϱϱ ϱϱαααααααααααααααααααzαsαlαeα^αWαPαIαBα;α4α-α&αααα ααͱͱͱͱͱͱͱͱͱͱͱͱͱͱͱͱͱͱ~ͱwͱpͱiͱbͱ[ͱTͱMͱFͱ?ͱ8ͱ1ͱ*ͱ#ͱͱͱͱͱͱ̱̱̱̱̱̱̱̱̱̱̱̱̱̱̱̱̱̱{̱ṯm̱f̱_̱X̱Q̱J̱C̱<̱5̱.̱'̱ ̱̱̱ ̱̱˱˱˱˱˱˱˱˱˱˱˱˱˱˱˱˱˱˱˱x˱q˱j˱c˱\˱U˱N˱G˱@˱9˱2˱+˱$˱˱˱˱˱˱ʱʱʱʱʱʱʱʱʱʱʱʱʱʱʱʱʱʱ|ʱuʱnʱgʱ`ʱYʱRʱKʱDʱ=ʱ6ʱ/ʱ(ʱ!ʱʱʱ ʱʱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱyɱrɱkɱdɱ]ɱVɱOɱHɱAɱ:ɱ3ɱ,ɱ%ɱɱɱɱ ɱɱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ}ȱvȱoȱhȱaȱZȱSȱLȱEȱ>ȱ7ȱ0ȱ)ȱ"ȱȱȱ ȱȱDZDZDZDZDZDZDZDZDZDZDZDZDZDZDZDZDZDZDZzDZsDZlDZeDZ^DZWDZPDZIDZBDZ;DZ4DZ-DZ&DZDZDZDZ DZDZƱƱƱƱƱƱƱƱƱƱƱƱƱƱƱƱƱƱ~ƱwƱpƱiƱbƱ[ƱTƱMƱFƱ?Ʊ8Ʊ1Ʊ*Ʊ#ƱƱƱƱƱƱűűűűűűűűűűűűűűűűűű{űtűműfű_űXűQűJűCű<ű5ű.ű'ű űűű űűıııııııııııııııııııxıqıjıcı\ıUıNıGı@ı9ı2ı+ı$ııııııññññññññññññññññññ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññ±±±±±±±±±±±±±±±±±±±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±}vohaZSLE>70)" zsle^WPIB;4-& 翱࿱ٿҿ˿Ŀ~wpib[TMF?81*#뾱侱ݾ־ϾȾ{tmf_XQJC<5.'  ア轱άڽӽ̽Žxqjc\UNG@92+$켱弱޼׼мɼ¼|ung`YRKD=6/(! 黱⻱ۻԻͻƻyrkd]VOHA:3,% 溱ߺغѺʺú}vohaZSLE>70)" 깱㹱ܹչιǹzsle^WPIB;4-& 縱ัٸҸ˸ĸ~wpib[TMF?81*#뷱䷱ݷַϷȷ{tmf_XQJC<5.'  ﶱ趱ᶱڶӶ̶Ŷxqjc\UNG@92+$쵱嵱޵׵еɵµ|ung`YRKD=6/(! 鴱ⴱ۴Դʹƴyrkd]VOHA:3,% 泱߳سѳʳó}vohaZSLE>70)" 겱㲱ܲղβDzzsle^WPIB;4-& 籱౱ٱұ˱ı~wpib[TMF?81*#백䰱ݰְϰȰ{tmf_XQJC<5.'  ﯱ诱ᯱگӯ̯ůxqjc\UNG@92+$쮱宱ޮ׮Юɮ®|ung`YRKD=6/(! 魱⭱ۭԭͭƭyrkd]VOHA:3,% 欱߬جѬʬì}vohaZSLE>70)" ꫱㫱ܫիΫǫzsle^WPIB;4-& 窱઱٪Ҫ˪Ī~wpib[TMF?81*#멱䩱ݩ֩ϩȩ{tmf_XQJC<5.'  僧許ᨱڨӨ̨Ũxqjc\UNG@92+$짱姱ާקЧɧ§|ung`YRKD=6/(! 馱⦱ۦԦͦƦyrkd]VOHA:3,% 楱ߥإѥʥå}vohaZSLE>70)" ꤱ㤱ܤդΤǤzsle^WPIB;4-& 磱ࣱ٣ңˣģ~wpib[TMF?81*#뢱䢱ݢ֢ϢȢ{tmf_XQJC<5.'  衱ᡱڡӡ̡šxqjc\UNG@92+$젱報ޠנРɠ |ung`YRKD=6/(! 韱⟱۟ԟ͟Ɵyrkd]VOHA:3,% ힱ枱ߞ؞ўʞÞ}vohaZSLE>70)" ꝱ㝱ܝ՝Νǝzsle^WPIB;4-& 眱ٜҜ˜Ĝ~wpib[TMF?81*#뛱䛱ݛ֛ϛț{tmf_XQJC<5.'  蚱ᚱښӚ̚Śxqjc\UNG@92+$왱噱ޙיЙə™|ung`YRKD=6/(! 阱☱ۘԘ͘Ƙyrkd]VOHA:3,% 헱旱ߗؗїʗ×}vohaZSLE>70)" ꖱ㖱ܖՖΖǖzsle^WPIB;4-& 畱ٕҕ˕ĕ~wpib[TMF?81*#딱䔱ݔ֔ϔȔ{tmf_XQJC<5.'  蓱ᓱړӓ̓œxqjc\UNG@92+$쒱咱ޒגВɒ’|ung`YRKD=6/(! 鑱⑱ۑԑ͑Ƒyrkd]VOHA:3,% 퐱搱ߐؐѐʐÐ}vohaZSLE>70)" ꏱ㏱܏ՏΏǏzsle^WPIB;4-& 玱َҎˎĎ~wpib[TMF?81*#덱䍱ݍ֍ύȍ{tmf_XQJC<5.'  茱ጱڌӌ̌Ōxqjc\UNG@92+$싱勱ދ׋Ћɋ‹|ung`YRKD=6/(! 銱⊱ۊԊ͊Ɗyrkd]VOHA:3,% 퉱扱߉؉щʉÉ}vohaZSLE>70)" ꈱ㈱܈ՈΈLjzsle^WPIB;4-& 燱ه҇ˇć~wpib[TMF?81*#놱䆱݆ֆφȆ{tmf_XQJC<5.'  腱ᅱڅӅ̅Ņxqjc\UNG@92+$성儱ބׄЄɄ„|ung`YRKD=6/(! 郱⃱ۃԃ̓ƃyrkd]VOHA:3,% 킱悱߂؂тʂÂ}vohaZSLE>70)" ꁱぱ܁Ձ΁ǁzsle^WPIB;4-& 瀱ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ߰߰߰߰߰߰߰߰߰߰߰߰߰߰߰߰߰߰~߰w߰p߰i߰b߰[߰T߰M߰F߰?߰8߰1߰*߰#߰߰߰߰߰߰ްްްްްްްްްްްްްްްްްް{ްtްmްfް_ްXްQްJްCް<ް5ް.ް'ް ްްް ްްݰݰݰݰݰݰݰݰݰݰݰݰݰݰݰݰݰݰݰxݰqݰjݰcݰ\ݰUݰNݰGݰ@ݰ9ݰ2ݰ+ݰ$ݰݰݰݰݰݰܰܰܰܰܰܰܰܰܰܰܰܰܰܰܰܰܰܰ|ܰuܰnܰgܰ`ܰYܰRܰKܰDܰ=ܰ6ܰ/ܰ(ܰ!ܰܰܰ ܰܰ۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰y۰r۰k۰d۰]۰V۰O۰H۰A۰:۰3۰,۰%۰۰۰۰ ۰۰ڰڰڰڰڰڰڰڰڰڰڰڰڰڰڰڰڰڰ}ڰvڰoڰhڰaڰZڰSڰLڰEڰ>ڰ7ڰ0ڰ)ڰ"ڰڰڰ ڰڰٰٰٰٰٰٰٰٰٰٰٰٰٰٰٰٰٰٰٰzٰsٰlٰeٰ^ٰWٰPٰIٰBٰ;ٰ4ٰ-ٰ&ٰٰٰٰ ٰٰذذذذذذذذذذذذذذذذذذ~ذwذpذiذbذ[ذTذMذFذ?ذ8ذ1ذ*ذ#ذذذذذذװװװװװװװװװװװװװװװװװװ{װtװmװfװ_װXװQװJװCװ<װ5װ.װ'װ װװװ װװְְְְְְְְְְְְְְְְְְְxְqְjְcְ\ְUְNְGְ@ְ9ְ2ְ+ְ$ְְְְְְհհհհհհհհհհհհհհհհհհ|հuհnհgհ`հYհRհKհDհ=հ6հ/հ(հ!հհհ հհ԰԰԰԰԰԰԰԰԰԰԰԰԰԰԰԰԰԰԰y԰r԰k԰d԰]԰V԰O԰H԰A԰:԰3԰,԰%԰԰԰԰ ԰԰ӰӰӰӰӰӰӰӰӰӰӰӰӰӰӰӰӰӰ}ӰvӰoӰhӰaӰZӰSӰLӰEӰ>Ӱ7Ӱ0Ӱ)Ӱ"ӰӰӰ ӰӰҰҰҰҰҰҰҰҰҰҰҰҰҰҰҰҰҰҰҰzҰsҰlҰeҰ^ҰWҰPҰIҰBҰ;Ұ4Ұ-Ұ&ҰҰҰҰ ҰҰѰѰѰѰѰѰѰѰѰѰѰѰѰѰѰѰѰѰ~ѰwѰpѰiѰbѰ[ѰTѰMѰFѰ?Ѱ8Ѱ1Ѱ*Ѱ#ѰѰѰѰѰѰаааааааааааааааааа{аtаmаfа_аXаQаJаCа<а5а.а'а ааа ааϰϰϰϰϰϰϰϰϰϰϰϰϰϰϰϰϰϰϰxϰqϰjϰcϰ\ϰUϰNϰGϰ@ϰ9ϰ2ϰ+ϰ$ϰϰϰϰϰϰΰΰΰΰΰΰΰΰΰΰΰΰΰΰΰΰΰΰ|ΰuΰnΰgΰ`ΰYΰRΰKΰDΰ=ΰ6ΰ/ΰ(ΰ!ΰΰΰ ΰΰͰͰͰͰͰͰͰͰͰͰͰͰͰͰͰͰͰͰͰyͰrͰkͰdͰ]ͰVͰOͰHͰAͰ:Ͱ3Ͱ,Ͱ%ͰͰͰͰ ͰͰ̰̰̰̰̰̰̰̰̰̰̰̰̰̰̰̰̰̰}̰v̰o̰h̰a̰Z̰S̰L̰Ḛ>̰7̰0̰)̰"̰̰̰ ̰̰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰z˰s˰l˰e˰^˰W˰P˰I˰B˰;˰4˰-˰&˰˰˰˰ ˰˰ʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰʰ~ʰwʰpʰiʰbʰ[ʰTʰMʰFʰ?ʰ8ʰ1ʰ*ʰ#ʰʰʰʰʰʰɰɰɰɰɰɰɰɰɰɰɰɰɰɰɰɰɰɰ{ɰtɰmɰfɰ_ɰXɰQɰJɰCɰ<ɰ5ɰ.ɰ'ɰ ɰɰɰ ɰɰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰxȰqȰjȰcȰ\ȰUȰNȰGȰ@Ȱ9Ȱ2Ȱ+Ȱ$ȰȰȰȰȰȰǰǰǰǰǰǰǰǰǰǰǰǰǰǰǰǰǰǰ|ǰuǰnǰgǰ`ǰYǰRǰKǰDǰ=ǰ6ǰ/ǰ(ǰ!ǰǰǰ ǰǰưưưưưưưưưưưưưưưưưưưyưrưkưdư]ưVưOưHưAư:ư3ư,ư%ưưưư ưưŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰ}ŰvŰoŰhŰaŰZŰSŰLŰEŰ>Ű7Ű0Ű)Ű"ŰŰŰ ŰŰİİİİİİİİİİİİİİİİİİİzİsİlİeİ^İWİPİIİBİ;İ4İ-İ&İİİİ İİðððððððððððððððððð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ðððððð°°°°°°°°°°°°°°°°°°{°t°m°f°_°X°Q°J°C°<°5°.°'° °°° °°xqjc\UNG@92+$|ung`YRKD=6/(! 鿰⿰ۿԿͿƿyrkd]VOHA:3,% 澰߾ؾѾʾþ}vohaZSLE>70)" 꽰㽰ܽսνǽzsle^WPIB;4-& 缰༰ټҼ˼ļ~wpib[TMF?81*#뻰仰ݻֻϻȻ{tmf_XQJC<5.'  ﺰ躰ẰںӺ̺źxqjc\UNG@92+$칰幰޹׹йɹ¹|ung`YRKD=6/(! 鸰⸰۸Ը͸Ƹyrkd]VOHA:3,% 淰߷طѷʷ÷}vohaZSLE>70)" 궰㶰ܶնζǶzsle^WPIB;4-& 絰൰ٵҵ˵ĵ~wpib[TMF?81*#봰䴰ݴִϴȴ{tmf_XQJC<5.'  ﳰ賰ᳰڳӳ̳ųxqjc\UNG@92+$첰岰޲ײвɲ²|ung`YRKD=6/(! 鱰Ɒ۱ԱͱƱyrkd]VOHA:3,% 氰߰ذѰʰð}vohaZSLE>70)" ꯰㯰ܯկίǯzsle^WPIB;4-& 箰ரٮҮˮĮ~wpib[TMF?81*#뭰䭰ݭ֭ϭȭ{tmf_XQJC<5.'  אּ謰ᬰڬӬ̬Ŭxqjc\UNG@92+$쫰嫰ޫ׫Ыɫ«|ung`YRKD=6/(! 骰⪰۪Ԫͪƪyrkd]VOHA:3,% 橰ߩةѩʩé}vohaZSLE>70)" ꨰ㨰ܨըΨǨzsle^WPIB;4-& 称ৰ٧ҧ˧ħ~wpib[TMF?81*#린䦰ݦ֦ϦȦ{tmf_XQJC<5.'  殺襰ᥰڥӥ̥ťxqjc\UNG@92+$줰夰ޤפФɤ¤|ung`YRKD=6/(! 飰⣰ۣԣͣƣyrkd]VOHA:3,% 械ߢآѢʢâ}vohaZSLE>70)" ꡰ㡰ܡաΡǡzsle^WPIB;4-& 砰࠰٠ҠˠĠ~wpib[TMF?81*#런䟰ݟ֟ϟȟ{tmf_XQJC<5.'  螰ឰڞӞ̞Şxqjc\UNG@92+$읰坰ޝםНɝ|ung`YRKD=6/(! 霰✰ۜԜ͜Ɯyrkd]VOHA:3,% 훰曰ߛ؛ћʛÛ}vohaZSLE>70)" ꚰ㚰ܚ՚Κǚzsle^WPIB;4-& 癰ٙҙ˙ę~wpib[TMF?81*#똰䘰ݘ֘ϘȘ{tmf_XQJC<5.'  藰ᗰڗӗ̗ŗxqjc\UNG@92+$얰喰ޖזЖɖ–|ung`YRKD=6/(! 镰╰ەԕ͕ƕyrkd]VOHA:3,% 픰攰ߔؔєʔÔ}vohaZSLE>70)" ꓰ㓰ܓՓΓǓzsle^WPIB;4-& 環ْҒ˒Ē~wpib[TMF?81*#둰䑰ݑ֑ϑȑ{tmf_XQJC<5.'  萰ᐰڐӐ̐Őxqjc\UNG@92+$쏰台ޏ׏Џɏ|ung`YRKD=6/(! 鎰⎰ێԎ͎Ǝyrkd]VOHA:3,% 퍰捰ߍ؍эʍÍ}vohaZSLE>70)" ꌰ㌰܌ՌΌnjzsle^WPIB;4-& 狰ًҋˋċ~wpib[TMF?81*#늰䊰݊֊ϊȊ{tmf_XQJC<5.'  艰ተډӉ̉ʼnxqjc\UNG@92+$숰到ވ׈ЈɈˆ|ung`YRKD=6/(! 釰⇰ۇԇ͇Ƈyrkd]VOHA:3,% 톰憰߆؆цʆÆ}vohaZSLE>70)" ꅰㅰ܅Յ΅Džzsle^WPIB;4-& 焰ل҄˄Ą~wpib[TMF?81*#냰䃰݃փσȃ{tmf_XQJC<5.'  肰Ⴐڂӂ̂łxqjc\UNG@92+$쁰偰ށׁЁɁ|ung`YRKD=6/(! 逰‰ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ߯߯߯߯߯߯߯߯߯߯߯߯߯߯߯߯߯߯߯y߯r߯k߯d߯]߯V߯O߯H߯A߯:߯3߯,߯%߯߯߯߯ ߯߯ޯޯޯޯޯޯޯޯޯޯޯޯޯޯޯޯޯޯ}ޯvޯoޯhޯaޯZޯSޯLޯEޯ>ޯ7ޯ0ޯ)ޯ"ޯޯޯ ޯޯݯݯݯݯݯݯݯݯݯݯݯݯݯݯݯݯݯݯݯzݯsݯlݯeݯ^ݯWݯPݯIݯBݯ;ݯ4ݯ-ݯ&ݯݯݯݯ ݯݯܯܯܯܯܯܯܯܯܯܯܯܯܯܯܯܯܯܯ~ܯwܯpܯiܯbܯ[ܯTܯMܯFܯ?ܯ8ܯ1ܯ*ܯ#ܯܯܯܯܯܯۯۯۯۯۯۯۯۯۯۯۯۯۯۯۯۯۯۯ{ۯtۯmۯfۯ_ۯXۯQۯJۯCۯ<ۯ5ۯ.ۯ'ۯ ۯۯۯ ۯۯگگگگگگگگگگگگگگگگگگگxگqگjگcگ\گUگNگGگ@گ9گ2گ+گ$گگگگگگٯٯٯٯٯٯٯٯٯٯٯٯٯٯٯٯٯٯ|ٯuٯnٯgٯ`ٯYٯRٯKٯDٯ=ٯ6ٯ/ٯ(ٯ!ٯٯٯ ٯٯدددددددددددددددددددyدrدkدdد]دVدOدHدAد:د3د,د%دددد ددׯׯׯׯׯׯׯׯׯׯׯׯׯׯׯׯׯׯ}ׯvׯoׯhׯaׯZׯSׯLׯEׯ>ׯ7ׯ0ׯ)ׯ"ׯׯׯ ׯׯ֯֯֯֯֯֯֯֯֯֯֯֯֯֯֯֯֯֯֯z֯s֯l֯e֯^֯W֯P֯I֯B֯;֯4֯-֯&֯֯֯֯ ֯֯կկկկկկկկկկկկկկկկկկ~կwկpկiկbկ[կTկMկFկ?կ8կ1կ*կ#կկկկկկԯԯԯԯԯԯԯԯԯԯԯԯԯԯԯԯԯԯ{ԯtԯmԯfԯ_ԯXԯQԯJԯCԯ<ԯ5ԯ.ԯ'ԯ ԯԯԯ ԯԯӯӯӯӯӯӯӯӯӯӯӯӯӯӯӯӯӯӯӯxӯqӯjӯcӯ\ӯUӯNӯGӯ@ӯ9ӯ2ӯ+ӯ$ӯӯӯӯӯӯүүүүүүүүүүүүүүүүүү|үuүnүgү`үYүRүKүDү=ү6ү/ү(ү!үүү үүѯѯѯѯѯѯѯѯѯѯѯѯѯѯѯѯѯѯѯyѯrѯkѯdѯ]ѯVѯOѯHѯAѯ:ѯ3ѯ,ѯ%ѯѯѯѯ ѯѯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ}ЯvЯoЯhЯaЯZЯSЯLЯEЯ>Я7Я0Я)Я"ЯЯЯ ЯЯϯϯϯϯϯϯϯϯϯϯϯϯϯϯϯϯϯϯϯzϯsϯlϯeϯ^ϯWϯPϯIϯBϯ;ϯ4ϯ-ϯ&ϯϯϯϯ ϯϯίίίίίίίίίίίίίίίίίί~ίwίpίiίbί[ίTίMίFί?ί8ί1ί*ί#ίίίίίίͯͯͯͯͯͯͯͯͯͯͯͯͯͯͯͯͯͯ{ͯtͯmͯfͯ_ͯXͯQͯJͯCͯ<ͯ5ͯ.ͯ'ͯ ͯͯͯ ̯̯̯̯̯̯̯̯̯̯̯̯̯̯̯̯̯̯̯ͯͯx̯q̯j̯c̯\̯U̯N̯G̯@̯9̯2̯+̯$̯̯̯̯̯̯˯˯˯˯˯˯˯˯˯˯˯˯˯˯˯˯˯˯|˯u˯n˯g˯`˯Y˯R˯K˯D˯=˯6˯/˯(˯!˯˯˯ ˯˯ʯʯʯʯʯʯʯʯʯʯʯʯʯʯʯʯʯʯʯyʯrʯkʯdʯ]ʯVʯOʯHʯAʯ:ʯ3ʯ,ʯ%ʯʯʯʯ ʯʯɯɯɯɯɯɯɯɯɯɯɯɯɯɯɯɯɯɯ}ɯvɯoɯhɯaɯZɯSɯLɯEɯ>ɯ7ɯ0ɯ)ɯ"ɯɯɯ ɯɯȯȯȯȯȯȯȯȯȯȯȯȯȯȯȯȯȯȯȯzȯsȯlȯeȯ^ȯWȯPȯIȯBȯ;ȯ4ȯ-ȯ&ȯȯȯȯ ȯȯǯǯǯǯǯǯǯǯǯǯǯǯǯǯǯǯǯǯ~ǯwǯpǯiǯbǯ[ǯTǯMǯFǯ?ǯ8ǯ1ǯ*ǯ#ǯǯǯǯǯǯƯƯƯƯƯƯƯƯƯƯƯƯƯƯƯƯƯƯ{ƯtƯmƯfƯ_ƯXƯQƯJƯCƯ<Ư5Ư.Ư'Ư ƯƯƯ ƯƯůůůůůůůůůůůůůůůůůůůxůqůjůců\ůUůNůGů@ů9ů2ů+ů$ůůůůůůįįįįįįįįįįįįįįįįįį|įuįnįgį`įYįRįKįDį=į6į/į(į!įįį įįïïïïïïïïïïïïïïïïïïïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïﯯ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯zsle^WPIB;4-& ~wpib[TMF?81*#뿯俯ݿֿϿȿ{tmf_XQJC<5.'  ᆵ辯ᾯھӾ̾žxqjc\UNG@92+$콯彯޽׽нɽ½|ung`YRKD=6/(! 鼯⼯ۼԼͼƼyrkd]VOHA:3,% 滯߻ػѻʻû}vohaZSLE>70)" 꺯㺯ܺպκǺzsle^WPIB;4-& 繯๯ٹҹ˹Ĺ~wpib[TMF?81*#븯丯ݸָϸȸ{tmf_XQJC<5.'  ﷯路ᷯڷӷ̷ŷxqjc\UNG@92+$춯嶯޶׶жɶ¶|ung`YRKD=6/(! 鵯ⵯ۵Ե͵Ƶyrkd]VOHA:3,% 洯ߴشѴʴô}vohaZSLE>70)" 곯㳯ܳճγdzzsle^WPIB;4-& 粯ಯٲҲ˲IJ~wpib[TMF?81*#뱯䱯ݱֱϱȱ{tmf_XQJC<5.'  ﰯ谯ᰯڰӰ̰Űxqjc\UNG@92+$쯯寯ޯׯЯɯ¯|ung`YRKD=6/(! 鮯⮯ۮԮͮƮyrkd]VOHA:3,% 歯߭حѭʭí}vohaZSLE>70)" ꬯㬯ܬլάǬzsle^WPIB;4-& 端૯٫ҫ˫ī~wpib[TMF?81*#몯䪯ݪ֪ϪȪ{tmf_XQJC<5.'  﩯詯ᩯکө̩ũxqjc\UNG@92+$쨯娯ިרШɨ¨|ung`YRKD=6/(! 駯⧯ۧԧͧƧyrkd]VOHA:3,% 榯ߦئѦʦæ}vohaZSLE>70)" ꥯ㥯ܥեΥǥzsle^WPIB;4-& 礯य٤ҤˤĤ~wpib[TMF?81*#룯䣯ݣ֣ϣȣ{tmf_XQJC<5.'  袯᢯ڢӢ̢Ţxqjc\UNG@92+$졯塯ޡסСɡ¡|ung`YRKD=6/(! 頯⠯۠Ԡ͠Ơyrkd]VOHA:3,% ퟯ柯ߟ؟џʟß}vohaZSLE>70)" ꞯ㞯ܞ՞ΞǞzsle^WPIB;4-& 睯ٝҝ˝ĝ~wpib[TMF?81*#뜯䜯ݜ֜ϜȜ{tmf_XQJC<5.'  蛯ᛯڛӛ̛śxqjc\UNG@92+$욯嚯ޚךКɚš|ung`YRKD=6/(! 陯♯ۙԙ͙ƙyrkd]VOHA:3,% 혯是ߘؘјʘØ}vohaZSLE>70)" ꗯ㗯ܗ՗ΗǗzsle^WPIB;4-& 疯ٖҖ˖Ė~wpib[TMF?81*#땯䕯ݕ֕ϕȕ{tmf_XQJC<5.'  蔯ᔯڔӔ̔Ŕxqjc\UNG@92+$쓯哯ޓדГɓ“|ung`YRKD=6/(! 钯⒯ےԒ͒ƒyrkd]VOHA:3,% 푯摯ߑؑёʑÑ}vohaZSLE>70)" ꐯ㐯ܐՐΐǐzsle^WPIB;4-& 珯ُҏˏď~wpib[TMF?81*#뎯䎯ݎ֎ώȎ{tmf_XQJC<5.'  药፯ڍӍ̍ōxqjc\UNG@92+$쌯匯ތ׌ЌɌŒ|ung`YRKD=6/(! 鋯⋯ۋԋ͋Ƌyrkd]VOHA:3,% 튯抯ߊ؊ъʊÊ}vohaZSLE>70)" ꉯ㉯܉ՉΉljzsle^WPIB;4-& 爯و҈ˈĈ~wpib[TMF?81*#뇯䇯݇ևχȇ{tmf_XQJC<5.'  膯ᆯچӆ̆ņxqjc\UNG@92+$셯兯ޅׅЅɅ…|ung`YRKD=6/(! 鄯ℯۄԄ̈́Ƅyrkd]VOHA:3,% 탯惯߃؃уʃÃ}vohaZSLE>70)" ꂯク܂Ղ΂ǂzsle^WPIB;4-& 灯فҁˁā~wpib[TMF?81*#뀯䀯݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#߮߮߮߮߮߮߮߮߮߮߮߮߮߮߮߮߮߮{߮t߮m߮f߮_߮X߮Q߮J߮C߮<߮5߮.߮'߮ ߮߮߮ ߮߮ޮޮޮޮޮޮޮޮޮޮޮޮޮޮޮޮޮޮޮxޮqޮjޮcޮ\ޮUޮNޮGޮ@ޮ9ޮ2ޮ+ޮ$ޮޮޮޮޮޮݮݮݮݮݮݮݮݮݮݮݮݮݮݮݮݮݮݮ|ݮuݮnݮgݮ`ݮYݮRݮKݮDݮ=ݮ6ݮ/ݮ(ݮ!ݮݮݮ ݮݮܮܮܮܮܮܮܮܮܮܮܮܮܮܮܮܮܮܮܮyܮrܮkܮdܮ]ܮVܮOܮHܮAܮ:ܮ3ܮ,ܮ%ܮܮܮܮ ܮܮۮۮۮۮۮۮۮۮۮۮۮۮۮۮۮۮۮۮ}ۮvۮoۮhۮaۮZۮSۮLۮEۮ>ۮ7ۮ0ۮ)ۮ"ۮۮۮ ۮۮڮڮڮڮڮڮڮڮڮڮڮڮڮڮڮڮڮڮڮzڮsڮlڮeڮ^ڮWڮPڮIڮBڮ;ڮ4ڮ-ڮ&ڮڮڮڮ ڮڮٮٮٮٮٮٮٮٮٮٮٮٮٮٮٮٮٮٮ~ٮwٮpٮiٮbٮ[ٮTٮMٮFٮ?ٮ8ٮ1ٮ*ٮ#ٮٮٮٮٮٮخخخخخخخخخخخخخخخخخخ{خtخmخfخ_خXخQخJخCخ<خ5خ.خ'خ خخخ خخ׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮x׮q׮j׮c׮\׮U׮N׮G׮@׮9׮2׮+׮$׮׮׮׮׮׮֮֮֮֮֮֮֮֮֮֮֮֮֮֮֮֮֮֮|֮u֮n֮g֮`֮Y֮R֮K֮D֮=֮6֮/֮(֮!֮֮֮ ֮֮ծծծծծծծծծծծծծծծծծծծyծrծkծdծ]ծVծOծHծAծ:ծ3ծ,ծ%ծծծծ ծծԮԮԮԮԮԮԮԮԮԮԮԮԮԮԮԮԮԮ}ԮvԮoԮhԮaԮZԮSԮLԮEԮ>Ԯ7Ԯ0Ԯ)Ԯ"ԮԮԮ ԮԮӮӮӮӮӮӮӮӮӮӮӮӮӮӮӮӮӮӮӮzӮsӮlӮeӮ^ӮWӮPӮIӮBӮ;Ӯ4Ӯ-Ӯ&ӮӮӮӮ ӮӮҮҮҮҮҮҮҮҮҮҮҮҮҮҮҮҮҮҮ~ҮwҮpҮiҮbҮ[ҮTҮMҮFҮ?Ү8Ү1Ү*Ү#ҮҮҮҮҮҮѮѮѮѮѮѮѮѮѮѮѮѮѮѮѮѮѮѮ{ѮtѮmѮfѮ_ѮXѮQѮJѮCѮ<Ѯ5Ѯ.Ѯ'Ѯ ѮѮѮ ѮѮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮxЮqЮjЮcЮ\ЮUЮNЮGЮ@Ю9Ю2Ю+Ю$ЮЮЮЮЮЮϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮ|ϮuϮnϮgϮ`ϮYϮRϮKϮDϮ=Ϯ6Ϯ/Ϯ(Ϯ!ϮϮϮ ϮϮήήήήήήήήήήήήήήήήήήήyήrήkήdή]ήVήOήHήAή:ή3ή,ή%ήήήή ήήͮͮͮͮͮͮͮͮͮͮͮͮͮͮͮͮͮͮ}ͮvͮoͮhͮaͮZͮSͮLͮEͮ>ͮ7ͮ0ͮ)ͮ"ͮͮͮ ̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮ͮͮz̮s̮l̮e̮^̮W̮P̮I̮B̮;̮4̮-̮&̮̮̮̮ ̮̮ˮˮˮˮˮˮˮˮˮˮˮˮˮˮˮˮˮˮ~ˮwˮpˮiˮbˮ[ˮTˮMˮFˮ?ˮ8ˮ1ˮ*ˮ#ˮˮˮˮˮˮʮʮʮʮʮʮʮʮʮʮʮʮʮʮʮʮʮʮ{ʮtʮmʮfʮ_ʮXʮQʮJʮCʮ<ʮ5ʮ.ʮ'ʮ ʮʮʮ ʮʮɮɮɮɮɮɮɮɮɮɮɮɮɮɮɮɮɮɮɮxɮqɮjɮcɮ\ɮUɮNɮGɮ@ɮ9ɮ2ɮ+ɮ$ɮɮɮɮɮɮȮȮȮȮȮȮȮȮȮȮȮȮȮȮȮȮȮȮ|ȮuȮnȮgȮ`ȮYȮRȮKȮDȮ=Ȯ6Ȯ/Ȯ(Ȯ!ȮȮȮ ȮȮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮyǮrǮkǮdǮ]ǮVǮOǮHǮAǮ:Ǯ3Ǯ,Ǯ%ǮǮǮǮ ǮǮƮƮƮƮƮƮƮƮƮƮƮƮƮƮƮƮƮƮ}ƮvƮoƮhƮaƮZƮSƮLƮEƮ>Ʈ7Ʈ0Ʈ)Ʈ"ƮƮƮ ƮƮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮzŮsŮlŮeŮ^ŮWŮPŮIŮBŮ;Ů4Ů-Ů&ŮŮŮŮ ŮŮĮĮĮĮĮĮĮĮĮĮĮĮĮĮĮĮĮĮ~ĮwĮpĮiĮbĮ[ĮTĮMĮFĮ?Į8Į1Į*Į#ĮĮĮĮĮĮîîîîîîîîîîîîîîîîîî{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îî®®®®®®®®®®®®®®®®®®®x®q®j®c®\®U®N®G®@®9®2®+®$®®®®®®|ung`YRKD=6/(! yrkd]VOHA:3,% 濮߿ؿѿʿÿ}vohaZSLE>70)" 꾮㾮ܾվξǾzsle^WPIB;4-& 置཮ٽҽ˽Ľ~wpib[TMF?81*#뼮伮ݼּϼȼ{tmf_XQJC<5.'  ﻮ軮Ữڻӻ̻Żxqjc\UNG@92+$캮庮޺׺кɺº|ung`YRKD=6/(! 鹮⹮۹Թ͹ƹyrkd]VOHA:3,% 渮߸ظѸʸø}vohaZSLE>70)" 귮㷮ܷշηǷzsle^WPIB;4-& 綮ථٶҶ˶Ķ~wpib[TMF?81*#뵮䵮ݵֵϵȵ{tmf_XQJC<5.'  ﴮ贮ᴮڴӴ̴Ŵxqjc\UNG@92+$쳮峮޳׳гɳ³|ung`YRKD=6/(! 鲮Ⲯ۲ԲͲƲyrkd]VOHA:3,% 汮߱رѱʱñ}vohaZSLE>70)" 갮㰮ܰհΰǰzsle^WPIB;4-& 篮௮ٯү˯į~wpib[TMF?81*#뮮䮮ݮ֮ϮȮ{tmf_XQJC<5.'  ﭮ譮᭮ڭӭ̭ŭxqjc\UNG@92+$쬮嬮ެ׬Ьɬ¬|ung`YRKD=6/(! 髮⫮۫ԫͫƫyrkd]VOHA:3,% 檮ߪتѪʪê}vohaZSLE>70)" ꩮ㩮ܩթΩǩzsle^WPIB;4-& 種ਮ٨Ҩ˨Ĩ~wpib[TMF?81*#맮䧮ݧ֧ϧȧ{tmf_XQJC<5.'  瑩覮᦮ڦӦ̦Ŧxqjc\UNG@92+$쥮奮ޥץХɥ¥|ung`YRKD=6/(! 餮⤮ۤԤͤƤyrkd]VOHA:3,% 森ߣأѣʣã}vohaZSLE>70)" ꢮ㢮ܢբ΢Ǣzsle^WPIB;4-& 确࡮١ҡˡġ~wpib[TMF?81*#렮䠮ݠ֠ϠȠ{tmf_XQJC<5.'  蟮៮ڟӟ̟şxqjc\UNG@92+$잮垮ޞמОɞž|ung`YRKD=6/(! 靮❮۝ԝ͝Ɲyrkd]VOHA:3,% 휮朮ߜ؜ќʜÜ}vohaZSLE>70)" ꛮ㛮ܛ՛ΛǛzsle^WPIB;4-& 皮ٚҚ˚Ě~wpib[TMF?81*#뙮䙮ݙ֙ϙș{tmf_XQJC<5.'  蘮ᘮژӘ̘Řxqjc\UNG@92+$엮嗮ޗחЗɗ—|ung`YRKD=6/(! 閮▮ۖԖ͖Ɩyrkd]VOHA:3,% 핮敮ߕؕѕʕÕ}vohaZSLE>70)" ꔮ㔮ܔՔΔǔzsle^WPIB;4-& 瓮ٓғ˓ē~wpib[TMF?81*#뒮䒮ݒ֒ϒȒ{tmf_XQJC<5.'  葮ᑮڑӑ̑őxqjc\UNG@92+$쐮吮ސאАɐ|ung`YRKD=6/(! 鏮⏮ۏԏ͏Əyrkd]VOHA:3,% 펮掮ߎ؎юʎÎ}vohaZSLE>70)" ꍮ㍮܍Ս΍Ǎzsle^WPIB;4-& 献ٌҌˌČ~wpib[TMF?81*#닮䋮݋֋ϋȋ{tmf_XQJC<5.'  芮ኮڊӊ̊Ŋxqjc\UNG@92+$쉮剮މ׉Љɉ‰|ung`YRKD=6/(! 鈮∮ۈԈ͈ƈyrkd]VOHA:3,% 퇮懮߇؇чʇÇ}vohaZSLE>70)" ꆮㆮ܆ՆΆdžzsle^WPIB;4-& 煮م҅˅ą~wpib[TMF?81*#넮䄮݄քτȄ{tmf_XQJC<5.'  胮ხڃӃ̃Ńxqjc\UNG@92+$삮傮ނׂЂɂ‚|ung`YRKD=6/(! 遮ہԁ́Ɓyrkd]VOHA:3,% 퀮怮߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߭߭߭߭߭߭߭߭߭߭߭߭߭߭߭߭߭߭}߭v߭o߭h߭a߭Z߭S߭L߭E߭>߭7߭0߭)߭"߭߭߭ ߭߭ޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭzޭsޭlޭeޭ^ޭWޭPޭIޭBޭ;ޭ4ޭ-ޭ&ޭޭޭޭ ޭޭݭݭݭݭݭݭݭݭݭݭݭݭݭݭݭݭݭݭ~ݭwݭpݭiݭbݭ[ݭTݭMݭFݭ?ݭ8ݭ1ݭ*ݭ#ݭݭݭݭݭݭܭܭܭܭܭܭܭܭܭܭܭܭܭܭܭܭܭܭ{ܭtܭmܭfܭ_ܭXܭQܭJܭCܭ<ܭ5ܭ.ܭ'ܭ ܭܭܭ ܭܭۭۭۭۭۭۭۭۭۭۭۭۭۭۭۭۭۭۭۭxۭqۭjۭcۭ\ۭUۭNۭGۭ@ۭ9ۭ2ۭ+ۭ$ۭۭۭۭۭۭڭڭڭڭڭڭڭڭڭڭڭڭڭڭڭڭڭڭ|ڭuڭnڭgڭ`ڭYڭRڭKڭDڭ=ڭ6ڭ/ڭ(ڭ!ڭڭڭ ڭڭ٭٭٭٭٭٭٭٭٭٭٭٭٭٭٭٭٭٭٭y٭r٭k٭d٭]٭V٭O٭H٭A٭:٭3٭,٭%٭٭٭٭ ٭٭حححححححححححححححححح}حvحoحhحaحZحSحLحEح>ح7ح0ح)ح"ححح حح׭׭׭׭׭׭׭׭׭׭׭׭׭׭׭׭׭׭׭z׭s׭l׭e׭^׭W׭P׭I׭B׭;׭4׭-׭&׭׭׭׭ ׭׭֭֭֭֭֭֭֭֭֭֭֭֭֭֭֭֭֭֭~֭w֭p֭i֭b֭[֭T֭M֭F֭?֭8֭1֭*֭#֭֭֭֭֭֭խխխխխխխխխխխխխխխխխխ{խtխmխfխ_խXխQխJխCխ<խ5խ.խ'խ խխխ խխԭԭԭԭԭԭԭԭԭԭԭԭԭԭԭԭԭԭԭxԭqԭjԭcԭ\ԭUԭNԭGԭ@ԭ9ԭ2ԭ+ԭ$ԭԭԭԭԭԭӭӭӭӭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ|ӭuӭnӭgӭ`ӭYӭRӭKӭDӭ=ӭ6ӭ/ӭ(ӭ!ӭӭӭ ӭӭҭҭҭҭҭҭҭҭҭҭҭҭҭҭҭҭҭҭҭyҭrҭkҭdҭ]ҭVҭOҭHҭAҭ:ҭ3ҭ,ҭ%ҭҭҭҭ ҭҭѭѭѭѭѭѭѭѭѭѭѭѭѭѭѭѭѭѭ}ѭvѭoѭhѭaѭZѭSѭLѭEѭ>ѭ7ѭ0ѭ)ѭ"ѭѭѭ ѭѭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭzЭsЭlЭeЭ^ЭWЭPЭIЭBЭ;Э4Э-Э&ЭЭЭЭ ЭЭϭϭϭϭϭϭϭϭϭϭϭϭϭϭϭϭϭϭ~ϭwϭpϭiϭbϭ[ϭTϭMϭFϭ?ϭ8ϭ1ϭ*ϭ#ϭϭϭϭϭϭέέέέέέέέέέέέέέέέέέ{έtέmέfέ_έXέQέJέCέ<έ5έ.έ'έ έέέ έέͭͭͭͭͭͭͭͭͭͭͭͭͭͭͭͭͭͭͭxͭqͭjͭcͭ\ͭUͭNͭGͭ@ͭ9ͭ2ͭ+ͭ$̭̭̭̭̭̭̭̭̭̭̭̭̭̭̭̭̭̭ͭͭͭͭͭͭ|̭ṷṋg̭`̭Y̭R̭K̭Ḓ=̭6̭/̭(̭!̭̭̭ ̭̭˭˭˭˭˭˭˭˭˭˭˭˭˭˭˭˭˭˭˭y˭r˭k˭d˭]˭V˭O˭H˭A˭:˭3˭,˭%˭˭˭˭ ˭˭ʭʭʭʭʭʭʭʭʭʭʭʭʭʭʭʭʭʭ}ʭvʭoʭhʭaʭZʭSʭLʭEʭ>ʭ7ʭ0ʭ)ʭ"ʭʭʭ ʭʭɭɭɭɭɭɭɭɭɭɭɭɭɭɭɭɭɭɭɭzɭsɭlɭeɭ^ɭWɭPɭIɭBɭ;ɭ4ɭ-ɭ&ɭɭɭɭ ɭɭȭȭȭȭȭȭȭȭȭȭȭȭȭȭȭȭȭȭ~ȭwȭpȭiȭbȭ[ȭTȭMȭFȭ?ȭ8ȭ1ȭ*ȭ#ȭȭȭȭȭȭǭǭǭǭǭǭǭǭǭǭǭǭǭǭǭǭǭǭ{ǭtǭmǭfǭ_ǭXǭQǭJǭCǭ<ǭ5ǭ.ǭ'ǭ ǭǭǭ ǭǭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭƭxƭqƭjƭcƭ\ƭUƭNƭGƭ@ƭ9ƭ2ƭ+ƭ$ƭƭƭƭƭƭŭŭŭŭŭŭŭŭŭŭŭŭŭŭŭŭŭŭ|ŭuŭnŭgŭ`ŭYŭRŭKŭDŭ=ŭ6ŭ/ŭ(ŭ!ŭŭŭ ŭŭĭĭĭĭĭĭĭĭĭĭĭĭĭĭĭĭĭĭĭyĭrĭkĭdĭ]ĭVĭOĭHĭAĭ:ĭ3ĭ,ĭ%ĭĭĭĭ ĭĭíííííííííííííííííí}ívíoíhíaíZíSíLíEí>í7í0í)í"ííí íí­­­­­­­­­­­­­­­­­­­z­s­l­e­^­W­P­I­B­;­4­-­&­­­­ ­­~wpib[TMF?81*#{tmf_XQJC<5.'  ■迭῭ڿӿ̿ſxqjc\UNG@92+$쾭徭޾׾оɾ¾|ung`YRKD=6/(! 齭⽭۽Խͽƽyrkd]VOHA:3,% 漭߼ؼѼʼü}vohaZSLE>70)" 껭㻭ܻջλǻzsle^WPIB;4-& 纭ອٺҺ˺ĺ~wpib[TMF?81*#빭乭ݹֹϹȹ{tmf_XQJC<5.'  ︭踭ḭڸӸ̸Ÿxqjc\UNG@92+$췭巭޷׷зɷ·|ung`YRKD=6/(! 鶭ⶭ۶ԶͶƶyrkd]VOHA:3,% 浭ߵصѵʵõ}vohaZSLE>70)" 괭㴭ܴմδǴzsle^WPIB;4-& 糭೭ٳҳ˳ij~wpib[TMF?81*#벭䲭ݲֲϲȲ{tmf_XQJC<5.'  ﱭ豭ᱭڱӱ̱űxqjc\UNG@92+$찭尭ްװаɰ°|ung`YRKD=6/(! 鯭⯭ۯԯͯƯyrkd]VOHA:3,% 殭߮خѮʮî}vohaZSLE>70)" ꭭㭭ܭխέǭzsle^WPIB;4-& 笭ଭ٬ҬˬĬ~wpib[TMF?81*#뫭䫭ݫ֫ϫȫ{tmf_XQJC<5.'  節読᪭ڪӪ̪Ūxqjc\UNG@92+$쩭婭ީשЩɩ©|ung`YRKD=6/(! 騭⨭ۨԨͨƨyrkd]VOHA:3,% 槭ߧاѧʧç}vohaZSLE>70)" ꦭ㦭ܦզΦǦzsle^WPIB;4-& 祭७٥ҥ˥ĥ~wpib[TMF?81*#뤭䤭ݤ֤ϤȤ{tmf_XQJC<5.'  裭ᣭڣӣ̣ţxqjc\UNG@92+$좭墭ޢעТɢ¢|ung`YRKD=6/(! 顭⡭ۡԡ͡ơyrkd]VOHA:3,% 栭ߠؠѠʠà}vohaZSLE>70)" ꟭㟭ܟ՟Οǟzsle^WPIB;4-& 瞭ٞҞ˞Ğ~wpib[TMF?81*#띭䝭ݝ֝ϝȝ{tmf_XQJC<5.'  蜭ᜭڜӜ̜Ŝxqjc\UNG@92+$웭园ޛכЛɛ›|ung`YRKD=6/(! 隭⚭ۚԚ͚ƚyrkd]VOHA:3,% 홭晭ߙؙљʙÙ}vohaZSLE>70)" ꘭㘭ܘ՘Θǘzsle^WPIB;4-& 痭ٗҗ˗ė~wpib[TMF?81*#떭䖭ݖ֖ϖȖ{tmf_XQJC<5.'  蕭ᕭڕӕ̕ŕxqjc\UNG@92+$씭唭ޔהДɔ”|ung`YRKD=6/(! 铭⓭ۓԓ͓Ɠyrkd]VOHA:3,% 풭播ߒؒђʒÒ}vohaZSLE>70)" ꑭ㑭ܑՑΑǑzsle^WPIB;4-& 琭ِҐːĐ~wpib[TMF?81*#돭䏭ݏ֏Ϗȏ{tmf_XQJC<5.'  莭Ꭽڎӎ̎Ŏxqjc\UNG@92+$썭卭ލ׍Ѝɍ|ung`YRKD=6/(! 錭⌭یԌ͌ƌyrkd]VOHA:3,% 틭拭ߋ؋ыʋË}vohaZSLE>70)" ꊭ㊭܊ՊΊNJzsle^WPIB;4-& 牭ى҉ˉĉ~wpib[TMF?81*#눭䈭݈ֈψȈ{tmf_XQJC<5.'  臭ᇭڇӇ̇Ňxqjc\UNG@92+$솭冭ކ׆ІɆ†|ung`YRKD=6/(! 酭Ⅽۅԅͅƅyrkd]VOHA:3,% 턭愭߄؄фʄÄ}vohaZSLE>70)" ꃭロ܃Ճ΃ǃzsle^WPIB;4-& 炭ق҂˂Ă~wpib[TMF?81*#끭䁭݁ցρȁ{tmf_XQJC<5.'  耭ိڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ߬߬߬߬߬߬߬߬߬߬߬߬߬߬߬߬߬߬߬x߬q߬j߬c߬\߬U߬N߬G߬@߬9߬2߬+߬$߬߬߬߬߬߬ެެެެެެެެެެެެެެެެެެ|ެuެnެgެ`ެYެRެKެDެ=ެ6ެ/ެ(ެ!ެެެ ެެݬݬݬݬݬݬݬݬݬݬݬݬݬݬݬݬݬݬݬyݬrݬkݬdݬ]ݬVݬOݬHݬAݬ:ݬ3ݬ,ݬ%ݬݬݬݬ ݬݬܬܬܬܬܬܬܬܬܬܬܬܬܬܬܬܬܬܬ}ܬvܬoܬhܬaܬZܬSܬLܬEܬ>ܬ7ܬ0ܬ)ܬ"ܬܬܬ ܬܬ۬۬۬۬۬۬۬۬۬۬۬۬۬۬۬۬۬۬۬z۬s۬l۬e۬^۬W۬P۬I۬B۬;۬4۬-۬&۬۬۬۬ ۬۬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬڬڬڬڬ~ڬwڬpڬiڬbڬ[ڬTڬMڬFڬ?ڬ8ڬ1ڬ*ڬ#ڬڬڬڬڬڬ٬٬٬٬٬٬٬٬٬٬٬٬٬٬٬٬٬٬{٬t٬m٬f٬_٬X٬Q٬J٬C٬<٬5٬.٬'٬ ٬٬٬ ٬٬جججججججججججججججججججxجqجjجcج\جUجNجGج@ج9ج2ج+ج$جججججج׬׬׬׬׬׬׬׬׬׬׬׬׬׬׬׬׬׬|׬u׬n׬g׬`׬Y׬R׬K׬D׬=׬6׬/׬(׬!׬׬׬ ׬׬֬֬֬֬֬֬֬֬֬֬֬֬֬֬֬֬֬֬֬y֬r֬k֬d֬]֬V֬O֬H֬A֬:֬3֬,֬%֬֬֬֬ ֬֬լլլլլլլլլլլլլլլլլլ}լvլoլhլaլZլSլLլEլ>լ7լ0լ)լ"լլլ լլԬԬԬԬԬԬԬԬԬԬԬԬԬԬԬԬԬԬԬzԬsԬlԬeԬ^ԬWԬPԬIԬBԬ;Ԭ4Ԭ-Ԭ&ԬԬԬԬ ԬԬӬӬӬӬӬӬӬӬӬӬӬӬӬӬӬӬӬӬ~ӬwӬpӬiӬbӬ[ӬTӬMӬFӬ?Ӭ8Ӭ1Ӭ*Ӭ#ӬӬӬӬӬӬҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬ{ҬtҬmҬfҬ_ҬXҬQҬJҬCҬ<Ҭ5Ҭ.Ҭ'Ҭ ҬҬҬ ҬҬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬѬxѬqѬjѬcѬ\ѬUѬNѬGѬ@Ѭ9Ѭ2Ѭ+Ѭ$ѬѬѬѬѬѬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ|ЬuЬnЬgЬ`ЬYЬRЬKЬDЬ=Ь6Ь/Ь(Ь!ЬЬЬ ЬЬϬϬϬϬϬϬϬϬϬϬϬϬϬϬϬϬϬϬϬyϬrϬkϬdϬ]ϬVϬOϬHϬAϬ:Ϭ3Ϭ,Ϭ%ϬϬϬϬ ϬϬάάάάάάάάάάάάάάάάάά}άvάoάhάaάZάSάLάEά>ά7ά0ά)ά"άάά άάͬͬͬͬͬͬͬͬͬͬͬͬͬͬͬͬͬͬͬzͬsͬlͬeͬ^ͬWͬPͬIͬBͬ;ͬ4ͬ-ͬ&ͬͬͬͬ ̬̬̬̬̬̬̬̬̬̬̬̬̬̬̬̬̬̬ͬͬ~̬w̬p̬i̬b̬[̬T̬M̬F̬?̬8̬1̬*̬#̬̬̬̬̬̬ˬˬˬˬˬˬˬˬˬˬˬˬˬˬˬˬˬˬ{ˬtˬmˬfˬ_ˬXˬQˬJˬCˬ<ˬ5ˬ.ˬ'ˬ ˬˬˬ ˬˬʬʬʬʬʬʬʬʬʬʬʬʬʬʬʬʬʬʬʬxʬqʬjʬcʬ\ʬUʬNʬGʬ@ʬ9ʬ2ʬ+ʬ$ʬʬʬʬʬʬɬɬɬɬɬɬɬɬɬɬɬɬɬɬɬɬɬɬ|ɬuɬnɬgɬ`ɬYɬRɬKɬDɬ=ɬ6ɬ/ɬ(ɬ!ɬɬɬ ɬɬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬyȬrȬkȬdȬ]ȬVȬOȬHȬAȬ:Ȭ3Ȭ,Ȭ%ȬȬȬȬ ȬȬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬ}ǬvǬoǬhǬaǬZǬSǬLǬEǬ>Ǭ7Ǭ0Ǭ)Ǭ"ǬǬǬ ǬǬƬƬƬƬƬƬƬƬƬƬƬƬƬƬƬƬƬƬƬzƬsƬlƬeƬ^ƬWƬPƬIƬBƬ;Ƭ4Ƭ-Ƭ&ƬƬƬƬ ƬƬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬ~ŬwŬpŬiŬbŬ[ŬTŬMŬFŬ?Ŭ8Ŭ1Ŭ*Ŭ#ŬŬŬŬŬŬĬĬĬĬĬĬĬĬĬĬĬĬĬĬĬĬĬĬ{ĬtĬmĬfĬ_ĬXĬQĬJĬCĬ<Ĭ5Ĭ.Ĭ'Ĭ ĬĬĬ ĬĬìììììììììììììììììììxìqìjìcì\ìUìNìGì@ì9ì2ì+ì$ììììì쬬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬|¬u¬n¬g¬`¬Y¬R¬K¬D¬=¬6¬/¬(¬!¬¬¬ ¬¬yrkd]VOHA:3,% }vohaZSLE>70)" 꿬㿬ܿտοǿzsle^WPIB;4-& 羬ྫྷپҾ˾ľ~wpib[TMF?81*#뽬佬ݽֽϽȽ{tmf_XQJC<5.'  L輬ἬڼӼ̼żxqjc\UNG@92+$컬廬޻׻лɻ»|ung`YRKD=6/(! 麬⺬ۺԺͺƺyrkd]VOHA:3,% 湬߹عѹʹù}vohaZSLE>70)" 긬㸬ܸոθǸzsle^WPIB;4-& 緬෬ٷҷ˷ķ~wpib[TMF?81*#붬䶬ݶֶ϶ȶ{tmf_XQJC<5.'  ﵬ赬ᵬڵӵ̵ŵxqjc\UNG@92+$촬崬޴״дɴ´|ung`YRKD=6/(! 鳬ⳬ۳ԳͳƳyrkd]VOHA:3,% 沬߲زѲʲò}vohaZSLE>70)" 걬㱬ܱձαDZzsle^WPIB;4-& 簬బٰҰ˰İ~wpib[TMF?81*#믬䯬ݯ֯ϯȯ{tmf_XQJC<5.'  ﮬ讬ᮬڮӮ̮Ůxqjc\UNG@92+$쭬孬ޭ׭Эɭ­|ung`YRKD=6/(! 鬬⬬۬ԬͬƬyrkd]VOHA:3,% 櫬߫ثѫʫë}vohaZSLE>70)" ꪬ㪬ܪժΪǪzsle^WPIB;4-& 穬੬٩ҩ˩ĩ~wpib[TMF?81*#먬䨬ݨ֨ϨȨ{tmf_XQJC<5.'  溺觬᧬ڧӧ̧ŧxqjc\UNG@92+$즬妬ަצЦɦ¦|ung`YRKD=6/(! 饬⥬ۥԥͥƥyrkd]VOHA:3,% 椬ߤؤѤʤä}vohaZSLE>70)" ꣬㣬ܣգΣǣzsle^WPIB;4-& 碬ࢬ٢ҢˢĢ~wpib[TMF?81*#롬䡬ݡ֡ϡȡ{tmf_XQJC<5.'  蠬ᠬڠӠ̠Šxqjc\UNG@92+$쟬埬ޟןПɟŸ|ung`YRKD=6/(! 鞬➬۞Ԟ͞ƞyrkd]VOHA:3,% 희杬ߝ؝ѝʝÝ}vohaZSLE>70)" Ꜭ㜬ܜ՜Μǜzsle^WPIB;4-& 盬ٛқ˛ě~wpib[TMF?81*#뚬䚬ݚ֚ϚȚ{tmf_XQJC<5.'  虬ᙬڙә̙řxqjc\UNG@92+$올嘬ޘטИɘ˜|ung`YRKD=6/(! 闬◬ۗԗ͗Ɨyrkd]VOHA:3,% 햬斬ߖؖіʖÖ}vohaZSLE>70)" ꕬ㕬ܕՕΕǕzsle^WPIB;4-& 甬ٔҔ˔Ĕ~wpib[TMF?81*#듬䓬ݓ֓ϓȓ{tmf_XQJC<5.'  蒬ᒬڒӒ̒Œxqjc\UNG@92+$쑬呬ޑבБɑ‘|ung`YRKD=6/(! 鐬␬ېԐ͐Ɛyrkd]VOHA:3,% 포揬ߏ؏яʏÏ}vohaZSLE>70)" ꎬ㎬܎ՎΎǎzsle^WPIB;4-& 獬ٍҍˍč~wpib[TMF?81*#댬䌬݌֌όȌ{tmf_XQJC<5.'  苬ዬڋӋ̋ŋxqjc\UNG@92+$슬劬ފ׊ЊɊŠ|ung`YRKD=6/(! 鉬≬ۉԉ͉Ɖyrkd]VOHA:3,% 투戬߈؈шʈÈ}vohaZSLE>70)" ꇬ㇬܇Շ·LJzsle^WPIB;4-& 熬ن҆ˆĆ~wpib[TMF?81*#녬䅬݅օυȅ{tmf_XQJC<5.'  脬ᄬڄӄ̄ńxqjc\UNG@92+$샬僬ރ׃ЃɃƒ|ung`YRKD=6/(! 邬€ۂԂ͂Ƃyrkd]VOHA:3,% 크恬߁؁сʁÁ}vohaZSLE>70)" ꀬ〬܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ߫߫߫߫߫߫߫߫߫߫߫߫߫߫߫߫߫߫߫z߫s߫l߫e߫^߫W߫P߫I߫B߫;߫4߫-߫&߫߫߫߫ ߫߫ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ~ޫwޫpޫiޫbޫ[ޫTޫMޫFޫ?ޫ8ޫ1ޫ*ޫ#ޫޫޫޫޫޫݫݫݫݫݫݫݫݫݫݫݫݫݫݫݫݫݫݫ{ݫtݫmݫfݫ_ݫXݫQݫJݫCݫ<ݫ5ݫ.ݫ'ݫ ݫݫݫ ݫݫܫܫܫܫܫܫܫܫܫܫܫܫܫܫܫܫܫܫܫxܫqܫjܫcܫ\ܫUܫNܫGܫ@ܫ9ܫ2ܫ+ܫ$ܫܫܫܫܫܫ۫۫۫۫۫۫۫۫۫۫۫۫۫۫۫۫۫۫|۫u۫n۫g۫`۫Y۫R۫K۫D۫=۫6۫/۫(۫!۫۫۫ ۫۫ګګګګګګګګګګګګګګګګګګګyګrګkګdګ]ګVګOګHګAګ:ګ3ګ,ګ%ګګګګ ګګ٫٫٫٫٫٫٫٫٫٫٫٫٫٫٫٫٫٫}٫v٫o٫h٫a٫Z٫S٫L٫E٫>٫7٫0٫)٫"٫٫٫ ٫٫ثثثثثثثثثثثثثثثثثثثzثsثlثeث^ثWثPثIثBث;ث4ث-ث&ثثثث ثث׫׫׫׫׫׫׫׫׫׫׫׫׫׫׫׫׫׫~׫w׫p׫i׫b׫[׫T׫M׫F׫?׫8׫1׫*׫#׫׫׫׫׫׫֫֫֫֫֫֫֫֫֫֫֫֫֫֫֫֫֫֫{֫t֫m֫f֫_֫X֫Q֫J֫C֫<֫5֫.֫'֫ ֫֫֫ ֫֫իիիիիիիիիիիիիիիիիիիxիqիjիcի\իUիNիGի@ի9ի2ի+ի$իիիիիիԫԫԫԫԫԫԫԫԫԫԫԫԫԫԫԫԫԫ|ԫuԫnԫgԫ`ԫYԫRԫKԫDԫ=ԫ6ԫ/ԫ(ԫ!ԫԫԫ ԫԫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫyӫrӫkӫdӫ]ӫVӫOӫHӫAӫ:ӫ3ӫ,ӫ%ӫӫӫӫ ӫӫҫҫҫҫҫҫҫҫҫҫҫҫҫҫҫҫҫҫ}ҫvҫoҫhҫaҫZҫSҫLҫEҫ>ҫ7ҫ0ҫ)ҫ"ҫҫҫ ҫҫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫzѫsѫlѫeѫ^ѫWѫPѫIѫBѫ;ѫ4ѫ-ѫ&ѫѫѫѫ ѫѫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ~ЫwЫpЫiЫbЫ[ЫTЫMЫFЫ?Ы8Ы1Ы*Ы#ЫЫЫЫЫЫϫϫϫϫϫϫϫϫϫϫϫϫϫϫϫϫϫϫ{ϫtϫmϫfϫ_ϫXϫQϫJϫCϫ<ϫ5ϫ.ϫ'ϫ ϫϫϫ ϫϫΫΫΫΫΫΫΫΫΫΫΫΫΫΫΫΫΫΫΫxΫqΫjΫcΫ\ΫUΫNΫGΫ@Ϋ9Ϋ2Ϋ+Ϋ$ΫΫΫΫΫΫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫ|ͫuͫnͫgͫ`ͫYͫRͫKͫDͫ=ͫ6ͫ/ͫ(ͫ!ͫͫͫ ̫̫̫̫̫̫̫̫̫̫̫̫̫̫̫̫̫̫̫ͫͫy̫r̫k̫d̫]̫V̫O̫H̫A̫:̫3̫,̫%̫̫̫̫ ̫̫˫˫˫˫˫˫˫˫˫˫˫˫˫˫˫˫˫˫}˫v˫o˫h˫a˫Z˫S˫L˫E˫>˫7˫0˫)˫"˫˫˫ ˫˫ʫʫʫʫʫʫʫʫʫʫʫʫʫʫʫʫʫʫʫzʫsʫlʫeʫ^ʫWʫPʫIʫBʫ;ʫ4ʫ-ʫ&ʫʫʫʫ ʫʫɫɫɫɫɫɫɫɫɫɫɫɫɫɫɫɫɫɫ~ɫwɫpɫiɫbɫ[ɫTɫMɫFɫ?ɫ8ɫ1ɫ*ɫ#ɫɫɫɫɫɫȫȫȫȫȫȫȫȫȫȫȫȫȫȫȫȫȫȫ{ȫtȫmȫfȫ_ȫXȫQȫJȫCȫ<ȫ5ȫ.ȫ'ȫ ȫȫȫ ȫȫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫxǫqǫjǫcǫ\ǫUǫNǫGǫ@ǫ9ǫ2ǫ+ǫ$ǫǫǫǫǫǫƫƫƫƫƫƫƫƫƫƫƫƫƫƫƫƫƫƫ|ƫuƫnƫgƫ`ƫYƫRƫKƫDƫ=ƫ6ƫ/ƫ(ƫ!ƫƫƫ ƫƫūūūūūūūūūūūūūūūūūūūyūrūkūdū]ūVūOūHūAū:ū3ū,ū%ūūūū ūūīīīīīīīīīīīīīīīīīī}īvīoīhīaīZīSīLīEī>ī7ī0ī)ī"īīī īīëëëëëëëëëëëëëëëëëëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëë««««««««««««««««««~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««{tmf_XQJC<5.'  xqjc\UNG@92+$쿫快޿׿пɿ¿|ung`YRKD=6/(! 龫⾫۾Ծ;ƾyrkd]VOHA:3,% 潫߽ؽѽʽý}vohaZSLE>70)" 꼫㼫ܼռμǼzsle^WPIB;4-& 绫໫ٻһ˻Ļ~wpib[TMF?81*#뺫享ݺֺϺȺ{tmf_XQJC<5.'  ﹫蹫ṫڹӹ̹Źxqjc\UNG@92+$츫師޸׸иɸ¸|ung`YRKD=6/(! 鷫ⷫ۷ԷͷƷyrkd]VOHA:3,% 涫߶ضѶʶö}vohaZSLE>70)" 굫㵫ܵյεǵzsle^WPIB;4-& 紫ഫٴҴ˴Ĵ~wpib[TMF?81*#볫䳫ݳֳϳȳ{tmf_XQJC<5.'  ﲫ貫ᲫڲӲ̲Ųxqjc\UNG@92+$챫屫ޱױбɱ±|ung`YRKD=6/(! 鰫Ⱛ۰԰Ͱưyrkd]VOHA:3,% 毫߯دѯʯï}vohaZSLE>70)" ꮫ㮫ܮծήǮzsle^WPIB;4-& 筫୫٭ҭ˭ĭ~wpib[TMF?81*#묫䬫ݬ֬ϬȬ{tmf_XQJC<5.'  﫫諫᫫ګӫ̫ūxqjc\UNG@92+$쪫媫ުתЪɪª|ung`YRKD=6/(! 驫⩫۩ԩͩƩyrkd]VOHA:3,% 樫ߨبѨʨè}vohaZSLE>70)" ꧫ㧫ܧէΧǧzsle^WPIB;4-& 禫ফ٦Ҧ˦Ħ~wpib[TMF?81*#륫䥫ݥ֥ϥȥ{tmf_XQJC<5.'  狼褫ᤫڤӤ̤Ťxqjc\UNG@92+$죫士ޣףУɣ£|ung`YRKD=6/(! 颫⢫ۢԢ͢Ƣyrkd]VOHA:3,% 桫ߡءѡʡá}vohaZSLE>70)" ꠫㠫ܠՠΠǠzsle^WPIB;4-& 矫ٟҟ˟ğ~wpib[TMF?81*#랫䞫ݞ֞ϞȞ{tmf_XQJC<5.'  蝫ᝫڝӝ̝ŝxqjc\UNG@92+$윫圫ޜלМɜœ|ung`YRKD=6/(! 雫⛫ۛԛ͛ƛyrkd]VOHA:3,% 횫暫ߚؚњʚÚ}vohaZSLE>70)" ꙫ㙫ܙՙΙǙzsle^WPIB;4-& 瘫٘Ҙ˘Ę~wpib[TMF?81*#뗫䗫ݗ֗ϗȗ{tmf_XQJC<5.'  薫ᖫږӖ̖Ŗxqjc\UNG@92+$앫啫ޕוЕɕ•|ung`YRKD=6/(! 锫┫۔Ԕ͔Ɣyrkd]VOHA:3,% 퓫擫ߓؓѓʓÓ}vohaZSLE>70)" ꒫㒫ܒՒΒǒzsle^WPIB;4-& 瑫ّґˑđ~wpib[TMF?81*#됫䐫ݐ֐ϐȐ{tmf_XQJC<5.'  菫Ꮻڏӏ̏ŏxqjc\UNG@92+$쎫厫ގ׎ЎɎŽ|ung`YRKD=6/(! 鍫⍫ۍԍ͍ƍyrkd]VOHA:3,% 팫挫ߌ،ьʌÌ}vohaZSLE>70)" ꋫ㋫܋Ջ΋Njzsle^WPIB;4-& 犫يҊˊĊ~wpib[TMF?81*#뉫䉫݉։ωȉ{tmf_XQJC<5.'  舫ራڈӈ̈ňxqjc\UNG@92+$쇫凫އׇЇɇ‡|ung`YRKD=6/(! 醫↫ۆԆ͆Ɔyrkd]VOHA:3,% 텫慫߅؅хʅÅ}vohaZSLE>70)" ꄫㄫ܄Մ΄DŽzsle^WPIB;4-& 烫ك҃˃ă~wpib[TMF?81*#낫䂫݂ւςȂ{tmf_XQJC<5.'  聫ၫځӁ́Łxqjc\UNG@92+$쀫倫ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$ߪߪߪߪߪߪߪߪߪߪߪߪߪߪߪߪߪߪ|ߪuߪnߪgߪ`ߪYߪRߪKߪDߪ=ߪ6ߪ/ߪ(ߪ!ߪߪߪ ߪߪުުުުުުުުުުުުުުުުުުުyުrުkުdު]ުVުOުHުAު:ު3ު,ު%ުުުު ުުݪݪݪݪݪݪݪݪݪݪݪݪݪݪݪݪݪݪ}ݪvݪoݪhݪaݪZݪSݪLݪEݪ>ݪ7ݪ0ݪ)ݪ"ݪݪݪ ݪݪܪܪܪܪܪܪܪܪܪܪܪܪܪܪܪܪܪܪܪzܪsܪlܪeܪ^ܪWܪPܪIܪBܪ;ܪ4ܪ-ܪ&ܪܪܪܪ ܪܪ۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪۪~۪w۪p۪i۪b۪[۪T۪M۪F۪?۪8۪1۪*۪#۪۪۪۪۪۪ڪڪڪڪڪڪڪڪڪڪڪڪڪڪڪڪڪڪ{ڪtڪmڪfڪ_ڪXڪQڪJڪCڪ<ڪ5ڪ.ڪ'ڪ ڪڪڪ ڪڪ٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪x٪q٪j٪c٪\٪U٪N٪G٪@٪9٪2٪+٪$٪٪٪٪٪٪تتتتتتتتتتتتتتتتتت|تuتnتgت`تYتRتKتDت=ت6ت/ت(ت!تتت تتתתתתתתתתתתתתתתתתתתתyתrתkתdת]תVתOתHתAת:ת3ת,ת%תתתת תת֪֪֪֪֪֪֪֪֪֪֪֪֪֪֪֪֪֪}֪v֪o֪h֪a֪Z֪S֪L֪E֪>֪7֪0֪)֪"֪֪֪ ֪֪ժժժժժժժժժժժժժժժժժժժzժsժlժeժ^ժWժPժIժBժ;ժ4ժ-ժ&ժժժժ ժժԪԪԪԪԪԪԪԪԪԪԪԪԪԪԪԪԪԪ~ԪwԪpԪiԪbԪ[ԪTԪMԪFԪ?Ԫ8Ԫ1Ԫ*Ԫ#ԪԪԪԪԪԪӪӪӪӪӪӪӪӪӪӪӪӪӪӪӪӪӪӪ{ӪtӪmӪfӪ_ӪXӪQӪJӪCӪ<Ӫ5Ӫ.Ӫ'Ӫ ӪӪӪ ӪӪҪҪҪҪҪҪҪҪҪҪҪҪҪҪҪҪҪҪҪxҪqҪjҪcҪ\ҪUҪNҪGҪ@Ҫ9Ҫ2Ҫ+Ҫ$ҪҪҪҪҪҪѪѪѪѪѪѪѪѪѪѪѪѪѪѪѪѪѪѪ|ѪuѪnѪgѪ`ѪYѪRѪKѪDѪ=Ѫ6Ѫ/Ѫ(Ѫ!ѪѪѪ ѪѪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪyЪrЪkЪdЪ]ЪVЪOЪHЪAЪ:Ъ3Ъ,Ъ%ЪЪЪЪ ЪЪϪϪϪϪϪϪϪϪϪϪϪϪϪϪϪϪϪϪ}ϪvϪoϪhϪaϪZϪSϪLϪEϪ>Ϫ7Ϫ0Ϫ)Ϫ"ϪϪϪ ϪϪΪΪΪΪΪΪΪΪΪΪΪΪΪΪΪΪΪΪΪzΪsΪlΪeΪ^ΪWΪPΪIΪBΪ;Ϊ4Ϊ-Ϊ&ΪΪΪΪ ΪΪͪͪͪͪͪͪͪͪͪͪͪͪͪͪͪͪͪͪ~ͪwͪpͪiͪbͪ[ͪTͪMͪFͪ?ͪ8ͪ1ͪ*ͪ#̪̪̪̪̪̪̪̪̪̪̪̪̪̪̪̪̪̪ͪͪͪͪͪͪ{̪t̪m̪f̪_̪X̪Q̪J̪C̪<̪5̪.̪'̪ ̪̪̪ ̪̪˪˪˪˪˪˪˪˪˪˪˪˪˪˪˪˪˪˪˪x˪q˪j˪c˪\˪U˪N˪G˪@˪9˪2˪+˪$˪˪˪˪˪˪ʪʪʪʪʪʪʪʪʪʪʪʪʪʪʪʪʪʪ|ʪuʪnʪgʪ`ʪYʪRʪKʪDʪ=ʪ6ʪ/ʪ(ʪ!ʪʪʪ ʪʪɪɪɪɪɪɪɪɪɪɪɪɪɪɪɪɪɪɪɪyɪrɪkɪdɪ]ɪVɪOɪHɪAɪ:ɪ3ɪ,ɪ%ɪɪɪɪ ɪɪȪȪȪȪȪȪȪȪȪȪȪȪȪȪȪȪȪȪ}ȪvȪoȪhȪaȪZȪSȪLȪEȪ>Ȫ7Ȫ0Ȫ)Ȫ"ȪȪȪ ȪȪǪǪǪǪǪǪǪǪǪǪǪǪǪǪǪǪǪǪǪzǪsǪlǪeǪ^ǪWǪPǪIǪBǪ;Ǫ4Ǫ-Ǫ&ǪǪǪǪ ǪǪƪƪƪƪƪƪƪƪƪƪƪƪƪƪƪƪƪƪ~ƪwƪpƪiƪbƪ[ƪTƪMƪFƪ?ƪ8ƪ1ƪ*ƪ#ƪƪƪƪƪƪŪŪŪŪŪŪŪŪŪŪŪŪŪŪŪŪŪŪ{ŪtŪmŪfŪ_ŪXŪQŪJŪCŪ<Ū5Ū.Ū'Ū ŪŪŪ ŪŪĪĪĪĪĪĪĪĪĪĪĪĪĪĪĪĪĪĪĪxĪqĪjĪcĪ\ĪUĪNĪGĪ@Ī9Ī2Ī+Ī$ĪĪĪĪĪĪêêêêêêêêêêêêêêêêêê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êꪪªªªªªªªªªªªªªªªªªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªª}vohaZSLE>70)" zsle^WPIB;4-& 翪࿪ٿҿ˿Ŀ~wpib[TMF?81*#뾪侪ݾ־ϾȾ{tmf_XQJC<5.'  ェ轪Ὢڽӽ̽Žxqjc\UNG@92+$켪弪޼׼мɼ¼|ung`YRKD=6/(! 黪⻪ۻԻͻƻyrkd]VOHA:3,% 溪ߺغѺʺú}vohaZSLE>70)" 깪㹪ܹչιǹzsle^WPIB;4-& 縪สٸҸ˸ĸ~wpib[TMF?81*#뷪䷪ݷַϷȷ{tmf_XQJC<5.'  ﶪ趪ᶪڶӶ̶Ŷxqjc\UNG@92+$쵪嵪޵׵еɵµ|ung`YRKD=6/(! 鴪⴪۴Դʹƴyrkd]VOHA:3,% 泪߳سѳʳó}vohaZSLE>70)" 겪㲪ܲղβDzzsle^WPIB;4-& 籪౪ٱұ˱ı~wpib[TMF?81*#밪䰪ݰְϰȰ{tmf_XQJC<5.'  ﯪ诪ᯪگӯ̯ůxqjc\UNG@92+$쮪宪ޮ׮Юɮ®|ung`YRKD=6/(! 魪⭪ۭԭͭƭyrkd]VOHA:3,% 欪߬جѬʬì}vohaZSLE>70)" ꫪ㫪ܫիΫǫzsle^WPIB;4-& 窪પ٪Ҫ˪Ī~wpib[TMF?81*#멪䩪ݩ֩ϩȩ{tmf_XQJC<5.'  飯訪ᨪڨӨ̨Ũxqjc\UNG@92+$짪姪ާקЧɧ§|ung`YRKD=6/(! 馪⦪ۦԦͦƦyrkd]VOHA:3,% 楪ߥإѥʥå}vohaZSLE>70)" ꤪ㤪ܤդΤǤzsle^WPIB;4-& 磪࣪٣ңˣģ~wpib[TMF?81*#뢪䢪ݢ֢ϢȢ{tmf_XQJC<5.'  衪ᡪڡӡ̡šxqjc\UNG@92+$젪堪ޠנРɠ |ung`YRKD=6/(! 韪⟪۟ԟ͟Ɵyrkd]VOHA:3,% 힪枪ߞ؞ўʞÞ}vohaZSLE>70)" Ꝫ㝪ܝ՝Νǝzsle^WPIB;4-& 眪ٜҜ˜Ĝ~wpib[TMF?81*#뛪䛪ݛ֛ϛț{tmf_XQJC<5.'  蚪ᚪښӚ̚Śxqjc\UNG@92+$왪噪ޙיЙə™|ung`YRKD=6/(! 阪☪ۘԘ͘Ƙyrkd]VOHA:3,% 헪旪ߗؗїʗ×}vohaZSLE>70)" ꖪ㖪ܖՖΖǖzsle^WPIB;4-& 番ٕҕ˕ĕ~wpib[TMF?81*#딪䔪ݔ֔ϔȔ{tmf_XQJC<5.'  蓪ᓪړӓ̓œxqjc\UNG@92+$쒪咪ޒגВɒ’|ung`YRKD=6/(! 鑪⑪ۑԑ͑Ƒyrkd]VOHA:3,% 퐪搪ߐؐѐʐÐ}vohaZSLE>70)" ꏪ㏪܏ՏΏǏzsle^WPIB;4-& 玪َҎˎĎ~wpib[TMF?81*#덪䍪ݍ֍ύȍ{tmf_XQJC<5.'  茪ጪڌӌ̌Ōxqjc\UNG@92+$싪勪ދ׋Ћɋ‹|ung`YRKD=6/(! 銪⊪ۊԊ͊Ɗyrkd]VOHA:3,% 퉪扪߉؉щʉÉ}vohaZSLE>70)" ꈪ㈪܈ՈΈLjzsle^WPIB;4-& 燪ه҇ˇć~wpib[TMF?81*#놪䆪݆ֆφȆ{tmf_XQJC<5.'  腪ᅪڅӅ̅Ņxqjc\UNG@92+$섪優ބׄЄɄ„|ung`YRKD=6/(! 郪⃪ۃԃ̓ƃyrkd]VOHA:3,% 킪悪߂؂тʂÂ}vohaZSLE>70)" ꁪな܁Ձ΁ǁzsle^WPIB;4-& 瀪ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ߩߩߩߩߩߩߩߩߩߩߩߩߩߩߩߩߩߩ~ߩwߩpߩiߩbߩ[ߩTߩMߩFߩ?ߩ8ߩ1ߩ*ߩ#ߩߩߩߩߩߩީީީީީީީީީީީީީީީީީީ{ީtީmީfީ_ީXީQީJީCީ<ީ5ީ.ީ'ީ ީީީ ީީݩݩݩݩݩݩݩݩݩݩݩݩݩݩݩݩݩݩݩxݩqݩjݩcݩ\ݩUݩNݩGݩ@ݩ9ݩ2ݩ+ݩ$ݩݩݩݩݩݩܩܩܩܩܩܩܩܩܩܩܩܩܩܩܩܩܩܩ|ܩuܩnܩgܩ`ܩYܩRܩKܩDܩ=ܩ6ܩ/ܩ(ܩ!ܩܩܩ ܩܩ۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩۩y۩r۩k۩d۩]۩V۩O۩H۩A۩:۩3۩,۩%۩۩۩۩ ۩۩کککککککککککککککککک}کvکoکhکaکZکSکLکEک>ک7ک0ک)ک"ککک کک٩٩٩٩٩٩٩٩٩٩٩٩٩٩٩٩٩٩٩z٩s٩l٩e٩^٩W٩P٩I٩B٩;٩4٩-٩&٩٩٩٩ ٩٩ةةةةةةةةةةةةةةةةةة~ةwةpةiةbة[ةTةMةFة?ة8ة1ة*ة#ةةةةةةשששששששששששששששששש{שtשmשfש_שXשQשJשCש<ש5ש.ש'ש ששש שש֩֩֩֩֩֩֩֩֩֩֩֩֩֩֩֩֩֩֩x֩q֩j֩c֩\֩U֩N֩G֩@֩9֩2֩+֩$֩֩֩֩֩֩թթթթթթթթթթթթթթթթթթ|թuթnթgթ`թYթRթKթDթ=թ6թ/թ(թ!թթթ թթԩԩԩԩԩԩԩԩԩԩԩԩԩԩԩԩԩԩԩyԩrԩkԩdԩ]ԩVԩOԩHԩAԩ:ԩ3ԩ,ԩ%ԩԩԩԩ ԩԩөөөөөөөөөөөөөөөөөө}өvөoөhөaөZөSөLөEө>ө7ө0ө)ө"өөө өөҩҩҩҩҩҩҩҩҩҩҩҩҩҩҩҩҩҩҩzҩsҩlҩeҩ^ҩWҩPҩIҩBҩ;ҩ4ҩ-ҩ&ҩҩҩҩ ҩҩѩѩѩѩѩѩѩѩѩѩѩѩѩѩѩѩѩѩ~ѩwѩpѩiѩbѩ[ѩTѩMѩFѩ?ѩ8ѩ1ѩ*ѩ#ѩѩѩѩѩѩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩЩ{ЩtЩmЩfЩ_ЩXЩQЩJЩCЩ<Щ5Щ.Щ'Щ ЩЩЩ ЩЩϩϩϩϩϩϩϩϩϩϩϩϩϩϩϩϩϩϩϩxϩqϩjϩcϩ\ϩUϩNϩGϩ@ϩ9ϩ2ϩ+ϩ$ϩϩϩϩϩϩΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩ|ΩuΩnΩgΩ`ΩYΩRΩKΩDΩ=Ω6Ω/Ω(Ω!ΩΩΩ ΩΩͩͩͩͩͩͩͩͩͩͩͩͩͩͩͩͩͩͩͩyͩrͩkͩdͩ]ͩVͩOͩHͩAͩ:ͩ3ͩ,ͩ%ͩͩͩͩ ̩̩̩̩̩̩̩̩̩̩̩̩̩̩̩̩̩̩ͩͩ}̩v̩o̩h̩a̩Z̩S̩L̩E̩>̩7̩0̩)̩"̩̩̩ ̩̩˩˩˩˩˩˩˩˩˩˩˩˩˩˩˩˩˩˩˩z˩s˩l˩e˩^˩W˩P˩I˩B˩;˩4˩-˩&˩˩˩˩ ˩˩ʩʩʩʩʩʩʩʩʩʩʩʩʩʩʩʩʩʩ~ʩwʩpʩiʩbʩ[ʩTʩMʩFʩ?ʩ8ʩ1ʩ*ʩ#ʩʩʩʩʩʩɩɩɩɩɩɩɩɩɩɩɩɩɩɩɩɩɩɩ{ɩtɩmɩfɩ_ɩXɩQɩJɩCɩ<ɩ5ɩ.ɩ'ɩ ɩɩɩ ɩɩȩȩȩȩȩȩȩȩȩȩȩȩȩȩȩȩȩȩȩxȩqȩjȩcȩ\ȩUȩNȩGȩ@ȩ9ȩ2ȩ+ȩ$ȩȩȩȩȩȩǩǩǩǩǩǩǩǩǩǩǩǩǩǩǩǩǩǩ|ǩuǩnǩgǩ`ǩYǩRǩKǩDǩ=ǩ6ǩ/ǩ(ǩ!ǩǩǩ ǩǩƩƩƩƩƩƩƩƩƩƩƩƩƩƩƩƩƩƩƩyƩrƩkƩdƩ]ƩVƩOƩHƩAƩ:Ʃ3Ʃ,Ʃ%ƩƩƩƩ ƩƩũũũũũũũũũũũũũũũũũũ}ũvũoũhũaũZũSũLũEũ>ũ7ũ0ũ)ũ"ũũũ ũũĩĩĩĩĩĩĩĩĩĩĩĩĩĩĩĩĩĩĩzĩsĩlĩeĩ^ĩWĩPĩIĩBĩ;ĩ4ĩ-ĩ&ĩĩĩĩ ĩĩéééééééééééééééééé~éwépéiébé[éTéMéFé?é8é1é*é#éééééé©©©©©©©©©©©©©©©©©©{©t©m©f©_©X©Q©J©C©<©5©.©'© ©©© ©©xqjc\UNG@92+$|ung`YRKD=6/(! 鿩⿩ۿԿͿƿyrkd]VOHA:3,% 澩߾ؾѾʾþ}vohaZSLE>70)" 꽩㽩ܽսνǽzsle^WPIB;4-& 缩༩ټҼ˼ļ~wpib[TMF?81*#뻩仩ݻֻϻȻ{tmf_XQJC<5.'  ﺩ躩ẩںӺ̺źxqjc\UNG@92+$칩幩޹׹йɹ¹|ung`YRKD=6/(! 鸩⸩۸Ը͸Ƹyrkd]VOHA:3,% 淩߷طѷʷ÷}vohaZSLE>70)" 궩㶩ܶնζǶzsle^WPIB;4-& 絩൩ٵҵ˵ĵ~wpib[TMF?81*#봩䴩ݴִϴȴ{tmf_XQJC<5.'  ﳩ賩ᳩڳӳ̳ųxqjc\UNG@92+$첩岩޲ײвɲ²|ung`YRKD=6/(! 鱩Ⱪ۱ԱͱƱyrkd]VOHA:3,% 氩߰ذѰʰð}vohaZSLE>70)" ꯩ㯩ܯկίǯzsle^WPIB;4-& 箩னٮҮˮĮ~wpib[TMF?81*#뭩䭩ݭ֭ϭȭ{tmf_XQJC<5.'  ﬩謩ᬩڬӬ̬Ŭxqjc\UNG@92+$쫩嫩ޫ׫Ыɫ«|ung`YRKD=6/(! 骩⪩۪Ԫͪƪyrkd]VOHA:3,% 橩ߩةѩʩé}vohaZSLE>70)" ꨩ㨩ܨըΨǨzsle^WPIB;4-& 秩৩٧ҧ˧ħ~wpib[TMF?81*#릩䦩ݦ֦ϦȦ{tmf_XQJC<5.'  數襩ᥩڥӥ̥ťxqjc\UNG@92+$줩天ޤפФɤ¤|ung`YRKD=6/(! 飩⣩ۣԣͣƣyrkd]VOHA:3,% 梩ߢآѢʢâ}vohaZSLE>70)" ꡩ㡩ܡաΡǡzsle^WPIB;4-& 砩ࠩ٠ҠˠĠ~wpib[TMF?81*#럩䟩ݟ֟ϟȟ{tmf_XQJC<5.'  螩ឩڞӞ̞Şxqjc\UNG@92+$읩坩ޝםНɝ|ung`YRKD=6/(! 霩✩ۜԜ͜Ɯyrkd]VOHA:3,% 훩曩ߛ؛ћʛÛ}vohaZSLE>70)" ꚩ㚩ܚ՚Κǚzsle^WPIB;4-& 癩ٙҙ˙ę~wpib[TMF?81*#똩䘩ݘ֘ϘȘ{tmf_XQJC<5.'  藩ᗩڗӗ̗ŗxqjc\UNG@92+$얩喩ޖזЖɖ–|ung`YRKD=6/(! 镩╩ەԕ͕ƕyrkd]VOHA:3,% 픩攩ߔؔєʔÔ}vohaZSLE>70)" ꓩ㓩ܓՓΓǓzsle^WPIB;4-& 璩ْҒ˒Ē~wpib[TMF?81*#둩䑩ݑ֑ϑȑ{tmf_XQJC<5.'  萩ᐩڐӐ̐Őxqjc\UNG@92+$쏩叩ޏ׏Џɏ|ung`YRKD=6/(! 鎩⎩ێԎ͎Ǝyrkd]VOHA:3,% 퍩捩ߍ؍эʍÍ}vohaZSLE>70)" ꌩ㌩܌ՌΌnjzsle^WPIB;4-& 狩ًҋˋċ~wpib[TMF?81*#늩䊩݊֊ϊȊ{tmf_XQJC<5.'  艩ቩډӉ̉ʼnxqjc\UNG@92+$숩利ވ׈ЈɈˆ|ung`YRKD=6/(! 釩⇩ۇԇ͇Ƈyrkd]VOHA:3,% 톩憩߆؆цʆÆ}vohaZSLE>70)" ꅩㅩ܅Յ΅Džzsle^WPIB;4-& 焩ل҄˄Ą~wpib[TMF?81*#냩䃩݃փσȃ{tmf_XQJC<5.'  肩Ⴉڂӂ̂łxqjc\UNG@92+$쁩偩ށׁЁɁ|ung`YRKD=6/(! 逩
ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ߨߨߨߨߨߨߨߨߨߨߨߨߨߨߨߨߨߨߨyߨrߨkߨdߨ]ߨVߨOߨHߨAߨ:ߨ3ߨ,ߨ%ߨߨߨߨ ߨߨިިިިިިިިިިިިިިިިިި}ިvިoިhިaިZިSިLިEި>ި7ި0ި)ި"ިިި ިިݨݨݨݨݨݨݨݨݨݨݨݨݨݨݨݨݨݨݨzݨsݨlݨeݨ^ݨWݨPݨIݨBݨ;ݨ4ݨ-ݨ&ݨݨݨݨ ݨݨܨܨܨܨܨܨܨܨܨܨܨܨܨܨܨܨܨܨ~ܨwܨpܨiܨbܨ[ܨTܨMܨFܨ?ܨ8ܨ1ܨ*ܨ#ܨܨܨܨܨܨۨۨۨۨۨۨۨۨۨۨۨۨۨۨۨۨۨۨ{ۨtۨmۨfۨ_ۨXۨQۨJۨCۨ<ۨ5ۨ.ۨ'ۨ ۨۨۨ ۨۨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨڨxڨqڨjڨcڨ\ڨUڨNڨGڨ@ڨ9ڨ2ڨ+ڨ$ڨڨڨڨڨڨ٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨٨|٨u٨n٨g٨`٨Y٨R٨K٨D٨=٨6٨/٨(٨!٨٨٨ ٨٨بببببببببببببببببببyبrبkبdب]بVبOبHبAب:ب3ب,ب%بببب ببרררררררררררררררררר}רvרoרhרaרZרSרLרEר>ר7ר0ר)ר"ררר רר֨֨֨֨֨֨֨֨֨֨֨֨֨֨֨֨֨֨֨z֨s֨l֨e֨^֨W֨P֨I֨B֨;֨4֨-֨&֨֨֨֨ ֨֨ըըըըըըըըըըըըըըըըըը~ըwըpըiըbը[ըTըMըFը?ը8ը1ը*ը#ըըըըըըԨԨԨԨԨԨԨԨԨԨԨԨԨԨԨԨԨԨ{ԨtԨmԨfԨ_ԨXԨQԨJԨCԨ<Ԩ5Ԩ.Ԩ'Ԩ ԨԨԨ ԨԨӨӨӨӨӨӨӨӨӨӨӨӨӨӨӨӨӨӨӨxӨqӨjӨcӨ\ӨUӨNӨGӨ@Ө9Ө2Ө+Ө$ӨӨӨӨӨӨҨҨҨҨҨҨҨҨҨҨҨҨҨҨҨҨҨҨ|ҨuҨnҨgҨ`ҨYҨRҨKҨDҨ=Ҩ6Ҩ/Ҩ(Ҩ!ҨҨҨ ҨҨѨѨѨѨѨѨѨѨѨѨѨѨѨѨѨѨѨѨѨyѨrѨkѨdѨ]ѨVѨOѨHѨAѨ:Ѩ3Ѩ,Ѩ%ѨѨѨѨ ѨѨШШШШШШШШШШШШШШШШШШ}ШvШoШhШaШZШSШLШEШ>Ш7Ш0Ш)Ш"ШШШ ШШϨϨϨϨϨϨϨϨϨϨϨϨϨϨϨϨϨϨϨzϨsϨlϨeϨ^ϨWϨPϨIϨBϨ;Ϩ4Ϩ-Ϩ&ϨϨϨϨ ϨϨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨΨ~ΨwΨpΨiΨbΨ[ΨTΨMΨFΨ?Ψ8Ψ1Ψ*Ψ#ΨΨΨΨΨΨͨͨͨͨͨͨͨͨͨͨͨͨͨͨͨͨͨͨ{ͨtͨmͨfͨ_ͨXͨQͨJͨCͨ<ͨ5ͨ.ͨ'ͨ ͨͨͨ ̨̨̨̨̨̨̨̨̨̨̨̨̨̨̨̨̨̨̨ͨͨx̨q̨j̨c̨\̨ŲN̨G̨@̨9̨2̨+̨$̨̨̨̨̨̨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨|˨u˨n˨g˨`˨Y˨R˨K˨D˨=˨6˨/˨(˨!˨˨˨ ˨˨ʨʨʨʨʨʨʨʨʨʨʨʨʨʨʨʨʨʨʨyʨrʨkʨdʨ]ʨVʨOʨHʨAʨ:ʨ3ʨ,ʨ%ʨʨʨʨ ʨʨɨɨɨɨɨɨɨɨɨɨɨɨɨɨɨɨɨɨ}ɨvɨoɨhɨaɨZɨSɨLɨEɨ>ɨ7ɨ0ɨ)ɨ"ɨɨɨ ɨɨȨȨȨȨȨȨȨȨȨȨȨȨȨȨȨȨȨȨȨzȨsȨlȨeȨ^ȨWȨPȨIȨBȨ;Ȩ4Ȩ-Ȩ&ȨȨȨȨ ȨȨǨǨǨǨǨǨǨǨǨǨǨǨǨǨǨǨǨǨ~ǨwǨpǨiǨbǨ[ǨTǨMǨFǨ?Ǩ8Ǩ1Ǩ*Ǩ#ǨǨǨǨǨǨƨƨƨƨƨƨƨƨƨƨƨƨƨƨƨƨƨƨ{ƨtƨmƨfƨ_ƨXƨQƨJƨCƨ<ƨ5ƨ.ƨ'ƨ ƨƨƨ ƨƨŨŨŨŨŨŨŨŨŨŨŨŨŨŨŨŨŨŨŨxŨqŨjŨcŨ\ŨUŨNŨGŨ@Ũ9Ũ2Ũ+Ũ$ŨŨŨŨŨŨĨĨĨĨĨĨĨĨĨĨĨĨĨĨĨĨĨĨ|ĨuĨnĨgĨ`ĨYĨRĨKĨDĨ=Ĩ6Ĩ/Ĩ(Ĩ!ĨĨĨ ĨĨèèèèèèèèèèèèèèèèèèèyèrèkèdè]èVèOèHèAè:è3è,è%èèèè è訨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨zsle^WPIB;4-& ~wpib[TMF?81*#뿨俨ݿֿϿȿ{tmf_XQJC<5.'  ᄄ辨ᾨھӾ̾žxqjc\UNG@92+$콨彨޽׽нɽ½|ung`YRKD=6/(! 鼨⼨ۼԼͼƼyrkd]VOHA:3,% 滨߻ػѻʻû}vohaZSLE>70)" 꺨㺨ܺպκǺzsle^WPIB;4-& 繨๨ٹҹ˹Ĺ~wpib[TMF?81*#븨丨ݸָϸȸ{tmf_XQJC<5.'  ﷨跨ᷨڷӷ̷ŷxqjc\UNG@92+$춨嶨޶׶жɶ¶|ung`YRKD=6/(! 鵨⵨۵Ե͵Ƶyrkd]VOHA:3,% 洨ߴشѴʴô}vohaZSLE>70)" 골㳨ܳճγdzzsle^WPIB;4-& 粨ನٲҲ˲IJ~wpib[TMF?81*#뱨䱨ݱֱϱȱ{tmf_XQJC<5.'  ﰨ谨ᰨڰӰ̰Űxqjc\UNG@92+$쯨寨ޯׯЯɯ¯|ung`YRKD=6/(! 鮨⮨ۮԮͮƮyrkd]VOHA:3,% 歨߭حѭʭí}vohaZSLE>70)" ꬨ㬨ܬլάǬzsle^WPIB;4-& 竨૨٫ҫ˫ī~wpib[TMF?81*#모䪨ݪ֪ϪȪ{tmf_XQJC<5.'  難詨ᩨکө̩ũxqjc\UNG@92+$쨨娨ިרШɨ¨|ung`YRKD=6/(! 駨⧨ۧԧͧƧyrkd]VOHA:3,% 榨ߦئѦʦæ}vohaZSLE>70)" ꥨ㥨ܥեΥǥzsle^WPIB;4-& 礨न٤ҤˤĤ~wpib[TMF?81*#루䣨ݣ֣ϣȣ{tmf_XQJC<5.'  袨ᢨڢӢ̢Ţxqjc\UNG@92+$졨塨ޡסСɡ¡|ung`YRKD=6/(! 頨⠨۠Ԡ͠Ơyrkd]VOHA:3,% ퟨ柨ߟ؟џʟß}vohaZSLE>70)" Ꞩ㞨ܞ՞ΞǞzsle^WPIB;4-& 睨ٝҝ˝ĝ~wpib[TMF?81*#뜨䜨ݜ֜ϜȜ{tmf_XQJC<5.'  蛨ᛨڛӛ̛śxqjc\UNG@92+$욨嚨ޚךКɚš|ung`YRKD=6/(! 陨♨ۙԙ͙ƙyrkd]VOHA:3,% 혨昨ߘؘјʘØ}vohaZSLE>70)" ꗨ㗨ܗ՗ΗǗzsle^WPIB;4-& 疨ٖҖ˖Ė~wpib[TMF?81*#땨䕨ݕ֕ϕȕ{tmf_XQJC<5.'  蔨ᔨڔӔ̔Ŕxqjc\UNG@92+$쓨哨ޓדГɓ“|ung`YRKD=6/(! 钨⒨ےԒ͒ƒyrkd]VOHA:3,% 푨摨ߑؑёʑÑ}vohaZSLE>70)" ꐨ㐨ܐՐΐǐzsle^WPIB;4-& 珨ُҏˏď~wpib[TMF?81*#뎨䎨ݎ֎ώȎ{tmf_XQJC<5.'  荨፨ڍӍ̍ōxqjc\UNG@92+$쌨匨ތ׌ЌɌŒ|ung`YRKD=6/(! 鋨⋨ۋԋ͋Ƌyrkd]VOHA:3,% 튨抨ߊ؊ъʊÊ}vohaZSLE>70)" ꉨ㉨܉ՉΉljzsle^WPIB;4-& 爨و҈ˈĈ~wpib[TMF?81*#뇨䇨݇ևχȇ{tmf_XQJC<5.'  膨ᆨچӆ̆ņxqjc\UNG@92+$셨全ޅׅЅɅ…|ung`YRKD=6/(! 鄨ℨۄԄ̈́Ƅyrkd]VOHA:3,% 탨惨߃؃уʃÃ}vohaZSLE>70)" ꂨエ܂Ղ΂ǂzsle^WPIB;4-& 灨فҁˁā~wpib[TMF?81*#뀨䀨݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ߧߧߧߧߧߧߧߧߧߧߧߧߧߧߧߧߧߧ{ߧtߧmߧfߧ_ߧXߧQߧJߧCߧ<ߧ5ߧ.ߧ'ߧ ߧߧߧ ߧߧާާާާާާާާާާާާާާާާާާާxާqާjާcާ\ާUާNާGާ@ާ9ާ2ާ+ާ$ާާާާާާݧݧݧݧݧݧݧݧݧݧݧݧݧݧݧݧݧݧ|ݧuݧnݧgݧ`ݧYݧRݧKݧDݧ=ݧ6ݧ/ݧ(ݧ!ݧݧݧ ݧݧܧܧܧܧܧܧܧܧܧܧܧܧܧܧܧܧܧܧܧyܧrܧkܧdܧ]ܧVܧOܧHܧAܧ:ܧ3ܧ,ܧ%ܧܧܧܧ ܧܧۧۧۧۧۧۧۧۧۧۧۧۧۧۧۧۧۧۧ}ۧvۧoۧhۧaۧZۧSۧLۧEۧ>ۧ7ۧ0ۧ)ۧ"ۧۧۧ ۧۧڧڧڧڧڧڧڧڧڧڧڧڧڧڧڧڧڧڧڧzڧsڧlڧeڧ^ڧWڧPڧIڧBڧ;ڧ4ڧ-ڧ&ڧڧڧڧ ڧڧ٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧٧~٧w٧p٧i٧b٧[٧T٧M٧F٧?٧8٧1٧*٧#٧٧٧٧٧٧اااااااااااااااااا{اtاmاfا_اXاQاJاCا<ا5ا.ا'ا ااا ااקקקקקקקקקקקקקקקקקקקxקqקjקcק\קUקNקGק@ק9ק2ק+ק$קקקקקק֧֧֧֧֧֧֧֧֧֧֧֧֧֧֧֧֧֧|֧u֧n֧g֧`֧Y֧R֧K֧D֧=֧6֧/֧(֧!֧֧֧ ֧֧էէէէէէէէէէէէէէէէէէէyէrէkէdէ]էVէOէHէAէ:է3է,է%էէէէ էէԧԧԧԧԧԧԧԧԧԧԧԧԧԧԧԧԧԧ}ԧvԧoԧhԧaԧZԧSԧLԧEԧ>ԧ7ԧ0ԧ)ԧ"ԧԧԧ ԧԧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧzӧsӧlӧeӧ^ӧWӧPӧIӧBӧ;ӧ4ӧ-ӧ&ӧӧӧӧ ӧӧҧҧҧҧҧҧҧҧҧҧҧҧҧҧҧҧҧҧ~ҧwҧpҧiҧbҧ[ҧTҧMҧFҧ?ҧ8ҧ1ҧ*ҧ#ҧҧҧҧҧҧѧѧѧѧѧѧѧѧѧѧѧѧѧѧѧѧѧѧ{ѧtѧmѧfѧ_ѧXѧQѧJѧCѧ<ѧ5ѧ.ѧ'ѧ ѧѧѧ ѧѧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧxЧqЧjЧcЧ\ЧUЧNЧGЧ@Ч9Ч2Ч+Ч$ЧЧЧЧЧЧϧϧϧϧϧϧϧϧϧϧϧϧϧϧϧϧϧϧ|ϧuϧnϧgϧ`ϧYϧRϧKϧDϧ=ϧ6ϧ/ϧ(ϧ!ϧϧϧ ϧϧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧyΧrΧkΧdΧ]ΧVΧOΧHΧAΧ:Χ3Χ,Χ%ΧΧΧΧ ΧΧͧͧͧͧͧͧͧͧͧͧͧͧͧͧͧͧͧͧ}ͧvͧoͧhͧaͧZͧSͧLͧEͧ>ͧ7ͧ0ͧ)ͧ"ͧͧͧ ̧̧̧̧̧̧̧̧̧̧̧̧̧̧̧̧̧̧̧ͧͧz̧şļȩ^̧W̧P̧I̧B̧;̧4̧-̧&̧̧̧̧ ̧̧˧˧˧˧˧˧˧˧˧˧˧˧˧˧˧˧˧˧~˧w˧p˧i˧b˧[˧T˧M˧F˧?˧8˧1˧*˧#˧˧˧˧˧˧ʧʧʧʧʧʧʧʧʧʧʧʧʧʧʧʧʧʧ{ʧtʧmʧfʧ_ʧXʧQʧJʧCʧ<ʧ5ʧ.ʧ'ʧ ʧʧʧ ʧʧɧɧɧɧɧɧɧɧɧɧɧɧɧɧɧɧɧɧɧxɧqɧjɧcɧ\ɧUɧNɧGɧ@ɧ9ɧ2ɧ+ɧ$ɧɧɧɧɧɧȧȧȧȧȧȧȧȧȧȧȧȧȧȧȧȧȧȧ|ȧuȧnȧgȧ`ȧYȧRȧKȧDȧ=ȧ6ȧ/ȧ(ȧ!ȧȧȧ ȧȧǧǧǧǧǧǧǧǧǧǧǧǧǧǧǧǧǧǧǧyǧrǧkǧdǧ]ǧVǧOǧHǧAǧ:ǧ3ǧ,ǧ%ǧǧǧǧ ǧǧƧƧƧƧƧƧƧƧƧƧƧƧƧƧƧƧƧƧ}ƧvƧoƧhƧaƧZƧSƧLƧEƧ>Ƨ7Ƨ0Ƨ)Ƨ"ƧƧƧ ƧƧŧŧŧŧŧŧŧŧŧŧŧŧŧŧŧŧŧŧŧzŧsŧlŧeŧ^ŧWŧPŧIŧBŧ;ŧ4ŧ-ŧ&ŧŧŧŧ ŧŧħħħħħħħħħħħħħħħħħħ~ħwħpħiħbħ[ħTħMħFħ?ħ8ħ1ħ*ħ#ħħħħħħçççççççççççççççççç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç çç§§§§§§§§§§§§§§§§§§§x§q§j§c§\§U§N§G§@§9§2§+§$§§§§§§|ung`YRKD=6/(! yrkd]VOHA:3,% 濧߿ؿѿʿÿ}vohaZSLE>70)" 꾧㾧ܾվξǾzsle^WPIB;4-& 罧ཧٽҽ˽Ľ~wpib[TMF?81*#뼧伧ݼּϼȼ{tmf_XQJC<5.'  ﻧ軧ủڻӻ̻Żxqjc\UNG@92+$캧座޺׺кɺº|ung`YRKD=6/(! 鹧⹧۹Թ͹ƹyrkd]VOHA:3,% 渧߸ظѸʸø}vohaZSLE>70)" 귧㷧ܷշηǷzsle^WPIB;4-& 綧ටٶҶ˶Ķ~wpib[TMF?81*#뵧䵧ݵֵϵȵ{tmf_XQJC<5.'  ﴧ货ᴧڴӴ̴Ŵxqjc\UNG@92+$쳧峧޳׳гɳ³|ung`YRKD=6/(! 鲧ⲧ۲ԲͲƲyrkd]VOHA:3,% 汧߱رѱʱñ}vohaZSLE>70)" 갧㰧ܰհΰǰzsle^WPIB;4-& 篧௧ٯү˯į~wpib[TMF?81*#뮧䮧ݮ֮ϮȮ{tmf_XQJC<5.'  ﭧ譧᭧ڭӭ̭ŭxqjc\UNG@92+$쬧嬧ެ׬Ьɬ¬|ung`YRKD=6/(! 髧⫧۫ԫͫƫyrkd]VOHA:3,% 檧ߪتѪʪê}vohaZSLE>70)" ꩧ㩧ܩթΩǩzsle^WPIB;4-& 稧ਧ٨Ҩ˨Ĩ~wpib[TMF?81*#맧䧧ݧ֧ϧȧ{tmf_XQJC<5.'  獵覧ᦧڦӦ̦Ŧxqjc\UNG@92+$쥧奧ޥץХɥ¥|ung`YRKD=6/(! 餧⤧ۤԤͤƤyrkd]VOHA:3,% 棧ߣأѣʣã}vohaZSLE>70)" ꢧ㢧ܢբ΢Ǣzsle^WPIB;4-& 硧ࡧ١ҡˡġ~wpib[TMF?81*#렧䠧ݠ֠ϠȠ{tmf_XQJC<5.'  蟧៧ڟӟ̟şxqjc\UNG@92+$잧垧ޞמОɞž|ung`YRKD=6/(! 靧❧۝ԝ͝Ɲyrkd]VOHA:3,% 휧朧ߜ؜ќʜÜ}vohaZSLE>70)" ꛧ㛧ܛ՛ΛǛzsle^WPIB;4-& 皧ٚҚ˚Ě~wpib[TMF?81*#뙧䙧ݙ֙ϙș{tmf_XQJC<5.'  蘧ᘧژӘ̘Řxqjc\UNG@92+$엧嗧ޗחЗɗ—|ung`YRKD=6/(! 閧▧ۖԖ͖Ɩyrkd]VOHA:3,% 핧敧ߕؕѕʕÕ}vohaZSLE>70)" ꔧ㔧ܔՔΔǔzsle^WPIB;4-& 瓧ٓғ˓ē~wpib[TMF?81*#뒧䒧ݒ֒ϒȒ{tmf_XQJC<5.'  葧ᑧڑӑ̑őxqjc\UNG@92+$쐧吧ސאАɐ|ung`YRKD=6/(! 鏧⏧ۏԏ͏Əyrkd]VOHA:3,% 펧控ߎ؎юʎÎ}vohaZSLE>70)" ꍧ㍧܍Ս΍Ǎzsle^WPIB;4-& 猧ٌҌˌČ~wpib[TMF?81*#닧䋧݋֋ϋȋ{tmf_XQJC<5.'  芧ኧڊӊ̊Ŋxqjc\UNG@92+$쉧剧މ׉Љɉ‰|ung`YRKD=6/(! 鈧∧ۈԈ͈ƈyrkd]VOHA:3,% 퇧懧߇؇чʇÇ}vohaZSLE>70)" ꆧㆧ܆ՆΆdžzsle^WPIB;4-& 照م҅˅ą~wpib[TMF?81*#넧䄧݄քτȄ{tmf_XQJC<5.'  胧ყڃӃ̃Ńxqjc\UNG@92+$삧傧ނׂЂɂ‚|ung`YRKD=6/(! 遧⁧ہԁ́Ɓyrkd]VOHA:3,% 퀧性߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߦߦߦߦߦߦߦߦߦߦߦߦߦߦߦߦߦߦ}ߦvߦoߦhߦaߦZߦSߦLߦEߦ>ߦ7ߦ0ߦ)ߦ"ߦߦߦ ߦߦަަަަަަަަަަަަަަަަަަަzަsަlަeަ^ަWަPަIަBަ;ަ4ަ-ަ&ަަަަ ަަݦݦݦݦݦݦݦݦݦݦݦݦݦݦݦݦݦݦ~ݦwݦpݦiݦbݦ[ݦTݦMݦFݦ?ݦ8ݦ1ݦ*ݦ#ݦݦݦݦݦݦܦܦܦܦܦܦܦܦܦܦܦܦܦܦܦܦܦܦ{ܦtܦmܦfܦ_ܦXܦQܦJܦCܦ<ܦ5ܦ.ܦ'ܦ ܦܦܦ ܦܦۦۦۦۦۦۦۦۦۦۦۦۦۦۦۦۦۦۦۦxۦqۦjۦcۦ\ۦUۦNۦGۦ@ۦ9ۦ2ۦ+ۦ$ۦۦۦۦۦۦڦڦڦڦڦڦڦڦڦڦڦڦڦڦڦڦڦڦ|ڦuڦnڦgڦ`ڦYڦRڦKڦDڦ=ڦ6ڦ/ڦ(ڦ!ڦڦڦ ڦڦ٦٦٦٦٦٦٦٦٦٦٦٦٦٦٦٦٦٦٦y٦r٦k٦d٦]٦V٦O٦H٦A٦:٦3٦,٦%٦٦٦٦ ٦٦ئئئئئئئئئئئئئئئئئئ}ئvئoئhئaئZئSئLئEئ>ئ7ئ0ئ)ئ"ئئئ ئئצצצצצצצצצצצצצצצצצצצzצsצlצeצ^צWצPצIצBצ;צ4צ-צ&צצצצ צצ֦֦֦֦֦֦֦֦֦֦֦֦֦֦֦֦֦֦~֦w֦p֦i֦b֦[֦T֦M֦F֦?֦8֦1֦*֦#֦֦֦֦֦֦զզզզզզզզզզզզզզզզզզ{զtզmզfզ_զXզQզJզCզ<զ5զ.զ'զ զզզ զզԦԦԦԦԦԦԦԦԦԦԦԦԦԦԦԦԦԦԦxԦqԦjԦcԦ\ԦUԦNԦGԦ@Ԧ9Ԧ2Ԧ+Ԧ$ԦԦԦԦԦԦӦӦӦӦӦӦӦӦӦӦӦӦӦӦӦӦӦӦ|ӦuӦnӦgӦ`ӦYӦRӦKӦDӦ=Ӧ6Ӧ/Ӧ(Ӧ!ӦӦӦ ӦӦҦҦҦҦҦҦҦҦҦҦҦҦҦҦҦҦҦҦҦyҦrҦkҦdҦ]ҦVҦOҦHҦAҦ:Ҧ3Ҧ,Ҧ%ҦҦҦҦ ҦҦѦѦѦѦѦѦѦѦѦѦѦѦѦѦѦѦѦѦ}ѦvѦoѦhѦaѦZѦSѦLѦEѦ>Ѧ7Ѧ0Ѧ)Ѧ"ѦѦѦ ѦѦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦzЦsЦlЦeЦ^ЦWЦPЦIЦBЦ;Ц4Ц-Ц&ЦЦЦЦ ЦЦϦϦϦϦϦϦϦϦϦϦϦϦϦϦϦϦϦϦ~ϦwϦpϦiϦbϦ[ϦTϦMϦFϦ?Ϧ8Ϧ1Ϧ*Ϧ#ϦϦϦϦϦϦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦ{ΦtΦmΦfΦ_ΦXΦQΦJΦCΦ<Φ5Φ.Φ'Φ ΦΦΦ ΦΦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦxͦqͦjͦcͦ\ͦUͦNͦGͦ@ͦ9ͦ2ͦ+ͦ$̦̦̦̦̦̦̦̦̦̦̦̦̦̦̦̦̦̦ͦͦͦͦͦͦ|̦u̦n̦g̦`̦Y̦R̦K̦D̦=̦6̦/̦(̦!̦̦̦ ̦̦˦˦˦˦˦˦˦˦˦˦˦˦˦˦˦˦˦˦˦y˦r˦k˦d˦]˦V˦O˦H˦A˦:˦3˦,˦%˦˦˦˦ ˦˦ʦʦʦʦʦʦʦʦʦʦʦʦʦʦʦʦʦʦ}ʦvʦoʦhʦaʦZʦSʦLʦEʦ>ʦ7ʦ0ʦ)ʦ"ʦʦʦ ʦʦɦɦɦɦɦɦɦɦɦɦɦɦɦɦɦɦɦɦɦzɦsɦlɦeɦ^ɦWɦPɦIɦBɦ;ɦ4ɦ-ɦ&ɦɦɦɦ ɦɦȦȦȦȦȦȦȦȦȦȦȦȦȦȦȦȦȦȦ~ȦwȦpȦiȦbȦ[ȦTȦMȦFȦ?Ȧ8Ȧ1Ȧ*Ȧ#ȦȦȦȦȦȦǦǦǦǦǦǦǦǦǦǦǦǦǦǦǦǦǦǦ{ǦtǦmǦfǦ_ǦXǦQǦJǦCǦ<Ǧ5Ǧ.Ǧ'Ǧ ǦǦǦ ǦǦƦƦƦƦƦƦƦƦƦƦƦƦƦƦƦƦƦƦƦxƦqƦjƦcƦ\ƦUƦNƦGƦ@Ʀ9Ʀ2Ʀ+Ʀ$ƦƦƦƦƦƦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦ|ŦuŦnŦgŦ`ŦYŦRŦKŦDŦ=Ŧ6Ŧ/Ŧ(Ŧ!ŦŦŦ ŦŦĦĦĦĦĦĦĦĦĦĦĦĦĦĦĦĦĦĦĦyĦrĦkĦdĦ]ĦVĦOĦHĦAĦ:Ħ3Ħ,Ħ%ĦĦĦĦ ĦĦææææææææææææææææææ}ævæoæhæaæZæSæLæEæ>æ7æ0æ)æ"æææ ææ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦z¦s¦l¦e¦^¦W¦P¦I¦B¦;¦4¦-¦&¦¦¦¦ ¦¦~wpib[TMF?81*#{tmf_XQJC<5.'  ₩迦ῦڿӿ̿ſxqjc\UNG@92+$쾦徦޾׾оɾ¾|ung`YRKD=6/(! 齦⽦۽Խͽƽyrkd]VOHA:3,% 漦߼ؼѼʼü}vohaZSLE>70)" 껦㻦ܻջλǻzsle^WPIB;4-& 约຦ٺҺ˺ĺ~wpib[TMF?81*#빦书ݹֹϹȹ{tmf_XQJC<5.'  ︦踦ḦڸӸ̸Ÿxqjc\UNG@92+$췦左޷׷зɷ·|ung`YRKD=6/(! 鶦ⶦ۶ԶͶƶyrkd]VOHA:3,% 浦ߵصѵʵõ}vohaZSLE>70)" 괦㴦ܴմδǴzsle^WPIB;4-& 糦೦ٳҳ˳ij~wpib[TMF?81*#벦䲦ݲֲϲȲ{tmf_XQJC<5.'  ﱦ豦ᱦڱӱ̱űxqjc\UNG@92+$찦尦ްװаɰ°|ung`YRKD=6/(! 鯦⯦ۯԯͯƯyrkd]VOHA:3,% 殦߮خѮʮî}vohaZSLE>70)" ꭦ㭦ܭխέǭzsle^WPIB;4-& 符ଦ٬ҬˬĬ~wpib[TMF?81*#뫦䫦ݫ֫ϫȫ{tmf_XQJC<5.'  益誦᪦ڪӪ̪Ūxqjc\UNG@92+$쩦婦ީשЩɩ©|ung`YRKD=6/(! 騦⨦ۨԨͨƨyrkd]VOHA:3,% 槦ߧاѧʧç}vohaZSLE>70)" ꦦ㦦ܦզΦǦzsle^WPIB;4-& 祦०٥ҥ˥ĥ~wpib[TMF?81*#뤦䤦ݤ֤ϤȤ{tmf_XQJC<5.'  裦ᣦڣӣ̣ţxqjc\UNG@92+$좦墦ޢעТɢ¢|ung`YRKD=6/(! 顦⡦ۡԡ͡ơyrkd]VOHA:3,% 栦ߠؠѠʠà}vohaZSLE>70)" ꟦㟦ܟ՟Οǟzsle^WPIB;4-& 瞦ٞҞ˞Ğ~wpib[TMF?81*#띦䝦ݝ֝ϝȝ{tmf_XQJC<5.'  蜦ᜦڜӜ̜Ŝxqjc\UNG@92+$웦囦ޛכЛɛ›|ung`YRKD=6/(! 隦⚦ۚԚ͚ƚyrkd]VOHA:3,% 홦晦ߙؙљʙÙ}vohaZSLE>70)" ꘦㘦ܘ՘Θǘzsle^WPIB;4-& 痦ٗҗ˗ė~wpib[TMF?81*#떦䖦ݖ֖ϖȖ{tmf_XQJC<5.'  蕦ᕦڕӕ̕ŕxqjc\UNG@92+$씦唦ޔהДɔ”|ung`YRKD=6/(! 铦ⓦۓԓ͓Ɠyrkd]VOHA:3,% 풦撦ߒؒђʒÒ}vohaZSLE>70)" ꑦ㑦ܑՑΑǑzsle^WPIB;4-& 琦ِҐːĐ~wpib[TMF?81*#돦䏦ݏ֏Ϗȏ{tmf_XQJC<5.'  莦Ꭶڎӎ̎Ŏxqjc\UNG@92+$썦卦ލ׍Ѝɍ|ung`YRKD=6/(! 錦⌦یԌ͌ƌyrkd]VOHA:3,% 틦拦ߋ؋ыʋË}vohaZSLE>70)" ꊦ㊦܊ՊΊNJzsle^WPIB;4-& 牦ى҉ˉĉ~wpib[TMF?81*#눦䈦݈ֈψȈ{tmf_XQJC<5.'  臦ᇦڇӇ̇Ňxqjc\UNG@92+$솦冦ކ׆ІɆ†|ung`YRKD=6/(! 酦Ⅶۅԅͅƅyrkd]VOHA:3,% 턦愦߄؄фʄÄ}vohaZSLE>70)" ꃦユ܃Ճ΃ǃzsle^WPIB;4-& 炦ق҂˂Ă~wpib[TMF?81*#끦䁦݁ցρȁ{tmf_XQJC<5.'  耦ဦڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ߥߥߥߥߥߥߥߥߥߥߥߥߥߥߥߥߥߥߥxߥqߥjߥcߥ\ߥUߥNߥGߥ@ߥ9ߥ2ߥ+ߥ$ߥߥߥߥߥߥޥޥޥޥޥޥޥޥޥޥޥޥޥޥޥޥޥޥ|ޥuޥnޥgޥ`ޥYޥRޥKޥDޥ=ޥ6ޥ/ޥ(ޥ!ޥޥޥ ޥޥݥݥݥݥݥݥݥݥݥݥݥݥݥݥݥݥݥݥݥyݥrݥkݥdݥ]ݥVݥOݥHݥAݥ:ݥ3ݥ,ݥ%ݥݥݥݥ ݥݥܥܥܥܥܥܥܥܥܥܥܥܥܥܥܥܥܥܥ}ܥvܥoܥhܥaܥZܥSܥLܥEܥ>ܥ7ܥ0ܥ)ܥ"ܥܥܥ ܥܥۥۥۥۥۥۥۥۥۥۥۥۥۥۥۥۥۥۥۥzۥsۥlۥeۥ^ۥWۥPۥIۥBۥ;ۥ4ۥ-ۥ&ۥۥۥۥ ۥۥڥڥڥڥڥڥڥڥڥڥڥڥڥڥڥڥڥڥ~ڥwڥpڥiڥbڥ[ڥTڥMڥFڥ?ڥ8ڥ1ڥ*ڥ#ڥڥڥڥڥڥ٥٥٥٥٥٥٥٥٥٥٥٥٥٥٥٥٥٥{٥t٥m٥f٥_٥X٥Q٥J٥C٥<٥5٥.٥'٥ ٥٥٥ ٥٥إإإإإإإإإإإإإإإإإإإxإqإjإcإ\إUإNإGإ@إ9إ2إ+إ$إإإإإإץץץץץץץץץץץץץץץץץץ|ץuץnץgץ`ץYץRץKץDץ=ץ6ץ/ץ(ץ!ץץץ ץץ֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥֥y֥r֥k֥d֥]֥V֥O֥H֥A֥:֥3֥,֥%֥֥֥֥ ֥֥եեեեեեեեեեեեեեեեեե}եvեoեhեaեZեSեLեEե>ե7ե0ե)ե"եեե եեԥԥԥԥԥԥԥԥԥԥԥԥԥԥԥԥԥԥԥzԥsԥlԥeԥ^ԥWԥPԥIԥBԥ;ԥ4ԥ-ԥ&ԥԥԥԥ ԥԥӥӥӥӥӥӥӥӥӥӥӥӥӥӥӥӥӥӥ~ӥwӥpӥiӥbӥ[ӥTӥMӥFӥ?ӥ8ӥ1ӥ*ӥ#ӥӥӥӥӥӥҥҥҥҥҥҥҥҥҥҥҥҥҥҥҥҥҥҥ{ҥtҥmҥfҥ_ҥXҥQҥJҥCҥ<ҥ5ҥ.ҥ'ҥ ҥҥҥ ҥҥѥѥѥѥѥѥѥѥѥѥѥѥѥѥѥѥѥѥѥxѥqѥjѥcѥ\ѥUѥNѥGѥ@ѥ9ѥ2ѥ+ѥ$ѥѥѥѥѥѥХХХХХХХХХХХХХХХХХХ|ХuХnХgХ`ХYХRХKХDХ=Х6Х/Х(Х!ХХХ ХХϥϥϥϥϥϥϥϥϥϥϥϥϥϥϥϥϥϥϥyϥrϥkϥdϥ]ϥVϥOϥHϥAϥ:ϥ3ϥ,ϥ%ϥϥϥϥ ϥϥΥΥΥΥΥΥΥΥΥΥΥΥΥΥΥΥΥΥ}ΥvΥoΥhΥaΥZΥSΥLΥEΥ>Υ7Υ0Υ)Υ"ΥΥΥ ΥΥͥͥͥͥͥͥͥͥͥͥͥͥͥͥͥͥͥͥͥzͥsͥlͥeͥ^ͥWͥPͥIͥBͥ;ͥ4ͥ-ͥ&ͥͥͥͥ ̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥ͥͥ~̥w̥p̥i̥b̥[̥T̥M̥F̥?̥8̥1̥*̥#̥̥̥̥̥̥˥˥˥˥˥˥˥˥˥˥˥˥˥˥˥˥˥˥{˥t˥m˥f˥_˥X˥Q˥J˥C˥<˥5˥.˥'˥ ˥˥˥ ˥˥ʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥxʥqʥjʥcʥ\ʥUʥNʥGʥ@ʥ9ʥ2ʥ+ʥ$ʥʥʥʥʥʥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥ|ɥuɥnɥgɥ`ɥYɥRɥKɥDɥ=ɥ6ɥ/ɥ(ɥ!ɥɥɥ ɥɥȥȥȥȥȥȥȥȥȥȥȥȥȥȥȥȥȥȥȥyȥrȥkȥdȥ]ȥVȥOȥHȥAȥ:ȥ3ȥ,ȥ%ȥȥȥȥ ȥȥǥǥǥǥǥǥǥǥǥǥǥǥǥǥǥǥǥǥ}ǥvǥoǥhǥaǥZǥSǥLǥEǥ>ǥ7ǥ0ǥ)ǥ"ǥǥǥ ǥǥƥƥƥƥƥƥƥƥƥƥƥƥƥƥƥƥƥƥƥzƥsƥlƥeƥ^ƥWƥPƥIƥBƥ;ƥ4ƥ-ƥ&ƥƥƥƥ ƥƥťťťťťťťťťťťťťťťťťť~ťwťpťiťbť[ťTťMťFť?ť8ť1ť*ť#ťťťťťťĥĥĥĥĥĥĥĥĥĥĥĥĥĥĥĥĥĥ{ĥtĥmĥfĥ_ĥXĥQĥJĥCĥ<ĥ5ĥ.ĥ'ĥ ĥĥĥ ĥĥåååååååååååååååååååxåqåjåcå\åUåNåGå@å9å2å+å$ååååå奥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥|¥u¥n¥g¥`¥Y¥R¥K¥D¥=¥6¥/¥(¥!¥¥¥ ¥¥yrkd]VOHA:3,% }vohaZSLE>70)" 꿥㿥ܿտοǿzsle^WPIB;4-& 羥ྥپҾ˾ľ~wpib[TMF?81*#뽥佥ݽֽϽȽ{tmf_XQJC<5.'  E輥ἥڼӼ̼żxqjc\UNG@92+$컥廥޻׻лɻ»|ung`YRKD=6/(! 麥⺥ۺԺͺƺyrkd]VOHA:3,% 湥߹عѹʹù}vohaZSLE>70)" 긥㸥ܸոθǸzsle^WPIB;4-& 緥෥ٷҷ˷ķ~wpib[TMF?81*#붥䶥ݶֶ϶ȶ{tmf_XQJC<5.'  ﵥ赥ᵥڵӵ̵ŵxqjc\UNG@92+$촥崥޴״дɴ´|ung`YRKD=6/(! 鳥⳥۳ԳͳƳyrkd]VOHA:3,% 沥߲زѲʲò}vohaZSLE>70)" 걥㱥ܱձαDZzsle^WPIB;4-& 簥థٰҰ˰İ~wpib[TMF?81*#믥䯥ݯ֯ϯȯ{tmf_XQJC<5.'  ﮥ讥ᮥڮӮ̮Ůxqjc\UNG@92+$쭥孥ޭ׭Эɭ­|ung`YRKD=6/(! 鬥⬥۬ԬͬƬyrkd]VOHA:3,% 櫥߫ثѫʫë}vohaZSLE>70)" ꪥ㪥ܪժΪǪzsle^WPIB;4-& 穥੥٩ҩ˩ĩ~wpib[TMF?81*#먥䨥ݨ֨ϨȨ{tmf_XQJC<5.'  痢觥᧥ڧӧ̧ŧxqjc\UNG@92+$즥妥ަצЦɦ¦|ung`YRKD=6/(! 饥⥥ۥԥͥƥyrkd]VOHA:3,% 椥ߤؤѤʤä}vohaZSLE>70)" ꣥㣥ܣգΣǣzsle^WPIB;4-& 碥ࢥ٢ҢˢĢ~wpib[TMF?81*#롥䡥ݡ֡ϡȡ{tmf_XQJC<5.'  蠥ᠥڠӠ̠Šxqjc\UNG@92+$쟥埥ޟןПɟŸ|ung`YRKD=6/(! 鞥➥۞Ԟ͞ƞyrkd]VOHA:3,% 흥来ߝ؝ѝʝÝ}vohaZSLE>70)" ꜥ㜥ܜ՜Μǜzsle^WPIB;4-& 盥ٛқ˛ě~wpib[TMF?81*#뚥䚥ݚ֚ϚȚ{tmf_XQJC<5.'  虥ᙥڙә̙řxqjc\UNG@92+$옥嘥ޘטИɘ˜|ung`YRKD=6/(! 闥◥ۗԗ͗Ɨyrkd]VOHA:3,% 향斥ߖؖіʖÖ}vohaZSLE>70)" ꕥ㕥ܕՕΕǕzsle^WPIB;4-& 甥ٔҔ˔Ĕ~wpib[TMF?81*#듥䓥ݓ֓ϓȓ{tmf_XQJC<5.'  蒥ᒥڒӒ̒Œxqjc\UNG@92+$쑥呥ޑבБɑ‘|ung`YRKD=6/(! 鐥␥ېԐ͐Ɛyrkd]VOHA:3,% 폥揥ߏ؏яʏÏ}vohaZSLE>70)" ꎥ㎥܎ՎΎǎzsle^WPIB;4-& 獥ٍҍˍč~wpib[TMF?81*#댥䌥݌֌όȌ{tmf_XQJC<5.'  若ዥڋӋ̋ŋxqjc\UNG@92+$슥劥ފ׊ЊɊŠ|ung`YRKD=6/(! 鉥≥ۉԉ͉Ɖyrkd]VOHA:3,% 툥戥߈؈шʈÈ}vohaZSLE>70)" ꇥ㇥܇Շ·LJzsle^WPIB;4-& 熥ن҆ˆĆ~wpib[TMF?81*#녥䅥݅օυȅ{tmf_XQJC<5.'  脥ᄥڄӄ̄ńxqjc\UNG@92+$샥僥ރ׃ЃɃƒ|ung`YRKD=6/(! 邥₥ۂԂ͂Ƃyrkd]VOHA:3,% 큥恥߁؁сʁÁ}vohaZSLE>70)" ꀥ〥܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ߤߤߤߤߤߤߤߤߤߤߤߤߤߤߤߤߤߤߤzߤsߤlߤeߤ^ߤWߤPߤIߤBߤ;ߤ4ߤ-ߤ&ߤߤߤߤ ߤߤޤޤޤޤޤޤޤޤޤޤޤޤޤޤޤޤޤޤ~ޤwޤpޤiޤbޤ[ޤTޤMޤFޤ?ޤ8ޤ1ޤ*ޤ#ޤޤޤޤޤޤݤݤݤݤݤݤݤݤݤݤݤݤݤݤݤݤݤݤ{ݤtݤmݤfݤ_ݤXݤQݤJݤCݤ<ݤ5ݤ.ݤ'ݤ ݤݤݤ ݤݤܤܤܤܤܤܤܤܤܤܤܤܤܤܤܤܤܤܤܤxܤqܤjܤcܤ\ܤUܤNܤGܤ@ܤ9ܤ2ܤ+ܤ$ܤܤܤܤܤܤۤۤۤۤۤۤۤۤۤۤۤۤۤۤۤۤۤۤ|ۤuۤnۤgۤ`ۤYۤRۤKۤDۤ=ۤ6ۤ/ۤ(ۤ!ۤۤۤ ۤۤڤڤڤڤڤڤڤڤڤڤڤڤڤڤڤڤڤڤڤyڤrڤkڤdڤ]ڤVڤOڤHڤAڤ:ڤ3ڤ,ڤ%ڤڤڤڤ ڤڤ٤٤٤٤٤٤٤٤٤٤٤٤٤٤٤٤٤٤}٤v٤o٤h٤a٤Z٤S٤L٤E٤>٤7٤0٤)٤"٤٤٤ ٤٤ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤzؤsؤlؤeؤ^ؤWؤPؤIؤBؤ;ؤ4ؤ-ؤ&ؤؤؤؤ ؤؤפפפפפפפפפפפפפפפפפפ~פwפpפiפbפ[פTפMפFפ?פ8פ1פ*פ#פפפפפפ֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤֤{֤t֤m֤f֤_֤X֤Q֤J֤C֤<֤5֤.֤'֤ ֤֤֤ ֤֤դդդդդդդդդդդդդդդդդդդxդqդjդcդ\դUդNդGդ@դ9դ2դ+դ$դդդդդդԤԤԤԤԤԤԤԤԤԤԤԤԤԤԤԤԤԤ|ԤuԤnԤgԤ`ԤYԤRԤKԤDԤ=Ԥ6Ԥ/Ԥ(Ԥ!ԤԤԤ ԤԤӤӤӤӤӤӤӤӤӤӤӤӤӤӤӤӤӤӤӤyӤrӤkӤdӤ]ӤVӤOӤHӤAӤ:Ӥ3Ӥ,Ӥ%ӤӤӤӤ ӤӤҤҤҤҤҤҤҤҤҤҤҤҤҤҤҤҤҤҤ}ҤvҤoҤhҤaҤZҤSҤLҤEҤ>Ҥ7Ҥ0Ҥ)Ҥ"ҤҤҤ ҤҤѤѤѤѤѤѤѤѤѤѤѤѤѤѤѤѤѤѤѤzѤsѤlѤeѤ^ѤWѤPѤIѤBѤ;Ѥ4Ѥ-Ѥ&ѤѤѤѤ ѤѤФФФФФФФФФФФФФФФФФФ~ФwФpФiФbФ[ФTФMФFФ?Ф8Ф1Ф*Ф#ФФФФФФϤϤϤϤϤϤϤϤϤϤϤϤϤϤϤϤϤϤ{ϤtϤmϤfϤ_ϤXϤQϤJϤCϤ<Ϥ5Ϥ.Ϥ'Ϥ ϤϤϤ ϤϤΤΤΤΤΤΤΤΤΤΤΤΤΤΤΤΤΤΤΤxΤqΤjΤcΤ\ΤUΤNΤGΤ@Τ9Τ2Τ+Τ$ΤΤΤΤΤΤͤͤͤͤͤͤͤͤͤͤͤͤͤͤͤͤͤͤ|ͤuͤnͤgͤ`ͤYͤRͤKͤDͤ=ͤ6ͤ/ͤ(ͤ!ͤͤͤ ̤̤̤̤̤̤̤̤̤̤̤̤̤̤̤̤̤̤̤ͤͤy̤r̤k̤d̤]̤V̤O̤H̤A̤:̤3̤,̤%̤̤̤̤ ̤̤ˤˤˤˤˤˤˤˤˤˤˤˤˤˤˤˤˤˤ}ˤvˤoˤhˤaˤZˤSˤLˤEˤ>ˤ7ˤ0ˤ)ˤ"ˤˤˤ ˤˤʤʤʤʤʤʤʤʤʤʤʤʤʤʤʤʤʤʤʤzʤsʤlʤeʤ^ʤWʤPʤIʤBʤ;ʤ4ʤ-ʤ&ʤʤʤʤ ʤʤɤɤɤɤɤɤɤɤɤɤɤɤɤɤɤɤɤɤ~ɤwɤpɤiɤbɤ[ɤTɤMɤFɤ?ɤ8ɤ1ɤ*ɤ#ɤɤɤɤɤɤȤȤȤȤȤȤȤȤȤȤȤȤȤȤȤȤȤȤ{ȤtȤmȤfȤ_ȤXȤQȤJȤCȤ<Ȥ5Ȥ.Ȥ'Ȥ ȤȤȤ ȤȤǤǤǤǤǤǤǤǤǤǤǤǤǤǤǤǤǤǤǤxǤqǤjǤcǤ\ǤUǤNǤGǤ@Ǥ9Ǥ2Ǥ+Ǥ$ǤǤǤǤǤǤƤƤƤƤƤƤƤƤƤƤƤƤƤƤƤƤƤƤ|ƤuƤnƤgƤ`ƤYƤRƤKƤDƤ=Ƥ6Ƥ/Ƥ(Ƥ!ƤƤƤ ƤƤŤŤŤŤŤŤŤŤŤŤŤŤŤŤŤŤŤŤŤyŤrŤkŤdŤ]ŤVŤOŤHŤAŤ:Ť3Ť,Ť%ŤŤŤŤ ŤŤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤ}ĤvĤoĤhĤaĤZĤSĤLĤEĤ>Ĥ7Ĥ0Ĥ)Ĥ"ĤĤĤ ĤĤäääääääääääääääääääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ä䤤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤{tmf_XQJC<5.'  xqjc\UNG@92+$쿤忤޿׿пɿ¿|ung`YRKD=6/(! 龤⾤۾Ծ;ƾyrkd]VOHA:3,% 潤߽ؽѽʽý}vohaZSLE>70)" 꼤㼤ܼռμǼzsle^WPIB;4-& 绤໤ٻһ˻Ļ~wpib[TMF?81*#뺤交ݺֺϺȺ{tmf_XQJC<5.'  ﹤蹤Ṥڹӹ̹Źxqjc\UNG@92+$츤帤޸׸иɸ¸|ung`YRKD=6/(! 鷤ⷤ۷ԷͷƷyrkd]VOHA:3,% 涤߶ضѶʶö}vohaZSLE>70)" 굤㵤ܵյεǵzsle^WPIB;4-& 紤തٴҴ˴Ĵ~wpib[TMF?81*#볤䳤ݳֳϳȳ{tmf_XQJC<5.'  ﲤ貤ᲤڲӲ̲Ųxqjc\UNG@92+$챤層ޱױбɱ±|ung`YRKD=6/(! 鰤Ⱔ۰԰Ͱưyrkd]VOHA:3,% 毤߯دѯʯï}vohaZSLE>70)" ꮤ㮤ܮծήǮzsle^WPIB;4-& 筤୤٭ҭ˭ĭ~wpib[TMF?81*#묤䬤ݬ֬ϬȬ{tmf_XQJC<5.'  﫤諤᫤ګӫ̫ūxqjc\UNG@92+$쪤媤ުתЪɪª|ung`YRKD=6/(! 驤⩤۩ԩͩƩyrkd]VOHA:3,% 樤ߨبѨʨè}vohaZSLE>70)" ꧤ㧤ܧէΧǧzsle^WPIB;4-& 禤ত٦Ҧ˦Ħ~wpib[TMF?81*#륤䥤ݥ֥ϥȥ{tmf_XQJC<5.'  襤褤ᤤڤӤ̤Ťxqjc\UNG@92+$죤壤ޣףУɣ£|ung`YRKD=6/(! 颤⢤ۢԢ͢Ƣyrkd]VOHA:3,% 桤ߡءѡʡá}vohaZSLE>70)" ꠤ㠤ܠՠΠǠzsle^WPIB;4-& 矤ٟҟ˟ğ~wpib[TMF?81*#랤䞤ݞ֞ϞȞ{tmf_XQJC<5.'  蝤ᝤڝӝ̝ŝxqjc\UNG@92+$윤圤ޜלМɜœ|ung`YRKD=6/(! 雤⛤ۛԛ͛ƛyrkd]VOHA:3,% 횤暤ߚؚњʚÚ}vohaZSLE>70)" Ꙥ㙤ܙՙΙǙzsle^WPIB;4-& 瘤٘Ҙ˘Ę~wpib[TMF?81*#뗤䗤ݗ֗ϗȗ{tmf_XQJC<5.'  薤ᖤږӖ̖Ŗxqjc\UNG@92+$앤啤ޕוЕɕ•|ung`YRKD=6/(! 锤┤۔Ԕ͔Ɣyrkd]VOHA:3,% 퓤擤ߓؓѓʓÓ}vohaZSLE>70)" ꒤㒤ܒՒΒǒzsle^WPIB;4-& 瑤ّґˑđ~wpib[TMF?81*#됤䐤ݐ֐ϐȐ{tmf_XQJC<5.'  菤Ꮴڏӏ̏ŏxqjc\UNG@92+$쎤厤ގ׎ЎɎŽ|ung`YRKD=6/(! 鍤⍤ۍԍ͍ƍyrkd]VOHA:3,% 팤挤ߌ،ьʌÌ}vohaZSLE>70)" ꋤ㋤܋Ջ΋Njzsle^WPIB;4-& 犤يҊˊĊ~wpib[TMF?81*#뉤䉤݉։ωȉ{tmf_XQJC<5.'  舤ሤڈӈ̈ňxqjc\UNG@92+$쇤凤އׇЇɇ‡|ung`YRKD=6/(! 醤↤ۆԆ͆Ɔyrkd]VOHA:3,% 텤慤߅؅хʅÅ}vohaZSLE>70)" ꄤㄤ܄Մ΄DŽzsle^WPIB;4-& 烤ك҃˃ă~wpib[TMF?81*#낤䂤݂ւςȂ{tmf_XQJC<5.'  聤ၤځӁ́Łxqjc\UNG@92+$쀤値ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$ߣߣߣߣߣߣߣߣߣߣߣߣߣߣߣߣߣߣ|ߣuߣnߣgߣ`ߣYߣRߣKߣDߣ=ߣ6ߣ/ߣ(ߣ!ߣߣߣ ߣߣޣޣޣޣޣޣޣޣޣޣޣޣޣޣޣޣޣޣޣyޣrޣkޣdޣ]ޣVޣOޣHޣAޣ:ޣ3ޣ,ޣ%ޣޣޣޣ ޣޣݣݣݣݣݣݣݣݣݣݣݣݣݣݣݣݣݣݣ}ݣvݣoݣhݣaݣZݣSݣLݣEݣ>ݣ7ݣ0ݣ)ݣ"ݣݣݣ ݣݣܣܣܣܣܣܣܣܣܣܣܣܣܣܣܣܣܣܣܣzܣsܣlܣeܣ^ܣWܣPܣIܣBܣ;ܣ4ܣ-ܣ&ܣܣܣܣ ܣܣۣۣۣۣۣۣۣۣۣۣۣۣۣۣۣۣۣۣ~ۣwۣpۣiۣbۣ[ۣTۣMۣFۣ?ۣ8ۣ1ۣ*ۣ#ۣۣۣۣۣۣڣڣڣڣڣڣڣڣڣڣڣڣڣڣڣڣڣڣ{ڣtڣmڣfڣ_ڣXڣQڣJڣCڣ<ڣ5ڣ.ڣ'ڣ ڣڣڣ ڣڣ٣٣٣٣٣٣٣٣٣٣٣٣٣٣٣٣٣٣٣x٣q٣j٣c٣\٣U٣N٣G٣@٣9٣2٣+٣$٣٣٣٣٣٣أأأأأأأأأأأأأأأأأأ|أuأnأgأ`أYأRأKأDأ=أ6أ/أ(أ!أأأ أأףףףףףףףףףףףףףףףףףףףyףrףkףdף]ףVףOףHףAף:ף3ף,ף%ףףףף ףף֣֣֣֣֣֣֣֣֣֣֣֣֣֣֣֣֣֣}֣v֣o֣h֣a֣Z֣S֣L֣E֣>֣7֣0֣)֣"֣֣֣ ֣֣գգգգգգգգգգգգգգգգգգգzգsգlգeգ^գWգPգIգBգ;գ4գ-գ&գգգգ գգԣԣԣԣԣԣԣԣԣԣԣԣԣԣԣԣԣԣ~ԣwԣpԣiԣbԣ[ԣTԣMԣFԣ?ԣ8ԣ1ԣ*ԣ#ԣԣԣԣԣԣӣӣӣӣӣӣӣӣӣӣӣӣӣӣӣӣӣӣ{ӣtӣmӣfӣ_ӣXӣQӣJӣCӣ<ӣ5ӣ.ӣ'ӣ ӣӣӣ ӣӣңңңңңңңңңңңңңңңңңңңxңqңjңcң\ңUңNңGң@ң9ң2ң+ң$ңңңңңңѣѣѣѣѣѣѣѣѣѣѣѣѣѣѣѣѣѣ|ѣuѣnѣgѣ`ѣYѣRѣKѣDѣ=ѣ6ѣ/ѣ(ѣ!ѣѣѣ ѣѣУУУУУУУУУУУУУУУУУУУyУrУkУdУ]УVУOУHУAУ:У3У,У%УУУУ УУϣϣϣϣϣϣϣϣϣϣϣϣϣϣϣϣϣϣ}ϣvϣoϣhϣaϣZϣSϣLϣEϣ>ϣ7ϣ0ϣ)ϣ"ϣϣϣ ϣϣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣzΣsΣlΣeΣ^ΣWΣPΣIΣBΣ;Σ4Σ-Σ&ΣΣΣΣ ΣΣͣͣͣͣͣͣͣͣͣͣͣͣͣͣͣͣͣͣ~ͣwͣpͣiͣbͣ[ͣTͣMͣFͣ?ͣ8ͣ1ͣ*ͣ#̣̣̣̣̣̣̣̣̣̣̣̣̣̣̣̣̣̣ͣͣͣͣͣͣ{̣ṭṃf̣_̣X̣Q̣J̣C̣<̣5̣.̣'̣ ̣̣̣ ̣̣ˣˣˣˣˣˣˣˣˣˣˣˣˣˣˣˣˣˣˣxˣqˣjˣcˣ\ˣUˣNˣGˣ@ˣ9ˣ2ˣ+ˣ$ˣˣˣˣˣˣʣʣʣʣʣʣʣʣʣʣʣʣʣʣʣʣʣʣ|ʣuʣnʣgʣ`ʣYʣRʣKʣDʣ=ʣ6ʣ/ʣ(ʣ!ʣʣʣ ʣʣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣyɣrɣkɣdɣ]ɣVɣOɣHɣAɣ:ɣ3ɣ,ɣ%ɣɣɣɣ ɣɣȣȣȣȣȣȣȣȣȣȣȣȣȣȣȣȣȣȣ}ȣvȣoȣhȣaȣZȣSȣLȣEȣ>ȣ7ȣ0ȣ)ȣ"ȣȣȣ ȣȣǣǣǣǣǣǣǣǣǣǣǣǣǣǣǣǣǣǣǣzǣsǣlǣeǣ^ǣWǣPǣIǣBǣ;ǣ4ǣ-ǣ&ǣǣǣǣ ǣǣƣƣƣƣƣƣƣƣƣƣƣƣƣƣƣƣƣƣ~ƣwƣpƣiƣbƣ[ƣTƣMƣFƣ?ƣ8ƣ1ƣ*ƣ#ƣƣƣƣƣƣţţţţţţţţţţţţţţţţţţ{ţtţmţfţ_ţXţQţJţCţ<ţ5ţ.ţ'ţ ţţţ ţţģģģģģģģģģģģģģģģģģģģxģqģjģcģ\ģUģNģGģ@ģ9ģ2ģ+ģ$ģģģģģģãããããããããããããããããã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ã㣣£££££££££££££££££y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££}vohaZSLE>70)" zsle^WPIB;4-& 翣࿣ٿҿ˿Ŀ~wpib[TMF?81*#뾣侣ݾ־ϾȾ{tmf_XQJC<5.'  」轣ὣڽӽ̽Žxqjc\UNG@92+$켣弣޼׼мɼ¼|ung`YRKD=6/(! 黣⻣ۻԻͻƻyrkd]VOHA:3,% 溣ߺغѺʺú}vohaZSLE>70)" 깣㹣ܹչιǹzsle^WPIB;4-& 縣รٸҸ˸ĸ~wpib[TMF?81*#뷣䷣ݷַϷȷ{tmf_XQJC<5.'  ﶣ趣ᶣڶӶ̶Ŷxqjc\UNG@92+$쵣嵣޵׵еɵµ|ung`YRKD=6/(! 鴣ⴣ۴Դʹƴyrkd]VOHA:3,% 泣߳سѳʳó}vohaZSLE>70)" 겣㲣ܲղβDzzsle^WPIB;4-& 籣ౣٱұ˱ı~wpib[TMF?81*#밣䰣ݰְϰȰ{tmf_XQJC<5.'  ﯣ诣ᯣگӯ̯ůxqjc\UNG@92+$쮣宣ޮ׮Юɮ®|ung`YRKD=6/(! 魣⭣ۭԭͭƭyrkd]VOHA:3,% 欣߬جѬʬì}vohaZSLE>70)" ꫣ㫣ܫիΫǫzsle^WPIB;4-& 窣ણ٪Ҫ˪Ī~wpib[TMF?81*#멣䩣ݩ֩ϩȩ{tmf_XQJC<5.'  﨣訣ᨣڨӨ̨Ũxqjc\UNG@92+$짣姣ާקЧɧ§|ung`YRKD=6/(! 馣⦣ۦԦͦƦyrkd]VOHA:3,% 楣ߥإѥʥå}vohaZSLE>70)" ꤣ㤣ܤդΤǤzsle^WPIB;4-& 磣ࣣ٣ңˣģ~wpib[TMF?81*#뢣䢣ݢ֢ϢȢ{tmf_XQJC<5.'  衣ᡣڡӡ̡šxqjc\UNG@92+$젣堣ޠנРɠ |ung`YRKD=6/(! 韣⟣۟ԟ͟Ɵyrkd]VOHA:3,% 힣枣ߞ؞ўʞÞ}vohaZSLE>70)" ꝣ㝣ܝ՝Νǝzsle^WPIB;4-& 眣ٜҜ˜Ĝ~wpib[TMF?81*#뛣䛣ݛ֛ϛț{tmf_XQJC<5.'  蚣ᚣښӚ̚Śxqjc\UNG@92+$왣噣ޙיЙə™|ung`YRKD=6/(! 阣☣ۘԘ͘Ƙyrkd]VOHA:3,% 헣旣ߗؗїʗ×}vohaZSLE>70)" ꖣ㖣ܖՖΖǖzsle^WPIB;4-& 畣ٕҕ˕ĕ~wpib[TMF?81*#딣䔣ݔ֔ϔȔ{tmf_XQJC<5.'  蓣ᓣړӓ̓œxqjc\UNG@92+$쒣咣ޒגВɒ’|ung`YRKD=6/(! 鑣④ۑԑ͑Ƒyrkd]VOHA:3,% 퐣搣ߐؐѐʐÐ}vohaZSLE>70)" ꏣ㏣܏ՏΏǏzsle^WPIB;4-& 玣َҎˎĎ~wpib[TMF?81*#덣䍣ݍ֍ύȍ{tmf_XQJC<5.'  茣ጣڌӌ̌Ōxqjc\UNG@92+$싣勣ދ׋Ћɋ‹|ung`YRKD=6/(! 銣⊣ۊԊ͊Ɗyrkd]VOHA:3,% 퉣扣߉؉щʉÉ}vohaZSLE>70)" ꈣ㈣܈ՈΈLjzsle^WPIB;4-& 燣ه҇ˇć~wpib[TMF?81*#놣䆣݆ֆφȆ{tmf_XQJC<5.'  腣ᅣڅӅ̅Ņxqjc\UNG@92+$섣儣ބׄЄɄ„|ung`YRKD=6/(! 郣⃣ۃԃ̓ƃyrkd]VOHA:3,% 킣患߂؂тʂÂ}vohaZSLE>70)" ꁣっ܁Ձ΁ǁzsle^WPIB;4-& 瀣ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ߢߢߢߢߢߢߢߢߢߢߢߢߢߢߢߢߢߢ~ߢwߢpߢiߢbߢ[ߢTߢMߢFߢ?ߢ8ߢ1ߢ*ߢ#ߢߢߢߢߢߢޢޢޢޢޢޢޢޢޢޢޢޢޢޢޢޢޢޢ{ޢtޢmޢfޢ_ޢXޢQޢJޢCޢ<ޢ5ޢ.ޢ'ޢ ޢޢޢ ޢޢݢݢݢݢݢݢݢݢݢݢݢݢݢݢݢݢݢݢݢxݢqݢjݢcݢ\ݢUݢNݢGݢ@ݢ9ݢ2ݢ+ݢ$ݢݢݢݢݢݢܢܢܢܢܢܢܢܢܢܢܢܢܢܢܢܢܢܢ|ܢuܢnܢgܢ`ܢYܢRܢKܢDܢ=ܢ6ܢ/ܢ(ܢ!ܢܢܢ ܢܢۢۢۢۢۢۢۢۢۢۢۢۢۢۢۢۢۢۢۢyۢrۢkۢdۢ]ۢVۢOۢHۢAۢ:ۢ3ۢ,ۢ%ۢۢۢۢ ۢۢڢڢڢڢڢڢڢڢڢڢڢڢڢڢڢڢڢڢ}ڢvڢoڢhڢaڢZڢSڢLڢEڢ>ڢ7ڢ0ڢ)ڢ"ڢڢڢ ڢڢ٢٢٢٢٢٢٢٢٢٢٢٢٢٢٢٢٢٢٢z٢s٢l٢e٢^٢W٢P٢I٢B٢;٢4٢-٢&٢٢٢٢ ٢٢آآآآآآآآآآآآآآآآآآ~آwآpآiآbآ[آTآMآFآ?آ8آ1آ*آ#آآآآآآעעעעעעעעעעעעעעעעעע{עtעmעfע_עXעQעJעCע<ע5ע.ע'ע עעע עע֢֢֢֢֢֢֢֢֢֢֢֢֢֢֢֢֢֢֢x֢q֢j֢c֢\֢U֢N֢G֢@֢9֢2֢+֢$֢֢֢֢֢֢բբբբբբբբբբբբբբբբբբ|բuբnբgբ`բYբRբKբDբ=բ6բ/բ(բ!բբբ բբԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢԢyԢrԢkԢdԢ]ԢVԢOԢHԢAԢ:Ԣ3Ԣ,Ԣ%ԢԢԢԢ ԢԢӢӢӢӢӢӢӢӢӢӢӢӢӢӢӢӢӢӢ}ӢvӢoӢhӢaӢZӢSӢLӢEӢ>Ӣ7Ӣ0Ӣ)Ӣ"ӢӢӢ ӢӢҢҢҢҢҢҢҢҢҢҢҢҢҢҢҢҢҢҢҢzҢsҢlҢeҢ^ҢWҢPҢIҢBҢ;Ң4Ң-Ң&ҢҢҢҢ ҢҢѢѢѢѢѢѢѢѢѢѢѢѢѢѢѢѢѢѢ~ѢwѢpѢiѢbѢ[ѢTѢMѢFѢ?Ѣ8Ѣ1Ѣ*Ѣ#ѢѢѢѢѢѢТТТТТТТТТТТТТТТТТТ{ТtТmТfТ_ТXТQТJТCТ<Т5Т.Т'Т ТТТ ТТϢϢϢϢϢϢϢϢϢϢϢϢϢϢϢϢϢϢϢxϢqϢjϢcϢ\ϢUϢNϢGϢ@Ϣ9Ϣ2Ϣ+Ϣ$ϢϢϢϢϢϢ΢΢΢΢΢΢΢΢΢΢΢΢΢΢΢΢΢΢|΢u΢n΢g΢`΢Y΢R΢K΢D΢=΢6΢/΢(΢!΢΢΢ ΢΢͢͢͢͢͢͢͢͢͢͢͢͢͢͢͢͢͢͢͢y͢r͢k͢d͢]͢V͢O͢H͢A͢:͢3͢,͢%͢͢͢͢ ̢̢̢̢̢̢̢̢̢̢̢̢̢̢̢̢̢̢͢͢}̢v̢o̢h̢a̢Z̢S̢L̢E̢>̢7̢0̢)̢"̢̢̢ ̢̢ˢˢˢˢˢˢˢˢˢˢˢˢˢˢˢˢˢˢˢzˢsˢlˢeˢ^ˢWˢPˢIˢBˢ;ˢ4ˢ-ˢ&ˢˢˢˢ ˢˢʢʢʢʢʢʢʢʢʢʢʢʢʢʢʢʢʢʢ~ʢwʢpʢiʢbʢ[ʢTʢMʢFʢ?ʢ8ʢ1ʢ*ʢ#ʢʢʢʢʢʢɢɢɢɢɢɢɢɢɢɢɢɢɢɢɢɢɢɢ{ɢtɢmɢfɢ_ɢXɢQɢJɢCɢ<ɢ5ɢ.ɢ'ɢ ɢɢɢ ɢɢȢȢȢȢȢȢȢȢȢȢȢȢȢȢȢȢȢȢȢxȢqȢjȢcȢ\ȢUȢNȢGȢ@Ȣ9Ȣ2Ȣ+Ȣ$ȢȢȢȢȢȢǢǢǢǢǢǢǢǢǢǢǢǢǢǢǢǢǢǢ|ǢuǢnǢgǢ`ǢYǢRǢKǢDǢ=Ǣ6Ǣ/Ǣ(Ǣ!ǢǢǢ ǢǢƢƢƢƢƢƢƢƢƢƢƢƢƢƢƢƢƢƢƢyƢrƢkƢdƢ]ƢVƢOƢHƢAƢ:Ƣ3Ƣ,Ƣ%ƢƢƢƢ ƢƢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢ}ŢvŢoŢhŢaŢZŢSŢLŢEŢ>Ţ7Ţ0Ţ)Ţ"ŢŢŢ ŢŢĢĢĢĢĢĢĢĢĢĢĢĢĢĢĢĢĢĢĢzĢsĢlĢeĢ^ĢWĢPĢIĢBĢ;Ģ4Ģ-Ģ&ĢĢĢĢ ĢĢââââââââââââââââââ~âwâpâiâbâ[âTâMâFâ?â8â1â*â#âââââ⢢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢{¢t¢m¢f¢_¢X¢Q¢J¢C¢<¢5¢.¢'¢ ¢¢¢ ¢¢xqjc\UNG@92+$|ung`YRKD=6/(! 鿢⿢ۿԿͿƿyrkd]VOHA:3,% 澢߾ؾѾʾþ}vohaZSLE>70)" 꽢㽢ܽսνǽzsle^WPIB;4-& 缢༢ټҼ˼ļ~wpib[TMF?81*#뻢仢ݻֻϻȻ{tmf_XQJC<5.'  ﺢ躢ẢںӺ̺źxqjc\UNG@92+$칢幢޹׹йɹ¹|ung`YRKD=6/(! 鸢⸢۸Ը͸Ƹyrkd]VOHA:3,% 淢߷طѷʷ÷}vohaZSLE>70)" 궢㶢ܶնζǶzsle^WPIB;4-& 絢ൢٵҵ˵ĵ~wpib[TMF?81*#봢䴢ݴִϴȴ{tmf_XQJC<5.'  ﳢ賢᳢ڳӳ̳ųxqjc\UNG@92+$첢岢޲ײвɲ²|ung`YRKD=6/(! 鱢Ɫ۱ԱͱƱyrkd]VOHA:3,% 氢߰ذѰʰð}vohaZSLE>70)" ꯢ㯢ܯկίǯzsle^WPIB;4-& 箢஢ٮҮˮĮ~wpib[TMF?81*#뭢䭢ݭ֭ϭȭ{tmf_XQJC<5.'  ﬢ謢ᬢڬӬ̬Ŭxqjc\UNG@92+$쫢嫢ޫ׫Ыɫ«|ung`YRKD=6/(! 骢⪢۪Ԫͪƪyrkd]VOHA:3,% 橢ߩةѩʩé}vohaZSLE>70)" ꨢ㨢ܨըΨǨzsle^WPIB;4-& 秢ৢ٧ҧ˧ħ~wpib[TMF?81*#릢䦢ݦ֦ϦȦ{tmf_XQJC<5.'  異襢ᥢڥӥ̥ťxqjc\UNG@92+$줢夢ޤפФɤ¤|ung`YRKD=6/(! 飢⣢ۣԣͣƣyrkd]VOHA:3,% 梢ߢآѢʢâ}vohaZSLE>70)" ꡢ㡢ܡաΡǡzsle^WPIB;4-& 砢ࠢ٠ҠˠĠ~wpib[TMF?81*#럢䟢ݟ֟ϟȟ{tmf_XQJC<5.'  螢អڞӞ̞Şxqjc\UNG@92+$읢坢ޝםНɝ|ung`YRKD=6/(! 霢✢ۜԜ͜Ɯyrkd]VOHA:3,% 훢曢ߛ؛ћʛÛ}vohaZSLE>70)" ꚢ㚢ܚ՚Κǚzsle^WPIB;4-& 癢ٙҙ˙ę~wpib[TMF?81*#똢䘢ݘ֘ϘȘ{tmf_XQJC<5.'  藢ᗢڗӗ̗ŗxqjc\UNG@92+$얢喢ޖזЖɖ–|ung`YRKD=6/(! 镢╢ەԕ͕ƕyrkd]VOHA:3,% 픢攢ߔؔєʔÔ}vohaZSLE>70)" ꓢ㓢ܓՓΓǓzsle^WPIB;4-& 璢ْҒ˒Ē~wpib[TMF?81*#둢䑢ݑ֑ϑȑ{tmf_XQJC<5.'  萢ᐢڐӐ̐Őxqjc\UNG@92+$쏢叢ޏ׏Џɏ|ung`YRKD=6/(! 鎢⎢ێԎ͎Ǝyrkd]VOHA:3,% 퍢换ߍ؍эʍÍ}vohaZSLE>70)" ꌢ㌢܌ՌΌnjzsle^WPIB;4-& 狢ًҋˋċ~wpib[TMF?81*#늢䊢݊֊ϊȊ{tmf_XQJC<5.'  艢ቢډӉ̉ʼnxqjc\UNG@92+$숢刢ވ׈ЈɈˆ|ung`YRKD=6/(! 釢⇢ۇԇ͇Ƈyrkd]VOHA:3,% 톢憢߆؆цʆÆ}vohaZSLE>70)" ꅢㅢ܅Յ΅Džzsle^WPIB;4-& 焢ل҄˄Ą~wpib[TMF?81*#냢䃢݃փσȃ{tmf_XQJC<5.'  肢Ⴂڂӂ̂łxqjc\UNG@92+$쁢偢ށׁЁɁ|ung`YRKD=6/(! 逢•ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ߡߡߡߡߡߡߡߡߡߡߡߡߡߡߡߡߡߡߡyߡrߡkߡdߡ]ߡVߡOߡHߡAߡ:ߡ3ߡ,ߡ%ߡߡߡߡ ߡߡޡޡޡޡޡޡޡޡޡޡޡޡޡޡޡޡޡޡ}ޡvޡoޡhޡaޡZޡSޡLޡEޡ>ޡ7ޡ0ޡ)ޡ"ޡޡޡ ޡޡݡݡݡݡݡݡݡݡݡݡݡݡݡݡݡݡݡݡݡzݡsݡlݡeݡ^ݡWݡPݡIݡBݡ;ݡ4ݡ-ݡ&ݡݡݡݡ ݡݡܡܡܡܡܡܡܡܡܡܡܡܡܡܡܡܡܡܡ~ܡwܡpܡiܡbܡ[ܡTܡMܡFܡ?ܡ8ܡ1ܡ*ܡ#ܡܡܡܡܡܡۡۡۡۡۡۡۡۡۡۡۡۡۡۡۡۡۡۡ{ۡtۡmۡfۡ_ۡXۡQۡJۡCۡ<ۡ5ۡ.ۡ'ۡ ۡۡۡ ۡۡڡڡڡڡڡڡڡڡڡڡڡڡڡڡڡڡڡڡڡxڡqڡjڡcڡ\ڡUڡNڡGڡ@ڡ9ڡ2ڡ+ڡ$ڡڡڡڡڡڡ١١١١١١١١١١١١١١١١١١|١u١n١g١`١Y١R١K١D١=١6١/١(١!١١١ ١١ءءءءءءءءءءءءءءءءءءءyءrءkءdء]ءVءOءHءAء:ء3ء,ء%ءءءء ءءסססססססססססססססססס}סvסoסhסaסZסSסLסEס>ס7ס0ס)ס"ססס סס֡֡֡֡֡֡֡֡֡֡֡֡֡֡֡֡֡֡֡z֡s֡l֡e֡^֡W֡P֡I֡B֡;֡4֡-֡&֡֡֡֡ ֡֡աաաաաաաաաաաաաաաաաա~աwաpաiաbա[աTաMաFա?ա8ա1ա*ա#աաաաաաԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡԡ{ԡtԡmԡfԡ_ԡXԡQԡJԡCԡ<ԡ5ԡ.ԡ'ԡ ԡԡԡ ԡԡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡӡxӡqӡjӡcӡ\ӡUӡNӡGӡ@ӡ9ӡ2ӡ+ӡ$ӡӡӡӡӡӡҡҡҡҡҡҡҡҡҡҡҡҡҡҡҡҡҡҡ|ҡuҡnҡgҡ`ҡYҡRҡKҡDҡ=ҡ6ҡ/ҡ(ҡ!ҡҡҡ ҡҡѡѡѡѡѡѡѡѡѡѡѡѡѡѡѡѡѡѡѡyѡrѡkѡdѡ]ѡVѡOѡHѡAѡ:ѡ3ѡ,ѡ%ѡѡѡѡ ѡѡСССССССССССССССССС}СvСoСhСaСZСSСLСEС>С7С0С)С"ССС ССϡϡϡϡϡϡϡϡϡϡϡϡϡϡϡϡϡϡϡzϡsϡlϡeϡ^ϡWϡPϡIϡBϡ;ϡ4ϡ-ϡ&ϡϡϡϡ ϡϡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ~ΡwΡpΡiΡbΡ[ΡTΡMΡFΡ?Ρ8Ρ1Ρ*Ρ#ΡΡΡΡΡΡ͡͡͡͡͡͡͡͡͡͡͡͡͡͡͡͡͡͡{͡t͡m͡f͡_͡X͡Q͡J͡C͡<͡5͡.͡'͡ ͡͡͡ ̡̡̡̡̡̡̡̡̡̡̡̡̡̡̡̡̡̡̡͡͡x̡q̡j̡c̡\̡U̡N̡G̡@̡9̡2̡+̡$̡̡̡̡̡̡ˡˡˡˡˡˡˡˡˡˡˡˡˡˡˡˡˡˡ|ˡuˡnˡgˡ`ˡYˡRˡKˡDˡ=ˡ6ˡ/ˡ(ˡ!ˡˡˡ ˡˡʡʡʡʡʡʡʡʡʡʡʡʡʡʡʡʡʡʡʡyʡrʡkʡdʡ]ʡVʡOʡHʡAʡ:ʡ3ʡ,ʡ%ʡʡʡʡ ʡʡɡɡɡɡɡɡɡɡɡɡɡɡɡɡɡɡɡɡ}ɡvɡoɡhɡaɡZɡSɡLɡEɡ>ɡ7ɡ0ɡ)ɡ"ɡɡɡ ɡɡȡȡȡȡȡȡȡȡȡȡȡȡȡȡȡȡȡȡȡzȡsȡlȡeȡ^ȡWȡPȡIȡBȡ;ȡ4ȡ-ȡ&ȡȡȡȡ ȡȡǡǡǡǡǡǡǡǡǡǡǡǡǡǡǡǡǡǡ~ǡwǡpǡiǡbǡ[ǡTǡMǡFǡ?ǡ8ǡ1ǡ*ǡ#ǡǡǡǡǡǡơơơơơơơơơơơơơơơơơơ{ơtơmơfơ_ơXơQơJơCơ<ơ5ơ.ơ'ơ ơơơ ơơšššššššššššššššššššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššġġġġġġġġġġġġġġġġġġ|ġuġnġgġ`ġYġRġKġDġ=ġ6ġ/ġ(ġ!ġġġ ġġáááááááááááááááááááyárákádá]áVáOáHáAá:á3á,á%áááá áá¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡zsle^WPIB;4-& ~wpib[TMF?81*#뿡信ݿֿϿȿ{tmf_XQJC<5.'  ᄀ辡ᾡھӾ̾žxqjc\UNG@92+$콡彡޽׽нɽ½|ung`YRKD=6/(! 鼡⼡ۼԼͼƼyrkd]VOHA:3,% 满߻ػѻʻû}vohaZSLE>70)" 꺡㺡ܺպκǺzsle^WPIB;4-& 繡๡ٹҹ˹Ĺ~wpib[TMF?81*#븡両ݸָϸȸ{tmf_XQJC<5.'  ﷡跡ᷡڷӷ̷ŷxqjc\UNG@92+$춡嶡޶׶жɶ¶|ung`YRKD=6/(! 鵡ⵡ۵Ե͵Ƶyrkd]VOHA:3,% 洡ߴشѴʴô}vohaZSLE>70)" 곡㳡ܳճγdzzsle^WPIB;4-& 粡ಡٲҲ˲IJ~wpib[TMF?81*#뱡䱡ݱֱϱȱ{tmf_XQJC<5.'  ﰡ谡ᰡڰӰ̰Űxqjc\UNG@92+$쯡寡ޯׯЯɯ¯|ung`YRKD=6/(! 鮡⮡ۮԮͮƮyrkd]VOHA:3,% 歡߭حѭʭí}vohaZSLE>70)" ꬡ㬡ܬլάǬzsle^WPIB;4-& 竡ૡ٫ҫ˫ī~wpib[TMF?81*#몡䪡ݪ֪ϪȪ{tmf_XQJC<5.'  視詡ᩡکө̩ũxqjc\UNG@92+$쨡娡ިרШɨ¨|ung`YRKD=6/(! 駡⧡ۧԧͧƧyrkd]VOHA:3,% 榡ߦئѦʦæ}vohaZSLE>70)" ꥡ㥡ܥեΥǥzsle^WPIB;4-& 礡ड٤ҤˤĤ~wpib[TMF?81*#룡䣡ݣ֣ϣȣ{tmf_XQJC<5.'  袡ᢡڢӢ̢Ţxqjc\UNG@92+$졡塡ޡסСɡ¡|ung`YRKD=6/(! 頡⠡۠Ԡ͠Ơyrkd]VOHA:3,% ퟡ柡ߟ؟џʟß}vohaZSLE>70)" ꞡ㞡ܞ՞ΞǞzsle^WPIB;4-& 睡ٝҝ˝ĝ~wpib[TMF?81*#뜡䜡ݜ֜ϜȜ{tmf_XQJC<5.'  蛡ᛡڛӛ̛śxqjc\UNG@92+$욡嚡ޚךКɚš|ung`YRKD=6/(! 陡♡ۙԙ͙ƙyrkd]VOHA:3,% 혡昡ߘؘјʘØ}vohaZSLE>70)" ꗡ㗡ܗ՗ΗǗzsle^WPIB;4-& 疡ٖҖ˖Ė~wpib[TMF?81*#땡䕡ݕ֕ϕȕ{tmf_XQJC<5.'  蔡ᔡڔӔ̔Ŕxqjc\UNG@92+$쓡員ޓדГɓ“|ung`YRKD=6/(! 钡⒡ےԒ͒ƒyrkd]VOHA:3,% 푡摡ߑؑёʑÑ}vohaZSLE>70)" ꐡ㐡ܐՐΐǐzsle^WPIB;4-& 珡ُҏˏď~wpib[TMF?81*#뎡䎡ݎ֎ώȎ{tmf_XQJC<5.'  荡፡ڍӍ̍ōxqjc\UNG@92+$쌡匡ތ׌ЌɌŒ|ung`YRKD=6/(! 鋡⋡ۋԋ͋Ƌyrkd]VOHA:3,% 튡抡ߊ؊ъʊÊ}vohaZSLE>70)" ꉡ㉡܉ՉΉljzsle^WPIB;4-& 爡و҈ˈĈ~wpib[TMF?81*#뇡䇡݇ևχȇ{tmf_XQJC<5.'  膡ᆡچӆ̆ņxqjc\UNG@92+$셡兡ޅׅЅɅ…|ung`YRKD=6/(! 鄡℡ۄԄ̈́Ƅyrkd]VOHA:3,% 탡惡߃؃уʃÃ}vohaZSLE>70)" ꂡァ܂Ղ΂ǂzsle^WPIB;4-& 灡فҁˁā~wpib[TMF?81*#뀡䀡݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ߠߠߠߠߠߠߠߠߠߠߠߠߠߠߠߠߠߠ{ߠtߠmߠfߠ_ߠXߠQߠJߠCߠ<ߠ5ߠ.ߠ'ߠ ߠߠߠ ߠߠޠޠޠޠޠޠޠޠޠޠޠޠޠޠޠޠޠޠޠxޠqޠjޠcޠ\ޠUޠNޠGޠ@ޠ9ޠ2ޠ+ޠ$ޠޠޠޠޠޠݠݠݠݠݠݠݠݠݠݠݠݠݠݠݠݠݠݠ|ݠuݠnݠgݠ`ݠYݠRݠKݠDݠ=ݠ6ݠ/ݠ(ݠ!ݠݠݠ ݠݠܠܠܠܠܠܠܠܠܠܠܠܠܠܠܠܠܠܠܠyܠrܠkܠdܠ]ܠVܠOܠHܠAܠ:ܠ3ܠ,ܠ%ܠܠܠܠ ܠܠ۠۠۠۠۠۠۠۠۠۠۠۠۠۠۠۠۠۠}۠v۠o۠h۠a۠Z۠S۠L۠E۠>۠7۠0۠)۠"۠۠۠ ۠۠ڠڠڠڠڠڠڠڠڠڠڠڠڠڠڠڠڠڠڠzڠsڠlڠeڠ^ڠWڠPڠIڠBڠ;ڠ4ڠ-ڠ&ڠڠڠڠ ڠڠ٠٠٠٠٠٠٠٠٠٠٠٠٠٠٠٠٠٠~٠w٠p٠i٠b٠[٠T٠M٠F٠?٠8٠1٠*٠#٠٠٠٠٠٠ؠؠؠؠؠؠؠؠؠؠؠؠؠؠؠؠؠؠ{ؠtؠmؠfؠ_ؠXؠQؠJؠCؠ<ؠ5ؠ.ؠ'ؠ ؠؠؠ ؠؠנננננננננננננננננננxנqנjנcנ\נUנNנGנ@נ9נ2נ+נ$ננננננ֠֠֠֠֠֠֠֠֠֠֠֠֠֠֠֠֠֠|֠u֠n֠g֠`֠Y֠R֠K֠D֠=֠6֠/֠(֠!֠֠֠ ֠֠ՠՠՠՠՠՠՠՠՠՠՠՠՠՠՠՠՠՠՠyՠrՠkՠdՠ]ՠVՠOՠHՠAՠ:ՠ3ՠ,ՠ%ՠՠՠՠ ՠՠԠԠԠԠԠԠԠԠԠԠԠԠԠԠԠԠԠԠ}ԠvԠoԠhԠaԠZԠSԠLԠEԠ>Ԡ7Ԡ0Ԡ)Ԡ"ԠԠԠ ԠԠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠӠzӠsӠlӠeӠ^ӠWӠPӠIӠBӠ;Ӡ4Ӡ-Ӡ&ӠӠӠӠ ӠӠҠҠҠҠҠҠҠҠҠҠҠҠҠҠҠҠҠҠ~ҠwҠpҠiҠbҠ[ҠTҠMҠFҠ?Ҡ8Ҡ1Ҡ*Ҡ#ҠҠҠҠҠҠѠѠѠѠѠѠѠѠѠѠѠѠѠѠѠѠѠѠ{ѠtѠmѠfѠ_ѠXѠQѠJѠCѠ<Ѡ5Ѡ.Ѡ'Ѡ ѠѠѠ ѠѠРРРРРРРРРРРРРРРРРРРxРqРjРcР\РUРNРGР@Р9Р2Р+Р$РРРРРРϠϠϠϠϠϠϠϠϠϠϠϠϠϠϠϠϠϠ|ϠuϠnϠgϠ`ϠYϠRϠKϠDϠ=Ϡ6Ϡ/Ϡ(Ϡ!ϠϠϠ ϠϠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΠyΠrΠkΠdΠ]ΠVΠOΠHΠAΠ:Π3Π,Π%ΠΠΠΠ ΠΠ͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠}͠v͠o͠h͠a͠Z͠S͠L͠E͠>͠7͠0͠)͠"͠͠͠ ̠̠̠̠̠̠̠̠̠̠̠̠̠̠̠̠̠̠̠͠͠z̠s̠l̠e̠^̠W̠P̠I̠B̠;̠4̠-̠&̠̠̠̠ ̠̠ˠˠˠˠˠˠˠˠˠˠˠˠˠˠˠˠˠˠ~ˠwˠpˠiˠbˠ[ˠTˠMˠFˠ?ˠ8ˠ1ˠ*ˠ#ˠˠˠˠˠˠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠ{ʠtʠmʠfʠ_ʠXʠQʠJʠCʠ<ʠ5ʠ.ʠ'ʠ ʠʠʠ ʠʠɠɠɠɠɠɠɠɠɠɠɠɠɠɠɠɠɠɠɠxɠqɠjɠcɠ\ɠUɠNɠGɠ@ɠ9ɠ2ɠ+ɠ$ɠɠɠɠɠɠȠȠȠȠȠȠȠȠȠȠȠȠȠȠȠȠȠȠ|ȠuȠnȠgȠ`ȠYȠRȠKȠDȠ=Ƞ6Ƞ/Ƞ(Ƞ!ȠȠȠ ȠȠǠǠǠǠǠǠǠǠǠǠǠǠǠǠǠǠǠǠǠyǠrǠkǠdǠ]ǠVǠOǠHǠAǠ:Ǡ3Ǡ,Ǡ%ǠǠǠǠ ǠǠƠƠƠƠƠƠƠƠƠƠƠƠƠƠƠƠƠƠ}ƠvƠoƠhƠaƠZƠSƠLƠEƠ>Ơ7Ơ0Ơ)Ơ"ƠƠƠ ƠƠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠzŠsŠlŠeŠ^ŠWŠPŠIŠBŠ;Š4Š-Š&ŠŠŠŠ ŠŠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ~ĠwĠpĠiĠbĠ[ĠTĠMĠFĠ?Ġ8Ġ1Ġ*Ġ#ĠĠĠĠĠĠàààààààààààààààààà{àtàmàfà_àXàQàJàCà<à5à.à'à ààà àà                   x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% 濠߿ؿѿʿÿ}vohaZSLE>70)" 꾠㾠ܾվξǾzsle^WPIB;4-& 罠འٽҽ˽Ľ~wpib[TMF?81*#뼠传ݼּϼȼ{tmf_XQJC<5.'  ﻠ軠Ỡڻӻ̻Żxqjc\UNG@92+$캠庠޺׺кɺº|ung`YRKD=6/(! 鹠⹠۹Թ͹ƹyrkd]VOHA:3,% 渠߸ظѸʸø}vohaZSLE>70)" 균㷠ܷշηǷzsle^WPIB;4-& 綠චٶҶ˶Ķ~wpib[TMF?81*#뵠䵠ݵֵϵȵ{tmf_XQJC<5.'  ﴠ贠ᴠڴӴ̴Ŵxqjc\UNG@92+$쳠峠޳׳гɳ³|ung`YRKD=6/(! 鲠Ⲡ۲ԲͲƲyrkd]VOHA:3,% 池߱رѱʱñ}vohaZSLE>70)" 갠㰠ܰհΰǰzsle^WPIB;4-& 篠௠ٯү˯į~wpib[TMF?81*#뮠䮠ݮ֮ϮȮ{tmf_XQJC<5.'  ﭠ譠᭠ڭӭ̭ŭxqjc\UNG@92+$쬠嬠ެ׬Ьɬ¬|ung`YRKD=6/(! 髠⫠۫ԫͫƫyrkd]VOHA:3,% 檠ߪتѪʪê}vohaZSLE>70)" ꩠ㩠ܩթΩǩzsle^WPIB;4-& 稠ਠ٨Ҩ˨Ĩ~wpib[TMF?81*#맠䧠ݧ֧ϧȧ{tmf_XQJC<5.'  裂覠ᦠڦӦ̦Ŧxqjc\UNG@92+$쥠奠ޥץХɥ¥|ung`YRKD=6/(! 餠⤠ۤԤͤƤyrkd]VOHA:3,% 棠ߣأѣʣã}vohaZSLE>70)" ꢠ㢠ܢբ΢Ǣzsle^WPIB;4-& 硠ࡠ١ҡˡġ~wpib[TMF?81*#렠䠠ݠ֠ϠȠ{tmf_XQJC<5.'  蟠០ڟӟ̟şxqjc\UNG@92+$잠垠ޞמОɞž|ung`YRKD=6/(! 靠❠۝ԝ͝Ɲyrkd]VOHA:3,% 휠朠ߜ؜ќʜÜ}vohaZSLE>70)" ꛠ㛠ܛ՛ΛǛzsle^WPIB;4-& 皠ٚҚ˚Ě~wpib[TMF?81*#뙠䙠ݙ֙ϙș{tmf_XQJC<5.'  蘠ᘠژӘ̘Řxqjc\UNG@92+$엠嗠ޗחЗɗ—|ung`YRKD=6/(! 閠■ۖԖ͖Ɩyrkd]VOHA:3,% 할敠ߕؕѕʕÕ}vohaZSLE>70)" ꔠ㔠ܔՔΔǔzsle^WPIB;4-& 瓠ٓғ˓ē~wpib[TMF?81*#뒠䒠ݒ֒ϒȒ{tmf_XQJC<5.'  葠ᑠڑӑ̑őxqjc\UNG@92+$쐠吠ސאАɐ|ung`YRKD=6/(! 鏠⏠ۏԏ͏Əyrkd]VOHA:3,% 펠掠ߎ؎юʎÎ}vohaZSLE>70)" ꍠ㍠܍Ս΍Ǎzsle^WPIB;4-& 猠ٌҌˌČ~wpib[TMF?81*#닠䋠݋֋ϋȋ{tmf_XQJC<5.'  芠አڊӊ̊Ŋxqjc\UNG@92+$쉠剠މ׉Љɉ‰|ung`YRKD=6/(! 鈠∠ۈԈ͈ƈyrkd]VOHA:3,% 퇠懠߇؇чʇÇ}vohaZSLE>70)" ꆠㆠ܆ՆΆdžzsle^WPIB;4-& 煠م҅˅ą~wpib[TMF?81*#넠䄠݄քτȄ{tmf_XQJC<5.'  胠რڃӃ̃Ńxqjc\UNG@92+$삠傠ނׂЂɂ‚|ung`YRKD=6/(! 遠⁠ہԁ́Ɓyrkd]VOHA:3,% 퀠怠߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߟߟߟߟߟߟߟߟߟߟߟߟߟߟߟߟߟߟ}ߟvߟoߟhߟaߟZߟSߟLߟEߟ>ߟ7ߟ0ߟ)ߟ"ߟߟߟ ߟߟޟޟޟޟޟޟޟޟޟޟޟޟޟޟޟޟޟޟޟzޟsޟlޟeޟ^ޟWޟPޟIޟBޟ;ޟ4ޟ-ޟ&ޟޟޟޟ ޟޟݟݟݟݟݟݟݟݟݟݟݟݟݟݟݟݟݟݟ~ݟwݟpݟiݟbݟ[ݟTݟMݟFݟ?ݟ8ݟ1ݟ*ݟ#ݟݟݟݟݟݟܟܟܟܟܟܟܟܟܟܟܟܟܟܟܟܟܟܟ{ܟtܟmܟfܟ_ܟXܟQܟJܟCܟ<ܟ5ܟ.ܟ'ܟ ܟܟܟ ܟܟ۟۟۟۟۟۟۟۟۟۟۟۟۟۟۟۟۟۟۟x۟q۟j۟c۟\۟U۟N۟G۟@۟9۟2۟+۟$۟۟۟۟۟۟ڟڟڟڟڟڟڟڟڟڟڟڟڟڟڟڟڟڟ|ڟuڟnڟgڟ`ڟYڟRڟKڟDڟ=ڟ6ڟ/ڟ(ڟ!ڟڟڟ ڟڟٟٟٟٟٟٟٟٟٟٟٟٟٟٟٟٟٟٟٟyٟrٟkٟdٟ]ٟVٟOٟHٟAٟ:ٟ3ٟ,ٟ%ٟٟٟٟ ٟٟ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟}؟v؟o؟h؟a؟Z؟S؟L؟E؟>؟7؟0؟)؟"؟؟؟ ؟؟ןןןןןןןןןןןןןןןןןןןzןsןlןeן^ןWןPןIןBן;ן4ן-ן&ןןןן ןן֟֟֟֟֟֟֟֟֟֟֟֟֟֟֟֟֟֟~֟w֟p֟i֟b֟[֟T֟M֟F֟?֟8֟1֟*֟#֟֟֟֟֟֟՟՟՟՟՟՟՟՟՟՟՟՟՟՟՟՟՟՟{՟t՟m՟f՟_՟X՟Q՟J՟C՟<՟5՟.՟'՟ ՟՟՟ ՟՟ԟԟԟԟԟԟԟԟԟԟԟԟԟԟԟԟԟԟԟxԟqԟjԟcԟ\ԟUԟNԟGԟ@ԟ9ԟ2ԟ+ԟ$ԟԟԟԟԟԟӟӟӟӟӟӟӟӟӟӟӟӟӟӟӟӟӟӟ|ӟuӟnӟgӟ`ӟYӟRӟKӟDӟ=ӟ6ӟ/ӟ(ӟ!ӟӟӟ ӟӟҟҟҟҟҟҟҟҟҟҟҟҟҟҟҟҟҟҟҟyҟrҟkҟdҟ]ҟVҟOҟHҟAҟ:ҟ3ҟ,ҟ%ҟҟҟҟ ҟҟџџџџџџџџџџџџџџџџџџ}џvџoџhџaџZџSџLџEџ>џ7џ0џ)џ"џџџ џџПППППППППППППППППППzПsПlПeП^ПWПPПIПBП;П4П-П&ПППП ППϟϟϟϟϟϟϟϟϟϟϟϟϟϟϟϟϟϟ~ϟwϟpϟiϟbϟ[ϟTϟMϟFϟ?ϟ8ϟ1ϟ*ϟ#ϟϟϟϟϟϟΟΟΟΟΟΟΟΟΟΟΟΟΟΟΟΟΟΟ{ΟtΟmΟfΟ_ΟXΟQΟJΟCΟ<Ο5Ο.Ο'Ο ΟΟΟ ΟΟ͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟x͟q͟j͟c͟\͟U͟N͟G͟@͟9͟2͟+͟$̟̟̟̟̟̟̟̟̟̟̟̟̟̟̟̟̟̟͟͟͟͟͟͟|̟u̟n̟g̟`̟Y̟R̟K̟D̟=̟6̟/̟(̟!̟̟̟ ̟̟˟˟˟˟˟˟˟˟˟˟˟˟˟˟˟˟˟˟˟y˟r˟k˟d˟]˟V˟O˟H˟A˟:˟3˟,˟%˟˟˟˟ ˟˟ʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟ}ʟvʟoʟhʟaʟZʟSʟLʟEʟ>ʟ7ʟ0ʟ)ʟ"ʟʟʟ ʟʟɟɟɟɟɟɟɟɟɟɟɟɟɟɟɟɟɟɟɟzɟsɟlɟeɟ^ɟWɟPɟIɟBɟ;ɟ4ɟ-ɟ&ɟɟɟɟ ɟɟȟȟȟȟȟȟȟȟȟȟȟȟȟȟȟȟȟȟ~ȟwȟpȟiȟbȟ[ȟTȟMȟFȟ?ȟ8ȟ1ȟ*ȟ#ȟȟȟȟȟȟǟǟǟǟǟǟǟǟǟǟǟǟǟǟǟǟǟǟ{ǟtǟmǟfǟ_ǟXǟQǟJǟCǟ<ǟ5ǟ.ǟ'ǟ ǟǟǟ ǟǟƟƟƟƟƟƟƟƟƟƟƟƟƟƟƟƟƟƟƟxƟqƟjƟcƟ\ƟUƟNƟGƟ@Ɵ9Ɵ2Ɵ+Ɵ$ƟƟƟƟƟƟşşşşşşşşşşşşşşşşşş|şuşnşgş`şYşRşKşDş=ş6ş/ş(ş!şşş şşğğğğğğğğğğğğğğğğğğğyğrğkğdğ]ğVğOğHğAğ:ğ3ğ,ğ%ğğğğ ğğßßßßßßßßßßßßßßßßßß}ßvßoßhßaßZßSßLßEß>ß7ß0ß)ß"ßßß ßߟŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸzŸsŸlŸeŸ^ŸWŸPŸIŸBŸ;Ÿ4Ÿ-Ÿ&ŸŸŸŸ ŸŸ~wpib[TMF?81*#{tmf_XQJC<5.'  ￟迟῟ڿӿ̿ſxqjc\UNG@92+$쾟徟޾׾оɾ¾|ung`YRKD=6/(! 齟⽟۽Խͽƽyrkd]VOHA:3,% 漟߼ؼѼʼü}vohaZSLE>70)" 껟㻟ܻջλǻzsle^WPIB;4-& 纟ຟٺҺ˺ĺ~wpib[TMF?81*#빟也ݹֹϹȹ{tmf_XQJC<5.'  ︟踟ḟڸӸ̸Ÿxqjc\UNG@92+$췟巟޷׷зɷ·|ung`YRKD=6/(! 鶟⶟۶ԶͶƶyrkd]VOHA:3,% 浟ߵصѵʵõ}vohaZSLE>70)" 괟㴟ܴմδǴzsle^WPIB;4-& 糟೟ٳҳ˳ij~wpib[TMF?81*#벟䲟ݲֲϲȲ{tmf_XQJC<5.'  ﱟ豟ᱟڱӱ̱űxqjc\UNG@92+$찟尟ްװаɰ°|ung`YRKD=6/(! 鯟⯟ۯԯͯƯyrkd]VOHA:3,% 殟߮خѮʮî}vohaZSLE>70)" ꭟ㭟ܭխέǭzsle^WPIB;4-& 笟ଟ٬ҬˬĬ~wpib[TMF?81*#뫟䫟ݫ֫ϫȫ{tmf_XQJC<5.'  犯誟᪟ڪӪ̪Ūxqjc\UNG@92+$쩟婟ީשЩɩ©|ung`YRKD=6/(! 騟⨟ۨԨͨƨyrkd]VOHA:3,% 槟ߧاѧʧç}vohaZSLE>70)" ꦟ㦟ܦզΦǦzsle^WPIB;4-& 祟य़٥ҥ˥ĥ~wpib[TMF?81*#뤟䤟ݤ֤ϤȤ{tmf_XQJC<5.'  裟ᣟڣӣ̣ţxqjc\UNG@92+$좟墟ޢעТɢ¢|ung`YRKD=6/(! 顟⡟ۡԡ͡ơyrkd]VOHA:3,% 栟ߠؠѠʠà}vohaZSLE>70)" ꟟㟟ܟ՟Οǟzsle^WPIB;4-& 瞟ٞҞ˞Ğ~wpib[TMF?81*#띟䝟ݝ֝ϝȝ{tmf_XQJC<5.'  蜟ᜟڜӜ̜Ŝxqjc\UNG@92+$웟囟ޛכЛɛ›|ung`YRKD=6/(! 隟⚟ۚԚ͚ƚyrkd]VOHA:3,% 홟晟ߙؙљʙÙ}vohaZSLE>70)" ꘟ㘟ܘ՘Θǘzsle^WPIB;4-& 痟ٗҗ˗ė~wpib[TMF?81*#떟䖟ݖ֖ϖȖ{tmf_XQJC<5.'  蕟ᕟڕӕ̕ŕxqjc\UNG@92+$씟唟ޔהДɔ”|ung`YRKD=6/(! 铟ⓟۓԓ͓Ɠyrkd]VOHA:3,% 풟撟ߒؒђʒÒ}vohaZSLE>70)" ꑟ㑟ܑՑΑǑzsle^WPIB;4-& 琟ِҐːĐ~wpib[TMF?81*#돟䏟ݏ֏Ϗȏ{tmf_XQJC<5.'  莟᎟ڎӎ̎Ŏxqjc\UNG@92+$썟卟ލ׍Ѝɍ|ung`YRKD=6/(! 錟⌟یԌ͌ƌyrkd]VOHA:3,% 틟拟ߋ؋ыʋË}vohaZSLE>70)" ꊟ㊟܊ՊΊNJzsle^WPIB;4-& 牟ى҉ˉĉ~wpib[TMF?81*#눟䈟݈ֈψȈ{tmf_XQJC<5.'  臟ᇟڇӇ̇Ňxqjc\UNG@92+$솟冟ކ׆ІɆ†|ung`YRKD=6/(! 酟⅟ۅԅͅƅyrkd]VOHA:3,% 턟感߄؄фʄÄ}vohaZSLE>70)" ꃟミ܃Ճ΃ǃzsle^WPIB;4-& 炟ق҂˂Ă~wpib[TMF?81*#끟䁟݁ցρȁ{tmf_XQJC<5.'  耟ဟڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ߞߞߞߞߞߞߞߞߞߞߞߞߞߞߞߞߞߞߞxߞqߞjߞcߞ\ߞUߞNߞGߞ@ߞ9ߞ2ߞ+ߞ$ߞߞߞߞߞߞޞޞޞޞޞޞޞޞޞޞޞޞޞޞޞޞޞޞ|ޞuޞnޞgޞ`ޞYޞRޞKޞDޞ=ޞ6ޞ/ޞ(ޞ!ޞޞޞ ޞޞݞݞݞݞݞݞݞݞݞݞݞݞݞݞݞݞݞݞݞyݞrݞkݞdݞ]ݞVݞOݞHݞAݞ:ݞ3ݞ,ݞ%ݞݞݞݞ ݞݞܞܞܞܞܞܞܞܞܞܞܞܞܞܞܞܞܞܞ}ܞvܞoܞhܞaܞZܞSܞLܞEܞ>ܞ7ܞ0ܞ)ܞ"ܞܞܞ ܞܞ۞۞۞۞۞۞۞۞۞۞۞۞۞۞۞۞۞۞۞z۞s۞l۞e۞^۞W۞P۞I۞B۞;۞4۞-۞&۞۞۞۞ ۞۞ڞڞڞڞڞڞڞڞڞڞڞڞڞڞڞڞڞڞ~ڞwڞpڞiڞbڞ[ڞTڞMڞFڞ?ڞ8ڞ1ڞ*ڞ#ڞڞڞڞڞڞٞٞٞٞٞٞٞٞٞٞٞٞٞٞٞٞٞٞ{ٞtٞmٞfٞ_ٞXٞQٞJٞCٞ<ٞ5ٞ.ٞ'ٞ ٞٞٞ ٞٞ؞؞؞؞؞؞؞؞؞؞؞؞؞؞؞؞؞؞؞x؞q؞j؞c؞\؞U؞N؞G؞@؞9؞2؞+؞$؞؞؞؞؞؞ממממממממממממממממממ|מuמnמgמ`מYמRמKמDמ=מ6מ/מ(מ!מממ ממ֞֞֞֞֞֞֞֞֞֞֞֞֞֞֞֞֞֞֞y֞r֞k֞d֞]֞V֞O֞H֞A֞:֞3֞,֞%֞֞֞֞ ֞֞՞՞՞՞՞՞՞՞՞՞՞՞՞՞՞՞՞՞}՞v՞o՞h՞a՞Z՞S՞L՞E՞>՞7՞0՞)՞"՞՞՞ ՞՞ԞԞԞԞԞԞԞԞԞԞԞԞԞԞԞԞԞԞԞzԞsԞlԞeԞ^ԞWԞPԞIԞBԞ;Ԟ4Ԟ-Ԟ&ԞԞԞԞ ԞԞӞӞӞӞӞӞӞӞӞӞӞӞӞӞӞӞӞӞ~ӞwӞpӞiӞbӞ[ӞTӞMӞFӞ?Ӟ8Ӟ1Ӟ*Ӟ#ӞӞӞӞӞӞҞҞҞҞҞҞҞҞҞҞҞҞҞҞҞҞҞҞ{ҞtҞmҞfҞ_ҞXҞQҞJҞCҞ<Ҟ5Ҟ.Ҟ'Ҟ ҞҞҞ ҞҞўўўўўўўўўўўўўўўўўўўxўqўjўcў\ўUўNўGў@ў9ў2ў+ў$ўўўўўўОООООООООООООООООО|ОuОnОgО`ОYОRОKОDО=О6О/О(О!ООО ООϞϞϞϞϞϞϞϞϞϞϞϞϞϞϞϞϞϞϞyϞrϞkϞdϞ]ϞVϞOϞHϞAϞ:Ϟ3Ϟ,Ϟ%ϞϞϞϞ ϞϞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ}ΞvΞoΞhΞaΞZΞSΞLΞEΞ>Ξ7Ξ0Ξ)Ξ"ΞΞΞ ΞΞ͞͞͞͞͞͞͞͞͞͞͞͞͞͞͞͞͞͞͞z͞s͞l͞e͞^͞W͞P͞I͞B͞;͞4͞-͞&͞͞͞͞ ̞̞̞̞̞̞̞̞̞̞̞̞̞̞̞̞̞̞͞͞~̞w̞p̞i̞b̞[̞T̞M̞F̞?̞8̞1̞*̞#̞̞̞̞̞̞˞˞˞˞˞˞˞˞˞˞˞˞˞˞˞˞˞˞{˞t˞m˞f˞_˞X˞Q˞J˞C˞<˞5˞.˞'˞ ˞˞˞ ˞˞ʞʞʞʞʞʞʞʞʞʞʞʞʞʞʞʞʞʞʞxʞqʞjʞcʞ\ʞUʞNʞGʞ@ʞ9ʞ2ʞ+ʞ$ʞʞʞʞʞʞɞɞɞɞɞɞɞɞɞɞɞɞɞɞɞɞɞɞ|ɞuɞnɞgɞ`ɞYɞRɞKɞDɞ=ɞ6ɞ/ɞ(ɞ!ɞɞɞ ɞɞȞȞȞȞȞȞȞȞȞȞȞȞȞȞȞȞȞȞȞyȞrȞkȞdȞ]ȞVȞOȞHȞAȞ:Ȟ3Ȟ,Ȟ%ȞȞȞȞ ȞȞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞ}ǞvǞoǞhǞaǞZǞSǞLǞEǞ>Ǟ7Ǟ0Ǟ)Ǟ"ǞǞǞ ǞǞƞƞƞƞƞƞƞƞƞƞƞƞƞƞƞƞƞƞƞzƞsƞlƞeƞ^ƞWƞPƞIƞBƞ;ƞ4ƞ-ƞ&ƞƞƞƞ ƞƞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ~ŞwŞpŞiŞbŞ[ŞTŞMŞFŞ?Ş8Ş1Ş*Ş#ŞŞŞŞŞŞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞ{ĞtĞmĞfĞ_ĞXĞQĞJĞCĞ<Ğ5Ğ.Ğ'Ğ ĞĞĞ ĞĞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞxÞqÞjÞcÞ\ÞUÞNÞGÞ@Þ9Þ2Þ+Þ$ÞÞÞÞÞÞžžžžžžžžžžžžžžžžžž|žužnžgž`žYžRžKžDž=ž6ž/ž(ž!žžž žžyrkd]VOHA:3,% }vohaZSLE>70)" 꿞㿞ܿտοǿzsle^WPIB;4-& 羞ྞپҾ˾ľ~wpib[TMF?81*#뽞佞ݽֽϽȽ{tmf_XQJC<5.'  >輞἞ڼӼ̼żxqjc\UNG@92+$컞廞޻׻лɻ»|ung`YRKD=6/(! 麞⺞ۺԺͺƺyrkd]VOHA:3,% 湞߹عѹʹù}vohaZSLE>70)" 긞㸞ܸոθǸzsle^WPIB;4-& 緞ෞٷҷ˷ķ~wpib[TMF?81*#붞䶞ݶֶ϶ȶ{tmf_XQJC<5.'  ﵞ赞ᵞڵӵ̵ŵxqjc\UNG@92+$촞崞޴״дɴ´|ung`YRKD=6/(! 鳞Ⳟ۳ԳͳƳyrkd]VOHA:3,% 沞߲زѲʲò}vohaZSLE>70)" 걞㱞ܱձαDZzsle^WPIB;4-& 簞ఞٰҰ˰İ~wpib[TMF?81*#믞䯞ݯ֯ϯȯ{tmf_XQJC<5.'  ﮞ讞ᮞڮӮ̮Ůxqjc\UNG@92+$쭞孞ޭ׭Эɭ­|ung`YRKD=6/(! 鬞⬞۬ԬͬƬyrkd]VOHA:3,% 櫞߫ثѫʫë}vohaZSLE>70)" ꪞ㪞ܪժΪǪzsle^WPIB;4-& 穞ਫ਼٩ҩ˩ĩ~wpib[TMF?81*#먞䨞ݨ֨ϨȨ{tmf_XQJC<5.'  吏觞᧞ڧӧ̧ŧxqjc\UNG@92+$즞妞ަצЦɦ¦|ung`YRKD=6/(! 饞⥞ۥԥͥƥyrkd]VOHA:3,% 椞ߤؤѤʤä}vohaZSLE>70)" ꣞㣞ܣգΣǣzsle^WPIB;4-& 碞࢞٢ҢˢĢ~wpib[TMF?81*#롞䡞ݡ֡ϡȡ{tmf_XQJC<5.'  蠞᠞ڠӠ̠Šxqjc\UNG@92+$쟞埞ޟןПɟŸ|ung`YRKD=6/(! 鞞➞۞Ԟ͞ƞyrkd]VOHA:3,% 흞杞ߝ؝ѝʝÝ}vohaZSLE>70)" ꜞ㜞ܜ՜Μǜzsle^WPIB;4-& 盞ٛқ˛ě~wpib[TMF?81*#뚞䚞ݚ֚ϚȚ{tmf_XQJC<5.'  虞ᙞڙә̙řxqjc\UNG@92+$옞嘞ޘטИɘ˜|ung`YRKD=6/(! 闞◞ۗԗ͗Ɨyrkd]VOHA:3,% 햞斞ߖؖіʖÖ}vohaZSLE>70)" ꕞ㕞ܕՕΕǕzsle^WPIB;4-& 甞ٔҔ˔Ĕ~wpib[TMF?81*#듞䓞ݓ֓ϓȓ{tmf_XQJC<5.'  蒞ᒞڒӒ̒Œxqjc\UNG@92+$쑞呞ޑבБɑ‘|ung`YRKD=6/(! 鐞␞ېԐ͐Ɛyrkd]VOHA:3,% 폞揞ߏ؏яʏÏ}vohaZSLE>70)" ꎞ㎞܎ՎΎǎzsle^WPIB;4-& 獞ٍҍˍč~wpib[TMF?81*#댞䌞݌֌όȌ{tmf_XQJC<5.'  苞ዞڋӋ̋ŋxqjc\UNG@92+$슞办ފ׊ЊɊŠ|ung`YRKD=6/(! 鉞≞ۉԉ͉Ɖyrkd]VOHA:3,% 툞戞߈؈шʈÈ}vohaZSLE>70)" ꇞ㇞܇Շ·LJzsle^WPIB;4-& 熞ن҆ˆĆ~wpib[TMF?81*#녞䅞݅օυȅ{tmf_XQJC<5.'  脞ᄞڄӄ̄ńxqjc\UNG@92+$샞僞ރ׃ЃɃƒ|ung`YRKD=6/(! 邞₞ۂԂ͂Ƃyrkd]VOHA:3,% 큞恞߁؁сʁÁ}vohaZSLE>70)" ꀞ〞܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ߝߝߝߝߝߝߝߝߝߝߝߝߝߝߝߝߝߝߝzߝsߝlߝeߝ^ߝWߝPߝIߝBߝ;ߝ4ߝ-ߝ&ߝߝߝߝ ߝߝޝޝޝޝޝޝޝޝޝޝޝޝޝޝޝޝޝޝ~ޝwޝpޝiޝbޝ[ޝTޝMޝFޝ?ޝ8ޝ1ޝ*ޝ#ޝޝޝޝޝޝݝݝݝݝݝݝݝݝݝݝݝݝݝݝݝݝݝݝ{ݝtݝmݝfݝ_ݝXݝQݝJݝCݝ<ݝ5ݝ.ݝ'ݝ ݝݝݝ ݝݝܝܝܝܝܝܝܝܝܝܝܝܝܝܝܝܝܝܝܝxܝqܝjܝcܝ\ܝUܝNܝGܝ@ܝ9ܝ2ܝ+ܝ$ܝܝܝܝܝܝ۝۝۝۝۝۝۝۝۝۝۝۝۝۝۝۝۝۝|۝u۝n۝g۝`۝Y۝R۝K۝D۝=۝6۝/۝(۝!۝۝۝ ۝۝ڝڝڝڝڝڝڝڝڝڝڝڝڝڝڝڝڝڝڝyڝrڝkڝdڝ]ڝVڝOڝHڝAڝ:ڝ3ڝ,ڝ%ڝڝڝڝ ڝڝٝٝٝٝٝٝٝٝٝٝٝٝٝٝٝٝٝٝ}ٝvٝoٝhٝaٝZٝSٝLٝEٝ>ٝ7ٝ0ٝ)ٝ"ٝٝٝ ٝٝ؝؝؝؝؝؝؝؝؝؝؝؝؝؝؝؝؝؝؝z؝s؝l؝e؝^؝W؝P؝I؝B؝;؝4؝-؝&؝؝؝؝ ؝؝םםםםםםםםםםםםםםםםםם~םwםpםiםbם[םTםMםFם?ם8ם1ם*ם#םםםםםם֝֝֝֝֝֝֝֝֝֝֝֝֝֝֝֝֝֝{֝t֝m֝f֝_֝X֝Q֝J֝C֝<֝5֝.֝'֝ ֝֝֝ ֝֝՝՝՝՝՝՝՝՝՝՝՝՝՝՝՝՝՝՝՝x՝q՝j՝c՝\՝U՝N՝G՝@՝9՝2՝+՝$՝՝՝՝՝՝ԝԝԝԝԝԝԝԝԝԝԝԝԝԝԝԝԝԝ|ԝuԝnԝgԝ`ԝYԝRԝKԝDԝ=ԝ6ԝ/ԝ(ԝ!ԝԝԝ ԝԝӝӝӝӝӝӝӝӝӝӝӝӝӝӝӝӝӝӝӝyӝrӝkӝdӝ]ӝVӝOӝHӝAӝ:ӝ3ӝ,ӝ%ӝӝӝӝ ӝӝҝҝҝҝҝҝҝҝҝҝҝҝҝҝҝҝҝҝ}ҝvҝoҝhҝaҝZҝSҝLҝEҝ>ҝ7ҝ0ҝ)ҝ"ҝҝҝ ҝҝѝѝѝѝѝѝѝѝѝѝѝѝѝѝѝѝѝѝѝzѝsѝlѝeѝ^ѝWѝPѝIѝBѝ;ѝ4ѝ-ѝ&ѝѝѝѝ ѝѝНННННННННННННННННН~НwНpНiНbН[НTНMНFН?Н8Н1Н*Н#ННННННϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝϝ{ϝtϝmϝfϝ_ϝXϝQϝJϝCϝ<ϝ5ϝ.ϝ'ϝ ϝϝϝ ϝϝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝxΝqΝjΝcΝ\ΝUΝNΝGΝ@Ν9Ν2Ν+Ν$ΝΝΝΝΝΝ͝͝͝͝͝͝͝͝͝͝͝͝͝͝͝͝͝͝|͝u͝n͝g͝`͝Y͝R͝K͝D͝=͝6͝/͝(͝!͝͝͝ ̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝͝͝y̝r̝k̝d̝]̝V̝O̝H̝A̝:̝3̝,̝%̝̝̝̝ ̝̝˝˝˝˝˝˝˝˝˝˝˝˝˝˝˝˝˝˝}˝v˝o˝h˝a˝Z˝S˝L˝E˝>˝7˝0˝)˝"˝˝˝ ˝˝ʝʝʝʝʝʝʝʝʝʝʝʝʝʝʝʝʝʝʝzʝsʝlʝeʝ^ʝWʝPʝIʝBʝ;ʝ4ʝ-ʝ&ʝʝʝʝ ʝʝɝɝɝɝɝɝɝɝɝɝɝɝɝɝɝɝɝɝ~ɝwɝpɝiɝbɝ[ɝTɝMɝFɝ?ɝ8ɝ1ɝ*ɝ#ɝɝɝɝɝɝȝȝȝȝȝȝȝȝȝȝȝȝȝȝȝȝȝȝ{ȝtȝmȝfȝ_ȝXȝQȝJȝCȝ<ȝ5ȝ.ȝ'ȝ ȝȝȝ ȝȝǝǝǝǝǝǝǝǝǝǝǝǝǝǝǝǝǝǝǝxǝqǝjǝcǝ\ǝUǝNǝGǝ@ǝ9ǝ2ǝ+ǝ$ǝǝǝǝǝǝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝ|ƝuƝnƝgƝ`ƝYƝRƝKƝDƝ=Ɲ6Ɲ/Ɲ(Ɲ!ƝƝƝ ƝƝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝyŝrŝkŝdŝ]ŝVŝOŝHŝAŝ:ŝ3ŝ,ŝ%ŝŝŝŝ ŝŝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝ}ĝvĝoĝhĝaĝZĝSĝLĝEĝ>ĝ7ĝ0ĝ)ĝ"ĝĝĝ ĝĝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ Ýݝ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$쿝忝޿׿пɿ¿|ung`YRKD=6/(! 龝⾝۾Ծ;ƾyrkd]VOHA:3,% 潝߽ؽѽʽý}vohaZSLE>70)" 꼝㼝ܼռμǼzsle^WPIB;4-& 绝ໝٻһ˻Ļ~wpib[TMF?81*#뺝亝ݺֺϺȺ{tmf_XQJC<5.'  ﹝蹝ṝڹӹ̹Źxqjc\UNG@92+$츝帝޸׸иɸ¸|ung`YRKD=6/(! 鷝ⷝ۷ԷͷƷyrkd]VOHA:3,% 涝߶ضѶʶö}vohaZSLE>70)" 굝㵝ܵյεǵzsle^WPIB;4-& 紝ഝٴҴ˴Ĵ~wpib[TMF?81*#볝䳝ݳֳϳȳ{tmf_XQJC<5.'  ﲝ貝ᲝڲӲ̲Ųxqjc\UNG@92+$챝屝ޱױбɱ±|ung`YRKD=6/(! 鰝Ⱍ۰԰Ͱưyrkd]VOHA:3,% 毝߯دѯʯï}vohaZSLE>70)" ꮝ㮝ܮծήǮzsle^WPIB;4-& 筝ଢ଼٭ҭ˭ĭ~wpib[TMF?81*#묝䬝ݬ֬ϬȬ{tmf_XQJC<5.'  﫝諝᫝ګӫ̫ūxqjc\UNG@92+$쪝媝ުתЪɪª|ung`YRKD=6/(! 驝⩝۩ԩͩƩyrkd]VOHA:3,% 樝ߨبѨʨè}vohaZSLE>70)" ꧝㧝ܧէΧǧzsle^WPIB;4-& 禝ঝ٦Ҧ˦Ħ~wpib[TMF?81*#륝䥝ݥ֥ϥȥ{tmf_XQJC<5.'  欄褝ᤝڤӤ̤Ťxqjc\UNG@92+$죝壝ޣףУɣ£|ung`YRKD=6/(! 额⢝ۢԢ͢Ƣyrkd]VOHA:3,% 桝ߡءѡʡá}vohaZSLE>70)" ꠝ㠝ܠՠΠǠzsle^WPIB;4-& 矝ٟҟ˟ğ~wpib[TMF?81*#랝䞝ݞ֞ϞȞ{tmf_XQJC<5.'  蝝᝝ڝӝ̝ŝxqjc\UNG@92+$윝圝ޜלМɜœ|ung`YRKD=6/(! 雝⛝ۛԛ͛ƛyrkd]VOHA:3,% 횝暝ߚؚњʚÚ}vohaZSLE>70)" ꙝ㙝ܙՙΙǙzsle^WPIB;4-& 瘝٘Ҙ˘Ę~wpib[TMF?81*#뗝䗝ݗ֗ϗȗ{tmf_XQJC<5.'  薝ᖝږӖ̖Ŗxqjc\UNG@92+$앝啝ޕוЕɕ•|ung`YRKD=6/(! 锝┝۔Ԕ͔Ɣyrkd]VOHA:3,% 퓝擝ߓؓѓʓÓ}vohaZSLE>70)" ꒝㒝ܒՒΒǒzsle^WPIB;4-& 瑝ّґˑđ~wpib[TMF?81*#됝䐝ݐ֐ϐȐ{tmf_XQJC<5.'  菝Ꮭڏӏ̏ŏxqjc\UNG@92+$쎝厝ގ׎ЎɎŽ|ung`YRKD=6/(! 鍝⍝ۍԍ͍ƍyrkd]VOHA:3,% 팝挝ߌ،ьʌÌ}vohaZSLE>70)" ꋝ㋝܋Ջ΋Njzsle^WPIB;4-& 犝يҊˊĊ~wpib[TMF?81*#뉝䉝݉։ωȉ{tmf_XQJC<5.'  舝ምڈӈ̈ňxqjc\UNG@92+$쇝凝އׇЇɇ‡|ung`YRKD=6/(! 醝↝ۆԆ͆Ɔyrkd]VOHA:3,% 텝慝߅؅хʅÅ}vohaZSLE>70)" ꄝㄝ܄Մ΄DŽzsle^WPIB;4-& 烝ك҃˃ă~wpib[TMF?81*#낝䂝݂ւςȂ{tmf_XQJC<5.'  聝ၝځӁ́Łxqjc\UNG@92+$쀝倝ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$ߜߜߜߜߜߜߜߜߜߜߜߜߜߜߜߜߜߜ|ߜuߜnߜgߜ`ߜYߜRߜKߜDߜ=ߜ6ߜ/ߜ(ߜ!ߜߜߜ ߜߜޜޜޜޜޜޜޜޜޜޜޜޜޜޜޜޜޜޜޜyޜrޜkޜdޜ]ޜVޜOޜHޜAޜ:ޜ3ޜ,ޜ%ޜޜޜޜ ޜޜݜݜݜݜݜݜݜݜݜݜݜݜݜݜݜݜݜݜ}ݜvݜoݜhݜaݜZݜSݜLݜEݜ>ݜ7ݜ0ݜ)ݜ"ݜݜݜ ݜݜܜܜܜܜܜܜܜܜܜܜܜܜܜܜܜܜܜܜܜzܜsܜlܜeܜ^ܜWܜPܜIܜBܜ;ܜ4ܜ-ܜ&ܜܜܜܜ ܜܜۜۜۜۜۜۜۜۜۜۜۜۜۜۜۜۜۜۜ~ۜwۜpۜiۜbۜ[ۜTۜMۜFۜ?ۜ8ۜ1ۜ*ۜ#ۜۜۜۜۜۜڜڜڜڜڜڜڜڜڜڜڜڜڜڜڜڜڜڜ{ڜtڜmڜfڜ_ڜXڜQڜJڜCڜ<ڜ5ڜ.ڜ'ڜ ڜڜڜ ڜڜٜٜٜٜٜٜٜٜٜٜٜٜٜٜٜٜٜٜٜxٜqٜjٜcٜ\ٜUٜNٜGٜ@ٜ9ٜ2ٜ+ٜ$ٜٜٜٜٜٜ؜؜؜؜؜؜؜؜؜؜؜؜؜؜؜؜؜؜|؜u؜n؜g؜`؜Y؜R؜K؜D؜=؜6؜/؜(؜!؜؜؜ ؜؜לללללללללללללללללללyלrלkלdל]לVלOלHלAל:ל3ל,ל%לללל לל֜֜֜֜֜֜֜֜֜֜֜֜֜֜֜֜֜֜}֜v֜o֜h֜a֜Z֜S֜L֜E֜>֜7֜0֜)֜"֜֜֜ ֜֜՜՜՜՜՜՜՜՜՜՜՜՜՜՜՜՜՜՜՜z՜s՜l՜e՜^՜W՜P՜I՜B՜;՜4՜-՜&՜՜՜՜ ՜՜ԜԜԜԜԜԜԜԜԜԜԜԜԜԜԜԜԜԜ~ԜwԜpԜiԜbԜ[ԜTԜMԜFԜ?Ԝ8Ԝ1Ԝ*Ԝ#ԜԜԜԜԜԜӜӜӜӜӜӜӜӜӜӜӜӜӜӜӜӜӜӜ{ӜtӜmӜfӜ_ӜXӜQӜJӜCӜ<Ӝ5Ӝ.Ӝ'Ӝ ӜӜӜ ӜӜҜҜҜҜҜҜҜҜҜҜҜҜҜҜҜҜҜҜҜxҜqҜjҜcҜ\ҜUҜNҜGҜ@Ҝ9Ҝ2Ҝ+Ҝ$ҜҜҜҜҜҜќќќќќќќќќќќќќќќќќќ|ќuќnќgќ`ќYќRќKќDќ=ќ6ќ/ќ(ќ!ќќќ ќќМММММММММММММММММММyМrМkМdМ]МVМOМHМAМ:М3М,М%ММММ ММϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜϜ}ϜvϜoϜhϜaϜZϜSϜLϜEϜ>Ϝ7Ϝ0Ϝ)Ϝ"ϜϜϜ ϜϜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜzΜsΜlΜeΜ^ΜWΜPΜIΜBΜ;Μ4Μ-Μ&ΜΜΜΜ ΜΜ͜͜͜͜͜͜͜͜͜͜͜͜͜͜͜͜͜͜~͜w͜p͜i͜b͜[͜T͜M͜F͜?͜8͜1͜*͜#̜̜̜̜̜̜̜̜̜̜̜̜̜̜̜̜̜̜͜͜͜͜͜͜{̜t̜m̜f̜_̜X̜Q̜J̜C̜<̜5̜.̜'̜ ̜̜̜ ̜̜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜x˜q˜j˜c˜\˜U˜N˜G˜@˜9˜2˜+˜$˜˜˜˜˜˜ʜʜʜʜʜʜʜʜʜʜʜʜʜʜʜʜʜʜ|ʜuʜnʜgʜ`ʜYʜRʜKʜDʜ=ʜ6ʜ/ʜ(ʜ!ʜʜʜ ʜʜɜɜɜɜɜɜɜɜɜɜɜɜɜɜɜɜɜɜɜyɜrɜkɜdɜ]ɜVɜOɜHɜAɜ:ɜ3ɜ,ɜ%ɜɜɜɜ ɜɜȜȜȜȜȜȜȜȜȜȜȜȜȜȜȜȜȜȜ}ȜvȜoȜhȜaȜZȜSȜLȜEȜ>Ȝ7Ȝ0Ȝ)Ȝ"ȜȜȜ ȜȜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜzǜsǜlǜeǜ^ǜWǜPǜIǜBǜ;ǜ4ǜ-ǜ&ǜǜǜǜ ǜǜƜƜƜƜƜƜƜƜƜƜƜƜƜƜƜƜƜƜ~ƜwƜpƜiƜbƜ[ƜTƜMƜFƜ?Ɯ8Ɯ1Ɯ*Ɯ#ƜƜƜƜƜƜŜŜŜŜŜŜŜŜŜŜŜŜŜŜŜŜŜŜ{ŜtŜmŜfŜ_ŜXŜQŜJŜCŜ<Ŝ5Ŝ.Ŝ'Ŝ ŜŜŜ ŜŜĜĜĜĜĜĜĜĜĜĜĜĜĜĜĜĜĜĜĜxĜqĜjĜcĜ\ĜUĜNĜGĜ@Ĝ9Ĝ2Ĝ+Ĝ$ĜĜĜĜĜĜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜœœœœœœœœœœœœœœœœœœœyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœ}vohaZSLE>70)" zsle^WPIB;4-& 翜࿜ٿҿ˿Ŀ~wpib[TMF?81*#뾜侜ݾ־ϾȾ{tmf_XQJC<5.'  |轜὜ڽӽ̽Žxqjc\UNG@92+$켜弜޼׼мɼ¼|ung`YRKD=6/(! 黜⻜ۻԻͻƻyrkd]VOHA:3,% 溜ߺغѺʺú}vohaZSLE>70)" 깜㹜ܹչιǹzsle^WPIB;4-& 縜ผٸҸ˸ĸ~wpib[TMF?81*#뷜䷜ݷַϷȷ{tmf_XQJC<5.'  ﶜ趜ᶜڶӶ̶Ŷxqjc\UNG@92+$최嵜޵׵еɵµ|ung`YRKD=6/(! 鴜ⴜ۴Դʹƴyrkd]VOHA:3,% 泜߳سѳʳó}vohaZSLE>70)" 겜㲜ܲղβDzzsle^WPIB;4-& 籜౜ٱұ˱ı~wpib[TMF?81*#발䰜ݰְϰȰ{tmf_XQJC<5.'  ﯜ诜ᯜگӯ̯ůxqjc\UNG@92+$쮜宜ޮ׮Юɮ®|ung`YRKD=6/(! 魜⭜ۭԭͭƭyrkd]VOHA:3,% 欜߬جѬʬì}vohaZSLE>70)" ꫜ㫜ܫիΫǫzsle^WPIB;4-& 窜જ٪Ҫ˪Ī~wpib[TMF?81*#멜䩜ݩ֩ϩȩ{tmf_XQJC<5.'  靖訜᨜ڨӨ̨Ũxqjc\UNG@92+$짜姜ާקЧɧ§|ung`YRKD=6/(! 馜⦜ۦԦͦƦyrkd]VOHA:3,% 楜ߥإѥʥå}vohaZSLE>70)" ꤜ㤜ܤդΤǤzsle^WPIB;4-& 磜ࣜ٣ңˣģ~wpib[TMF?81*#뢜䢜ݢ֢ϢȢ{tmf_XQJC<5.'  衜ᡜڡӡ̡šxqjc\UNG@92+$제堜ޠנРɠ |ung`YRKD=6/(! 韜⟜۟ԟ͟Ɵyrkd]VOHA:3,% 힜果ߞ؞ўʞÞ}vohaZSLE>70)" Ꝝ㝜ܝ՝Νǝzsle^WPIB;4-& 眜ٜҜ˜Ĝ~wpib[TMF?81*#뛜䛜ݛ֛ϛț{tmf_XQJC<5.'  蚜᚜ښӚ̚Śxqjc\UNG@92+$왜噜ޙיЙə™|ung`YRKD=6/(! 阜☜ۘԘ͘Ƙyrkd]VOHA:3,% 헜旜ߗؗїʗ×}vohaZSLE>70)" ꖜ㖜ܖՖΖǖzsle^WPIB;4-& 畜ٕҕ˕ĕ~wpib[TMF?81*#딜䔜ݔ֔ϔȔ{tmf_XQJC<5.'  蓜ᓜړӓ̓œxqjc\UNG@92+$쒜咜ޒגВɒ’|ung`YRKD=6/(! 鑜⑜ۑԑ͑Ƒyrkd]VOHA:3,% 퐜搜ߐؐѐʐÐ}vohaZSLE>70)" ꏜ㏜܏ՏΏǏzsle^WPIB;4-& 玜َҎˎĎ~wpib[TMF?81*#덜䍜ݍ֍ύȍ{tmf_XQJC<5.'  茜ጜڌӌ̌Ōxqjc\UNG@92+$시勜ދ׋Ћɋ‹|ung`YRKD=6/(! 銜⊜ۊԊ͊Ɗyrkd]VOHA:3,% 퉜扜߉؉щʉÉ}vohaZSLE>70)" ꈜ㈜܈ՈΈLjzsle^WPIB;4-& 燜ه҇ˇć~wpib[TMF?81*#놜䆜݆ֆφȆ{tmf_XQJC<5.'  腜ᅜڅӅ̅Ņxqjc\UNG@92+$서儜ބׄЄɄ„|ung`YRKD=6/(! 郜⃜ۃԃ̓ƃyrkd]VOHA:3,% 킜悜߂؂тʂÂ}vohaZSLE>70)" ꁜぜ܁Ձ΁ǁzsle^WPIB;4-& 瀜ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ߛߛߛߛߛߛߛߛߛߛߛߛߛߛߛߛߛߛ~ߛwߛpߛiߛbߛ[ߛTߛMߛFߛ?ߛ8ߛ1ߛ*ߛ#ߛߛߛߛߛߛޛޛޛޛޛޛޛޛޛޛޛޛޛޛޛޛޛޛ{ޛtޛmޛfޛ_ޛXޛQޛJޛCޛ<ޛ5ޛ.ޛ'ޛ ޛޛޛ ޛޛݛݛݛݛݛݛݛݛݛݛݛݛݛݛݛݛݛݛݛxݛqݛjݛcݛ\ݛUݛNݛGݛ@ݛ9ݛ2ݛ+ݛ$ݛݛݛݛݛݛܛܛܛܛܛܛܛܛܛܛܛܛܛܛܛܛܛܛ|ܛuܛnܛgܛ`ܛYܛRܛKܛDܛ=ܛ6ܛ/ܛ(ܛ!ܛܛܛ ܛܛۛۛۛۛۛۛۛۛۛۛۛۛۛۛۛۛۛۛۛyۛrۛkۛdۛ]ۛVۛOۛHۛAۛ:ۛ3ۛ,ۛ%ۛۛۛۛ ۛۛڛڛڛڛڛڛڛڛڛڛڛڛڛڛڛڛڛڛ}ڛvڛoڛhڛaڛZڛSڛLڛEڛ>ڛ7ڛ0ڛ)ڛ"ڛڛڛ ڛڛٛٛٛٛٛٛٛٛٛٛٛٛٛٛٛٛٛٛٛzٛsٛlٛeٛ^ٛWٛPٛIٛBٛ;ٛ4ٛ-ٛ&ٛٛٛٛ ٛٛ؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛؛~؛w؛p؛i؛b؛[؛T؛M؛F؛?؛8؛1؛*؛#؛؛؛؛؛؛ככככככככככככככככככ{כtכmכfכ_כXכQכJכCכ<כ5כ.כ'כ כככ ככ֛֛֛֛֛֛֛֛֛֛֛֛֛֛֛֛֛֛֛x֛q֛j֛c֛\֛U֛N֛G֛@֛9֛2֛+֛$֛֛֛֛֛֛՛՛՛՛՛՛՛՛՛՛՛՛՛՛՛՛՛՛|՛u՛n՛g՛`՛Y՛R՛K՛D՛=՛6՛/՛(՛!՛՛՛ ՛՛ԛԛԛԛԛԛԛԛԛԛԛԛԛԛԛԛԛԛԛyԛrԛkԛdԛ]ԛVԛOԛHԛAԛ:ԛ3ԛ,ԛ%ԛԛԛԛ ԛԛӛӛӛӛӛӛӛӛӛӛӛӛӛӛӛӛӛӛ}ӛvӛoӛhӛaӛZӛSӛLӛEӛ>ӛ7ӛ0ӛ)ӛ"ӛӛӛ ӛӛқққққққққққққққққққzқsқlқeқ^қWқPқIқBқ;қ4қ-қ&ққққ ққћћћћћћћћћћћћћћћћћћ~ћwћpћiћbћ[ћTћMћFћ?ћ8ћ1ћ*ћ#ћћћћћћЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛ{ЛtЛmЛfЛ_ЛXЛQЛJЛCЛ<Л5Л.Л'Л ЛЛЛ ЛЛϛϛϛϛϛϛϛϛϛϛϛϛϛϛϛϛϛϛϛxϛqϛjϛcϛ\ϛUϛNϛGϛ@ϛ9ϛ2ϛ+ϛ$ϛϛϛϛϛϛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛ|ΛuΛnΛgΛ`ΛYΛRΛKΛDΛ=Λ6Λ/Λ(Λ!ΛΛΛ ΛΛ͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛͛y͛r͛k͛d͛]͛V͛O͛H͛A͛:͛3͛,͛%͛͛͛͛ ̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛͛͛}̛v̛ơh̛a̛Z̛S̛L̛E̛>̛7̛0̛)̛"̛̛̛ ̛̛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛z˛s˛l˛e˛^˛W˛P˛I˛B˛;˛4˛-˛&˛˛˛˛ ˛˛ʛʛʛʛʛʛʛʛʛʛʛʛʛʛʛʛʛʛ~ʛwʛpʛiʛbʛ[ʛTʛMʛFʛ?ʛ8ʛ1ʛ*ʛ#ʛʛʛʛʛʛɛɛɛɛɛɛɛɛɛɛɛɛɛɛɛɛɛɛ{ɛtɛmɛfɛ_ɛXɛQɛJɛCɛ<ɛ5ɛ.ɛ'ɛ ɛɛɛ ɛɛțțțțțțțțțțțțțțțțțțțxțqțjțcț\țUțNțGț@ț9ț2ț+ț$țțțțțțǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛ|ǛuǛnǛgǛ`ǛYǛRǛKǛDǛ=Ǜ6Ǜ/Ǜ(Ǜ!ǛǛǛ ǛǛƛƛƛƛƛƛƛƛƛƛƛƛƛƛƛƛƛƛƛyƛrƛkƛdƛ]ƛVƛOƛHƛAƛ:ƛ3ƛ,ƛ%ƛƛƛƛ ƛƛśśśśśśśśśśśśśśśśśś}śvśośhśaśZśSśLśEś>ś7ś0ś)ś"śśś śśěěěěěěěěěěěěěěěěěěězěsělěeě^ěWěPěIěBě;ě4ě-ě&ěěěě ěěÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛ››››››››››››››››››{›t›m›f›_›X›Q›J›C›<›5›.›'› ››› ››xqjc\UNG@92+$|ung`YRKD=6/(! 鿛⿛ۿԿͿƿyrkd]VOHA:3,% 澛߾ؾѾʾþ}vohaZSLE>70)" 꽛㽛ܽսνǽzsle^WPIB;4-& 缛༛ټҼ˼ļ~wpib[TMF?81*#뻛仛ݻֻϻȻ{tmf_XQJC<5.'  ﺛ躛ẛںӺ̺źxqjc\UNG@92+$칛幛޹׹йɹ¹|ung`YRKD=6/(! 鸛⸛۸Ը͸Ƹyrkd]VOHA:3,% 淛߷طѷʷ÷}vohaZSLE>70)" 궛㶛ܶնζǶzsle^WPIB;4-& 絛൛ٵҵ˵ĵ~wpib[TMF?81*#봛䴛ݴִϴȴ{tmf_XQJC<5.'  ﳛ賛᳛ڳӳ̳ųxqjc\UNG@92+$첛岛޲ײвɲ²|ung`YRKD=6/(! 鱛ⱛ۱ԱͱƱyrkd]VOHA:3,% 氛߰ذѰʰð}vohaZSLE>70)" ꯛ㯛ܯկίǯzsle^WPIB;4-& 箛஛ٮҮˮĮ~wpib[TMF?81*#뭛䭛ݭ֭ϭȭ{tmf_XQJC<5.'  ﬛講ᬛڬӬ̬Ŭxqjc\UNG@92+$쫛嫛ޫ׫Ыɫ«|ung`YRKD=6/(! 骛⪛۪Ԫͪƪyrkd]VOHA:3,% 橛ߩةѩʩé}vohaZSLE>70)" ꨛ㨛ܨըΨǨzsle^WPIB;4-& 秛৛٧ҧ˧ħ~wpib[TMF?81*#릛䦛ݦ֦ϦȦ{tmf_XQJC<5.'  拏襛ᥛڥӥ̥ťxqjc\UNG@92+$줛夛ޤפФɤ¤|ung`YRKD=6/(! 飛⣛ۣԣͣƣyrkd]VOHA:3,% 梛ߢآѢʢâ}vohaZSLE>70)" ꡛ㡛ܡաΡǡzsle^WPIB;4-& 砛ࠛ٠ҠˠĠ~wpib[TMF?81*#럛䟛ݟ֟ϟȟ{tmf_XQJC<5.'  螛លڞӞ̞Şxqjc\UNG@92+$읛坛ޝםНɝ|ung`YRKD=6/(! 霛✛ۜԜ͜Ɯyrkd]VOHA:3,% 훛曛ߛ؛ћʛÛ}vohaZSLE>70)" ꚛ㚛ܚ՚Κǚzsle^WPIB;4-& 癛ٙҙ˙ę~wpib[TMF?81*#똛䘛ݘ֘ϘȘ{tmf_XQJC<5.'  藛ᗛڗӗ̗ŗxqjc\UNG@92+$얛喛ޖזЖɖ–|ung`YRKD=6/(! 镛╛ەԕ͕ƕyrkd]VOHA:3,% 픛攛ߔؔєʔÔ}vohaZSLE>70)" ꓛ㓛ܓՓΓǓzsle^WPIB;4-& 璛ْҒ˒Ē~wpib[TMF?81*#둛䑛ݑ֑ϑȑ{tmf_XQJC<5.'  萛ᐛڐӐ̐Őxqjc\UNG@92+$쏛叛ޏ׏Џɏ|ung`YRKD=6/(! 鎛⎛ێԎ͎Ǝyrkd]VOHA:3,% 퍛捛ߍ؍эʍÍ}vohaZSLE>70)" ꌛ㌛܌ՌΌnjzsle^WPIB;4-& 狛ًҋˋċ~wpib[TMF?81*#늛䊛݊֊ϊȊ{tmf_XQJC<5.'  艛ቛډӉ̉ʼnxqjc\UNG@92+$숛创ވ׈ЈɈˆ|ung`YRKD=6/(! 釛⇛ۇԇ͇Ƈyrkd]VOHA:3,% 톛憛߆؆цʆÆ}vohaZSLE>70)" ꅛㅛ܅Յ΅Džzsle^WPIB;4-& 焛ل҄˄Ą~wpib[TMF?81*#냛䃛݃փσȃ{tmf_XQJC<5.'  肛ႛڂӂ̂łxqjc\UNG@92+$쁛偛ށׁЁɁ|ung`YRKD=6/(! 逛‛ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ߚߚߚߚߚߚߚߚߚߚߚߚߚߚߚߚߚߚߚyߚrߚkߚdߚ]ߚVߚOߚHߚAߚ:ߚ3ߚ,ߚ%ߚߚߚߚ ߚߚޚޚޚޚޚޚޚޚޚޚޚޚޚޚޚޚޚޚ}ޚvޚoޚhޚaޚZޚSޚLޚEޚ>ޚ7ޚ0ޚ)ޚ"ޚޚޚ ޚޚݚݚݚݚݚݚݚݚݚݚݚݚݚݚݚݚݚݚݚzݚsݚlݚeݚ^ݚWݚPݚIݚBݚ;ݚ4ݚ-ݚ&ݚݚݚݚ ݚݚܚܚܚܚܚܚܚܚܚܚܚܚܚܚܚܚܚܚ~ܚwܚpܚiܚbܚ[ܚTܚMܚFܚ?ܚ8ܚ1ܚ*ܚ#ܚܚܚܚܚܚۚۚۚۚۚۚۚۚۚۚۚۚۚۚۚۚۚۚ{ۚtۚmۚfۚ_ۚXۚQۚJۚCۚ<ۚ5ۚ.ۚ'ۚ ۚۚۚ ۚۚښښښښښښښښښښښښښښښښښښښxښqښjښcښ\ښUښNښGښ@ښ9ښ2ښ+ښ$ښښښښښښٚٚٚٚٚٚٚٚٚٚٚٚٚٚٚٚٚٚ|ٚuٚnٚgٚ`ٚYٚRٚKٚDٚ=ٚ6ٚ/ٚ(ٚ!ٚٚٚ ؚؚؚؚؚؚؚؚؚؚؚؚؚؚؚؚؚؚؚٚٚyؚrؚkؚdؚ]ؚVؚOؚHؚAؚ:ؚ3ؚ,ؚ%ؚؚؚؚ ؚؚךךךךךךךךךךךךךךךךךך}ךvךoךhךaךZךSךLךEך>ך7ך0ך)ך"ךךך ךך֚֚֚֚֚֚֚֚֚֚֚֚֚֚֚֚֚֚֚z֚s֚l֚e֚^֚W֚P֚I֚B֚;֚4֚-֚&֚֚֚֚ ֚֚՚՚՚՚՚՚՚՚՚՚՚՚՚՚՚՚՚՚~՚w՚p՚i՚b՚[՚T՚M՚F՚?՚8՚1՚*՚#՚՚՚՚՚՚ԚԚԚԚԚԚԚԚԚԚԚԚԚԚԚԚԚԚ{ԚtԚmԚfԚ_ԚXԚQԚJԚCԚ<Ԛ5Ԛ.Ԛ'Ԛ ԚԚԚ ԚԚӚӚӚӚӚӚӚӚӚӚӚӚӚӚӚӚӚӚӚxӚqӚjӚcӚ\ӚUӚNӚGӚ@Ӛ9Ӛ2Ӛ+Ӛ$ӚӚӚӚӚӚҚҚҚҚҚҚҚҚҚҚҚҚҚҚҚҚҚҚ|ҚuҚnҚgҚ`ҚYҚRҚKҚDҚ=Қ6Қ/Қ(Қ!ҚҚҚ ҚҚњњњњњњњњњњњњњњњњњњњyњrњkњdњ]њVњOњHњAњ:њ3њ,њ%њњњњ њњКККККККККККККККККК}КvКoКhКaКZКSКLКEК>К7К0К)К"ККК ККϚϚϚϚϚϚϚϚϚϚϚϚϚϚϚϚϚϚϚzϚsϚlϚeϚ^ϚWϚPϚIϚBϚ;Ϛ4Ϛ-Ϛ&ϚϚϚϚ ϚϚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚ~ΚwΚpΚiΚbΚ[ΚTΚMΚFΚ?Κ8Κ1Κ*Κ#ΚΚΚΚΚΚ͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚͚{͚t͚m͚f͚_͚X͚Q͚J͚C͚<͚5͚.͚'͚ ͚͚͚ ͚͚̚̚̚̚̚̚̚̚̚̚̚̚̚̚̚̚̚̚̚x̚q̚j̚c̚\̚U̚N̚G̚@̚9̚2̚+̚$̚̚̚̚̚̚˚˚˚˚˚˚˚˚˚˚˚˚˚˚˚˚˚˚|˚u˚n˚g˚`˚Y˚R˚K˚D˚=˚6˚/˚(˚!˚˚˚ ˚˚ʚʚʚʚʚʚʚʚʚʚʚʚʚʚʚʚʚʚʚyʚrʚkʚdʚ]ʚVʚOʚHʚAʚ:ʚ3ʚ,ʚ%ʚʚʚʚ ʚʚɚɚɚɚɚɚɚɚɚɚɚɚɚɚɚɚɚɚ}ɚvɚoɚhɚaɚZɚSɚLɚEɚ>ɚ7ɚ0ɚ)ɚ"ɚɚɚ ɚɚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚzȚsȚlȚeȚ^ȚWȚPȚIȚBȚ;Ț4Ț-Ț&ȚȚȚȚ ȚȚǚǚǚǚǚǚǚǚǚǚǚǚǚǚǚǚǚǚ~ǚwǚpǚiǚbǚ[ǚTǚMǚFǚ?ǚ8ǚ1ǚ*ǚ#ǚǚǚǚǚǚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚ{ƚtƚmƚfƚ_ƚXƚQƚJƚCƚ<ƚ5ƚ.ƚ'ƚ ƚƚƚ ƚƚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚxŚqŚjŚcŚ\ŚUŚNŚGŚ@Ś9Ś2Ś+Ś$ŚŚŚŚŚŚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ|ĚuĚnĚgĚ`ĚYĚRĚKĚDĚ=Ě6Ě/Ě(Ě!ĚĚĚ ĚĚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚšššššššššššššššššš}švšošhšašZšSšLšEš>š7š0š)š"ššš ššzsle^WPIB;4-& ~wpib[TMF?81*#뿚俚ݿֿϿȿ{tmf_XQJC<5.'  レ辚ᾚھӾ̾žxqjc\UNG@92+$콚彚޽׽нɽ½|ung`YRKD=6/(! 鼚⼚ۼԼͼƼyrkd]VOHA:3,% 滚߻ػѻʻû}vohaZSLE>70)" 꺚㺚ܺպκǺzsle^WPIB;4-& 繚๚ٹҹ˹Ĺ~wpib[TMF?81*#븚业ݸָϸȸ{tmf_XQJC<5.'  ﷚跚ᷚڷӷ̷ŷxqjc\UNG@92+$춚嶚޶׶жɶ¶|ung`YRKD=6/(! 鵚ⵚ۵Ե͵Ƶyrkd]VOHA:3,% 洚ߴشѴʴô}vohaZSLE>70)" 곚㳚ܳճγdzzsle^WPIB;4-& 粚ಚٲҲ˲IJ~wpib[TMF?81*#뱚䱚ݱֱϱȱ{tmf_XQJC<5.'  ﰚ谚ᰚڰӰ̰Űxqjc\UNG@92+$쯚寚ޯׯЯɯ¯|ung`YRKD=6/(! 鮚⮚ۮԮͮƮyrkd]VOHA:3,% 歚߭حѭʭí}vohaZSLE>70)" ꬚㬚ܬլάǬzsle^WPIB;4-& 竚૚٫ҫ˫ī~wpib[TMF?81*#몚䪚ݪ֪ϪȪ{tmf_XQJC<5.'  署詚ᩚکө̩ũxqjc\UNG@92+$쨚娚ިרШɨ¨|ung`YRKD=6/(! 駚⧚ۧԧͧƧyrkd]VOHA:3,% 榚ߦئѦʦæ}vohaZSLE>70)" ꥚㥚ܥեΥǥzsle^WPIB;4-& 礚च٤ҤˤĤ~wpib[TMF?81*#룚䣚ݣ֣ϣȣ{tmf_XQJC<5.'  袚ᢚڢӢ̢Ţxqjc\UNG@92+$졚塚ޡסСɡ¡|ung`YRKD=6/(! 頚⠚۠Ԡ͠Ơyrkd]VOHA:3,% ퟚ柚ߟ؟џʟß}vohaZSLE>70)" Ꞛ㞚ܞ՞ΞǞzsle^WPIB;4-& 睚ٝҝ˝ĝ~wpib[TMF?81*#뜚䜚ݜ֜ϜȜ{tmf_XQJC<5.'  蛚ᛚڛӛ̛śxqjc\UNG@92+$욚嚚ޚךКɚš|ung`YRKD=6/(! 陚♚ۙԙ͙ƙyrkd]VOHA:3,% 혚昚ߘؘјʘØ}vohaZSLE>70)" ꗚ㗚ܗ՗ΗǗzsle^WPIB;4-& 疚ٖҖ˖Ė~wpib[TMF?81*#땚䕚ݕ֕ϕȕ{tmf_XQJC<5.'  蔚ᔚڔӔ̔Ŕxqjc\UNG@92+$쓚哚ޓדГɓ“|ung`YRKD=6/(! 钚⒚ےԒ͒ƒyrkd]VOHA:3,% 푚摚ߑؑёʑÑ}vohaZSLE>70)" ꐚ㐚ܐՐΐǐzsle^WPIB;4-& 珚ُҏˏď~wpib[TMF?81*#뎚䎚ݎ֎ώȎ{tmf_XQJC<5.'  荚ፚڍӍ̍ōxqjc\UNG@92+$쌚匚ތ׌ЌɌŒ|ung`YRKD=6/(! 鋚⋚ۋԋ͋Ƌyrkd]VOHA:3,% 튚抚ߊ؊ъʊÊ}vohaZSLE>70)" ꉚ㉚܉ՉΉljzsle^WPIB;4-& 爚و҈ˈĈ~wpib[TMF?81*#뇚䇚݇ևχȇ{tmf_XQJC<5.'  膚ᆚچӆ̆ņxqjc\UNG@92+$셚党ޅׅЅɅ…|ung`YRKD=6/(! 鄚ℚۄԄ̈́Ƅyrkd]VOHA:3,% 탚惚߃؃уʃÃ}vohaZSLE>70)" ꂚ゚܂Ղ΂ǂzsle^WPIB;4-& 灚فҁˁā~wpib[TMF?81*#뀚䀚݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ߙߙߙߙߙߙߙߙߙߙߙߙߙߙߙߙߙߙ{ߙtߙmߙfߙ_ߙXߙQߙJߙCߙ<ߙ5ߙ.ߙ'ߙ ߙߙߙ ߙߙޙޙޙޙޙޙޙޙޙޙޙޙޙޙޙޙޙޙޙxޙqޙjޙcޙ\ޙUޙNޙGޙ@ޙ9ޙ2ޙ+ޙ$ޙޙޙޙޙޙݙݙݙݙݙݙݙݙݙݙݙݙݙݙݙݙݙݙ|ݙuݙnݙgݙ`ݙYݙRݙKݙDݙ=ݙ6ݙ/ݙ(ݙ!ݙݙݙ ݙݙܙܙܙܙܙܙܙܙܙܙܙܙܙܙܙܙܙܙܙyܙrܙkܙdܙ]ܙVܙOܙHܙAܙ:ܙ3ܙ,ܙ%ܙܙܙܙ ܙܙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙ}ۙvۙoۙhۙaۙZۙSۙLۙEۙ>ۙ7ۙ0ۙ)ۙ"ۙۙۙ ۙۙڙڙڙڙڙڙڙڙڙڙڙڙڙڙڙڙڙڙڙzڙsڙlڙeڙ^ڙWڙPڙIڙBڙ;ڙ4ڙ-ڙ&ڙڙڙڙ ڙڙٙٙٙٙٙٙٙٙٙٙٙٙٙٙٙٙٙٙ~ٙwٙpٙiٙbٙ[ٙTٙMٙFٙ?ٙ8ٙ1ٙ*ٙ#ؙؙؙؙؙؙؙؙؙؙؙؙؙؙؙؙؙؙٙٙٙٙٙٙ{ؙtؙmؙfؙ_ؙXؙQؙJؙCؙ<ؙ5ؙ.ؙ'ؙ ؙؙؙ ؙؙיייייייייייייייייייxיqיjיcי\יUיNיGי@י9י2י+י$יייייי֙֙֙֙֙֙֙֙֙֙֙֙֙֙֙֙֙֙|֙u֙n֙g֙`֙Y֙R֙K֙D֙=֙6֙/֙(֙!֙֙֙ ֙֙ՙՙՙՙՙՙՙՙՙՙՙՙՙՙՙՙՙՙՙyՙrՙkՙdՙ]ՙVՙOՙHՙAՙ:ՙ3ՙ,ՙ%ՙՙՙՙ ՙՙԙԙԙԙԙԙԙԙԙԙԙԙԙԙԙԙԙԙ}ԙvԙoԙhԙaԙZԙSԙLԙEԙ>ԙ7ԙ0ԙ)ԙ"ԙԙԙ ԙԙәәәәәәәәәәәәәәәәәәәzәsәlәeә^әWәPәIәBә;ә4ә-ә&әәәә әәҙҙҙҙҙҙҙҙҙҙҙҙҙҙҙҙҙҙ~ҙwҙpҙiҙbҙ[ҙTҙMҙFҙ?ҙ8ҙ1ҙ*ҙ#ҙҙҙҙҙҙљљљљљљљљљљљљљљљљљљ{љtљmљfљ_љXљQљJљCљ<љ5љ.љ'љ љљљ љљЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙxЙqЙjЙcЙ\ЙUЙNЙGЙ@Й9Й2Й+Й$ЙЙЙЙЙЙϙϙϙϙϙϙϙϙϙϙϙϙϙϙϙϙϙϙ|ϙuϙnϙgϙ`ϙYϙRϙKϙDϙ=ϙ6ϙ/ϙ(ϙ!ϙϙϙ ϙϙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙyΙrΙkΙdΙ]ΙVΙOΙHΙAΙ:Ι3Ι,Ι%ΙΙΙΙ ΙΙ͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙}͙v͙o͙h͙a͙Z͙S͙L͙E͙>͙7͙0͙)͙"͙͙͙ ͙͙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙z̙s̙l̙e̙^̙W̙P̙I̙B̙;̙4̙-̙&̙̙̙̙ ̙̙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙~˙w˙p˙i˙b˙[˙T˙M˙F˙?˙8˙1˙*˙#˙˙˙˙˙˙ʙʙʙʙʙʙʙʙʙʙʙʙʙʙʙʙʙʙ{ʙtʙmʙfʙ_ʙXʙQʙJʙCʙ<ʙ5ʙ.ʙ'ʙ ʙʙʙ ʙʙəəəəəəəəəəəəəəəəəəəxəqəjəcə\əUəNəGə@ə9ə2ə+ə$əəəəəəșșșșșșșșșșșșșșșșșș|șușnșgș`șYșRșKșDș=ș6ș/ș(ș!șșș șșǙǙǙǙǙǙǙǙǙǙǙǙǙǙǙǙǙǙǙyǙrǙkǙdǙ]ǙVǙOǙHǙAǙ:Ǚ3Ǚ,Ǚ%ǙǙǙǙ ǙǙƙƙƙƙƙƙƙƙƙƙƙƙƙƙƙƙƙƙ}ƙvƙoƙhƙaƙZƙSƙLƙEƙ>ƙ7ƙ0ƙ)ƙ"ƙƙƙ ƙƙřřřřřřřřřřřřřřřřřřřzřsřlřeř^řWřPřIřBř;ř4ř-ř&řřřř řřęęęęęęęęęęęęęęęęęę~ęwępęiębę[ęTęMęFę?ę8ę1ę*ę#ęęęęęęÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙ{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙ™™™™™™™™™™™™™™™™™™™x™q™j™c™\™U™N™G™@™9™2™+™$™™™™™™|ung`YRKD=6/(! yrkd]VOHA:3,% 濙߿ؿѿʿÿ}vohaZSLE>70)" 꾙㾙ܾվξǾzsle^WPIB;4-& 罙ཙٽҽ˽Ľ~wpib[TMF?81*#뼙伙ݼּϼȼ{tmf_XQJC<5.'  ﻙ軙ộڻӻ̻Żxqjc\UNG@92+$캙庙޺׺кɺº|ung`YRKD=6/(! 鹙⹙۹Թ͹ƹyrkd]VOHA:3,% 渙߸ظѸʸø}vohaZSLE>70)" 귙㷙ܷշηǷzsle^WPIB;4-& 継඙ٶҶ˶Ķ~wpib[TMF?81*#뵙䵙ݵֵϵȵ{tmf_XQJC<5.'  ﴙ贙ᴙڴӴ̴Ŵxqjc\UNG@92+$쳙峙޳׳гɳ³|ung`YRKD=6/(! 鲙ⲙ۲ԲͲƲyrkd]VOHA:3,% 汙߱رѱʱñ}vohaZSLE>70)" 같㰙ܰհΰǰzsle^WPIB;4-& 篙௙ٯү˯į~wpib[TMF?81*#뮙䮙ݮ֮ϮȮ{tmf_XQJC<5.'  ﭙ譙᭙ڭӭ̭ŭxqjc\UNG@92+$쬙嬙ެ׬Ьɬ¬|ung`YRKD=6/(! 髙⫙۫ԫͫƫyrkd]VOHA:3,% 檙ߪتѪʪê}vohaZSLE>70)" ꩙㩙ܩթΩǩzsle^WPIB;4-& 稙ਙ٨Ҩ˨Ĩ~wpib[TMF?81*#맙䧙ݧ֧ϧȧ{tmf_XQJC<5.'  蓮覙ᦙڦӦ̦Ŧxqjc\UNG@92+$쥙奙ޥץХɥ¥|ung`YRKD=6/(! 餙⤙ۤԤͤƤyrkd]VOHA:3,% 棙ߣأѣʣã}vohaZSLE>70)" ꢙ㢙ܢբ΢Ǣzsle^WPIB;4-& 硙࡙١ҡˡġ~wpib[TMF?81*#렙䠙ݠ֠ϠȠ{tmf_XQJC<5.'  蟙៙ڟӟ̟şxqjc\UNG@92+$잙垙ޞמОɞž|ung`YRKD=6/(! 静❙۝ԝ͝Ɲyrkd]VOHA:3,% 휙朙ߜ؜ќʜÜ}vohaZSLE>70)" ꛙ㛙ܛ՛ΛǛzsle^WPIB;4-& 皙ٚҚ˚Ě~wpib[TMF?81*#뙙䙙ݙ֙ϙș{tmf_XQJC<5.'  蘙ᘙژӘ̘Řxqjc\UNG@92+$엙嗙ޗחЗɗ—|ung`YRKD=6/(! 閙▙ۖԖ͖Ɩyrkd]VOHA:3,% 학教ߕؕѕʕÕ}vohaZSLE>70)" ꔙ㔙ܔՔΔǔzsle^WPIB;4-& 瓙ٓғ˓ē~wpib[TMF?81*#뒙䒙ݒ֒ϒȒ{tmf_XQJC<5.'  葙ᑙڑӑ̑őxqjc\UNG@92+$쐙吙ސאАɐ|ung`YRKD=6/(! 鏙⏙ۏԏ͏Əyrkd]VOHA:3,% 펙掙ߎ؎юʎÎ}vohaZSLE>70)" ꍙ㍙܍Ս΍Ǎzsle^WPIB;4-& 猙ٌҌˌČ~wpib[TMF?81*#닙䋙݋֋ϋȋ{tmf_XQJC<5.'  芙ኙڊӊ̊Ŋxqjc\UNG@92+$쉙剙މ׉Љɉ‰|ung`YRKD=6/(! 鈙∙ۈԈ͈ƈyrkd]VOHA:3,% 퇙懙߇؇чʇÇ}vohaZSLE>70)" ꆙ㆙܆ՆΆdžzsle^WPIB;4-& 煙م҅˅ą~wpib[TMF?81*#넙䄙݄քτȄ{tmf_XQJC<5.'  胙კڃӃ̃Ńxqjc\UNG@92+$삙備ނׂЂɂ‚|ung`YRKD=6/(! 遙⁙ہԁ́Ɓyrkd]VOHA:3,% 퀙怙߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߘߘߘߘߘߘߘߘߘߘߘߘߘߘߘߘߘߘ}ߘvߘoߘhߘaߘZߘSߘLߘEߘ>ߘ7ߘ0ߘ)ߘ"ߘߘߘ ߘߘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘzޘsޘlޘeޘ^ޘWޘPޘIޘBޘ;ޘ4ޘ-ޘ&ޘޘޘޘ ޘޘݘݘݘݘݘݘݘݘݘݘݘݘݘݘݘݘݘݘ~ݘwݘpݘiݘbݘ[ݘTݘMݘFݘ?ݘ8ݘ1ݘ*ݘ#ݘݘݘݘݘݘܘܘܘܘܘܘܘܘܘܘܘܘܘܘܘܘܘܘ{ܘtܘmܘfܘ_ܘXܘQܘJܘCܘ<ܘ5ܘ.ܘ'ܘ ܘܘܘ ܘܘۘۘۘۘۘۘۘۘۘۘۘۘۘۘۘۘۘۘۘxۘqۘjۘcۘ\ۘUۘNۘGۘ@ۘ9ۘ2ۘ+ۘ$ۘۘۘۘۘۘژژژژژژژژژژژژژژژژژژ|ژuژnژgژ`ژYژRژKژDژ=ژ6ژ/ژ(ژ!ژژژ ژژ٘٘٘٘٘٘٘٘٘٘٘٘٘٘٘٘٘٘٘y٘r٘k٘d٘]٘V٘O٘H٘A٘:٘3٘,٘%٘٘٘٘ ؘؘؘؘؘؘؘؘؘؘؘؘؘؘؘؘؘؘ٘٘}ؘvؘoؘhؘaؘZؘSؘLؘEؘ>ؘ7ؘ0ؘ)ؘ"ؘؘؘ ؘؘטטטטטטטטטטטטטטטטטטטzטsטlטeט^טWטPטIטBט;ט4ט-ט&טטטט טט֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘~֘w֘p֘i֘b֘[֘T֘M֘F֘?֘8֘1֘*֘#֘֘֘֘֘֘՘՘՘՘՘՘՘՘՘՘՘՘՘՘՘՘՘՘{՘t՘m՘f՘_՘X՘Q՘J՘C՘<՘5՘.՘'՘ ՘՘՘ ՘՘ԘԘԘԘԘԘԘԘԘԘԘԘԘԘԘԘԘԘԘxԘqԘjԘcԘ\ԘUԘNԘGԘ@Ԙ9Ԙ2Ԙ+Ԙ$ԘԘԘԘԘԘӘӘӘӘӘӘӘӘӘӘӘӘӘӘӘӘӘӘ|ӘuӘnӘgӘ`ӘYӘRӘKӘDӘ=Ә6Ә/Ә(Ә!ӘӘӘ ӘӘҘҘҘҘҘҘҘҘҘҘҘҘҘҘҘҘҘҘҘyҘrҘkҘdҘ]ҘVҘOҘHҘAҘ:Ҙ3Ҙ,Ҙ%ҘҘҘҘ ҘҘјјјјјјјјјјјјјјјјјј}јvјoјhјaјZјSјLјEј>ј7ј0ј)ј"јјј јјИИИИИИИИИИИИИИИИИИИzИsИlИeИ^ИWИPИIИBИ;И4И-И&ИИИИ ИИϘϘϘϘϘϘϘϘϘϘϘϘϘϘϘϘϘϘ~ϘwϘpϘiϘbϘ[ϘTϘMϘFϘ?Ϙ8Ϙ1Ϙ*Ϙ#ϘϘϘϘϘϘΘΘΘΘΘΘΘΘΘΘΘΘΘΘΘΘΘΘ{ΘtΘmΘfΘ_ΘXΘQΘJΘCΘ<Θ5Θ.Θ'Θ ΘΘΘ ΘΘ͘͘͘͘͘͘͘͘͘͘͘͘͘͘͘͘͘͘͘x͘q͘j͘c͘\͘U͘N͘G͘@͘9͘2͘+͘$̘̘̘̘̘̘̘̘̘̘̘̘̘̘̘̘̘̘͘͘͘͘͘͘|̘u̘n̘g̘`̘Y̘R̘K̘D̘=̘6̘/̘(̘!̘̘̘ ̘̘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘y˘r˘k˘d˘]˘V˘O˘H˘A˘:˘3˘,˘%˘˘˘˘ ˘˘ʘʘʘʘʘʘʘʘʘʘʘʘʘʘʘʘʘʘ}ʘvʘoʘhʘaʘZʘSʘLʘEʘ>ʘ7ʘ0ʘ)ʘ"ʘʘʘ ʘʘɘɘɘɘɘɘɘɘɘɘɘɘɘɘɘɘɘɘɘzɘsɘlɘeɘ^ɘWɘPɘIɘBɘ;ɘ4ɘ-ɘ&ɘɘɘɘ ɘɘȘȘȘȘȘȘȘȘȘȘȘȘȘȘȘȘȘȘ~ȘwȘpȘiȘbȘ[ȘTȘMȘFȘ?Ș8Ș1Ș*Ș#ȘȘȘȘȘȘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘ{ǘtǘmǘfǘ_ǘXǘQǘJǘCǘ<ǘ5ǘ.ǘ'ǘ ǘǘǘ ǘǘƘƘƘƘƘƘƘƘƘƘƘƘƘƘƘƘƘƘƘxƘqƘjƘcƘ\ƘUƘNƘGƘ@Ƙ9Ƙ2Ƙ+Ƙ$ƘƘƘƘƘƘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘ|ŘuŘnŘgŘ`ŘYŘRŘKŘDŘ=Ř6Ř/Ř(Ř!ŘŘŘ ŘŘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘyĘrĘkĘdĘ]ĘVĘOĘHĘAĘ:Ę3Ę,Ę%ĘĘĘĘ ĘĘØØØØØØØØØØØØØØØØØØ}ØvØoØhØaØZØSØLØEØ>Ø7Ø0Ø)Ø"ØØØ ØØ˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜z˜s˜l˜e˜^˜W˜P˜I˜B˜;˜4˜-˜&˜˜˜˜ ˜˜~wpib[TMF?81*#{tmf_XQJC<5.'  ￘还Ῐڿӿ̿ſxqjc\UNG@92+$쾘徘޾׾оɾ¾|ung`YRKD=6/(! 齘⽘۽Խͽƽyrkd]VOHA:3,% 漘߼ؼѼʼü}vohaZSLE>70)" 께㻘ܻջλǻzsle^WPIB;4-& 纘ຘٺҺ˺ĺ~wpib[TMF?81*#빘乘ݹֹϹȹ{tmf_XQJC<5.'  ︘踘ḘڸӸ̸Ÿxqjc\UNG@92+$췘巘޷׷зɷ·|ung`YRKD=6/(! 鶘⶘۶ԶͶƶyrkd]VOHA:3,% 浘ߵصѵʵõ}vohaZSLE>70)" 괘㴘ܴմδǴzsle^WPIB;4-& 糘೘ٳҳ˳ij~wpib[TMF?81*#벘䲘ݲֲϲȲ{tmf_XQJC<5.'  ﱘ豘᱘ڱӱ̱űxqjc\UNG@92+$찘尘ްװаɰ°|ung`YRKD=6/(! 鯘⯘ۯԯͯƯyrkd]VOHA:3,% 殘߮خѮʮî}vohaZSLE>70)" ꭘ㭘ܭխέǭzsle^WPIB;4-& 笘ଘ٬ҬˬĬ~wpib[TMF?81*#뫘䫘ݫ֫ϫȫ{tmf_XQJC<5.'  滛誘᪘ڪӪ̪Ūxqjc\UNG@92+$쩘婘ީשЩɩ©|ung`YRKD=6/(! 騘⨘ۨԨͨƨyrkd]VOHA:3,% 様ߧاѧʧç}vohaZSLE>70)" ꦘ㦘ܦզΦǦzsle^WPIB;4-& 祘क़٥ҥ˥ĥ~wpib[TMF?81*#뤘䤘ݤ֤ϤȤ{tmf_XQJC<5.'  裘ᣘڣӣ̣ţxqjc\UNG@92+$좘墘ޢעТɢ¢|ung`YRKD=6/(! 願⡘ۡԡ͡ơyrkd]VOHA:3,% 栘ߠؠѠʠà}vohaZSLE>70)" Ꟙ㟘ܟ՟Οǟzsle^WPIB;4-& 瞘ٞҞ˞Ğ~wpib[TMF?81*#띘䝘ݝ֝ϝȝ{tmf_XQJC<5.'  蜘᜘ڜӜ̜Ŝxqjc\UNG@92+$웘囘ޛכЛɛ›|ung`YRKD=6/(! 隘⚘ۚԚ͚ƚyrkd]VOHA:3,% 환晘ߙؙљʙÙ}vohaZSLE>70)" ꘘ㘘ܘ՘Θǘzsle^WPIB;4-& 痘ٗҗ˗ė~wpib[TMF?81*#떘䖘ݖ֖ϖȖ{tmf_XQJC<5.'  蕘ᕘڕӕ̕ŕxqjc\UNG@92+$씘唘ޔהДɔ”|ung`YRKD=6/(! 铘ⓘۓԓ͓Ɠyrkd]VOHA:3,% 풘撘ߒؒђʒÒ}vohaZSLE>70)" ꑘ㑘ܑՑΑǑzsle^WPIB;4-& 琘ِҐːĐ~wpib[TMF?81*#돘䏘ݏ֏Ϗȏ{tmf_XQJC<5.'  莘᎘ڎӎ̎Ŏxqjc\UNG@92+$썘単ލ׍Ѝɍ|ung`YRKD=6/(! 錘⌘یԌ͌ƌyrkd]VOHA:3,% 틘拘ߋ؋ыʋË}vohaZSLE>70)" ꊘ㊘܊ՊΊNJzsle^WPIB;4-& 牘ى҉ˉĉ~wpib[TMF?81*#눘䈘݈ֈψȈ{tmf_XQJC<5.'  臘ᇘڇӇ̇Ňxqjc\UNG@92+$솘冘ކ׆ІɆ†|ung`YRKD=6/(! 酘⅘ۅԅͅƅyrkd]VOHA:3,% 턘愘߄؄фʄÄ}vohaZSLE>70)" ꃘヘ܃Ճ΃ǃzsle^WPIB;4-& 炘ق҂˂Ă~wpib[TMF?81*#끘䁘݁ցρȁ{tmf_XQJC<5.'  耘ဘڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ߗߗߗߗߗߗߗߗߗߗߗߗߗߗߗߗߗߗߗxߗqߗjߗcߗ\ߗUߗNߗGߗ@ߗ9ߗ2ߗ+ߗ$ߗߗߗߗߗߗޗޗޗޗޗޗޗޗޗޗޗޗޗޗޗޗޗޗ|ޗuޗnޗgޗ`ޗYޗRޗKޗDޗ=ޗ6ޗ/ޗ(ޗ!ޗޗޗ ޗޗݗݗݗݗݗݗݗݗݗݗݗݗݗݗݗݗݗݗݗyݗrݗkݗdݗ]ݗVݗOݗHݗAݗ:ݗ3ݗ,ݗ%ݗݗݗݗ ݗݗܗܗܗܗܗܗܗܗܗܗܗܗܗܗܗܗܗܗ}ܗvܗoܗhܗaܗZܗSܗLܗEܗ>ܗ7ܗ0ܗ)ܗ"ܗܗܗ ܗܗۗۗۗۗۗۗۗۗۗۗۗۗۗۗۗۗۗۗۗzۗsۗlۗeۗ^ۗWۗPۗIۗBۗ;ۗ4ۗ-ۗ&ۗۗۗۗ ۗۗڗڗڗڗڗڗڗڗڗڗڗڗڗڗڗڗڗڗ~ڗwڗpڗiڗbڗ[ڗTڗMڗFڗ?ڗ8ڗ1ڗ*ڗ#ڗڗڗڗڗڗٗٗٗٗٗٗٗٗٗٗٗٗٗٗٗٗٗٗ{ٗtٗmٗfٗ_ٗXٗQٗJٗCٗ<ٗ5ٗ.ٗ'ٗ ٗٗٗ ٗٗؗؗؗؗؗؗؗؗؗؗؗؗؗؗؗؗؗؗؗxؗqؗjؗcؗ\ؗUؗNؗGؗ@ؗ9ؗ2ؗ+ؗ$ؗؗؗؗؗؗחחחחחחחחחחחחחחחחחח|חuחnחgח`חYחRחKחDח=ח6ח/ח(ח!חחח חח֗֗֗֗֗֗֗֗֗֗֗֗֗֗֗֗֗֗֗y֗r֗k֗d֗]֗V֗O֗H֗A֗:֗3֗,֗%֗֗֗֗ ֗֗՗՗՗՗՗՗՗՗՗՗՗՗՗՗՗՗՗՗}՗v՗o՗h՗a՗Z՗S՗L՗E՗>՗7՗0՗)՗"՗՗՗ ՗՗ԗԗԗԗԗԗԗԗԗԗԗԗԗԗԗԗԗԗԗzԗsԗlԗeԗ^ԗWԗPԗIԗBԗ;ԗ4ԗ-ԗ&ԗԗԗԗ ԗԗӗӗӗӗӗӗӗӗӗӗӗӗӗӗӗӗӗӗ~ӗwӗpӗiӗbӗ[ӗTӗMӗFӗ?ӗ8ӗ1ӗ*ӗ#ӗӗӗӗӗӗҗҗҗҗҗҗҗҗҗҗҗҗҗҗҗҗҗҗ{җtҗmҗfҗ_җXҗQҗJҗCҗ<җ5җ.җ'җ җҗҗ җҗїїїїїїїїїїїїїїїїїїїxїqїjїcї\їUїNїGї@ї9ї2ї+ї$їїїїїїЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗ|ЗuЗnЗgЗ`ЗYЗRЗKЗDЗ=З6З/З(З!ЗЗЗ ЗЗϗϗϗϗϗϗϗϗϗϗϗϗϗϗϗϗϗϗϗyϗrϗkϗdϗ]ϗVϗOϗHϗAϗ:ϗ3ϗ,ϗ%ϗϗϗϗ ϗϗΗΗΗΗΗΗΗΗΗΗΗΗΗΗΗΗΗΗ}ΗvΗoΗhΗaΗZΗSΗLΗEΗ>Η7Η0Η)Η"ΗΗΗ ΗΗ͗͗͗͗͗͗͗͗͗͗͗͗͗͗͗͗͗͗͗z͗s͗l͗e͗^͗W͗P͗I͗B͗;͗4͗-͗&͗͗͗͗ ̗̗̗̗̗̗̗̗̗̗̗̗̗̗̗̗̗̗͗͗~̗w̗p̗i̗b̗[̗T̗M̗F̗?̗8̗1̗*̗#̗̗̗̗̗̗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗{˗t˗m˗f˗_˗X˗Q˗J˗C˗<˗5˗.˗'˗ ˗˗˗ ˗˗ʗʗʗʗʗʗʗʗʗʗʗʗʗʗʗʗʗʗʗxʗqʗjʗcʗ\ʗUʗNʗGʗ@ʗ9ʗ2ʗ+ʗ$ʗʗʗʗʗʗɗɗɗɗɗɗɗɗɗɗɗɗɗɗɗɗɗɗ|ɗuɗnɗgɗ`ɗYɗRɗKɗDɗ=ɗ6ɗ/ɗ(ɗ!ɗɗɗ ɗɗȗȗȗȗȗȗȗȗȗȗȗȗȗȗȗȗȗȗȗyȗrȗkȗdȗ]ȗVȗOȗHȗAȗ:ȗ3ȗ,ȗ%ȗȗȗȗ ȗȗǗǗǗǗǗǗǗǗǗǗǗǗǗǗǗǗǗǗ}ǗvǗoǗhǗaǗZǗSǗLǗEǗ>Ǘ7Ǘ0Ǘ)Ǘ"ǗǗǗ ǗǗƗƗƗƗƗƗƗƗƗƗƗƗƗƗƗƗƗƗƗzƗsƗlƗeƗ^ƗWƗPƗIƗBƗ;Ɨ4Ɨ-Ɨ&ƗƗƗƗ ƗƗŗŗŗŗŗŗŗŗŗŗŗŗŗŗŗŗŗŗ~ŗwŗpŗiŗbŗ[ŗTŗMŗFŗ?ŗ8ŗ1ŗ*ŗ#ŗŗŗŗŗŗėėėėėėėėėėėėėėėėėė{ėtėmėfė_ėXėQėJėCė<ė5ė.ė'ė ėėė ėė×××××××××××××××××××x×q×j×c×\×U×N×G×@×9×2×+×$××××××——————————————————|—u—n—g—`—Y—R—K—D—=—6—/—(—!——— ——yrkd]VOHA:3,% }vohaZSLE>70)" 꿗㿗ܿտοǿzsle^WPIB;4-& 羗ྗپҾ˾ľ~wpib[TMF?81*#뽗佗ݽֽϽȽ{tmf_XQJC<5.'  7輗἗ڼӼ̼żxqjc\UNG@92+$컗廗޻׻лɻ»|ung`YRKD=6/(! 麗⺗ۺԺͺƺyrkd]VOHA:3,% 湗߹عѹʹù}vohaZSLE>70)" 긗㸗ܸոθǸzsle^WPIB;4-& 緗෗ٷҷ˷ķ~wpib[TMF?81*#붗䶗ݶֶ϶ȶ{tmf_XQJC<5.'  ﵗ赗ᵗڵӵ̵ŵxqjc\UNG@92+$촗崗޴״дɴ´|ung`YRKD=6/(! 鳗ⳗ۳ԳͳƳyrkd]VOHA:3,% 沗߲زѲʲò}vohaZSLE>70)" 걗㱗ܱձαDZzsle^WPIB;4-& 簗గٰҰ˰İ~wpib[TMF?81*#믗䯗ݯ֯ϯȯ{tmf_XQJC<5.'  ﮗ讗ᮗڮӮ̮Ůxqjc\UNG@92+$쭗字ޭ׭Эɭ­|ung`YRKD=6/(! 鬗⬗۬ԬͬƬyrkd]VOHA:3,% 櫗߫ثѫʫë}vohaZSLE>70)" ꪗ㪗ܪժΪǪzsle^WPIB;4-& 穗੗٩ҩ˩ĩ~wpib[TMF?81*#먗䨗ݨ֨ϨȨ{tmf_XQJC<5.'  輪觗᧗ڧӧ̧ŧxqjc\UNG@92+$즗妗ަצЦɦ¦|ung`YRKD=6/(! 饗⥗ۥԥͥƥyrkd]VOHA:3,% 椗ߤؤѤʤä}vohaZSLE>70)" ꣗㣗ܣգΣǣzsle^WPIB;4-& 碗ࢗ٢ҢˢĢ~wpib[TMF?81*#롗䡗ݡ֡ϡȡ{tmf_XQJC<5.'  蠗᠗ڠӠ̠Šxqjc\UNG@92+$쟗埗ޟןПɟŸ|ung`YRKD=6/(! 鞗➗۞Ԟ͞ƞyrkd]VOHA:3,% 흗杗ߝ؝ѝʝÝ}vohaZSLE>70)" ꜗ㜗ܜ՜Μǜzsle^WPIB;4-& 盗ٛқ˛ě~wpib[TMF?81*#뚗䚗ݚ֚ϚȚ{tmf_XQJC<5.'  虗ᙗڙә̙řxqjc\UNG@92+$옗嘗ޘטИɘ˜|ung`YRKD=6/(! 闗◗ۗԗ͗Ɨyrkd]VOHA:3,% 햗斗ߖؖіʖÖ}vohaZSLE>70)" ꕗ㕗ܕՕΕǕzsle^WPIB;4-& 甗ٔҔ˔Ĕ~wpib[TMF?81*#듗䓗ݓ֓ϓȓ{tmf_XQJC<5.'  蒗ᒗڒӒ̒Œxqjc\UNG@92+$쑗呗ޑבБɑ‘|ung`YRKD=6/(! 鐗␗ېԐ͐Ɛyrkd]VOHA:3,% 폗揗ߏ؏яʏÏ}vohaZSLE>70)" ꎗ㎗܎ՎΎǎzsle^WPIB;4-& 獗ٍҍˍč~wpib[TMF?81*#댗䌗݌֌όȌ{tmf_XQJC<5.'  苗዗ڋӋ̋ŋxqjc\UNG@92+$슗劗ފ׊ЊɊŠ|ung`YRKD=6/(! 鉗≗ۉԉ͉Ɖyrkd]VOHA:3,% 툗戗߈؈шʈÈ}vohaZSLE>70)" ꇗ㇗܇Շ·LJzsle^WPIB;4-& 熗ن҆ˆĆ~wpib[TMF?81*#녗䅗݅օυȅ{tmf_XQJC<5.'  脗ᄗڄӄ̄ńxqjc\UNG@92+$샗僗ރ׃ЃɃƒ|ung`YRKD=6/(! 邗ₗۂԂ͂Ƃyrkd]VOHA:3,% 큗恗߁؁сʁÁ}vohaZSLE>70)" ꀗ〗܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ߖߖߖߖߖߖߖߖߖߖߖߖߖߖߖߖߖߖߖzߖsߖlߖeߖ^ߖWߖPߖIߖBߖ;ߖ4ߖ-ߖ&ߖߖߖߖ ߖߖޖޖޖޖޖޖޖޖޖޖޖޖޖޖޖޖޖޖ~ޖwޖpޖiޖbޖ[ޖTޖMޖFޖ?ޖ8ޖ1ޖ*ޖ#ޖޖޖޖޖޖݖݖݖݖݖݖݖݖݖݖݖݖݖݖݖݖݖݖ{ݖtݖmݖfݖ_ݖXݖQݖJݖCݖ<ݖ5ݖ.ݖ'ݖ ݖݖݖ ݖݖܖܖܖܖܖܖܖܖܖܖܖܖܖܖܖܖܖܖܖxܖqܖjܖcܖ\ܖUܖNܖGܖ@ܖ9ܖ2ܖ+ܖ$ܖܖܖܖܖܖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖ|ۖuۖnۖgۖ`ۖYۖRۖKۖDۖ=ۖ6ۖ/ۖ(ۖ!ۖۖۖ ۖۖږږږږږږږږږږږږږږږږږږږyږrږkږdږ]ږVږOږHږAږ:ږ3ږ,ږ%ږږږږ ږږٖٖٖٖٖٖٖٖٖٖٖٖٖٖٖٖٖٖ}ٖvٖoٖhٖaٖZٖSٖLٖEٖ>ٖ7ٖ0ٖ)ٖ"ٖٖٖ ٖٖؖؖؖؖؖؖؖؖؖؖؖؖؖؖؖؖؖؖؖzؖsؖlؖeؖ^ؖWؖPؖIؖBؖ;ؖ4ؖ-ؖ&ؖؖؖؖ ؖؖזזזזזזזזזזזזזזזזזז~זwזpזiזbז[זTזMזFז?ז8ז1ז*ז#זזזזזז֖֖֖֖֖֖֖֖֖֖֖֖֖֖֖֖֖֖{֖t֖m֖f֖_֖X֖Q֖J֖C֖<֖5֖.֖'֖ ֖֖֖ ֖֖ՖՖՖՖՖՖՖՖՖՖՖՖՖՖՖՖՖՖՖxՖqՖjՖcՖ\ՖUՖNՖGՖ@Ֆ9Ֆ2Ֆ+Ֆ$ՖՖՖՖՖՖԖԖԖԖԖԖԖԖԖԖԖԖԖԖԖԖԖԖ|ԖuԖnԖgԖ`ԖYԖRԖKԖDԖ=Ԗ6Ԗ/Ԗ(Ԗ!ԖԖԖ ԖԖӖӖӖӖӖӖӖӖӖӖӖӖӖӖӖӖӖӖӖyӖrӖkӖdӖ]ӖVӖOӖHӖAӖ:Ӗ3Ӗ,Ӗ%ӖӖӖӖ ӖӖҖҖҖҖҖҖҖҖҖҖҖҖҖҖҖҖҖҖ}ҖvҖoҖhҖaҖZҖSҖLҖEҖ>Җ7Җ0Җ)Җ"ҖҖҖ ҖҖіііііііііііііііііііzіsіlіeі^іWіPіIіBі;і4і-і&іііі ііЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ~ЖwЖpЖiЖbЖ[ЖTЖMЖFЖ?Ж8Ж1Ж*Ж#ЖЖЖЖЖЖϖϖϖϖϖϖϖϖϖϖϖϖϖϖϖϖϖϖ{ϖtϖmϖfϖ_ϖXϖQϖJϖCϖ<ϖ5ϖ.ϖ'ϖ ϖϖϖ ϖϖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖxΖqΖjΖcΖ\ΖUΖNΖGΖ@Ζ9Ζ2Ζ+Ζ$ΖΖΖΖΖΖ͖͖͖͖͖͖͖͖͖͖͖͖͖͖͖͖͖͖|͖u͖n͖g͖`͖Y͖R͖K͖D͖=͖6͖/͖(͖!͖͖͖ ͖͖̖̖̖̖̖̖̖̖̖̖̖̖̖̖̖̖̖̖̖y̖r̖k̖d̖]̖V̖O̖H̖A̖:̖3̖,̖%̖̖̖̖ ̖̖˖˖˖˖˖˖˖˖˖˖˖˖˖˖˖˖˖˖}˖v˖o˖h˖a˖Z˖S˖L˖E˖>˖7˖0˖)˖"˖˖˖ ˖˖ʖʖʖʖʖʖʖʖʖʖʖʖʖʖʖʖʖʖʖzʖsʖlʖeʖ^ʖWʖPʖIʖBʖ;ʖ4ʖ-ʖ&ʖʖʖʖ ʖʖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖɖ~ɖwɖpɖiɖbɖ[ɖTɖMɖFɖ?ɖ8ɖ1ɖ*ɖ#ɖɖɖɖɖɖȖȖȖȖȖȖȖȖȖȖȖȖȖȖȖȖȖȖ{ȖtȖmȖfȖ_ȖXȖQȖJȖCȖ<Ȗ5Ȗ.Ȗ'Ȗ ȖȖȖ ȖȖǖǖǖǖǖǖǖǖǖǖǖǖǖǖǖǖǖǖǖxǖqǖjǖcǖ\ǖUǖNǖGǖ@ǖ9ǖ2ǖ+ǖ$ǖǖǖǖǖǖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖƖ|ƖuƖnƖgƖ`ƖYƖRƖKƖDƖ=Ɩ6Ɩ/Ɩ(Ɩ!ƖƖƖ ƖƖŖŖŖŖŖŖŖŖŖŖŖŖŖŖŖŖŖŖŖyŖrŖkŖdŖ]ŖVŖOŖHŖAŖ:Ŗ3Ŗ,Ŗ%ŖŖŖŖ ŖŖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖĖ}ĖvĖoĖhĖaĖZĖSĖLĖEĖ>Ė7Ė0Ė)Ė"ĖĖĖ ĖĖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖ––––––––––––––––––~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––{tmf_XQJC<5.'  xqjc\UNG@92+$쿖忖޿׿пɿ¿|ung`YRKD=6/(! 龖⾖۾Ծ;ƾyrkd]VOHA:3,% 潖߽ؽѽʽý}vohaZSLE>70)" 꼖㼖ܼռμǼzsle^WPIB;4-& 绖໖ٻһ˻Ļ~wpib[TMF?81*#뺖亖ݺֺϺȺ{tmf_XQJC<5.'  ﹖蹖Ṗڹӹ̹Źxqjc\UNG@92+$츖帖޸׸иɸ¸|ung`YRKD=6/(! 鷖ⷖ۷ԷͷƷyrkd]VOHA:3,% 涖߶ضѶʶö}vohaZSLE>70)" 굖㵖ܵյεǵzsle^WPIB;4-& 紖ഖٴҴ˴Ĵ~wpib[TMF?81*#볖䳖ݳֳϳȳ{tmf_XQJC<5.'  ﲖ貖ᲖڲӲ̲Ųxqjc\UNG@92+$챖屖ޱױбɱ±|ung`YRKD=6/(! 鰖Ⱆ۰԰Ͱưyrkd]VOHA:3,% 毖߯دѯʯï}vohaZSLE>70)" ꮖ㮖ܮծήǮzsle^WPIB;4-& 策ୖ٭ҭ˭ĭ~wpib[TMF?81*#묖䬖ݬ֬ϬȬ{tmf_XQJC<5.'  𥳐論᫖ګӫ̫ūxqjc\UNG@92+$쪖媖ުתЪɪª|ung`YRKD=6/(! 驖⩖۩ԩͩƩyrkd]VOHA:3,% 樖ߨبѨʨè}vohaZSLE>70)" ꧖㧖ܧէΧǧzsle^WPIB;4-& 禖খ٦Ҧ˦Ħ~wpib[TMF?81*#륖䥖ݥ֥ϥȥ{tmf_XQJC<5.'  烙褖ᤖڤӤ̤Ťxqjc\UNG@92+$죖壖ޣףУɣ£|ung`YRKD=6/(! 颖⢖ۢԢ͢Ƣyrkd]VOHA:3,% 桖ߡءѡʡá}vohaZSLE>70)" ꠖ㠖ܠՠΠǠzsle^WPIB;4-& 矖ٟҟ˟ğ~wpib[TMF?81*#랖䞖ݞ֞ϞȞ{tmf_XQJC<5.'  蝖᝖ڝӝ̝ŝxqjc\UNG@92+$윖圖ޜלМɜœ|ung`YRKD=6/(! 雖⛖ۛԛ͛ƛyrkd]VOHA:3,% 횖暖ߚؚњʚÚ}vohaZSLE>70)" Ꙗ㙖ܙՙΙǙzsle^WPIB;4-& 瘖٘Ҙ˘Ę~wpib[TMF?81*#뗖䗖ݗ֗ϗȗ{tmf_XQJC<5.'  薖ᖖږӖ̖Ŗxqjc\UNG@92+$앖啖ޕוЕɕ•|ung`YRKD=6/(! 锖┖۔Ԕ͔Ɣyrkd]VOHA:3,% 퓖擖ߓؓѓʓÓ}vohaZSLE>70)" ꒖㒖ܒՒΒǒzsle^WPIB;4-& 瑖ّґˑđ~wpib[TMF?81*#됖䐖ݐ֐ϐȐ{tmf_XQJC<5.'  菖Ꮦڏӏ̏ŏxqjc\UNG@92+$쎖厖ގ׎ЎɎŽ|ung`YRKD=6/(! 鍖⍖ۍԍ͍ƍyrkd]VOHA:3,% 팖挖ߌ،ьʌÌ}vohaZSLE>70)" ꋖ㋖܋Ջ΋Njzsle^WPIB;4-& 犖يҊˊĊ~wpib[TMF?81*#뉖䉖݉։ωȉ{tmf_XQJC<5.'  舖ሖڈӈ̈ňxqjc\UNG@92+$쇖凖އׇЇɇ‡|ung`YRKD=6/(! 醖↖ۆԆ͆Ɔyrkd]VOHA:3,% 텖慖߅؅хʅÅ}vohaZSLE>70)" ꄖㄖ܄Մ΄DŽzsle^WPIB;4-& 烖ك҃˃ă~wpib[TMF?81*#낖䂖݂ւςȂ{tmf_XQJC<5.'  聖ၖځӁ́Łxqjc\UNG@92+$쀖倖ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$ߕߕߕߕߕߕߕߕߕߕߕߕߕߕߕߕߕߕ|ߕuߕnߕgߕ`ߕYߕRߕKߕDߕ=ߕ6ߕ/ߕ(ߕ!ߕߕߕ ߕߕޕޕޕޕޕޕޕޕޕޕޕޕޕޕޕޕޕޕޕyޕrޕkޕdޕ]ޕVޕOޕHޕAޕ:ޕ3ޕ,ޕ%ޕޕޕޕ ޕޕݕݕݕݕݕݕݕݕݕݕݕݕݕݕݕݕݕݕ}ݕvݕoݕhݕaݕZݕSݕLݕEݕ>ݕ7ݕ0ݕ)ݕ"ݕݕݕ ݕݕܕܕܕܕܕܕܕܕܕܕܕܕܕܕܕܕܕܕܕzܕsܕlܕeܕ^ܕWܕPܕIܕBܕ;ܕ4ܕ-ܕ&ܕܕܕܕ ܕܕەەەەەەەەەەەەەەەەەە~ەwەpەiەbە[ەTەMەFە?ە8ە1ە*ە#ەەەەەەڕڕڕڕڕڕڕڕڕڕڕڕڕڕڕڕڕڕ{ڕtڕmڕfڕ_ڕXڕQڕJڕCڕ<ڕ5ڕ.ڕ'ڕ ڕڕڕ ڕڕٕٕٕٕٕٕٕٕٕٕٕٕٕٕٕٕٕٕٕxٕqٕjٕcٕ\ٕUٕNٕGٕ@ٕ9ٕ2ٕ+ٕ$ٕٕٕٕٕٕؕؕؕؕؕؕؕؕؕؕؕؕؕؕؕؕؕؕ|ؕuؕnؕgؕ`ؕYؕRؕKؕDؕ=ؕ6ؕ/ؕ(ؕ!ؕؕؕ ؕؕוווווווווווווווווווyוrוkוdו]וVוOוHוAו:ו3ו,ו%וווו וו֕֕֕֕֕֕֕֕֕֕֕֕֕֕֕֕֕֕}֕v֕o֕h֕a֕Z֕S֕L֕E֕>֕7֕0֕)֕"֕֕֕ ֕֕ՕՕՕՕՕՕՕՕՕՕՕՕՕՕՕՕՕՕՕzՕsՕlՕeՕ^ՕWՕPՕIՕBՕ;Օ4Օ-Օ&ՕՕՕՕ ՕՕԕԕԕԕԕԕԕԕԕԕԕԕԕԕԕԕԕԕ~ԕwԕpԕiԕbԕ[ԕTԕMԕFԕ?ԕ8ԕ1ԕ*ԕ#ԕԕԕԕԕԕӕӕӕӕӕӕӕӕӕӕӕӕӕӕӕӕӕӕ{ӕtӕmӕfӕ_ӕXӕQӕJӕCӕ<ӕ5ӕ.ӕ'ӕ ӕӕӕ ӕӕҕҕҕҕҕҕҕҕҕҕҕҕҕҕҕҕҕҕҕxҕqҕjҕcҕ\ҕUҕNҕGҕ@ҕ9ҕ2ҕ+ҕ$ҕҕҕҕҕҕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕ|ѕuѕnѕgѕ`ѕYѕRѕKѕDѕ=ѕ6ѕ/ѕ(ѕ!ѕѕѕ ѕѕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕyЕrЕkЕdЕ]ЕVЕOЕHЕAЕ:Е3Е,Е%ЕЕЕЕ ЕЕϕϕϕϕϕϕϕϕϕϕϕϕϕϕϕϕϕϕ}ϕvϕoϕhϕaϕZϕSϕLϕEϕ>ϕ7ϕ0ϕ)ϕ"ϕϕϕ ϕϕΕΕΕΕΕΕΕΕΕΕΕΕΕΕΕΕΕΕΕzΕsΕlΕeΕ^ΕWΕPΕIΕBΕ;Ε4Ε-Ε&ΕΕΕΕ ΕΕ͕͕͕͕͕͕͕͕͕͕͕͕͕͕͕͕͕͕~͕w͕p͕i͕b͕[͕T͕M͕F͕?͕8͕1͕*͕#͕͕͕͕͕͕̕̕̕̕̕̕̕̕̕̕̕̕̕̕̕̕̕̕{̕t̕m̕f̕_̕X̕Q̕J̕C̕<̕5̕.̕'̕ ̕̕̕ ̕̕˕˕˕˕˕˕˕˕˕˕˕˕˕˕˕˕˕˕˕x˕q˕j˕c˕\˕U˕N˕G˕@˕9˕2˕+˕$˕˕˕˕˕˕ʕʕʕʕʕʕʕʕʕʕʕʕʕʕʕʕʕʕ|ʕuʕnʕgʕ`ʕYʕRʕKʕDʕ=ʕ6ʕ/ʕ(ʕ!ʕʕʕ ʕʕɕɕɕɕɕɕɕɕɕɕɕɕɕɕɕɕɕɕɕyɕrɕkɕdɕ]ɕVɕOɕHɕAɕ:ɕ3ɕ,ɕ%ɕɕɕɕ ɕɕȕȕȕȕȕȕȕȕȕȕȕȕȕȕȕȕȕȕ}ȕvȕoȕhȕaȕZȕSȕLȕEȕ>ȕ7ȕ0ȕ)ȕ"ȕȕȕ ȕȕǕǕǕǕǕǕǕǕǕǕǕǕǕǕǕǕǕǕǕzǕsǕlǕeǕ^ǕWǕPǕIǕBǕ;Ǖ4Ǖ-Ǖ&ǕǕǕǕ ǕǕƕƕƕƕƕƕƕƕƕƕƕƕƕƕƕƕƕƕ~ƕwƕpƕiƕbƕ[ƕTƕMƕFƕ?ƕ8ƕ1ƕ*ƕ#ƕƕƕƕƕƕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕ{ŕtŕmŕfŕ_ŕXŕQŕJŕCŕ<ŕ5ŕ.ŕ'ŕ ŕŕŕ ŕŕĕĕĕĕĕĕĕĕĕĕĕĕĕĕĕĕĕĕĕxĕqĕjĕcĕ\ĕUĕNĕGĕ@ĕ9ĕ2ĕ+ĕ$ĕĕĕĕĕĕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕ•••••••••••••••••••y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••}vohaZSLE>70)" zsle^WPIB;4-& 翕࿕ٿҿ˿Ŀ~wpib[TMF?81*#뾕侕ݾ־ϾȾ{tmf_XQJC<5.'  u轕ὕڽӽ̽Žxqjc\UNG@92+$켕引޼׼мɼ¼|ung`YRKD=6/(! 黕⻕ۻԻͻƻyrkd]VOHA:3,% 溕ߺغѺʺú}vohaZSLE>70)" 깕㹕ܹչιǹzsle^WPIB;4-& 縕ตٸҸ˸ĸ~wpib[TMF?81*#뷕䷕ݷַϷȷ{tmf_XQJC<5.'  ﶕ趕ᶕڶӶ̶Ŷxqjc\UNG@92+$쵕嵕޵׵еɵµ|ung`YRKD=6/(! 鴕ⴕ۴Դʹƴyrkd]VOHA:3,% 法߳سѳʳó}vohaZSLE>70)" 겕㲕ܲղβDzzsle^WPIB;4-& 籕ౕٱұ˱ı~wpib[TMF?81*#박䰕ݰְϰȰ{tmf_XQJC<5.'  ﯕ试ᯕگӯ̯ůxqjc\UNG@92+$쮕宕ޮ׮Юɮ®|ung`YRKD=6/(! 魕⭕ۭԭͭƭyrkd]VOHA:3,% 欕߬جѬʬì}vohaZSLE>70)" ꫕㫕ܫիΫǫzsle^WPIB;4-& 窕ક٪Ҫ˪Ī~wpib[TMF?81*#멕䩕ݩ֩ϩȩ{tmf_XQJC<5.'  凞訕ᨕڨӨ̨Ũxqjc\UNG@92+$징姕ާקЧɧ§|ung`YRKD=6/(! 馕⦕ۦԦͦƦyrkd]VOHA:3,% 楕ߥإѥʥå}vohaZSLE>70)" ꤕ㤕ܤդΤǤzsle^WPIB;4-& 磕ࣕ٣ңˣģ~wpib[TMF?81*#뢕䢕ݢ֢ϢȢ{tmf_XQJC<5.'  衕ᡕڡӡ̡šxqjc\UNG@92+$정堕ޠנРɠ |ung`YRKD=6/(! 韕⟕۟ԟ͟Ɵyrkd]VOHA:3,% 힕枕ߞ؞ўʞÞ}vohaZSLE>70)" ꝕ㝕ܝ՝Νǝzsle^WPIB;4-& 眕ٜҜ˜Ĝ~wpib[TMF?81*#뛕䛕ݛ֛ϛț{tmf_XQJC<5.'  蚕ᚕښӚ̚Śxqjc\UNG@92+$왕噕ޙיЙə™|ung`YRKD=6/(! 阕☕ۘԘ͘Ƙyrkd]VOHA:3,% 헕旕ߗؗїʗ×}vohaZSLE>70)" ꖕ㖕ܖՖΖǖzsle^WPIB;4-& 畕ٕҕ˕ĕ~wpib[TMF?81*#딕䔕ݔ֔ϔȔ{tmf_XQJC<5.'  蓕ᓕړӓ̓œxqjc\UNG@92+$쒕咕ޒגВɒ’|ung`YRKD=6/(! 鑕⑕ۑԑ͑Ƒyrkd]VOHA:3,% 퐕搕ߐؐѐʐÐ}vohaZSLE>70)" ꏕ㏕܏ՏΏǏzsle^WPIB;4-& 玕َҎˎĎ~wpib[TMF?81*#덕䍕ݍ֍ύȍ{tmf_XQJC<5.'  茕ጕڌӌ̌Ōxqjc\UNG@92+$싕動ދ׋Ћɋ‹|ung`YRKD=6/(! 銕⊕ۊԊ͊Ɗyrkd]VOHA:3,% 퉕払߉؉щʉÉ}vohaZSLE>70)" ꈕ㈕܈ՈΈLjzsle^WPIB;4-& 燕ه҇ˇć~wpib[TMF?81*#놕䆕݆ֆφȆ{tmf_XQJC<5.'  腕ᅕڅӅ̅Ņxqjc\UNG@92+$섕儕ބׄЄɄ„|ung`YRKD=6/(! 郕⃕ۃԃ̓ƃyrkd]VOHA:3,% 킕悕߂؂тʂÂ}vohaZSLE>70)" ꁕさ܁Ձ΁ǁzsle^WPIB;4-& 瀕ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ߔߔߔߔߔߔߔߔߔߔߔߔߔߔߔߔߔߔ~ߔwߔpߔiߔbߔ[ߔTߔMߔFߔ?ߔ8ߔ1ߔ*ߔ#ߔߔߔߔߔߔޔޔޔޔޔޔޔޔޔޔޔޔޔޔޔޔޔޔ{ޔtޔmޔfޔ_ޔXޔQޔJޔCޔ<ޔ5ޔ.ޔ'ޔ ޔޔޔ ޔޔݔݔݔݔݔݔݔݔݔݔݔݔݔݔݔݔݔݔݔxݔqݔjݔcݔ\ݔUݔNݔGݔ@ݔ9ݔ2ݔ+ݔ$ݔݔݔݔݔݔܔܔܔܔܔܔܔܔܔܔܔܔܔܔܔܔܔܔ|ܔuܔnܔgܔ`ܔYܔRܔKܔDܔ=ܔ6ܔ/ܔ(ܔ!ܔܔܔ ܔܔ۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔y۔r۔k۔d۔]۔V۔O۔H۔A۔:۔3۔,۔%۔۔۔۔ ۔۔ڔڔڔڔڔڔڔڔڔڔڔڔڔڔڔڔڔڔ}ڔvڔoڔhڔaڔZڔSڔLڔEڔ>ڔ7ڔ0ڔ)ڔ"ڔڔڔ ڔڔٔٔٔٔٔٔٔٔٔٔٔٔٔٔٔٔٔٔٔzٔsٔlٔeٔ^ٔWٔPٔIٔBٔ;ٔ4ٔ-ٔ&ٔٔٔٔ ٔٔؔؔؔؔؔؔؔؔؔؔؔؔؔؔؔؔؔؔ~ؔwؔpؔiؔbؔ[ؔTؔMؔFؔ?ؔ8ؔ1ؔ*ؔ#ؔؔؔؔؔؔהההההההההההההההההה{הtהmהfה_הXהQהJהCה<ה5ה.ה'ה ההה הה֔֔֔֔֔֔֔֔֔֔֔֔֔֔֔֔֔֔֔x֔q֔j֔c֔\֔U֔N֔G֔@֔9֔2֔+֔$֔֔֔֔֔֔ՔՔՔՔՔՔՔՔՔՔՔՔՔՔՔՔՔՔ|ՔuՔnՔgՔ`ՔYՔRՔKՔDՔ=Ք6Ք/Ք(Ք!ՔՔՔ ՔՔԔԔԔԔԔԔԔԔԔԔԔԔԔԔԔԔԔԔԔyԔrԔkԔdԔ]ԔVԔOԔHԔAԔ:Ԕ3Ԕ,Ԕ%ԔԔԔԔ ԔԔӔӔӔӔӔӔӔӔӔӔӔӔӔӔӔӔӔӔ}ӔvӔoӔhӔaӔZӔSӔLӔEӔ>Ӕ7Ӕ0Ӕ)Ӕ"ӔӔӔ ӔӔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔzҔsҔlҔeҔ^ҔWҔPҔIҔBҔ;Ҕ4Ҕ-Ҕ&ҔҔҔҔ ҔҔєєєєєєєєєєєєєєєєєє~єwєpєiєbє[єTєMєFє?є8є1є*є#єєєєєєДДДДДДДДДДДДДДДДДД{ДtДmДfД_ДXДQДJДCД<Д5Д.Д'Д ДДД ДДϔϔϔϔϔϔϔϔϔϔϔϔϔϔϔϔϔϔϔxϔqϔjϔcϔ\ϔUϔNϔGϔ@ϔ9ϔ2ϔ+ϔ$ϔϔϔϔϔϔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔ|ΔuΔnΔgΔ`ΔYΔRΔKΔDΔ=Δ6Δ/Δ(Δ!ΔΔΔ ΔΔ͔͔͔͔͔͔͔͔͔͔͔͔͔͔͔͔͔͔͔y͔r͔k͔d͔]͔V͔O͔H͔A͔:͔3͔,͔%͔͔͔͔ ͔͔̔̔̔̔̔̔̔̔̔̔̔̔̔̔̔̔̔̔}̔v̔o̔h̔a̔Z̔S̔L̔E̔>̔7̔0̔)̔"̔̔̔ ̔̔˔˔˔˔˔˔˔˔˔˔˔˔˔˔˔˔˔˔˔z˔s˔l˔e˔^˔W˔P˔I˔B˔;˔4˔-˔&˔˔˔˔ ˔˔ʔʔʔʔʔʔʔʔʔʔʔʔʔʔʔʔʔʔ~ʔwʔpʔiʔbʔ[ʔTʔMʔFʔ?ʔ8ʔ1ʔ*ʔ#ʔʔʔʔʔʔɔɔɔɔɔɔɔɔɔɔɔɔɔɔɔɔɔɔ{ɔtɔmɔfɔ_ɔXɔQɔJɔCɔ<ɔ5ɔ.ɔ'ɔ ɔɔɔ ɔɔȔȔȔȔȔȔȔȔȔȔȔȔȔȔȔȔȔȔȔxȔqȔjȔcȔ\ȔUȔNȔGȔ@Ȕ9Ȕ2Ȕ+Ȕ$ȔȔȔȔȔȔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔǔ|ǔuǔnǔgǔ`ǔYǔRǔKǔDǔ=ǔ6ǔ/ǔ(ǔ!ǔǔǔ ǔǔƔƔƔƔƔƔƔƔƔƔƔƔƔƔƔƔƔƔƔyƔrƔkƔdƔ]ƔVƔOƔHƔAƔ:Ɣ3Ɣ,Ɣ%ƔƔƔƔ ƔƔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔ}ŔvŔoŔhŔaŔZŔSŔLŔEŔ>Ŕ7Ŕ0Ŕ)Ŕ"ŔŔŔ ŔŔĔĔĔĔĔĔĔĔĔĔĔĔĔĔĔĔĔĔĔzĔsĔlĔeĔ^ĔWĔPĔIĔBĔ;Ĕ4Ĕ-Ĕ&ĔĔĔĔ ĔĔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔ””””””””””””””””””{”t”m”f”_”X”Q”J”C”<”5”.”'” ””” ””xqjc\UNG@92+$|ung`YRKD=6/(! 鿔⿔ۿԿͿƿyrkd]VOHA:3,% 澔߾ؾѾʾþ}vohaZSLE>70)" 꽔㽔ܽսνǽzsle^WPIB;4-& 缔༔ټҼ˼ļ~wpib[TMF?81*#뻔仔ݻֻϻȻ{tmf_XQJC<5.'  ﺔ躔ẔںӺ̺źxqjc\UNG@92+$칔幔޹׹йɹ¹|ung`YRKD=6/(! 鸔⸔۸Ը͸Ƹyrkd]VOHA:3,% 淔߷طѷʷ÷}vohaZSLE>70)" 궔㶔ܶնζǶzsle^WPIB;4-& 絔ൔٵҵ˵ĵ~wpib[TMF?81*#봔䴔ݴִϴȴ{tmf_XQJC<5.'  ﳔ賔᳔ڳӳ̳ųxqjc\UNG@92+$첔岔޲ײвɲ²|ung`YRKD=6/(! 鱔ⱔ۱ԱͱƱyrkd]VOHA:3,% 气߰ذѰʰð}vohaZSLE>70)" ꯔ㯔ܯկίǯzsle^WPIB;4-& 箔ஔٮҮˮĮ~wpib[TMF?81*#뭔䭔ݭ֭ϭȭ{tmf_XQJC<5.'  ﬔ謔ᬔڬӬ̬Ŭxqjc\UNG@92+$쫔嫔ޫ׫Ыɫ«|ung`YRKD=6/(! 骔⪔۪Ԫͪƪyrkd]VOHA:3,% 橔ߩةѩʩé}vohaZSLE>70)" ꨔ㨔ܨըΨǨzsle^WPIB;4-& 秔৔٧ҧ˧ħ~wpib[TMF?81*#릔䦔ݦ֦ϦȦ{tmf_XQJC<5.'  凜襔ᥔڥӥ̥ťxqjc\UNG@92+$줔夔ޤפФɤ¤|ung`YRKD=6/(! 飔⣔ۣԣͣƣyrkd]VOHA:3,% 梔ߢآѢʢâ}vohaZSLE>70)" ꡔ㡔ܡաΡǡzsle^WPIB;4-& 研ࠔ٠ҠˠĠ~wpib[TMF?81*#럔䟔ݟ֟ϟȟ{tmf_XQJC<5.'  螔បڞӞ̞Şxqjc\UNG@92+$읔坔ޝםНɝ|ung`YRKD=6/(! 霔✔ۜԜ͜Ɯyrkd]VOHA:3,% 훔曔ߛ؛ћʛÛ}vohaZSLE>70)" Ꚕ㚔ܚ՚Κǚzsle^WPIB;4-& 癔ٙҙ˙ę~wpib[TMF?81*#똔䘔ݘ֘ϘȘ{tmf_XQJC<5.'  藔ᗔڗӗ̗ŗxqjc\UNG@92+$얔喔ޖזЖɖ–|ung`YRKD=6/(! 镔╔ەԕ͕ƕyrkd]VOHA:3,% 픔攔ߔؔєʔÔ}vohaZSLE>70)" ꓔ㓔ܓՓΓǓzsle^WPIB;4-& 璔ْҒ˒Ē~wpib[TMF?81*#둔䑔ݑ֑ϑȑ{tmf_XQJC<5.'  萔ᐔڐӐ̐Őxqjc\UNG@92+$쏔叔ޏ׏Џɏ|ung`YRKD=6/(! 鎔⎔ێԎ͎Ǝyrkd]VOHA:3,% 퍔捔ߍ؍эʍÍ}vohaZSLE>70)" ꌔ㌔܌ՌΌnjzsle^WPIB;4-& 狔ًҋˋċ~wpib[TMF?81*#는䊔݊֊ϊȊ{tmf_XQJC<5.'  艔ቔډӉ̉ʼnxqjc\UNG@92+$숔刔ވ׈ЈɈˆ|ung`YRKD=6/(! 釔⇔ۇԇ͇Ƈyrkd]VOHA:3,% 톔憔߆؆цʆÆ}vohaZSLE>70)" ꅔㅔ܅Յ΅Džzsle^WPIB;4-& 焔ل҄˄Ą~wpib[TMF?81*#냔䃔݃փσȃ{tmf_XQJC<5.'  肔႔ڂӂ̂łxqjc\UNG@92+$쁔偔ށׁЁɁ|ung`YRKD=6/(! 途—ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ߓߓߓߓߓߓߓߓߓߓߓߓߓߓߓߓߓߓߓyߓrߓkߓdߓ]ߓVߓOߓHߓAߓ:ߓ3ߓ,ߓ%ߓߓߓߓ ߓߓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓ}ޓvޓoޓhޓaޓZޓSޓLޓEޓ>ޓ7ޓ0ޓ)ޓ"ޓޓޓ ޓޓݓݓݓݓݓݓݓݓݓݓݓݓݓݓݓݓݓݓݓzݓsݓlݓeݓ^ݓWݓPݓIݓBݓ;ݓ4ݓ-ݓ&ݓݓݓݓ ݓݓܓܓܓܓܓܓܓܓܓܓܓܓܓܓܓܓܓܓ~ܓwܓpܓiܓbܓ[ܓTܓMܓFܓ?ܓ8ܓ1ܓ*ܓ#ܓܓܓܓܓܓۓۓۓۓۓۓۓۓۓۓۓۓۓۓۓۓۓۓ{ۓtۓmۓfۓ_ۓXۓQۓJۓCۓ<ۓ5ۓ.ۓ'ۓ ۓۓۓ ۓۓړړړړړړړړړړړړړړړړړړړxړqړjړcړ\ړUړNړGړ@ړ9ړ2ړ+ړ$ړړړړړړٓٓٓٓٓٓٓٓٓٓٓٓٓٓٓٓٓٓ|ٓuٓnٓgٓ`ٓYٓRٓKٓDٓ=ٓ6ٓ/ٓ(ٓ!ٓٓٓ ٓٓؓؓؓؓؓؓؓؓؓؓؓؓؓؓؓؓؓؓؓyؓrؓkؓdؓ]ؓVؓOؓHؓAؓ:ؓ3ؓ,ؓ%ؓؓؓؓ ؓؓדדדדדדדדדדדדדדדדדד}דvדoדhדaדZדSדLדEד>ד7ד0ד)ד"דדד דד֓֓֓֓֓֓֓֓֓֓֓֓֓֓֓֓֓֓֓z֓s֓l֓e֓^֓W֓P֓I֓B֓;֓4֓-֓&֓֓֓֓ ֓֓ՓՓՓՓՓՓՓՓՓՓՓՓՓՓՓՓՓՓ~ՓwՓpՓiՓbՓ[ՓTՓMՓFՓ?Փ8Փ1Փ*Փ#ՓՓՓՓՓՓԓԓԓԓԓԓԓԓԓԓԓԓԓԓԓԓԓԓ{ԓtԓmԓfԓ_ԓXԓQԓJԓCԓ<ԓ5ԓ.ԓ'ԓ ԓԓԓ ԓԓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓxӓqӓjӓcӓ\ӓUӓNӓGӓ@ӓ9ӓ2ӓ+ӓ$ӓӓӓӓӓӓғғғғғғғғғғғғғғғғғғ|ғuғnғgғ`ғYғRғKғDғ=ғ6ғ/ғ(ғ!ғғғ ғғѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓyѓrѓkѓdѓ]ѓVѓOѓHѓAѓ:ѓ3ѓ,ѓ%ѓѓѓѓ ѓѓГГГГГГГГГГГГГГГГГГ}ГvГoГhГaГZГSГLГEГ>Г7Г0Г)Г"ГГГ ГГϓϓϓϓϓϓϓϓϓϓϓϓϓϓϓϓϓϓϓzϓsϓlϓeϓ^ϓWϓPϓIϓBϓ;ϓ4ϓ-ϓ&ϓϓϓϓ ϓϓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓ~ΓwΓpΓiΓbΓ[ΓTΓMΓFΓ?Γ8Γ1Γ*Γ#ΓΓΓΓΓΓ͓͓͓͓͓͓͓͓͓͓͓͓͓͓͓͓͓͓{͓t͓m͓f͓_͓X͓Q͓J͓C͓<͓5͓.͓'͓ ͓͓͓ ͓͓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓x̓q̓j̓c̓\̓U̓N̓G̓@̓9̓2̓+̓$̓̓̓̓̓̓˓˓˓˓˓˓˓˓˓˓˓˓˓˓˓˓˓˓|˓u˓n˓g˓`˓Y˓R˓K˓D˓=˓6˓/˓(˓!˓˓˓ ˓˓ʓʓʓʓʓʓʓʓʓʓʓʓʓʓʓʓʓʓʓyʓrʓkʓdʓ]ʓVʓOʓHʓAʓ:ʓ3ʓ,ʓ%ʓʓʓʓ ʓʓɓɓɓɓɓɓɓɓɓɓɓɓɓɓɓɓɓɓ}ɓvɓoɓhɓaɓZɓSɓLɓEɓ>ɓ7ɓ0ɓ)ɓ"ɓɓɓ ɓɓȓȓȓȓȓȓȓȓȓȓȓȓȓȓȓȓȓȓȓzȓsȓlȓeȓ^ȓWȓPȓIȓBȓ;ȓ4ȓ-ȓ&ȓȓȓȓ ȓȓǓǓǓǓǓǓǓǓǓǓǓǓǓǓǓǓǓǓ~ǓwǓpǓiǓbǓ[ǓTǓMǓFǓ?Ǔ8Ǔ1Ǔ*Ǔ#ǓǓǓǓǓǓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓƓ{ƓtƓmƓfƓ_ƓXƓQƓJƓCƓ<Ɠ5Ɠ.Ɠ'Ɠ ƓƓƓ ƓƓœœœœœœœœœœœœœœœœœœœxœqœjœcœ\œUœNœGœ@œ9œ2œ+œ$œœœœœœēēēēēēēēēēēēēēēēēē|ēuēnēgē`ēYēRēKēDē=ē6ē/ē(ē!ēēē ēēÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓ““““““““““““““““““}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““zsle^WPIB;4-& ~wpib[TMF?81*#뿓俓ݿֿϿȿ{tmf_XQJC<5.'  モ输ᾓھӾ̾žxqjc\UNG@92+$콓当޽׽нɽ½|ung`YRKD=6/(! 鼓⼓ۼԼͼƼyrkd]VOHA:3,% 滓߻ػѻʻû}vohaZSLE>70)" 꺓㺓ܺպκǺzsle^WPIB;4-& 繓๓ٹҹ˹Ĺ~wpib[TMF?81*#븓专ݸָϸȸ{tmf_XQJC<5.'  ﷓跓ᷓڷӷ̷ŷxqjc\UNG@92+$춓嶓޶׶жɶ¶|ung`YRKD=6/(! 鵓ⵓ۵Ե͵Ƶyrkd]VOHA:3,% 洓ߴشѴʴô}vohaZSLE>70)" 곓㳓ܳճγdzzsle^WPIB;4-& 粓ಓٲҲ˲IJ~wpib[TMF?81*#뱓䱓ݱֱϱȱ{tmf_XQJC<5.'  ﰓ谓ᰓڰӰ̰Űxqjc\UNG@92+$쯓寓ޯׯЯɯ¯|ung`YRKD=6/(! 鮓⮓ۮԮͮƮyrkd]VOHA:3,% 歓߭حѭʭí}vohaZSLE>70)" ꬓ㬓ܬլάǬzsle^WPIB;4-& 竓૓٫ҫ˫ī~wpib[TMF?81*#몓䪓ݪ֪ϪȪ{tmf_XQJC<5.'  禎詓ᩓکө̩ũxqjc\UNG@92+$쨓娓ިרШɨ¨|ung`YRKD=6/(! 駓⧓ۧԧͧƧyrkd]VOHA:3,% 榓ߦئѦʦæ}vohaZSLE>70)" ꥓㥓ܥեΥǥzsle^WPIB;4-& 礓ओ٤ҤˤĤ~wpib[TMF?81*#룓䣓ݣ֣ϣȣ{tmf_XQJC<5.'  袓ᢓڢӢ̢Ţxqjc\UNG@92+$졓塓ޡסСɡ¡|ung`YRKD=6/(! 頓⠓۠Ԡ͠Ơyrkd]VOHA:3,% ퟓ染ߟ؟џʟß}vohaZSLE>70)" ꞓ㞓ܞ՞ΞǞzsle^WPIB;4-& 睓ٝҝ˝ĝ~wpib[TMF?81*#뜓䜓ݜ֜ϜȜ{tmf_XQJC<5.'  蛓ᛓڛӛ̛śxqjc\UNG@92+$욓嚓ޚךКɚš|ung`YRKD=6/(! 陓♓ۙԙ͙ƙyrkd]VOHA:3,% 혓易ߘؘјʘØ}vohaZSLE>70)" ꗓ㗓ܗ՗ΗǗzsle^WPIB;4-& 疓ٖҖ˖Ė~wpib[TMF?81*#땓䕓ݕ֕ϕȕ{tmf_XQJC<5.'  蔓ᔓڔӔ̔Ŕxqjc\UNG@92+$쓓哓ޓדГɓ“|ung`YRKD=6/(! 钓⒓ےԒ͒ƒyrkd]VOHA:3,% 푓摓ߑؑёʑÑ}vohaZSLE>70)" ꐓ㐓ܐՐΐǐzsle^WPIB;4-& 珓ُҏˏď~wpib[TMF?81*#뎓䎓ݎ֎ώȎ{tmf_XQJC<5.'  荓ፓڍӍ̍ōxqjc\UNG@92+$쌓匓ތ׌ЌɌŒ|ung`YRKD=6/(! 鋓⋓ۋԋ͋Ƌyrkd]VOHA:3,% 튓抓ߊ؊ъʊÊ}vohaZSLE>70)" ꉓ㉓܉ՉΉljzsle^WPIB;4-& 爓و҈ˈĈ~wpib[TMF?81*#뇓䇓݇ևχȇ{tmf_XQJC<5.'  膓ᆓچӆ̆ņxqjc\UNG@92+$셓兓ޅׅЅɅ…|ung`YRKD=6/(! 鄓ℓۄԄ̈́Ƅyrkd]VOHA:3,% 탓惓߃؃уʃÃ}vohaZSLE>70)" ꂓん܂Ղ΂ǂzsle^WPIB;4-& 灓فҁˁā~wpib[TMF?81*#뀓䀓݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ߒߒߒߒߒߒߒߒߒߒߒߒߒߒߒߒߒߒ{ߒtߒmߒfߒ_ߒXߒQߒJߒCߒ<ߒ5ߒ.ߒ'ߒ ߒߒߒ ߒߒޒޒޒޒޒޒޒޒޒޒޒޒޒޒޒޒޒޒޒxޒqޒjޒcޒ\ޒUޒNޒGޒ@ޒ9ޒ2ޒ+ޒ$ޒޒޒޒޒޒݒݒݒݒݒݒݒݒݒݒݒݒݒݒݒݒݒݒ|ݒuݒnݒgݒ`ݒYݒRݒKݒDݒ=ݒ6ݒ/ݒ(ݒ!ݒݒݒ ݒݒܒܒܒܒܒܒܒܒܒܒܒܒܒܒܒܒܒܒܒyܒrܒkܒdܒ]ܒVܒOܒHܒAܒ:ܒ3ܒ,ܒ%ܒܒܒܒ ܒܒےےےےےےےےےےےےےےےےےے}ےvےoےhےaےZےSےLےEے>ے7ے0ے)ے"ےےے ےےڒڒڒڒڒڒڒڒڒڒڒڒڒڒڒڒڒڒڒzڒsڒlڒeڒ^ڒWڒPڒIڒBڒ;ڒ4ڒ-ڒ&ڒڒڒڒ ڒڒْْْْْْْْْْْْْْْْْْ~ْwْpْiْbْ[ْTْMْFْ?ْ8ْ1ْ*ْ#ْْْْْْؒؒؒؒؒؒؒؒؒؒؒؒؒؒؒؒؒؒ{ؒtؒmؒfؒ_ؒXؒQؒJؒCؒ<ؒ5ؒ.ؒ'ؒ ؒؒؒ ؒؒגגגגגגגגגגגגגגגגגגגxגqגjגcג\גUגNגGג@ג9ג2ג+ג$גגגגגג֒֒֒֒֒֒֒֒֒֒֒֒֒֒֒֒֒֒|֒u֒n֒g֒`֒Y֒R֒K֒D֒=֒6֒/֒(֒!֒֒֒ ֒֒ՒՒՒՒՒՒՒՒՒՒՒՒՒՒՒՒՒՒՒyՒrՒkՒdՒ]ՒVՒOՒHՒAՒ:Ւ3Ւ,Ւ%ՒՒՒՒ ՒՒԒԒԒԒԒԒԒԒԒԒԒԒԒԒԒԒԒԒ}ԒvԒoԒhԒaԒZԒSԒLԒEԒ>Ԓ7Ԓ0Ԓ)Ԓ"ԒԒԒ ԒԒӒӒӒӒӒӒӒӒӒӒӒӒӒӒӒӒӒӒӒzӒsӒlӒeӒ^ӒWӒPӒIӒBӒ;Ӓ4Ӓ-Ӓ&ӒӒӒӒ ӒӒҒҒҒҒҒҒҒҒҒҒҒҒҒҒҒҒҒҒ~ҒwҒpҒiҒbҒ[ҒTҒMҒFҒ?Ғ8Ғ1Ғ*Ғ#ҒҒҒҒҒҒђђђђђђђђђђђђђђђђђђ{ђtђmђfђ_ђXђQђJђCђ<ђ5ђ.ђ'ђ ђђђ ђђВВВВВВВВВВВВВВВВВВВxВqВjВcВ\ВUВNВGВ@В9В2В+В$ВВВВВВϒϒϒϒϒϒϒϒϒϒϒϒϒϒϒϒϒϒ|ϒuϒnϒgϒ`ϒYϒRϒKϒDϒ=ϒ6ϒ/ϒ(ϒ!ϒϒϒ ϒϒΒΒΒΒΒΒΒΒΒΒΒΒΒΒΒΒΒΒΒyΒrΒkΒdΒ]ΒVΒOΒHΒAΒ:Β3Β,Β%ΒΒΒΒ ΒΒ͒͒͒͒͒͒͒͒͒͒͒͒͒͒͒͒͒͒}͒v͒o͒h͒a͒Z͒S͒L͒E͒>͒7͒0͒)͒"͒͒͒ ͒͒̒̒̒̒̒̒̒̒̒̒̒̒̒̒̒̒̒̒̒z̒s̒l̒e̒^̒W̒P̒I̒B̒;̒4̒-̒&̒̒̒̒ ̒̒˒˒˒˒˒˒˒˒˒˒˒˒˒˒˒˒˒˒~˒w˒p˒i˒b˒[˒T˒M˒F˒?˒8˒1˒*˒#˒˒˒˒˒˒ʒʒʒʒʒʒʒʒʒʒʒʒʒʒʒʒʒʒ{ʒtʒmʒfʒ_ʒXʒQʒJʒCʒ<ʒ5ʒ.ʒ'ʒ ʒʒʒ ʒʒɒɒɒɒɒɒɒɒɒɒɒɒɒɒɒɒɒɒɒxɒqɒjɒcɒ\ɒUɒNɒGɒ@ɒ9ɒ2ɒ+ɒ$ɒɒɒɒɒɒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒȒ|ȒuȒnȒgȒ`ȒYȒRȒKȒDȒ=Ȓ6Ȓ/Ȓ(Ȓ!ȒȒȒ ȒȒǒǒǒǒǒǒǒǒǒǒǒǒǒǒǒǒǒǒǒyǒrǒkǒdǒ]ǒVǒOǒHǒAǒ:ǒ3ǒ,ǒ%ǒǒǒǒ ǒǒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ}ƒvƒoƒhƒaƒZƒSƒLƒEƒ>ƒ7ƒ0ƒ)ƒ"ƒƒƒ ƒƒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒĒĒĒĒĒĒĒĒĒĒĒĒĒĒĒĒĒĒ~ĒwĒpĒiĒbĒ[ĒTĒMĒFĒ?Ē8Ē1Ē*Ē#ĒĒĒĒĒĒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒ{ÒtÒmÒfÒ_ÒXÒQÒJÒCÒ<Ò5Ò.Ò'Ò ÒÒÒ ÒÒ’’’’’’’’’’’’’’’’’’’x’q’j’c’\’U’N’G’@’9’2’+’$’’’’’’|ung`YRKD=6/(! yrkd]VOHA:3,% 濒߿ؿѿʿÿ}vohaZSLE>70)" 꾒㾒ܾվξǾzsle^WPIB;4-& 罒དྷٽҽ˽Ľ~wpib[TMF?81*#뼒伒ݼּϼȼ{tmf_XQJC<5.'  ﻒ軒Ồڻӻ̻Żxqjc\UNG@92+$캒庒޺׺кɺº|ung`YRKD=6/(! 鹒⹒۹Թ͹ƹyrkd]VOHA:3,% 渒߸ظѸʸø}vohaZSLE>70)" 귒㷒ܷշηǷzsle^WPIB;4-& 綒ඒٶҶ˶Ķ~wpib[TMF?81*#뵒䵒ݵֵϵȵ{tmf_XQJC<5.'  ﴒ贒ᴒڴӴ̴Ŵxqjc\UNG@92+$쳒峒޳׳гɳ³|ung`YRKD=6/(! 鲒Ⲓ۲ԲͲƲyrkd]VOHA:3,% 汒߱رѱʱñ}vohaZSLE>70)" 값㰒ܰհΰǰzsle^WPIB;4-& 篒௒ٯү˯į~wpib[TMF?81*#뮒䮒ݮ֮ϮȮ{tmf_XQJC<5.'  ﭒ譒᭒ڭӭ̭ŭxqjc\UNG@92+$쬒嬒ެ׬Ьɬ¬|ung`YRKD=6/(! 髒⫒۫ԫͫƫyrkd]VOHA:3,% 檒ߪتѪʪê}vohaZSLE>70)" ꩒㩒ܩթΩǩzsle^WPIB;4-& 稒਒٨Ҩ˨Ĩ~wpib[TMF?81*#맒䧒ݧ֧ϧȧ{tmf_XQJC<5.'  漣覒ᦒڦӦ̦Ŧxqjc\UNG@92+$쥒奒ޥץХɥ¥|ung`YRKD=6/(! 餒⤒ۤԤͤƤyrkd]VOHA:3,% 棒ߣأѣʣã}vohaZSLE>70)" ꢒ㢒ܢբ΢Ǣzsle^WPIB;4-& 硒ࡒ١ҡˡġ~wpib[TMF?81*#렒䠒ݠ֠ϠȠ{tmf_XQJC<5.'  蟒្ڟӟ̟şxqjc\UNG@92+$잒垒ޞמОɞž|ung`YRKD=6/(! 青❒۝ԝ͝Ɲyrkd]VOHA:3,% 휒朒ߜ؜ќʜÜ}vohaZSLE>70)" ꛒ㛒ܛ՛ΛǛzsle^WPIB;4-& 皒ٚҚ˚Ě~wpib[TMF?81*#뙒䙒ݙ֙ϙș{tmf_XQJC<5.'  蘒ᘒژӘ̘Řxqjc\UNG@92+$엒嗒ޗחЗɗ—|ung`YRKD=6/(! 閒▒ۖԖ͖Ɩyrkd]VOHA:3,% 핒敒ߕؕѕʕÕ}vohaZSLE>70)" ꔒ㔒ܔՔΔǔzsle^WPIB;4-& 瓒ٓғ˓ē~wpib[TMF?81*#뒒䒒ݒ֒ϒȒ{tmf_XQJC<5.'  葒ᑒڑӑ̑őxqjc\UNG@92+$쐒吒ސאАɐ|ung`YRKD=6/(! 鏒⏒ۏԏ͏Əyrkd]VOHA:3,% 펒排ߎ؎юʎÎ}vohaZSLE>70)" ꍒ㍒܍Ս΍Ǎzsle^WPIB;4-& 猒ٌҌˌČ~wpib[TMF?81*#닒䋒݋֋ϋȋ{tmf_XQJC<5.'  芒ኒڊӊ̊Ŋxqjc\UNG@92+$쉒剒މ׉Љɉ‰|ung`YRKD=6/(! 鈒−ۈԈ͈ƈyrkd]VOHA:3,% 퇒懒߇؇чʇÇ}vohaZSLE>70)" ꆒ㆒܆ՆΆdžzsle^WPIB;4-& 煒م҅˅ą~wpib[TMF?81*#넒䄒݄քτȄ{tmf_XQJC<5.'  胒გڃӃ̃Ńxqjc\UNG@92+$삒傒ނׂЂɂ‚|ung`YRKD=6/(! 遒⁒ہԁ́Ɓyrkd]VOHA:3,% 퀒怒߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߑߑߑߑߑߑߑߑߑߑߑߑߑߑߑߑߑߑ}ߑvߑoߑhߑaߑZߑSߑLߑEߑ>ߑ7ߑ0ߑ)ߑ"ߑߑߑ ߑߑޑޑޑޑޑޑޑޑޑޑޑޑޑޑޑޑޑޑޑzޑsޑlޑeޑ^ޑWޑPޑIޑBޑ;ޑ4ޑ-ޑ&ޑޑޑޑ ޑޑݑݑݑݑݑݑݑݑݑݑݑݑݑݑݑݑݑݑ~ݑwݑpݑiݑbݑ[ݑTݑMݑFݑ?ݑ8ݑ1ݑ*ݑ#ݑݑݑݑݑݑܑܑܑܑܑܑܑܑܑܑܑܑܑܑܑܑܑܑ{ܑtܑmܑfܑ_ܑXܑQܑJܑCܑ<ܑ5ܑ.ܑ'ܑ ܑܑܑ ܑܑۑۑۑۑۑۑۑۑۑۑۑۑۑۑۑۑۑۑۑxۑqۑjۑcۑ\ۑUۑNۑGۑ@ۑ9ۑ2ۑ+ۑ$ۑۑۑۑۑۑڑڑڑڑڑڑڑڑڑڑڑڑڑڑڑڑڑڑ|ڑuڑnڑgڑ`ڑYڑRڑKڑDڑ=ڑ6ڑ/ڑ(ڑ!ڑڑڑ ڑڑّّّّّّّّّّّّّّّّّّّyّrّkّdّ]ّVّOّHّAّ:ّ3ّ,ّ%ّّّّ ّّؑؑؑؑؑؑؑؑؑؑؑؑؑؑؑؑؑؑ}ؑvؑoؑhؑaؑZؑSؑLؑEؑ>ؑ7ؑ0ؑ)ؑ"ؑؑؑ ؑؑבבבבבבבבבבבבבבבבבבבzבsבlבeב^בWבPבIבBב;ב4ב-ב&בבבב בב֑֑֑֑֑֑֑֑֑֑֑֑֑֑֑֑֑֑~֑w֑p֑i֑b֑[֑T֑M֑F֑?֑8֑1֑*֑#֑֑֑֑֑֑ՑՑՑՑՑՑՑՑՑՑՑՑՑՑՑՑՑՑ{ՑtՑmՑfՑ_ՑXՑQՑJՑCՑ<Ց5Ց.Ց'Ց ՑՑՑ ՑՑԑԑԑԑԑԑԑԑԑԑԑԑԑԑԑԑԑԑԑxԑqԑjԑcԑ\ԑUԑNԑGԑ@ԑ9ԑ2ԑ+ԑ$ԑԑԑԑԑԑӑӑӑӑӑӑӑӑӑӑӑӑӑӑӑӑӑӑ|ӑuӑnӑgӑ`ӑYӑRӑKӑDӑ=ӑ6ӑ/ӑ(ӑ!ӑӑӑ ӑӑґґґґґґґґґґґґґґґґґґґyґrґkґdґ]ґVґOґHґAґ:ґ3ґ,ґ%ґґґґ ґґёёёёёёёёёёёёёёёёёё}ёvёoёhёaёZёSёLёEё>ё7ё0ё)ё"ёёё ёёБББББББББББББББББББzБsБlБeБ^БWБPБIБBБ;Б4Б-Б&ББББ ББϑϑϑϑϑϑϑϑϑϑϑϑϑϑϑϑϑϑ~ϑwϑpϑiϑbϑ[ϑTϑMϑFϑ?ϑ8ϑ1ϑ*ϑ#ϑϑϑϑϑϑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑ{ΑtΑmΑfΑ_ΑXΑQΑJΑCΑ<Α5Α.Α'Α ΑΑΑ ΑΑ͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑x͑q͑j͑c͑\͑U͑N͑G͑@͑9͑2͑+͑$͑͑͑͑͑͑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑|̑ȗn̑g̑`̑Y̑ȒK̑D̑=̑6̑/̑(̑!̑̑̑ ̑̑ˑˑˑˑˑˑˑˑˑˑˑˑˑˑˑˑˑˑˑyˑrˑkˑdˑ]ˑVˑOˑHˑAˑ:ˑ3ˑ,ˑ%ˑˑˑˑ ˑˑʑʑʑʑʑʑʑʑʑʑʑʑʑʑʑʑʑʑ}ʑvʑoʑhʑaʑZʑSʑLʑEʑ>ʑ7ʑ0ʑ)ʑ"ʑʑʑ ʑʑɑɑɑɑɑɑɑɑɑɑɑɑɑɑɑɑɑɑɑzɑsɑlɑeɑ^ɑWɑPɑIɑBɑ;ɑ4ɑ-ɑ&ɑɑɑɑ ɑɑȑȑȑȑȑȑȑȑȑȑȑȑȑȑȑȑȑȑ~ȑwȑpȑiȑbȑ[ȑTȑMȑFȑ?ȑ8ȑ1ȑ*ȑ#ȑȑȑȑȑȑǑǑǑǑǑǑǑǑǑǑǑǑǑǑǑǑǑǑ{ǑtǑmǑfǑ_ǑXǑQǑJǑCǑ<Ǒ5Ǒ.Ǒ'Ǒ ǑǑǑ ǑǑƑƑƑƑƑƑƑƑƑƑƑƑƑƑƑƑƑƑƑxƑqƑjƑcƑ\ƑUƑNƑGƑ@Ƒ9Ƒ2Ƒ+Ƒ$ƑƑƑƑƑƑőőőőőőőőőőőőőőőőőő|őuőnőgő`őYőRőKőDő=ő6ő/ő(ő!őőő őőđđđđđđđđđđđđđđđđđđđyđrđkđdđ]đVđOđHđAđ:đ3đ,đ%đđđđ đđÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ}ÑvÑoÑhÑaÑZÑSÑLÑEÑ>Ñ7Ñ0Ñ)Ñ"ÑÑÑ ÑÑ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘z‘s‘l‘e‘^‘W‘P‘I‘B‘;‘4‘-‘&‘‘‘‘ ‘‘~wpib[TMF?81*#{tmf_XQJC<5.'  ￑近ῑڿӿ̿ſxqjc\UNG@92+$쾑徑޾׾оɾ¾|ung`YRKD=6/(! 齑⽑۽Խͽƽyrkd]VOHA:3,% 漑߼ؼѼʼü}vohaZSLE>70)" 껑㻑ܻջλǻzsle^WPIB;4-& 纑ຑٺҺ˺ĺ~wpib[TMF?81*#빑乑ݹֹϹȹ{tmf_XQJC<5.'  ︑踑ḑڸӸ̸Ÿxqjc\UNG@92+$췑巑޷׷зɷ·|ung`YRKD=6/(! 鶑ⶑ۶ԶͶƶyrkd]VOHA:3,% 浑ߵصѵʵõ}vohaZSLE>70)" 광㴑ܴմδǴzsle^WPIB;4-& 糑೑ٳҳ˳ij~wpib[TMF?81*#벑䲑ݲֲϲȲ{tmf_XQJC<5.'  ﱑ豑᱑ڱӱ̱űxqjc\UNG@92+$찑少ްװаɰ°|ung`YRKD=6/(! 鯑⯑ۯԯͯƯyrkd]VOHA:3,% 殑߮خѮʮî}vohaZSLE>70)" ꭑ㭑ܭխέǭzsle^WPIB;4-& 笑଑٬ҬˬĬ~wpib[TMF?81*#뫑䫑ݫ֫ϫȫ{tmf_XQJC<5.'  晴誑᪑ڪӪ̪Ūxqjc\UNG@92+$쩑婑ީשЩɩ©|ung`YRKD=6/(! 騑⨑ۨԨͨƨyrkd]VOHA:3,% 槑ߧاѧʧç}vohaZSLE>70)" ꦑ㦑ܦզΦǦzsle^WPIB;4-& 祑॑٥ҥ˥ĥ~wpib[TMF?81*#뤑䤑ݤ֤ϤȤ{tmf_XQJC<5.'  裑ᣑڣӣ̣ţxqjc\UNG@92+$좑墑ޢעТɢ¢|ung`YRKD=6/(! 顑⡑ۡԡ͡ơyrkd]VOHA:3,% 树ߠؠѠʠà}vohaZSLE>70)" ꟑ㟑ܟ՟Οǟzsle^WPIB;4-& 瞑ٞҞ˞Ğ~wpib[TMF?81*#띑䝑ݝ֝ϝȝ{tmf_XQJC<5.'  蜑ᜑڜӜ̜Ŝxqjc\UNG@92+$웑囑ޛכЛɛ›|ung`YRKD=6/(! 隑⚑ۚԚ͚ƚyrkd]VOHA:3,% 홑晑ߙؙљʙÙ}vohaZSLE>70)" ꘑ㘑ܘ՘Θǘzsle^WPIB;4-& 痑ٗҗ˗ė~wpib[TMF?81*#떑䖑ݖ֖ϖȖ{tmf_XQJC<5.'  蕑ᕑڕӕ̕ŕxqjc\UNG@92+$씑唑ޔהДɔ”|ung`YRKD=6/(! 铑ⓑۓԓ͓Ɠyrkd]VOHA:3,% 풑撑ߒؒђʒÒ}vohaZSLE>70)" ꑑ㑑ܑՑΑǑzsle^WPIB;4-& 琑ِҐːĐ~wpib[TMF?81*#돑䏑ݏ֏Ϗȏ{tmf_XQJC<5.'  莑᎑ڎӎ̎Ŏxqjc\UNG@92+$썑卑ލ׍Ѝɍ|ung`YRKD=6/(! 錑⌑یԌ͌ƌyrkd]VOHA:3,% 틑拑ߋ؋ыʋË}vohaZSLE>70)" ꊑ㊑܊ՊΊNJzsle^WPIB;4-& 牑ى҉ˉĉ~wpib[TMF?81*#눑䈑݈ֈψȈ{tmf_XQJC<5.'  臑ᇑڇӇ̇Ňxqjc\UNG@92+$솑冑ކ׆ІɆ†|ung`YRKD=6/(! 酑⅑ۅԅͅƅyrkd]VOHA:3,% 턑愑߄؄фʄÄ}vohaZSLE>70)" ꃑパ܃Ճ΃ǃzsle^WPIB;4-& 炑ق҂˂Ă~wpib[TMF?81*#끑䁑݁ցρȁ{tmf_XQJC<5.'  耑ထڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ߐߐߐߐߐߐߐߐߐߐߐߐߐߐߐߐߐߐߐxߐqߐjߐcߐ\ߐUߐNߐGߐ@ߐ9ߐ2ߐ+ߐ$ߐߐߐߐߐߐސސސސސސސސސސސސސސސސސސ|ސuސnސgސ`ސYސRސKސDސ=ސ6ސ/ސ(ސ!ސސސ ސސݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐyݐrݐkݐdݐ]ݐVݐOݐHݐAݐ:ݐ3ݐ,ݐ%ݐݐݐݐ ݐݐܐܐܐܐܐܐܐܐܐܐܐܐܐܐܐܐܐܐ}ܐvܐoܐhܐaܐZܐSܐLܐEܐ>ܐ7ܐ0ܐ)ܐ"ܐܐܐ ܐܐېېېېېېېېېېېېېېېېېېېzېsېlېeې^ېWېPېIېBې;ې4ې-ې&ېېېې ېېڐڐڐڐڐڐڐڐڐڐڐڐڐڐڐڐڐڐ~ڐwڐpڐiڐbڐ[ڐTڐMڐFڐ?ڐ8ڐ1ڐ*ڐ#ڐڐڐڐڐڐِِِِِِِِِِِِِِِِِِ{ِtِmِfِ_ِXِQِJِCِ<ِ5ِ.ِ'ِ ِِِ ِِؐؐؐؐؐؐؐؐؐؐؐؐؐؐؐؐؐؐؐxؐqؐjؐcؐ\ؐUؐNؐGؐ@ؐ9ؐ2ؐ+ؐ$ؐؐؐؐؐؐאאאאאאאאאאאאאאאאאא|אuאnאgא`אYאRאKאDא=א6א/א(א!אאא אא֐֐֐֐֐֐֐֐֐֐֐֐֐֐֐֐֐֐֐y֐r֐k֐d֐]֐V֐O֐H֐A֐:֐3֐,֐%֐֐֐֐ ֐֐ՐՐՐՐՐՐՐՐՐՐՐՐՐՐՐՐՐՐ}ՐvՐoՐhՐaՐZՐSՐLՐEՐ>Ր7Ր0Ր)Ր"ՐՐՐ ՐՐԐԐԐԐԐԐԐԐԐԐԐԐԐԐԐԐԐԐԐzԐsԐlԐeԐ^ԐWԐPԐIԐBԐ;Ԑ4Ԑ-Ԑ&ԐԐԐԐ ԐԐӐӐӐӐӐӐӐӐӐӐӐӐӐӐӐӐӐӐ~ӐwӐpӐiӐbӐ[ӐTӐMӐFӐ?Ӑ8Ӑ1Ӑ*Ӑ#ӐӐӐӐӐӐҐҐҐҐҐҐҐҐҐҐҐҐҐҐҐҐҐҐ{ҐtҐmҐfҐ_ҐXҐQҐJҐCҐ<Ґ5Ґ.Ґ'Ґ ҐҐҐ ҐҐѐѐѐѐѐѐѐѐѐѐѐѐѐѐѐѐѐѐѐxѐqѐjѐcѐ\ѐUѐNѐGѐ@ѐ9ѐ2ѐ+ѐ$ѐѐѐѐѐѐАААААААААААААААААА|АuАnАgА`АYАRАKАDА=А6А/А(А!ААА ААϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐϐyϐrϐkϐdϐ]ϐVϐOϐHϐAϐ:ϐ3ϐ,ϐ%ϐϐϐϐ ϐϐΐΐΐΐΐΐΐΐΐΐΐΐΐΐΐΐΐΐ}ΐvΐoΐhΐaΐZΐSΐLΐEΐ>ΐ7ΐ0ΐ)ΐ"ΐΐΐ ΐΐ͐͐͐͐͐͐͐͐͐͐͐͐͐͐͐͐͐͐͐z͐s͐l͐e͐^͐W͐P͐I͐B͐;͐4͐-͐&͐͐͐͐ ͐͐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐~̐w̐p̐i̐b̐[̐T̐M̐F̐?̐8̐1̐*̐#̐̐̐̐̐̐ːːːːːːːːːːːːːːːːːː{ːtːmːfː_ːXːQːJːCː<ː5ː.ː'ː ːːː ːːʐʐʐʐʐʐʐʐʐʐʐʐʐʐʐʐʐʐʐxʐqʐjʐcʐ\ʐUʐNʐGʐ@ʐ9ʐ2ʐ+ʐ$ʐʐʐʐʐʐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐ|ɐuɐnɐgɐ`ɐYɐRɐKɐDɐ=ɐ6ɐ/ɐ(ɐ!ɐɐɐ ɐɐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐyȐrȐkȐdȐ]ȐVȐOȐHȐAȐ:Ȑ3Ȑ,Ȑ%ȐȐȐȐ ȐȐǐǐǐǐǐǐǐǐǐǐǐǐǐǐǐǐǐǐ}ǐvǐoǐhǐaǐZǐSǐLǐEǐ>ǐ7ǐ0ǐ)ǐ"ǐǐǐ ǐǐƐƐƐƐƐƐƐƐƐƐƐƐƐƐƐƐƐƐƐzƐsƐlƐeƐ^ƐWƐPƐIƐBƐ;Ɛ4Ɛ-Ɛ&ƐƐƐƐ ƐƐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐ~ŐwŐpŐiŐbŐ[ŐTŐMŐFŐ?Ő8Ő1Ő*Ő#ŐŐŐŐŐŐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐ{ĐtĐmĐfĐ_ĐXĐQĐJĐCĐ<Đ5Đ.Đ'Đ ĐĐĐ ĐĐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐxÐqÐjÐcÐ\ÐUÐNÐGÐ@Ð9Ð2Ð+Ð$ÐÐÐÐÐА|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" 꿐㿐ܿտοǿzsle^WPIB;4-& 羐ྐپҾ˾ľ~wpib[TMF?81*#뽐佐ݽֽϽȽ{tmf_XQJC<5.'  0輐ἐڼӼ̼żxqjc\UNG@92+$컐廐޻׻лɻ»|ung`YRKD=6/(! 麐⺐ۺԺͺƺyrkd]VOHA:3,% 湐߹عѹʹù}vohaZSLE>70)" 긐㸐ܸոθǸzsle^WPIB;4-& 緐ැٷҷ˷ķ~wpib[TMF?81*#붐䶐ݶֶ϶ȶ{tmf_XQJC<5.'  ﵐ赐ᵐڵӵ̵ŵxqjc\UNG@92+$촐崐޴״дɴ´|ung`YRKD=6/(! 鳐Ⳑ۳ԳͳƳyrkd]VOHA:3,% 沐߲زѲʲò}vohaZSLE>70)" 걐㱐ܱձαDZzsle^WPIB;4-& 簐ఐٰҰ˰İ~wpib[TMF?81*#믐䯐ݯ֯ϯȯ{tmf_XQJC<5.'  ﮐ讐ᮐڮӮ̮Ůxqjc\UNG@92+$쭐子ޭ׭Эɭ­|ung`YRKD=6/(! 鬐⬐۬ԬͬƬyrkd]VOHA:3,% 櫐߫ثѫʫë}vohaZSLE>70)" ꪐ㪐ܪժΪǪzsle^WPIB;4-& 穐੐٩ҩ˩ĩ~wpib[TMF?81*#먐䨐ݨ֨ϨȨ{tmf_XQJC<5.'  類觐᧐ڧӧ̧ŧxqjc\UNG@92+$즐妐ަצЦɦ¦|ung`YRKD=6/(! 饐⥐ۥԥͥƥyrkd]VOHA:3,% 椐ߤؤѤʤä}vohaZSLE>70)" ꣐㣐ܣգΣǣzsle^WPIB;4-& 碐࢐٢ҢˢĢ~wpib[TMF?81*#롐䡐ݡ֡ϡȡ{tmf_XQJC<5.'  蠐᠐ڠӠ̠Šxqjc\UNG@92+$쟐埐ޟןПɟŸ|ung`YRKD=6/(! 鞐➐۞Ԟ͞ƞyrkd]VOHA:3,% 흐材ߝ؝ѝʝÝ}vohaZSLE>70)" ꜐㜐ܜ՜Μǜzsle^WPIB;4-& 盐ٛқ˛ě~wpib[TMF?81*#뚐䚐ݚ֚ϚȚ{tmf_XQJC<5.'  虐ᙐڙә̙řxqjc\UNG@92+$옐嘐ޘטИɘ˜|ung`YRKD=6/(! 闐◐ۗԗ͗Ɨyrkd]VOHA:3,% 햐斐ߖؖіʖÖ}vohaZSLE>70)" ꕐ㕐ܕՕΕǕzsle^WPIB;4-& 甐ٔҔ˔Ĕ~wpib[TMF?81*#듐䓐ݓ֓ϓȓ{tmf_XQJC<5.'  蒐ᒐڒӒ̒Œxqjc\UNG@92+$쑐呐ޑבБɑ‘|ung`YRKD=6/(! 鐐␐ېԐ͐Ɛyrkd]VOHA:3,% 폐提ߏ؏яʏÏ}vohaZSLE>70)" ꎐ㎐܎ՎΎǎzsle^WPIB;4-& 獐ٍҍˍč~wpib[TMF?81*#댐䌐݌֌όȌ{tmf_XQJC<5.'  苐ዐڋӋ̋ŋxqjc\UNG@92+$슐劐ފ׊ЊɊŠ|ung`YRKD=6/(! 鉐≐ۉԉ͉Ɖyrkd]VOHA:3,% 툐成߈؈шʈÈ}vohaZSLE>70)" ꇐ㇐܇Շ·LJzsle^WPIB;4-& 熐ن҆ˆĆ~wpib[TMF?81*#념䅐݅օυȅ{tmf_XQJC<5.'  脐ᄐڄӄ̄ńxqjc\UNG@92+$샐僐ރ׃ЃɃƒ|ung`YRKD=6/(! 邐ₐۂԂ͂Ƃyrkd]VOHA:3,% 큐恐߁؁сʁÁ}vohaZSLE>70)" ꀐ【܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ߏߏߏߏߏߏߏߏߏߏߏߏߏߏߏߏߏߏߏzߏsߏlߏeߏ^ߏWߏPߏIߏBߏ;ߏ4ߏ-ߏ&ߏߏߏߏ ߏߏޏޏޏޏޏޏޏޏޏޏޏޏޏޏޏޏޏޏ~ޏwޏpޏiޏbޏ[ޏTޏMޏFޏ?ޏ8ޏ1ޏ*ޏ#ޏޏޏޏޏޏݏݏݏݏݏݏݏݏݏݏݏݏݏݏݏݏݏݏ{ݏtݏmݏfݏ_ݏXݏQݏJݏCݏ<ݏ5ݏ.ݏ'ݏ ݏݏݏ ݏݏ܏܏܏܏܏܏܏܏܏܏܏܏܏܏܏܏܏܏܏x܏q܏j܏c܏\܏U܏N܏G܏@܏9܏2܏+܏$܏܏܏܏܏܏ۏۏۏۏۏۏۏۏۏۏۏۏۏۏۏۏۏۏ|ۏuۏnۏgۏ`ۏYۏRۏKۏDۏ=ۏ6ۏ/ۏ(ۏ!ۏۏۏ ۏۏڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏyڏrڏkڏdڏ]ڏVڏOڏHڏAڏ:ڏ3ڏ,ڏ%ڏڏڏڏ ڏڏُُُُُُُُُُُُُُُُُُ}ُvُoُhُaُZُSُLُEُ>ُ7ُ0ُ)ُ"ُُُ ُُ؏؏؏؏؏؏؏؏؏؏؏؏؏؏؏؏؏؏؏z؏s؏l؏e؏^؏W؏P؏I؏B؏;؏4؏-؏&؏؏؏؏ ؏؏׏׏׏׏׏׏׏׏׏׏׏׏׏׏׏׏׏׏~׏w׏p׏i׏b׏[׏T׏M׏F׏?׏8׏1׏*׏#׏׏׏׏׏׏֏֏֏֏֏֏֏֏֏֏֏֏֏֏֏֏֏֏{֏t֏m֏f֏_֏X֏Q֏J֏C֏<֏5֏.֏'֏ ֏֏֏ ֏֏ՏՏՏՏՏՏՏՏՏՏՏՏՏՏՏՏՏՏՏxՏqՏjՏcՏ\ՏUՏNՏGՏ@Տ9Տ2Տ+Տ$ՏՏՏՏՏՏԏԏԏԏԏԏԏԏԏԏԏԏԏԏԏԏԏԏ|ԏuԏnԏgԏ`ԏYԏRԏKԏDԏ=ԏ6ԏ/ԏ(ԏ!ԏԏԏ ԏԏӏӏӏӏӏӏӏӏӏӏӏӏӏӏӏӏӏӏӏyӏrӏkӏdӏ]ӏVӏOӏHӏAӏ:ӏ3ӏ,ӏ%ӏӏӏӏ ӏӏҏҏҏҏҏҏҏҏҏҏҏҏҏҏҏҏҏҏ}ҏvҏoҏhҏaҏZҏSҏLҏEҏ>ҏ7ҏ0ҏ)ҏ"ҏҏҏ ҏҏяяяяяяяяяяяяяяяяяяяzяsяlяeя^яWяPяIяBя;я4я-я&яяяя яяЏЏЏЏЏЏЏЏЏЏЏЏЏЏЏЏЏЏ~ЏwЏpЏiЏbЏ[ЏTЏMЏFЏ?Џ8Џ1Џ*Џ#ЏЏЏЏЏЏϏϏϏϏϏϏϏϏϏϏϏϏϏϏϏϏϏϏ{ϏtϏmϏfϏ_ϏXϏQϏJϏCϏ<Ϗ5Ϗ.Ϗ'Ϗ ϏϏϏ ϏϏΏΏΏΏΏΏΏΏΏΏΏΏΏΏΏΏΏΏΏxΏqΏjΏcΏ\ΏUΏNΏGΏ@Ώ9Ώ2Ώ+Ώ$ΏΏΏΏΏΏ͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏|͏u͏n͏g͏`͏Y͏R͏K͏D͏=͏6͏/͏(͏!͏͏͏ ͏͏̏̏̏̏̏̏̏̏̏̏̏̏̏̏̏̏̏̏̏y̏ȑk̏d̏]̏V̏ȌH̏Ȁ:̏3̏,̏%̏̏̏̏ ̏̏ˏˏˏˏˏˏˏˏˏˏˏˏˏˏˏˏˏˏ}ˏvˏoˏhˏaˏZˏSˏLˏEˏ>ˏ7ˏ0ˏ)ˏ"ˏˏˏ ˏˏʏʏʏʏʏʏʏʏʏʏʏʏʏʏʏʏʏʏʏzʏsʏlʏeʏ^ʏWʏPʏIʏBʏ;ʏ4ʏ-ʏ&ʏʏʏʏ ʏʏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏ~ɏwɏpɏiɏbɏ[ɏTɏMɏFɏ?ɏ8ɏ1ɏ*ɏ#ɏɏɏɏɏɏȏȏȏȏȏȏȏȏȏȏȏȏȏȏȏȏȏȏ{ȏtȏmȏfȏ_ȏXȏQȏJȏCȏ<ȏ5ȏ.ȏ'ȏ ȏȏȏ ȏȏǏǏǏǏǏǏǏǏǏǏǏǏǏǏǏǏǏǏǏxǏqǏjǏcǏ\ǏUǏNǏGǏ@Ǐ9Ǐ2Ǐ+Ǐ$ǏǏǏǏǏǏƏƏƏƏƏƏƏƏƏƏƏƏƏƏƏƏƏƏ|ƏuƏnƏgƏ`ƏYƏRƏKƏDƏ=Ə6Ə/Ə(Ə!ƏƏƏ ƏƏŏŏŏŏŏŏŏŏŏŏŏŏŏŏŏŏŏŏŏyŏrŏkŏdŏ]ŏVŏOŏHŏAŏ:ŏ3ŏ,ŏ%ŏŏŏŏ ŏŏďďďďďďďďďďďďďďďďďď}ďvďoďhďaďZďSďLďEď>ď7ď0ď)ď"ďďď ďďÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏϏ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$쿏忏޿׿пɿ¿|ung`YRKD=6/(! 龏⾏۾Ծ;ƾyrkd]VOHA:3,% 潏߽ؽѽʽý}vohaZSLE>70)" 꼏㼏ܼռμǼzsle^WPIB;4-& 经໏ٻһ˻Ļ~wpib[TMF?81*#뺏亏ݺֺϺȺ{tmf_XQJC<5.'  ﹏蹏ṏڹӹ̹Źxqjc\UNG@92+$츏帏޸׸иɸ¸|ung`YRKD=6/(! 鷏⷏۷ԷͷƷyrkd]VOHA:3,% 涏߶ضѶʶö}vohaZSLE>70)" 굏㵏ܵյεǵzsle^WPIB;4-& 紏ഏٴҴ˴Ĵ~wpib[TMF?81*#볏䳏ݳֳϳȳ{tmf_XQJC<5.'  ﲏ貏᲏ڲӲ̲Ųxqjc\UNG@92+$챏屏ޱױбɱ±|ung`YRKD=6/(! 鰏Ⰿ۰԰Ͱưyrkd]VOHA:3,% 每߯دѯʯï}vohaZSLE>70)" ꮏ㮏ܮծήǮzsle^WPIB;4-& 筏୏٭ҭ˭ĭ~wpib[TMF?81*#묏䬏ݬ֬ϬȬ{tmf_XQJC<5.'  𢡊諏᫏ګӫ̫ūxqjc\UNG@92+$쪏媏ުתЪɪª|ung`YRKD=6/(! 驏⩏۩ԩͩƩyrkd]VOHA:3,% 樏ߨبѨʨè}vohaZSLE>70)" ꧏ㧏ܧէΧǧzsle^WPIB;4-& 福এ٦Ҧ˦Ħ~wpib[TMF?81*#륏䥏ݥ֥ϥȥ{tmf_XQJC<5.'  羅褏ᤏڤӤ̤Ťxqjc\UNG@92+$죏壏ޣףУɣ£|ung`YRKD=6/(! 颏⢏ۢԢ͢Ƣyrkd]VOHA:3,% 桏ߡءѡʡá}vohaZSLE>70)" ꠏ㠏ܠՠΠǠzsle^WPIB;4-& 矏ٟҟ˟ğ~wpib[TMF?81*#랏䞏ݞ֞ϞȞ{tmf_XQJC<5.'  蝏ᝏڝӝ̝ŝxqjc\UNG@92+$윏圏ޜלМɜœ|ung`YRKD=6/(! 雏⛏ۛԛ͛ƛyrkd]VOHA:3,% 횏暏ߚؚњʚÚ}vohaZSLE>70)" ꙏ㙏ܙՙΙǙzsle^WPIB;4-& 瘏٘Ҙ˘Ę~wpib[TMF?81*#뗏䗏ݗ֗ϗȗ{tmf_XQJC<5.'  薏ᖏږӖ̖Ŗxqjc\UNG@92+$앏問ޕוЕɕ•|ung`YRKD=6/(! 锏┏۔Ԕ͔Ɣyrkd]VOHA:3,% 퓏擏ߓؓѓʓÓ}vohaZSLE>70)" ꒏㒏ܒՒΒǒzsle^WPIB;4-& 瑏ّґˑđ~wpib[TMF?81*#됏䐏ݐ֐ϐȐ{tmf_XQJC<5.'  菏Ꮟڏӏ̏ŏxqjc\UNG@92+$쎏厏ގ׎ЎɎŽ|ung`YRKD=6/(! 鍏⍏ۍԍ͍ƍyrkd]VOHA:3,% 팏挏ߌ،ьʌÌ}vohaZSLE>70)" ꋏ㋏܋Ջ΋Njzsle^WPIB;4-& 犏يҊˊĊ~wpib[TMF?81*#뉏䉏݉։ωȉ{tmf_XQJC<5.'  舏ሏڈӈ̈ňxqjc\UNG@92+$쇏减އׇЇɇ‡|ung`YRKD=6/(! 醏↏ۆԆ͆Ɔyrkd]VOHA:3,% 텏慏߅؅хʅÅ}vohaZSLE>70)" ꄏㄏ܄Մ΄DŽzsle^WPIB;4-& 烏ك҃˃ă~wpib[TMF?81*#낏䂏݂ւςȂ{tmf_XQJC<5.'  聏၏ځӁ́Łxqjc\UNG@92+$쀏倏ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$ߎߎߎߎߎߎߎߎߎߎߎߎߎߎߎߎߎߎ|ߎuߎnߎgߎ`ߎYߎRߎKߎDߎ=ߎ6ߎ/ߎ(ߎ!ߎߎߎ ߎߎގގގގގގގގގގގގގގގގގގގyގrގkގdގ]ގVގOގHގAގ:ގ3ގ,ގ%ގގގގ ގގݎݎݎݎݎݎݎݎݎݎݎݎݎݎݎݎݎݎ}ݎvݎoݎhݎaݎZݎSݎLݎEݎ>ݎ7ݎ0ݎ)ݎ"ݎݎݎ ݎݎ܎܎܎܎܎܎܎܎܎܎܎܎܎܎܎܎܎܎܎z܎s܎l܎e܎^܎W܎P܎I܎B܎;܎4܎-܎&܎܎܎܎ ܎܎ێێێێێێێێێێێێێێێێێێ~ێwێpێiێbێ[ێTێMێFێ?ێ8ێ1ێ*ێ#ێێێێێێڎڎڎڎڎڎڎڎڎڎڎڎڎڎڎڎڎڎ{ڎtڎmڎfڎ_ڎXڎQڎJڎCڎ<ڎ5ڎ.ڎ'ڎ ڎڎڎ ڎڎَََََََََََََََََََxَqَjَcَ\َUَNَGَ@َ9َ2َ+َ$ََََََ؎؎؎؎؎؎؎؎؎؎؎؎؎؎؎؎؎؎|؎u؎n؎g؎`؎Y؎R؎K؎D؎=؎6؎/؎(؎!؎؎؎ ؎؎׎׎׎׎׎׎׎׎׎׎׎׎׎׎׎׎׎׎׎y׎r׎k׎d׎]׎V׎O׎H׎A׎:׎3׎,׎%׎׎׎׎ ׎׎֎֎֎֎֎֎֎֎֎֎֎֎֎֎֎֎֎֎}֎v֎o֎h֎a֎Z֎S֎L֎E֎>֎7֎0֎)֎"֎֎֎ ֎֎ՎՎՎՎՎՎՎՎՎՎՎՎՎՎՎՎՎՎՎzՎsՎlՎeՎ^ՎWՎPՎIՎBՎ;Վ4Վ-Վ&ՎՎՎՎ ՎՎԎԎԎԎԎԎԎԎԎԎԎԎԎԎԎԎԎԎ~ԎwԎpԎiԎbԎ[ԎTԎMԎFԎ?Ԏ8Ԏ1Ԏ*Ԏ#ԎԎԎԎԎԎӎӎӎӎӎӎӎӎӎӎӎӎӎӎӎӎӎӎ{ӎtӎmӎfӎ_ӎXӎQӎJӎCӎ<ӎ5ӎ.ӎ'ӎ ӎӎӎ ӎӎҎҎҎҎҎҎҎҎҎҎҎҎҎҎҎҎҎҎҎxҎqҎjҎcҎ\ҎUҎNҎGҎ@Ҏ9Ҏ2Ҏ+Ҏ$ҎҎҎҎҎҎюююююююююююююююююю|юuюnюgю`юYюRюKюDю=ю6ю/ю(ю!ююю ююЎЎЎЎЎЎЎЎЎЎЎЎЎЎЎЎЎЎЎyЎrЎkЎdЎ]ЎVЎOЎHЎAЎ:Ў3Ў,Ў%ЎЎЎЎ ЎЎώώώώώώώώώώώώώώώώώώ}ώvώoώhώaώZώSώLώEώ>ώ7ώ0ώ)ώ"ώώώ ώώΎΎΎΎΎΎΎΎΎΎΎΎΎΎΎΎΎΎΎzΎsΎlΎeΎ^ΎWΎPΎIΎBΎ;Ύ4Ύ-Ύ&ΎΎΎΎ ΎΎ͎͎͎͎͎͎͎͎͎͎͎͎͎͎͎͎͎͎~͎w͎p͎i͎b͎[͎T͎M͎F͎?͎8͎1͎*͎#͎͎͎͎͎͎̎̎̎̎̎̎̎̎̎̎̎̎̎̎̎̎̎̎{̎t̎m̎f̎_̎X̎Q̎J̎C̎<̎5̎.̎'̎ ̎̎̎ ̎̎ˎˎˎˎˎˎˎˎˎˎˎˎˎˎˎˎˎˎˎxˎqˎjˎcˎ\ˎUˎNˎGˎ@ˎ9ˎ2ˎ+ˎ$ˎˎˎˎˎˎʎʎʎʎʎʎʎʎʎʎʎʎʎʎʎʎʎʎ|ʎuʎnʎgʎ`ʎYʎRʎKʎDʎ=ʎ6ʎ/ʎ(ʎ!ʎʎʎ ʎʎɎɎɎɎɎɎɎɎɎɎɎɎɎɎɎɎɎɎɎyɎrɎkɎdɎ]ɎVɎOɎHɎAɎ:Ɏ3Ɏ,Ɏ%ɎɎɎɎ ɎɎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎ}ȎvȎoȎhȎaȎZȎSȎLȎEȎ>Ȏ7Ȏ0Ȏ)Ȏ"ȎȎȎ ȎȎǎǎǎǎǎǎǎǎǎǎǎǎǎǎǎǎǎǎǎzǎsǎlǎeǎ^ǎWǎPǎIǎBǎ;ǎ4ǎ-ǎ&ǎǎǎǎ ǎǎƎƎƎƎƎƎƎƎƎƎƎƎƎƎƎƎƎƎ~ƎwƎpƎiƎbƎ[ƎTƎMƎFƎ?Ǝ8Ǝ1Ǝ*Ǝ#ƎƎƎƎƎƎŎŎŎŎŎŎŎŎŎŎŎŎŎŎŎŎŎŎ{ŎtŎmŎfŎ_ŎXŎQŎJŎCŎ<Ŏ5Ŏ.Ŏ'Ŏ ŎŎŎ ŎŎĎĎĎĎĎĎĎĎĎĎĎĎĎĎĎĎĎĎĎxĎqĎjĎcĎ\ĎUĎNĎGĎ@Ď9Ď2Ď+Ď$ĎĎĎĎĎĎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽ}vohaZSLE>70)" zsle^WPIB;4-& 翎࿎ٿҿ˿Ŀ~wpib[TMF?81*#뾎侎ݾ־ϾȾ{tmf_XQJC<5.'  n轎὎ڽӽ̽Žxqjc\UNG@92+$켎弎޼׼мɼ¼|ung`YRKD=6/(! 黎⻎ۻԻͻƻyrkd]VOHA:3,% 溎ߺغѺʺú}vohaZSLE>70)" 깎㹎ܹչιǹzsle^WPIB;4-& 縎ฎٸҸ˸ĸ~wpib[TMF?81*#뷎䷎ݷַϷȷ{tmf_XQJC<5.'  ﶎ趎ᶎڶӶ̶Ŷxqjc\UNG@92+$쵎嵎޵׵еɵµ|ung`YRKD=6/(! 鴎ⴎ۴Դʹƴyrkd]VOHA:3,% 泎߳سѳʳó}vohaZSLE>70)" 겎㲎ܲղβDzzsle^WPIB;4-& 籎౎ٱұ˱ı~wpib[TMF?81*#밎䰎ݰְϰȰ{tmf_XQJC<5.'  ﯎诎ᯎگӯ̯ůxqjc\UNG@92+$쮎宎ޮ׮Юɮ®|ung`YRKD=6/(! 魎⭎ۭԭͭƭyrkd]VOHA:3,% 欎߬جѬʬì}vohaZSLE>70)" ꫎㫎ܫիΫǫzsle^WPIB;4-& 窎઎٪Ҫ˪Ī~wpib[TMF?81*#멎䩎ݩ֩ϩȩ{tmf_XQJC<5.'  﨎討ᨎڨӨ̨Ũxqjc\UNG@92+$짎姎ާקЧɧ§|ung`YRKD=6/(! 馎⦎ۦԦͦƦyrkd]VOHA:3,% 楎ߥإѥʥå}vohaZSLE>70)" ꤎ㤎ܤդΤǤzsle^WPIB;4-& 磎࣎٣ңˣģ~wpib[TMF?81*#뢎䢎ݢ֢ϢȢ{tmf_XQJC<5.'  衎ᡎڡӡ̡šxqjc\UNG@92+$젎堎ޠנРɠ |ung`YRKD=6/(! 韎⟎۟ԟ͟Ɵyrkd]VOHA:3,% 힎枎ߞ؞ўʞÞ}vohaZSLE>70)" Ꝏ㝎ܝ՝Νǝzsle^WPIB;4-& 眎ٜҜ˜Ĝ~wpib[TMF?81*#뛎䛎ݛ֛ϛț{tmf_XQJC<5.'  蚎ᚎښӚ̚Śxqjc\UNG@92+$왎噎ޙיЙə™|ung`YRKD=6/(! 阎☎ۘԘ͘Ƙyrkd]VOHA:3,% 헎旎ߗؗїʗ×}vohaZSLE>70)" ꖎ㖎ܖՖΖǖzsle^WPIB;4-& 畎ٕҕ˕ĕ~wpib[TMF?81*#딎䔎ݔ֔ϔȔ{tmf_XQJC<5.'  蓎ᓎړӓ̓œxqjc\UNG@92+$쒎咎ޒגВɒ’|ung`YRKD=6/(! 鑎⑎ۑԑ͑Ƒyrkd]VOHA:3,% 퐎搎ߐؐѐʐÐ}vohaZSLE>70)" ꏎ㏎܏ՏΏǏzsle^WPIB;4-& 玎َҎˎĎ~wpib[TMF?81*#덎䍎ݍ֍ύȍ{tmf_XQJC<5.'  茎ጎڌӌ̌Ōxqjc\UNG@92+$싎勎ދ׋Ћɋ‹|ung`YRKD=6/(! 銎⊎ۊԊ͊Ɗyrkd]VOHA:3,% 퉎扎߉؉щʉÉ}vohaZSLE>70)" ꈎ㈎܈ՈΈLjzsle^WPIB;4-& 燎ه҇ˇć~wpib[TMF?81*#놎䆎݆ֆφȆ{tmf_XQJC<5.'  腎ᅎڅӅ̅Ņxqjc\UNG@92+$섎儎ބׄЄɄ„|ung`YRKD=6/(! 郎⃎ۃԃ̓ƃyrkd]VOHA:3,% 킎悎߂؂тʂÂ}vohaZSLE>70)" ꁎぎ܁Ձ΁ǁzsle^WPIB;4-& 瀎ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ߍߍߍߍߍߍߍߍߍߍߍߍߍߍߍߍߍߍ~ߍwߍpߍiߍbߍ[ߍTߍMߍFߍ?ߍ8ߍ1ߍ*ߍ#ߍߍߍߍߍߍލލލލލލލލލލލލލލލލލލ{ލtލmލfލ_ލXލQލJލCލ<ލ5ލ.ލ'ލ ލލލ ލލݍݍݍݍݍݍݍݍݍݍݍݍݍݍݍݍݍݍݍxݍqݍjݍcݍ\ݍUݍNݍGݍ@ݍ9ݍ2ݍ+ݍ$ݍݍݍݍݍݍ܍܍܍܍܍܍܍܍܍܍܍܍܍܍܍܍܍܍|܍u܍n܍g܍`܍Y܍R܍K܍D܍=܍6܍/܍(܍!܍܍܍ ܍܍ۍۍۍۍۍۍۍۍۍۍۍۍۍۍۍۍۍۍۍyۍrۍkۍdۍ]ۍVۍOۍHۍAۍ:ۍ3ۍ,ۍ%ۍۍۍۍ ۍۍڍڍڍڍڍڍڍڍڍڍڍڍڍڍڍڍڍڍ}ڍvڍoڍhڍaڍZڍSڍLڍEڍ>ڍ7ڍ0ڍ)ڍ"ڍڍڍ ڍڍٍٍٍٍٍٍٍٍٍٍٍٍٍٍٍٍٍٍٍzٍsٍlٍeٍ^ٍWٍPٍIٍBٍ;ٍ4ٍ-ٍ&ٍٍٍٍ ٍٍ؍؍؍؍؍؍؍؍؍؍؍؍؍؍؍؍؍؍~؍w؍p؍i؍b؍[؍T؍M؍F؍?؍8؍1؍*؍#؍؍؍؍؍؍׍׍׍׍׍׍׍׍׍׍׍׍׍׍׍׍׍׍{׍t׍m׍f׍_׍X׍Q׍J׍C׍<׍5׍.׍'׍ ׍׍׍ ׍׍֍֍֍֍֍֍֍֍֍֍֍֍֍֍֍֍֍֍֍x֍q֍j֍c֍\֍U֍N֍G֍@֍9֍2֍+֍$֍֍֍֍֍֍ՍՍՍՍՍՍՍՍՍՍՍՍՍՍՍՍՍՍ|ՍuՍnՍgՍ`ՍYՍRՍKՍDՍ=Ս6Ս/Ս(Ս!ՍՍՍ ՍՍԍԍԍԍԍԍԍԍԍԍԍԍԍԍԍԍԍԍԍyԍrԍkԍdԍ]ԍVԍOԍHԍAԍ:ԍ3ԍ,ԍ%ԍԍԍԍ ԍԍӍӍӍӍӍӍӍӍӍӍӍӍӍӍӍӍӍӍ}ӍvӍoӍhӍaӍZӍSӍLӍEӍ>Ӎ7Ӎ0Ӎ)Ӎ"ӍӍӍ ӍӍҍҍҍҍҍҍҍҍҍҍҍҍҍҍҍҍҍҍҍzҍsҍlҍeҍ^ҍWҍPҍIҍBҍ;ҍ4ҍ-ҍ&ҍҍҍҍ ҍҍээээээээээээээээээ~эwэpэiэbэ[эTэMэFэ?э8э1э*э#ээээээЍЍЍЍЍЍЍЍЍЍЍЍЍЍЍЍЍЍ{ЍtЍmЍfЍ_ЍXЍQЍJЍCЍ<Ѝ5Ѝ.Ѝ'Ѝ ЍЍЍ ЍЍύύύύύύύύύύύύύύύύύύύxύqύjύcύ\ύUύNύGύ@ύ9ύ2ύ+ύ$ύύύύύύ΍΍΍΍΍΍΍΍΍΍΍΍΍΍΍΍΍΍|΍u΍n΍g΍`΍Y΍R΍K΍D΍=΍6΍/΍(΍!΍΍΍ ΍΍͍͍͍͍͍͍͍͍͍͍͍͍͍͍͍͍͍͍͍y͍r͍k͍d͍]͍V͍O͍H͍A͍:͍3͍,͍%͍͍͍͍ ͍͍̍̍̍̍̍̍̍̍̍̍̍̍̍̍̍̍̍̍}̍v̍o̍h̍a̍Z̍S̍L̍E̍>̍7̍0̍)̍"̍̍̍ ̍̍ˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍzˍsˍlˍeˍ^ˍWˍPˍIˍBˍ;ˍ4ˍ-ˍ&ˍˍˍˍ ˍˍʍʍʍʍʍʍʍʍʍʍʍʍʍʍʍʍʍʍ~ʍwʍpʍiʍbʍ[ʍTʍMʍFʍ?ʍ8ʍ1ʍ*ʍ#ʍʍʍʍʍʍɍɍɍɍɍɍɍɍɍɍɍɍɍɍɍɍɍɍ{ɍtɍmɍfɍ_ɍXɍQɍJɍCɍ<ɍ5ɍ.ɍ'ɍ ɍɍɍ ɍɍȍȍȍȍȍȍȍȍȍȍȍȍȍȍȍȍȍȍȍxȍqȍjȍcȍ\ȍUȍNȍGȍ@ȍ9ȍ2ȍ+ȍ$ȍȍȍȍȍȍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍ|ǍuǍnǍgǍ`ǍYǍRǍKǍDǍ=Ǎ6Ǎ/Ǎ(Ǎ!ǍǍǍ ǍǍƍƍƍƍƍƍƍƍƍƍƍƍƍƍƍƍƍƍƍyƍrƍkƍdƍ]ƍVƍOƍHƍAƍ:ƍ3ƍ,ƍ%ƍƍƍƍ ƍƍōōōōōōōōōōōōōōōōōō}ōvōoōhōaōZōSōLōEō>ō7ō0ō)ō"ōōō ōōčččččččččččččččččččzčsčlčeč^čWčPčIčBč;č4č-č&čččč ččÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ~ÍwÍpÍiÍbÍ[ÍTÍMÍFÍ?Í8Í1Í*Í#ÍÍÍÍÍ͍{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! 鿍⿍ۿԿͿƿyrkd]VOHA:3,% 澍߾ؾѾʾþ}vohaZSLE>70)" 꽍㽍ܽսνǽzsle^WPIB;4-& 缍།ټҼ˼ļ~wpib[TMF?81*#뻍仍ݻֻϻȻ{tmf_XQJC<5.'  ﺍ躍ẍںӺ̺źxqjc\UNG@92+$칍幍޹׹йɹ¹|ung`YRKD=6/(! 鸍⸍۸Ը͸Ƹyrkd]VOHA:3,% 淍߷طѷʷ÷}vohaZSLE>70)" 궍㶍ܶնζǶzsle^WPIB;4-& 絍്ٵҵ˵ĵ~wpib[TMF?81*#봍䴍ݴִϴȴ{tmf_XQJC<5.'  ﳍ賍᳍ڳӳ̳ųxqjc\UNG@92+$첍岍޲ײвɲ²|ung`YRKD=6/(! 鱍ⱍ۱ԱͱƱyrkd]VOHA:3,% 氍߰ذѰʰð}vohaZSLE>70)" ꯍ㯍ܯկίǯzsle^WPIB;4-& 箍஍ٮҮˮĮ~wpib[TMF?81*#뭍䭍ݭ֭ϭȭ{tmf_XQJC<5.'  ﬍謍ᬍڬӬ̬Ŭxqjc\UNG@92+$쫍嫍ޫ׫Ыɫ«|ung`YRKD=6/(! 骍⪍۪Ԫͪƪyrkd]VOHA:3,% 橍ߩةѩʩé}vohaZSLE>70)" ꨍ㨍ܨըΨǨzsle^WPIB;4-& 种্٧ҧ˧ħ~wpib[TMF?81*#릍䦍ݦ֦ϦȦ{tmf_XQJC<5.'  淚襍᥍ڥӥ̥ťxqjc\UNG@92+$줍复ޤפФɤ¤|ung`YRKD=6/(! 飍⣍ۣԣͣƣyrkd]VOHA:3,% 梍ߢآѢʢâ}vohaZSLE>70)" ꡍ㡍ܡաΡǡzsle^WPIB;4-& 砍ࠍ٠ҠˠĠ~wpib[TMF?81*#럍䟍ݟ֟ϟȟ{tmf_XQJC<5.'  融ឍڞӞ̞Şxqjc\UNG@92+$읍坍ޝםНɝ|ung`YRKD=6/(! 霍✍ۜԜ͜Ɯyrkd]VOHA:3,% 훍曍ߛ؛ћʛÛ}vohaZSLE>70)" ꚍ㚍ܚ՚Κǚzsle^WPIB;4-& 癍ٙҙ˙ę~wpib[TMF?81*#똍䘍ݘ֘ϘȘ{tmf_XQJC<5.'  藍ᗍڗӗ̗ŗxqjc\UNG@92+$얍喍ޖזЖɖ–|ung`YRKD=6/(! 镍╍ەԕ͕ƕyrkd]VOHA:3,% 픍攍ߔؔєʔÔ}vohaZSLE>70)" ꓍㓍ܓՓΓǓzsle^WPIB;4-& 璍ْҒ˒Ē~wpib[TMF?81*#둍䑍ݑ֑ϑȑ{tmf_XQJC<5.'  萍ᐍڐӐ̐Őxqjc\UNG@92+$쏍反ޏ׏Џɏ|ung`YRKD=6/(! 鎍⎍ێԎ͎Ǝyrkd]VOHA:3,% 퍍捍ߍ؍эʍÍ}vohaZSLE>70)" ꌍ㌍܌ՌΌnjzsle^WPIB;4-& 狍ًҋˋċ~wpib[TMF?81*#늍䊍݊֊ϊȊ{tmf_XQJC<5.'  艍ቍډӉ̉ʼnxqjc\UNG@92+$숍刍ވ׈ЈɈˆ|ung`YRKD=6/(! 重⇍ۇԇ͇Ƈyrkd]VOHA:3,% 톍憍߆؆цʆÆ}vohaZSLE>70)" ꅍㅍ܅Յ΅Džzsle^WPIB;4-& 焍ل҄˄Ą~wpib[TMF?81*#냍䃍݃փσȃ{tmf_XQJC<5.'  肍ႍڂӂ̂łxqjc\UNG@92+$쁍偍ށׁЁɁ|ung`YRKD=6/(! 逍‍ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ߌߌߌߌߌߌߌߌߌߌߌߌߌߌߌߌߌߌߌyߌrߌkߌdߌ]ߌVߌOߌHߌAߌ:ߌ3ߌ,ߌ%ߌߌߌߌ ߌߌތތތތތތތތތތތތތތތތތތ}ތvތoތhތaތZތSތLތEތ>ތ7ތ0ތ)ތ"ތތތ ތތ݌݌݌݌݌݌݌݌݌݌݌݌݌݌݌݌݌݌݌z݌s݌l݌e݌^݌W݌P݌I݌B݌;݌4݌-݌&݌݌݌݌ ݌݌܌܌܌܌܌܌܌܌܌܌܌܌܌܌܌܌܌܌~܌w܌p܌i܌b܌[܌T܌M܌F܌?܌8܌1܌*܌#܌܌܌܌܌܌یییییییییییییییییی{یtیmیfی_یXیQیJیCی<ی5ی.ی'ی ییی ییڌڌڌڌڌڌڌڌڌڌڌڌڌڌڌڌڌڌڌxڌqڌjڌcڌ\ڌUڌNڌGڌ@ڌ9ڌ2ڌ+ڌ$ڌڌڌڌڌڌٌٌٌٌٌٌٌٌٌٌٌٌٌٌٌٌٌٌ|ٌuٌnٌgٌ`ٌYٌRٌKٌDٌ=ٌ6ٌ/ٌ(ٌ!ٌٌٌ ٌٌ،،،،،،،،،،،،،،،،،،،y،r،k،d،]،V،O،H،A،:،3،,،%،،،، ،،׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌}׌v׌o׌h׌a׌Z׌S׌L׌E׌>׌7׌0׌)׌"׌׌׌ ׌׌֌֌֌֌֌֌֌֌֌֌֌֌֌֌֌֌֌֌֌z֌s֌l֌e֌^֌W֌P֌I֌B֌;֌4֌-֌&֌֌֌֌ ֌֌ՌՌՌՌՌՌՌՌՌՌՌՌՌՌՌՌՌՌ~ՌwՌpՌiՌbՌ[ՌTՌMՌFՌ?Ռ8Ռ1Ռ*Ռ#ՌՌՌՌՌՌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌ{ԌtԌmԌfԌ_ԌXԌQԌJԌCԌ<Ԍ5Ԍ.Ԍ'Ԍ ԌԌԌ ԌԌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌxӌqӌjӌcӌ\ӌUӌNӌGӌ@ӌ9ӌ2ӌ+ӌ$ӌӌӌӌӌӌҌҌҌҌҌҌҌҌҌҌҌҌҌҌҌҌҌҌ|ҌuҌnҌgҌ`ҌYҌRҌKҌDҌ=Ҍ6Ҍ/Ҍ(Ҍ!ҌҌҌ ҌҌьььььььььььььььььььyьrьkьdь]ьVьOьHьAь:ь3ь,ь%ьььь ььЌЌЌЌЌЌЌЌЌЌЌЌЌЌЌЌЌЌ}ЌvЌoЌhЌaЌZЌSЌLЌEЌ>Ќ7Ќ0Ќ)Ќ"ЌЌЌ ЌЌόόόόόόόόόόόόόόόόόόόzόsόlόeό^όWόPόIόBό;ό4ό-ό&όόόό όόΌΌΌΌΌΌΌΌΌΌΌΌΌΌΌΌΌΌ~ΌwΌpΌiΌbΌ[ΌTΌMΌFΌ?Ό8Ό1Ό*Ό#ΌΌΌΌΌΌ͌͌͌͌͌͌͌͌͌͌͌͌͌͌͌͌͌͌{͌t͌m͌f͌_͌X͌Q͌J͌C͌<͌5͌.͌'͌ ͌͌͌ ͌͌̌̌̌̌̌̌̌̌̌̌̌̌̌̌̌̌̌̌̌x̌q̌ǰč\̌ǓŇǦ@̌9̌2̌+̌$̌̌̌̌̌̌ˌˌˌˌˌˌˌˌˌˌˌˌˌˌˌˌˌˌ|ˌuˌnˌgˌ`ˌYˌRˌKˌDˌ=ˌ6ˌ/ˌ(ˌ!ˌˌˌ ˌˌʌʌʌʌʌʌʌʌʌʌʌʌʌʌʌʌʌʌʌyʌrʌkʌdʌ]ʌVʌOʌHʌAʌ:ʌ3ʌ,ʌ%ʌʌʌʌ ʌʌɌɌɌɌɌɌɌɌɌɌɌɌɌɌɌɌɌɌ}ɌvɌoɌhɌaɌZɌSɌLɌEɌ>Ɍ7Ɍ0Ɍ)Ɍ"ɌɌɌ ɌɌȌȌȌȌȌȌȌȌȌȌȌȌȌȌȌȌȌȌȌzȌsȌlȌeȌ^ȌWȌPȌIȌBȌ;Ȍ4Ȍ-Ȍ&ȌȌȌȌ ȌȌnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnj~njwnjpnjinjbnj[njTnjMnjFnj?nj8nj1nj*nj#njnjnjnjnjnjƌƌƌƌƌƌƌƌƌƌƌƌƌƌƌƌƌƌ{ƌtƌmƌfƌ_ƌXƌQƌJƌCƌ<ƌ5ƌ.ƌ'ƌ ƌƌƌ ƌƌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌxŌqŌjŌcŌ\ŌUŌNŌGŌ@Ō9Ō2Ō+Ō$ŌŌŌŌŌŌČČČČČČČČČČČČČČČČČČ|ČuČnČgČ`ČYČRČKČDČ=Č6Č/Č(Č!ČČČ ČČÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒzsle^WPIB;4-& ~wpib[TMF?81*#뿌俌ݿֿϿȿ{tmf_XQJC<5.'  フ辌ᾌھӾ̾žxqjc\UNG@92+$콌彌޽׽нɽ½|ung`YRKD=6/(! 鼌⼌ۼԼͼƼyrkd]VOHA:3,% 滌߻ػѻʻû}vohaZSLE>70)" 꺌㺌ܺպκǺzsle^WPIB;4-& 繌์ٹҹ˹Ĺ~wpib[TMF?81*#브丌ݸָϸȸ{tmf_XQJC<5.'  ﷌跌᷌ڷӷ̷ŷxqjc\UNG@92+$춌嶌޶׶жɶ¶|ung`YRKD=6/(! 鵌ⵌ۵Ե͵Ƶyrkd]VOHA:3,% 洌ߴشѴʴô}vohaZSLE>70)" 곌㳌ܳճγdzzsle^WPIB;4-& 粌ಌٲҲ˲IJ~wpib[TMF?81*#뱌䱌ݱֱϱȱ{tmf_XQJC<5.'  ﰌ谌ᰌڰӰ̰Űxqjc\UNG@92+$쯌富ޯׯЯɯ¯|ung`YRKD=6/(! 鮌⮌ۮԮͮƮyrkd]VOHA:3,% 歌߭حѭʭí}vohaZSLE>70)" ꬌ㬌ܬլάǬzsle^WPIB;4-& 竌ૌ٫ҫ˫ī~wpib[TMF?81*#몌䪌ݪ֪ϪȪ{tmf_XQJC<5.'  社詌ᩌکө̩ũxqjc\UNG@92+$쨌娌ިרШɨ¨|ung`YRKD=6/(! 駌⧌ۧԧͧƧyrkd]VOHA:3,% 榌ߦئѦʦæ}vohaZSLE>70)" ꥌ㥌ܥեΥǥzsle^WPIB;4-& 礌ऌ٤ҤˤĤ~wpib[TMF?81*#료䣌ݣ֣ϣȣ{tmf_XQJC<5.'  袌ᢌڢӢ̢Ţxqjc\UNG@92+$졌塌ޡסСɡ¡|ung`YRKD=6/(! 頌⠌۠Ԡ͠Ơyrkd]VOHA:3,% ퟌ柌ߟ؟џʟß}vohaZSLE>70)" ꞌ㞌ܞ՞ΞǞzsle^WPIB;4-& 睌ٝҝ˝ĝ~wpib[TMF?81*#뜌䜌ݜ֜ϜȜ{tmf_XQJC<5.'  蛌ᛌڛӛ̛śxqjc\UNG@92+$욌嚌ޚךКɚš|ung`YRKD=6/(! 陌♌ۙԙ͙ƙyrkd]VOHA:3,% 혌昌ߘؘјʘØ}vohaZSLE>70)" ꗌ㗌ܗ՗ΗǗzsle^WPIB;4-& 疌ٖҖ˖Ė~wpib[TMF?81*#때䕌ݕ֕ϕȕ{tmf_XQJC<5.'  蔌ᔌڔӔ̔Ŕxqjc\UNG@92+$쓌哌ޓדГɓ“|ung`YRKD=6/(! 钌⒌ےԒ͒ƒyrkd]VOHA:3,% 푌摌ߑؑёʑÑ}vohaZSLE>70)" ꐌ㐌ܐՐΐǐzsle^WPIB;4-& 珌ُҏˏď~wpib[TMF?81*#뎌䎌ݎ֎ώȎ{tmf_XQJC<5.'  荌ፌڍӍ̍ōxqjc\UNG@92+$쌌匌ތ׌ЌɌŒ|ung`YRKD=6/(! 鋌⋌ۋԋ͋Ƌyrkd]VOHA:3,% 튌抌ߊ؊ъʊÊ}vohaZSLE>70)" ꉌ㉌܉ՉΉljzsle^WPIB;4-& 爌و҈ˈĈ~wpib[TMF?81*#뇌䇌݇ևχȇ{tmf_XQJC<5.'  膌ᆌچӆ̆ņxqjc\UNG@92+$셌兌ޅׅЅɅ…|ung`YRKD=6/(! 鄌ℌۄԄ̈́Ƅyrkd]VOHA:3,% 탌惌߃؃уʃÃ}vohaZSLE>70)" ꂌれ܂Ղ΂ǂzsle^WPIB;4-& 灌فҁˁā~wpib[TMF?81*#뀌䀌݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ߋߋߋߋߋߋߋߋߋߋߋߋߋߋߋߋߋߋ{ߋtߋmߋfߋ_ߋXߋQߋJߋCߋ<ߋ5ߋ.ߋ'ߋ ߋߋߋ ߋߋދދދދދދދދދދދދދދދދދދދxދqދjދcދ\ދUދNދGދ@ދ9ދ2ދ+ދ$ދދދދދދ݋݋݋݋݋݋݋݋݋݋݋݋݋݋݋݋݋݋|݋u݋n݋g݋`݋Y݋R݋K݋D݋=݋6݋/݋(݋!݋݋݋ ݋݋܋܋܋܋܋܋܋܋܋܋܋܋܋܋܋܋܋܋܋y܋r܋k܋d܋]܋V܋O܋H܋A܋:܋3܋,܋%܋܋܋܋ ܋܋ۋۋۋۋۋۋۋۋۋۋۋۋۋۋۋۋۋۋ}ۋvۋoۋhۋaۋZۋSۋLۋEۋ>ۋ7ۋ0ۋ)ۋ"ۋۋۋ ۋۋڋڋڋڋڋڋڋڋڋڋڋڋڋڋڋڋڋڋڋzڋsڋlڋeڋ^ڋWڋPڋIڋBڋ;ڋ4ڋ-ڋ&ڋڋڋڋ ڋڋًًًًًًًًًًًًًًًًًً~ًwًpًiًbً[ًTًMًFً?ً8ً1ً*ً#ًًًًًً؋؋؋؋؋؋؋؋؋؋؋؋؋؋؋؋؋؋{؋t؋m؋f؋_؋X؋Q؋J؋C؋<؋5؋.؋'؋ ؋؋؋ ؋؋׋׋׋׋׋׋׋׋׋׋׋׋׋׋׋׋׋׋׋x׋q׋j׋c׋\׋U׋N׋G׋@׋9׋2׋+׋$׋׋׋׋׋׋֋֋֋֋֋֋֋֋֋֋֋֋֋֋֋֋֋֋|֋u֋n֋g֋`֋Y֋R֋K֋D֋=֋6֋/֋(֋!֋֋֋ ֋֋ՋՋՋՋՋՋՋՋՋՋՋՋՋՋՋՋՋՋՋyՋrՋkՋdՋ]ՋVՋOՋHՋAՋ:Ջ3Ջ,Ջ%ՋՋՋՋ ՋՋԋԋԋԋԋԋԋԋԋԋԋԋԋԋԋԋԋԋ}ԋvԋoԋhԋaԋZԋSԋLԋEԋ>ԋ7ԋ0ԋ)ԋ"ԋԋԋ ԋԋӋӋӋӋӋӋӋӋӋӋӋӋӋӋӋӋӋӋӋzӋsӋlӋeӋ^ӋWӋPӋIӋBӋ;Ӌ4Ӌ-Ӌ&ӋӋӋӋ ӋӋҋҋҋҋҋҋҋҋҋҋҋҋҋҋҋҋҋҋ~ҋwҋpҋiҋbҋ[ҋTҋMҋFҋ?ҋ8ҋ1ҋ*ҋ#ҋҋҋҋҋҋыыыыыыыыыыыыыыыыыы{ыtыmыfы_ыXыQыJыCы<ы5ы.ы'ы ыыы ыыЋЋЋЋЋЋЋЋЋЋЋЋЋЋЋЋЋЋЋxЋqЋjЋcЋ\ЋUЋNЋGЋ@Ћ9Ћ2Ћ+Ћ$ЋЋЋЋЋЋϋϋϋϋϋϋϋϋϋϋϋϋϋϋϋϋϋϋ|ϋuϋnϋgϋ`ϋYϋRϋKϋDϋ=ϋ6ϋ/ϋ(ϋ!ϋϋϋ ϋϋ΋΋΋΋΋΋΋΋΋΋΋΋΋΋΋΋΋΋΋y΋r΋k΋d΋]΋V΋O΋H΋A΋:΋3΋,΋%΋΋΋΋ ΋΋͋͋͋͋͋͋͋͋͋͋͋͋͋͋͋͋͋͋}͋v͋o͋h͋a͋Z͋S͋L͋E͋>͋7͋0͋)͋"͋͋͋ ͋͋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋̋z̋s̋l̋e̋^̋W̋P̋I̋B̋;̋4̋-̋&̋̋̋̋ ̋̋ˋˋˋˋˋˋˋˋˋˋˋˋˋˋˋˋˋˋ~ˋwˋpˋiˋbˋ[ˋTˋMˋFˋ?ˋ8ˋ1ˋ*ˋ#ˋˋˋˋˋˋʋʋʋʋʋʋʋʋʋʋʋʋʋʋʋʋʋʋ{ʋtʋmʋfʋ_ʋXʋQʋJʋCʋ<ʋ5ʋ.ʋ'ʋ ʋʋʋ ʋʋɋɋɋɋɋɋɋɋɋɋɋɋɋɋɋɋɋɋɋxɋqɋjɋcɋ\ɋUɋNɋGɋ@ɋ9ɋ2ɋ+ɋ$ɋɋɋɋɋɋȋȋȋȋȋȋȋȋȋȋȋȋȋȋȋȋȋȋ|ȋuȋnȋgȋ`ȋYȋRȋKȋDȋ=ȋ6ȋ/ȋ(ȋ!ȋȋȋ ȋȋNjNjNjNjNjNjNjNjNjNjNjNjNjNjNjNjNjNjNjyNjrNjkNjdNj]NjVNjONjHNjANj:Nj3Nj,Nj%NjNjNjNj NjNjƋƋƋƋƋƋƋƋƋƋƋƋƋƋƋƋƋƋ}ƋvƋoƋhƋaƋZƋSƋLƋEƋ>Ƌ7Ƌ0Ƌ)Ƌ"ƋƋƋ ƋƋŋŋŋŋŋŋŋŋŋŋŋŋŋŋŋŋŋŋŋzŋsŋlŋeŋ^ŋWŋPŋIŋBŋ;ŋ4ŋ-ŋ&ŋŋŋŋ ŋŋċċċċċċċċċċċċċċċċċċ~ċwċpċiċbċ[ċTċMċFċ?ċ8ċ1ċ*ċ#ċċċċċċËËËËËËËËËËËËËËËËËË{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËË‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹x‹q‹j‹c‹\‹U‹N‹G‹@‹9‹2‹+‹$‹‹‹‹‹‹|ung`YRKD=6/(! yrkd]VOHA:3,% 濋߿ؿѿʿÿ}vohaZSLE>70)" 꾋㾋ܾվξǾzsle^WPIB;4-& 罋ཋٽҽ˽Ľ~wpib[TMF?81*#뼋伋ݼּϼȼ{tmf_XQJC<5.'  ﻋ軋ịڻӻ̻Żxqjc\UNG@92+$캋庋޺׺кɺº|ung`YRKD=6/(! 鹋⹋۹Թ͹ƹyrkd]VOHA:3,% 渋߸ظѸʸø}vohaZSLE>70)" 귋㷋ܷշηǷzsle^WPIB;4-& 綋උٶҶ˶Ķ~wpib[TMF?81*#뵋䵋ݵֵϵȵ{tmf_XQJC<5.'  ﴋ贋ᴋڴӴ̴Ŵxqjc\UNG@92+$쳋峋޳׳гɳ³|ung`YRKD=6/(! 鲋ⲋ۲ԲͲƲyrkd]VOHA:3,% 汋߱رѱʱñ}vohaZSLE>70)" 갋㰋ܰհΰǰzsle^WPIB;4-& 篋ோٯү˯į~wpib[TMF?81*#뮋䮋ݮ֮ϮȮ{tmf_XQJC<5.'  וֹ譋ᭋڭӭ̭ŭxqjc\UNG@92+$쬋嬋ެ׬Ьɬ¬|ung`YRKD=6/(! 髋⫋۫ԫͫƫyrkd]VOHA:3,% 檋ߪتѪʪê}vohaZSLE>70)" ꩋ㩋ܩթΩǩzsle^WPIB;4-& 程਋٨Ҩ˨Ĩ~wpib[TMF?81*#맋䧋ݧ֧ϧȧ{tmf_XQJC<5.'  曆見ᦋڦӦ̦Ŧxqjc\UNG@92+$쥋奋ޥץХɥ¥|ung`YRKD=6/(! 餋⤋ۤԤͤƤyrkd]VOHA:3,% 棋ߣأѣʣã}vohaZSLE>70)" ꢋ㢋ܢբ΢Ǣzsle^WPIB;4-& 硋ࡋ١ҡˡġ~wpib[TMF?81*#렋䠋ݠ֠ϠȠ{tmf_XQJC<5.'  蟋់ڟӟ̟şxqjc\UNG@92+$잋型ޞמОɞž|ung`YRKD=6/(! 靋❋۝ԝ͝Ɲyrkd]VOHA:3,% 휋朋ߜ؜ќʜÜ}vohaZSLE>70)" ꛋ㛋ܛ՛ΛǛzsle^WPIB;4-& 皋ٚҚ˚Ě~wpib[TMF?81*#뙋䙋ݙ֙ϙș{tmf_XQJC<5.'  蘋ᘋژӘ̘Řxqjc\UNG@92+$엋嗋ޗחЗɗ—|ung`YRKD=6/(! 開▋ۖԖ͖Ɩyrkd]VOHA:3,% 핋敋ߕؕѕʕÕ}vohaZSLE>70)" ꔋ㔋ܔՔΔǔzsle^WPIB;4-& 瓋ٓғ˓ē~wpib[TMF?81*#뒋䒋ݒ֒ϒȒ{tmf_XQJC<5.'  葋ᑋڑӑ̑őxqjc\UNG@92+$쐋吋ސאАɐ|ung`YRKD=6/(! 鏋⏋ۏԏ͏Əyrkd]VOHA:3,% 펋掋ߎ؎юʎÎ}vohaZSLE>70)" ꍋ㍋܍Ս΍Ǎzsle^WPIB;4-& 猋ٌҌˌČ~wpib[TMF?81*#닋䋋݋֋ϋȋ{tmf_XQJC<5.'  芋ኋڊӊ̊Ŋxqjc\UNG@92+$쉋剋މ׉Љɉ‰|ung`YRKD=6/(! 鈋∋ۈԈ͈ƈyrkd]VOHA:3,% 퇋懋߇؇чʇÇ}vohaZSLE>70)" ꆋㆋ܆ՆΆdžzsle^WPIB;4-& 煋م҅˅ą~wpib[TMF?81*#넋䄋݄քτȄ{tmf_XQJC<5.'  胋჋ڃӃ̃Ńxqjc\UNG@92+$삋傋ނׂЂɂ‚|ung`YRKD=6/(! 運⁋ہԁ́Ɓyrkd]VOHA:3,% 퀋怋߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߊߊߊߊߊߊߊߊߊߊߊߊߊߊߊߊߊߊ}ߊvߊoߊhߊaߊZߊSߊLߊEߊ>ߊ7ߊ0ߊ)ߊ"ߊߊߊ ߊߊފފފފފފފފފފފފފފފފފފފzފsފlފeފ^ފWފPފIފBފ;ފ4ފ-ފ&ފފފފ ފފ݊݊݊݊݊݊݊݊݊݊݊݊݊݊݊݊݊݊~݊w݊p݊i݊b݊[݊T݊M݊F݊?݊8݊1݊*݊#݊݊݊݊݊݊܊܊܊܊܊܊܊܊܊܊܊܊܊܊܊܊܊܊{܊t܊m܊f܊_܊X܊Q܊J܊C܊<܊5܊.܊'܊ ܊܊܊ ܊܊ۊۊۊۊۊۊۊۊۊۊۊۊۊۊۊۊۊۊۊxۊqۊjۊcۊ\ۊUۊNۊGۊ@ۊ9ۊ2ۊ+ۊ$ۊۊۊۊۊۊڊڊڊڊڊڊڊڊڊڊڊڊڊڊڊڊڊڊ|ڊuڊnڊgڊ`ڊYڊRڊKڊDڊ=ڊ6ڊ/ڊ(ڊ!ڊڊڊ ڊڊيييييييييييييييييييyيrيkيdي]يVيOيHيAي:ي3ي,ي%يييي يي؊؊؊؊؊؊؊؊؊؊؊؊؊؊؊؊؊؊}؊v؊o؊h؊a؊Z؊S؊L؊E؊>؊7؊0؊)؊"؊؊؊ ؊؊׊׊׊׊׊׊׊׊׊׊׊׊׊׊׊׊׊׊׊z׊s׊l׊e׊^׊W׊P׊I׊B׊;׊4׊-׊&׊׊׊׊ ׊׊֊֊֊֊֊֊֊֊֊֊֊֊֊֊֊֊֊֊~֊w֊p֊i֊b֊[֊T֊M֊F֊?֊8֊1֊*֊#֊֊֊֊֊֊ՊՊՊՊՊՊՊՊՊՊՊՊՊՊՊՊՊՊ{ՊtՊmՊfՊ_ՊXՊQՊJՊCՊ<Պ5Պ.Պ'Պ ՊՊՊ ՊՊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊxԊqԊjԊcԊ\ԊUԊNԊGԊ@Ԋ9Ԋ2Ԋ+Ԋ$ԊԊԊԊԊԊӊӊӊӊӊӊӊӊӊӊӊӊӊӊӊӊӊӊ|ӊuӊnӊgӊ`ӊYӊRӊKӊDӊ=ӊ6ӊ/ӊ(ӊ!ӊӊӊ ӊӊҊҊҊҊҊҊҊҊҊҊҊҊҊҊҊҊҊҊҊyҊrҊkҊdҊ]ҊVҊOҊHҊAҊ:Ҋ3Ҋ,Ҋ%ҊҊҊҊ ҊҊъъъъъъъъъъъъъъъъъъ}ъvъoъhъaъZъSъLъEъ>ъ7ъ0ъ)ъ"ъъъ ъъЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊzЊsЊlЊeЊ^ЊWЊPЊIЊBЊ;Њ4Њ-Њ&ЊЊЊЊ ЊЊϊϊϊϊϊϊϊϊϊϊϊϊϊϊϊϊϊϊ~ϊwϊpϊiϊbϊ[ϊTϊMϊFϊ?ϊ8ϊ1ϊ*ϊ#ϊϊϊϊϊϊΊΊΊΊΊΊΊΊΊΊΊΊΊΊΊΊΊΊ{ΊtΊmΊfΊ_ΊXΊQΊJΊCΊ<Ί5Ί.Ί'Ί ΊΊΊ ΊΊ͊͊͊͊͊͊͊͊͊͊͊͊͊͊͊͊͊͊͊x͊q͊j͊c͊\͊U͊N͊G͊@͊9͊2͊+͊$͊͊͊͊͊͊̊̊̊̊̊̊̊̊̊̊̊̊̊̊̊̊̊̊|̊ůn̊g̊`̊Y̊R̊K̊D̊=̊6̊/̊(̊!̊̊̊ ̊̊ˊˊˊˊˊˊˊˊˊˊˊˊˊˊˊˊˊˊˊyˊrˊkˊdˊ]ˊVˊOˊHˊAˊ:ˊ3ˊ,ˊ%ˊˊˊˊ ˊˊʊʊʊʊʊʊʊʊʊʊʊʊʊʊʊʊʊʊ}ʊvʊoʊhʊaʊZʊSʊLʊEʊ>ʊ7ʊ0ʊ)ʊ"ʊʊʊ ʊʊɊɊɊɊɊɊɊɊɊɊɊɊɊɊɊɊɊɊɊzɊsɊlɊeɊ^ɊWɊPɊIɊBɊ;Ɋ4Ɋ-Ɋ&ɊɊɊɊ ɊɊȊȊȊȊȊȊȊȊȊȊȊȊȊȊȊȊȊȊ~ȊwȊpȊiȊbȊ[ȊTȊMȊFȊ?Ȋ8Ȋ1Ȋ*Ȋ#ȊȊȊȊȊȊNJNJNJNJNJNJNJNJNJNJNJNJNJNJNJNJNJNJ{NJtNJmNJfNJ_NJXNJQNJJNJCNJ<NJ5NJ.NJ'NJ NJNJNJ NJNJƊƊƊƊƊƊƊƊƊƊƊƊƊƊƊƊƊƊƊxƊqƊjƊcƊ\ƊUƊNƊGƊ@Ɗ9Ɗ2Ɗ+Ɗ$ƊƊƊƊƊƊŊŊŊŊŊŊŊŊŊŊŊŊŊŊŊŊŊŊ|ŊuŊnŊgŊ`ŊYŊRŊKŊDŊ=Ŋ6Ŋ/Ŋ(Ŋ!ŊŊŊ ŊŊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊyĊrĊkĊdĊ]ĊVĊOĊHĊAĊ:Ċ3Ċ,Ċ%ĊĊĊĊ ĊĊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ}ÊvÊoÊhÊaÊZÊSÊLÊEÊ>Ê7Ê0Ê)Ê"ÊÊÊ ÊÊŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠzŠsŠlŠeŠ^ŠWŠPŠIŠBŠ;Š4Š-Š&ŠŠŠŠ ŠŠ~wpib[TMF?81*#{tmf_XQJC<5.'  ᅧ迊Ὴڿӿ̿ſxqjc\UNG@92+$쾊徊޾׾оɾ¾|ung`YRKD=6/(! 齊⽊۽Խͽƽyrkd]VOHA:3,% 漊߼ؼѼʼü}vohaZSLE>70)" 껊㻊ܻջλǻzsle^WPIB;4-& 纊ຊٺҺ˺ĺ~wpib[TMF?81*#빊乊ݹֹϹȹ{tmf_XQJC<5.'  ︊踊ḊڸӸ̸Ÿxqjc\UNG@92+$췊巊޷׷зɷ·|ung`YRKD=6/(! 鶊ⶊ۶ԶͶƶyrkd]VOHA:3,% 浊ߵصѵʵõ}vohaZSLE>70)" 괊㴊ܴմδǴzsle^WPIB;4-& 糊ೊٳҳ˳ij~wpib[TMF?81*#벊䲊ݲֲϲȲ{tmf_XQJC<5.'  ﱊ豊᱊ڱӱ̱űxqjc\UNG@92+$찊尊ްװаɰ°|ung`YRKD=6/(! 鯊⯊ۯԯͯƯyrkd]VOHA:3,% 殊߮خѮʮî}vohaZSLE>70)" ꭊ㭊ܭխέǭzsle^WPIB;4-& 笊ଊ٬ҬˬĬ~wpib[TMF?81*#뫊䫊ݫ֫ϫȫ{tmf_XQJC<5.'  慠誊᪊ڪӪ̪Ūxqjc\UNG@92+$쩊婊ީשЩɩ©|ung`YRKD=6/(! 騊⨊ۨԨͨƨyrkd]VOHA:3,% 槊ߧاѧʧç}vohaZSLE>70)" ꦊ㦊ܦզΦǦzsle^WPIB;4-& 祊ॊ٥ҥ˥ĥ~wpib[TMF?81*#뤊䤊ݤ֤ϤȤ{tmf_XQJC<5.'  裊ᣊڣӣ̣ţxqjc\UNG@92+$좊墊ޢעТɢ¢|ung`YRKD=6/(! 顊⡊ۡԡ͡ơyrkd]VOHA:3,% 栊ߠؠѠʠà}vohaZSLE>70)" ꟊ㟊ܟ՟Οǟzsle^WPIB;4-& 瞊ٞҞ˞Ğ~wpib[TMF?81*#띊䝊ݝ֝ϝȝ{tmf_XQJC<5.'  蜊ᜊڜӜ̜Ŝxqjc\UNG@92+$웊囊ޛכЛɛ›|ung`YRKD=6/(! 隊⚊ۚԚ͚ƚyrkd]VOHA:3,% 홊晊ߙؙљʙÙ}vohaZSLE>70)" ꘊ㘊ܘ՘Θǘzsle^WPIB;4-& 痊ٗҗ˗ė~wpib[TMF?81*#떊䖊ݖ֖ϖȖ{tmf_XQJC<5.'  蕊ᕊڕӕ̕ŕxqjc\UNG@92+$씊唊ޔהДɔ”|ung`YRKD=6/(! 铊Ⓤۓԓ͓Ɠyrkd]VOHA:3,% 풊撊ߒؒђʒÒ}vohaZSLE>70)" ꑊ㑊ܑՑΑǑzsle^WPIB;4-& 琊ِҐːĐ~wpib[TMF?81*#돊䏊ݏ֏Ϗȏ{tmf_XQJC<5.'  莊ᎊڎӎ̎Ŏxqjc\UNG@92+$썊半ލ׍Ѝɍ|ung`YRKD=6/(! 錊⌊یԌ͌ƌyrkd]VOHA:3,% 틊拊ߋ؋ыʋË}vohaZSLE>70)" ꊊ㊊܊ՊΊNJzsle^WPIB;4-& 牊ى҉ˉĉ~wpib[TMF?81*#눊䈊݈ֈψȈ{tmf_XQJC<5.'  臊ᇊڇӇ̇Ňxqjc\UNG@92+$솊冊ކ׆ІɆ†|ung`YRKD=6/(! 酊⅊ۅԅͅƅyrkd]VOHA:3,% 턊愊߄؄фʄÄ}vohaZSLE>70)" ꃊナ܃Ճ΃ǃzsle^WPIB;4-& 炊ق҂˂Ă~wpib[TMF?81*#끊䁊݁ցρȁ{tmf_XQJC<5.'  耊ညڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ߉߉߉߉߉߉߉߉߉߉߉߉߉߉߉߉߉߉߉x߉q߉j߉c߉\߉U߉N߉G߉@߉9߉2߉+߉$߉߉߉߉߉߉މމމމމމމމމމމމމމމމމމ|މuމnމgމ`މYމRމKމDމ=މ6މ/މ(މ!މމމ މމ݉݉݉݉݉݉݉݉݉݉݉݉݉݉݉݉݉݉݉y݉r݉k݉d݉]݉V݉O݉H݉A݉:݉3݉,݉%݉݉݉݉ ݉݉܉܉܉܉܉܉܉܉܉܉܉܉܉܉܉܉܉܉}܉v܉o܉h܉a܉Z܉S܉L܉E܉>܉7܉0܉)܉"܉܉܉ ܉܉ۉۉۉۉۉۉۉۉۉۉۉۉۉۉۉۉۉۉۉzۉsۉlۉeۉ^ۉWۉPۉIۉBۉ;ۉ4ۉ-ۉ&ۉۉۉۉ ۉۉډډډډډډډډډډډډډډډډډډ~ډwډpډiډbډ[ډTډMډFډ?ډ8ډ1ډ*ډ#ډډډډډډىىىىىىىىىىىىىىىىىى{ىtىmىfى_ىXىQىJىCى<ى5ى.ى'ى ىىى ىى؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉x؉q؉j؉c؉\؉U؉N؉G؉@؉9؉2؉+؉$؉؉؉؉؉؉׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉|׉u׉n׉g׉`׉Y׉R׉K׉D׉=׉6׉/׉(׉!׉׉׉ ׉׉։։։։։։։։։։։։։։։։։։։y։r։k։d։]։V։O։H։A։:։3։,։%։։։։ ։։ՉՉՉՉՉՉՉՉՉՉՉՉՉՉՉՉՉՉ}ՉvՉoՉhՉaՉZՉSՉLՉEՉ>Չ7Չ0Չ)Չ"ՉՉՉ ՉՉԉԉԉԉԉԉԉԉԉԉԉԉԉԉԉԉԉԉԉzԉsԉlԉeԉ^ԉWԉPԉIԉBԉ;ԉ4ԉ-ԉ&ԉԉԉԉ ԉԉӉӉӉӉӉӉӉӉӉӉӉӉӉӉӉӉӉӉ~ӉwӉpӉiӉbӉ[ӉTӉMӉFӉ?Ӊ8Ӊ1Ӊ*Ӊ#ӉӉӉӉӉӉ҉҉҉҉҉҉҉҉҉҉҉҉҉҉҉҉҉҉{҉t҉m҉f҉_҉X҉Q҉J҉C҉<҉5҉.҉'҉ ҉҉҉ ҉҉щщщщщщщщщщщщщщщщщщщxщqщjщcщ\щUщNщGщ@щ9щ2щ+щ$щщщщщщЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉ|ЉuЉnЉgЉ`ЉYЉRЉKЉDЉ=Љ6Љ/Љ(Љ!ЉЉЉ ЉЉωωωωωωωωωωωωωωωωωωωyωrωkωdω]ωVωOωHωAω:ω3ω,ω%ωωωω ωωΉΉΉΉΉΉΉΉΉΉΉΉΉΉΉΉΉΉ}ΉvΉoΉhΉaΉZΉSΉLΉEΉ>Ή7Ή0Ή)Ή"ΉΉΉ ΉΉ͉͉͉͉͉͉͉͉͉͉͉͉͉͉͉͉͉͉͉z͉s͉l͉e͉^͉W͉P͉I͉B͉;͉4͉-͉&͉͉͉͉ ͉͉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉̉~̉w̉p̉ỉb̉[̉T̉M̉F̉?̉8̉1̉*̉#̉̉̉̉̉̉ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ{ˉtˉmˉfˉ_ˉXˉQˉJˉCˉ<ˉ5ˉ.ˉ'ˉ ˉˉˉ ˉˉʉʉʉʉʉʉʉʉʉʉʉʉʉʉʉʉʉʉʉxʉqʉjʉcʉ\ʉUʉNʉGʉ@ʉ9ʉ2ʉ+ʉ$ʉʉʉʉʉʉɉɉɉɉɉɉɉɉɉɉɉɉɉɉɉɉɉɉ|ɉuɉnɉgɉ`ɉYɉRɉKɉDɉ=ɉ6ɉ/ɉ(ɉ!ɉɉɉ ɉɉȉȉȉȉȉȉȉȉȉȉȉȉȉȉȉȉȉȉȉyȉrȉkȉdȉ]ȉVȉOȉHȉAȉ:ȉ3ȉ,ȉ%ȉȉȉȉ ȉȉljljljljljljljljljljljljljljljljljlj}ljvljoljhljaljZljSljLljElj>lj7lj0lj)lj"ljljlj ljljƉƉƉƉƉƉƉƉƉƉƉƉƉƉƉƉƉƉƉzƉsƉlƉeƉ^ƉWƉPƉIƉBƉ;Ɖ4Ɖ-Ɖ&ƉƉƉƉ ƉƉʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼn~ʼnwʼnpʼniʼnbʼn[ʼnTʼnMʼnFʼn?ʼn8ʼn1ʼn*ʼn#ʼnʼnʼnʼnʼnʼnĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉ{ĉtĉmĉfĉ_ĉXĉQĉJĉCĉ<ĉ5ĉ.ĉ'ĉ ĉĉĉ ĉĉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉxÉqÉjÉcÉ\ÉUÉNÉGÉ@É9É2É+É$ÉÉÉÉÉɉ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰|‰u‰n‰g‰`‰Y‰R‰K‰D‰=‰6‰/‰(‰!‰‰‰ ‰‰yrkd]VOHA:3,% }vohaZSLE>70)" 꿉㿉ܿտοǿzsle^WPIB;4-& 羉ྉپҾ˾ľ~wpib[TMF?81*#뽉佉ݽֽϽȽ{tmf_XQJC<5.'  )載ἉڼӼ̼żxqjc\UNG@92+$컉廉޻׻лɻ»|ung`YRKD=6/(! 麉⺉ۺԺͺƺyrkd]VOHA:3,% 湉߹عѹʹù}vohaZSLE>70)" 급㸉ܸոθǸzsle^WPIB;4-& 緉෉ٷҷ˷ķ~wpib[TMF?81*#붉䶉ݶֶ϶ȶ{tmf_XQJC<5.'  ﵉赉ᵉڵӵ̵ŵxqjc\UNG@92+$촉崉޴״дɴ´|ung`YRKD=6/(! 鳉ⳉ۳ԳͳƳyrkd]VOHA:3,% 沉߲زѲʲò}vohaZSLE>70)" 걉㱉ܱձαDZzsle^WPIB;4-& 簉ఉٰҰ˰İ~wpib[TMF?81*#믉䯉ݯ֯ϯȯ{tmf_XQJC<5.'  ﮉ讉ᮉڮӮ̮Ůxqjc\UNG@92+$쭉孉ޭ׭Эɭ­|ung`YRKD=6/(! 鬉⬉۬ԬͬƬyrkd]VOHA:3,% 櫉߫ثѫʫë}vohaZSLE>70)" ꪉ㪉ܪժΪǪzsle^WPIB;4-& 穉੉٩ҩ˩ĩ~wpib[TMF?81*#먉䨉ݨ֨ϨȨ{tmf_XQJC<5.'  柳觉ᧉڧӧ̧ŧxqjc\UNG@92+$즉妉ަצЦɦ¦|ung`YRKD=6/(! 饉⥉ۥԥͥƥyrkd]VOHA:3,% 椉ߤؤѤʤä}vohaZSLE>70)" ꣉㣉ܣգΣǣzsle^WPIB;4-& 碉ࢉ٢ҢˢĢ~wpib[TMF?81*#롉䡉ݡ֡ϡȡ{tmf_XQJC<5.'  蠉᠉ڠӠ̠Šxqjc\UNG@92+$쟉埉ޟןПɟŸ|ung`YRKD=6/(! 鞉➉۞Ԟ͞ƞyrkd]VOHA:3,% 흉杉ߝ؝ѝʝÝ}vohaZSLE>70)" ꜉㜉ܜ՜Μǜzsle^WPIB;4-& 盉ٛқ˛ě~wpib[TMF?81*#뚉䚉ݚ֚ϚȚ{tmf_XQJC<5.'  虉ᙉڙә̙řxqjc\UNG@92+$옉嘉ޘטИɘ˜|ung`YRKD=6/(! 闉◉ۗԗ͗Ɨyrkd]VOHA:3,% 행斉ߖؖіʖÖ}vohaZSLE>70)" ꕉ㕉ܕՕΕǕzsle^WPIB;4-& 甉ٔҔ˔Ĕ~wpib[TMF?81*#듉䓉ݓ֓ϓȓ{tmf_XQJC<5.'  蒉ᒉڒӒ̒Œxqjc\UNG@92+$쑉呉ޑבБɑ‘|ung`YRKD=6/(! 鐉␉ېԐ͐Ɛyrkd]VOHA:3,% 평揉ߏ؏яʏÏ}vohaZSLE>70)" ꎉ㎉܎ՎΎǎzsle^WPIB;4-& 獉ٍҍˍč~wpib[TMF?81*#댉䌉݌֌όȌ{tmf_XQJC<5.'  苉ዉڋӋ̋ŋxqjc\UNG@92+$슉劉ފ׊ЊɊŠ|ung`YRKD=6/(! 鉉≉ۉԉ͉Ɖyrkd]VOHA:3,% 툉戉߈؈шʈÈ}vohaZSLE>70)" ꇉ㇉܇Շ·LJzsle^WPIB;4-& 熉ن҆ˆĆ~wpib[TMF?81*#녉䅉݅օυȅ{tmf_XQJC<5.'  脉ᄉڄӄ̄ńxqjc\UNG@92+$색僉ރ׃ЃɃƒ|ung`YRKD=6/(! 邉₉ۂԂ͂Ƃyrkd]VOHA:3,% 큉恉߁؁сʁÁ}vohaZSLE>70)" ꀉ〉܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ߈߈߈߈߈߈߈߈߈߈߈߈߈߈߈߈߈߈߈z߈s߈l߈e߈^߈W߈P߈I߈B߈;߈4߈-߈&߈߈߈߈ ߈߈ވވވވވވވވވވވވވވވވވވ~ވwވpވiވbވ[ވTވMވFވ?ވ8ވ1ވ*ވ#ވވވވވވ݈݈݈݈݈݈݈݈݈݈݈݈݈݈݈݈݈݈{݈t݈m݈f݈_݈X݈Q݈J݈C݈<݈5݈.݈'݈ ݈݈݈ ݈݈܈܈܈܈܈܈܈܈܈܈܈܈܈܈܈܈܈܈܈x܈q܈j܈c܈\܈U܈N܈G܈@܈9܈2܈+܈$܈܈܈܈܈܈ۈۈۈۈۈۈۈۈۈۈۈۈۈۈۈۈۈۈ|ۈuۈnۈgۈ`ۈYۈRۈKۈDۈ=ۈ6ۈ/ۈ(ۈ!ۈۈۈ ۈۈڈڈڈڈڈڈڈڈڈڈڈڈڈڈڈڈڈڈڈyڈrڈkڈdڈ]ڈVڈOڈHڈAڈ:ڈ3ڈ,ڈ%ڈڈڈڈ ڈڈوووووووووووووووووو}وvوoوhوaوZوSوLوEو>و7و0و)و"ووو وو؈؈؈؈؈؈؈؈؈؈؈؈؈؈؈؈؈؈؈z؈s؈l؈e؈^؈W؈P؈I؈B؈;؈4؈-؈&؈؈؈؈ ؈؈׈׈׈׈׈׈׈׈׈׈׈׈׈׈׈׈׈׈~׈w׈p׈i׈b׈[׈T׈M׈F׈?׈8׈1׈*׈#׈׈׈׈׈׈ֈֈֈֈֈֈֈֈֈֈֈֈֈֈֈֈֈֈ{ֈtֈmֈfֈ_ֈXֈQֈJֈCֈ<ֈ5ֈ.ֈ'ֈ ֈֈֈ ֈֈՈՈՈՈՈՈՈՈՈՈՈՈՈՈՈՈՈՈՈxՈqՈjՈcՈ\ՈUՈNՈGՈ@Ո9Ո2Ո+Ո$ՈՈՈՈՈՈԈԈԈԈԈԈԈԈԈԈԈԈԈԈԈԈԈԈ|ԈuԈnԈgԈ`ԈYԈRԈKԈDԈ=Ԉ6Ԉ/Ԉ(Ԉ!ԈԈԈ ԈԈӈӈӈӈӈӈӈӈӈӈӈӈӈӈӈӈӈӈӈyӈrӈkӈdӈ]ӈVӈOӈHӈAӈ:ӈ3ӈ,ӈ%ӈӈӈӈ ӈӈ҈҈҈҈҈҈҈҈҈҈҈҈҈҈҈҈҈҈}҈v҈o҈h҈a҈Z҈S҈L҈E҈>҈7҈0҈)҈"҈҈҈ ҈҈шшшшшшшшшшшшшшшшшшшzшsшlшeш^шWшPшIшBш;ш4ш-ш&шшшш шшЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈ~ЈwЈpЈiЈbЈ[ЈTЈMЈFЈ?Ј8Ј1Ј*Ј#ЈЈЈЈЈЈψψψψψψψψψψψψψψψψψψ{ψtψmψfψ_ψXψQψJψCψ<ψ5ψ.ψ'ψ ψψψ ψψΈΈΈΈΈΈΈΈΈΈΈΈΈΈΈΈΈΈΈxΈqΈjΈcΈ\ΈUΈNΈGΈ@Έ9Έ2Έ+Έ$ΈΈΈΈΈΈ͈͈͈͈͈͈͈͈͈͈͈͈͈͈͈͈͈͈|͈u͈n͈g͈`͈Y͈R͈K͈D͈=͈6͈/͈(͈!͈͈͈ ͈͈̈̈̈̈̈̈̈̈̈̈̈̈̈̈̈̈̈̈̈ÿr̈k̈d̈]̈V̈ÖḦÄ:̈3̈,̈%̈̈̈̈ ̈̈ˈˈˈˈˈˈˈˈˈˈˈˈˈˈˈˈˈˈ}ˈvˈoˈhˈaˈZˈSˈLˈEˈ>ˈ7ˈ0ˈ)ˈ"ˈˈˈ ˈˈʈʈʈʈʈʈʈʈʈʈʈʈʈʈʈʈʈʈʈzʈsʈlʈeʈ^ʈWʈPʈIʈBʈ;ʈ4ʈ-ʈ&ʈʈʈʈ ʈʈɈɈɈɈɈɈɈɈɈɈɈɈɈɈɈɈɈɈ~ɈwɈpɈiɈbɈ[ɈTɈMɈFɈ?Ɉ8Ɉ1Ɉ*Ɉ#ɈɈɈɈɈɈȈȈȈȈȈȈȈȈȈȈȈȈȈȈȈȈȈȈ{ȈtȈmȈfȈ_ȈXȈQȈJȈCȈ<Ȉ5Ȉ.Ȉ'Ȉ ȈȈȈ ȈȈLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjxLjqLjjLjcLj\LjULjNLjGLj@Lj9Lj2Lj+Lj$LjLjLjLjLjLjƈƈƈƈƈƈƈƈƈƈƈƈƈƈƈƈƈƈ|ƈuƈnƈgƈ`ƈYƈRƈKƈDƈ=ƈ6ƈ/ƈ(ƈ!ƈƈƈ ƈƈňňňňňňňňňňňňňňňňňňňyňrňkňdň]ňVňOňHňAň:ň3ň,ň%ňňňň ňňĈĈĈĈĈĈĈĈĈĈĈĈĈĈĈĈĈĈ}ĈvĈoĈhĈaĈZĈSĈLĈEĈ>Ĉ7Ĉ0Ĉ)Ĉ"ĈĈĈ ĈĈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈȈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆ{tmf_XQJC<5.'  xqjc\UNG@92+$쿈忈޿׿пɿ¿|ung`YRKD=6/(! 龈⾈۾Ծ;ƾyrkd]VOHA:3,% 潈߽ؽѽʽý}vohaZSLE>70)" 꼈㼈ܼռμǼzsle^WPIB;4-& 终່ٻһ˻Ļ~wpib[TMF?81*#뺈予ݺֺϺȺ{tmf_XQJC<5.'  ﹈蹈Ṉڹӹ̹Źxqjc\UNG@92+$츈师޸׸иɸ¸|ung`YRKD=6/(! 鷈ⷈ۷ԷͷƷyrkd]VOHA:3,% 消߶ضѶʶö}vohaZSLE>70)" 굈㵈ܵյεǵzsle^WPIB;4-& 紈ഈٴҴ˴Ĵ~wpib[TMF?81*#볈䳈ݳֳϳȳ{tmf_XQJC<5.'  ﲈ貈ᲈڲӲ̲Ųxqjc\UNG@92+$챈屈ޱױбɱ±|ung`YRKD=6/(! 鰈Ⰸ۰԰Ͱưyrkd]VOHA:3,% 毈߯دѯʯï}vohaZSLE>70)" ꮈ㮈ܮծήǮzsle^WPIB;4-& 筈ୈ٭ҭ˭ĭ~wpib[TMF?81*#묈䬈ݬ֬ϬȬ{tmf_XQJC<5.'  靖諈᫈ګӫ̫ūxqjc\UNG@92+$쪈媈ުתЪɪª|ung`YRKD=6/(! 驈⩈۩ԩͩƩyrkd]VOHA:3,% 樈ߨبѨʨè}vohaZSLE>70)" ꧈㧈ܧէΧǧzsle^WPIB;4-& 禈ঈ٦Ҧ˦Ħ~wpib[TMF?81*#륈䥈ݥ֥ϥȥ{tmf_XQJC<5.'  龜褈ᤈڤӤ̤Ťxqjc\UNG@92+$죈壈ޣףУɣ£|ung`YRKD=6/(! 颈⢈ۢԢ͢Ƣyrkd]VOHA:3,% 案ߡءѡʡá}vohaZSLE>70)" ꠈ㠈ܠՠΠǠzsle^WPIB;4-& 矈ٟҟ˟ğ~wpib[TMF?81*#랈䞈ݞ֞ϞȞ{tmf_XQJC<5.'  蝈ᝈڝӝ̝ŝxqjc\UNG@92+$윈圈ޜלМɜœ|ung`YRKD=6/(! 雈⛈ۛԛ͛ƛyrkd]VOHA:3,% 횈暈ߚؚњʚÚ}vohaZSLE>70)" Ꙉ㙈ܙՙΙǙzsle^WPIB;4-& 瘈٘Ҙ˘Ę~wpib[TMF?81*#뗈䗈ݗ֗ϗȗ{tmf_XQJC<5.'  薈ᖈږӖ̖Ŗxqjc\UNG@92+$안啈ޕוЕɕ•|ung`YRKD=6/(! 锈┈۔Ԕ͔Ɣyrkd]VOHA:3,% 퓈擈ߓؓѓʓÓ}vohaZSLE>70)" ꒈ㒈ܒՒΒǒzsle^WPIB;4-& 瑈ّґˑđ~wpib[TMF?81*#됈䐈ݐ֐ϐȐ{tmf_XQJC<5.'  菈Ꮘڏӏ̏ŏxqjc\UNG@92+$쎈厈ގ׎ЎɎŽ|ung`YRKD=6/(! 鍈⍈ۍԍ͍ƍyrkd]VOHA:3,% 팈挈ߌ،ьʌÌ}vohaZSLE>70)" ꋈ㋈܋Ջ΋Njzsle^WPIB;4-& 犈يҊˊĊ~wpib[TMF?81*#뉈䉈݉։ωȉ{tmf_XQJC<5.'  興ለڈӈ̈ňxqjc\UNG@92+$쇈凈އׇЇɇ‡|ung`YRKD=6/(! 醈ↈۆԆ͆Ɔyrkd]VOHA:3,% 텈慈߅؅хʅÅ}vohaZSLE>70)" ꄈㄈ܄Մ΄DŽzsle^WPIB;4-& 烈ك҃˃ă~wpib[TMF?81*#낈䂈݂ւςȂ{tmf_XQJC<5.'  聈၈ځӁ́Łxqjc\UNG@92+$쀈倈ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$߇߇߇߇߇߇߇߇߇߇߇߇߇߇߇߇߇߇|߇u߇n߇g߇`߇Y߇R߇K߇D߇=߇6߇/߇(߇!߇߇߇ ߇߇އއއއއއއއއއއއއއއއއއއyއrއkއdއ]އVއOއHއAއ:އ3އ,އ%އއއއ އއ݇݇݇݇݇݇݇݇݇݇݇݇݇݇݇݇݇݇}݇v݇o݇h݇a݇Z݇S݇L݇E݇>݇7݇0݇)݇"݇݇݇ ݇݇܇܇܇܇܇܇܇܇܇܇܇܇܇܇܇܇܇܇܇z܇s܇l܇e܇^܇W܇P܇I܇B܇;܇4܇-܇&܇܇܇܇ ܇܇ۇۇۇۇۇۇۇۇۇۇۇۇۇۇۇۇۇۇ~ۇwۇpۇiۇbۇ[ۇTۇMۇFۇ?ۇ8ۇ1ۇ*ۇ#ۇۇۇۇۇۇڇڇڇڇڇڇڇڇڇڇڇڇڇڇڇڇڇڇ{ڇtڇmڇfڇ_ڇXڇQڇJڇCڇ<ڇ5ڇ.ڇ'ڇ ڇڇڇ ڇڇهههههههههههههههههههxهqهjهcه\هUهNهGه@ه9ه2ه+ه$هههههه؇؇؇؇؇؇؇؇؇؇؇؇؇؇؇؇؇؇|؇u؇n؇g؇`؇Y؇R؇K؇D؇=؇6؇/؇(؇!؇؇؇ ؇؇ׇׇׇׇׇׇׇׇׇׇׇׇׇׇׇׇׇׇׇyׇrׇkׇdׇ]ׇVׇOׇHׇAׇ:ׇ3ׇ,ׇ%ׇׇׇׇ ׇׇևևևևևևևևևևևևևևևևևև}ևvևoևhևaևZևSևLևEև>և7և0և)և"ևևև ևևՇՇՇՇՇՇՇՇՇՇՇՇՇՇՇՇՇՇՇzՇsՇlՇeՇ^ՇWՇPՇIՇBՇ;Շ4Շ-Շ&ՇՇՇՇ ՇՇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇ~ԇwԇpԇiԇbԇ[ԇTԇMԇFԇ?ԇ8ԇ1ԇ*ԇ#ԇԇԇԇԇԇӇӇӇӇӇӇӇӇӇӇӇӇӇӇӇӇӇӇ{ӇtӇmӇfӇ_ӇXӇQӇJӇCӇ<Ӈ5Ӈ.Ӈ'Ӈ ӇӇӇ ӇӇ҇҇҇҇҇҇҇҇҇҇҇҇҇҇҇҇҇҇҇x҇q҇j҇c҇\҇U҇N҇G҇@҇9҇2҇+҇$҇҇҇҇҇҇чччччччччччччччччч|чuчnчgч`чYчRчKчDч=ч6ч/ч(ч!ччч ччЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇyЇrЇkЇdЇ]ЇVЇOЇHЇAЇ:Ї3Ї,Ї%ЇЇЇЇ ЇЇχχχχχχχχχχχχχχχχχχ}χvχoχhχaχZχSχLχEχ>χ7χ0χ)χ"χχχ χχ···················z·s·l·e·^·W·P·I·B·;·4·-·&···· ··͇͇͇͇͇͇͇͇͇͇͇͇͇͇͇͇͇͇~͇w͇p͇i͇b͇[͇T͇M͇F͇?͇8͇1͇*͇#͇͇͇͇͇͇̇̇̇̇̇̇̇̇̇̇̇̇̇̇̇̇̇̇{̇ṫṁḟ_̇ẊQ̇J̇Ċ<̇5̇.̇'̇ ̇̇̇ ̇̇ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇxˇqˇjˇcˇ\ˇUˇNˇGˇ@ˇ9ˇ2ˇ+ˇ$ˇˇˇˇˇˇʇʇʇʇʇʇʇʇʇʇʇʇʇʇʇʇʇʇ|ʇuʇnʇgʇ`ʇYʇRʇKʇDʇ=ʇ6ʇ/ʇ(ʇ!ʇʇʇ ʇʇɇɇɇɇɇɇɇɇɇɇɇɇɇɇɇɇɇɇɇyɇrɇkɇdɇ]ɇVɇOɇHɇAɇ:ɇ3ɇ,ɇ%ɇɇɇɇ ɇɇȇȇȇȇȇȇȇȇȇȇȇȇȇȇȇȇȇȇ}ȇvȇoȇhȇaȇZȇSȇLȇEȇ>ȇ7ȇ0ȇ)ȇ"ȇȇȇ ȇȇLJLJLJLJLJLJLJLJLJLJLJLJLJLJLJLJLJLJLJzLJsLJlLJeLJ^LJWLJPLJILJBLJ;LJ4LJ-LJ&LJLJLJLJ LJLJƇƇƇƇƇƇƇƇƇƇƇƇƇƇƇƇƇƇ~ƇwƇpƇiƇbƇ[ƇTƇMƇFƇ?Ƈ8Ƈ1Ƈ*Ƈ#ƇƇƇƇƇƇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇ{ŇtŇmŇfŇ_ŇXŇQŇJŇCŇ<Ň5Ň.Ň'Ň ŇŇŇ ŇŇćććććććććććććććććććxćqćjćcć\ćUćNćGć@ć9ć2ć+ć$ććććććÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇLJ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡}vohaZSLE>70)" zsle^WPIB;4-& 翇࿇ٿҿ˿Ŀ~wpib[TMF?81*#뾇侇ݾ־ϾȾ{tmf_XQJC<5.'  g轇὇ڽӽ̽Žxqjc\UNG@92+$켇弇޼׼мɼ¼|ung`YRKD=6/(! 黇⻇ۻԻͻƻyrkd]VOHA:3,% 溇ߺغѺʺú}vohaZSLE>70)" 깇㹇ܹչιǹzsle^WPIB;4-& 縇งٸҸ˸ĸ~wpib[TMF?81*#뷇䷇ݷַϷȷ{tmf_XQJC<5.'  ﶇ趇ᶇڶӶ̶Ŷxqjc\UNG@92+$쵇嵇޵׵еɵµ|ung`YRKD=6/(! 鴇ⴇ۴Դʹƴyrkd]VOHA:3,% 泇߳سѳʳó}vohaZSLE>70)" 겇㲇ܲղβDzzsle^WPIB;4-& 籇ేٱұ˱ı~wpib[TMF?81*#밇䰇ݰְϰȰ{tmf_XQJC<5.'  ﯇诇ᯇگӯ̯ůxqjc\UNG@92+$쮇宇ޮ׮Юɮ®|ung`YRKD=6/(! 魇⭇ۭԭͭƭyrkd]VOHA:3,% 欇߬جѬʬì}vohaZSLE>70)" ꫇㫇ܫիΫǫzsle^WPIB;4-& 窇ઇ٪Ҫ˪Ī~wpib[TMF?81*#멇䩇ݩ֩ϩȩ{tmf_XQJC<5.'  輻訇ᨇڨӨ̨Ũxqjc\UNG@92+$짇姇ާקЧɧ§|ung`YRKD=6/(! 馇⦇ۦԦͦƦyrkd]VOHA:3,% 楇ߥإѥʥå}vohaZSLE>70)" ꤇㤇ܤդΤǤzsle^WPIB;4-& 磇ࣇ٣ңˣģ~wpib[TMF?81*#뢇䢇ݢ֢ϢȢ{tmf_XQJC<5.'  衇ᡇڡӡ̡šxqjc\UNG@92+$젇堇ޠנРɠ |ung`YRKD=6/(! 韇⟇۟ԟ͟Ɵyrkd]VOHA:3,% 힇枇ߞ؞ўʞÞ}vohaZSLE>70)" ꝇ㝇ܝ՝Νǝzsle^WPIB;4-& 眇ٜҜ˜Ĝ~wpib[TMF?81*#뛇䛇ݛ֛ϛț{tmf_XQJC<5.'  蚇ᚇښӚ̚Śxqjc\UNG@92+$왇噇ޙיЙə™|ung`YRKD=6/(! 阇☇ۘԘ͘Ƙyrkd]VOHA:3,% 헇旇ߗؗїʗ×}vohaZSLE>70)" ꖇ㖇ܖՖΖǖzsle^WPIB;4-& 畇ٕҕ˕ĕ~wpib[TMF?81*#딇䔇ݔ֔ϔȔ{tmf_XQJC<5.'  蓇ᓇړӓ̓œxqjc\UNG@92+$쒇咇ޒגВɒ’|ung`YRKD=6/(! 鑇⑇ۑԑ͑Ƒyrkd]VOHA:3,% 퐇搇ߐؐѐʐÐ}vohaZSLE>70)" ꏇ㏇܏ՏΏǏzsle^WPIB;4-& 率َҎˎĎ~wpib[TMF?81*#덇䍇ݍ֍ύȍ{tmf_XQJC<5.'  茇ጇڌӌ̌Ōxqjc\UNG@92+$싇勇ދ׋Ћɋ‹|ung`YRKD=6/(! 銇⊇ۊԊ͊Ɗyrkd]VOHA:3,% 퉇扇߉؉щʉÉ}vohaZSLE>70)" ꈇ㈇܈ՈΈLjzsle^WPIB;4-& 燇ه҇ˇć~wpib[TMF?81*#놇䆇݆ֆφȆ{tmf_XQJC<5.'  腇ᅇڅӅ̅Ņxqjc\UNG@92+$섇儇ބׄЄɄ„|ung`YRKD=6/(! 郇⃇ۃԃ̓ƃyrkd]VOHA:3,% 킇悇߂؂тʂÂ}vohaZSLE>70)" ꁇぇ܁Ձ΁ǁzsle^WPIB;4-& 瀇ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ߆߆߆߆߆߆߆߆߆߆߆߆߆߆߆߆߆߆~߆w߆p߆i߆b߆[߆T߆M߆F߆?߆8߆1߆*߆#߆߆߆߆߆߆ކކކކކކކކކކކކކކކކކކ{ކtކmކfކ_ކXކQކJކCކ<ކ5ކ.ކ'ކ ކކކ ކކ݆݆݆݆݆݆݆݆݆݆݆݆݆݆݆݆݆݆݆x݆q݆j݆c݆\݆U݆N݆G݆@݆9݆2݆+݆$݆݆݆݆݆݆܆܆܆܆܆܆܆܆܆܆܆܆܆܆܆܆܆܆|܆u܆n܆g܆`܆Y܆R܆K܆D܆=܆6܆/܆(܆!܆܆܆ ܆܆ۆۆۆۆۆۆۆۆۆۆۆۆۆۆۆۆۆۆۆyۆrۆkۆdۆ]ۆVۆOۆHۆAۆ:ۆ3ۆ,ۆ%ۆۆۆۆ ۆۆچچچچچچچچچچچچچچچچچچ}چvچoچhچaچZچSچLچEچ>چ7چ0چ)چ"چچچ چچنننننننننننننننننننzنsنlنeن^نWنPنIنBن;ن4ن-ن&نننن نن؆؆؆؆؆؆؆؆؆؆؆؆؆؆؆؆؆؆~؆w؆p؆i؆b؆[؆T؆M؆F؆?؆8؆1؆*؆#؆؆؆؆؆؆׆׆׆׆׆׆׆׆׆׆׆׆׆׆׆׆׆׆{׆t׆m׆f׆_׆X׆Q׆J׆C׆<׆5׆.׆'׆ ׆׆׆ ׆׆ֆֆֆֆֆֆֆֆֆֆֆֆֆֆֆֆֆֆֆxֆqֆjֆcֆ\ֆUֆNֆGֆ@ֆ9ֆ2ֆ+ֆ$ֆֆֆֆֆֆՆՆՆՆՆՆՆՆՆՆՆՆՆՆՆՆՆՆ|ՆuՆnՆgՆ`ՆYՆRՆKՆDՆ=Ն6Ն/Ն(Ն!ՆՆՆ ՆՆԆԆԆԆԆԆԆԆԆԆԆԆԆԆԆԆԆԆԆyԆrԆkԆdԆ]ԆVԆOԆHԆAԆ:Ԇ3Ԇ,Ԇ%ԆԆԆԆ ԆԆӆӆӆӆӆӆӆӆӆӆӆӆӆӆӆӆӆӆ}ӆvӆoӆhӆaӆZӆSӆLӆEӆ>ӆ7ӆ0ӆ)ӆ"ӆӆӆ ӆӆ҆҆҆҆҆҆҆҆҆҆҆҆҆҆҆҆҆҆҆z҆s҆l҆e҆^҆W҆P҆I҆B҆;҆4҆-҆&҆҆҆҆ ҆҆цццццццццццццццццц~цwцpцiцbц[цTцMцFц?ц8ц1ц*ц#ццццццІІІІІІІІІІІІІІІІІІ{ІtІmІfІ_ІXІQІJІCІ<І5І.І'І ІІІ ІІφφφφφφφφφφφφφφφφφφφxφqφjφcφ\φUφNφGφ@φ9φ2φ+φ$φφφφφφΆΆΆΆΆΆΆΆΆΆΆΆΆΆΆΆΆΆ|ΆuΆnΆgΆ`ΆYΆRΆKΆDΆ=Ά6Ά/Ά(Ά!ΆΆΆ ΆΆ͆͆͆͆͆͆͆͆͆͆͆͆͆͆͆͆͆͆͆y͆r͆k͆d͆]͆V͆O͆H͆A͆:͆3͆,͆%͆͆͆͆ ͆͆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆}̆v̆ŏh̆ăZ̆S̆L̆Ĕ>̆7̆0̆)̆"̆̆̆ ̆̆ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆzˆsˆlˆeˆ^ˆWˆPˆIˆBˆ;ˆ4ˆ-ˆ&ˆˆˆˆ ˆˆʆʆʆʆʆʆʆʆʆʆʆʆʆʆʆʆʆʆ~ʆwʆpʆiʆbʆ[ʆTʆMʆFʆ?ʆ8ʆ1ʆ*ʆ#ʆʆʆʆʆʆɆɆɆɆɆɆɆɆɆɆɆɆɆɆɆɆɆɆ{ɆtɆmɆfɆ_ɆXɆQɆJɆCɆ<Ɇ5Ɇ.Ɇ'Ɇ ɆɆɆ ɆɆȆȆȆȆȆȆȆȆȆȆȆȆȆȆȆȆȆȆȆxȆqȆjȆcȆ\ȆUȆNȆGȆ@Ȇ9Ȇ2Ȇ+Ȇ$ȆȆȆȆȆȆdždždždždždždždždždždždždždždždždždž|džudžndžgdž`džYdžRdžKdžDdž=dž6dž/dž(dž!dždždž dždžƆƆƆƆƆƆƆƆƆƆƆƆƆƆƆƆƆƆƆyƆrƆkƆdƆ]ƆVƆOƆHƆAƆ:Ɔ3Ɔ,Ɔ%ƆƆƆƆ ƆƆņņņņņņņņņņņņņņņņņņ}ņvņoņhņaņZņSņLņEņ>ņ7ņ0ņ)ņ"ņņņ ņņĆĆĆĆĆĆĆĆĆĆĆĆĆĆĆĆĆĆĆzĆsĆlĆeĆ^ĆWĆPĆIĆBĆ;Ć4Ć-Ć&ĆĆĆĆ ĆĆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆ††††††††††††††††††{†t†m†f†_†X†Q†J†C†<†5†.†'† ††† ††xqjc\UNG@92+$|ung`YRKD=6/(! 鿆⿆ۿԿͿƿyrkd]VOHA:3,% 澆߾ؾѾʾþ}vohaZSLE>70)" 꽆㽆ܽսνǽzsle^WPIB;4-& 缆༆ټҼ˼ļ~wpib[TMF?81*#뻆仆ݻֻϻȻ{tmf_XQJC<5.'  ﺆ躆ẆںӺ̺źxqjc\UNG@92+$칆幆޹׹йɹ¹|ung`YRKD=6/(! 鸆⸆۸Ը͸Ƹyrkd]VOHA:3,% 淆߷طѷʷ÷}vohaZSLE>70)" 궆㶆ܶնζǶzsle^WPIB;4-& 絆െٵҵ˵ĵ~wpib[TMF?81*#봆䴆ݴִϴȴ{tmf_XQJC<5.'  ﳆ賆᳆ڳӳ̳ųxqjc\UNG@92+$첆岆޲ײвɲ²|ung`YRKD=6/(! 鱆ⱆ۱ԱͱƱyrkd]VOHA:3,% 氆߰ذѰʰð}vohaZSLE>70)" ꯆ㯆ܯկίǯzsle^WPIB;4-& 箆ஆٮҮˮĮ~wpib[TMF?81*#뭆䭆ݭ֭ϭȭ{tmf_XQJC<5.'  st謆ᬆڬӬ̬Ŭxqjc\UNG@92+$쫆嫆ޫ׫Ыɫ«|ung`YRKD=6/(! 骆⪆۪Ԫͪƪyrkd]VOHA:3,% 橆ߩةѩʩé}vohaZSLE>70)" ꨆ㨆ܨըΨǨzsle^WPIB;4-& 秆৆٧ҧ˧ħ~wpib[TMF?81*#릆䦆ݦ֦ϦȦ{tmf_XQJC<5.'  牢襆᥆ڥӥ̥ťxqjc\UNG@92+$줆夆ޤפФɤ¤|ung`YRKD=6/(! 飆⣆ۣԣͣƣyrkd]VOHA:3,% 梆ߢآѢʢâ}vohaZSLE>70)" ꡆ㡆ܡաΡǡzsle^WPIB;4-& 砆ࠆ٠ҠˠĠ~wpib[TMF?81*#럆䟆ݟ֟ϟȟ{tmf_XQJC<5.'  螆ឆڞӞ̞Şxqjc\UNG@92+$읆坆ޝםНɝ|ung`YRKD=6/(! 霆✆ۜԜ͜Ɯyrkd]VOHA:3,% 훆曆ߛ؛ћʛÛ}vohaZSLE>70)" Ꚇ㚆ܚ՚Κǚzsle^WPIB;4-& 癆ٙҙ˙ę~wpib[TMF?81*#똆䘆ݘ֘ϘȘ{tmf_XQJC<5.'  藆ᗆڗӗ̗ŗxqjc\UNG@92+$얆喆ޖזЖɖ–|ung`YRKD=6/(! 镆╆ەԕ͕ƕyrkd]VOHA:3,% 픆攆ߔؔєʔÔ}vohaZSLE>70)" ꓆㓆ܓՓΓǓzsle^WPIB;4-& 璆ْҒ˒Ē~wpib[TMF?81*#둆䑆ݑ֑ϑȑ{tmf_XQJC<5.'  萆ᐆڐӐ̐Őxqjc\UNG@92+$쏆叆ޏ׏Џɏ|ung`YRKD=6/(! 鎆⎆ێԎ͎Ǝyrkd]VOHA:3,% 퍆捆ߍ؍эʍÍ}vohaZSLE>70)" ꌆ㌆܌ՌΌnjzsle^WPIB;4-& 狆ًҋˋċ~wpib[TMF?81*#늆䊆݊֊ϊȊ{tmf_XQJC<5.'  艆ቆډӉ̉ʼnxqjc\UNG@92+$숆分ވ׈ЈɈˆ|ung`YRKD=6/(! 釆⇆ۇԇ͇Ƈyrkd]VOHA:3,% 톆憆߆؆цʆÆ}vohaZSLE>70)" ꅆㅆ܅Յ΅Džzsle^WPIB;4-& 焆ل҄˄Ą~wpib[TMF?81*#냆䃆݃փσȃ{tmf_XQJC<5.'  肆ႆڂӂ̂łxqjc\UNG@92+$쁆偆ށׁЁɁ|ung`YRKD=6/(! 逆 ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ߅߅߅߅߅߅߅߅߅߅߅߅߅߅߅߅߅߅߅y߅r߅k߅d߅]߅V߅O߅H߅A߅:߅3߅,߅%߅߅߅߅ ߅߅ޅޅޅޅޅޅޅޅޅޅޅޅޅޅޅޅޅޅ}ޅvޅoޅhޅaޅZޅSޅLޅEޅ>ޅ7ޅ0ޅ)ޅ"ޅޅޅ ޅޅ݅݅݅݅݅݅݅݅݅݅݅݅݅݅݅݅݅݅݅z݅s݅l݅e݅^݅W݅P݅I݅B݅;݅4݅-݅&݅݅݅݅ ݅݅܅܅܅܅܅܅܅܅܅܅܅܅܅܅܅܅܅܅~܅w܅p܅i܅b܅[܅T܅M܅F܅?܅8܅1܅*܅#܅܅܅܅܅܅ۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅ{ۅtۅmۅfۅ_ۅXۅQۅJۅCۅ<ۅ5ۅ.ۅ'ۅ ۅۅۅ ۅۅڅڅڅڅڅڅڅڅڅڅڅڅڅڅڅڅڅڅڅxڅqڅjڅcڅ\څUڅNڅGڅ@څ9څ2څ+څ$څڅڅڅڅڅمممممممممممممممممم|مuمnمgم`مYمRمKمDم=م6م/م(م!ممم مم؅؅؅؅؅؅؅؅؅؅؅؅؅؅؅؅؅؅؅y؅r؅k؅d؅]؅V؅O؅H؅A؅:؅3؅,؅%؅؅؅؅ ؅؅ׅׅׅׅׅׅׅׅׅׅׅׅׅׅׅׅׅׅ}ׅvׅoׅhׅaׅZׅSׅLׅEׅ>ׅ7ׅ0ׅ)ׅ"ׅׅׅ ׅׅօօօօօօօօօօօօօօօօօօօzօsօlօeօ^օWօPօIօBօ;օ4օ-օ&օօօօ օօՅՅՅՅՅՅՅՅՅՅՅՅՅՅՅՅՅՅ~ՅwՅpՅiՅbՅ[ՅTՅMՅFՅ?Յ8Յ1Յ*Յ#ՅՅՅՅՅՅԅԅԅԅԅԅԅԅԅԅԅԅԅԅԅԅԅԅ{ԅtԅmԅfԅ_ԅXԅQԅJԅCԅ<ԅ5ԅ.ԅ'ԅ ԅԅԅ ԅԅӅӅӅӅӅӅӅӅӅӅӅӅӅӅӅӅӅӅӅxӅqӅjӅcӅ\ӅUӅNӅGӅ@Ӆ9Ӆ2Ӆ+Ӆ$ӅӅӅӅӅӅ҅҅҅҅҅҅҅҅҅҅҅҅҅҅҅҅҅҅|҅u҅n҅g҅`҅Y҅R҅K҅D҅=҅6҅/҅(҅!҅҅҅ ҅҅хххххххххххххххххххyхrхkхdх]хVхOхHхAх:х3х,х%хххх ххЅЅЅЅЅЅЅЅЅЅЅЅЅЅЅЅЅЅ}ЅvЅoЅhЅaЅZЅSЅLЅEЅ>Ѕ7Ѕ0Ѕ)Ѕ"ЅЅЅ ЅЅυυυυυυυυυυυυυυυυυυυzυsυlυeυ^υWυPυIυBυ;υ4υ-υ&υυυυ υυ΅΅΅΅΅΅΅΅΅΅΅΅΅΅΅΅΅΅~΅w΅p΅i΅b΅[΅T΅M΅F΅?΅8΅1΅*΅#΅΅΅΅΅΅ͅͅͅͅͅͅͅͅͅͅͅͅͅͅͅͅͅͅ{ͅtͅmͅfͅ_ͅXͅQͅJͅCͅ<ͅ5ͅ.ͅ'ͅ ͅͅͅ ̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅ͅͅx̅q̅j̅c̅\̅U̅N̅G̅@̅9̅2̅+̅$̅̅̅̅̅̅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅|˅u˅n˅g˅`˅Y˅R˅K˅D˅=˅6˅/˅(˅!˅˅˅ ˅˅ʅʅʅʅʅʅʅʅʅʅʅʅʅʅʅʅʅʅʅyʅrʅkʅdʅ]ʅVʅOʅHʅAʅ:ʅ3ʅ,ʅ%ʅʅʅʅ ʅʅɅɅɅɅɅɅɅɅɅɅɅɅɅɅɅɅɅɅ}ɅvɅoɅhɅaɅZɅSɅLɅEɅ>Ʌ7Ʌ0Ʌ)Ʌ"ɅɅɅ ɅɅȅȅȅȅȅȅȅȅȅȅȅȅȅȅȅȅȅȅȅzȅsȅlȅeȅ^ȅWȅPȅIȅBȅ;ȅ4ȅ-ȅ&ȅȅȅȅ ȅȅDžDžDžDžDžDžDžDžDžDžDžDžDžDžDžDžDžDž~DžwDžpDžiDžbDž[DžTDžMDžFDž?Dž8Dž1Dž*Dž#DžDžDžDžDžDžƅƅƅƅƅƅƅƅƅƅƅƅƅƅƅƅƅƅ{ƅtƅmƅfƅ_ƅXƅQƅJƅCƅ<ƅ5ƅ.ƅ'ƅ ƅƅƅ ƅƅŅŅŅŅŅŅŅŅŅŅŅŅŅŅŅŅŅŅŅxŅqŅjŅcŅ\ŅUŅNŅGŅ@Ņ9Ņ2Ņ+Ņ$ŅŅŅŅŅŅąąąąąąąąąąąąąąąąąą|ąuąnągą`ąYąRąKąDą=ą6ą/ą(ą!ąąą ąąÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅ………………………………………………}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……zsle^WPIB;4-& ~wpib[TMF?81*#뿅俅ݿֿϿȿ{tmf_XQJC<5.'  ナ辅ᾅھӾ̾žxqjc\UNG@92+$콅彅޽׽нɽ½|ung`YRKD=6/(! 鼅⼅ۼԼͼƼyrkd]VOHA:3,% 滅߻ػѻʻû}vohaZSLE>70)" 꺅㺅ܺպκǺzsle^WPIB;4-& 繅ๅٹҹ˹Ĺ~wpib[TMF?81*#븅丅ݸָϸȸ{tmf_XQJC<5.'  ﷅ跅᷅ڷӷ̷ŷxqjc\UNG@92+$춅嶅޶׶жɶ¶|ung`YRKD=6/(! 鵅ⵅ۵Ե͵Ƶyrkd]VOHA:3,% 洅ߴشѴʴô}vohaZSLE>70)" 곅㳅ܳճγdzzsle^WPIB;4-& 粅ಅٲҲ˲IJ~wpib[TMF?81*#뱅䱅ݱֱϱȱ{tmf_XQJC<5.'  ﰅ谅ᰅڰӰ̰Űxqjc\UNG@92+$쯅寅ޯׯЯɯ¯|ung`YRKD=6/(! 鮅⮅ۮԮͮƮyrkd]VOHA:3,% 歅߭حѭʭí}vohaZSLE>70)" ꬅ㬅ܬլάǬzsle^WPIB;4-& 竅ૅ٫ҫ˫ī~wpib[TMF?81*#명䪅ݪ֪ϪȪ{tmf_XQJC<5.'  海詅ᩅکө̩ũxqjc\UNG@92+$쨅娅ިרШɨ¨|ung`YRKD=6/(! 駅⧅ۧԧͧƧyrkd]VOHA:3,% 榅ߦئѦʦæ}vohaZSLE>70)" ꥅ㥅ܥեΥǥzsle^WPIB;4-& 礅अ٤ҤˤĤ~wpib[TMF?81*#룅䣅ݣ֣ϣȣ{tmf_XQJC<5.'  袅ᢅڢӢ̢Ţxqjc\UNG@92+$졅塅ޡסСɡ¡|ung`YRKD=6/(! 項⠅۠Ԡ͠Ơyrkd]VOHA:3,% ퟅ柅ߟ؟џʟß}vohaZSLE>70)" ꞅ㞅ܞ՞ΞǞzsle^WPIB;4-& 睅ٝҝ˝ĝ~wpib[TMF?81*#뜅䜅ݜ֜ϜȜ{tmf_XQJC<5.'  蛅ᛅڛӛ̛śxqjc\UNG@92+$욅嚅ޚךКɚš|ung`YRKD=6/(! 际♅ۙԙ͙ƙyrkd]VOHA:3,% 혅昅ߘؘјʘØ}vohaZSLE>70)" ꗅ㗅ܗ՗ΗǗzsle^WPIB;4-& 疅ٖҖ˖Ė~wpib[TMF?81*#땅䕅ݕ֕ϕȕ{tmf_XQJC<5.'  蔅ᔅڔӔ̔Ŕxqjc\UNG@92+$쓅哅ޓדГɓ“|ung`YRKD=6/(! 钅⒅ےԒ͒ƒyrkd]VOHA:3,% 푅摅ߑؑёʑÑ}vohaZSLE>70)" ꐅ㐅ܐՐΐǐzsle^WPIB;4-& 珅ُҏˏď~wpib[TMF?81*#뎅䎅ݎ֎ώȎ{tmf_XQJC<5.'  荅ፅڍӍ̍ōxqjc\UNG@92+$쌅包ތ׌ЌɌŒ|ung`YRKD=6/(! 鋅⋅ۋԋ͋Ƌyrkd]VOHA:3,% 튅抅ߊ؊ъʊÊ}vohaZSLE>70)" ꉅ㉅܉ՉΉljzsle^WPIB;4-& 爅و҈ˈĈ~wpib[TMF?81*#뇅䇅݇ևχȇ{tmf_XQJC<5.'  膅ᆅچӆ̆ņxqjc\UNG@92+$셅充ޅׅЅɅ…|ung`YRKD=6/(! 鄅℅ۄԄ̈́Ƅyrkd]VOHA:3,% 탅情߃؃уʃÃ}vohaZSLE>70)" ꂅゅ܂Ղ΂ǂzsle^WPIB;4-& 灅فҁˁā~wpib[TMF?81*#뀅䀅݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#߄߄߄߄߄߄߄߄߄߄߄߄߄߄߄߄߄߄{߄t߄m߄f߄_߄X߄Q߄J߄C߄<߄5߄.߄'߄ ߄߄߄ ߄߄ބބބބބބބބބބބބބބބބބބބxބqބjބcބ\ބUބNބGބ@ބ9ބ2ބ+ބ$ބބބބބބ݄݄݄݄݄݄݄݄݄݄݄݄݄݄݄݄݄݄|݄u݄n݄g݄`݄Y݄R݄K݄D݄=݄6݄/݄(݄!݄݄݄ ݄݄܄܄܄܄܄܄܄܄܄܄܄܄܄܄܄܄܄܄܄y܄r܄k܄d܄]܄V܄O܄H܄A܄:܄3܄,܄%܄܄܄܄ ܄܄ۄۄۄۄۄۄۄۄۄۄۄۄۄۄۄۄۄۄ}ۄvۄoۄhۄaۄZۄSۄLۄEۄ>ۄ7ۄ0ۄ)ۄ"ۄۄۄ ۄۄڄڄڄڄڄڄڄڄڄڄڄڄڄڄڄڄڄڄڄzڄsڄlڄeڄ^ڄWڄPڄIڄBڄ;ڄ4ڄ-ڄ&ڄڄڄڄ ڄڄلللللللللللللللللل~لwلpلiلbل[لTلMلFل?ل8ل1ل*ل#لللللل؄؄؄؄؄؄؄؄؄؄؄؄؄؄؄؄؄؄{؄t؄m؄f؄_؄X؄Q؄J؄C؄<؄5؄.؄'؄ ؄؄؄ ؄؄ׄׄׄׄׄׄׄׄׄׄׄׄׄׄׄׄׄׄׄxׄqׄjׄcׄ\ׄUׄNׄGׄ@ׄ9ׄ2ׄ+ׄ$ׄׄׄׄׄׄքքքքքքքքքքքքքքքքքք|քuքnքgք`քYքRքKքDք=ք6ք/ք(ք!քքք քքՄՄՄՄՄՄՄՄՄՄՄՄՄՄՄՄՄՄՄyՄrՄkՄdՄ]ՄVՄOՄHՄAՄ:Մ3Մ,Մ%ՄՄՄՄ ՄՄԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄ}ԄvԄoԄhԄaԄZԄSԄLԄEԄ>Ԅ7Ԅ0Ԅ)Ԅ"ԄԄԄ ԄԄӄӄӄӄӄӄӄӄӄӄӄӄӄӄӄӄӄӄӄzӄsӄlӄeӄ^ӄWӄPӄIӄBӄ;ӄ4ӄ-ӄ&ӄӄӄӄ ӄӄ҄҄҄҄҄҄҄҄҄҄҄҄҄҄҄҄҄҄~҄w҄p҄i҄b҄[҄T҄M҄F҄?҄8҄1҄*҄#҄҄҄҄҄҄фффффффффффффффффф{фtфmфfф_фXфQфJфCф<ф5ф.ф'ф ффф ффЄЄЄЄЄЄЄЄЄЄЄЄЄЄЄЄЄЄЄxЄqЄjЄcЄ\ЄUЄNЄGЄ@Є9Є2Є+Є$ЄЄЄЄЄЄττττττττττττττττττ|τuτnτgτ`τYτRτKτDτ=τ6τ/τ(τ!τττ ττ΄΄΄΄΄΄΄΄΄΄΄΄΄΄΄΄΄΄΄y΄r΄k΄d΄]΄V΄O΄H΄A΄:΄3΄,΄%΄΄΄΄ ΄΄̈́̈́̈́̈́̈́̈́̈́̈́̈́̈́̈́̈́̈́̈́̈́̈́̈́̈́}̈́v̈́ö́ḧ́ä́Z̈́S̈́L̈́Ë́>̈́7̈́0̈́)̈́"̈́̈́̈́ ̈́̈́̄̄̄̄̄̄̄̄̄̄̄̄̄̄̄̄̄̄̄z̄s̄l̄ē^̄W̄P̄ĪB̄;̄4̄-̄&̄̄̄̄ ̄̄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄~˄w˄p˄i˄b˄[˄T˄M˄F˄?˄8˄1˄*˄#˄˄˄˄˄˄ʄʄʄʄʄʄʄʄʄʄʄʄʄʄʄʄʄʄ{ʄtʄmʄfʄ_ʄXʄQʄJʄCʄ<ʄ5ʄ.ʄ'ʄ ʄʄʄ ʄʄɄɄɄɄɄɄɄɄɄɄɄɄɄɄɄɄɄɄɄxɄqɄjɄcɄ\ɄUɄNɄGɄ@Ʉ9Ʉ2Ʉ+Ʉ$ɄɄɄɄɄɄȄȄȄȄȄȄȄȄȄȄȄȄȄȄȄȄȄȄ|ȄuȄnȄgȄ`ȄYȄRȄKȄDȄ=Ȅ6Ȅ/Ȅ(Ȅ!ȄȄȄ ȄȄDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽDŽyDŽrDŽkDŽdDŽ]DŽVDŽODŽHDŽADŽ:DŽ3DŽ,DŽ%DŽDŽDŽDŽ DŽDŽƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄ}ƄvƄoƄhƄaƄZƄSƄLƄEƄ>Ƅ7Ƅ0Ƅ)Ƅ"ƄƄƄ ƄƄńńńńńńńńńńńńńńńńńńńzńsńlńeń^ńWńPńIńBń;ń4ń-ń&ńńńń ńńĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ~ĄwĄpĄiĄbĄ[ĄTĄMĄFĄ?Ą8Ą1Ą*Ą#ĄĄĄĄĄĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄ„„„„„„„„„„„„„„„„„„„x„q„j„c„\„U„N„G„@„9„2„+„$„„„„„„|ung`YRKD=6/(! yrkd]VOHA:3,% 濄߿ؿѿʿÿ}vohaZSLE>70)" 꾄㾄ܾվξǾzsle^WPIB;4-& 罄ངٽҽ˽Ľ~wpib[TMF?81*#뼄伄ݼּϼȼ{tmf_XQJC<5.'  ﻄ軄Ễڻӻ̻Żxqjc\UNG@92+$캄庄޺׺кɺº|ung`YRKD=6/(! 鹄⹄۹Թ͹ƹyrkd]VOHA:3,% 渄߸ظѸʸø}vohaZSLE>70)" 귄㷄ܷշηǷzsle^WPIB;4-& 綄඄ٶҶ˶Ķ~wpib[TMF?81*#뵄䵄ݵֵϵȵ{tmf_XQJC<5.'  ﴄ贄ᴄڴӴ̴Ŵxqjc\UNG@92+$쳄峄޳׳гɳ³|ung`YRKD=6/(! 鲄Ⲅ۲ԲͲƲyrkd]VOHA:3,% 汄߱رѱʱñ}vohaZSLE>70)" 간㰄ܰհΰǰzsle^WPIB;4-& 範௄ٯү˯į~wpib[TMF?81*#뮄䮄ݮ֮ϮȮ{tmf_XQJC<5.'  פּ譄᭄ڭӭ̭ŭxqjc\UNG@92+$쬄嬄ެ׬Ьɬ¬|ung`YRKD=6/(! 髄⫄۫ԫͫƫyrkd]VOHA:3,% 檄ߪتѪʪê}vohaZSLE>70)" ꩄ㩄ܩթΩǩzsle^WPIB;4-& 稄਄٨Ҩ˨Ĩ~wpib[TMF?81*#맄䧄ݧ֧ϧȧ{tmf_XQJC<5.'  濾覄ᦄڦӦ̦Ŧxqjc\UNG@92+$쥄奄ޥץХɥ¥|ung`YRKD=6/(! 餄⤄ۤԤͤƤyrkd]VOHA:3,% 棄ߣأѣʣã}vohaZSLE>70)" ꢄ㢄ܢբ΢Ǣzsle^WPIB;4-& 硄ࡄ١ҡˡġ~wpib[TMF?81*#렄䠄ݠ֠ϠȠ{tmf_XQJC<5.'  蟄ោڟӟ̟şxqjc\UNG@92+$임垄ޞמОɞž|ung`YRKD=6/(! 靄❄۝ԝ͝Ɲyrkd]VOHA:3,% 휄朄ߜ؜ќʜÜ}vohaZSLE>70)" ꛄ㛄ܛ՛ΛǛzsle^WPIB;4-& 的ٚҚ˚Ě~wpib[TMF?81*#뙄䙄ݙ֙ϙș{tmf_XQJC<5.'  蘄ᘄژӘ̘Řxqjc\UNG@92+$엄嗄ޗחЗɗ—|ung`YRKD=6/(! 閄▄ۖԖ͖Ɩyrkd]VOHA:3,% 필敄ߕؕѕʕÕ}vohaZSLE>70)" ꔄ㔄ܔՔΔǔzsle^WPIB;4-& 瓄ٓғ˓ē~wpib[TMF?81*#뒄䒄ݒ֒ϒȒ{tmf_XQJC<5.'  葄ᑄڑӑ̑őxqjc\UNG@92+$쐄各ސאАɐ|ung`YRKD=6/(! 鏄⏄ۏԏ͏Əyrkd]VOHA:3,% 펄掄ߎ؎юʎÎ}vohaZSLE>70)" ꍄ㍄܍Ս΍Ǎzsle^WPIB;4-& 猄ٌҌˌČ~wpib[TMF?81*#닄䋄݋֋ϋȋ{tmf_XQJC<5.'  芄ኄڊӊ̊Ŋxqjc\UNG@92+$쉄剄މ׉Љɉ‰|ung`YRKD=6/(! 鈄∄ۈԈ͈ƈyrkd]VOHA:3,% 퇄懄߇؇чʇÇ}vohaZSLE>70)" ꆄㆄ܆ՆΆdžzsle^WPIB;4-& 煄م҅˅ą~wpib[TMF?81*#넄䄄݄քτȄ{tmf_XQJC<5.'  胄ჄڃӃ̃Ńxqjc\UNG@92+$삄傄ނׂЂɂ‚|ung`YRKD=6/(! 遄⁄ہԁ́Ɓyrkd]VOHA:3,% 퀄怄߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߃߃߃߃߃߃߃߃߃߃߃߃߃߃߃߃߃߃}߃v߃o߃h߃a߃Z߃S߃L߃E߃>߃7߃0߃)߃"߃߃߃ ߃߃ރރރރރރރރރރރރރރރރރރރzރsރlރeރ^ރWރPރIރBރ;ރ4ރ-ރ&ރރރރ ރރ݃݃݃݃݃݃݃݃݃݃݃݃݃݃݃݃݃݃~݃w݃p݃i݃b݃[݃T݃M݃F݃?݃8݃1݃*݃#݃݃݃݃݃݃܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃{܃t܃m܃f܃_܃X܃Q܃J܃C܃<܃5܃.܃'܃ ܃܃܃ ܃܃ۃۃۃۃۃۃۃۃۃۃۃۃۃۃۃۃۃۃۃxۃqۃjۃcۃ\ۃUۃNۃGۃ@ۃ9ۃ2ۃ+ۃ$ۃۃۃۃۃۃڃڃڃڃڃڃڃڃڃڃڃڃڃڃڃڃڃڃ|ڃuڃnڃgڃ`ڃYڃRڃKڃDڃ=ڃ6ڃ/ڃ(ڃ!ڃڃڃ ڃڃكككككككككككككككككككyكrكkكdك]كVكOكHكAك:ك3ك,ك%كككك كك؃؃؃؃؃؃؃؃؃؃؃؃؃؃؃؃؃؃}؃v؃o؃h؃a؃Z؃S؃L؃E؃>؃7؃0؃)؃"؃؃؃ ؃؃׃׃׃׃׃׃׃׃׃׃׃׃׃׃׃׃׃׃׃z׃s׃l׃e׃^׃W׃P׃I׃B׃;׃4׃-׃&׃׃׃׃ ׃׃փփփփփփփփփփփփփփփփփփ~փwփpփiփbփ[փTփMփFփ?փ8փ1փ*փ#փփփփփփՃՃՃՃՃՃՃՃՃՃՃՃՃՃՃՃՃՃ{ՃtՃmՃfՃ_ՃXՃQՃJՃCՃ<Ճ5Ճ.Ճ'Ճ ՃՃՃ ՃՃԃԃԃԃԃԃԃԃԃԃԃԃԃԃԃԃԃԃԃxԃqԃjԃcԃ\ԃUԃNԃGԃ@ԃ9ԃ2ԃ+ԃ$ԃԃԃԃԃԃӃӃӃӃӃӃӃӃӃӃӃӃӃӃӃӃӃӃ|ӃuӃnӃgӃ`ӃYӃRӃKӃDӃ=Ӄ6Ӄ/Ӄ(Ӄ!ӃӃӃ ӃӃ҃҃҃҃҃҃҃҃҃҃҃҃҃҃҃҃҃҃҃y҃r҃k҃d҃]҃V҃O҃H҃A҃:҃3҃,҃%҃҃҃҃ ҃҃уууууууууууууууууу}уvуoуhуaуZуSуLуEу>у7у0у)у"ууу ууЃЃЃЃЃЃЃЃЃЃЃЃЃЃЃЃЃЃЃzЃsЃlЃeЃ^ЃWЃPЃIЃBЃ;Ѓ4Ѓ-Ѓ&ЃЃЃЃ ЃЃσσσσσσσσσσσσσσσσσσ~σwσpσiσbσ[σTσMσFσ?σ8σ1σ*σ#σσσσσσ΃΃΃΃΃΃΃΃΃΃΃΃΃΃΃΃΃΃{΃t΃m΃f΃_΃X΃Q΃J΃C΃<΃5΃.΃'΃ ΃΃΃ ΃΃̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓x̓q̓j̓c̓\̓U̓N̓G̓@̓9̓2̓+̓$̓̓̓̓̓̓̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃|̃ũñg̃`̃ỸR̃K̃D̃=̃6̃/̃(̃!̃̃̃ ̃̃˃˃˃˃˃˃˃˃˃˃˃˃˃˃˃˃˃˃˃y˃r˃k˃d˃]˃V˃O˃H˃A˃:˃3˃,˃%˃˃˃˃ ˃˃ʃʃʃʃʃʃʃʃʃʃʃʃʃʃʃʃʃʃ}ʃvʃoʃhʃaʃZʃSʃLʃEʃ>ʃ7ʃ0ʃ)ʃ"ʃʃʃ ʃʃɃɃɃɃɃɃɃɃɃɃɃɃɃɃɃɃɃɃɃzɃsɃlɃeɃ^ɃWɃPɃIɃBɃ;Ƀ4Ƀ-Ƀ&ɃɃɃɃ ɃɃȃȃȃȃȃȃȃȃȃȃȃȃȃȃȃȃȃȃ~ȃwȃpȃiȃbȃ[ȃTȃMȃFȃ?ȃ8ȃ1ȃ*ȃ#ȃȃȃȃȃȃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃ{ǃtǃmǃfǃ_ǃXǃQǃJǃCǃ<ǃ5ǃ.ǃ'ǃ ǃǃǃ ǃǃƃƃƃƃƃƃƃƃƃƃƃƃƃƃƃƃƃƃƃxƃqƃjƃcƃ\ƃUƃNƃGƃ@ƃ9ƃ2ƃ+ƃ$ƃƃƃƃƃƃŃŃŃŃŃŃŃŃŃŃŃŃŃŃŃŃŃŃ|ŃuŃnŃgŃ`ŃYŃRŃKŃDŃ=Ń6Ń/Ń(Ń!ŃŃŃ ŃŃăăăăăăăăăăăăăăăăăăăyărăkădă]ăVăOăHăAă:ă3ă,ă%ăăăă ăăÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ}ÃvÃoÃhÃaÃZÃSÃLÃEÃ>Ã7Ã0Ã)Ã"ÃÃà ÃÃzƒsƒlƒeƒ^ƒWƒPƒIƒBƒ;ƒ4ƒ-ƒ&ƒƒƒƒ ƒƒ~wpib[TMF?81*#{tmf_XQJC<5.'  ᅢ迃ῃڿӿ̿ſxqjc\UNG@92+$쾃徃޾׾оɾ¾|ung`YRKD=6/(! 齃⽃۽Խͽƽyrkd]VOHA:3,% 漃߼ؼѼʼü}vohaZSLE>70)" 껃㻃ܻջλǻzsle^WPIB;4-& 纃຃ٺҺ˺ĺ~wpib[TMF?81*#빃乃ݹֹϹȹ{tmf_XQJC<5.'  ︃踃ḃڸӸ̸Ÿxqjc\UNG@92+$췃巃޷׷зɷ·|ung`YRKD=6/(! 鶃ⶃ۶ԶͶƶyrkd]VOHA:3,% 浃ߵصѵʵõ}vohaZSLE>70)" 괃㴃ܴմδǴzsle^WPIB;4-& 糃ೃٳҳ˳ij~wpib[TMF?81*#벃䲃ݲֲϲȲ{tmf_XQJC<5.'  ﱃ豃᱃ڱӱ̱űxqjc\UNG@92+$찃尃ްװаɰ°|ung`YRKD=6/(! 鯃⯃ۯԯͯƯyrkd]VOHA:3,% 殃߮خѮʮî}vohaZSLE>70)" ꭃ㭃ܭխέǭzsle^WPIB;4-& 笃ଃ٬ҬˬĬ~wpib[TMF?81*#뫃䫃ݫ֫ϫȫ{tmf_XQJC<5.'  廙誃᪃ڪӪ̪Ūxqjc\UNG@92+$쩃婃ީשЩɩ©|ung`YRKD=6/(! 騃⨃ۨԨͨƨyrkd]VOHA:3,% 槃ߧاѧʧç}vohaZSLE>70)" ꦃ㦃ܦզΦǦzsle^WPIB;4-& 祃ृ٥ҥ˥ĥ~wpib[TMF?81*#뤃䤃ݤ֤ϤȤ{tmf_XQJC<5.'  裃ᣃڣӣ̣ţxqjc\UNG@92+$좃境ޢעТɢ¢|ung`YRKD=6/(! 顃⡃ۡԡ͡ơyrkd]VOHA:3,% 栃ߠؠѠʠà}vohaZSLE>70)" ꟃ㟃ܟ՟Οǟzsle^WPIB;4-& 瞃ٞҞ˞Ğ~wpib[TMF?81*#띃䝃ݝ֝ϝȝ{tmf_XQJC<5.'  蜃ᜃڜӜ̜Ŝxqjc\UNG@92+$웃囃ޛכЛɛ›|ung`YRKD=6/(! 隃⚃ۚԚ͚ƚyrkd]VOHA:3,% 홃晃ߙؙљʙÙ}vohaZSLE>70)" ꘃ㘃ܘ՘Θǘzsle^WPIB;4-& 痃ٗҗ˗ė~wpib[TMF?81*#떃䖃ݖ֖ϖȖ{tmf_XQJC<5.'  蕃ᕃڕӕ̕ŕxqjc\UNG@92+$씃唃ޔהДɔ”|ung`YRKD=6/(! 铃Ⓝۓԓ͓Ɠyrkd]VOHA:3,% 풃撃ߒؒђʒÒ}vohaZSLE>70)" ꑃ㑃ܑՑΑǑzsle^WPIB;4-& 球ِҐːĐ~wpib[TMF?81*#돃䏃ݏ֏Ϗȏ{tmf_XQJC<5.'  莃ᎃڎӎ̎Ŏxqjc\UNG@92+$썃千ލ׍Ѝɍ|ung`YRKD=6/(! 錃⌃یԌ͌ƌyrkd]VOHA:3,% 틃拃ߋ؋ыʋË}vohaZSLE>70)" ꊃ㊃܊ՊΊNJzsle^WPIB;4-& 牃ى҉ˉĉ~wpib[TMF?81*#눃䈃݈ֈψȈ{tmf_XQJC<5.'  臃ᇃڇӇ̇Ňxqjc\UNG@92+$솃冃ކ׆ІɆ†|ung`YRKD=6/(! 酃⅃ۅԅͅƅyrkd]VOHA:3,% 턃愃߄؄фʄÄ}vohaZSLE>70)" ꃃッ܃Ճ΃ǃzsle^WPIB;4-& 炃ق҂˂Ă~wpib[TMF?81*#끃䁃݁ցρȁ{tmf_XQJC<5.'  考ဃڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ߂߂߂߂߂߂߂߂߂߂߂߂߂߂߂߂߂߂߂x߂q߂j߂c߂\߂U߂N߂G߂@߂9߂2߂+߂$߂߂߂߂߂߂ނނނނނނނނނނނނނނނނނނ|ނuނnނgނ`ނYނRނKނDނ=ނ6ނ/ނ(ނ!ނނނ ނނ݂݂݂݂݂݂݂݂݂݂݂݂݂݂݂݂݂݂݂y݂r݂k݂d݂]݂V݂O݂H݂A݂:݂3݂,݂%݂݂݂݂ ݂݂܂܂܂܂܂܂܂܂܂܂܂܂܂܂܂܂܂܂}܂v܂o܂h܂a܂Z܂S܂L܂E܂>܂7܂0܂)܂"܂܂܂ ܂܂ۂۂۂۂۂۂۂۂۂۂۂۂۂۂۂۂۂۂۂzۂsۂlۂeۂ^ۂWۂPۂIۂBۂ;ۂ4ۂ-ۂ&ۂۂۂۂ ۂۂڂڂڂڂڂڂڂڂڂڂڂڂڂڂڂڂڂڂ~ڂwڂpڂiڂbڂ[ڂTڂMڂFڂ?ڂ8ڂ1ڂ*ڂ#ڂڂڂڂڂڂقققققققققققققققققق{قtقmقfق_قXقQقJقCق<ق5ق.ق'ق ققق قق؂؂؂؂؂؂؂؂؂؂؂؂؂؂؂؂؂؂؂x؂q؂j؂c؂\؂U؂N؂G؂@؂9؂2؂+؂$؂؂؂؂؂؂ׂׂׂׂׂׂׂׂׂׂׂׂׂׂׂׂׂׂ|ׂuׂnׂgׂ`ׂYׂRׂKׂDׂ=ׂ6ׂ/ׂ(ׂ!ׂׂׂ ׂׂւււււււււււււււււււyւrւkւdւ]ւVւOւHւAւ:ւ3ւ,ւ%ււււ ււՂՂՂՂՂՂՂՂՂՂՂՂՂՂՂՂՂՂ}ՂvՂoՂhՂaՂZՂSՂLՂEՂ>Ղ7Ղ0Ղ)Ղ"ՂՂՂ ՂՂԂԂԂԂԂԂԂԂԂԂԂԂԂԂԂԂԂԂԂzԂsԂlԂeԂ^ԂWԂPԂIԂBԂ;Ԃ4Ԃ-Ԃ&ԂԂԂԂ ԂԂӂӂӂӂӂӂӂӂӂӂӂӂӂӂӂӂӂӂ~ӂwӂpӂiӂbӂ[ӂTӂMӂFӂ?ӂ8ӂ1ӂ*ӂ#ӂӂӂӂӂӂ҂҂҂҂҂҂҂҂҂҂҂҂҂҂҂҂҂҂{҂t҂m҂f҂_҂X҂Q҂J҂C҂<҂5҂.҂'҂ ҂҂҂ ҂҂тттттттттттттттттттxтqтjтcт\тUтNтGт@т9т2т+т$ттттттЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂ|ЂuЂnЂgЂ`ЂYЂRЂKЂDЂ=Ђ6Ђ/Ђ(Ђ!ЂЂЂ ЂЂςςςςςςςςςςςςςςςςςςςyςrςkςdς]ςVςOςHςAς:ς3ς,ς%ςςςς ςς΂΂΂΂΂΂΂΂΂΂΂΂΂΂΂΂΂΂}΂v΂o΂h΂a΂Z΂S΂L΂E΂>΂7΂0΂)΂"΂΂΂ ΂΂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂z͂s͂l͂e͂^͂W͂P͂I͂B͂;͂4͂-͂&͂͂͂͂ ͂͂̂̂̂̂̂̂̂̂̂̂̂̂̂̂̂̂̂̂~̂ŵp̂îb̂[̂T̂M̂F̂?̂8̂1̂*̂#̂̂̂̂̂̂˂˂˂˂˂˂˂˂˂˂˂˂˂˂˂˂˂˂{˂t˂m˂f˂_˂X˂Q˂J˂C˂<˂5˂.˂'˂ ˂˂˂ ˂˂ʂʂʂʂʂʂʂʂʂʂʂʂʂʂʂʂʂʂʂxʂqʂjʂcʂ\ʂUʂNʂGʂ@ʂ9ʂ2ʂ+ʂ$ʂʂʂʂʂʂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ|ɂuɂnɂgɂ`ɂYɂRɂKɂDɂ=ɂ6ɂ/ɂ(ɂ!ɂɂɂ ɂɂȂȂȂȂȂȂȂȂȂȂȂȂȂȂȂȂȂȂȂyȂrȂkȂdȂ]ȂVȂOȂHȂAȂ:Ȃ3Ȃ,Ȃ%ȂȂȂȂ ȂȂǂǂǂǂǂǂǂǂǂǂǂǂǂǂǂǂǂǂ}ǂvǂoǂhǂaǂZǂSǂLǂEǂ>ǂ7ǂ0ǂ)ǂ"ǂǂǂ ǂǂƂƂƂƂƂƂƂƂƂƂƂƂƂƂƂƂƂƂƂzƂsƂlƂeƂ^ƂWƂPƂIƂBƂ;Ƃ4Ƃ-Ƃ&ƂƂƂƂ ƂƂłłłłłłłłłłłłłłłłłł~łwłpłiłbł[łTłMłFł?ł8ł1ł*ł#łłłłłłĂĂĂĂĂĂĂĂĂĂĂĂĂĂĂĂĂĂ{ĂtĂmĂfĂ_ĂXĂQĂJĂCĂ<Ă5Ă.Ă'Ă ĂĂĂ ĂĂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂxÂqÂjÂcÂ\ÂUÂNÂGÂ@Â9Â2Â+Â$‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚|‚u‚n‚g‚`‚Y‚R‚K‚D‚=‚6‚/‚(‚!‚‚‚ ‚‚yrkd]VOHA:3,% }vohaZSLE>70)" 꿂㿂ܿտοǿzsle^WPIB;4-& 羂ྂپҾ˾ľ~wpib[TMF?81*#뽂佂ݽֽϽȽ{tmf_XQJC<5.'  "輂ἂڼӼ̼żxqjc\UNG@92+$컂廂޻׻лɻ»|ung`YRKD=6/(! 麂⺂ۺԺͺƺyrkd]VOHA:3,% 湂߹عѹʹù}vohaZSLE>70)" 긂㸂ܸոθǸzsle^WPIB;4-& 緂ෂٷҷ˷ķ~wpib[TMF?81*#붂䶂ݶֶ϶ȶ{tmf_XQJC<5.'  ﵂赂ᵂڵӵ̵ŵxqjc\UNG@92+$촂崂޴״дɴ´|ung`YRKD=6/(! 鳂Ⳃ۳ԳͳƳyrkd]VOHA:3,% 沂߲زѲʲò}vohaZSLE>70)" 걂㱂ܱձαDZzsle^WPIB;4-& 簂ంٰҰ˰İ~wpib[TMF?81*#믂䯂ݯ֯ϯȯ{tmf_XQJC<5.'  ﮂ讂ᮂڮӮ̮Ůxqjc\UNG@92+$쭂孂ޭ׭Эɭ­|ung`YRKD=6/(! 鬂⬂۬ԬͬƬyrkd]VOHA:3,% 櫂߫ثѫʫë}vohaZSLE>70)" ꪂ㪂ܪժΪǪzsle^WPIB;4-& 穂ੂ٩ҩ˩ĩ~wpib[TMF?81*#먂䨂ݨ֨ϨȨ{tmf_XQJC<5.'  蓼观ᧂڧӧ̧ŧxqjc\UNG@92+$즂如ަצЦɦ¦|ung`YRKD=6/(! 饂⥂ۥԥͥƥyrkd]VOHA:3,% 椂ߤؤѤʤä}vohaZSLE>70)" ꣂ㣂ܣգΣǣzsle^WPIB;4-& 碂ࢂ٢ҢˢĢ~wpib[TMF?81*#롂䡂ݡ֡ϡȡ{tmf_XQJC<5.'  蠂᠂ڠӠ̠Šxqjc\UNG@92+$쟂埂ޟןПɟŸ|ung`YRKD=6/(! 鞂➂۞Ԟ͞ƞyrkd]VOHA:3,% 흂杂ߝ؝ѝʝÝ}vohaZSLE>70)" ꜂㜂ܜ՜Μǜzsle^WPIB;4-& 盂ٛқ˛ě~wpib[TMF?81*#뚂䚂ݚ֚ϚȚ{tmf_XQJC<5.'  虂ᙂڙә̙řxqjc\UNG@92+$옂嘂ޘטИɘ˜|ung`YRKD=6/(! 闂◂ۗԗ͗Ɨyrkd]VOHA:3,% 햂斂ߖؖіʖÖ}vohaZSLE>70)" ꕂ㕂ܕՕΕǕzsle^WPIB;4-& 甂ٔҔ˔Ĕ~wpib[TMF?81*#듂䓂ݓ֓ϓȓ{tmf_XQJC<5.'  蒂ᒂڒӒ̒Œxqjc\UNG@92+$쑂呂ޑבБɑ‘|ung`YRKD=6/(! 鐂␂ېԐ͐Ɛyrkd]VOHA:3,% 폂揂ߏ؏яʏÏ}vohaZSLE>70)" ꎂ㎂܎ՎΎǎzsle^WPIB;4-& 獂ٍҍˍč~wpib[TMF?81*#댂䌂݌֌όȌ{tmf_XQJC<5.'  苂ዂڋӋ̋ŋxqjc\UNG@92+$슂劂ފ׊ЊɊŠ|ung`YRKD=6/(! 鉂≂ۉԉ͉Ɖyrkd]VOHA:3,% 툂戂߈؈шʈÈ}vohaZSLE>70)" ꇂ㇂܇Շ·LJzsle^WPIB;4-& 熂ن҆ˆĆ~wpib[TMF?81*#녂䅂݅օυȅ{tmf_XQJC<5.'  脂ᄂڄӄ̄ńxqjc\UNG@92+$샂僂ރ׃ЃɃƒ|ung`YRKD=6/(! 邂₂ۂԂ͂Ƃyrkd]VOHA:3,% 큂恂߁؁сʁÁ}vohaZSLE>70)" ꀂ。܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ߁߁߁߁߁߁߁߁߁߁߁߁߁߁߁߁߁߁߁z߁s߁l߁e߁^߁W߁P߁I߁B߁;߁4߁-߁&߁߁߁߁ ߁߁ށށށށށށށށށށށށށށށށށށ~ށwށpށiށbށ[ށTށMށFށ?ށ8ށ1ށ*ށ#ށށށށށށ݁݁݁݁݁݁݁݁݁݁݁݁݁݁݁݁݁݁{݁t݁m݁f݁_݁X݁Q݁J݁C݁<݁5݁.݁'݁ ݁݁݁ ݁݁܁܁܁܁܁܁܁܁܁܁܁܁܁܁܁܁܁܁܁x܁q܁j܁c܁\܁U܁N܁G܁@܁9܁2܁+܁$܁܁܁܁܁܁ہہہہہہہہہہہہہہہہہہ|ہuہnہgہ`ہYہRہKہDہ=ہ6ہ/ہ(ہ!ہہہ ہہځځځځځځځځځځځځځځځځځځځyځrځkځdځ]ځVځOځHځAځ:ځ3ځ,ځ%ځځځځ ځځفففففففففففففففففف}فvفoفhفaفZفSفLفEف>ف7ف0ف)ف"ففف فف؁؁؁؁؁؁؁؁؁؁؁؁؁؁؁؁؁؁؁z؁s؁l؁e؁^؁W؁P؁I؁B؁;؁4؁-؁&؁؁؁؁ ؁؁ׁׁׁׁׁׁׁׁׁׁׁׁׁׁׁׁׁׁ~ׁwׁpׁiׁbׁ[ׁTׁMׁFׁ?ׁ8ׁ1ׁ*ׁ#ׁׁׁׁׁׁցցցցցցցցցցցցցցցցցց{ցtցmցfց_ցXցQցJցCց<ց5ց.ց'ց ցցց ցցՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁxՁqՁjՁcՁ\ՁUՁNՁGՁ@Ձ9Ձ2Ձ+Ձ$ՁՁՁՁՁՁԁԁԁԁԁԁԁԁԁԁԁԁԁԁԁԁԁԁ|ԁuԁnԁgԁ`ԁYԁRԁKԁDԁ=ԁ6ԁ/ԁ(ԁ!ԁԁԁ ԁԁӁӁӁӁӁӁӁӁӁӁӁӁӁӁӁӁӁӁӁyӁrӁkӁdӁ]ӁVӁOӁHӁAӁ:Ӂ3Ӂ,Ӂ%ӁӁӁӁ ӁӁҁҁҁҁҁҁҁҁҁҁҁҁҁҁҁҁҁҁ}ҁvҁoҁhҁaҁZҁSҁLҁEҁ>ҁ7ҁ0ҁ)ҁ"ҁҁҁ ҁҁсссссссссссссссссссzсsсlсeс^сWсPсIсBс;с4с-с&сссс ссЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁ~ЁwЁpЁiЁbЁ[ЁTЁMЁFЁ?Ё8Ё1Ё*Ё#ЁЁЁЁЁЁρρρρρρρρρρρρρρρρρρ{ρtρmρfρ_ρXρQρJρCρ<ρ5ρ.ρ'ρ ρρρ ρρ΁΁΁΁΁΁΁΁΁΁΁΁΁΁΁΁΁΁΁x΁q΁j΁c΁\΁U΁N΁G΁@΁9΁2΁+΁$΁΁΁΁΁΁́́́́́́́́́́́́́́́́́́|́úńǵ`́ÝŔḰD́=́6́/́(́!́́́ ́́́́́́́́́́́́́́́́́́́́́ýŕḱd́]́V́ÓH́Á:́3́,́%́́́́ ́́ˁˁˁˁˁˁˁˁˁˁˁˁˁˁˁˁˁˁ}ˁvˁoˁhˁaˁZˁSˁLˁEˁ>ˁ7ˁ0ˁ)ˁ"ˁˁˁ ˁˁʁʁʁʁʁʁʁʁʁʁʁʁʁʁʁʁʁʁʁzʁsʁlʁeʁ^ʁWʁPʁIʁBʁ;ʁ4ʁ-ʁ&ʁʁʁʁ ʁʁɁɁɁɁɁɁɁɁɁɁɁɁɁɁɁɁɁɁ~ɁwɁpɁiɁbɁ[ɁTɁMɁFɁ?Ɂ8Ɂ1Ɂ*Ɂ#ɁɁɁɁɁɁȁȁȁȁȁȁȁȁȁȁȁȁȁȁȁȁȁȁ{ȁtȁmȁfȁ_ȁXȁQȁJȁCȁ<ȁ5ȁ.ȁ'ȁ ȁȁȁ ȁȁǁǁǁǁǁǁǁǁǁǁǁǁǁǁǁǁǁǁǁxǁqǁjǁcǁ\ǁUǁNǁGǁ@ǁ9ǁ2ǁ+ǁ$ǁǁǁǁǁǁƁƁƁƁƁƁƁƁƁƁƁƁƁƁƁƁƁƁ|ƁuƁnƁgƁ`ƁYƁRƁKƁDƁ=Ɓ6Ɓ/Ɓ(Ɓ!ƁƁƁ ƁƁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁyŁrŁkŁdŁ]ŁVŁOŁHŁAŁ:Ł3Ł,Ł%ŁŁŁŁ ŁŁāāāāāāāāāāāāāāāāāā}āvāoāhāaāZāSāLāEā>ā7ā0ā)ā"āāā āāÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$쿁忁޿׿пɿ¿|ung`YRKD=6/(! 龁⾁۾Ծ;ƾyrkd]VOHA:3,% 潁߽ؽѽʽý}vohaZSLE>70)" 꼁㼁ܼռμǼzsle^WPIB;4-& 绁ແٻһ˻Ļ~wpib[TMF?81*#뺁亁ݺֺϺȺ{tmf_XQJC<5.'  ﹁蹁ṁڹӹ̹Źxqjc\UNG@92+$츁币޸׸иɸ¸|ung`YRKD=6/(! 鷁ⷁ۷ԷͷƷyrkd]VOHA:3,% 涁߶ضѶʶö}vohaZSLE>70)" 굁㵁ܵյεǵzsle^WPIB;4-& 紁ഁٴҴ˴Ĵ~wpib[TMF?81*#볁䳁ݳֳϳȳ{tmf_XQJC<5.'  ﲁ貁ᲁڲӲ̲Ųxqjc\UNG@92+$챁屁ޱױбɱ±|ung`YRKD=6/(! 鰁Ⰱ۰԰Ͱưyrkd]VOHA:3,% 毁߯دѯʯï}vohaZSLE>70)" ꮁ㮁ܮծήǮzsle^WPIB;4-& 筁ୁ٭ҭ˭ĭ~wpib[TMF?81*#묁䬁ݬ֬ϬȬ{tmf_XQJC<5.'  贈諁᫁ګӫ̫ūxqjc\UNG@92+$쪁媁ުתЪɪª|ung`YRKD=6/(! 驁⩁۩ԩͩƩyrkd]VOHA:3,% 樁ߨبѨʨè}vohaZSLE>70)" ꧁㧁ܧէΧǧzsle^WPIB;4-& 禁ঁ٦Ҧ˦Ħ~wpib[TMF?81*#륁䥁ݥ֥ϥȥ{tmf_XQJC<5.'  更褁ᤁڤӤ̤Ťxqjc\UNG@92+$죁壁ޣףУɣ£|ung`YRKD=6/(! 颁⢁ۢԢ͢Ƣyrkd]VOHA:3,% 桁ߡءѡʡá}vohaZSLE>70)" ꠁ㠁ܠՠΠǠzsle^WPIB;4-& 矁ٟҟ˟ğ~wpib[TMF?81*#랁䞁ݞ֞ϞȞ{tmf_XQJC<5.'  蝁ᝁڝӝ̝ŝxqjc\UNG@92+$윁圁ޜלМɜœ|ung`YRKD=6/(! 雁⛁ۛԛ͛ƛyrkd]VOHA:3,% 횁暁ߚؚњʚÚ}vohaZSLE>70)" ꙁ㙁ܙՙΙǙzsle^WPIB;4-& 瘁٘Ҙ˘Ę~wpib[TMF?81*#뗁䗁ݗ֗ϗȗ{tmf_XQJC<5.'  薁ᖁږӖ̖Ŗxqjc\UNG@92+$앁啁ޕוЕɕ•|ung`YRKD=6/(! 锁━۔Ԕ͔Ɣyrkd]VOHA:3,% 퓁擁ߓؓѓʓÓ}vohaZSLE>70)" ꒁ㒁ܒՒΒǒzsle^WPIB;4-& 瑁ّґˑđ~wpib[TMF?81*#됁䐁ݐ֐ϐȐ{tmf_XQJC<5.'  菁Ꮑڏӏ̏ŏxqjc\UNG@92+$쎁厁ގ׎ЎɎŽ|ung`YRKD=6/(! 鍁⍁ۍԍ͍ƍyrkd]VOHA:3,% 팁持ߌ،ьʌÌ}vohaZSLE>70)" ꋁ㋁܋Ջ΋Njzsle^WPIB;4-& 犁يҊˊĊ~wpib[TMF?81*#뉁䉁݉։ωȉ{tmf_XQJC<5.'  舁ሁڈӈ̈ňxqjc\UNG@92+$쇁凁އׇЇɇ‡|ung`YRKD=6/(! 醁ↁۆԆ͆Ɔyrkd]VOHA:3,% 텁慁߅؅хʅÅ}vohaZSLE>70)" ꄁ㄁܄Մ΄DŽzsle^WPIB;4-& 烁ك҃˃ă~wpib[TMF?81*#낁䂁݂ւςȂ{tmf_XQJC<5.'  聁၁ځӁ́Łxqjc\UNG@92+$쀁倁ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$߀߀߀߀߀߀߀߀߀߀߀߀߀߀߀߀߀߀|߀u߀n߀g߀`߀Y߀R߀K߀D߀=߀6߀/߀(߀!߀߀߀ ߀߀ހހހހހހހހހހހހހހހހހހހyހrހkހdހ]ހVހOހHހAހ:ހ3ހ,ހ%ހހހހ ހހ݀݀݀݀݀݀݀݀݀݀݀݀݀݀݀݀݀݀}݀v݀o݀h݀a݀Z݀S݀L݀E݀>݀7݀0݀)݀"݀݀݀ ݀݀܀܀܀܀܀܀܀܀܀܀܀܀܀܀܀܀܀܀܀z܀s܀l܀e܀^܀W܀P܀I܀B܀;܀4܀-܀&܀܀܀܀ ܀܀ۀۀۀۀۀۀۀۀۀۀۀۀۀۀۀۀۀۀ~ۀwۀpۀiۀbۀ[ۀTۀMۀFۀ?ۀ8ۀ1ۀ*ۀ#ۀۀۀۀۀۀڀڀڀڀڀڀڀڀڀڀڀڀڀڀڀڀڀڀ{ڀtڀmڀfڀ_ڀXڀQڀJڀCڀ<ڀ5ڀ.ڀ'ڀ ڀڀڀ ڀڀـــــــــــــــــــxـqـjـcـ\ـUـNـGـ@ـ9ـ2ـ+ـ$ــــــ؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀|؀u؀n؀g؀`؀Y؀R؀K؀D؀=؀6؀/؀(؀!؀؀؀ ؀؀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀y׀r׀k׀d׀]׀V׀O׀H׀A׀:׀3׀,׀%׀׀׀׀ ׀׀րրրրրրրրրրրրրրրրրր}րvրoրhրaրZրSրLրEր>ր7ր0ր)ր"րրր րրՀՀՀՀՀՀՀՀՀՀՀՀՀՀՀՀՀՀՀzՀsՀlՀeՀ^ՀWՀPՀIՀBՀ;Հ4Հ-Հ&ՀՀՀՀ ՀՀԀԀԀԀԀԀԀԀԀԀԀԀԀԀԀԀԀԀ~ԀwԀpԀiԀbԀ[ԀTԀMԀFԀ?Ԁ8Ԁ1Ԁ*Ԁ#ԀԀԀԀԀԀӀӀӀӀӀӀӀӀӀӀӀӀӀӀӀӀӀӀ{ӀtӀmӀfӀ_ӀXӀQӀJӀCӀ<Ӏ5Ӏ.Ӏ'Ӏ ӀӀӀ ӀӀҀҀҀҀҀҀҀҀҀҀҀҀҀҀҀҀҀҀҀxҀqҀjҀcҀ\ҀUҀNҀGҀ@Ҁ9Ҁ2Ҁ+Ҁ$ҀҀҀҀҀҀрррррррррррррррррр|рuрnрgр`рYрRрKрDр=р6р/р(р!ррр ррЀЀЀЀЀЀЀЀЀЀЀЀЀЀЀЀЀЀЀyЀrЀkЀdЀ]ЀVЀOЀHЀAЀ:Ѐ3Ѐ,Ѐ%ЀЀЀЀ ЀЀππππππππππππππππππ}πvπoπhπaπZπSπLπEπ>π7π0π)π"πππ ππ΀΀΀΀΀΀΀΀΀΀΀΀΀΀΀΀΀΀΀z΀s΀l΀e΀^΀W΀P΀I΀B΀;΀4΀-΀&΀΀΀΀ ΀΀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀~̀ẁp̀ìb̀[̀T̀M̀F̀?̀8̀1̀*̀#̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀{̀t̀m̀f̀_̀X̀Q̀J̀C̀<̀5̀.̀'̀ ̀̀̀ ̀̀ˀˀˀˀˀˀˀˀˀˀˀˀˀˀˀˀˀˀˀxˀqˀjˀcˀ\ˀUˀNˀGˀ@ˀ9ˀ2ˀ+ˀ$ˀˀˀˀˀˀʀʀʀʀʀʀʀʀʀʀʀʀʀʀʀʀʀʀ|ʀuʀnʀgʀ`ʀYʀRʀKʀDʀ=ʀ6ʀ/ʀ(ʀ!ʀʀʀ ʀʀɀɀɀɀɀɀɀɀɀɀɀɀɀɀɀɀɀɀɀyɀrɀkɀdɀ]ɀVɀOɀHɀAɀ:ɀ3ɀ,ɀ%ɀɀɀɀ ɀɀȀȀȀȀȀȀȀȀȀȀȀȀȀȀȀȀȀȀ}ȀvȀoȀhȀaȀZȀSȀLȀEȀ>Ȁ7Ȁ0Ȁ)Ȁ"ȀȀȀ ȀȀǀǀǀǀǀǀǀǀǀǀǀǀǀǀǀǀǀǀǀzǀsǀlǀeǀ^ǀWǀPǀIǀBǀ;ǀ4ǀ-ǀ&ǀǀǀǀ ǀǀƀƀƀƀƀƀƀƀƀƀƀƀƀƀƀƀƀƀ~ƀwƀpƀiƀbƀ[ƀTƀMƀFƀ?ƀ8ƀ1ƀ*ƀ#ƀƀƀƀƀƀŀŀŀŀŀŀŀŀŀŀŀŀŀŀŀŀŀŀ{ŀtŀmŀfŀ_ŀXŀQŀJŀCŀ<ŀ5ŀ.ŀ'ŀ ŀŀŀ ŀŀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀxĀqĀjĀcĀ\ĀUĀNĀGĀ@Ā9Ā2Ā+Ā$ĀĀĀĀĀĀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀ€€€€€€€€€€€€€€€€€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€}vohaZSLE>70)" zsle^WPIB;4-& 翀࿀ٿҿ˿Ŀ~wpib[TMF?81*#뾀侀ݾ־ϾȾ{tmf_XQJC<5.'  `轀ὀڽӽ̽Žxqjc\UNG@92+$케开޼׼мɼ¼|ung`YRKD=6/(! 黀⻀ۻԻͻƻyrkd]VOHA:3,% 満ߺغѺʺú}vohaZSLE>70)" 김㹀ܹչιǹzsle^WPIB;4-& 縀฀ٸҸ˸ĸ~wpib[TMF?81*#뷀䷀ݷַϷȷ{tmf_XQJC<5.'  ﶀ趀ᶀڶӶ̶Ŷxqjc\UNG@92+$쵀嵀޵׵еɵµ|ung`YRKD=6/(! 鴀ⴀ۴Դʹƴyrkd]VOHA:3,% 泀߳سѳʳó}vohaZSLE>70)" 검㲀ܲղβDzzsle^WPIB;4-& 籀ీٱұ˱ı~wpib[TMF?81*#밀䰀ݰְϰȰ{tmf_XQJC<5.'  ﯀诀ᯀگӯ̯ůxqjc\UNG@92+$쮀宀ޮ׮Юɮ®|ung`YRKD=6/(! 魀⭀ۭԭͭƭyrkd]VOHA:3,% 欀߬جѬʬì}vohaZSLE>70)" ꫀ㫀ܫիΫǫzsle^WPIB;4-& 窀઀٪Ҫ˪Ī~wpib[TMF?81*#멀䩀ݩ֩ϩȩ{tmf_XQJC<5.'  切言ᨀڨӨ̨Ũxqjc\UNG@92+$지姀ާקЧɧ§|ung`YRKD=6/(! 馀⦀ۦԦͦƦyrkd]VOHA:3,% 楀ߥإѥʥå}vohaZSLE>70)" ꤀㤀ܤդΤǤzsle^WPIB;4-& 磀ࣀ٣ңˣģ~wpib[TMF?81*#뢀䢀ݢ֢ϢȢ{tmf_XQJC<5.'  血ᡀڡӡ̡šxqjc\UNG@92+$저堀ޠנРɠ |ung`YRKD=6/(! 韀⟀۟ԟ͟Ɵyrkd]VOHA:3,% 힀枀ߞ؞ўʞÞ}vohaZSLE>70)" Ꝁ㝀ܝ՝Νǝzsle^WPIB;4-& 眀ٜҜ˜Ĝ~wpib[TMF?81*#뛀䛀ݛ֛ϛț{tmf_XQJC<5.'  蚀 ښӚ̚Śxqjc\UNG@92+$와噀ޙיЙə™|ung`YRKD=6/(! 阀☀ۘԘ͘Ƙyrkd]VOHA:3,% 헀旀ߗؗїʗ×}vohaZSLE>70)" ꖀ㖀ܖՖΖǖzsle^WPIB;4-& 畀ٕҕ˕ĕ~wpib[TMF?81*#딀䔀ݔ֔ϔȔ{tmf_XQJC<5.'  蓀ᓀړӓ̓œxqjc\UNG@92+$쒀咀ޒגВɒ’|ung`YRKD=6/(! 鑀⑀ۑԑ͑Ƒyrkd]VOHA:3,% 퐀搀ߐؐѐʐÐ}vohaZSLE>70)" ꏀ㏀܏ՏΏǏzsle^WPIB;4-& 玀َҎˎĎ~wpib[TMF?81*#덀䍀ݍ֍ύȍ{tmf_XQJC<5.'  茀ጀڌӌ̌Ōxqjc\UNG@92+$싀勀ދ׋Ћɋ‹|ung`YRKD=6/(! 銀⊀ۊԊ͊Ɗyrkd]VOHA:3,% 퉀所߉؉щʉÉ}vohaZSLE>70)" ꈀ㈀܈ՈΈLjzsle^WPIB;4-& 燀ه҇ˇć~wpib[TMF?81*#놀䆀݆ֆφȆ{tmf_XQJC<5.'  腀ᅀڅӅ̅Ņxqjc\UNG@92+$섀儀ބׄЄɄ„|ung`YRKD=6/(! 郀⃀ۃԃ̓ƃyrkd]VOHA:3,% 킀悀߂؂тʂÂ}vohaZSLE>70)" ꁀ぀܁Ձ΁ǁzsle^WPIB;4-& 瀀ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~ݿ~ֿ~Ͽ~ȿ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~ھ~Ӿ~̾~ž~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~޽~׽~н~ɽ~½~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~ۼ~Լ~ͼ~Ƽ~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~߻~ػ~ѻ~ʻ~û~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~ܺ~պ~κ~Ǻ~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~ٹ~ҹ~˹~Ĺ~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~ݸ~ָ~ϸ~ȸ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~ڷ~ӷ~̷~ŷ~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~޶~׶~ж~ɶ~¶~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~۵~Ե~͵~Ƶ~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~ߴ~ش~Ѵ~ʴ~ô~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~ܳ~ճ~γ~dz~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~ٲ~Ҳ~˲~IJ~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~ݱ~ֱ~ϱ~ȱ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~ڰ~Ӱ~̰~Ű~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~ޯ~ׯ~Я~ɯ~¯~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~ۮ~Ԯ~ͮ~Ʈ~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~߭~ح~ѭ~ʭ~í~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~ܬ~լ~ά~Ǭ~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~٫~ҫ~˫~ī~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~ݪ~֪~Ϫ~Ȫ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~ک~ө~̩~ũ~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~ި~ר~Ш~ɨ~¨~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~ۧ~ԧ~ͧ~Ƨ~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~ߦ~ئ~Ѧ~ʦ~æ~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~ܥ~ե~Υ~ǥ~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~٤~Ҥ~ˤ~Ĥ~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~ݣ~֣~ϣ~ȣ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~ڢ~Ӣ~̢~Ţ~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~ޡ~ס~С~ɡ~¡~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~۠~Ԡ~͠~Ơ~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~ߟ~؟~џ~ʟ~ß~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~ܞ~՞~Ξ~Ǟ~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~ٝ~ҝ~˝~ĝ~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~ݜ~֜~Ϝ~Ȝ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~ڛ~ӛ~̛~ś~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~ޚ~ך~К~ɚ~š~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~ۙ~ԙ~͙~ƙ~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~ߘ~ؘ~ј~ʘ~Ø~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~ܗ~՗~Η~Ǘ~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~ٖ~Җ~˖~Ė~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~ݕ~֕~ϕ~ȕ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~ڔ~Ӕ~̔~Ŕ~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~ޓ~ד~Г~ɓ~“~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~ے~Ԓ~͒~ƒ~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~ߑ~ؑ~ё~ʑ~Ñ~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~ܐ~Ր~ΐ~ǐ~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~ُ~ҏ~ˏ~ď~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~ݎ~֎~ώ~Ȏ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~ڍ~Ӎ~̍~ō~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~ތ~׌~Ќ~Ɍ~Œ~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~ۋ~ԋ~͋~Ƌ~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~ߊ~؊~ъ~ʊ~Ê~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~܉~Չ~Ή~lj~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~و~҈~ˈ~Ĉ~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~݇~և~χ~ȇ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~چ~ӆ~̆~ņ~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~ޅ~ׅ~Ѕ~Ʌ~…~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~ۄ~Ԅ~̈́~Ƅ~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~߃~؃~у~ʃ~Ã~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~܂~Ղ~΂~ǂ~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~ف~ҁ~ˁ~ā~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~݀~ր~π~Ȁ~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~u~~n~~g~~`~~Y~~R~~K~~D~~=~~6~~/~~(~~!~~~~~~ ~~~~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~y}~r}~k}~d}~]}~V}~O}~H}~A}~:}~3}~,}~%}~}~}~}~ }~}~|~|~|~|~|~|~|~|~|~|~|~|~|~|~|~|~|~|~}|~v|~o|~h|~a|~Z|~S|~L|~E|~>|~7|~0|~)|~"|~|~|~ |~|~{~{~{~{~{~{~{~{~{~{~{~{~{~{~{~{~{~{~{~z{~s{~l{~e{~^{~W{~P{~I{~B{~;{~4{~-{~&{~{~{~{~ {~{~z~z~z~z~z~z~z~z~z~z~z~z~z~z~z~z~z~z~~z~wz~pz~iz~bz~[z~Tz~Mz~Fz~?z~8z~1z~*z~#z~z~z~z~z~z~y~y~y~y~y~y~y~y~y~y~y~y~y~y~y~y~y~y~{y~ty~my~fy~_y~Xy~Qy~Jy~Cy~u~7u~0u~)u~"u~u~u~ u~u~t~t~t~t~t~t~t~t~t~t~t~t~t~t~t~t~t~t~t~zt~st~lt~et~^t~Wt~Pt~It~Bt~;t~4t~-t~&t~t~t~t~ t~t~s~s~s~s~s~s~s~s~s~s~s~s~s~s~s~s~s~s~~s~ws~ps~is~bs~[s~Ts~Ms~Fs~?s~8s~1s~*s~#s~s~s~s~s~s~r~r~r~r~r~r~r~r~r~r~r~r~r~r~r~r~r~r~{r~tr~mr~fr~_r~Xr~Qr~Jr~Cr~n~7n~0n~)n~"n~n~n~ n~n~m~m~m~m~m~m~m~m~m~m~m~m~m~m~m~m~m~m~m~zm~sm~lm~em~^m~Wm~Pm~Im~Bm~;m~4m~-m~&m~m~m~m~ m~m~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~~l~wl~pl~il~bl~[l~Tl~Ml~Fl~?l~8l~1l~*l~#l~l~l~l~l~l~k~k~k~k~k~k~k~k~k~k~k~k~k~k~k~k~k~k~{k~tk~mk~fk~_k~Xk~Qk~Jk~Ck~g~7g~0g~)g~"g~g~g~ g~g~f~f~f~f~f~f~f~f~f~f~f~f~f~f~f~f~f~f~f~zf~sf~lf~ef~^f~Wf~Pf~If~Bf~;f~4f~-f~&f~f~f~f~ f~f~e~e~e~e~e~e~e~e~e~e~e~e~e~e~e~e~e~e~~e~we~pe~ie~be~[e~Te~Me~Fe~?e~8e~1e~*e~#e~e~e~e~e~e~d~d~d~d~d~d~d~d~d~d~d~d~d~d~d~d~d~d~{d~td~md~fd~_d~Xd~Qd~Jd~Cd~`~7`~0`~)`~"`~`~`~ `~`~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~z_~s_~l_~e_~^_~W_~P_~I_~B_~;_~4_~-_~&_~_~_~_~ _~_~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~~^~w^~p^~i^~b^~[^~T^~M^~F^~?^~8^~1^~*^~#^~^~^~^~^~^~]~]~]~]~]~]~]~]~]~]~]~]~]~]~]~]~]~]~{]~t]~m]~f]~_]~X]~Q]~J]~C]~<]~5]~.]~']~ ]~]~]~ ]~]~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~x\~q\~j\~c\~\\~U\~N\~G\~@\~9\~2\~+\~$\~\~\~\~\~\~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~|[~u[~n[~g[~`[~Y[~R[~K[~D[~=[~6[~/[~([~![~[~[~ [~[~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~yZ~rZ~kZ~dZ~]Z~VZ~OZ~HZ~AZ~:Z~3Z~,Z~%Z~Z~Z~Z~ Z~Z~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~}Y~vY~oY~hY~aY~ZY~SY~LY~EY~>Y~7Y~0Y~)Y~"Y~Y~Y~ Y~Y~X~X~X~X~X~X~X~X~X~X~X~X~X~X~X~X~X~X~X~zX~sX~lX~eX~^X~WX~PX~IX~BX~;X~4X~-X~&X~X~X~X~ X~X~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~~W~wW~pW~iW~bW~[W~TW~MW~FW~?W~8W~1W~*W~#W~W~W~W~W~W~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~{V~tV~mV~fV~_V~XV~QV~JV~CV~R~7R~0R~)R~"R~R~R~ R~R~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~zQ~sQ~lQ~eQ~^Q~WQ~PQ~IQ~BQ~;Q~4Q~-Q~&Q~Q~Q~Q~ Q~Q~P~P~P~P~P~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~wP~pP~iP~bP~[P~TP~MP~FP~?P~8P~1P~*P~#P~P~P~P~P~P~O~O~O~O~O~O~O~O~O~O~O~O~O~O~O~O~O~O~{O~tO~mO~fO~_O~XO~QO~JO~CO~K~7K~0K~)K~"K~K~K~ K~K~J~J~J~J~J~J~J~J~J~J~J~J~J~J~J~J~J~J~J~zJ~sJ~lJ~eJ~^J~WJ~PJ~IJ~BJ~;J~4J~-J~&J~J~J~J~ J~J~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~~I~wI~pI~iI~bI~[I~TI~MI~FI~?I~8I~1I~*I~#I~I~I~I~I~I~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~{H~tH~mH~fH~_H~XH~QH~JH~CH~D~7D~0D~)D~"D~D~D~ D~D~C~C~C~C~C~C~C~C~C~C~C~C~C~C~C~C~C~C~C~zC~sC~lC~eC~^C~WC~PC~IC~BC~;C~4C~-C~&C~C~C~C~ C~C~B~B~B~B~B~B~B~B~B~B~B~B~B~B~B~B~B~B~~B~wB~pB~iB~bB~[B~TB~MB~FB~?B~8B~1B~*B~#B~B~B~B~B~B~A~A~A~A~A~A~A~A~A~A~A~A~A~A~A~A~A~A~{A~tA~mA~fA~_A~XA~QA~JA~CA~~>~>~>~>~>~>~>~>~>~>~>~>~>~>~>~>~>~>~y>~r>~k>~d>~]>~V>~O>~H>~A>~:>~3>~,>~%>~>~>~>~ >~>~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~}=~v=~o=~h=~a=~Z=~S=~L=~E=~>=~7=~0=~)=~"=~=~=~ =~=~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~z<~s<~l<~e<~^<~W<~P<~I<~B<~;<~4<~-<~&<~<~<~<~ <~<~;~;~;~;~;~;~;~;~;~;~;~;~;~;~;~;~;~;~~;~w;~p;~i;~b;~[;~T;~M;~F;~?;~8;~1;~*;~#;~;~;~;~;~;~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~{:~t:~m:~f:~_:~X:~Q:~J:~C:~<:~5:~.:~':~ :~:~:~ :~:~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9~x9~q9~j9~c9~\9~U9~N9~G9~@9~99~29~+9~$9~9~9~9~9~9~8~8~8~8~8~8~8~8~8~8~8~8~8~8~8~8~8~8~|8~u8~n8~g8~`8~Y8~R8~K8~D8~=8~68~/8~(8~!8~8~8~ 8~8~7~7~7~7~7~7~7~7~7~7~7~7~7~7~7~7~7~7~7~y7~r7~k7~d7~]7~V7~O7~H7~A7~:7~37~,7~%7~7~7~7~ 7~7~6~6~6~6~6~6~6~6~6~6~6~6~6~6~6~6~6~6~}6~v6~o6~h6~a6~Z6~S6~L6~E6~>6~76~06~)6~"6~6~6~ 6~6~5~5~5~5~5~5~5~5~5~5~5~5~5~5~5~5~5~5~5~z5~s5~l5~e5~^5~W5~P5~I5~B5~;5~45~-5~&5~5~5~5~ 5~5~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~~4~w4~p4~i4~b4~[4~T4~M4~F4~?4~84~14~*4~#4~4~4~4~4~4~3~3~3~3~3~3~3~3~3~3~3~3~3~3~3~3~3~3~{3~t3~m3~f3~_3~X3~Q3~J3~C3~<3~53~.3~'3~ 3~3~3~ 3~3~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2~x2~q2~j2~c2~\2~U2~N2~G2~@2~92~22~+2~$2~2~2~2~2~2~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~|1~u1~n1~g1~`1~Y1~R1~K1~D1~=1~61~/1~(1~!1~1~1~ 1~1~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~y0~r0~k0~d0~]0~V0~O0~H0~A0~:0~30~,0~%0~0~0~0~ 0~0~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~}/~v/~o/~h/~a/~Z/~S/~L/~E/~>/~7/~0/~)/~"/~/~/~ /~/~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~z.~s.~l.~e.~^.~W.~P.~I.~B.~;.~4.~-.~&.~.~.~.~ .~.~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~~-~w-~p-~i-~b-~[-~T-~M-~F-~?-~8-~1-~*-~#-~-~-~-~-~-~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~{,~t,~m,~f,~_,~X,~Q,~J,~C,~<,~5,~.,~',~ ,~,~,~ ,~,~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~x+~q+~j+~c+~\+~U+~N+~G+~@+~9+~2+~++~$+~+~+~+~+~+~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~|*~u*~n*~g*~`*~Y*~R*~K*~D*~=*~6*~/*~(*~!*~*~*~ *~*~)~)~)~)~)~)~)~)~)~)~)~)~)~)~)~)~)~)~)~y)~r)~k)~d)~])~V)~O)~H)~A)~:)~3)~,)~%)~)~)~)~ )~)~(~(~(~(~(~(~(~(~(~(~(~(~(~(~(~(~(~(~}(~v(~o(~h(~a(~Z(~S(~L(~E(~>(~7(~0(~)(~"(~(~(~ (~(~'~'~'~'~'~'~'~'~'~'~'~'~'~'~'~'~'~'~'~z'~s'~l'~e'~^'~W'~P'~I'~B'~;'~4'~-'~&'~'~'~'~ '~'~&~&~&~&~&~&~&~&~&~&~&~&~&~&~&~&~&~&~~&~w&~p&~i&~b&~[&~T&~M&~F&~?&~8&~1&~*&~#&~&~&~&~&~&~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~{%~t%~m%~f%~_%~X%~Q%~J%~C%~<%~5%~.%~'%~ %~%~%~ %~%~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~x$~q$~j$~c$~\$~U$~N$~G$~@$~9$~2$~+$~$$~$~$~$~$~$~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~|#~u#~n#~g#~`#~Y#~R#~K#~D#~=#~6#~/#~(#~!#~#~#~ #~#~"~"~"~"~"~"~"~"~"~"~"~"~"~"~"~"~"~"~"~y"~r"~k"~d"~]"~V"~O"~H"~A"~:"~3"~,"~%"~"~"~"~ "~"~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~}!~v!~o!~h!~a!~Z!~S!~L!~E!~>!~7!~0!~)!~"!~!~!~ !~!~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~z ~s ~l ~e ~^ ~W ~P ~I ~B ~; ~4 ~- ~& ~ ~ ~ ~ ~ ~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~y ~r ~k ~d ~] ~V ~O ~H ~A ~: ~3 ~, ~% ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~} ~v ~o ~h ~a ~Z ~S ~L ~E ~> ~7 ~0 ~) ~" ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~z ~s ~l ~e ~^ ~W ~P ~I ~B ~; ~4 ~- ~& ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~~ ~w ~p ~i ~b ~[ ~T ~M ~F ~? ~8 ~1 ~* ~# ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~{ ~t ~m ~f ~_ ~X ~Q ~J ~C ~< ~5 ~. ~' ~ ~ ~ ~ ~ ~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}߿}ؿ}ѿ}ʿ}ÿ}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}ܾ}վ}ξ}Ǿ}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}ٽ}ҽ}˽}Ľ}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}ݼ}ּ}ϼ}ȼ}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}ڻ}ӻ}̻}Ż}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}޺}׺}к}ɺ}º}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}۹}Թ}͹}ƹ}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}߸}ظ}Ѹ}ʸ}ø}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}ܷ}շ}η}Ƿ}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}ٶ}Ҷ}˶}Ķ}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}ݵ}ֵ}ϵ}ȵ}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}ڴ}Ӵ}̴}Ŵ}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}޳}׳}г}ɳ}³}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}۲}Բ}Ͳ}Ʋ}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}߱}ر}ѱ}ʱ}ñ}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}ܰ}հ}ΰ}ǰ}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}ٯ}ү}˯}į}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}ݮ}֮}Ϯ}Ȯ}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}ڭ}ӭ}̭}ŭ}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}ެ}׬}Ь}ɬ}¬}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}۫}ԫ}ͫ}ƫ}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}ߪ}ت}Ѫ}ʪ}ê}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}ܩ}թ}Ω}ǩ}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}٨}Ҩ}˨}Ĩ}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}ݧ}֧}ϧ}ȧ}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}ڦ}Ӧ}̦}Ŧ}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}ޥ}ץ}Х}ɥ}¥}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}ۤ}Ԥ}ͤ}Ƥ}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}ߣ}أ}ѣ}ʣ}ã}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}ܢ}բ}΢}Ǣ}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}١}ҡ}ˡ}ġ}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}ݠ}֠}Ϡ}Ƞ}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}ڟ}ӟ}̟}ş}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}ޞ}מ}О}ɞ}ž}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}۝}ԝ}͝}Ɲ}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}ߜ}؜}ќ}ʜ}Ü}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}ܛ}՛}Λ}Ǜ}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}ٚ}Қ}˚}Ě}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}ݙ}֙}ϙ}ș}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}ژ}Ә}̘}Ř}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}ޗ}ח}З}ɗ}—}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}ۖ}Ԗ}͖}Ɩ}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}ߕ}ؕ}ѕ}ʕ}Õ}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}ܔ}Ք}Δ}ǔ}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}ٓ}ғ}˓}ē}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}ݒ}֒}ϒ}Ȓ}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}ڑ}ӑ}̑}ő}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}ސ}א}А}ɐ}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}ۏ}ԏ}͏}Ə}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}ߎ}؎}ю}ʎ}Î}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}܍}Ս}΍}Ǎ}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}ٌ}Ҍ}ˌ}Č}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}݋}֋}ϋ}ȋ}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}ڊ}ӊ}̊}Ŋ}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}މ}׉}Љ}ɉ}‰}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}ۈ}Ԉ}͈}ƈ}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}߇}؇}ч}ʇ}Ç}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}܆}Ն}Ά}dž}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}م}҅}˅}ą}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}݄}ք}τ}Ȅ}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}ڃ}Ӄ}̃}Ń}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}ނ}ׂ}Ђ}ɂ}‚}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}ہ}ԁ}́}Ɓ}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}߀}؀}р}ʀ}À}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~~}w~}p~}i~}b~}[~}T~}M~}F~}?~}8~}1~}*~}#~}~}~}~}~}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{}}t}}m}}f}}_}}X}}Q}}J}}C}}<}}5}}.}}'}} }}}}}} }}}}|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}x|}q|}j|}c|}\|}U|}N|}G|}@|}9|}2|}+|}$|}|}|}|}|}|}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}|{}u{}n{}g{}`{}Y{}R{}K{}D{}={}6{}/{}({}!{}{}{} {}{}z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}yz}rz}kz}dz}]z}Vz}Oz}Hz}Az}:z}3z},z}%z}z}z}z} z}z}y}y}y}y}y}y}y}y}y}y}y}y}y}y}y}y}y}y}}y}vy}oy}hy}ay}Zy}Sy}Ly}Ey}>y}7y}0y})y}"y}y}y} y}y}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}zx}sx}lx}ex}^x}Wx}Px}Ix}Bx};x}4x}-x}&x}x}x}x} x}x}w}w}w}w}w}w}w}w}w}w}w}w}w}w}w}w}w}w}~w}ww}pw}iw}bw}[w}Tw}Mw}Fw}?w}8w}1w}*w}#w}w}w}w}w}w}v}v}v}v}v}v}v}v}v}v}v}v}v}v}v}v}v}v}{v}tv}mv}fv}_v}Xv}Qv}Jv}Cv}r}7r}0r})r}"r}r}r} r}r}q}q}q}q}q}q}q}q}q}q}q}q}q}q}q}q}q}q}q}zq}sq}lq}eq}^q}Wq}Pq}Iq}Bq};q}4q}-q}&q}q}q}q} q}q}p}p}p}p}p}p}p}p}p}p}p}p}p}p}p}p}p}p}~p}wp}pp}ip}bp}[p}Tp}Mp}Fp}?p}8p}1p}*p}#p}p}p}p}p}p}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}{o}to}mo}fo}_o}Xo}Qo}Jo}Co}k}7k}0k})k}"k}k}k} k}k}j}j}j}j}j}j}j}j}j}j}j}j}j}j}j}j}j}j}j}zj}sj}lj}ej}^j}Wj}Pj}Ij}Bj};j}4j}-j}&j}j}j}j} j}j}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}~i}wi}pi}ii}bi}[i}Ti}Mi}Fi}?i}8i}1i}*i}#i}i}i}i}i}i}h}h}h}h}h}h}h}h}h}h}h}h}h}h}h}h}h}h}{h}th}mh}fh}_h}Xh}Qh}Jh}Ch}d}7d}0d})d}"d}d}d} d}d}c}c}c}c}c}c}c}c}c}c}c}c}c}c}c}c}c}c}c}zc}sc}lc}ec}^c}Wc}Pc}Ic}Bc};c}4c}-c}&c}c}c}c} c}c}b}b}b}b}b}b}b}b}b}b}b}b}b}b}b}b}b}b}~b}wb}pb}ib}bb}[b}Tb}Mb}Fb}?b}8b}1b}*b}#b}b}b}b}b}b}a}a}a}a}a}a}a}a}a}a}a}a}a}a}a}a}a}a}{a}ta}ma}fa}_a}Xa}Qa}Ja}Ca}]}7]}0]})]}"]}]}]} ]}]}\}\}\}\}\}\}\}\}\}\}\}\}\}\}\}\}\}\}\}z\}s\}l\}e\}^\}W\}P\}I\}B\};\}4\}-\}&\}\}\}\} \}\}[}[}[}[}[}[}[}[}[}[}[}[}[}[}[}[}[}[}~[}w[}p[}i[}b[}[[}T[}M[}F[}?[}8[}1[}*[}#[}[}[}[}[}[}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}{Z}tZ}mZ}fZ}_Z}XZ}QZ}JZ}CZ}V}7V}0V})V}"V}V}V} V}V}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}zU}sU}lU}eU}^U}WU}PU}IU}BU};U}4U}-U}&U}U}U}U} U}U}T}T}T}T}T}T}T}T}T}T}T}T}T}T}T}T}T}T}~T}wT}pT}iT}bT}[T}TT}MT}FT}?T}8T}1T}*T}#T}T}T}T}T}T}S}S}S}S}S}S}S}S}S}S}S}S}S}S}S}S}S}S}{S}tS}mS}fS}_S}XS}QS}JS}CS}O}7O}0O})O}"O}O}O} O}O}N}N}N}N}N}N}N}N}N}N}N}N}N}N}N}N}N}N}N}zN}sN}lN}eN}^N}WN}PN}IN}BN};N}4N}-N}&N}N}N}N} N}N}M}M}M}M}M}M}M}M}M}M}M}M}M}M}M}M}M}M}~M}wM}pM}iM}bM}[M}TM}MM}FM}?M}8M}1M}*M}#M}M}M}M}M}M}L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}{L}tL}mL}fL}_L}XL}QL}JL}CL}H}7H}0H})H}"H}H}H} H}H}G}G}G}G}G}G}G}G}G}G}G}G}G}G}G}G}G}G}G}zG}sG}lG}eG}^G}WG}PG}IG}BG};G}4G}-G}&G}G}G}G} G}G}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}~F}wF}pF}iF}bF}[F}TF}MF}FF}?F}8F}1F}*F}#F}F}F}F}F}F}E}E}E}E}E}E}E}E}E}E}E}E}E}E}E}E}E}E}{E}tE}mE}fE}_E}XE}QE}JE}CE}A}7A}0A})A}"A}A}A} A}A}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}z@}s@}l@}e@}^@}W@}P@}I@}B@};@}4@}-@}&@}@}@}@} @}@}?}?}?}?}?}?}?}?}?}?}?}?}?}?}?}?}?}?}~?}w?}p?}i?}b?}[?}T?}M?}F?}??}8?}1?}*?}#?}?}?}?}?}?}>}>}>}>}>}>}>}>}>}>}>}>}>}>}>}>}>}>}{>}t>}m>}f>}_>}X>}Q>}J>}C>}<>}5>}.>}'>} >}>}>} >}>}=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}x=}q=}j=}c=}\=}U=}N=}G=}@=}9=}2=}+=}$=}=}=}=}=}=}<}<}<}<}<}<}<}<}<}<}<}<}<}<}<}<}<}<}|<}u<}n<}g<}`<}Y<}R<}K<}D<}=<}6<}/<}(<}!<}<}<} <}<};};};};};};};};};};};};};};};};};};};}y;}r;}k;}d;}];}V;}O;}H;}A;}:;}3;},;}%;};};};} ;};}:}:}:}:}:}:}:}:}:}:}:}:}:}:}:}:}:}:}}:}v:}o:}h:}a:}Z:}S:}L:}E:}>:}7:}0:}):}":}:}:} :}:}9}9}9}9}9}9}9}9}9}9}9}9}9}9}9}9}9}9}9}z9}s9}l9}e9}^9}W9}P9}I9}B9};9}49}-9}&9}9}9}9} 9}9}8}8}8}8}8}8}8}8}8}8}8}8}8}8}8}8}8}8}~8}w8}p8}i8}b8}[8}T8}M8}F8}?8}88}18}*8}#8}8}8}8}8}8}7}7}7}7}7}7}7}7}7}7}7}7}7}7}7}7}7}7}{7}t7}m7}f7}_7}X7}Q7}J7}C7}<7}57}.7}'7} 7}7}7} 7}7}6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}x6}q6}j6}c6}\6}U6}N6}G6}@6}96}26}+6}$6}6}6}6}6}6}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}|5}u5}n5}g5}`5}Y5}R5}K5}D5}=5}65}/5}(5}!5}5}5} 5}5}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}y4}r4}k4}d4}]4}V4}O4}H4}A4}:4}34},4}%4}4}4}4} 4}4}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}}3}v3}o3}h3}a3}Z3}S3}L3}E3}>3}73}03})3}"3}3}3} 3}3}2}2}2}2}2}2}2}2}2}2}2}2}2}2}2}2}2}2}2}z2}s2}l2}e2}^2}W2}P2}I2}B2};2}42}-2}&2}2}2}2} 2}2}1}1}1}1}1}1}1}1}1}1}1}1}1}1}1}1}1}1}~1}w1}p1}i1}b1}[1}T1}M1}F1}?1}81}11}*1}#1}1}1}1}1}1}0}0}0}0}0}0}0}0}0}0}0}0}0}0}0}0}0}0}{0}t0}m0}f0}_0}X0}Q0}J0}C0}<0}50}.0}'0} 0}0}0} 0}0}/}/}/}/}/}/}/}/}/}/}/}/}/}/}/}/}/}/}/}x/}q/}j/}c/}\/}U/}N/}G/}@/}9/}2/}+/}$/}/}/}/}/}/}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}|.}u.}n.}g.}`.}Y.}R.}K.}D.}=.}6.}/.}(.}!.}.}.} .}.}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}y-}r-}k-}d-}]-}V-}O-}H-}A-}:-}3-},-}%-}-}-}-} -}-},},},},},},},},},},},},},},},},},},}},}v,}o,}h,}a,}Z,}S,}L,}E,}>,}7,}0,}),}",},},} ,},}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}z+}s+}l+}e+}^+}W+}P+}I+}B+};+}4+}-+}&+}+}+}+} +}+}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}~*}w*}p*}i*}b*}[*}T*}M*}F*}?*}8*}1*}**}#*}*}*}*}*}*})})})})})})})})})})})})})})})})})})}{)}t)}m)}f)}_)}X)}Q)}J)}C)}<)}5)}.)}')} )})})} )})}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}x(}q(}j(}c(}\(}U(}N(}G(}@(}9(}2(}+(}$(}(}(}(}(}(}'}'}'}'}'}'}'}'}'}'}'}'}'}'}'}'}'}'}|'}u'}n'}g'}`'}Y'}R'}K'}D'}='}6'}/'}('}!'}'}'} '}'}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}y&}r&}k&}d&}]&}V&}O&}H&}A&}:&}3&},&}%&}&}&}&} &}&}%}%}%}%}%}%}%}%}%}%}%}%}%}%}%}%}%}%}}%}v%}o%}h%}a%}Z%}S%}L%}E%}>%}7%}0%})%}"%}%}%} %}%}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}z$}s$}l$}e$}^$}W$}P$}I$}B$};$}4$}-$}&$}$}$}$} $}$}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}~#}w#}p#}i#}b#}[#}T#}M#}F#}?#}8#}1#}*#}##}#}#}#}#}#}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}{"}t"}m"}f"}_"}X"}Q"}J"}C"}<"}5"}."}'"} "}"}"} "}"}!}!}!}!}!}!}!}!}!}!}!}!}!}!}!}!}!}!}!}x!}q!}j!}c!}\!}U!}N!}G!}@!}9!}2!}+!}$!}!}!}!}!}!} } } } } } } } } } } } } } } } } } }| }u }n }g }` }Y }R }K }D }= }6 }/ }( }! } } } } }}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}} } } } } } } } } } } } } } } } } } }{ }t }m }f }_ }X }Q }J }C }< }5 }. }' } } } } } } } } } } } } } } } } } } } } } } } } }x }q }j }c }\ }U }N }G }@ }9 }2 }+ }$ } } } } } } } } } } } } } } } } } } } } } } } }| }u }n }g }` }Y }R }K }D }= }6 }/ }( }! } } } } } } } } } } } } } } } } } } } } } } } }y }r }k }d }] }V }O }H }A }: }3 }, }% } } } } } } } } } } } } } } } } } } } } } } } }} }v }o }h }a }Z }S }L }E }> }7 }0 }) }" } } } } }}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڿ|ӿ|̿|ſ|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||޾|׾|о|ɾ|¾||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||۽|Խ|ͽ|ƽ|||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||߼|ؼ|Ѽ|ʼ|ü||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||ܻ|ջ|λ|ǻ|||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| |||||||ٺ|Һ|˺|ĺ||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||ݹ|ֹ|Ϲ|ȹ|||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڸ|Ӹ|̸|Ÿ|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||޷|׷|з|ɷ|·||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||۶|Զ|Ͷ|ƶ|||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||ߵ|ص|ѵ|ʵ|õ||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||ܴ|մ|δ|Ǵ|||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| |||||||ٳ|ҳ|˳|ij||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||ݲ|ֲ|ϲ|Ȳ|||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڱ|ӱ|̱|ű|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||ް|װ|а|ɰ|°||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||ۯ|ԯ|ͯ|Ư|||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||߮|خ|Ѯ|ʮ|î||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||ܭ|խ|έ|ǭ|||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| |||||||٬|Ҭ|ˬ|Ĭ||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||ݫ|֫|ϫ|ȫ|||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڪ|Ӫ|̪|Ū|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||ީ|ש|Щ|ɩ|©||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||ۨ|Ԩ|ͨ|ƨ|||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||ߧ|ا|ѧ|ʧ|ç||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||ܦ|զ|Φ|Ǧ|||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| |||||||٥|ҥ|˥|ĥ||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||ݤ|֤|Ϥ|Ȥ|||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڣ|ӣ|̣|ţ|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||ޢ|ע|Т|ɢ|¢||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||ۡ|ԡ|͡|ơ|||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||ߠ|ؠ|Ѡ|ʠ|à||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||ܟ|՟|Ο|ǟ|||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| |||||||ٞ|Ҟ|˞|Ğ||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||ݝ|֝|ϝ|ȝ|||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڜ|Ӝ|̜|Ŝ|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||ޛ|כ|Л|ɛ|›||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||ۚ|Ԛ|͚|ƚ|||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||ߙ|ؙ|љ|ʙ|Ù||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||ܘ|՘|Θ|ǘ|||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| |||||||ٗ|җ|˗|ė||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||ݖ|֖|ϖ|Ȗ|||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڕ|ӕ|̕|ŕ|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||ޔ|ה|Д|ɔ|”||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||ۓ|ԓ|͓|Ɠ|||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||ߒ|ؒ|ђ|ʒ|Ò||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||ܑ|Ց|Α|Ǒ|||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| |||||||ِ|Ґ|ː|Đ||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||ݏ|֏|Ϗ|ȏ|||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڎ|ӎ|̎|Ŏ|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||ލ|׍|Ѝ|ɍ|||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||ی|Ԍ|͌|ƌ|||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||ߋ|؋|ы|ʋ|Ë||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||܊|Պ|Ί|NJ|||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| |||||||ى|҉|ˉ|ĉ||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||݈|ֈ|ψ|Ȉ|||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڇ|Ӈ|̇|Ň|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||ކ|׆|І|Ɇ|†||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||ۅ|ԅ|ͅ|ƅ|||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||߄|؄|ф|ʄ|Ä||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||܃|Ճ|΃|ǃ|||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| |||||||ق|҂|˂|Ă||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||݁|ց|ρ|ȁ|||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||ڀ|Ӏ|̀|ŀ|||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||~|~|~|~|~|~|~|~|~|~|~|~|~|~|~|~|~|~|~|y~|r~|k~|d~|]~|V~|O~|H~|A~|:~|3~|,~|%~|~|~|~| ~|~|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}|}}|v}|o}|h}|a}|Z}|S}|L}|E}|>}|7}|0}|)}|"}|}|}| }|}|||||||||||||||||||||||||||||||||||||||z||s||l||e||^||W||P||I||B||;||4||-||&|||||||| ||||{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|~{|w{|p{|i{|b{|[{|T{|M{|F{|?{|8{|1{|*{|#{|{|{|{|{|{|z|z|z|z|z|z|z|z|z|z|z|z|z|z|z|z|z|z|{z|tz|mz|fz|_z|Xz|Qz|Jz|Cz|v|7v|0v|)v|"v|v|v| v|v|u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|zu|su|lu|eu|^u|Wu|Pu|Iu|Bu|;u|4u|-u|&u|u|u|u| u|u|t|t|t|t|t|t|t|t|t|t|t|t|t|t|t|t|t|t|~t|wt|pt|it|bt|[t|Tt|Mt|Ft|?t|8t|1t|*t|#t|t|t|t|t|t|s|s|s|s|s|s|s|s|s|s|s|s|s|s|s|s|s|s|{s|ts|ms|fs|_s|Xs|Qs|Js|Cs|o|7o|0o|)o|"o|o|o| o|o|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|zn|sn|ln|en|^n|Wn|Pn|In|Bn|;n|4n|-n|&n|n|n|n| n|n|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|~m|wm|pm|im|bm|[m|Tm|Mm|Fm|?m|8m|1m|*m|#m|m|m|m|m|m|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|{l|tl|ml|fl|_l|Xl|Ql|Jl|Cl|h|7h|0h|)h|"h|h|h| h|h|g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|zg|sg|lg|eg|^g|Wg|Pg|Ig|Bg|;g|4g|-g|&g|g|g|g| g|g|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|~f|wf|pf|if|bf|[f|Tf|Mf|Ff|?f|8f|1f|*f|#f|f|f|f|f|f|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|{e|te|me|fe|_e|Xe|Qe|Je|Ce|a|7a|0a|)a|"a|a|a| a|a|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|z`|s`|l`|e`|^`|W`|P`|I`|B`|;`|4`|-`|&`|`|`|`| `|`|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|~_|w_|p_|i_|b_|[_|T_|M_|F_|?_|8_|1_|*_|#_|_|_|_|_|_|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|{^|t^|m^|f^|_^|X^|Q^|J^|C^|<^|5^|.^|'^| ^|^|^| ^|^|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|x]|q]|j]|c]|\]|U]|N]|G]|@]|9]|2]|+]|$]|]|]|]|]|]|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\||\|u\|n\|g\|`\|Y\|R\|K\|D\|=\|6\|/\|(\|!\|\|\| \|\|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|y[|r[|k[|d[|][|V[|O[|H[|A[|:[|3[|,[|%[|[|[|[| [|[|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|}Z|vZ|oZ|hZ|aZ|ZZ|SZ|LZ|EZ|>Z|7Z|0Z|)Z|"Z|Z|Z| Z|Z|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|zY|sY|lY|eY|^Y|WY|PY|IY|BY|;Y|4Y|-Y|&Y|Y|Y|Y| Y|Y|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|~X|wX|pX|iX|bX|[X|TX|MX|FX|?X|8X|1X|*X|#X|X|X|X|X|X|W|W|W|W|W|W|W|W|W|W|W|W|W|W|W|W|W|W|{W|tW|mW|fW|_W|XW|QW|JW|CW|S|7S|0S|)S|"S|S|S| S|S|R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|zR|sR|lR|eR|^R|WR|PR|IR|BR|;R|4R|-R|&R|R|R|R| R|R|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|~Q|wQ|pQ|iQ|bQ|[Q|TQ|MQ|FQ|?Q|8Q|1Q|*Q|#Q|Q|Q|Q|Q|Q|P|P|P|P|P|P|P|P|P|P|P|P|P|P|P|P|P|P|{P|tP|mP|fP|_P|XP|QP|JP|CP|L|7L|0L|)L|"L|L|L| L|L|K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|zK|sK|lK|eK|^K|WK|PK|IK|BK|;K|4K|-K|&K|K|K|K| K|K|J|J|J|J|J|J|J|J|J|J|J|J|J|J|J|J|J|J|~J|wJ|pJ|iJ|bJ|[J|TJ|MJ|FJ|?J|8J|1J|*J|#J|J|J|J|J|J|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|{I|tI|mI|fI|_I|XI|QI|JI|CI|E|7E|0E|)E|"E|E|E| E|E|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|zD|sD|lD|eD|^D|WD|PD|ID|BD|;D|4D|-D|&D|D|D|D| D|D|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|~C|wC|pC|iC|bC|[C|TC|MC|FC|?C|8C|1C|*C|#C|C|C|C|C|C|B|B|B|B|B|B|B|B|B|B|B|B|B|B|B|B|B|B|{B|tB|mB|fB|_B|XB|QB|JB|CB||>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|}>|v>|o>|h>|a>|Z>|S>|L>|E>|>>|7>|0>|)>|">|>|>| >|>|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|z=|s=|l=|e=|^=|W=|P=|I=|B=|;=|4=|-=|&=|=|=|=| =|=|<|<|<|<|<|<|<|<|<|<|<|<|<|<|<|<|<|<|~<|w<|p<|i<|b<|[<|T<|M<|F<|?<|8<|1<|*<|#<|<|<|<|<|<|;|;|;|;|;|;|;|;|;|;|;|;|;|;|;|;|;|;|{;|t;|m;|f;|_;|X;|Q;|J;|C;|<;|5;|.;|';| ;|;|;| ;|;|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|x:|q:|j:|c:|\:|U:|N:|G:|@:|9:|2:|+:|$:|:|:|:|:|:|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9||9|u9|n9|g9|`9|Y9|R9|K9|D9|=9|69|/9|(9|!9|9|9| 9|9|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|y8|r8|k8|d8|]8|V8|O8|H8|A8|:8|38|,8|%8|8|8|8| 8|8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|}7|v7|o7|h7|a7|Z7|S7|L7|E7|>7|77|07|)7|"7|7|7| 7|7|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|z6|s6|l6|e6|^6|W6|P6|I6|B6|;6|46|-6|&6|6|6|6| 6|6|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|~5|w5|p5|i5|b5|[5|T5|M5|F5|?5|85|15|*5|#5|5|5|5|5|5|4|4|4|4|4|4|4|4|4|4|4|4|4|4|4|4|4|4|{4|t4|m4|f4|_4|X4|Q4|J4|C4|<4|54|.4|'4| 4|4|4| 4|4|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|x3|q3|j3|c3|\3|U3|N3|G3|@3|93|23|+3|$3|3|3|3|3|3|2|2|2|2|2|2|2|2|2|2|2|2|2|2|2|2|2|2||2|u2|n2|g2|`2|Y2|R2|K2|D2|=2|62|/2|(2|!2|2|2| 2|2|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|y1|r1|k1|d1|]1|V1|O1|H1|A1|:1|31|,1|%1|1|1|1| 1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|}0|v0|o0|h0|a0|Z0|S0|L0|E0|>0|70|00|)0|"0|0|0| 0|0|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|z/|s/|l/|e/|^/|W/|P/|I/|B/|;/|4/|-/|&/|/|/|/| /|/|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|~.|w.|p.|i.|b.|[.|T.|M.|F.|?.|8.|1.|*.|#.|.|.|.|.|.|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|{-|t-|m-|f-|_-|X-|Q-|J-|C-|<-|5-|.-|'-| -|-|-| -|-|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,|x,|q,|j,|c,|\,|U,|N,|G,|@,|9,|2,|+,|$,|,|,|,|,|,|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+||+|u+|n+|g+|`+|Y+|R+|K+|D+|=+|6+|/+|(+|!+|+|+| +|+|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|y*|r*|k*|d*|]*|V*|O*|H*|A*|:*|3*|,*|%*|*|*|*| *|*|)|)|)|)|)|)|)|)|)|)|)|)|)|)|)|)|)|)|})|v)|o)|h)|a)|Z)|S)|L)|E)|>)|7)|0)|))|")|)|)| )|)|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|z(|s(|l(|e(|^(|W(|P(|I(|B(|;(|4(|-(|&(|(|(|(| (|(|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|~'|w'|p'|i'|b'|['|T'|M'|F'|?'|8'|1'|*'|#'|'|'|'|'|'|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|{&|t&|m&|f&|_&|X&|Q&|J&|C&|<&|5&|.&|'&| &|&|&| &|&|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|x%|q%|j%|c%|\%|U%|N%|G%|@%|9%|2%|+%|$%|%|%|%|%|%|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$||$|u$|n$|g$|`$|Y$|R$|K$|D$|=$|6$|/$|($|!$|$|$| $|$|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|y#|r#|k#|d#|]#|V#|O#|H#|A#|:#|3#|,#|%#|#|#|#| #|#|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|}"|v"|o"|h"|a"|Z"|S"|L"|E"|>"|7"|0"|)"|""|"|"| "|"|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|z!|s!|l!|e!|^!|W!|P!|I!|B!|;!|4!|-!|&!|!|!|!| !|!| | | | | | | | | | | | | | | | | | |~ |w |p |i |b |[ |T |M |F |? |8 |1 |* |# | | | | | |||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| || | | | | | | | | | | | | | | | | | |} |v |o |h |a |Z |S |L |E |> |7 |0 |) |" | | | | | | | | | | | | | | | | | | | | | | | |z |s |l |e |^ |W |P |I |B |; |4 |- |& | | | | | | | | | | | | | | | | | | | | | | | |~ |w |p |i |b |[ |T |M |F |? |8 |1 |* |# | | | | | | | | | | | | | | | | | | | | | | | |{ |t |m |f |_ |X |Q |J |C |< |5 |. |' | | | | | | | | | | | | | | | | | | | | | | | | |x |q |j |c |\ |U |N |G |@ |9 |2 |+ |$ | | | | | |||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| |||||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| |||||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| |||||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{ܿ{տ{ο{ǿ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{پ{Ҿ{˾{ľ{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{ݽ{ֽ{Ͻ{Ƚ{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{ڼ{Ӽ{̼{ż{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{޻{׻{л{ɻ{»{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{ۺ{Ժ{ͺ{ƺ{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{߹{ع{ѹ{ʹ{ù{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{ܸ{ո{θ{Ǹ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{ٷ{ҷ{˷{ķ{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{ݶ{ֶ{϶{ȶ{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{ڵ{ӵ{̵{ŵ{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{޴{״{д{ɴ{´{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{۳{Գ{ͳ{Ƴ{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{߲{ز{Ѳ{ʲ{ò{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{ܱ{ձ{α{DZ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{ٰ{Ұ{˰{İ{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{ݯ{֯{ϯ{ȯ{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{ڮ{Ӯ{̮{Ů{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{ޭ{׭{Э{ɭ{­{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{۬{Ԭ{ͬ{Ƭ{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{߫{ث{ѫ{ʫ{ë{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{ܪ{ժ{Ϊ{Ǫ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{٩{ҩ{˩{ĩ{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{ݨ{֨{Ϩ{Ȩ{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{ڧ{ӧ{̧{ŧ{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{ަ{צ{Ц{ɦ{¦{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{ۥ{ԥ{ͥ{ƥ{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{ߤ{ؤ{Ѥ{ʤ{ä{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{ܣ{գ{Σ{ǣ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{٢{Ң{ˢ{Ģ{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{ݡ{֡{ϡ{ȡ{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{ڠ{Ӡ{̠{Š{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{ޟ{ן{П{ɟ{Ÿ{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{۞{Ԟ{͞{ƞ{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{ߝ{؝{ѝ{ʝ{Ý{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{ܜ{՜{Μ{ǜ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{ٛ{қ{˛{ě{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{ݚ{֚{Ϛ{Ț{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{ڙ{ә{̙{ř{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{ޘ{ט{И{ɘ{˜{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{ۗ{ԗ{͗{Ɨ{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{ߖ{ؖ{і{ʖ{Ö{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{ܕ{Օ{Ε{Ǖ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{ٔ{Ҕ{˔{Ĕ{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{ݓ{֓{ϓ{ȓ{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{ڒ{Ӓ{̒{Œ{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{ޑ{ב{Б{ɑ{‘{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{ې{Ԑ{͐{Ɛ{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{ߏ{؏{я{ʏ{Ï{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{܎{Վ{Ύ{ǎ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{ٍ{ҍ{ˍ{č{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{݌{֌{ό{Ȍ{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{ڋ{Ӌ{̋{ŋ{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{ފ{׊{Њ{Ɋ{Š{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{ۉ{ԉ{͉{Ɖ{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{߈{؈{ш{ʈ{È{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{܇{Շ{·{LJ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{ن{҆{ˆ{Ć{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{݅{օ{υ{ȅ{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{ڄ{ӄ{̄{ń{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{ރ{׃{Ѓ{Ƀ{ƒ{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{ۂ{Ԃ{͂{Ƃ{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{߁{؁{с{ʁ{Á{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{܀{Հ{΀{ǀ{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{~{~{~{~{~{~{~{~{~{~{~{~{~{~{~{~{~{~{{~{t~{m~{f~{_~{X~{Q~{J~{C~{<~{5~{.~{'~{ ~{~{~{ ~{~{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{x}{q}{j}{c}{\}{U}{N}{G}{@}{9}{2}{+}{$}{}{}{}{}{}{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{||{u|{n|{g|{`|{Y|{R|{K|{D|{=|{6|{/|{(|{!|{|{|{ |{|{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{y{{r{{k{{d{{]{{V{{O{{H{{A{{:{{3{{,{{%{{{{{{{{ {{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{}z{vz{oz{hz{az{Zz{Sz{Lz{Ez{>z{7z{0z{)z{"z{z{z{ z{z{y{y{y{y{y{y{y{y{y{y{y{y{y{y{y{y{y{y{y{zy{sy{ly{ey{^y{Wy{Py{Iy{By{;y{4y{-y{&y{y{y{y{ y{y{x{x{x{x{x{x{x{x{x{x{x{x{x{x{x{x{x{x{~x{wx{px{ix{bx{[x{Tx{Mx{Fx{?x{8x{1x{*x{#x{x{x{x{x{x{w{w{w{w{w{w{w{w{w{w{w{w{w{w{w{w{w{w{{w{tw{mw{fw{_w{Xw{Qw{Jw{Cw{s{7s{0s{)s{"s{s{s{ s{s{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{zr{sr{lr{er{^r{Wr{Pr{Ir{Br{;r{4r{-r{&r{r{r{r{ r{r{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{~q{wq{pq{iq{bq{[q{Tq{Mq{Fq{?q{8q{1q{*q{#q{q{q{q{q{q{p{p{p{p{p{p{p{p{p{p{p{p{p{p{p{p{p{p{{p{tp{mp{fp{_p{Xp{Qp{Jp{Cp{l{7l{0l{)l{"l{l{l{ l{l{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{zk{sk{lk{ek{^k{Wk{Pk{Ik{Bk{;k{4k{-k{&k{k{k{k{ k{k{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{~j{wj{pj{ij{bj{[j{Tj{Mj{Fj{?j{8j{1j{*j{#j{j{j{j{j{j{i{i{i{i{i{i{i{i{i{i{i{i{i{i{i{i{i{i{{i{ti{mi{fi{_i{Xi{Qi{Ji{Ci{e{7e{0e{)e{"e{e{e{ e{e{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{zd{sd{ld{ed{^d{Wd{Pd{Id{Bd{;d{4d{-d{&d{d{d{d{ d{d{c{c{c{c{c{c{c{c{c{c{c{c{c{c{c{c{c{c{~c{wc{pc{ic{bc{[c{Tc{Mc{Fc{?c{8c{1c{*c{#c{c{c{c{c{c{b{b{b{b{b{b{b{b{b{b{b{b{b{b{b{b{b{b{{b{tb{mb{fb{_b{Xb{Qb{Jb{Cb{^{7^{0^{)^{"^{^{^{ ^{^{]{]{]{]{]{]{]{]{]{]{]{]{]{]{]{]{]{]{]{z]{s]{l]{e]{^]{W]{P]{I]{B]{;]{4]{-]{&]{]{]{]{ ]{]{\{\{\{\{\{\{\{\{\{\{\{\{\{\{\{\{\{\{~\{w\{p\{i\{b\{[\{T\{M\{F\{?\{8\{1\{*\{#\{\{\{\{\{\{[{[{[{[{[{[{[{[{[{[{[{[{[{[{[{[{[{[{{[{t[{m[{f[{_[{X[{Q[{J[{C[{<[{5[{.[{'[{ [{[{[{ [{[{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{xZ{qZ{jZ{cZ{\Z{UZ{NZ{GZ{@Z{9Z{2Z{+Z{$Z{Z{Z{Z{Z{Z{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{|Y{uY{nY{gY{`Y{YY{RY{KY{DY{=Y{6Y{/Y{(Y{!Y{Y{Y{ Y{Y{X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{yX{rX{kX{dX{]X{VX{OX{HX{AX{:X{3X{,X{%X{X{X{X{ X{X{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{}W{vW{oW{hW{aW{ZW{SW{LW{EW{>W{7W{0W{)W{"W{W{W{ W{W{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{zV{sV{lV{eV{^V{WV{PV{IV{BV{;V{4V{-V{&V{V{V{V{ V{V{U{U{U{U{U{U{U{U{U{U{U{U{U{U{U{U{U{U{~U{wU{pU{iU{bU{[U{TU{MU{FU{?U{8U{1U{*U{#U{U{U{U{U{U{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{{T{tT{mT{fT{_T{XT{QT{JT{CT{P{7P{0P{)P{"P{P{P{ P{P{O{O{O{O{O{O{O{O{O{O{O{O{O{O{O{O{O{O{O{zO{sO{lO{eO{^O{WO{PO{IO{BO{;O{4O{-O{&O{O{O{O{ O{O{N{N{N{N{N{N{N{N{N{N{N{N{N{N{N{N{N{N{~N{wN{pN{iN{bN{[N{TN{MN{FN{?N{8N{1N{*N{#N{N{N{N{N{N{M{M{M{M{M{M{M{M{M{M{M{M{M{M{M{M{M{M{{M{tM{mM{fM{_M{XM{QM{JM{CM{I{7I{0I{)I{"I{I{I{ I{I{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{zH{sH{lH{eH{^H{WH{PH{IH{BH{;H{4H{-H{&H{H{H{H{ H{H{G{G{G{G{G{G{G{G{G{G{G{G{G{G{G{G{G{G{~G{wG{pG{iG{bG{[G{TG{MG{FG{?G{8G{1G{*G{#G{G{G{G{G{G{F{F{F{F{F{F{F{F{F{F{F{F{F{F{F{F{F{F{{F{tF{mF{fF{_F{XF{QF{JF{CF{B{7B{0B{)B{"B{B{B{ B{B{A{A{A{A{A{A{A{A{A{A{A{A{A{A{A{A{A{A{A{zA{sA{lA{eA{^A{WA{PA{IA{BA{;A{4A{-A{&A{A{A{A{ A{A{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{~@{w@{p@{i@{b@{[@{T@{M@{F@{?@{8@{1@{*@{#@{@{@{@{@{@{?{?{?{?{?{?{?{?{?{?{?{?{?{?{?{?{?{?{{?{t?{m?{f?{_?{X?{Q?{J?{C?{{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{x>{q>{j>{c>{\>{U>{N>{G>{@>{9>{2>{+>{$>{>{>{>{>{>{={={={={={={={={={={={={={={={={={={|={u={n={g={`={Y={R={K={D={=={6={/={(={!={={={ ={={<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{y<{r<{k<{d<{]<{V<{O<{H<{A<{:<{3<{,<{%<{<{<{<{ <{<{;{;{;{;{;{;{;{;{;{;{;{;{;{;{;{;{;{;{};{v;{o;{h;{a;{Z;{S;{L;{E;{>;{7;{0;{);{";{;{;{ ;{;{:{:{:{:{:{:{:{:{:{:{:{:{:{:{:{:{:{:{:{z:{s:{l:{e:{^:{W:{P:{I:{B:{;:{4:{-:{&:{:{:{:{ :{:{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{~9{w9{p9{i9{b9{[9{T9{M9{F9{?9{89{19{*9{#9{9{9{9{9{9{8{8{8{8{8{8{8{8{8{8{8{8{8{8{8{8{8{8{{8{t8{m8{f8{_8{X8{Q8{J8{C8{<8{58{.8{'8{ 8{8{8{ 8{8{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{x7{q7{j7{c7{\7{U7{N7{G7{@7{97{27{+7{$7{7{7{7{7{7{6{6{6{6{6{6{6{6{6{6{6{6{6{6{6{6{6{6{|6{u6{n6{g6{`6{Y6{R6{K6{D6{=6{66{/6{(6{!6{6{6{ 6{6{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{y5{r5{k5{d5{]5{V5{O5{H5{A5{:5{35{,5{%5{5{5{5{ 5{5{4{4{4{4{4{4{4{4{4{4{4{4{4{4{4{4{4{4{}4{v4{o4{h4{a4{Z4{S4{L4{E4{>4{74{04{)4{"4{4{4{ 4{4{3{3{3{3{3{3{3{3{3{3{3{3{3{3{3{3{3{3{3{z3{s3{l3{e3{^3{W3{P3{I3{B3{;3{43{-3{&3{3{3{3{ 3{3{2{2{2{2{2{2{2{2{2{2{2{2{2{2{2{2{2{2{~2{w2{p2{i2{b2{[2{T2{M2{F2{?2{82{12{*2{#2{2{2{2{2{2{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{{1{t1{m1{f1{_1{X1{Q1{J1{C1{<1{51{.1{'1{ 1{1{1{ 1{1{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{x0{q0{j0{c0{\0{U0{N0{G0{@0{90{20{+0{$0{0{0{0{0{0{/{/{/{/{/{/{/{/{/{/{/{/{/{/{/{/{/{/{|/{u/{n/{g/{`/{Y/{R/{K/{D/{=/{6/{//{(/{!/{/{/{ /{/{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{y.{r.{k.{d.{].{V.{O.{H.{A.{:.{3.{,.{%.{.{.{.{ .{.{-{-{-{-{-{-{-{-{-{-{-{-{-{-{-{-{-{-{}-{v-{o-{h-{a-{Z-{S-{L-{E-{>-{7-{0-{)-{"-{-{-{ -{-{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{z,{s,{l,{e,{^,{W,{P,{I,{B,{;,{4,{-,{&,{,{,{,{ ,{,{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{~+{w+{p+{i+{b+{[+{T+{M+{F+{?+{8+{1+{*+{#+{+{+{+{+{+{*{*{*{*{*{*{*{*{*{*{*{*{*{*{*{*{*{*{{*{t*{m*{f*{_*{X*{Q*{J*{C*{<*{5*{.*{'*{ *{*{*{ *{*{){){){){){){){){){){){){){){){){){){){x){q){j){c){\){U){N){G){@){9){2){+){$){){){){){){({({({({({({({({({({({({({({({({({({|({u({n({g({`({Y({R({K({D({=({6({/({(({!({({({ ({({'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{y'{r'{k'{d'{]'{V'{O'{H'{A'{:'{3'{,'{%'{'{'{'{ '{'{&{&{&{&{&{&{&{&{&{&{&{&{&{&{&{&{&{&{}&{v&{o&{h&{a&{Z&{S&{L&{E&{>&{7&{0&{)&{"&{&{&{ &{&{%{%{%{%{%{%{%{%{%{%{%{%{%{%{%{%{%{%{%{z%{s%{l%{e%{^%{W%{P%{I%{B%{;%{4%{-%{&%{%{%{%{ %{%{${${${${${${${${${${${${${${${${${${~${w${p${i${b${[${T${M${F${?${8${1${*${#${${${${${${#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{{#{t#{m#{f#{_#{X#{Q#{J#{C#{<#{5#{.#{'#{ #{#{#{ #{#{"{"{"{"{"{"{"{"{"{"{"{"{"{"{"{"{"{"{"{x"{q"{j"{c"{\"{U"{N"{G"{@"{9"{2"{+"{$"{"{"{"{"{"{!{!{!{!{!{!{!{!{!{!{!{!{!{!{!{!{!{!{|!{u!{n!{g!{`!{Y!{R!{K!{D!{=!{6!{/!{(!{!!{!{!{ !{!{ { { { { { { { { { { { { { { { { { { {y {r {k {d {] {V {O {H {A {: {3 {, {% { { { { { {{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ { { { { { { { { { { { { { { { { { { {x {q {j {c {\ {U {N {G {@ {9 {2 {+ {$ { { { { { { { { { { { { { { { { { { { { { { { {| {u {n {g {` {Y {R {K {D {= {6 {/ {( {! { { { { { { { { { { { { { { { { { { { { { { { {y {r {k {d {] {V {O {H {A {: {3 {, {% { { { { { { { { { { { { { { { { { { { { { { { {} {v {o {h {a {Z {S {L {E {> {7 {0 {) {" { { { { { { { { { { { { { { { { { { { { { { { {z {s {l {e {^ {W {P {I {B {; {4 {- {& { { { { { {{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzzzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzzzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzzzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzܼzռzμzǼzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzٻzһz˻zĻzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzݺzֺzϺzȺzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzܵzյzεzǵzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzٴzҴz˴zĴzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzݳzֳzϳzȳzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzܮzծzήzǮzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzz٭zҭz˭zĭzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzݬz֬zϬzȬzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzܧzէzΧzǧzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzz٦zҦz˦zĦzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzݥz֥zϥzȥzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzܠzՠzΠzǠzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzٟzҟz˟zğzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzݞz֞zϞzȞzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzܙzՙzΙzǙzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzz٘zҘz˘zĘzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzݗz֗zϗzȗzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzzܒzՒzΒzǒzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzّzґzˑzđzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzݐz֐zϐzȐzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzz܋zՋz΋zNjzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzيzҊzˊzĊzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzz݉z։zωzȉzzzzzzzzzzz{ztzmzfz_zXzQzJzCzz7z0z)z"zzz zzzzzzz܄zՄz΄zDŽzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzكz҃z˃zăzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzz݂zւzςzȂzzzzzzzzzzz{ztzmzfz_zXzQzJzCz~z7~z0~z)~z"~z~z~z ~z~z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}z}zz}zs}zl}ze}z^}zW}zP}zI}zB}z;}z4}z-}z&}z}z}z}z }z}z|z|z|z|z|z|z|z|z|z|z|z|z|z|z|z|z|z|z~|zw|zp|zi|zb|z[|zT|zM|zF|z?|z8|z1|z*|z#|z|z|z|z|z|z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{zt{zm{zf{z_{zX{zQ{zJ{zC{z<{z5{z.{z'{z {z{z{z {z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxzzqzzjzzczz\zzUzzNzzGzz@zz9zz2zz+zz$zzzzzzzzzzzzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyz|yzuyznyzgyz`yzYyzRyzKyzDyz=yz6yz/yz(yz!yzyzyz yzyzxzxzxzxzxzxzxzxzxzxzxzxzxzxzxzxzxzxzxzyxzrxzkxzdxz]xzVxzOxzHxzAxz:xz3xz,xz%xzxzxzxz xzxzwzwzwzwzwzwzwzwzwzwzwzwzwzwzwzwzwzwz}wzvwzowzhwzawzZwzSwzLwzEwz>wz7wz0wz)wz"wzwzwz wzwzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzzvzsvzlvzevz^vzWvzPvzIvzBvz;vz4vz-vz&vzvzvzvz vzvzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuz~uzwuzpuziuzbuz[uzTuzMuzFuz?uz8uz1uz*uz#uzuzuzuzuzuztztztztztztztztztztztztztztztztztztz{tzttzmtzftz_tzXtzQtzJtzCtzpz7pz0pz)pz"pzpzpz pzpzozozozozozozozozozozozozozozozozozozozzozsozlozeoz^ozWozPozIozBoz;oz4oz-oz&ozozozoz ozoznznznznznznznznznznznznznznznznznznz~nzwnzpnzinzbnz[nzTnzMnzFnz?nz8nz1nz*nz#nznznznznznzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmz{mztmzmmzfmz_mzXmzQmzJmzCmziz7iz0iz)iz"iziziz izizhzhzhzhzhzhzhzhzhzhzhzhzhzhzhzhzhzhzhzzhzshzlhzehz^hzWhzPhzIhzBhz;hz4hz-hz&hzhzhzhz hzhzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgz~gzwgzpgzigzbgz[gzTgzMgzFgz?gz8gz1gz*gz#gzgzgzgzgzgzfzfzfzfzfzfzfzfzfzfzfzfzfzfzfzfzfzfz{fztfzmfzffz_fzXfzQfzJfzCfzbz7bz0bz)bz"bzbzbz bzbzazazazazazazazazazazazazazazazazazazazzazsazlazeaz^azWazPazIazBaz;az4az-az&azazazaz azaz`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z~`zw`zp`zi`zb`z[`zT`zM`zF`z?`z8`z1`z*`z#`z`z`z`z`z`z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z{_zt_zm_zf_z__zX_zQ_zJ_zC_z<_z5_z._z'_z _z_z_z _z_z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^zx^zq^zj^zc^z\^zU^zN^zG^z@^z9^z2^z+^z$^z^z^z^z^z^z]z]z]z]z]z]z]z]z]z]z]z]z]z]z]z]z]z]z|]zu]zn]zg]z`]zY]zR]zK]zD]z=]z6]z/]z(]z!]z]z]z ]z]z\z\z\z\z\z\z\z\z\z\z\z\z\z\z\z\z\z\z\zy\zr\zk\zd\z]\zV\zO\zH\zA\z:\z3\z,\z%\z\z\z\z \z\z[z[z[z[z[z[z[z[z[z[z[z[z[z[z[z[z[z[z}[zv[zo[zh[za[zZ[zS[zL[zE[z>[z7[z0[z)[z"[z[z [z[zZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzzZzsZzlZzeZz^ZzWZzPZzIZzBZz;Zz4Zz-Zz&ZzZzZzZz ZzZzYzYzYzYzYzYzYzYzYzYzYzYzYzYzYzYzYzYz~YzwYzpYziYzbYz[YzTYzMYzFYz?Yz8Yz1Yz*Yz#YzYzYzYzYzYzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXz{XztXzmXzfXz_XzXXzQXzJXzCXzTz7Tz0Tz)Tz"TzTzTz TzTzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzzSzsSzlSzeSz^SzWSzPSzISzBSz;Sz4Sz-Sz&SzSzSzSz SzSzRzRzRzRzRzRzRzRzRzRzRzRzRzRzRzRzRzRz~RzwRzpRziRzbRz[RzTRzMRzFRz?Rz8Rz1Rz*Rz#RzRzRzRzRzRzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQz{QztQzmQzfQz_QzXQzQQzJQzCQzMz7Mz0Mz)Mz"MzMzMz MzMzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzzLzsLzlLzeLz^LzWLzPLzILzBLz;Lz4Lz-Lz&LzLzLzLz LzLzKzKzKzKzKzKzKzKzKzKzKzKzKzKzKzKzKzKz~KzwKzpKziKzbKz[KzTKzMKzFKz?Kz8Kz1Kz*Kz#KzKzKzKzKzKzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJz{JztJzmJzfJz_JzXJzQJzJJzCJzFz7Fz0Fz)Fz"FzFzFz FzFzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzzEzsEzlEzeEz^EzWEzPEzIEzBEz;Ez4Ez-Ez&EzEzEzEz EzEzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDz~DzwDzpDziDzbDz[DzTDzMDzFDz?Dz8Dz1Dz*Dz#DzDzDzDzDzDzCzCzCzCzCzCzCzCzCzCzCzCzCzCzCzCzCzCz{CztCzmCzfCz_CzXCzQCzJCzCCz?z7?z0?z)?z"?z?z?z ?z?z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>zz>zs>zl>ze>z^>zW>zP>zI>zB>z;>z4>z->z&>z>z>z>z >z>z=z=z=z=z=z=z=z=z=z=z=z=z=z=z=z=z=z=z~=zw=zp=zi=zb=z[=zT=zM=zF=z?=z8=z1=z*=z#=z=z=z=z=z=z8z78z08z)8z"8z8z8z 8z8z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7zz7zs7zl7ze7z^7zW7zP7zI7zB7z;7z47z-7z&7z7z7z7z 7z7z6z6z6z6z6z6z6z6z6z6z6z6z6z6z6z6z6z6z~6zw6zp6zi6zb6z[6zT6zM6zF6z?6z86z16z*6z#6z6z6z6z6z6z5z5z5z5z5z5z5z5z5z5z5z5z5z5z5z5z5z5z{5zt5zm5zf5z_5zX5zQ5zJ5zC5z<5z55z.5z'5z 5z5z5z 5z5z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4zx4zq4zj4zc4z\4zU4zN4zG4z@4z94z24z+4z$4z4z4z4z4z4z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z|3zu3zn3zg3z`3zY3zR3zK3zD3z=3z63z/3z(3z!3z3z3z 3z3z2z2z2z2z2z2z2z2z2z2z2z2z2z2z2z2z2z2z2zy2zr2zk2zd2z]2zV2zO2zH2zA2z:2z32z,2z%2z2z2z2z 2z2z1z1z1z1z1z1z1z1z1z1z1z1z1z1z1z1z1z1z}1zv1zo1zh1za1zZ1zS1zL1zE1z>1z71z01z)1z"1z1z1z 1z1z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0zz0zs0zl0ze0z^0zW0zP0zI0zB0z;0z40z-0z&0z0z0z0z 0z0z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/z~/zw/zp/zi/zb/z[/zT/zM/zF/z?/z8/z1/z*/z#/z/z/z/z/z/z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z{.zt.zm.zf.z_.zX.zQ.zJ.zC.z<.z5.z..z'.z .z.z.z .z.z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-zx-zq-zj-zc-z\-zU-zN-zG-z@-z9-z2-z+-z$-z-z-z-z-z-z,z,z,z,z,z,z,z,z,z,z,z,z,z,z,z,z,z,z|,zu,zn,zg,z`,zY,zR,zK,zD,z=,z6,z/,z(,z!,z,z,z ,z,z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+zy+zr+zk+zd+z]+zV+zO+zH+zA+z:+z3+z,+z%+z+z+z+z +z+z*z*z*z*z*z*z*z*z*z*z*z*z*z*z*z*z*z*z}*zv*zo*zh*za*zZ*zS*zL*zE*z>*z7*z0*z)*z"*z*z*z *z*z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)zz)zs)zl)ze)z^)zW)zP)zI)zB)z;)z4)z-)z&)z)z)z)z )z)z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z~(zw(zp(zi(zb(z[(zT(zM(zF(z?(z8(z1(z*(z#(z(z(z(z(z(z'z'z'z'z'z'z'z'z'z'z'z'z'z'z'z'z'z'z{'zt'zm'zf'z_'zX'zQ'zJ'zC'z<'z5'z.'z''z 'z'z'z 'z'z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&zx&zq&zj&zc&z\&zU&zN&zG&z@&z9&z2&z+&z$&z&z&z&z&z&z%z%z%z%z%z%z%z%z%z%z%z%z%z%z%z%z%z%z|%zu%zn%zg%z`%zY%zR%zK%zD%z=%z6%z/%z(%z!%z%z%z %z%z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$zy$zr$zk$zd$z]$zV$zO$zH$zA$z:$z3$z,$z%$z$z$z$z $z$z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z}#zv#zo#zh#za#zZ#zS#zL#zE#z>#z7#z0#z)#z"#z#z#z #z#z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"zz"zs"zl"ze"z^"zW"zP"zI"zB"z;"z4"z-"z&"z"z"z"z "z"z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z~!zw!zp!zi!zb!z[!zT!zM!zF!z?!z8!z1!z*!z#!z!z!z!z!z!z z z z z z z z z z z z z z z z z z z{ zt zm zf z_ zX zQ zJ zC z< z5 z. z' z z z z z zzzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzzzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzzzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzzzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCz<z5z.z'z zzz zzzzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzzzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzzzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzzzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCz<z5z.z'z zzz zzzzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzzzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzzzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzzzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zz z z z z z z z z z z z z z z z z z z zz zs zl ze z^ zW zP zI zB z; z4 z- z& z z z z z z z z z z z z z z z z z z z z z z z z~ zw zp zi zb z[ zT zM zF z? z8 z1 z* z# z z z z z z z z z z z z z z z z z z z z z z z z{ zt zm zf z_ zX zQ zJ zC z< z5 z. z' z z z z z z z z z z z z z z z z z z z z z z z z zx zq zj zc z\ zU zN zG z@ z9 z2 z+ z$ z z z z z z z z z z z z z z z z z z z z z z z z| zu zn zg z` zY zR zK zD z= z6 z/ z( z! z z z z zzzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzzzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzzzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzzzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzzzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCz<z5z.z'z zzz zzzzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzzzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzzzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzzzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyٿyҿy˿yĿyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyݾy־yϾyȾyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyܹyչyιyǹyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyٸyҸy˸yĸyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyݷyַyϷyȷyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyܲyղyβyDzyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyٱyұy˱yıyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyݰyְyϰyȰyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyܫyիyΫyǫyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyy٪yҪy˪yĪyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyݩy֩yϩyȩyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyܤyդyΤyǤyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyy٣yңyˣyģyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyݢy֢yϢyȢyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyܝy՝yΝyǝyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyٜyҜy˜yĜyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyݛy֛yϛyțyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyyܖyՖyΖyǖyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyٕyҕy˕yĕyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyݔy֔yϔyȔyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyy܏yՏyΏyǏyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyَyҎyˎyĎyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyݍy֍yύyȍyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyy܈yՈyΈyLjyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyهy҇yˇyćyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyy݆yֆyφyȆyyyyyyyyyyy{ytymyfy_yXyQyJyCyy7y0y)y"yyy yyyyyyy܁yՁy΁yǁyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyـyҀyˀyĀyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCy<y5y.y'y yyy yy~y~y~y~y~y~y~y~y~y~y~y~y~y~y~y~y~y~y~yx~yq~yj~yc~y\~yU~yN~yG~y@~y9~y2~y+~y$~y~y~y~y~y~y}y}y}y}y}y}y}y}y}y}y}y}y}y}y}y}y}y}y|}yu}yn}yg}y`}yY}yR}yK}yD}y=}y6}y/}y(}y!}y}y}y }y}y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|yy|yr|yk|yd|y]|yV|yO|yH|yA|y:|y3|y,|y%|y|y|y|y |y|y{y{y{y{y{y{y{y{y{y{y{y{y{y{y{y{y{y{y}{yv{yo{yh{ya{yZ{yS{yL{yE{y>{y7{y0{y){y"{y{y{y {y{yzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzzyszylzyezy^zyWzyPzyIzyBzy;zy4zy-zy&zyzyzyzy zyzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy~yywyypyyiyybyy[yyTyyMyyFyy?yy8yy1yy*yy#yyyyyyyyyyyyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxy{xytxymxyfxy_xyXxyQxyJxyCxyty7ty0ty)ty"tytyty tytysysysysysysysysysysysysysysysysysysysyzsyssylsyesy^syWsyPsyIsyBsy;sy4sy-sy&sysysysy sysyryryryryryryryryryryryryryryryryryry~rywrypryirybry[ryTryMryFry?ry8ry1ry*ry#ryryryryryryqyqyqyqyqyqyqyqyqyqyqyqyqyqyqyqyqyqy{qytqymqyfqy_qyXqyQqyJqyCqymy7my0my)my"mymymy mymylylylylylylylylylylylylylylylylylylylyzlyslyllyely^lyWlyPlyIlyBly;ly4ly-ly&lylylyly lylykykykykykykykykykykykykykykykykykyky~kywkypkyikybky[kyTkyMkyFky?ky8ky1ky*ky#kykykykykykyjyjyjyjyjyjyjyjyjyjyjyjyjyjyjyjyjyjy{jytjymjyfjy_jyXjyQjyJjyCjyfy7fy0fy)fy"fyfyfy fyfyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyzeyseyleyeey^eyWeyPeyIeyBey;ey4ey-ey&eyeyeyey eyeydydydydydydydydydydydydydydydydydydy~dywdypdyidybdy[dyTdyMdyFdy?dy8dy1dy*dy#dydydydydydycycycycycycycycycycycycycycycycycycy{cytcymcyfcy_cyXcyQcyJcyCcy_y7_y0_y)_y"_y_y_y _y_y^y^y^y^y^y^y^y^y^y^y^y^y^y^y^y^y^y^y^yz^ys^yl^ye^y^^yW^yP^yI^yB^y;^y4^y-^y&^y^y^y^y ^y^y]y]y]y]y]y]y]y]y]y]y]y]y]y]y]y]y]y]y~]yw]yp]yi]yb]y[]yT]yM]yF]y?]y8]y1]y*]y#]y]y]y]y]y]y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y{\yt\ym\yf\y_\yX\yQ\yJ\yC\y<\y5\y.\y'\y \y\y\y \y\y[y[y[y[y[y[y[y[y[y[y[y[y[y[y[y[y[y[y[yx[yq[yj[yc[y\[yU[yN[yG[y@[y9[y2[y+[y$[y[y[y[y[y[yZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZy|ZyuZynZygZy`ZyYZyRZyKZyDZy=Zy6Zy/Zy(Zy!ZyZyZy ZyZyYyYyYyYyYyYyYyYyYyYyYyYyYyYyYyYyYyYyYyyYyrYykYydYy]YyVYyOYyHYyAYy:Yy3Yy,Yy%YyYyYyYy YyYyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXy}XyvXyoXyhXyaXyZXySXyLXyEXy>Xy7Xy0Xy)Xy"XyXyXy XyXyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyzWysWylWyeWy^WyWWyPWyIWyBWy;Wy4Wy-Wy&WyWyWyWy WyWyVyVyVyVyVyVyVyVyVyVyVyVyVyVyVyVyVyVy~VywVypVyiVybVy[VyTVyMVyFVy?Vy8Vy1Vy*Vy#VyVyVyVyVyVyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUy{UytUymUyfUy_UyXUyQUyJUyCUyQy7Qy0Qy)Qy"QyQyQy QyQyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyzPysPylPyePy^PyWPyPPyIPyBPy;Py4Py-Py&PyPyPyPy PyPyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOy~OywOypOyiOybOy[OyTOyMOyFOy?Oy8Oy1Oy*Oy#OyOyOyOyOyOyNyNyNyNyNyNyNyNyNyNyNyNyNyNyNyNyNyNy{NytNymNyfNy_NyXNyQNyJNyCNyJy7Jy0Jy)Jy"JyJyJy JyJyIyIyIyIyIyIyIyIyIyIyIyIyIyIyIyIyIyIyIyzIysIylIyeIy^IyWIyPIyIIyBIy;Iy4Iy-Iy&IyIyIyIy IyIyHyHyHyHyHyHyHyHyHyHyHyHyHyHyHyHyHyHy~HywHypHyiHybHy[HyTHyMHyFHy?Hy8Hy1Hy*Hy#HyHyHyHyHyHyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGy{GytGymGyfGy_GyXGyQGyJGyCGyCy7Cy0Cy)Cy"CyCyCy CyCyByByByByByByByByByByByByByByByByByByByzBysBylByeBy^ByWByPByIByBBy;By4By-By&ByByByBy ByByAyAyAyAyAyAyAyAyAyAyAyAyAyAyAyAyAyAy~AywAypAyiAybAy[AyTAyMAyFAy?Ay8Ay1Ay*Ay#AyAyAyAyAyAy@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y{@yt@ym@yf@y_@yX@yQ@yJ@yC@y<@y5@y.@y'@y @y@y@y @y@y?y?y?y?y?y?y?y?y?y?y?y?y?y?y?y?y?y?y?yx?yq?yj?yc?y\?yU?yN?yG?y@?y9?y2?y+?y$?y?y?y?y?y?y>y>y>y>y>y>y>y>y>y>y>y>y>y>y>y>y>y>y|>yu>yn>yg>y`>yY>yR>yK>yD>y=>y6>y/>y(>y!>y>y>y >y>y=y=y=y=y=y=y=y=y=y=y=y=y=y=y=y=y=y=y=yy=yr=yk=yd=y]=yV=yO=yH=yA=y:=y3=y,=y%=y=y=y=y =y=y5y75y05y)5y"5y5y5y 5y5y4y4y4y4y4y4y4y4y4y4y4y4y4y4y4y4y4y4y4yz4ys4yl4ye4y^4yW4yP4yI4yB4y;4y44y-4y&4y4y4y4y 4y4y3y3y3y3y3y3y3y3y3y3y3y3y3y3y3y3y3y3y~3yw3yp3yi3yb3y[3yT3yM3yF3y?3y83y13y*3y#3y3y3y3y3y3y2y2y2y2y2y2y2y2y2y2y2y2y2y2y2y2y2y2y{2yt2ym2yf2y_2yX2yQ2yJ2yC2y<2y52y.2y'2y 2y2y2y 2y2y1y1y1y1y1y1y1y1y1y1y1y1y1y1y1y1y1y1y1yx1yq1yj1yc1y\1yU1yN1yG1y@1y91y21y+1y$1y1y1y1y1y1y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y|0yu0yn0yg0y`0yY0yR0yK0yD0y=0y60y/0y(0y!0y0y0y 0y0y/y/y/y/y/y/y/y/y/y/y/y/y/y/y/y/y/y/y/yy/yr/yk/yd/y]/yV/yO/yH/yA/y:/y3/y,/y%/y/y/y/y /y/y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y}.yv.yo.yh.ya.yZ.yS.yL.yE.y>.y7.y0.y).y".y.y.y .y.y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-yz-ys-yl-ye-y^-yW-yP-yI-yB-y;-y4-y--y&-y-y-y-y -y-y,y,y,y,y,y,y,y,y,y,y,y,y,y,y,y,y,y,y~,yw,yp,yi,yb,y[,yT,yM,yF,y?,y8,y1,y*,y#,y,y,y,y,y,y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y{+yt+ym+yf+y_+yX+yQ+yJ+yC+y<+y5+y.+y'+y +y+y+y +y+y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*yx*yq*yj*yc*y\*yU*yN*yG*y@*y9*y2*y+*y$*y*y*y*y*y*y)y)y)y)y)y)y)y)y)y)y)y)y)y)y)y)y)y)y|)yu)yn)yg)y`)yY)yR)yK)yD)y=)y6)y/)y()y!)y)y)y )y)y(y(y(y(y(y(y(y(y(y(y(y(y(y(y(y(y(y(y(yy(yr(yk(yd(y](yV(yO(yH(yA(y:(y3(y,(y%(y(y(y(y (y(y'y'y'y'y'y'y'y'y'y'y'y'y'y'y'y'y'y'y}'yv'yo'yh'ya'yZ'yS'yL'yE'y>'y7'y0'y)'y"'y'y'y 'y'y&y&y&y&y&y&y&y&y&y&y&y&y&y&y&y&y&y&y&yz&ys&yl&ye&y^&yW&yP&yI&yB&y;&y4&y-&y&&y&y&y&y &y&y%y%y%y%y%y%y%y%y%y%y%y%y%y%y%y%y%y%y~%yw%yp%yi%yb%y[%yT%yM%yF%y?%y8%y1%y*%y#%y%y%y%y%y%y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y{$yt$ym$yf$y_$yX$yQ$yJ$yC$y<$y5$y.$y'$y $y$y$y $y$y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#yx#yq#yj#yc#y\#yU#yN#yG#y@#y9#y2#y+#y$#y#y#y#y#y#y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y|"yu"yn"yg"y`"yY"yR"yK"yD"y="y6"y/"y("y!"y"y"y "y"y!y!y!y!y!y!y!y!y!y!y!y!y!y!y!y!y!y!y!yy!yr!yk!yd!y]!yV!yO!yH!yA!y:!y3!y,!y%!y!y!y!y !y!y y y y y y y y y y y y y y y y y y y} yv yo yh ya yZ yS yL yE y> y7 y0 y) y" y y y y yyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyyyyyyyyyyyyyyyyyyyyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyyyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyyyyyyyyyyyyyyyyyyyyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyyyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyyyyyyyyyyyyyyyyyyyyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyy y y y y y y y y y y y y y y y y y y| yu yn yg y` yY yR yK yD y= y6 y/ y( y! y y y y y y y y y y y y y y y y y y y y y y y yy yr yk yd y] yV yO yH yA y: y3 y, y% y y y y y y y y y y y y y y y y y y y y y y y y} yv yo yh ya yZ yS yL yE y> y7 y0 y) y" y y y y y y y y y y y y y y y y y y y y y y y yz ys yl ye y^ yW yP yI yB y; y4 y- y& y y y y y y y y y y y y y y y y y y y y y y y y~ yw yp yi yb y[ yT yM yF y? y8 y1 y* y# y y y y y yyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyyyyyyyyyyyyyyyyyyyyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyyyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyyyyyyyyyyyyyyyyyyyyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyyxxxxxxxxxxxxxxxxxx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxܽxսxνxǽxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxټxҼx˼xļxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxݻxֻxϻxȻxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxܶxնxζxǶxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxٵxҵx˵xĵxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxݴxִxϴxȴxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxܯxկxίxǯxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxٮxҮxˮxĮxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxݭx֭xϭxȭxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxܨxըxΨxǨxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxx٧xҧx˧xħxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxݦx֦xϦxȦxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxܡxաxΡxǡxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxx٠xҠxˠxĠxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxݟx֟xϟxȟxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxܚx՚xΚxǚxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxٙxҙx˙xęxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxݘx֘xϘxȘxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxxܓxՓxΓxǓxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxْxҒx˒xĒxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxݑx֑xϑxȑxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxx܌xՌxΌxnjxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxًxҋxˋxċxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxx݊x֊xϊxȊxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xxxxxxx܅xՅx΅xDžxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxلx҄x˄xĄxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxx݃xփxσxȃxxxxxxxxxxx{xtxmxfx_xXxQxJxCxx7x0x)x"xxx xx~x~x~x~x~x~x~x~x~x~x~x~x~x~x~x~x~x~x~xz~xs~xl~xe~x^~xW~xP~xI~xB~x;~x4~x-~x&~x~x~x~x ~x~x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x~}xw}xp}xi}xb}x[}xT}xM}xF}x?}x8}x1}x*}x#}x}x}x}x}x}x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x{|xt|xm|xf|x_|xX|xQ|xJ|xC|x<|x5|x.|x'|x |x|x|x |x|x{x{x{x{x{x{x{x{x{x{x{x{x{x{x{x{x{x{x{xx{xq{xj{xc{x\{xU{xN{xG{x@{x9{x2{x+{x${x{x{x{x{x{xzxzxzxzxzxzxzxzxzxzxzxzxzxzxzxzxzxzx|zxuzxnzxgzx`zxYzxRzxKzxDzx=zx6zx/zx(zx!zxzxzx zxzxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyyxryxkyxdyx]yxVyxOyxHyxAyx:yx3yx,yx%yxyxyxyx yxyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}xxvxxoxxhxxaxxZxxSxxLxxExx>xx7xx0xx)xx"xxxxxx xxxxwxwxwxwxwxwxwxwxwxwxwxwxwxwxwxwxwxwxwxzwxswxlwxewx^wxWwxPwxIwxBwx;wx4wx-wx&wxwxwxwx wxwxvxvxvxvxvxvxvxvxvxvxvxvxvxvxvxvxvxvx~vxwvxpvxivxbvx[vxTvxMvxFvx?vx8vx1vx*vx#vxvxvxvxvxvxuxuxuxuxuxuxuxuxuxuxuxuxuxuxuxuxuxux{uxtuxmuxfux_uxXuxQuxJuxCuxqx7qx0qx)qx"qxqxqx qxqxpxpxpxpxpxpxpxpxpxpxpxpxpxpxpxpxpxpxpxzpxspxlpxepx^pxWpxPpxIpxBpx;px4px-px&pxpxpxpx pxpxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxox~oxwoxpoxioxbox[oxToxMoxFox?ox8ox1ox*ox#oxoxoxoxoxoxnxnxnxnxnxnxnxnxnxnxnxnxnxnxnxnxnxnx{nxtnxmnxfnx_nxXnxQnxJnxCnxjx7jx0jx)jx"jxjxjx jxjxixixixixixixixixixixixixixixixixixixixzixsixlixeix^ixWixPixIixBix;ix4ix-ix&ixixixix ixixhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhx~hxwhxphxihxbhx[hxThxMhxFhx?hx8hx1hx*hx#hxhxhxhxhxhxgxgxgxgxgxgxgxgxgxgxgxgxgxgxgxgxgxgx{gxtgxmgxfgx_gxXgxQgxJgxCgxcx7cx0cx)cx"cxcxcx cxcxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxzbxsbxlbxebx^bxWbxPbxIbxBbx;bx4bx-bx&bxbxbxbx bxbxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxax~axwaxpaxiaxbax[axTaxMaxFax?ax8ax1ax*ax#axaxaxaxaxax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x{`xt`xm`xf`x_`xX`xQ`xJ`xC`x<`x5`x.`x'`x `x`x`x `x`x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_xx_xq_xj_xc_x\_xU_xN_xG_x@_x9_x2_x+_x$_x_x_x_x_x_x^x^x^x^x^x^x^x^x^x^x^x^x^x^x^x^x^x^x|^xu^xn^xg^x`^xY^xR^xK^xD^x=^x6^x/^x(^x!^x^x^x ^x^x]x]x]x]x]x]x]x]x]x]x]x]x]x]x]x]x]x]x]xy]xr]xk]xd]x]]xV]xO]xH]xA]x:]x3]x,]x%]x]x]x]x ]x]x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x}\xv\xo\xh\xa\xZ\xS\xL\xE\x>\x7\x0\x)\x"\x\x\x \x\x[x[x[x[x[x[x[x[x[x[x[x[x[x[x[x[x[x[x[xz[xs[xl[xe[x^[xW[xP[xI[xB[x;[x4[x-[x&[x[x[x[x [x[xZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZx~ZxwZxpZxiZxbZx[ZxTZxMZxFZx?Zx8Zx1Zx*Zx#ZxZxZxZxZxZxYxYxYxYxYxYxYxYxYxYxYxYxYxYxYxYxYxYx{YxtYxmYxfYx_YxXYxQYxJYxCYxUx7Ux0Ux)Ux"UxUxUx UxUxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxzTxsTxlTxeTx^TxWTxPTxITxBTx;Tx4Tx-Tx&TxTxTxTx TxTxSxSxSxSxSxSxSxSxSxSxSxSxSxSxSxSxSxSx~SxwSxpSxiSxbSx[SxTSxMSxFSx?Sx8Sx1Sx*Sx#SxSxSxSxSxSxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRx{RxtRxmRxfRx_RxXRxQRxJRxCRxNx7Nx0Nx)Nx"NxNxNx NxNxMxMxMxMxMxMxMxMxMxMxMxMxMxMxMxMxMxMxMxzMxsMxlMxeMx^MxWMxPMxIMxBMx;Mx4Mx-Mx&MxMxMxMx MxMxLxLxLxLxLxLxLxLxLxLxLxLxLxLxLxLxLxLx~LxwLxpLxiLxbLx[LxTLxMLxFLx?Lx8Lx1Lx*Lx#LxLxLxLxLxLxKxKxKxKxKxKxKxKxKxKxKxKxKxKxKxKxKxKx{KxtKxmKxfKx_KxXKxQKxJKxCKxGx7Gx0Gx)Gx"GxGxGx GxGxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxzFxsFxlFxeFx^FxWFxPFxIFxBFx;Fx4Fx-Fx&FxFxFxFx FxFxExExExExExExExExExExExExExExExExExEx~ExwExpExiExbEx[ExTExMExFEx?Ex8Ex1Ex*Ex#ExExExExExExDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDx{DxtDxmDxfDx_DxXDxQDxJDxCDx@x7@x0@x)@x"@x@x@x @x@x?x?x?x?x?x?x?x?x?x?x?x?x?x?x?x?x?x?x?xz?xs?xl?xe?x^?xW?xP?xI?xB?x;?x4?x-?x&?x?x?x?x ?x?x>x>x>x>x>x>x>x>x>x>x>x>x>x>x>x>x>x>x~>xw>xp>xi>xb>x[>xT>xM>xF>x?>x8>x1>x*>x#>x>x>x>x>x>x=x=x=x=x=x=x=x=x=x=x=x=x=x=x=x=x=x=x{=xt=xm=xf=x_=xX=xQ=xJ=xC=x<=x5=x.=x'=x =x=x=x =x=x9x79x09x)9x"9x9x9x 9x9x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8xz8xs8xl8xe8x^8xW8xP8xI8xB8x;8x48x-8x&8x8x8x8x 8x8x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x~7xw7xp7xi7xb7x[7xT7xM7xF7x?7x87x17x*7x#7x7x7x7x7x7x6x6x6x6x6x6x6x6x6x6x6x6x6x6x6x6x6x6x{6xt6xm6xf6x_6xX6xQ6xJ6xC6x<6x56x.6x'6x 6x6x6x 6x6x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5xx5xq5xj5xc5x\5xU5xN5xG5x@5x95x25x+5x$5x5x5x5x5x5x4x4x4x4x4x4x4x4x4x4x4x4x4x4x4x4x4x4x|4xu4xn4xg4x`4xY4xR4xK4xD4x=4x64x/4x(4x!4x4x4x 4x4x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3xy3xr3xk3xd3x]3xV3xO3xH3xA3x:3x33x,3x%3x3x3x3x 3x3x2x2x2x2x2x2x2x2x2x2x2x2x2x2x2x2x2x2x}2xv2xo2xh2xa2xZ2xS2xL2xE2x>2x72x02x)2x"2x2x2x 2x2x1x1x1x1x1x1x1x1x1x1x1x1x1x1x1x1x1x1x1xz1xs1xl1xe1x^1xW1xP1xI1xB1x;1x41x-1x&1x1x1x1x 1x1x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x~0xw0xp0xi0xb0x[0xT0xM0xF0x?0x80x10x*0x#0x0x0x0x0x0x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x{/xt/xm/xf/x_/xX/xQ/xJ/xC/x+x7+x0+x)+x"+x+x+x +x+x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*xz*xs*xl*xe*x^*xW*xP*xI*xB*x;*x4*x-*x&*x*x*x*x *x*x)x)x)x)x)x)x)x)x)x)x)x)x)x)x)x)x)x)x~)xw)xp)xi)xb)x[)xT)xM)xF)x?)x8)x1)x*)x#)x)x)x)x)x)x(x(x(x(x(x(x(x(x(x(x(x(x(x(x(x(x(x(x{(xt(xm(xf(x_(xX(xQ(xJ(xC(x<(x5(x.(x'(x (x(x(x (x(x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'xx'xq'xj'xc'x\'xU'xN'xG'x@'x9'x2'x+'x$'x'x'x'x'x'x&x&x&x&x&x&x&x&x&x&x&x&x&x&x&x&x&x&x|&xu&xn&xg&x`&xY&xR&xK&xD&x=&x6&x/&x(&x!&x&x&x &x&x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%xy%xr%xk%xd%x]%xV%xO%xH%xA%x:%x3%x,%x%%x%x%x%x %x%x$x$x$x$x$x$x$x$x$x$x$x$x$x$x$x$x$x$x}$xv$xo$xh$xa$xZ$xS$xL$xE$x>$x7$x0$x)$x"$x$x$x $x$x#x#x#x#x#x#x#x#x#x#x#x#x#x#x#x#x#x#x#xz#xs#xl#xe#x^#xW#xP#xI#xB#x;#x4#x-#x&#x#x#x#x #x#x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x~"xw"xp"xi"xb"x["xT"xM"xF"x?"x8"x1"x*"x#"x"x"x"x"x"x!x!x!x!x!x!x!x!x!x!x!x!x!x!x!x!x!x!x{!xt!xm!xf!x_!xX!xQ!xJ!xC!xx7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCx<x5x.x'x xxx xxxxxxxxxxxxxxxxxxxxxxxqxjxcx\xUxNxGx@x9x2x+x$xxxxxxxxxxxxxxxxxxxxxxxx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCx<x5x.x'x xxx xxxxxxxxxxxxxxxxxxxxxxxqxjxcx\xUxNxGx@x9x2x+x$xxxxxxxxxxxxxxxxxxxxxxxx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xx x x x x x x x x x x x x x x x x x x~ xw xp xi xb x[ xT xM xF x? x8 x1 x* x# x x x x x x x x x x x x x x x x x x x x x x x x{ xt xm xf x_ xX xQ xJ xC x< x5 x. x' x x x x x x x x x x x x x x x x x x x x x x x x xx xq xj xc x\ xU xN xG x@ x9 x2 x+ x$ x x x x x x x x x x x x x x x x x x x x x x x x| xu xn xg x` xY xR xK xD x= x6 x/ x( x! x x x x x x x x x x x x x x x x x x x x x x x xy xr xk xd x] xV xO xH xA x: x3 x, x% x x x x x xxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCx<x5x.x'x xxx xxxxxxxxxxxxxxxxxxxxxxxqxjxcx\xUxNxGx@x9x2x+x$xxxxxxxxxxxxxxxxxxxxxxxx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwݿwֿwϿwȿwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwܺwպwκwǺwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwٹwҹw˹wĹwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwݸwָwϸwȸwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwܳwճwγwdzwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwٲwҲw˲wIJwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwݱwֱwϱwȱwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwܬwլwάwǬwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwww٫wҫw˫wīwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwݪw֪wϪwȪwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwܥwեwΥwǥwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwww٤wҤwˤwĤwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwݣw֣wϣwȣwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwܞw՞wΞwǞwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwٝwҝw˝wĝwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwݜw֜wϜwȜwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwܗw՗wΗwǗwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwٖwҖw˖wĖwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwݕw֕wϕwȕwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwwwܐwՐwΐwǐwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwُwҏwˏwďwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwݎw֎wώwȎwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwww܉wՉwΉwljwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwوw҈wˈwĈwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwww݇wևwχwȇwwwwwwwwwww{wtwmwfw_wXwQwJwCww7w0w)w"www wwwwwww܂wՂw΂wǂwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwفwҁwˁwāwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwww݀wրwπwȀwwwwwwwwwww{wtwmwfw_wXwQwJwCw|w7|w0|w)|w"|w|w|w |w|w{w{w{w{w{w{w{w{w{w{w{w{w{w{w{w{w{w{w{wz{ws{wl{we{w^{wW{wP{wI{wB{w;{w4{w-{w&{w{w{w{w {w{wzwzwzwzwzwzwzwzwzwzwzwzwzwzwzwzwzwzw~zwwzwpzwizwbzw[zwTzwMzwFzw?zw8zw1zw*zw#zwzwzwzwzwzwywywywywywywywywywywywywywywywywywyw{ywtywmywfyw_ywXywQywJywCywuw7uw0uw)uw"uwuwuw uwuwtwtwtwtwtwtwtwtwtwtwtwtwtwtwtwtwtwtwtwztwstwltwetw^twWtwPtwItwBtw;tw4tw-tw&twtwtwtw twtwswswswswswswswswswswswswswswswswswsw~swwswpswiswbsw[swTswMswFsw?sw8sw1sw*sw#swswswswswswrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw{rwtrwmrwfrw_rwXrwQrwJrwCrwnw7nw0nw)nw"nwnwnw nwnwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwzmwsmwlmwemw^mwWmwPmwImwBmw;mw4mw-mw&mwmwmwmw mwmwlwlwlwlwlwlwlwlwlwlwlwlwlwlwlwlwlwlw~lwwlwplwilwblw[lwTlwMlwFlw?lw8lw1lw*lw#lwlwlwlwlwlwkwkwkwkwkwkwkwkwkwkwkwkwkwkwkwkwkwkw{kwtkwmkwfkw_kwXkwQkwJkwCkwgw7gw0gw)gw"gwgwgw gwgwfwfwfwfwfwfwfwfwfwfwfwfwfwfwfwfwfwfwfwzfwsfwlfwefw^fwWfwPfwIfwBfw;fw4fw-fw&fwfwfwfw fwfwewewewewewewewewewewewewewewewewewew~ewwewpewiewbew[ewTewMewFew?ew8ew1ew*ew#ewewewewewewdwdwdwdwdwdwdwdwdwdwdwdwdwdwdwdwdwdw{dwtdwmdwfdw_dwXdwQdwJdwCdw`w7`w0`w)`w"`w`w`w `w`w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_wz_ws_wl_we_w^_wW_wP_wI_wB_w;_w4_w-_w&_w_w_w_w _w_w^w^w^w^w^w^w^w^w^w^w^w^w^w^w^w^w^w^w~^ww^wp^wi^wb^w[^wT^wM^wF^w?^w8^w1^w*^w#^w^w^w^w^w^w]w]w]w]w]w]w]w]w]w]w]w]w]w]w]w]w]w]w{]wt]wm]wf]w_]wX]wQ]wJ]wC]w<]w5]w.]w']w ]w]w]w ]w]w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\wx\wq\wj\wc\w\\wU\wN\wG\w@\w9\w2\w+\w$\w\w\w\w\w\w[w[w[w[w[w[w[w[w[w[w[w[w[w[w[w[w[w[w|[wu[wn[wg[w`[wY[wR[wK[wD[w=[w6[w/[w([w![w[w[w [w[wZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwyZwrZwkZwdZw]ZwVZwOZwHZwAZw:Zw3Zw,Zw%ZwZwZwZw ZwZwYwYwYwYwYwYwYwYwYwYwYwYwYwYwYwYwYwYw}YwvYwoYwhYwaYwZYwSYwLYwEYw>Yw7Yw0Yw)Yw"YwYwYw YwYwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwzXwsXwlXweXw^XwWXwPXwIXwBXw;Xw4Xw-Xw&XwXwXwXw XwXwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWw~WwwWwpWwiWwbWw[WwTWwMWwFWw?Ww8Ww1Ww*Ww#WwWwWwWwWwWwVwVwVwVwVwVwVwVwVwVwVwVwVwVwVwVwVwVw{VwtVwmVwfVw_VwXVwQVwJVwCVwRw7Rw0Rw)Rw"RwRwRw RwRwQwQwQwQwQwQwQwQwQwQwQwQwQwQwQwQwQwQwQwzQwsQwlQweQw^QwWQwPQwIQwBQw;Qw4Qw-Qw&QwQwQwQw QwQwPwPwPwPwPwPwPwPwPwPwPwPwPwPwPwPwPwPw~PwwPwpPwiPwbPw[PwTPwMPwFPw?Pw8Pw1Pw*Pw#PwPwPwPwPwPwOwOwOwOwOwOwOwOwOwOwOwOwOwOwOwOwOwOw{OwtOwmOwfOw_OwXOwQOwJOwCOwKw7Kw0Kw)Kw"KwKwKw KwKwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwzJwsJwlJweJw^JwWJwPJwIJwBJw;Jw4Jw-Jw&JwJwJwJw JwJwIwIwIwIwIwIwIwIwIwIwIwIwIwIwIwIwIwIw~IwwIwpIwiIwbIw[IwTIwMIwFIw?Iw8Iw1Iw*Iw#IwIwIwIwIwIwHwHwHwHwHwHwHwHwHwHwHwHwHwHwHwHwHwHw{HwtHwmHwfHw_HwXHwQHwJHwCHwDw7Dw0Dw)Dw"DwDwDw DwDwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwzCwsCwlCweCw^CwWCwPCwICwBCw;Cw4Cw-Cw&CwCwCwCw CwCwBwBwBwBwBwBwBwBwBwBwBwBwBwBwBwBwBwBw~BwwBwpBwiBwbBw[BwTBwMBwFBw?Bw8Bw1Bw*Bw#BwBwBwBwBwBwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw{AwtAwmAwfAw_AwXAwQAwJAwCAww>w>w>w>w>w>w>w>w>w>w>w>w>w>w>w>w>w>wy>wr>wk>wd>w]>wV>wO>wH>wA>w:>w3>w,>w%>w>w>w>w >w>w=w=w=w=w=w=w=w=w=w=w=w=w=w=w=w=w=w=w}=wv=wo=wh=wa=wZ=wS=wL=wE=w>=w7=w0=w)=w"=w=w=w =w=w6w76w06w)6w"6w6w6w 6w6w5w5w5w5w5w5w5w5w5w5w5w5w5w5w5w5w5w5w5wz5ws5wl5we5w^5wW5wP5wI5wB5w;5w45w-5w&5w5w5w5w 5w5w4w4w4w4w4w4w4w4w4w4w4w4w4w4w4w4w4w4w~4ww4wp4wi4wb4w[4wT4wM4wF4w?4w84w14w*4w#4w4w4w4w4w4w3w3w3w3w3w3w3w3w3w3w3w3w3w3w3w3w3w3w{3wt3wm3wf3w_3wX3wQ3wJ3wC3w<3w53w.3w'3w 3w3w3w 3w3w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2wx2wq2wj2wc2w\2wU2wN2wG2w@2w92w22w+2w$2w2w2w2w2w2w1w1w1w1w1w1w1w1w1w1w1w1w1w1w1w1w1w1w|1wu1wn1wg1w`1wY1wR1wK1wD1w=1w61w/1w(1w!1w1w1w 1w1w0w0w0w0w0w0w0w0w0w0w0w0w0w0w0w0w0w0w0wy0wr0wk0wd0w]0wV0wO0wH0wA0w:0w30w,0w%0w0w0w0w 0w0w/w/w/w/w/w/w/w/w/w/w/w/w/w/w/w/w/w/w}/wv/wo/wh/wa/wZ/wS/wL/wE/w>/w7/w0/w)/w"/w/w/w /w/w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.wz.ws.wl.we.w^.wW.wP.wI.wB.w;.w4.w-.w&.w.w.w.w .w.w-w-w-w-w-w-w-w-w-w-w-w-w-w-w-w-w-w-w~-ww-wp-wi-wb-w[-wT-wM-wF-w?-w8-w1-w*-w#-w-w-w-w-w-w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w{,wt,wm,wf,w_,wX,wQ,wJ,wC,w<,w5,w.,w',w ,w,w,w ,w,w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+wx+wq+wj+wc+w\+wU+wN+wG+w@+w9+w2+w++w$+w+w+w+w+w+w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w|*wu*wn*wg*w`*wY*wR*wK*wD*w=*w6*w/*w(*w!*w*w*w *w*w)w)w)w)w)w)w)w)w)w)w)w)w)w)w)w)w)w)w)wy)wr)wk)wd)w])wV)wO)wH)wA)w:)w3)w,)w%)w)w)w)w )w)w(w(w(w(w(w(w(w(w(w(w(w(w(w(w(w(w(w(w}(wv(wo(wh(wa(wZ(wS(wL(wE(w>(w7(w0(w)(w"(w(w(w (w(w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'wz'ws'wl'we'w^'wW'wP'wI'wB'w;'w4'w-'w&'w'w'w'w 'w'w&w&w&w&w&w&w&w&w&w&w&w&w&w&w&w&w&w&w~&ww&wp&wi&wb&w[&wT&wM&wF&w?&w8&w1&w*&w#&w&w&w&w&w&w%w%w%w%w%w%w%w%w%w%w%w%w%w%w%w%w%w%w{%wt%wm%wf%w_%wX%wQ%wJ%wC%w<%w5%w.%w'%w %w%w%w %w%w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$wx$wq$wj$wc$w\$wU$wN$wG$w@$w9$w2$w+$w$$w$w$w$w$w$w#w#w#w#w#w#w#w#w#w#w#w#w#w#w#w#w#w#w|#wu#wn#wg#w`#wY#wR#wK#wD#w=#w6#w/#w(#w!#w#w#w #w#w"w"w"w"w"w"w"w"w"w"w"w"w"w"w"w"w"w"w"wy"wr"wk"wd"w]"wV"wO"wH"wA"w:"w3"w,"w%"w"w"w"w "w"w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w}!wv!wo!wh!wa!wZ!wS!wL!wE!w>!w7!w0!w)!w"!w!w!w !w!w w w w w w w w w w w w w w w w w w w wz ws wl we w^ wW wP wI wB w; w4 w- w& w w w w w wwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCw<w5w.w'w www wwwwwwwwwwwwwwwwwwwwwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwwwwwwwwwwwwwwwwwww|wuwnwgw`wYwRwKwDw=w6w/w(w!www wwwwwwwwwwwwwwwwwwwwwywrwkwdw]wVwOwHwAw:w3w,w%wwww wwwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCw<w5w.w'w www wwwwwwwwwwwwwwwwwwwwwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwwwwwwwwwwwwwwwwwww|wuwnwgw`wYwRwKwDw=w6w/w(w!www wwwwwwwwwwwwwwwwwwwwwywrwkwdw]wVwOwHwAw:w3w,w%wwww wwwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCw<w5w.w'w www wwwwwwwwwwwwwwwwwwwwwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwwwwwwwwwwwwwwwwwww|wuwnwgw`wYwRwKwDw=w6w/w(w!www ww w w w w w w w w w w w w w w w w w w wy wr wk wd w] wV wO wH wA w: w3 w, w% w w w w w w w w w w w w w w w w w w w w w w w w} wv wo wh wa wZ wS wL wE w> w7 w0 w) w" w w w w w w w w w w w w w w w w w w w w w w w wz ws wl we w^ wW wP wI wB w; w4 w- w& w w w w w w w w w w w w w w w w w w w w w w w w~ ww wp wi wb w[ wT wM wF w? w8 w1 w* w# w w w w w w w w w w w w w w w w w w w w w w w w{ wt wm wf w_ wX wQ wJ wC w< w5 w. w' w w w w w wwwwwwwwwwwwwwwwwwwwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwwwwwwwwwwwwwwwwwww|wuwnwgw`wYwRwKwDw=w6w/w(w!www wwwwwwwwwwwwwwwwwwwwwywrwkwdw]wVwOwHwAw:w3w,w%wwww wwwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCw<w5w.w'w www wwwwwwwwwwwwwwwwwwwwwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwwwwwwwwwwwwwwwwwww|wuwnwgw`wYwRwKwDw=w6w/w(w!www wwvvvvvvvvvvvvvvvvvvvyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvvvvvvvvvvvvvvvvvvv}vvvovhvavZvSvLvEv>v7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvܾvվvξvǾvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvٽvҽv˽vĽvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvݼvּvϼvȼvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvܷvշvηvǷvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvٶvҶv˶vĶvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvݵvֵvϵvȵvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvܰvհvΰvǰvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvٯvүv˯vįvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvݮv֮vϮvȮvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvܩvթvΩvǩvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvv٨vҨv˨vĨvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvݧv֧vϧvȧvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvܢvբv΢vǢvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvv١vҡvˡvġvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvݠv֠vϠvȠvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvܛv՛vΛvǛvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvٚvҚv˚vĚvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvݙv֙vϙvșvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvܔvՔvΔvǔvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvٓvғv˓vēvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvݒv֒vϒvȒvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvv܍vՍv΍vǍvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvٌvҌvˌvČvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvv݋v֋vϋvȋvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvv܆vՆvΆvdžvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvمv҅v˅vąvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvv݄vքvτvȄvvvvvvvvvvv{vtvmvfv_vXvQvJvCvv7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vv~v~v~v~v~v~v~v~v~v~v~v~v~v~v~v~v~v~v~~vw~vp~vi~vb~v[~vT~vM~vF~v?~v8~v1~v*~v#~v~v~v~v~v~v}v}v}v}v}v}v}v}v}v}v}v}v}v}v}v}v}v}v{}vt}vm}vf}v_}vX}vQ}vJ}vC}v<}v5}v.}v'}v }v}v}v }v}v|v|v|v|v|v|v|v|v|v|v|v|v|v|v|v|v|v|v|vx|vq|vj|vc|v\|vU|vN|vG|v@|v9|v2|v+|v$|v|v|v|v|v|v{v{v{v{v{v{v{v{v{v{v{v{v{v{v{v{v{v{v|{vu{vn{vg{v`{vY{vR{vK{vD{v={v6{v/{v({v!{v{v{v {v{vzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzvyzvrzvkzvdzv]zvVzvOzvHzvAzv:zv3zv,zv%zvzvzvzv zvzvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyv}yvvyvoyvhyvayvZyvSyvLyvEyv>yv7yv0yv)yv"yvyvyv yvyvxvxvxvxvxvxvxvxvxvxvxvxvxvxvxvxvxvxvxvzxvsxvlxvexv^xvWxvPxvIxvBxv;xv4xv-xv&xvxvxvxv xvxvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwv~wvwwvpwviwvbwv[wvTwvMwvFwv?wv8wv1wv*wv#wvwvwvwvwvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv{vvtvvmvvfvv_vvXvvQvvJvvCvvrv7rv0rv)rv"rvrvrv rvrvqvqvqvqvqvqvqvqvqvqvqvqvqvqvqvqvqvqvqvzqvsqvlqveqv^qvWqvPqvIqvBqv;qv4qv-qv&qvqvqvqv qvqvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpv~pvwpvppvipvbpv[pvTpvMpvFpv?pv8pv1pv*pv#pvpvpvpvpvpvovovovovovovovovovovovovovovovovovov{ovtovmovfov_ovXovQovJovCovkv7kv0kv)kv"kvkvkv kvkvjvjvjvjvjvjvjvjvjvjvjvjvjvjvjvjvjvjvjvzjvsjvljvejv^jvWjvPjvIjvBjv;jv4jv-jv&jvjvjvjv jvjviviviviviviviviviviviviviviviviviviv~ivwivpiviivbiv[ivTivMivFiv?iv8iv1iv*iv#ivivivivivivhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhv{hvthvmhvfhv_hvXhvQhvJhvChvdv7dv0dv)dv"dvdvdv dvdvcvcvcvcvcvcvcvcvcvcvcvcvcvcvcvcvcvcvcvzcvscvlcvecv^cvWcvPcvIcvBcv;cv4cv-cv&cvcvcvcv cvcvbvbvbvbvbvbvbvbvbvbvbvbvbvbvbvbvbvbv~bvwbvpbvibvbbv[bvTbvMbvFbv?bv8bv1bv*bv#bvbvbvbvbvbvavavavavavavavavavavavavavavavavavav{avtavmavfav_avXavQavJavCav]v7]v0]v)]v"]v]v]v ]v]v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\vz\vs\vl\ve\v^\vW\vP\vI\vB\v;\v4\v-\v&\v\v\v\v \v\v[v[v[v[v[v[v[v[v[v[v[v[v[v[v[v[v[v[v~[vw[vp[vi[vb[v[[vT[vM[vF[v?[v8[v1[v*[v#[v[v[v[v[v[vZvZvZvZvZvZvZvZvZvZvZvZvZvZvZvZvZvZv{ZvtZvmZvfZv_ZvXZvQZvJZvCZvVv7Vv0Vv)Vv"VvVvVv VvVvUvUvUvUvUvUvUvUvUvUvUvUvUvUvUvUvUvUvUvzUvsUvlUveUv^UvWUvPUvIUvBUv;Uv4Uv-Uv&UvUvUvUv UvUvTvTvTvTvTvTvTvTvTvTvTvTvTvTvTvTvTvTv~TvwTvpTviTvbTv[TvTTvMTvFTv?Tv8Tv1Tv*Tv#TvTvTvTvTvTvSvSvSvSvSvSvSvSvSvSvSvSvSvSvSvSvSvSv{SvtSvmSvfSv_SvXSvQSvJSvCSvOv7Ov0Ov)Ov"OvOvOv OvOvNvNvNvNvNvNvNvNvNvNvNvNvNvNvNvNvNvNvNvzNvsNvlNveNv^NvWNvPNvINvBNv;Nv4Nv-Nv&NvNvNvNv NvNvMvMvMvMvMvMvMvMvMvMvMvMvMvMvMvMvMvMv~MvwMvpMviMvbMv[MvTMvMMvFMv?Mv8Mv1Mv*Mv#MvMvMvMvMvMvLvLvLvLvLvLvLvLvLvLvLvLvLvLvLvLvLvLv{LvtLvmLvfLv_LvXLvQLvJLvCLvHv7Hv0Hv)Hv"HvHvHv HvHvGvGvGvGvGvGvGvGvGvGvGvGvGvGvGvGvGvGvGvzGvsGvlGveGv^GvWGvPGvIGvBGv;Gv4Gv-Gv&GvGvGvGv GvGvFvFvFvFvFvFvFvFvFvFvFvFvFvFvFvFvFvFv~FvwFvpFviFvbFv[FvTFvMFvFFv?Fv8Fv1Fv*Fv#FvFvFvFvFvFvEvEvEvEvEvEvEvEvEvEvEvEvEvEvEvEvEvEv{EvtEvmEvfEv_EvXEvQEvJEvCEvAv7Av0Av)Av"AvAvAv AvAv@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@vz@vs@vl@ve@v^@vW@vP@vI@vB@v;@v4@v-@v&@v@v@v@v @v@v?v?v?v?v?v?v?v?v?v?v?v?v?v?v?v?v?v?v~?vw?vp?vi?vb?v[?vT?vM?vF?v??v8?v1?v*?v#?v?v?v?v?v?v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v{>vt>vm>vf>v_>vX>vQ>vJ>vC>v<>v5>v.>v'>v >v>v>v >v>v=v=v=v=v=v=v=v=v=v=v=v=v=v=v=v=v=v=v=vx=vq=vj=vc=v\=vU=vN=vG=v@=v9=v2=v+=v$=v=v=v=v=v=v:v7:v0:v):v":v:v:v :v:v9v9v9v9v9v9v9v9v9v9v9v9v9v9v9v9v9v9v9vz9vs9vl9ve9v^9vW9vP9vI9vB9v;9v49v-9v&9v9v9v9v 9v9v8v8v8v8v8v8v8v8v8v8v8v8v8v8v8v8v8v8v~8vw8vp8vi8vb8v[8vT8vM8vF8v?8v88v18v*8v#8v8v8v8v8v8v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v{7vt7vm7vf7v_7vX7vQ7vJ7vC7v<7v57v.7v'7v 7v7v7v 7v7v6v6v6v6v6v6v6v6v6v6v6v6v6v6v6v6v6v6v6vx6vq6vj6vc6v\6vU6vN6vG6v@6v96v26v+6v$6v6v6v6v6v6v5v5v5v5v5v5v5v5v5v5v5v5v5v5v5v5v5v5v|5vu5vn5vg5v`5vY5vR5vK5vD5v=5v65v/5v(5v!5v5v5v 5v5v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4vy4vr4vk4vd4v]4vV4vO4vH4vA4v:4v34v,4v%4v4v4v4v 4v4v3v3v3v3v3v3v3v3v3v3v3v3v3v3v3v3v3v3v}3vv3vo3vh3va3vZ3vS3vL3vE3v>3v73v03v)3v"3v3v3v 3v3v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2vz2vs2vl2ve2v^2vW2vP2vI2vB2v;2v42v-2v&2v2v2v2v 2v2v1v1v1v1v1v1v1v1v1v1v1v1v1v1v1v1v1v1v~1vw1vp1vi1vb1v[1vT1vM1vF1v?1v81v11v*1v#1v1v1v1v1v1v0v0v0v0v0v0v0v0v0v0v0v0v0v0v0v0v0v0v{0vt0vm0vf0v_0vX0vQ0vJ0vC0v<0v50v.0v'0v 0v0v0v 0v0v/v/v/v/v/v/v/v/v/v/v/v/v/v/v/v/v/v/v/vx/vq/vj/vc/v\/vU/vN/vG/v@/v9/v2/v+/v$/v/v/v/v/v/v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v|.vu.vn.vg.v`.vY.vR.vK.vD.v=.v6.v/.v(.v!.v.v.v .v.v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-vy-vr-vk-vd-v]-vV-vO-vH-vA-v:-v3-v,-v%-v-v-v-v -v-v,v,v,v,v,v,v,v,v,v,v,v,v,v,v,v,v,v,v},vv,vo,vh,va,vZ,vS,vL,vE,v>,v7,v0,v),v",v,v,v ,v,v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+vz+vs+vl+ve+v^+vW+vP+vI+vB+v;+v4+v-+v&+v+v+v+v +v+v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v~*vw*vp*vi*vb*v[*vT*vM*vF*v?*v8*v1*v**v#*v*v*v*v*v*v)v)v)v)v)v)v)v)v)v)v)v)v)v)v)v)v)v)v{)vt)vm)vf)v_)vX)vQ)vJ)vC)v<)v5)v.)v')v )v)v)v )v)v(v(v(v(v(v(v(v(v(v(v(v(v(v(v(v(v(v(v(vx(vq(vj(vc(v\(vU(vN(vG(v@(v9(v2(v+(v$(v(v(v(v(v(v'v'v'v'v'v'v'v'v'v'v'v'v'v'v'v'v'v'v|'vu'vn'vg'v`'vY'vR'vK'vD'v='v6'v/'v('v!'v'v'v 'v'v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&vy&vr&vk&vd&v]&vV&vO&vH&vA&v:&v3&v,&v%&v&v&v&v &v&v%v%v%v%v%v%v%v%v%v%v%v%v%v%v%v%v%v%v}%vv%vo%vh%va%vZ%vS%vL%vE%v>%v7%v0%v)%v"%v%v%v %v%v$v$v$v$v$v$v$v$v$v$v$v$v$v$v$v$v$v$v$vz$vs$vl$ve$v^$vW$vP$vI$vB$v;$v4$v-$v&$v$v$v$v $v$v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v~#vw#vp#vi#vb#v[#vT#vM#vF#v?#v8#v1#v*#v##v#v#v#v#v#v"v"v"v"v"v"v"v"v"v"v"v"v"v"v"v"v"v"v{"vt"vm"vf"v_"vX"vQ"vJ"vC"v<"v5"v."v'"v "v"v"v "v"v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!vx!vq!vj!vc!v\!vU!vN!vG!v@!v9!v2!v+!v$!v!v!v!v!v!v v v v v v v v v v v v v v v v v v v| vu vn vg v` vY vR vK vD v= v6 v/ v( v! v v v v vvvvvvvvvvvvvvvvvvvvyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvvvvvvvvvvvvvvvvvvv}vvvovhvavZvSvLvEv>v7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCv<v5v.v'v vvv vvvvvvvvvvvvvvvvvvvvvxvqvjvcv\vUvNvGv@v9v2v+v$vvvvvvvvvvvvvvvvvvvvvvvv|vuvnvgv`vYvRvKvDv=v6v/v(v!vvv vvvvvvvvvvvvvvvvvvvvvyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvvvvvvvvvvvvvvvvvvv}vvvovhvavZvSvLvEv>v7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCv<v5v.v'v vvv vvvvvvvvvvvvvvvvvvvvvxvqvjvcv\vUvNvGv@v9v2v+v$vvvvvvvvvvvvvvvvvvvvvvvv|vuvnvgv`vYvRvKvDv=v6v/v(v!vvv vvvvvvvvvvvvvvvvvvvvvyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvvvvvvvvvvvvvvvvvvv}vvvovhvavZvSvLvEv>v7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvv v v v v v v v v v v v v v v v v v v{ vt vm vf v_ vX vQ vJ vC v< v5 v. v' v v v v v v v v v v v v v v v v v v v v v v v v vx vq vj vc v\ vU vN vG v@ v9 v2 v+ v$ v v v v v v v v v v v v v v v v v v v v v v v v| vu vn vg v` vY vR vK vD v= v6 v/ v( v! v v v v v v v v v v v v v v v v v v v v v v v vy vr vk vd v] vV vO vH vA v: v3 v, v% v v v v v v v v v v v v v v v v v v v v v v v v} vv vo vh va vZ vS vL vE v> v7 v0 v) v" v v v v vvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCv<v5v.v'v vvv vvvvvvvvvvvvvvvvvvvvvxvqvjvcv\vUvNvGv@v9v2v+v$vvvvvvvvvvvvvvvvvvvvvvvv|vuvnvgv`vYvRvKvDv=v6v/v(v!vvv vvvvvvvvvvvvvvvvvvvvvyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvvvvvvvvvvvvvvvvvvv}vvvovhvavZvSvLvEv>v7v0v)v"vvv vvvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuܻuջuλuǻuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuٺuҺu˺uĺuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuݹuֹuϹuȹuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuܴuմuδuǴuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuٳuҳu˳uijuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuݲuֲuϲuȲuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuܭuխuέuǭuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuu٬uҬuˬuĬuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuݫu֫uϫuȫuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuܦuզuΦuǦuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuu٥uҥu˥uĥuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuݤu֤uϤuȤuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuܟu՟uΟuǟuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuٞuҞu˞uĞuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuݝu֝uϝuȝuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuܘu՘uΘuǘuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuٗuҗu˗uėuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuݖu֖uϖuȖuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuuܑuՑuΑuǑuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuِuҐuːuĐuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuݏu֏uϏuȏuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuu܊uՊuΊuNJuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuىu҉uˉuĉuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuu݈uֈuψuȈuuuuuuuuuuu{utumufu_uXuQuJuCuu7u0u)u"uuu uuuuuuu܃uՃu΃uǃuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuقu҂u˂uĂuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuu݁uցuρuȁuuuuuuuuuuu{utumufu_uXuQuJuCu}u7}u0}u)}u"}u}u}u }u}u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|u|uz|us|ul|ue|u^|uW|uP|uI|uB|u;|u4|u-|u&|u|u|u|u |u|u{u{u{u{u{u{u{u{u{u{u{u{u{u{u{u{u{u{u~{uw{up{ui{ub{u[{uT{uM{uF{u?{u8{u1{u*{u#{u{u{u{u{u{uzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzu{zutzumzufzu_zuXzuQzuJzuCzuvu7vu0vu)vu"vuvuvu vuvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuzuusuuluueuu^uuWuuPuuIuuBuu;uu4uu-uu&uuuuuuuu uuuututututututututututututututututututu~tuwtuptuitubtu[tuTtuMtuFtu?tu8tu1tu*tu#tutututututususususususususususususususususususu{sutsumsufsu_suXsuQsuJsuCsuou7ou0ou)ou"ououou ouounununununununununununununununununununuznusnulnuenu^nuWnuPnuInuBnu;nu4nu-nu&nunununu nunumumumumumumumumumumumumumumumumumumu~muwmupmuimubmu[muTmuMmuFmu?mu8mu1mu*mu#mumumumumumululululululululululululululululululu{lutlumluflu_luXluQluJluCluhu7hu0hu)hu"huhuhu huhuguguguguguguguguguguguguguguguguguguguzgusgulguegu^guWguPguIguBgu;gu4gu-gu&gugugugu gugufufufufufufufufufufufufufufufufufufu~fuwfupfuifubfu[fuTfuMfuFfu?fu8fu1fu*fu#fufufufufufueueueueueueueueueueueueueueueueueueu{euteumeufeu_euXeuQeuJeuCeuau7au0au)au"auauau auau`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`uz`us`ul`ue`u^`uW`uP`uI`uB`u;`u4`u-`u&`u`u`u`u `u`u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u~_uw_up_ui_ub_u[_uT_uM_uF_u?_u8_u1_u*_u#_u_u_u_u_u_u^u^u^u^u^u^u^u^u^u^u^u^u^u^u^u^u^u^u{^ut^um^uf^u_^uX^uQ^uJ^uC^u<^u5^u.^u'^u ^u^u^u ^u^u]u]u]u]u]u]u]u]u]u]u]u]u]u]u]u]u]u]u]ux]uq]uj]uc]u\]uU]uN]uG]u@]u9]u2]u+]u$]u]u]u]u]u]u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u|\uu\un\ug\u`\uY\uR\uK\uD\u=\u6\u/\u(\u!\u\u\u \u\u[u[u[u[u[u[u[u[u[u[u[u[u[u[u[u[u[u[u[uy[ur[uk[ud[u][uV[uO[uH[uA[u:[u3[u,[u%[u[u[u[u [u[uZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZu}ZuvZuoZuhZuaZuZZuSZuLZuEZu>Zu7Zu0Zu)Zu"ZuZuZu ZuZuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuzYusYulYueYu^YuWYuPYuIYuBYu;Yu4Yu-Yu&YuYuYuYu YuYuXuXuXuXuXuXuXuXuXuXuXuXuXuXuXuXuXuXu~XuwXupXuiXubXu[XuTXuMXuFXu?Xu8Xu1Xu*Xu#XuXuXuXuXuXuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWu{WutWumWufWu_WuXWuQWuJWuCWuSu7Su0Su)Su"SuSuSu SuSuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuzRusRulRueRu^RuWRuPRuIRuBRu;Ru4Ru-Ru&RuRuRuRu RuRuQuQuQuQuQuQuQuQuQuQuQuQuQuQuQuQuQuQu~QuwQupQuiQubQu[QuTQuMQuFQu?Qu8Qu1Qu*Qu#QuQuQuQuQuQuPuPuPuPuPuPuPuPuPuPuPuPuPuPuPuPuPuPu{PutPumPufPu_PuXPuQPuJPuCPuLu7Lu0Lu)Lu"LuLuLu LuLuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuzKusKulKueKu^KuWKuPKuIKuBKu;Ku4Ku-Ku&KuKuKuKu KuKuJuJuJuJuJuJuJuJuJuJuJuJuJuJuJuJuJuJu~JuwJupJuiJubJu[JuTJuMJuFJu?Ju8Ju1Ju*Ju#JuJuJuJuJuJuIuIuIuIuIuIuIuIuIuIuIuIuIuIuIuIuIuIu{IutIumIufIu_IuXIuQIuJIuCIuEu7Eu0Eu)Eu"EuEuEu EuEuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuzDusDulDueDu^DuWDuPDuIDuBDu;Du4Du-Du&DuDuDuDu DuDuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu~CuwCupCuiCubCu[CuTCuMCuFCu?Cu8Cu1Cu*Cu#CuCuCuCuCuCuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBu{ButBumBufBu_BuXBuQBuJBuCBuu>u>u>u>u>u>u>u>u>u>u>u>u>u>u>u>u>u}>uv>uo>uh>ua>uZ>uS>uL>uE>u>>u7>u0>u)>u">u>u>u >u>u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=uz=us=ul=ue=u^=uW=uP=uI=uB=u;=u4=u-=u&=u=u=u=u =u=u7u77u07u)7u"7u7u7u 7u7u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6uz6us6ul6ue6u^6uW6uP6uI6uB6u;6u46u-6u&6u6u6u6u 6u6u5u5u5u5u5u5u5u5u5u5u5u5u5u5u5u5u5u5u~5uw5up5ui5ub5u[5uT5uM5uF5u?5u85u15u*5u#5u5u5u5u5u5u4u4u4u4u4u4u4u4u4u4u4u4u4u4u4u4u4u4u{4ut4um4uf4u_4uX4uQ4uJ4uC4u<4u54u.4u'4u 4u4u4u 4u4u3u3u3u3u3u3u3u3u3u3u3u3u3u3u3u3u3u3u3ux3uq3uj3uc3u\3uU3uN3uG3u@3u93u23u+3u$3u3u3u3u3u3u2u2u2u2u2u2u2u2u2u2u2u2u2u2u2u2u2u2u|2uu2un2ug2u`2uY2uR2uK2uD2u=2u62u/2u(2u!2u2u2u 2u2u1u1u1u1u1u1u1u1u1u1u1u1u1u1u1u1u1u1u1uy1ur1uk1ud1u]1uV1uO1uH1uA1u:1u31u,1u%1u1u1u1u 1u1u0u0u0u0u0u0u0u0u0u0u0u0u0u0u0u0u0u0u}0uv0uo0uh0ua0uZ0uS0uL0uE0u>0u70u00u)0u"0u0u0u 0u0u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/uz/us/ul/ue/u^/uW/uP/uI/uB/u;/u4/u-/u&/u/u/u/u /u/u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u~.uw.up.ui.ub.u[.uT.uM.uF.u?.u8.u1.u*.u#.u.u.u.u.u.u-u-u-u-u-u-u-u-u-u-u-u-u-u-u-u-u-u-u{-ut-um-uf-u_-uX-uQ-uJ-uC-u<-u5-u.-u'-u -u-u-u -u-u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,ux,uq,uj,uc,u\,uU,uN,uG,u@,u9,u2,u+,u$,u,u,u,u,u,u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u|+uu+un+ug+u`+uY+uR+uK+uD+u=+u6+u/+u(+u!+u+u+u +u+u*u*u*u*u*u*u*u*u*u*u*u*u*u*u*u*u*u*u*uy*ur*uk*ud*u]*uV*uO*uH*uA*u:*u3*u,*u%*u*u*u*u *u*u)u)u)u)u)u)u)u)u)u)u)u)u)u)u)u)u)u)u})uv)uo)uh)ua)uZ)uS)uL)uE)u>)u7)u0)u))u")u)u)u )u)u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(uz(us(ul(ue(u^(uW(uP(uI(uB(u;(u4(u-(u&(u(u(u(u (u(u'u'u'u'u'u'u'u'u'u'u'u'u'u'u'u'u'u'u~'uw'up'ui'ub'u['uT'uM'uF'u?'u8'u1'u*'u#'u'u'u'u'u'u&u&u&u&u&u&u&u&u&u&u&u&u&u&u&u&u&u&u{&ut&um&uf&u_&uX&uQ&uJ&uC&u<&u5&u.&u'&u &u&u&u &u&u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%ux%uq%uj%uc%u\%uU%uN%uG%u@%u9%u2%u+%u$%u%u%u%u%u%u$u$u$u$u$u$u$u$u$u$u$u$u$u$u$u$u$u$u|$uu$un$ug$u`$uY$uR$uK$uD$u=$u6$u/$u($u!$u$u$u $u$u#u#u#u#u#u#u#u#u#u#u#u#u#u#u#u#u#u#u#uy#ur#uk#ud#u]#uV#uO#uH#uA#u:#u3#u,#u%#u#u#u#u #u#u"u"u"u"u"u"u"u"u"u"u"u"u"u"u"u"u"u"u}"uv"uo"uh"ua"uZ"uS"uL"uE"u>"u7"u0"u)"u""u"u"u "u"u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!uz!us!ul!ue!u^!uW!uP!uI!uB!u;!u4!u-!u&!u!u!u!u !u!u u u u u u u u u u u u u u u u u u u~ uw up ui ub u[ uT uM uF u? u8 u1 u* u# u u u u u uuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCu<u5u.u'u uuu uuuuuuuuuuuuuuuuuuuuuxuqujucu\uUuNuGu@u9u2u+u$uuuuuuuuuuuuuuuuuuuuuuuu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuuuuuuuuuuuuuuuuuuuuyurukudu]uVuOuHuAu:u3u,u%uuuu uuuuuuuuuuuuuuuuuuuu}uvuouhuauZuSuLuEu>u7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCu<u5u.u'u uuu uuuuuuuuuuuuuuuuuuuuuxuqujucu\uUuNuGu@u9u2u+u$uuuuuuuuuuuuuuuuuuuuuuuu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuuuuuuuuuuuuuuuuuuuuyurukudu]uVuOuHuAu:u3u,u%uuuu uuuuuuuuuuuuuuuuuuuu}uvuouhuauZuSuLuEu>u7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCu<u5u.u'u uuu uuuuuuuuuuuuuuuuuuuuuxuqujucu\uUuNuGu@u9u2u+u$uuuuuuuuuuuuuuuuuuuuuuuu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuuuuuuuuuuuuuuuuuuuuyurukudu]uVuOuHuAu:u3u,u%uuuu uu u u u u u u u u u u u u u u u u u u} uv uo uh ua uZ uS uL uE u> u7 u0 u) u" u u u u u u u u u u u u u u u u u u u u u u u uz us ul ue u^ uW uP uI uB u; u4 u- u& u u u u u u u u u u u u u u u u u u u u u u u u~ uw up ui ub u[ uT uM uF u? u8 u1 u* u# u u u u u u u u u u u u u u u u u u u u u u u u{ ut um uf u_ uX uQ uJ uC u< u5 u. u' u u u u u u u u u u u u u u u u u u u u u u u u ux uq uj uc u\ uU uN uG u@ u9 u2 u+ u$ u u u u u uuuuuuuuuuuuuuuuuuu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuuuuuuuuuuuuuuuuuuuuyurukudu]uVuOuHuAu:u3u,u%uuuu uuuuuuuuuuuuuuuuuuuu}uvuouhuauZuSuLuEu>u7u0u)u"uuu uuuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCu<u5u.u'u uuu uuuuuuuuuuuuuuuuuuuuuxuqujucu\uUuNuGu@u9u2u+u$uuuuuuuuuuuuuuuuuuuuuuuu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuuuuuuuuuuuuuuuuuuuuyurukudu]uVuOuHuAu:u3u,u%uuuu uutttttttttttttttttt}tvtothtatZtStLtEt>t7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttܿtտtοtǿtttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttپtҾt˾tľtttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttttttݽtֽtϽtȽttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttܸtոtθtǸtttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttٷtҷt˷tķtttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttttttݶtֶt϶tȶttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttܱtձtαtDZtttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttٰtҰt˰tİtttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttttttݯt֯tϯtȯttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttܪtժtΪtǪtttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttttttt٩tҩt˩tĩtttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttttttݨt֨tϨtȨttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttܣtգtΣtǣtttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttttttt٢tҢtˢtĢtttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttttttݡt֡tϡtȡttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttܜt՜tΜtǜtttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttٛtқt˛tětttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttttttݚt֚tϚtȚttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt tttttttܕtՕtΕtǕtttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttٔtҔt˔tĔtttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttttttݓt֓tϓtȓttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt ttttttt܎tՎtΎtǎtttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttٍtҍtˍtčtttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttt݌t֌tόtȌttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt ttttttt܇tՇt·tLJtttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttنt҆tˆtĆtttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttt݅tօtυtȅttttttttttt{tttmtft_tXtQtJtCtt7t0t)t"ttt ttttttt܀tՀt΀tǀtttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttt~t~t~t~t~t~t~t~t~t~t~t~t~t~t~t~t~t~t{~tt~tm~tf~t_~tX~tQ~tJ~tC~t<~t5~t.~t'~t ~t~t~t ~t~t}t}t}t}t}t}t}t}t}t}t}t}t}t}t}t}t}t}t}tx}tq}tj}tc}t\}tU}tN}tG}t@}t9}t2}t+}t$}t}t}t}t}t}t|t|t|t|t|t|t|t|t|t|t|t|t|t|t|t|t|t|t||tu|tn|tg|t`|tY|tR|tK|tD|t=|t6|t/|t(|t!|t|t|t |t|t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{ty{tr{tk{td{t]{tV{tO{tH{tA{t:{t3{t,{t%{t{t{t{t {t{tztztztztztztztztztztztztztztztztztzt}ztvztozthztaztZztSztLztEzt>zt7zt0zt)zt"ztztzt ztztytytytytytytytytytytytytytytytytytytytzytsytlyteyt^ytWytPytIytByt;yt4yt-yt&ytytytyt ytytxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxt~xtwxtpxtixtbxt[xtTxtMxtFxt?xt8xt1xt*xt#xtxtxtxtxtxtwtwtwtwtwtwtwtwtwtwtwtwtwtwtwtwtwtwt{wttwtmwtfwt_wtXwtQwtJwtCwtst7st0st)st"ststst ststrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtzrtsrtlrtert^rtWrtPrtIrtBrt;rt4rt-rt&rtrtrtrt rtrtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqt~qtwqtpqtiqtbqt[qtTqtMqtFqt?qt8qt1qt*qt#qtqtqtqtqtqtptptptptptptptptptptptptptptptptptpt{pttptmptfpt_ptXptQptJptCptlt7lt0lt)lt"ltltlt ltltktktktktktktktktktktktktktktktktktktktzktsktlktekt^ktWktPktIktBkt;kt4kt-kt&ktktktkt ktktjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjt~jtwjtpjtijtbjt[jtTjtMjtFjt?jt8jt1jt*jt#jtjtjtjtjtjtitititititititititititititititititit{ittitmitfit_itXitQitJitCitet7et0et)et"etetet etetdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtzdtsdtldtedt^dtWdtPdtIdtBdt;dt4dt-dt&dtdtdtdt dtdtctctctctctctctctctctctctctctctctctct~ctwctpctictbct[ctTctMctFct?ct8ct1ct*ct#ctctctctctctbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbt{bttbtmbtfbt_btXbtQbtJbtCbt^t7^t0^t)^t"^t^t^t ^t^t]t]t]t]t]t]t]t]t]t]t]t]t]t]t]t]t]t]t]tz]ts]tl]te]t^]tW]tP]tI]tB]t;]t4]t-]t&]t]t]t]t ]t]t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t~\tw\tp\ti\tb\t[\tT\tM\tF\t?\t8\t1\t*\t#\t\t\t\t\t\t[t[t[t[t[t[t[t[t[t[t[t[t[t[t[t[t[t[t{[tt[tm[tf[t_[tX[tQ[tJ[tC[t<[t5[t.[t'[t [t[t[t [t[tZtZtZtZtZtZtZtZtZtZtZtZtZtZtZtZtZtZtZtxZtqZtjZtcZt\ZtUZtNZtGZt@Zt9Zt2Zt+Zt$ZtZtZtZtZtZtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYt|YtuYtnYtgYt`YtYYtRYtKYtDYt=Yt6Yt/Yt(Yt!YtYtYt YtYtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtyXtrXtkXtdXt]XtVXtOXtHXtAXt:Xt3Xt,Xt%XtXtXtXt XtXtWtWtWtWtWtWtWtWtWtWtWtWtWtWtWtWtWtWt}WtvWtoWthWtaWtZWtSWtLWtEWt>Wt7Wt0Wt)Wt"WtWtWt WtWtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtzVtsVtlVteVt^VtWVtPVtIVtBVt;Vt4Vt-Vt&VtVtVtVt VtVtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUt~UtwUtpUtiUtbUt[UtTUtMUtFUt?Ut8Ut1Ut*Ut#UtUtUtUtUtUtTtTtTtTtTtTtTtTtTtTtTtTtTtTtTtTtTtTt{TttTtmTtfTt_TtXTtQTtJTtCTtPt7Pt0Pt)Pt"PtPtPt PtPtOtOtOtOtOtOtOtOtOtOtOtOtOtOtOtOtOtOtOtzOtsOtlOteOt^OtWOtPOtIOtBOt;Ot4Ot-Ot&OtOtOtOt OtOtNtNtNtNtNtNtNtNtNtNtNtNtNtNtNtNtNtNt~NtwNtpNtiNtbNt[NtTNtMNtFNt?Nt8Nt1Nt*Nt#NtNtNtNtNtNtMtMtMtMtMtMtMtMtMtMtMtMtMtMtMtMtMtMt{MttMtmMtfMt_MtXMtQMtJMtCMtIt7It0It)It"ItItIt ItItHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtzHtsHtlHteHt^HtWHtPHtIHtBHt;Ht4Ht-Ht&HtHtHtHt HtHtGtGtGtGtGtGtGtGtGtGtGtGtGtGtGtGtGtGt~GtwGtpGtiGtbGt[GtTGtMGtFGt?Gt8Gt1Gt*Gt#GtGtGtGtGtGtFtFtFtFtFtFtFtFtFtFtFtFtFtFtFtFtFtFt{FttFtmFtfFt_FtXFtQFtJFtCFtBt7Bt0Bt)Bt"BtBtBt BtBtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtzAtsAtlAteAt^AtWAtPAtIAtBAt;At4At-At&AtAtAtAt AtAt@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t~@tw@tp@ti@tb@t[@tT@tM@tF@t?@t8@t1@t*@t#@t@t@t@t@t@t?t?t?t?t?t?t?t?t?t?t?t?t?t?t?t?t?t?t{?tt?tm?tf?t_?tX?tQ?tJ?tC?tt>t>t>t>t>t>t>t>t>t>t>t>t>t>t>t>t>t>tx>tq>tj>tc>t\>tU>tN>tG>t@>t9>t2>t+>t$>t>t>t>t>t>t=t=t=t=t=t=t=t=t=t=t=t=t=t=t=t=t=t=t|=tu=tn=tg=t`=tY=tR=tK=tD=t==t6=t/=t(=t!=t=t=t =t=t;t7;t0;t);t";t;t;t ;t;t:t:t:t:t:t:t:t:t:t:t:t:t:t:t:t:t:t:t:tz:ts:tl:te:t^:tW:tP:tI:tB:t;:t4:t-:t&:t:t:t:t :t:t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t~9tw9tp9ti9tb9t[9tT9tM9tF9t?9t89t19t*9t#9t9t9t9t9t9t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t{8tt8tm8tf8t_8tX8tQ8tJ8tC8t<8t58t.8t'8t 8t8t8t 8t8t7t7t7t7t7t7t7t7t7t7t7t7t7t7t7t7t7t7t7tx7tq7tj7tc7t\7tU7tN7tG7t@7t97t27t+7t$7t7t7t7t7t7t6t6t6t6t6t6t6t6t6t6t6t6t6t6t6t6t6t6t|6tu6tn6tg6t`6tY6tR6tK6tD6t=6t66t/6t(6t!6t6t6t 6t6t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5ty5tr5tk5td5t]5tV5tO5tH5tA5t:5t35t,5t%5t5t5t5t 5t5t4t4t4t4t4t4t4t4t4t4t4t4t4t4t4t4t4t4t}4tv4to4th4ta4tZ4tS4tL4tE4t>4t74t04t)4t"4t4t4t 4t4t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3tz3ts3tl3te3t^3tW3tP3tI3tB3t;3t43t-3t&3t3t3t3t 3t3t2t2t2t2t2t2t2t2t2t2t2t2t2t2t2t2t2t2t~2tw2tp2ti2tb2t[2tT2tM2tF2t?2t82t12t*2t#2t2t2t2t2t2t1t1t1t1t1t1t1t1t1t1t1t1t1t1t1t1t1t1t{1tt1tm1tf1t_1tX1tQ1tJ1tC1t<1t51t.1t'1t 1t1t1t 1t1t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0tx0tq0tj0tc0t\0tU0tN0tG0t@0t90t20t+0t$0t0t0t0t0t0t/t/t/t/t/t/t/t/t/t/t/t/t/t/t/t/t/t/t|/tu/tn/tg/t`/tY/tR/tK/tD/t=/t6/t//t(/t!/t/t/t /t/t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.ty.tr.tk.td.t].tV.tO.tH.tA.t:.t3.t,.t%.t.t.t.t .t.t-t-t-t-t-t-t-t-t-t-t-t-t-t-t-t-t-t-t}-tv-to-th-ta-tZ-tS-tL-tE-t>-t7-t0-t)-t"-t-t-t -t-t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,tz,ts,tl,te,t^,tW,tP,tI,tB,t;,t4,t-,t&,t,t,t,t ,t,t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t~+tw+tp+ti+tb+t[+tT+tM+tF+t?+t8+t1+t*+t#+t+t+t+t+t+t*t*t*t*t*t*t*t*t*t*t*t*t*t*t*t*t*t*t{*tt*tm*tf*t_*tX*tQ*tJ*tC*t<*t5*t.*t'*t *t*t*t *t*t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)tx)tq)tj)tc)t\)tU)tN)tG)t@)t9)t2)t+)t$)t)t)t)t)t)t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t|(tu(tn(tg(t`(tY(tR(tK(tD(t=(t6(t/(t((t!(t(t(t (t(t't't't't't't't't't't't't't't't't't't'ty'tr'tk'td't]'tV'tO'tH'tA't:'t3't,'t%'t't't't 't't&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t}&tv&to&th&ta&tZ&tS&tL&tE&t>&t7&t0&t)&t"&t&t&t &t&t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%t%tz%ts%tl%te%t^%tW%tP%tI%tB%t;%t4%t-%t&%t%t%t%t %t%t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t~$tw$tp$ti$tb$t[$tT$tM$tF$t?$t8$t1$t*$t#$t$t$t$t$t$t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t{#tt#tm#tf#t_#tX#tQ#tJ#tC#t<#t5#t.#t'#t #t#t#t #t#t"t"t"t"t"t"t"t"t"t"t"t"t"t"t"t"t"t"t"tx"tq"tj"tc"t\"tU"tN"tG"t@"t9"t2"t+"t$"t"t"t"t"t"t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t|!tu!tn!tg!t`!tY!tR!tK!tD!t=!t6!t/!t(!t!!t!t!t !t!t t t t t t t t t t t t t t t t t t t ty tr tk td t] tV tO tH tA t: t3 t, t% t t t t t ttttttttttttttttttt}tvtothtatZtStLtEt>t7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCt<t5t.t't ttt tttttttttttttttttttttxtqtjtct\tUtNtGt@t9t2t+t$tttttttttttttttttttttttt|tutntgt`tYtRtKtDt=t6t/t(t!ttt tttttttttttttttttttttytrtktdt]tVtOtHtAt:t3t,t%tttt tttttttttttttttttttt}tvtothtatZtStLtEt>t7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCt<t5t.t't ttt tttttttttttttttttttttxtqtjtct\tUtNtGt@t9t2t+t$tttttttttttttttttttttttt|tutntgt`tYtRtKtDt=t6t/t(t!ttt tttttttttttttttttttttytrtktdt]tVtOtHtAt:t3t,t%tttt tttttttttttttttttttt}tvtothtatZtStLtEt>t7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCt<t5t.t't ttt tt t t t t t t t t t t t t t t t t t t tx tq tj tc t\ tU tN tG t@ t9 t2 t+ t$ t t t t t t t t t t t t t t t t t t t t t t t t| tu tn tg t` tY tR tK tD t= t6 t/ t( t! t t t t t t t t t t t t t t t t t t t t t t t ty tr tk td t] tV tO tH tA t: t3 t, t% t t t t t t t t t t t t t t t t t t t t t t t t} tv to th ta tZ tS tL tE t> t7 t0 t) t" t t t t t t t t t t t t t t t t t t t t t t t tz ts tl te t^ tW tP tI tB t; t4 t- t& t t t t t ttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCt<t5t.t't ttt tttttttttttttttttttttxtqtjtct\tUtNtGt@t9t2t+t$tttttttttttttttttttttttt|tutntgt`tYtRtKtDt=t6t/t(t!ttt tttttttttttttttttttttytrtktdt]tVtOtHtAt:t3t,t%tttt tttttttttttttttttttt}tvtothtatZtStLtEt>t7t0t)t"ttt tttttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt tttttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#tttttttttttttttttttttttt{tttmtft_tXtQtJtCt<t5t.t't ttt ttsssssssssssssssssssxsqsjscs\sUsNsGs@s9s2s+s$ssssssssssssssssssssssss|susnsgs`sYsRsKsDs=s6s/s(s!sss sssssssssssssssssssssysrsksds]sVsOsHsAs:s3s,s%ssss ssssssssssssssssssss}svsoshsasZsSsLsEs>s7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss sssssssܼsռsμsǼssssssssssszssslses^sWsPsIsBs;s4s-s&ssss sssssssٻsһs˻sĻssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssݺsֺsϺsȺsssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss sssssssܵsյsεsǵssssssssssszssslses^sWsPsIsBs;s4s-s&ssss sssssssٴsҴs˴sĴssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssݳsֳsϳsȳsssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss sssssssܮsծsήsǮssssssssssszssslses^sWsPsIsBs;s4s-s&ssss sssssss٭sҭs˭sĭssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssݬs֬sϬsȬsssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss sssssssܧsէsΧsǧssssssssssszssslses^sWsPsIsBs;s4s-s&ssss sssssss٦sҦs˦sĦssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssݥs֥sϥsȥsssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss sssssssܠsՠsΠsǠssssssssssszssslses^sWsPsIsBs;s4s-s&ssss sssssssٟsҟs˟sğssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssݞs֞sϞsȞsssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss sssssssܙsՙsΙsǙssssssssssszssslses^sWsPsIsBs;s4s-s&ssss sssssss٘sҘs˘sĘssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssݗs֗sϗsȗsssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss sssssssܒsՒsΒsǒssssssssssszssslses^sWsPsIsBs;s4s-s&ssss sssssssّsґsˑsđssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssݐs֐sϐsȐsssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss sssssss܋sՋs΋sNjssssssssssszssslses^sWsPsIsBs;s4s-s&ssss sssssssيsҊsˊsĊssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssss݉s։sωsȉsssssssssss{stsmsfs_sXsQsJsCss7s0s)s"sss sssssss܄sՄs΄sDŽssssssssssszssslses^sWsPsIsBs;s4s-s&ssss sssssssكs҃s˃săssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssss݂sւsςsȂsssssssssss{stsmsfs_sXsQsJsCs~s7~s0~s)~s"~s~s~s ~s~s}s}s}s}s}s}s}s}s}s}s}s}s}s}s}s}s}s}s}sz}ss}sl}se}s^}sW}sP}sI}sB}s;}s4}s-}s&}s}s}s}s }s}s|s|s|s|s|s|s|s|s|s|s|s|s|s|s|s|s|s|s~|sw|sp|si|sb|s[|sT|sM|sF|s?|s8|s1|s*|s#|s|s|s|s|s|s{s{s{s{s{s{s{s{s{s{s{s{s{s{s{s{s{s{s{{st{sm{sf{s_{sX{sQ{sJ{sC{s<{s5{s.{s'{s {s{s{s {s{szszszszszszszszszszszszszszszszszszszsxzsqzsjzsczs\zsUzsNzsGzs@zs9zs2zs+zs$zszszszszszsysysysysysysysysysysysysysysysysysys|ysuysnysgys`ysYysRysKysDys=ys6ys/ys(ys!ysysys ysysxsxsxsxsxsxsxsxsxsxsxsxsxsxsxsxsxsxsxsyxsrxskxsdxs]xsVxsOxsHxsAxs:xs3xs,xs%xsxsxsxs xsxswswswswswswswswswswswswswswswswswsws}wsvwsowshwsawsZwsSwsLwsEws>ws7ws0ws)ws"wswsws wswsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvszvssvslvsevs^vsWvsPvsIvsBvs;vs4vs-vs&vsvsvsvs vsvsusususususususususususususususususus~uswuspusiusbus[usTusMusFus?us8us1us*us#usususususuststststststststststststststststststs{tsttsmtsfts_tsXtsQtsJtsCtsps7ps0ps)ps"pspsps pspsosososososososososososososososososososzossosloseos^osWosPosIosBos;os4os-os&osososos ososnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsns~nswnspnsinsbns[nsTnsMnsFns?ns8ns1ns*ns#nsnsnsnsnsnsmsmsmsmsmsmsmsmsmsmsmsmsmsmsmsmsmsms{mstmsmmsfms_msXmsQmsJmsCmsis7is0is)is"isisis isishshshshshshshshshshshshshshshshshshshszhsshslhsehs^hsWhsPhsIhsBhs;hs4hs-hs&hshshshs hshsgsgsgsgsgsgsgsgsgsgsgsgsgsgsgsgsgsgs~gswgspgsigsbgs[gsTgsMgsFgs?gs8gs1gs*gs#gsgsgsgsgsgsfsfsfsfsfsfsfsfsfsfsfsfsfsfsfsfsfsfs{fstfsmfsffs_fsXfsQfsJfsCfsbs7bs0bs)bs"bsbsbs bsbsasasasasasasasasasasasasasasasasasasaszassaslaseas^asWasPasIasBas;as4as-as&asasasas asas`s`s`s`s`s`s`s`s`s`s`s`s`s`s`s`s`s`s~`sw`sp`si`sb`s[`sT`sM`sF`s?`s8`s1`s*`s#`s`s`s`s`s`s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s{_st_sm_sf_s__sX_sQ_sJ_sC_s<_s5_s._s'_s _s_s_s _s_s^s^s^s^s^s^s^s^s^s^s^s^s^s^s^s^s^s^s^sx^sq^sj^sc^s\^sU^sN^sG^s@^s9^s2^s+^s$^s^s^s^s^s^s]s]s]s]s]s]s]s]s]s]s]s]s]s]s]s]s]s]s|]su]sn]sg]s`]sY]sR]sK]sD]s=]s6]s/]s(]s!]s]s]s ]s]s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sy\sr\sk\sd\s]\sV\sO\sH\sA\s:\s3\s,\s%\s\s\s\s \s\s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s}[sv[so[sh[sa[sZ[sS[sL[sE[s>[s7[s0[s)[s"[s[s [s[sZsZsZsZsZsZsZsZsZsZsZsZsZsZsZsZsZsZsZszZssZslZseZs^ZsWZsPZsIZsBZs;Zs4Zs-Zs&ZsZsZsZs ZsZsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYs~YswYspYsiYsbYs[YsTYsMYsFYs?Ys8Ys1Ys*Ys#YsYsYsYsYsYsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXs{XstXsmXsfXs_XsXXsQXsJXsCXsTs7Ts0Ts)Ts"TsTsTs TsTsSsSsSsSsSsSsSsSsSsSsSsSsSsSsSsSsSsSsSszSssSslSseSs^SsWSsPSsISsBSs;Ss4Ss-Ss&SsSsSsSs SsSsRsRsRsRsRsRsRsRsRsRsRsRsRsRsRsRsRsRs~RswRspRsiRsbRs[RsTRsMRsFRs?Rs8Rs1Rs*Rs#RsRsRsRsRsRsQsQsQsQsQsQsQsQsQsQsQsQsQsQsQsQsQsQs{QstQsmQsfQs_QsXQsQQsJQsCQsMs7Ms0Ms)Ms"MsMsMs MsMsLsLsLsLsLsLsLsLsLsLsLsLsLsLsLsLsLsLsLszLssLslLseLs^LsWLsPLsILsBLs;Ls4Ls-Ls&LsLsLsLs LsLsKsKsKsKsKsKsKsKsKsKsKsKsKsKsKsKsKsKs~KswKspKsiKsbKs[KsTKsMKsFKs?Ks8Ks1Ks*Ks#KsKsKsKsKsKsJsJsJsJsJsJsJsJsJsJsJsJsJsJsJsJsJsJs{JstJsmJsfJs_JsXJsQJsJJsCJsFs7Fs0Fs)Fs"FsFsFs FsFsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEszEssEslEseEs^EsWEsPEsIEsBEs;Es4Es-Es&EsEsEsEs EsEsDsDsDsDsDsDsDsDsDsDsDsDsDsDsDsDsDsDs~DswDspDsiDsbDs[DsTDsMDsFDs?Ds8Ds1Ds*Ds#DsDsDsDsDsDsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCs{CstCsmCsfCs_CsXCsQCsJCsCCs?s7?s0?s)?s"?s?s?s ?s?s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>sz>ss>sl>se>s^>sW>sP>sI>sB>s;>s4>s->s&>s>s>s>s >s>s=s=s=s=s=s=s=s=s=s=s=s=s=s=s=s=s=s=s~=sw=sp=si=sb=s[=sT=sM=sF=s?=s8=s1=s*=s#=s=s=s=s=s=s8s78s08s)8s"8s8s8s 8s8s7s7s7s7s7s7s7s7s7s7s7s7s7s7s7s7s7s7s7sz7ss7sl7se7s^7sW7sP7sI7sB7s;7s47s-7s&7s7s7s7s 7s7s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s~6sw6sp6si6sb6s[6sT6sM6sF6s?6s86s16s*6s#6s6s6s6s6s6s5s5s5s5s5s5s5s5s5s5s5s5s5s5s5s5s5s5s{5st5sm5sf5s_5sX5sQ5sJ5sC5s<5s55s.5s'5s 5s5s5s 5s5s4s4s4s4s4s4s4s4s4s4s4s4s4s4s4s4s4s4s4sx4sq4sj4sc4s\4sU4sN4sG4s@4s94s24s+4s$4s4s4s4s4s4s3s3s3s3s3s3s3s3s3s3s3s3s3s3s3s3s3s3s|3su3sn3sg3s`3sY3sR3sK3sD3s=3s63s/3s(3s!3s3s3s 3s3s2s2s2s2s2s2s2s2s2s2s2s2s2s2s2s2s2s2s2sy2sr2sk2sd2s]2sV2sO2sH2sA2s:2s32s,2s%2s2s2s2s 2s2s1s1s1s1s1s1s1s1s1s1s1s1s1s1s1s1s1s1s}1sv1so1sh1sa1sZ1sS1sL1sE1s>1s71s01s)1s"1s1s1s 1s1s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0s0sz0ss0sl0se0s^0sW0sP0sI0sB0s;0s40s-0s&0s0s0s0s 0s0s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s~/sw/sp/si/sb/s[/sT/sM/sF/s?/s8/s1/s*/s#/s/s/s/s/s/s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s{.st.sm.sf.s_.sX.sQ.sJ.sC.s<.s5.s..s'.s .s.s.s .s.s-s-s-s-s-s-s-s-s-s-s-s-s-s-s-s-s-s-s-sx-sq-sj-sc-s\-sU-sN-sG-s@-s9-s2-s+-s$-s-s-s-s-s-s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s|,su,sn,sg,s`,sY,sR,sK,sD,s=,s6,s/,s(,s!,s,s,s ,s,s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+sy+sr+sk+sd+s]+sV+sO+sH+sA+s:+s3+s,+s%+s+s+s+s +s+s*s*s*s*s*s*s*s*s*s*s*s*s*s*s*s*s*s*s}*sv*so*sh*sa*sZ*sS*sL*sE*s>*s7*s0*s)*s"*s*s*s *s*s)s)s)s)s)s)s)s)s)s)s)s)s)s)s)s)s)s)s)sz)ss)sl)se)s^)sW)sP)sI)sB)s;)s4)s-)s&)s)s)s)s )s)s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s~(sw(sp(si(sb(s[(sT(sM(sF(s?(s8(s1(s*(s#(s(s(s(s(s(s's's's's's's's's's's's's's's's's's's{'st'sm'sf's_'sX'sQ'sJ'sC's<'s5's.'s''s 's's's 's's&s&s&s&s&s&s&s&s&s&s&s&s&s&s&s&s&s&s&sx&sq&sj&sc&s\&sU&sN&sG&s@&s9&s2&s+&s$&s&s&s&s&s&s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s|%su%sn%sg%s`%sY%sR%sK%sD%s=%s6%s/%s(%s!%s%s%s %s%s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$sy$sr$sk$sd$s]$sV$sO$sH$sA$s:$s3$s,$s%$s$s$s$s $s$s#s#s#s#s#s#s#s#s#s#s#s#s#s#s#s#s#s#s}#sv#so#sh#sa#sZ#sS#sL#sE#s>#s7#s0#s)#s"#s#s#s #s#s"s"s"s"s"s"s"s"s"s"s"s"s"s"s"s"s"s"s"sz"ss"sl"se"s^"sW"sP"sI"sB"s;"s4"s-"s&"s"s"s"s "s"s!s!s!s!s!s!s!s!s!s!s!s!s!s!s!s!s!s!s~!sw!sp!si!sb!s[!sT!sM!sF!s?!s8!s1!s*!s#!s!s!s!s!s!s s s s s s s s s s s s s s s s s s s{ st sm sf s_ sX sQ sJ sC s< s5 s. s' s s s s s ssssssssssssssssssssxsqsjscs\sUsNsGs@s9s2s+s$ssssssssssssssssssssssss|susnsgs`sYsRsKsDs=s6s/s(s!sss sssssssssssssssssssssysrsksds]sVsOsHsAs:s3s,s%ssss ssssssssssssssssssss}svsoshsasZsSsLsEs>s7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCs<s5s.s's sss sssssssssssssssssssssxsqsjscs\sUsNsGs@s9s2s+s$ssssssssssssssssssssssss|susnsgs`sYsRsKsDs=s6s/s(s!sss sssssssssssssssssssssysrsksds]sVsOsHsAs:s3s,s%ssss ssssssssssssssssssss}svsoshsasZsSsLsEs>s7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCs<s5s.s's sss sssssssssssssssssssssxsqsjscs\sUsNsGs@s9s2s+s$ssssssssssssssssssssssss|susnsgs`sYsRsKsDs=s6s/s(s!sss sssssssssssssssssssssysrsksds]sVsOsHsAs:s3s,s%ssss ssssssssssssssssssss}svsoshsasZsSsLsEs>s7s0s)s"sss ss s s s s s s s s s s s s s s s s s s sz ss sl se s^ sW sP sI sB s; s4 s- s& s s s s s s s s s s s s s s s s s s s s s s s s~ sw sp si sb s[ sT sM sF s? s8 s1 s* s# s s s s s s s s s s s s s s s s s s s s s s s s{ st sm sf s_ sX sQ sJ sC s< s5 s. s' s s s s s s s s s s s s s s s s s s s s s s s s sx sq sj sc s\ sU sN sG s@ s9 s2 s+ s$ s s s s s s s s s s s s s s s s s s s s s s s s| su sn sg s` sY sR sK sD s= s6 s/ s( s! s s s s ssssssssssssssssssssysrsksds]sVsOsHsAs:s3s,s%ssss ssssssssssssssssssss}svsoshsasZsSsLsEs>s7s0s)s"sss ssssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssssssssssssssssssss{stsmsfs_sXsQsJsCs<s5s.s's sss sssssssssssssssssssssxsqsjscs\sUsNsGs@s9s2s+s$ssssssssssssssssssssssss|susnsgs`sYsRsKsDs=s6s/s(s!sss sssssssssssssssssssssysrsksds]sVsOsHsAs:s3s,s%ssss ssssssssssssssssssss}svsoshsasZsSsLsEs>s7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrٿrҿr˿rĿrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrݾr־rϾrȾrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrܹrչrιrǹrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrٸrҸr˸rĸrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrݷrַrϷrȷrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrܲrղrβrDzrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrٱrұr˱rırrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrݰrְrϰrȰrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrܫrիrΫrǫrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrr٪rҪr˪rĪrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrݩr֩rϩrȩrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrܤrդrΤrǤrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrr٣rңrˣrģrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrݢr֢rϢrȢrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrܝr՝rΝrǝrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrٜrҜr˜rĜrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrݛr֛rϛrțrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrrܖrՖrΖrǖrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrٕrҕr˕rĕrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrݔr֔rϔrȔrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrr܏rՏrΏrǏrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrَrҎrˎrĎrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrݍr֍rύrȍrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrr܈rՈrΈrLjrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrهr҇rˇrćrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrr݆rֆrφrȆrrrrrrrrrrr{rtrmrfr_rXrQrJrCrr7r0r)r"rrr rrrrrrr܁rՁr΁rǁrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrـrҀrˀrĀrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rr~r~r~r~r~r~r~r~r~r~r~r~r~r~r~r~r~r~r~rx~rq~rj~rc~r\~rU~rN~rG~r@~r9~r2~r+~r$~r~r~r~r~r~r}r}r}r}r}r}r}r}r}r}r}r}r}r}r}r}r}r}r|}ru}rn}rg}r`}rY}rR}rK}rD}r=}r6}r/}r(}r!}r}r}r }r}r|r|r|r|r|r|r|r|r|r|r|r|r|r|r|r|r|r|r|ry|rr|rk|rd|r]|rV|rO|rH|rA|r:|r3|r,|r%|r|r|r|r |r|r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r}{rv{ro{rh{ra{rZ{rS{rL{rE{r>{r7{r0{r){r"{r{r{r {r{rzrzrzrzrzrzrzrzrzrzrzrzrzrzrzrzrzrzrzrzzrszrlzrezr^zrWzrPzrIzrBzr;zr4zr-zr&zrzrzrzr zrzryryryryryryryryryryryryryryryryryryr~yrwyrpyriyrbyr[yrTyrMyrFyr?yr8yr1yr*yr#yryryryryryrxrxrxrxrxrxrxrxrxrxrxrxrxrxrxrxrxrxr{xrtxrmxrfxr_xrXxrQxrJxrCxrtr7tr0tr)tr"trtrtr trtrsrsrsrsrsrsrsrsrsrsrsrsrsrsrsrsrsrsrsrzsrssrlsresr^srWsrPsrIsrBsr;sr4sr-sr&srsrsrsr srsrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr~rrwrrprrirrbrr[rrTrrMrrFrr?rr8rr1rr*rr#rrrrrrrrrrrrqrqrqrqrqrqrqrqrqrqrqrqrqrqrqrqrqrqr{qrtqrmqrfqr_qrXqrQqrJqrCqrmr7mr0mr)mr"mrmrmr mrmrlrlrlrlrlrlrlrlrlrlrlrlrlrlrlrlrlrlrlrzlrslrllrelr^lrWlrPlrIlrBlr;lr4lr-lr&lrlrlrlr lrlrkrkrkrkrkrkrkrkrkrkrkrkrkrkrkrkrkrkr~krwkrpkrikrbkr[krTkrMkrFkr?kr8kr1kr*kr#krkrkrkrkrkrjrjrjrjrjrjrjrjrjrjrjrjrjrjrjrjrjrjr{jrtjrmjrfjr_jrXjrQjrJjrCjrfr7fr0fr)fr"frfrfr frfrerererererererererererererererererererzerserlereer^erWerPerIerBer;er4er-er&erererer ererdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdr~drwdrpdridrbdr[drTdrMdrFdr?dr8dr1dr*dr#drdrdrdrdrdrcrcrcrcrcrcrcrcrcrcrcrcrcrcrcrcrcrcr{crtcrmcrfcr_crXcrQcrJcrCcr_r7_r0_r)_r"_r_r_r _r_r^r^r^r^r^r^r^r^r^r^r^r^r^r^r^r^r^r^r^rz^rs^rl^re^r^^rW^rP^rI^rB^r;^r4^r-^r&^r^r^r^r ^r^r]r]r]r]r]r]r]r]r]r]r]r]r]r]r]r]r]r]r~]rw]rp]ri]rb]r[]rT]rM]rF]r?]r8]r1]r*]r#]r]r]r]r]r]r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r{\rt\rm\rf\r_\rX\rQ\rJ\rC\r<\r5\r.\r'\r \r\r\r \r\r[r[r[r[r[r[r[r[r[r[r[r[r[r[r[r[r[r[r[rx[rq[rj[rc[r\[rU[rN[rG[r@[r9[r2[r+[r$[r[r[r[r[r[rZrZrZrZrZrZrZrZrZrZrZrZrZrZrZrZrZrZr|ZruZrnZrgZr`ZrYZrRZrKZrDZr=Zr6Zr/Zr(Zr!ZrZrZr ZrZrYrYrYrYrYrYrYrYrYrYrYrYrYrYrYrYrYrYrYryYrrYrkYrdYr]YrVYrOYrHYrAYr:Yr3Yr,Yr%YrYrYrYr YrYrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXr}XrvXroXrhXraXrZXrSXrLXrEXr>Xr7Xr0Xr)Xr"XrXrXr XrXrWrWrWrWrWrWrWrWrWrWrWrWrWrWrWrWrWrWrWrzWrsWrlWreWr^WrWWrPWrIWrBWr;Wr4Wr-Wr&WrWrWrWr WrWrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVr~VrwVrpVriVrbVr[VrTVrMVrFVr?Vr8Vr1Vr*Vr#VrVrVrVrVrVrUrUrUrUrUrUrUrUrUrUrUrUrUrUrUrUrUrUr{UrtUrmUrfUr_UrXUrQUrJUrCUrQr7Qr0Qr)Qr"QrQrQr QrQrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrzPrsPrlPrePr^PrWPrPPrIPrBPr;Pr4Pr-Pr&PrPrPrPr PrPrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOr~OrwOrpOriOrbOr[OrTOrMOrFOr?Or8Or1Or*Or#OrOrOrOrOrOrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNr{NrtNrmNrfNr_NrXNrQNrJNrCNrJr7Jr0Jr)Jr"JrJrJr JrJrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrzIrsIrlIreIr^IrWIrPIrIIrBIr;Ir4Ir-Ir&IrIrIrIr IrIrHrHrHrHrHrHrHrHrHrHrHrHrHrHrHrHrHrHr~HrwHrpHriHrbHr[HrTHrMHrFHr?Hr8Hr1Hr*Hr#HrHrHrHrHrHrGrGrGrGrGrGrGrGrGrGrGrGrGrGrGrGrGrGr{GrtGrmGrfGr_GrXGrQGrJGrCGrCr7Cr0Cr)Cr"CrCrCr CrCrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrzBrsBrlBreBr^BrWBrPBrIBrBBr;Br4Br-Br&BrBrBrBr BrBrArArArArArArArArArArArArArArArArArAr~ArwArpAriArbAr[ArTArMArFAr?Ar8Ar1Ar*Ar#ArArArArArAr@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r{@rt@rm@rf@r_@rX@rQ@rJ@rC@r<@r5@r.@r'@r @r@r@r @r@r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?rx?rq?rj?rc?r\?rU?rN?rG?r@?r9?r2?r+?r$?r?r?r?r?r?r>r>r>r>r>r>r>r>r>r>r>r>r>r>r>r>r>r>r|>ru>rn>rg>r`>rY>rR>rK>rD>r=>r6>r/>r(>r!>r>r>r >r>r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=ry=rr=rk=rd=r]=rV=rO=rH=rA=r:=r3=r,=r%=r=r=r=r =r=r5r75r05r)5r"5r5r5r 5r5r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4rz4rs4rl4re4r^4rW4rP4rI4rB4r;4r44r-4r&4r4r4r4r 4r4r3r3r3r3r3r3r3r3r3r3r3r3r3r3r3r3r3r3r~3rw3rp3ri3rb3r[3rT3rM3rF3r?3r83r13r*3r#3r3r3r3r3r3r2r2r2r2r2r2r2r2r2r2r2r2r2r2r2r2r2r2r{2rt2rm2rf2r_2rX2rQ2rJ2rC2r<2r52r.2r'2r 2r2r2r 2r2r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1rx1rq1rj1rc1r\1rU1rN1rG1r@1r91r21r+1r$1r1r1r1r1r1r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r|0ru0rn0rg0r`0rY0rR0rK0rD0r=0r60r/0r(0r!0r0r0r 0r0r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/ry/rr/rk/rd/r]/rV/rO/rH/rA/r:/r3/r,/r%/r/r/r/r /r/r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r}.rv.ro.rh.ra.rZ.rS.rL.rE.r>.r7.r0.r).r".r.r.r .r.r-r-r-r-r-r-r-r-r-r-r-r-r-r-r-r-r-r-r-rz-rs-rl-re-r^-rW-rP-rI-rB-r;-r4-r--r&-r-r-r-r -r-r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r~,rw,rp,ri,rb,r[,rT,rM,rF,r?,r8,r1,r*,r#,r,r,r,r,r,r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r+r{+rt+rm+rf+r_+rX+rQ+rJ+rC+r<+r5+r.+r'+r +r+r+r +r+r*r*r*r*r*r*r*r*r*r*r*r*r*r*r*r*r*r*r*rx*rq*rj*rc*r\*rU*rN*rG*r@*r9*r2*r+*r$*r*r*r*r*r*r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r|)ru)rn)rg)r`)rY)rR)rK)rD)r=)r6)r/)r()r!)r)r)r )r)r(r(r(r(r(r(r(r(r(r(r(r(r(r(r(r(r(r(r(ry(rr(rk(rd(r](rV(rO(rH(rA(r:(r3(r,(r%(r(r(r(r (r(r'r'r'r'r'r'r'r'r'r'r'r'r'r'r'r'r'r'r}'rv'ro'rh'ra'rZ'rS'rL'rE'r>'r7'r0'r)'r"'r'r'r 'r'r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&rz&rs&rl&re&r^&rW&rP&rI&rB&r;&r4&r-&r&&r&r&r&r &r&r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r~%rw%rp%ri%rb%r[%rT%rM%rF%r?%r8%r1%r*%r#%r%r%r%r%r%r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r{$rt$rm$rf$r_$rX$rQ$rJ$rC$r<$r5$r.$r'$r $r$r$r $r$r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#rx#rq#rj#rc#r\#rU#rN#rG#r@#r9#r2#r+#r$#r#r#r#r#r#r"r"r"r"r"r"r"r"r"r"r"r"r"r"r"r"r"r"r|"ru"rn"rg"r`"rY"rR"rK"rD"r="r6"r/"r("r!"r"r"r "r"r!r!r!r!r!r!r!r!r!r!r!r!r!r!r!r!r!r!r!ry!rr!rk!rd!r]!rV!rO!rH!rA!r:!r3!r,!r%!r!r!r!r !r!r r r r r r r r r r r r r r r r r r r} rv ro rh ra rZ rS rL rE r> r7 r0 r) r" r r r r rrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrrrrrrrrrrrrrrrrrrrrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrrrrrrrrrrrrrrrrrrrr|rurnrgr`rYrRrKrDr=r6r/r(r!rrr rrrrrrrrrrrrrrrrrrrrryrrrkrdr]rVrOrHrAr:r3r,r%rrrr rrrrrrrrrrrrrrrrrrrr}rvrorhrarZrSrLrEr>r7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrrrrrrrrrrrrrrrrrrrrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrrrrrrrrrrrrrrrrrrrr|rurnrgr`rYrRrKrDr=r6r/r(r!rrr rrrrrrrrrrrrrrrrrrrrryrrrkrdr]rVrOrHrAr:r3r,r%rrrr rrrrrrrrrrrrrrrrrrrr}rvrorhrarZrSrLrEr>r7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrrrrrrrrrrrrrrrrrrrrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrr r r r r r r r r r r r r r r r r r r| ru rn rg r` rY rR rK rD r= r6 r/ r( r! r r r r r r r r r r r r r r r r r r r r r r r ry rr rk rd r] rV rO rH rA r: r3 r, r% r r r r r r r r r r r r r r r r r r r r r r r r} rv ro rh ra rZ rS rL rE r> r7 r0 r) r" r r r r r r r r r r r r r r r r r r r r r r r rz rs rl re r^ rW rP rI rB r; r4 r- r& r r r r r r r r r r r r r r r r r r r r r r r r~ rw rp ri rb r[ rT rM rF r? r8 r1 r* r# r r r r r rrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrrrrrrrrrrrrrrrrrrrrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrrrrrrrrrrrrrrrrrrrr|rurnrgr`rYrRrKrDr=r6r/r(r!rrr rrrrrrrrrrrrrrrrrrrrryrrrkrdr]rVrOrHrAr:r3r,r%rrrr rrrrrrrrrrrrrrrrrrrr}rvrorhrarZrSrLrEr>r7r0r)r"rrr rrrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrrrrrrrrrrrrrrrrrrrrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrrqqqqqqqqqqqqqqqqqq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqqqqqqqqqqqqqqqqqqqqyqrqkqdq]qVqOqHqAq:q3q,q%qqqq qqqqqqqqqqqqqqqqqqqq}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqܽqսqνqǽqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqټqҼq˼qļqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqݻqֻqϻqȻqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqܶqնqζqǶqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqٵqҵq˵qĵqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqݴqִqϴqȴqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqܯqկqίqǯqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqٮqҮqˮqĮqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqݭq֭qϭqȭqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqܨqըqΨqǨqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqq٧qҧq˧qħqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqݦq֦qϦqȦqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqܡqաqΡqǡqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqq٠qҠqˠqĠqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqݟq֟qϟqȟqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqܚq՚qΚqǚqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqٙqҙq˙qęqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqݘq֘qϘqȘqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqqܓqՓqΓqǓqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqْqҒq˒qĒqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqݑq֑qϑqȑqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqq܌qՌqΌqnjqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqًqҋqˋqċqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqq݊q֊qϊqȊqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qqqqqqq܅qՅq΅qDžqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqلq҄q˄qĄqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqq݃qփqσqȃqqqqqqqqqqq{qtqmqfq_qXqQqJqCqq7q0q)q"qqq qq~q~q~q~q~q~q~q~q~q~q~q~q~q~q~q~q~q~q~qz~qs~ql~qe~q^~qW~qP~qI~qB~q;~q4~q-~q&~q~q~q~q ~q~q}q}q}q}q}q}q}q}q}q}q}q}q}q}q}q}q}q}q~}qw}qp}qi}qb}q[}qT}qM}qF}q?}q8}q1}q*}q#}q}q}q}q}q}q|q|q|q|q|q|q|q|q|q|q|q|q|q|q|q|q|q|q{|qt|qm|qf|q_|qX|qQ|qJ|qC|q<|q5|q.|q'|q |q|q|q |q|q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{qx{qq{qj{qc{q\{qU{qN{qG{q@{q9{q2{q+{q${q{q{q{q{q{qzqzqzqzqzqzqzqzqzqzqzqzqzqzqzqzqzqzq|zquzqnzqgzq`zqYzqRzqKzqDzq=zq6zq/zq(zq!zqzqzq zqzqyqyqyqyqyqyqyqyqyqyqyqyqyqyqyqyqyqyqyqyyqryqkyqdyq]yqVyqOyqHyqAyq:yq3yq,yq%yqyqyqyq yqyqxqxqxqxqxqxqxqxqxqxqxqxqxqxqxqxqxqxq}xqvxqoxqhxqaxqZxqSxqLxqExq>xq7xq0xq)xq"xqxqxq xqxqwqwqwqwqwqwqwqwqwqwqwqwqwqwqwqwqwqwqwqzwqswqlwqewq^wqWwqPwqIwqBwq;wq4wq-wq&wqwqwqwq wqwqvqvqvqvqvqvqvqvqvqvqvqvqvqvqvqvqvqvq~vqwvqpvqivqbvq[vqTvqMvqFvq?vq8vq1vq*vq#vqvqvqvqvqvququququququququququququququququququq{uqtuqmuqfuq_uqXuqQuqJuqCuqqq7qq0qq)qq"qqqqqq qqqqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqzpqspqlpqepq^pqWpqPpqIpqBpq;pq4pq-pq&pqpqpqpq pqpqoqoqoqoqoqoqoqoqoqoqoqoqoqoqoqoqoqoq~oqwoqpoqioqboq[oqToqMoqFoq?oq8oq1oq*oq#oqoqoqoqoqoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnq{nqtnqmnqfnq_nqXnqQnqJnqCnqjq7jq0jq)jq"jqjqjq jqjqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqiqziqsiqliqeiq^iqWiqPiqIiqBiq;iq4iq-iq&iqiqiqiq iqiqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhq~hqwhqphqihqbhq[hqThqMhqFhq?hq8hq1hq*hq#hqhqhqhqhqhqgqgqgqgqgqgqgqgqgqgqgqgqgqgqgqgqgqgq{gqtgqmgqfgq_gqXgqQgqJgqCgqcq7cq0cq)cq"cqcqcq cqcqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqzbqsbqlbqebq^bqWbqPbqIbqBbq;bq4bq-bq&bqbqbqbq bqbqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaq~aqwaqpaqiaqbaq[aqTaqMaqFaq?aq8aq1aq*aq#aqaqaqaqaqaq`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q{`qt`qm`qf`q_`qX`qQ`qJ`qC`q<`q5`q.`q'`q `q`q`q `q`q_q_q_q_q_q_q_q_q_q_q_q_q_q_q_q_q_q_q_qx_qq_qj_qc_q\_qU_qN_qG_q@_q9_q2_q+_q$_q_q_q_q_q_q^q^q^q^q^q^q^q^q^q^q^q^q^q^q^q^q^q^q|^qu^qn^qg^q`^qY^qR^qK^qD^q=^q6^q/^q(^q!^q^q^q ^q^q]q]q]q]q]q]q]q]q]q]q]q]q]q]q]q]q]q]q]qy]qr]qk]qd]q]]qV]qO]qH]qA]q:]q3]q,]q%]q]q]q]q ]q]q\q\q\q\q\q\q\q\q\q\q\q\q\q\q\q\q\q\q}\qv\qo\qh\qa\qZ\qS\qL\qE\q>\q7\q0\q)\q"\q\q\q \q\q[q[q[q[q[q[q[q[q[q[q[q[q[q[q[q[q[q[q[qz[qs[ql[qe[q^[qW[qP[qI[qB[q;[q4[q-[q&[q[q[q[q [q[qZqZqZqZqZqZqZqZqZqZqZqZqZqZqZqZqZqZq~ZqwZqpZqiZqbZq[ZqTZqMZqFZq?Zq8Zq1Zq*Zq#ZqZqZqZqZqZqYqYqYqYqYqYqYqYqYqYqYqYqYqYqYqYqYqYq{YqtYqmYqfYq_YqXYqQYqJYqCYqUq7Uq0Uq)Uq"UqUqUq UqUqTqTqTqTqTqTqTqTqTqTqTqTqTqTqTqTqTqTqTqzTqsTqlTqeTq^TqWTqPTqITqBTq;Tq4Tq-Tq&TqTqTqTq TqTqSqSqSqSqSqSqSqSqSqSqSqSqSqSqSqSqSqSq~SqwSqpSqiSqbSq[SqTSqMSqFSq?Sq8Sq1Sq*Sq#SqSqSqSqSqSqRqRqRqRqRqRqRqRqRqRqRqRqRqRqRqRqRqRq{RqtRqmRqfRq_RqXRqQRqJRqCRqNq7Nq0Nq)Nq"NqNqNq NqNqMqMqMqMqMqMqMqMqMqMqMqMqMqMqMqMqMqMqMqzMqsMqlMqeMq^MqWMqPMqIMqBMq;Mq4Mq-Mq&MqMqMqMq MqMqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLq~LqwLqpLqiLqbLq[LqTLqMLqFLq?Lq8Lq1Lq*Lq#LqLqLqLqLqLqKqKqKqKqKqKqKqKqKqKqKqKqKqKqKqKqKqKq{KqtKqmKqfKq_KqXKqQKqJKqCKqGq7Gq0Gq)Gq"GqGqGq GqGqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqzFqsFqlFqeFq^FqWFqPFqIFqBFq;Fq4Fq-Fq&FqFqFqFq FqFqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEq~EqwEqpEqiEqbEq[EqTEqMEqFEq?Eq8Eq1Eq*Eq#EqEqEqEqEqEqDqDqDqDqDqDqDqDqDqDqDqDqDqDqDqDqDqDq{DqtDqmDqfDq_DqXDqQDqJDqCDq@q7@q0@q)@q"@q@q@q @q@q?q?q?q?q?q?q?q?q?q?q?q?q?q?q?q?q?q?q?qz?qs?ql?qe?q^?qW?qP?qI?qB?q;?q4?q-?q&?q?q?q?q ?q?q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q~>qw>qp>qi>qb>q[>qT>qM>qF>q?>q8>q1>q*>q#>q>q>q>q>q>q=q=q=q=q=q=q=q=q=q=q=q=q=q=q=q=q=q=q{=qt=qm=qf=q_=qX=qQ=qJ=qC=q<=q5=q.=q'=q =q=q=q =q=q9q79q09q)9q"9q9q9q 9q9q8q8q8q8q8q8q8q8q8q8q8q8q8q8q8q8q8q8q8qz8qs8ql8qe8q^8qW8qP8qI8qB8q;8q48q-8q&8q8q8q8q 8q8q7q7q7q7q7q7q7q7q7q7q7q7q7q7q7q7q7q7q~7qw7qp7qi7qb7q[7qT7qM7qF7q?7q87q17q*7q#7q7q7q7q7q7q6q6q6q6q6q6q6q6q6q6q6q6q6q6q6q6q6q6q{6qt6qm6qf6q_6qX6qQ6qJ6qC6q<6q56q.6q'6q 6q6q6q 6q6q5q5q5q5q5q5q5q5q5q5q5q5q5q5q5q5q5q5q5qx5qq5qj5qc5q\5qU5qN5qG5q@5q95q25q+5q$5q5q5q5q5q5q4q4q4q4q4q4q4q4q4q4q4q4q4q4q4q4q4q4q|4qu4qn4qg4q`4qY4qR4qK4qD4q=4q64q/4q(4q!4q4q4q 4q4q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3qy3qr3qk3qd3q]3qV3qO3qH3qA3q:3q33q,3q%3q3q3q3q 3q3q2q2q2q2q2q2q2q2q2q2q2q2q2q2q2q2q2q2q}2qv2qo2qh2qa2qZ2qS2qL2qE2q>2q72q02q)2q"2q2q2q 2q2q1q1q1q1q1q1q1q1q1q1q1q1q1q1q1q1q1q1q1qz1qs1ql1qe1q^1qW1qP1qI1qB1q;1q41q-1q&1q1q1q1q 1q1q0q0q0q0q0q0q0q0q0q0q0q0q0q0q0q0q0q0q~0qw0qp0qi0qb0q[0qT0qM0qF0q?0q80q10q*0q#0q0q0q0q0q0q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q{/qt/qm/qf/q_/qX/qQ/qJ/qC/q+q7+q0+q)+q"+q+q+q +q+q*q*q*q*q*q*q*q*q*q*q*q*q*q*q*q*q*q*q*qz*qs*ql*qe*q^*qW*qP*qI*qB*q;*q4*q-*q&*q*q*q*q *q*q)q)q)q)q)q)q)q)q)q)q)q)q)q)q)q)q)q)q~)qw)qp)qi)qb)q[)qT)qM)qF)q?)q8)q1)q*)q#)q)q)q)q)q)q(q(q(q(q(q(q(q(q(q(q(q(q(q(q(q(q(q(q{(qt(qm(qf(q_(qX(qQ(qJ(qC(q<(q5(q.(q'(q (q(q(q (q(q'q'q'q'q'q'q'q'q'q'q'q'q'q'q'q'q'q'q'qx'qq'qj'qc'q\'qU'qN'qG'q@'q9'q2'q+'q$'q'q'q'q'q'q&q&q&q&q&q&q&q&q&q&q&q&q&q&q&q&q&q&q|&qu&qn&qg&q`&qY&qR&qK&qD&q=&q6&q/&q(&q!&q&q&q &q&q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%qy%qr%qk%qd%q]%qV%qO%qH%qA%q:%q3%q,%q%%q%q%q%q %q%q$q$q$q$q$q$q$q$q$q$q$q$q$q$q$q$q$q$q}$qv$qo$qh$qa$qZ$qS$qL$qE$q>$q7$q0$q)$q"$q$q$q $q$q#q#q#q#q#q#q#q#q#q#q#q#q#q#q#q#q#q#q#qz#qs#ql#qe#q^#qW#qP#qI#qB#q;#q4#q-#q&#q#q#q#q #q#q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q~"qw"qp"qi"qb"q["qT"qM"qF"q?"q8"q1"q*"q#"q"q"q"q"q"q!q!q!q!q!q!q!q!q!q!q!q!q!q!q!q!q!q!q{!qt!qm!qf!q_!qX!qQ!qJ!qC!qq7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCq<q5q.q'q qqq qqqqqqqqqqqqqqqqqqqqqxqqqjqcq\qUqNqGq@q9q2q+q$qqqqqqqqqqqqqqqqqqqqqqqq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqqqqqqqqqqqqqqqqqqqqyqrqkqdq]qVqOqHqAq:q3q,q%qqqq qqqqqqqqqqqqqqqqqqqq}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCq<q5q.q'q qqq qqqqqqqqqqqqqqqqqqqqqxqqqjqcq\qUqNqGq@q9q2q+q$qqqqqqqqqqqqqqqqqqqqqqqq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqqqqqqqqqqqqqqqqqqqqyqrqkqdq]qVqOqHqAq:q3q,q%qqqq qqqqqqqqqqqqqqqqqqqq}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qq q q q q q q q q q q q q q q q q q q~ qw qp qi qb q[ qT qM qF q? q8 q1 q* q# q q q q q q q q q q q q q q q q q q q q q q q q{ qt qm qf q_ qX qQ qJ qC q< q5 q. q' q q q q q q q q q q q q q q q q q q q q q q q q qx qq qj qc q\ qU qN qG q@ q9 q2 q+ q$ q q q q q q q q q q q q q q q q q q q q q q q q| qu qn qg q` qY qR qK qD q= q6 q/ q( q! q q q q q q q q q q q q q q q q q q q q q q q qy qr qk qd q] qV qO qH qA q: q3 q, q% q q q q q qqqqqqqqqqqqqqqqqqq}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCq<q5q.q'q qqq qqqqqqqqqqqqqqqqqqqqqxqqqjqcq\qUqNqGq@q9q2q+q$qqqqqqqqqqqqqqqqqqqqqqqq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqqqqqqqqqqqqqqqqqqqqyqrqkqdq]qVqOqHqAq:q3q,q%qqqq qqqqqqqqqqqqqqqqqqqq}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppppppݿpֿpϿpȿppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppܺpպpκpǺpppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppٹpҹp˹pĹpppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppppppݸpָpϸpȸppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppܳpճpγpdzpppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppٲpҲp˲pIJpppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppppppݱpֱpϱpȱppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppܬpլpάpǬpppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppppppp٫pҫp˫pīpppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppppppݪp֪pϪpȪppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppܥpեpΥpǥpppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppppppp٤pҤpˤpĤpppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppppppݣp֣pϣpȣppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppܞp՞pΞpǞpppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppٝpҝp˝pĝpppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppppppݜp֜pϜpȜppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppܗp՗pΗpǗpppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppٖpҖp˖pĖpppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppppppݕp֕pϕpȕppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp pppppppܐpՐpΐpǐpppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppُpҏpˏpďpppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppppppݎp֎pώpȎppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp ppppppp܉pՉpΉpljpppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppوp҈pˈpĈpppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppp݇pևpχpȇppppppppppp{ptpmpfp_pXpQpJpCpp7p0p)p"ppp ppppppp܂pՂp΂pǂpppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppفpҁpˁpāpppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppp݀pրpπpȀppppppppppp{ptpmpfp_pXpQpJpCp|p7|p0|p)|p"|p|p|p |p|p{p{p{p{p{p{p{p{p{p{p{p{p{p{p{p{p{p{p{pz{ps{pl{pe{p^{pW{pP{pI{pB{p;{p4{p-{p&{p{p{p{p {p{pzpzpzpzpzpzpzpzpzpzpzpzpzpzpzpzpzpzp~zpwzppzpizpbzp[zpTzpMzpFzp?zp8zp1zp*zp#zpzpzpzpzpzpypypypypypypypypypypypypypypypypypyp{yptypmypfyp_ypXypQypJypCypup7up0up)up"upupup upuptptptptptptptptptptptptptptptptptptptpztpstpltpetp^tpWtpPtpItpBtp;tp4tp-tp&tptptptp tptpspspspspspspspspspspspspspspspspspsp~spwsppspispbsp[spTspMspFsp?sp8sp1sp*sp#spspspspspsprprprprprprprprprprprprprprprprprprp{rptrpmrpfrp_rpXrpQrpJrpCrpnp7np0np)np"npnpnp npnpmpmpmpmpmpmpmpmpmpmpmpmpmpmpmpmpmpmpmpzmpsmplmpemp^mpWmpPmpImpBmp;mp4mp-mp&mpmpmpmp mpmplplplplplplplplplplplplplplplplplplp~lpwlpplpilpblp[lpTlpMlpFlp?lp8lp1lp*lp#lplplplplplpkpkpkpkpkpkpkpkpkpkpkpkpkpkpkpkpkpkp{kptkpmkpfkp_kpXkpQkpJkpCkpgp7gp0gp)gp"gpgpgp gpgpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpzfpsfplfpefp^fpWfpPfpIfpBfp;fp4fp-fp&fpfpfpfp fpfpepepepepepepepepepepepepepepepepepep~epweppepiepbep[epTepMepFep?ep8ep1ep*ep#epepepepepepdpdpdpdpdpdpdpdpdpdpdpdpdpdpdpdpdpdp{dptdpmdpfdp_dpXdpQdpJdpCdp`p7`p0`p)`p"`p`p`p `p`p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pz_ps_pl_pe_p^_pW_pP_pI_pB_p;_p4_p-_p&_p_p_p_p _p_p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p~^pw^pp^pi^pb^p[^pT^pM^pF^p?^p8^p1^p*^p#^p^p^p^p^p^p]p]p]p]p]p]p]p]p]p]p]p]p]p]p]p]p]p]p{]pt]pm]pf]p_]pX]pQ]pJ]pC]p<]p5]p.]p']p ]p]p]p ]p]p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\px\pq\pj\pc\p\\pU\pN\pG\p@\p9\p2\p+\p$\p\p\p\p\p\p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p|[pu[pn[pg[p`[pY[pR[pK[pD[p=[p6[p/[p([p![p[p[p [p[pZpZpZpZpZpZpZpZpZpZpZpZpZpZpZpZpZpZpZpyZprZpkZpdZp]ZpVZpOZpHZpAZp:Zp3Zp,Zp%ZpZpZpZp ZpZpYpYpYpYpYpYpYpYpYpYpYpYpYpYpYpYpYpYp}YpvYpoYphYpaYpZYpSYpLYpEYp>Yp7Yp0Yp)Yp"YpYpYp YpYpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpzXpsXplXpeXp^XpWXpPXpIXpBXp;Xp4Xp-Xp&XpXpXpXp XpXpWpWpWpWpWpWpWpWpWpWpWpWpWpWpWpWpWpWp~WpwWppWpiWpbWp[WpTWpMWpFWp?Wp8Wp1Wp*Wp#WpWpWpWpWpWpVpVpVpVpVpVpVpVpVpVpVpVpVpVpVpVpVpVp{VptVpmVpfVp_VpXVpQVpJVpCVpRp7Rp0Rp)Rp"RpRpRp RpRpQpQpQpQpQpQpQpQpQpQpQpQpQpQpQpQpQpQpQpzQpsQplQpeQp^QpWQpPQpIQpBQp;Qp4Qp-Qp&QpQpQpQp QpQpPpPpPpPpPpPpPpPpPpPpPpPpPpPpPpPpPpPp~PpwPppPpiPpbPp[PpTPpMPpFPp?Pp8Pp1Pp*Pp#PpPpPpPpPpPpOpOpOpOpOpOpOpOpOpOpOpOpOpOpOpOpOpOp{OptOpmOpfOp_OpXOpQOpJOpCOpKp7Kp0Kp)Kp"KpKpKp KpKpJpJpJpJpJpJpJpJpJpJpJpJpJpJpJpJpJpJpJpzJpsJplJpeJp^JpWJpPJpIJpBJp;Jp4Jp-Jp&JpJpJpJp JpJpIpIpIpIpIpIpIpIpIpIpIpIpIpIpIpIpIpIp~IpwIppIpiIpbIp[IpTIpMIpFIp?Ip8Ip1Ip*Ip#IpIpIpIpIpIpHpHpHpHpHpHpHpHpHpHpHpHpHpHpHpHpHpHp{HptHpmHpfHp_HpXHpQHpJHpCHpDp7Dp0Dp)Dp"DpDpDp DpDpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpzCpsCplCpeCp^CpWCpPCpICpBCp;Cp4Cp-Cp&CpCpCpCp CpCpBpBpBpBpBpBpBpBpBpBpBpBpBpBpBpBpBpBp~BpwBppBpiBpbBp[BpTBpMBpFBp?Bp8Bp1Bp*Bp#BpBpBpBpBpBpApApApApApApApApApApApApApApApApApAp{AptApmApfAp_ApXApQApJApCApp>p>p>p>p>p>p>p>p>p>p>p>p>p>p>p>p>p>py>pr>pk>pd>p]>pV>pO>pH>pA>p:>p3>p,>p%>p>p>p>p >p>p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p=p}=pv=po=ph=pa=pZ=pS=pL=pE=p>=p7=p0=p)=p"=p=p=p =p=p6p76p06p)6p"6p6p6p 6p6p5p5p5p5p5p5p5p5p5p5p5p5p5p5p5p5p5p5p5pz5ps5pl5pe5p^5pW5pP5pI5pB5p;5p45p-5p&5p5p5p5p 5p5p4p4p4p4p4p4p4p4p4p4p4p4p4p4p4p4p4p4p~4pw4pp4pi4pb4p[4pT4pM4pF4p?4p84p14p*4p#4p4p4p4p4p4p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p{3pt3pm3pf3p_3pX3pQ3pJ3pC3p<3p53p.3p'3p 3p3p3p 3p3p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2px2pq2pj2pc2p\2pU2pN2pG2p@2p92p22p+2p$2p2p2p2p2p2p1p1p1p1p1p1p1p1p1p1p1p1p1p1p1p1p1p1p|1pu1pn1pg1p`1pY1pR1pK1pD1p=1p61p/1p(1p!1p1p1p 1p1p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0py0pr0pk0pd0p]0pV0pO0pH0pA0p:0p30p,0p%0p0p0p0p 0p0p/p/p/p/p/p/p/p/p/p/p/p/p/p/p/p/p/p/p}/pv/po/ph/pa/pZ/pS/pL/pE/p>/p7/p0/p)/p"/p/p/p /p/p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.pz.ps.pl.pe.p^.pW.pP.pI.pB.p;.p4.p-.p&.p.p.p.p .p.p-p-p-p-p-p-p-p-p-p-p-p-p-p-p-p-p-p-p~-pw-pp-pi-pb-p[-pT-pM-pF-p?-p8-p1-p*-p#-p-p-p-p-p-p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p{,pt,pm,pf,p_,pX,pQ,pJ,pC,p<,p5,p.,p',p ,p,p,p ,p,p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+px+pq+pj+pc+p\+pU+pN+pG+p@+p9+p2+p++p$+p+p+p+p+p+p*p*p*p*p*p*p*p*p*p*p*p*p*p*p*p*p*p*p|*pu*pn*pg*p`*pY*pR*pK*pD*p=*p6*p/*p(*p!*p*p*p *p*p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)py)pr)pk)pd)p])pV)pO)pH)pA)p:)p3)p,)p%)p)p)p)p )p)p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p}(pv(po(ph(pa(pZ(pS(pL(pE(p>(p7(p0(p)(p"(p(p(p (p(p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'pz'ps'pl'pe'p^'pW'pP'pI'pB'p;'p4'p-'p&'p'p'p'p 'p'p&p&p&p&p&p&p&p&p&p&p&p&p&p&p&p&p&p&p~&pw&pp&pi&pb&p[&pT&pM&pF&p?&p8&p1&p*&p#&p&p&p&p&p&p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p{%pt%pm%pf%p_%pX%pQ%pJ%pC%p<%p5%p.%p'%p %p%p%p %p%p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$px$pq$pj$pc$p\$pU$pN$pG$p@$p9$p2$p+$p$$p$p$p$p$p$p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p|#pu#pn#pg#p`#pY#pR#pK#pD#p=#p6#p/#p(#p!#p#p#p #p#p"p"p"p"p"p"p"p"p"p"p"p"p"p"p"p"p"p"p"py"pr"pk"pd"p]"pV"pO"pH"pA"p:"p3"p,"p%"p"p"p"p "p"p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p}!pv!po!ph!pa!pZ!pS!pL!pE!p>!p7!p0!p)!p"!p!p!p !p!p p p p p p p p p p p p p p p p p p p pz ps pl pe p^ pW pP pI pB p; p4 p- p& p p p p p ppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCp<p5p.p'p ppp pppppppppppppppppppppxpqpjpcp\pUpNpGp@p9p2p+p$pppppppppppppppppppppppp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp pppppppppppppppppppppyprpkpdp]pVpOpHpAp:p3p,p%pppp pppppppppppppppppppp}pvpophpapZpSpLpEp>p7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCp<p5p.p'p ppp pppppppppppppppppppppxpqpjpcp\pUpNpGp@p9p2p+p$pppppppppppppppppppppppp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp pppppppppppppppppppppyprpkpdp]pVpOpHpAp:p3p,p%pppp pppppppppppppppppppp}pvpophpapZpSpLpEp>p7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCp<p5p.p'p ppp pppppppppppppppppppppxpqpjpcp\pUpNpGp@p9p2p+p$pppppppppppppppppppppppp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp pp p p p p p p p p p p p p p p p p p p py pr pk pd p] pV pO pH pA p: p3 p, p% p p p p p p p p p p p p p p p p p p p p p p p p} pv po ph pa pZ pS pL pE p> p7 p0 p) p" p p p p p p p p p p p p p p p p p p p p p p p pz ps pl pe p^ pW pP pI pB p; p4 p- p& p p p p p p p p p p p p p p p p p p p p p p p p~ pw pp pi pb p[ pT pM pF p? p8 p1 p* p# p p p p p p p p p p p p p p p p p p p p p p p p{ pt pm pf p_ pX pQ pJ pC p< p5 p. p' p p p p p ppppppppppppppppppppxpqpjpcp\pUpNpGp@p9p2p+p$pppppppppppppppppppppppp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp pppppppppppppppppppppyprpkpdp]pVpOpHpAp:p3p,p%pppp pppppppppppppppppppp}pvpophpapZpSpLpEp>p7p0p)p"ppp pppppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp pppppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#pppppppppppppppppppppppp{ptpmpfp_pXpQpJpCp<p5p.p'p ppp pppppppppppppppppppppxpqpjpcp\pUpNpGp@p9p2p+p$pppppppppppppppppppppppp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp ppoooooooooooooooooooyorokodo]oVoOoHoAo:o3o,o%oooo oooooooooooooooooooo}ovooohoaoZoSoLoEo>o7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo oooooooܾoվoξoǾooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooٽoҽo˽oĽoooooooooo~owopoiobo[oToMoFo?o8o1o*o#ooooooooooݼoּoϼoȼooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo oooooooܷoշoηoǷooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooٶoҶo˶oĶoooooooooo~owopoiobo[oToMoFo?o8o1o*o#ooooooooooݵoֵoϵoȵooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo oooooooܰoհoΰoǰooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooٯoүo˯oįoooooooooo~owopoiobo[oToMoFo?o8o1o*o#ooooooooooݮo֮oϮoȮooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo oooooooܩoթoΩoǩooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo ooooooo٨oҨo˨oĨoooooooooo~owopoiobo[oToMoFo?o8o1o*o#ooooooooooݧo֧oϧoȧooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo oooooooܢoբo΢oǢooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo ooooooo١oҡoˡoġoooooooooo~owopoiobo[oToMoFo?o8o1o*o#ooooooooooݠo֠oϠoȠooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo oooooooܛo՛oΛoǛooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooٚoҚo˚oĚoooooooooo~owopoiobo[oToMoFo?o8o1o*o#ooooooooooݙo֙oϙoșooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo oooooooܔoՔoΔoǔooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooٓoғo˓oēoooooooooo~owopoiobo[oToMoFo?o8o1o*o#ooooooooooݒo֒oϒoȒooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooo܍oՍo΍oǍooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooٌoҌoˌoČoooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooo݋o֋oϋoȋooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooo܆oՆoΆodžooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooمo҅o˅oąoooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooo݄oքoτoȄooooooooooo{otomofo_oXoQoJoCoo7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oo~o~o~o~o~o~o~o~o~o~o~o~o~o~o~o~o~o~o~~ow~op~oi~ob~o[~oT~oM~oF~o?~o8~o1~o*~o#~o~o~o~o~o~o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o{}ot}om}of}o_}oX}oQ}oJ}oC}o<}o5}o.}o'}o }o}o}o }o}o|o|o|o|o|o|o|o|o|o|o|o|o|o|o|o|o|o|o|ox|oq|oj|oc|o\|oU|oN|oG|o@|o9|o2|o+|o$|o|o|o|o|o|o{o{o{o{o{o{o{o{o{o{o{o{o{o{o{o{o{o{o|{ou{on{og{o`{oY{oR{oK{oD{o={o6{o/{o({o!{o{o{o {o{ozozozozozozozozozozozozozozozozozozozoyzorzokzodzo]zoVzoOzoHzoAzo:zo3zo,zo%zozozozo zozoyoyoyoyoyoyoyoyoyoyoyoyoyoyoyoyoyoyo}yovyooyohyoayoZyoSyoLyoEyo>yo7yo0yo)yo"yoyoyo yoyoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxozxosxolxoexo^xoWxoPxoIxoBxo;xo4xo-xo&xoxoxoxo xoxowowowowowowowowowowowowowowowowowowo~wowwopwoiwobwo[woTwoMwoFwo?wo8wo1wo*wo#wowowowowowovovovovovovovovovovovovovovovovovovo{votvomvofvo_voXvoQvoJvoCvoro7ro0ro)ro"rororo roroqoqoqoqoqoqoqoqoqoqoqoqoqoqoqoqoqoqoqozqosqolqoeqo^qoWqoPqoIqoBqo;qo4qo-qo&qoqoqoqo qoqopopopopopopopopopopopopopopopopopopo~powpoppoipobpo[poTpoMpoFpo?po8po1po*po#popopopopopooooooooooooooooooooooooooooooooooooo{ootoomoofoo_ooXooQooJooCooko7ko0ko)ko"kokoko kokojojojojojojojojojojojojojojojojojojojozjosjoljoejo^joWjoPjoIjoBjo;jo4jo-jo&jojojojo jojoioioioioioioioioioioioioioioioioioio~iowiopioiiobio[ioTioMioFio?io8io1io*io#ioioioioioiohohohohohohohohohohohohohohohohohoho{hothomhofho_hoXhoQhoJhoChodo7do0do)do"dododo dodocococococococococococococococococococozcoscolcoeco^coWcoPcoIcoBco;co4co-co&cocococo cocobobobobobobobobobobobobobobobobobobo~bowbopboibobbo[boTboMboFbo?bo8bo1bo*bo#boboboboboboaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoao{aotaomaofao_aoXaoQaoJaoCao]o7]o0]o)]o"]o]o]o ]o]o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\oz\os\ol\oe\o^\oW\oP\oI\oB\o;\o4\o-\o&\o\o\o\o \o\o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o~[ow[op[oi[ob[o[[oT[oM[oF[o?[o8[o1[o*[o#[o[o[o[o[o[oZoZoZoZoZoZoZoZoZoZoZoZoZoZoZoZoZoZo{ZotZomZofZo_ZoXZoQZoJZoCZoVo7Vo0Vo)Vo"VoVoVo VoVoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUozUosUolUoeUo^UoWUoPUoIUoBUo;Uo4Uo-Uo&UoUoUoUo UoUoToToToToToToToToToToToToToToToToToTo~TowTopToiTobTo[ToTToMToFTo?To8To1To*To#ToToToToToToSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSo{SotSomSofSo_SoXSoQSoJSoCSoOo7Oo0Oo)Oo"OoOoOo OoOoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNozNosNolNoeNo^NoWNoPNoINoBNo;No4No-No&NoNoNoNo NoNoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMo~MowMopMoiMobMo[MoTMoMMoFMo?Mo8Mo1Mo*Mo#MoMoMoMoMoMoLoLoLoLoLoLoLoLoLoLoLoLoLoLoLoLoLoLo{LotLomLofLo_LoXLoQLoJLoCLoHo7Ho0Ho)Ho"HoHoHo HoHoGoGoGoGoGoGoGoGoGoGoGoGoGoGoGoGoGoGoGozGosGolGoeGo^GoWGoPGoIGoBGo;Go4Go-Go&GoGoGoGo GoGoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFo~FowFopFoiFobFo[FoTFoMFoFFo?Fo8Fo1Fo*Fo#FoFoFoFoFoFoEoEoEoEoEoEoEoEoEoEoEoEoEoEoEoEoEoEo{EotEomEofEo_EoXEoQEoJEoCEoAo7Ao0Ao)Ao"AoAoAo AoAo@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@oz@os@ol@oe@o^@oW@oP@oI@oB@o;@o4@o-@o&@o@o@o@o @o@o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o~?ow?op?oi?ob?o[?oT?oM?oF?o??o8?o1?o*?o#?o?o?o?o?o?o>o>o>o>o>o>o>o>o>o>o>o>o>o>o>o>o>o>o{>ot>om>of>o_>oX>oQ>oJ>oC>o<>o5>o.>o'>o >o>o>o >o>o=o=o=o=o=o=o=o=o=o=o=o=o=o=o=o=o=o=o=ox=oq=oj=oc=o\=oU=oN=oG=o@=o9=o2=o+=o$=o=o=o=o=o=o:o7:o0:o):o":o:o:o :o:o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9oz9os9ol9oe9o^9oW9oP9oI9oB9o;9o49o-9o&9o9o9o9o 9o9o8o8o8o8o8o8o8o8o8o8o8o8o8o8o8o8o8o8o~8ow8op8oi8ob8o[8oT8oM8oF8o?8o88o18o*8o#8o8o8o8o8o8o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o{7ot7om7of7o_7oX7oQ7oJ7oC7o<7o57o.7o'7o 7o7o7o 7o7o6o6o6o6o6o6o6o6o6o6o6o6o6o6o6o6o6o6o6ox6oq6oj6oc6o\6oU6oN6oG6o@6o96o26o+6o$6o6o6o6o6o6o5o5o5o5o5o5o5o5o5o5o5o5o5o5o5o5o5o5o|5ou5on5og5o`5oY5oR5oK5oD5o=5o65o/5o(5o!5o5o5o 5o5o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4oy4or4ok4od4o]4oV4oO4oH4oA4o:4o34o,4o%4o4o4o4o 4o4o3o3o3o3o3o3o3o3o3o3o3o3o3o3o3o3o3o3o}3ov3oo3oh3oa3oZ3oS3oL3oE3o>3o73o03o)3o"3o3o3o 3o3o2o2o2o2o2o2o2o2o2o2o2o2o2o2o2o2o2o2o2oz2os2ol2oe2o^2oW2oP2oI2oB2o;2o42o-2o&2o2o2o2o 2o2o1o1o1o1o1o1o1o1o1o1o1o1o1o1o1o1o1o1o~1ow1op1oi1ob1o[1oT1oM1oF1o?1o81o11o*1o#1o1o1o1o1o1o0o0o0o0o0o0o0o0o0o0o0o0o0o0o0o0o0o0o{0ot0om0of0o_0oX0oQ0oJ0oC0o<0o50o.0o'0o 0o0o0o 0o0o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/ox/oq/oj/oc/o\/oU/oN/oG/o@/o9/o2/o+/o$/o/o/o/o/o/o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o|.ou.on.og.o`.oY.oR.oK.oD.o=.o6.o/.o(.o!.o.o.o .o.o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-oy-or-ok-od-o]-oV-oO-oH-oA-o:-o3-o,-o%-o-o-o-o -o-o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o},ov,oo,oh,oa,oZ,oS,oL,oE,o>,o7,o0,o),o",o,o,o ,o,o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+oz+os+ol+oe+o^+oW+oP+oI+oB+o;+o4+o-+o&+o+o+o+o +o+o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o~*ow*op*oi*ob*o[*oT*oM*oF*o?*o8*o1*o**o#*o*o*o*o*o*o)o)o)o)o)o)o)o)o)o)o)o)o)o)o)o)o)o)o{)ot)om)of)o_)oX)oQ)oJ)oC)o<)o5)o.)o')o )o)o)o )o)o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(ox(oq(oj(oc(o\(oU(oN(oG(o@(o9(o2(o+(o$(o(o(o(o(o(o'o'o'o'o'o'o'o'o'o'o'o'o'o'o'o'o'o'o|'ou'on'og'o`'oY'oR'oK'oD'o='o6'o/'o('o!'o'o'o 'o'o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&oy&or&ok&od&o]&oV&oO&oH&oA&o:&o3&o,&o%&o&o&o&o &o&o%o%o%o%o%o%o%o%o%o%o%o%o%o%o%o%o%o%o}%ov%oo%oh%oa%oZ%oS%oL%oE%o>%o7%o0%o)%o"%o%o%o %o%o$o$o$o$o$o$o$o$o$o$o$o$o$o$o$o$o$o$o$oz$os$ol$oe$o^$oW$oP$oI$oB$o;$o4$o-$o&$o$o$o$o $o$o#o#o#o#o#o#o#o#o#o#o#o#o#o#o#o#o#o#o~#ow#op#oi#ob#o[#oT#oM#oF#o?#o8#o1#o*#o##o#o#o#o#o#o"o"o"o"o"o"o"o"o"o"o"o"o"o"o"o"o"o"o{"ot"om"of"o_"oX"oQ"oJ"oC"o<"o5"o."o'"o "o"o"o "o"o!o!o!o!o!o!o!o!o!o!o!o!o!o!o!o!o!o!o!ox!oq!oj!oc!o\!oU!oN!oG!o@!o9!o2!o+!o$!o!o!o!o!o!o o o o o o o o o o o o o o o o o o o| ou on og o` oY oR oK oD o= o6 o/ o( o! o o o o ooooooooooooooooooooyorokodo]oVoOoHoAo:o3o,o%oooo oooooooooooooooooooo}ovooohoaoZoSoLoEo>o7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCo<o5o.o'o ooo oooooooooooooooooooooxoqojoco\oUoNoGo@o9o2o+o$oooooooooooooooooooooooo|ouonogo`oYoRoKoDo=o6o/o(o!ooo oooooooooooooooooooooyorokodo]oVoOoHoAo:o3o,o%oooo oooooooooooooooooooo}ovooohoaoZoSoLoEo>o7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCo<o5o.o'o ooo oooooooooooooooooooooxoqojoco\oUoNoGo@o9o2o+o$oooooooooooooooooooooooo|ouonogo`oYoRoKoDo=o6o/o(o!ooo oooooooooooooooooooooyorokodo]oVoOoHoAo:o3o,o%oooo oooooooooooooooooooo}ovooohoaoZoSoLoEo>o7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooo o o o o o o o o o o o o o o o o o o{ ot om of o_ oX oQ oJ oC o< o5 o. o' o o o o o o o o o o o o o o o o o o o o o o o o ox oq oj oc o\ oU oN oG o@ o9 o2 o+ o$ o o o o o o o o o o o o o o o o o o o o o o o o| ou on og o` oY oR oK oD o= o6 o/ o( o! o o o o o o o o o o o o o o o o o o o o o o o oy or ok od o] oV oO oH oA o: o3 o, o% o o o o o o o o o o o o o o o o o o o o o o o o} ov oo oh oa oZ oS oL oE o> o7 o0 o) o" o o o o oooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooooooooooooooooooooo{otomofo_oXoQoJoCo<o5o.o'o ooo oooooooooooooooooooooxoqojoco\oUoNoGo@o9o2o+o$oooooooooooooooooooooooo|ouonogo`oYoRoKoDo=o6o/o(o!ooo oooooooooooooooooooooyorokodo]oVoOoHoAo:o3o,o%oooo oooooooooooooooooooo}ovooohoaoZoSoLoEo>o7o0o)o"ooo ooooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oooooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnܻnջnλnǻnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnٺnҺn˺nĺnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnݹnֹnϹnȹnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnܴnմnδnǴnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnٳnҳn˳nijnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnݲnֲnϲnȲnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnܭnխnέnǭnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnn٬nҬnˬnĬnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnݫn֫nϫnȫnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnܦnզnΦnǦnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnn٥nҥn˥nĥnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnݤn֤nϤnȤnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnܟn՟nΟnǟnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnٞnҞn˞nĞnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnݝn֝nϝnȝnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnܘn՘nΘnǘnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnٗnҗn˗nėnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnݖn֖nϖnȖnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnnܑnՑnΑnǑnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnِnҐnːnĐnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnݏn֏nϏnȏnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnn܊nՊnΊnNJnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnىn҉nˉnĉnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnn݈nֈnψnȈnnnnnnnnnnn{ntnmnfn_nXnQnJnCnn7n0n)n"nnn nnnnnnn܃nՃn΃nǃnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnقn҂n˂nĂnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnn݁nցnρnȁnnnnnnnnnnn{ntnmnfn_nXnQnJnCn}n7}n0}n)}n"}n}n}n }n}n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|nz|ns|nl|ne|n^|nW|nP|nI|nB|n;|n4|n-|n&|n|n|n|n |n|n{n{n{n{n{n{n{n{n{n{n{n{n{n{n{n{n{n{n~{nw{np{ni{nb{n[{nT{nM{nF{n?{n8{n1{n*{n#{n{n{n{n{n{nznznznznznznznznznznznznznznznznznzn{zntznmznfzn_znXznQznJznCznvn7vn0vn)vn"vnvnvn vnvnunununununununununununununununununununzunsunluneun^unWunPunIunBun;un4un-un&unununun ununtntntntntntntntntntntntntntntntntntn~tnwtnptnitnbtn[tnTtnMtnFtn?tn8tn1tn*tn#tntntntntntnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsn{sntsnmsnfsn_snXsnQsnJsnCsnon7on0on)on"ononon ononnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnznnsnnlnnenn^nnWnnPnnInnBnn;nn4nn-nn&nnnnnnnn nnnnmnmnmnmnmnmnmnmnmnmnmnmnmnmnmnmnmnmn~mnwmnpmnimnbmn[mnTmnMmnFmn?mn8mn1mn*mn#mnmnmnmnmnmnlnlnlnlnlnlnlnlnlnlnlnlnlnlnlnlnlnln{lntlnmlnfln_lnXlnQlnJlnClnhn7hn0hn)hn"hnhnhn hnhngngngngngngngngngngngngngngngngngngngnzgnsgnlgnegn^gnWgnPgnIgnBgn;gn4gn-gn&gngngngn gngnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfn~fnwfnpfnifnbfn[fnTfnMfnFfn?fn8fn1fn*fn#fnfnfnfnfnfnenenenenenenenenenenenenenenenenenen{entenmenfen_enXenQenJenCenan7an0an)an"ananan anan`n`n`n`n`n`n`n`n`n`n`n`n`n`n`n`n`n`n`nz`ns`nl`ne`n^`nW`nP`nI`nB`n;`n4`n-`n&`n`n`n`n `n`n_n_n_n_n_n_n_n_n_n_n_n_n_n_n_n_n_n_n~_nw_np_ni_nb_n[_nT_nM_nF_n?_n8_n1_n*_n#_n_n_n_n_n_n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n{^nt^nm^nf^n_^nX^nQ^nJ^nC^n<^n5^n.^n'^n ^n^n^n ^n^n]n]n]n]n]n]n]n]n]n]n]n]n]n]n]n]n]n]n]nx]nq]nj]nc]n\]nU]nN]nG]n@]n9]n2]n+]n$]n]n]n]n]n]n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n|\nu\nn\ng\n`\nY\nR\nK\nD\n=\n6\n/\n(\n!\n\n\n \n\n[n[n[n[n[n[n[n[n[n[n[n[n[n[n[n[n[n[n[ny[nr[nk[nd[n][nV[nO[nH[nA[n:[n3[n,[n%[n[n[n[n [n[nZnZnZnZnZnZnZnZnZnZnZnZnZnZnZnZnZnZn}ZnvZnoZnhZnaZnZZnSZnLZnEZn>Zn7Zn0Zn)Zn"ZnZnZn ZnZnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnzYnsYnlYneYn^YnWYnPYnIYnBYn;Yn4Yn-Yn&YnYnYnYn YnYnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXn~XnwXnpXniXnbXn[XnTXnMXnFXn?Xn8Xn1Xn*Xn#XnXnXnXnXnXnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWn{WntWnmWnfWn_WnXWnQWnJWnCWnSn7Sn0Sn)Sn"SnSnSn SnSnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnzRnsRnlRneRn^RnWRnPRnIRnBRn;Rn4Rn-Rn&RnRnRnRn RnRnQnQnQnQnQnQnQnQnQnQnQnQnQnQnQnQnQnQn~QnwQnpQniQnbQn[QnTQnMQnFQn?Qn8Qn1Qn*Qn#QnQnQnQnQnQnPnPnPnPnPnPnPnPnPnPnPnPnPnPnPnPnPnPn{PntPnmPnfPn_PnXPnQPnJPnCPnLn7Ln0Ln)Ln"LnLnLn LnLnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnzKnsKnlKneKn^KnWKnPKnIKnBKn;Kn4Kn-Kn&KnKnKnKn KnKnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJn~JnwJnpJniJnbJn[JnTJnMJnFJn?Jn8Jn1Jn*Jn#JnJnJnJnJnJnInInInInInInInInInInInInInInInInInIn{IntInmInfIn_InXInQInJInCInEn7En0En)En"EnEnEn EnEnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnzDnsDnlDneDn^DnWDnPDnIDnBDn;Dn4Dn-Dn&DnDnDnDn DnDnCnCnCnCnCnCnCnCnCnCnCnCnCnCnCnCnCnCn~CnwCnpCniCnbCn[CnTCnMCnFCn?Cn8Cn1Cn*Cn#CnCnCnCnCnCnBnBnBnBnBnBnBnBnBnBnBnBnBnBnBnBnBnBn{BntBnmBnfBn_BnXBnQBnJBnCBnn>n>n>n>n>n>n>n>n>n>n>n>n>n>n>n>n>n}>nv>no>nh>na>nZ>nS>nL>nE>n>>n7>n0>n)>n">n>n>n >n>n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=nz=ns=nl=ne=n^=nW=nP=nI=nB=n;=n4=n-=n&=n=n=n=n =n=n7n77n07n)7n"7n7n7n 7n7n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6nz6ns6nl6ne6n^6nW6nP6nI6nB6n;6n46n-6n&6n6n6n6n 6n6n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n~5nw5np5ni5nb5n[5nT5nM5nF5n?5n85n15n*5n#5n5n5n5n5n5n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n{4nt4nm4nf4n_4nX4nQ4nJ4nC4n<4n54n.4n'4n 4n4n4n 4n4n3n3n3n3n3n3n3n3n3n3n3n3n3n3n3n3n3n3n3nx3nq3nj3nc3n\3nU3nN3nG3n@3n93n23n+3n$3n3n3n3n3n3n2n2n2n2n2n2n2n2n2n2n2n2n2n2n2n2n2n2n|2nu2nn2ng2n`2nY2nR2nK2nD2n=2n62n/2n(2n!2n2n2n 2n2n1n1n1n1n1n1n1n1n1n1n1n1n1n1n1n1n1n1n1ny1nr1nk1nd1n]1nV1nO1nH1nA1n:1n31n,1n%1n1n1n1n 1n1n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n}0nv0no0nh0na0nZ0nS0nL0nE0n>0n70n00n)0n"0n0n0n 0n0n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/nz/ns/nl/ne/n^/nW/nP/nI/nB/n;/n4/n-/n&/n/n/n/n /n/n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n~.nw.np.ni.nb.n[.nT.nM.nF.n?.n8.n1.n*.n#.n.n.n.n.n.n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n{-nt-nm-nf-n_-nX-nQ-nJ-nC-n<-n5-n.-n'-n -n-n-n -n-n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,nx,nq,nj,nc,n\,nU,nN,nG,n@,n9,n2,n+,n$,n,n,n,n,n,n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n|+nu+nn+ng+n`+nY+nR+nK+nD+n=+n6+n/+n(+n!+n+n+n +n+n*n*n*n*n*n*n*n*n*n*n*n*n*n*n*n*n*n*n*ny*nr*nk*nd*n]*nV*nO*nH*nA*n:*n3*n,*n%*n*n*n*n *n*n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n})nv)no)nh)na)nZ)nS)nL)nE)n>)n7)n0)n))n")n)n)n )n)n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(nz(ns(nl(ne(n^(nW(nP(nI(nB(n;(n4(n-(n&(n(n(n(n (n(n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n~'nw'np'ni'nb'n['nT'nM'nF'n?'n8'n1'n*'n#'n'n'n'n'n'n&n&n&n&n&n&n&n&n&n&n&n&n&n&n&n&n&n&n{&nt&nm&nf&n_&nX&nQ&nJ&nC&n<&n5&n.&n'&n &n&n&n &n&n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%nx%nq%nj%nc%n\%nU%nN%nG%n@%n9%n2%n+%n$%n%n%n%n%n%n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n|$nu$nn$ng$n`$nY$nR$nK$nD$n=$n6$n/$n($n!$n$n$n $n$n#n#n#n#n#n#n#n#n#n#n#n#n#n#n#n#n#n#n#ny#nr#nk#nd#n]#nV#nO#nH#nA#n:#n3#n,#n%#n#n#n#n #n#n"n"n"n"n"n"n"n"n"n"n"n"n"n"n"n"n"n"n}"nv"no"nh"na"nZ"nS"nL"nE"n>"n7"n0"n)"n""n"n"n "n"n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!nz!ns!nl!ne!n^!nW!nP!nI!nB!n;!n4!n-!n&!n!n!n!n !n!n n n n n n n n n n n n n n n n n n n~ nw np ni nb n[ nT nM nF n? n8 n1 n* n# n n n n n nnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCn<n5n.n'n nnn nnnnnnnnnnnnnnnnnnnnnxnqnjncn\nUnNnGn@n9n2n+n$nnnnnnnnnnnnnnnnnnnnnnnn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnnnnnnnnnnnnnnnnnnnnynrnkndn]nVnOnHnAn:n3n,n%nnnn nnnnnnnnnnnnnnnnnnnn}nvnonhnanZnSnLnEn>n7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCn<n5n.n'n nnn nnnnnnnnnnnnnnnnnnnnnxnqnjncn\nUnNnGn@n9n2n+n$nnnnnnnnnnnnnnnnnnnnnnnn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnnnnnnnnnnnnnnnnnnnnynrnkndn]nVnOnHnAn:n3n,n%nnnn nnnnnnnnnnnnnnnnnnnn}nvnonhnanZnSnLnEn>n7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCn<n5n.n'n nnn nnnnnnnnnnnnnnnnnnnnnxnqnjncn\nUnNnGn@n9n2n+n$nnnnnnnnnnnnnnnnnnnnnnnn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnnnnnnnnnnnnnnnnnnnnynrnkndn]nVnOnHnAn:n3n,n%nnnn nn n n n n n n n n n n n n n n n n n n} nv no nh na nZ nS nL nE n> n7 n0 n) n" n n n n n n n n n n n n n n n n n n n n n n n nz ns nl ne n^ nW nP nI nB n; n4 n- n& n n n n n n n n n n n n n n n n n n n n n n n n~ nw np ni nb n[ nT nM nF n? n8 n1 n* n# n n n n n n n n n n n n n n n n n n n n n n n n{ nt nm nf n_ nX nQ nJ nC n< n5 n. n' n n n n n n n n n n n n n n n n n n n n n n n n nx nq nj nc n\ nU nN nG n@ n9 n2 n+ n$ n n n n n nnnnnnnnnnnnnnnnnnn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnnnnnnnnnnnnnnnnnnnnynrnkndn]nVnOnHnAn:n3n,n%nnnn nnnnnnnnnnnnnnnnnnnn}nvnonhnanZnSnLnEn>n7n0n)n"nnn nnnnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnnnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnnnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCn<n5n.n'n nnn nnnnnnnnnnnnnnnnnnnnnxnqnjncn\nUnNnGn@n9n2n+n$nnnnnnnnnnnnnnnnnnnnnnnn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnnnnnnnnnnnnnnnnnnnnynrnkndn]nVnOnHnAn:n3n,n%nnnn nnmmmmmmmmmmmmmmmmmm}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmܿmտmοmǿmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmپmҾm˾mľmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmݽmֽmϽmȽmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmܸmոmθmǸmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmٷmҷm˷mķmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmݶmֶm϶mȶmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmܱmձmαmDZmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmٰmҰm˰mİmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmݯm֯mϯmȯmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmܪmժmΪmǪmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmm٩mҩm˩mĩmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmݨm֨mϨmȨmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmܣmգmΣmǣmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmm٢mҢmˢmĢmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmݡm֡mϡmȡmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmܜm՜mΜmǜmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmٛmқm˛měmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmݚm֚mϚmȚmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmmܕmՕmΕmǕmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmٔmҔm˔mĔmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmݓm֓mϓmȓmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmm܎mՎmΎmǎmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmٍmҍmˍmčmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmm݌m֌mόmȌmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmm܇mՇm·mLJmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmنm҆mˆmĆmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmm݅mօmυmȅmmmmmmmmmmm{mtmmmfm_mXmQmJmCmm7m0m)m"mmm mmmmmmm܀mՀm΀mǀmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmm~m~m~m~m~m~m~m~m~m~m~m~m~m~m~m~m~m~m{~mt~mm~mf~m_~mX~mQ~mJ~mC~m<~m5~m.~m'~m ~m~m~m ~m~m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}mx}mq}mj}mc}m\}mU}mN}mG}m@}m9}m2}m+}m$}m}m}m}m}m}m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m||mu|mn|mg|m`|mY|mR|mK|mD|m=|m6|m/|m(|m!|m|m|m |m|m{m{m{m{m{m{m{m{m{m{m{m{m{m{m{m{m{m{m{my{mr{mk{md{m]{mV{mO{mH{mA{m:{m3{m,{m%{m{m{m{m {m{mzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzm}zmvzmozmhzmazmZzmSzmLzmEzm>zm7zm0zm)zm"zmzmzm zmzmymymymymymymymymymymymymymymymymymymymzymsymlymeym^ymWymPymIymBym;ym4ym-ym&ymymymym ymymxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxmxm~xmwxmpxmixmbxm[xmTxmMxmFxm?xm8xm1xm*xm#xmxmxmxmxmxmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwm{wmtwmmwmfwm_wmXwmQwmJwmCwmsm7sm0sm)sm"smsmsm smsmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmzrmsrmlrmerm^rmWrmPrmIrmBrm;rm4rm-rm&rmrmrmrm rmrmqmqmqmqmqmqmqmqmqmqmqmqmqmqmqmqmqmqm~qmwqmpqmiqmbqm[qmTqmMqmFqm?qm8qm1qm*qm#qmqmqmqmqmqmpmpmpmpmpmpmpmpmpmpmpmpmpmpmpmpmpmpm{pmtpmmpmfpm_pmXpmQpmJpmCpmlm7lm0lm)lm"lmlmlm lmlmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmzkmskmlkmekm^kmWkmPkmIkmBkm;km4km-km&kmkmkmkm kmkmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjm~jmwjmpjmijmbjm[jmTjmMjmFjm?jm8jm1jm*jm#jmjmjmjmjmjmimimimimimimimimimimimimimimimimimim{imtimmimfim_imXimQimJimCimem7em0em)em"ememem ememdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmzdmsdmldmedm^dmWdmPdmIdmBdm;dm4dm-dm&dmdmdmdm dmdmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcm~cmwcmpcmicmbcm[cmTcmMcmFcm?cm8cm1cm*cm#cmcmcmcmcmcmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbm{bmtbmmbmfbm_bmXbmQbmJbmCbm^m7^m0^m)^m"^m^m^m ^m^m]m]m]m]m]m]m]m]m]m]m]m]m]m]m]m]m]m]m]mz]ms]ml]me]m^]mW]mP]mI]mB]m;]m4]m-]m&]m]m]m]m ]m]m\m\m\m\m\m\m\m\m\m\m\m\m\m\m\m\m\m\m~\mw\mp\mi\mb\m[\mT\mM\mF\m?\m8\m1\m*\m#\m\m\m\m\m\m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m{[mt[mm[mf[m_[mX[mQ[mJ[mC[m<[m5[m.[m'[m [m[m[m [m[mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmxZmqZmjZmcZm\ZmUZmNZmGZm@Zm9Zm2Zm+Zm$ZmZmZmZmZmZmYmYmYmYmYmYmYmYmYmYmYmYmYmYmYmYmYmYm|YmuYmnYmgYm`YmYYmRYmKYmDYm=Ym6Ym/Ym(Ym!YmYmYm YmYmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmyXmrXmkXmdXm]XmVXmOXmHXmAXm:Xm3Xm,Xm%XmXmXmXm XmXmWmWmWmWmWmWmWmWmWmWmWmWmWmWmWmWmWmWm}WmvWmoWmhWmaWmZWmSWmLWmEWm>Wm7Wm0Wm)Wm"WmWmWm WmWmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmzVmsVmlVmeVm^VmWVmPVmIVmBVm;Vm4Vm-Vm&VmVmVmVm VmVmUmUmUmUmUmUmUmUmUmUmUmUmUmUmUmUmUmUm~UmwUmpUmiUmbUm[UmTUmMUmFUm?Um8Um1Um*Um#UmUmUmUmUmUmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTm{TmtTmmTmfTm_TmXTmQTmJTmCTmPm7Pm0Pm)Pm"PmPmPm PmPmOmOmOmOmOmOmOmOmOmOmOmOmOmOmOmOmOmOmOmzOmsOmlOmeOm^OmWOmPOmIOmBOm;Om4Om-Om&OmOmOmOm OmOmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNm~NmwNmpNmiNmbNm[NmTNmMNmFNm?Nm8Nm1Nm*Nm#NmNmNmNmNmNmMmMmMmMmMmMmMmMmMmMmMmMmMmMmMmMmMmMm{MmtMmmMmfMm_MmXMmQMmJMmCMmIm7Im0Im)Im"ImImIm ImImHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmzHmsHmlHmeHm^HmWHmPHmIHmBHm;Hm4Hm-Hm&HmHmHmHm HmHmGmGmGmGmGmGmGmGmGmGmGmGmGmGmGmGmGmGm~GmwGmpGmiGmbGm[GmTGmMGmFGm?Gm8Gm1Gm*Gm#GmGmGmGmGmGmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFm{FmtFmmFmfFm_FmXFmQFmJFmCFmBm7Bm0Bm)Bm"BmBmBm BmBmAmAmAmAmAmAmAmAmAmAmAmAmAmAmAmAmAmAmAmzAmsAmlAmeAm^AmWAmPAmIAmBAm;Am4Am-Am&AmAmAmAm AmAm@m@m@m@m@m@m@m@m@m@m@m@m@m@m@m@m@m@m~@mw@mp@mi@mb@m[@mT@mM@mF@m?@m8@m1@m*@m#@m@m@m@m@m@m?m?m?m?m?m?m?m?m?m?m?m?m?m?m?m?m?m?m{?mt?mm?mf?m_?mX?mQ?mJ?mC?mm>m>m>m>m>m>m>m>m>m>m>m>m>m>m>m>m>m>mx>mq>mj>mc>m\>mU>mN>mG>m@>m9>m2>m+>m$>m>m>m>m>m>m=m=m=m=m=m=m=m=m=m=m=m=m=m=m=m=m=m=m|=mu=mn=mg=m`=mY=mR=mK=mD=m==m6=m/=m(=m!=m=m=m =m=m;m7;m0;m);m";m;m;m ;m;m:m:m:m:m:m:m:m:m:m:m:m:m:m:m:m:m:m:m:mz:ms:ml:me:m^:mW:mP:mI:mB:m;:m4:m-:m&:m:m:m:m :m:m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m~9mw9mp9mi9mb9m[9mT9mM9mF9m?9m89m19m*9m#9m9m9m9m9m9m8m8m8m8m8m8m8m8m8m8m8m8m8m8m8m8m8m8m{8mt8mm8mf8m_8mX8mQ8mJ8mC8m<8m58m.8m'8m 8m8m8m 8m8m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7mx7mq7mj7mc7m\7mU7mN7mG7m@7m97m27m+7m$7m7m7m7m7m7m6m6m6m6m6m6m6m6m6m6m6m6m6m6m6m6m6m6m|6mu6mn6mg6m`6mY6mR6mK6mD6m=6m66m/6m(6m!6m6m6m 6m6m5m5m5m5m5m5m5m5m5m5m5m5m5m5m5m5m5m5m5my5mr5mk5md5m]5mV5mO5mH5mA5m:5m35m,5m%5m5m5m5m 5m5m4m4m4m4m4m4m4m4m4m4m4m4m4m4m4m4m4m4m}4mv4mo4mh4ma4mZ4mS4mL4mE4m>4m74m04m)4m"4m4m4m 4m4m3m3m3m3m3m3m3m3m3m3m3m3m3m3m3m3m3m3m3mz3ms3ml3me3m^3mW3mP3mI3mB3m;3m43m-3m&3m3m3m3m 3m3m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m~2mw2mp2mi2mb2m[2mT2mM2mF2m?2m82m12m*2m#2m2m2m2m2m2m1m1m1m1m1m1m1m1m1m1m1m1m1m1m1m1m1m1m{1mt1mm1mf1m_1mX1mQ1mJ1mC1m<1m51m.1m'1m 1m1m1m 1m1m0m0m0m0m0m0m0m0m0m0m0m0m0m0m0m0m0m0m0mx0mq0mj0mc0m\0mU0mN0mG0m@0m90m20m+0m$0m0m0m0m0m0m/m/m/m/m/m/m/m/m/m/m/m/m/m/m/m/m/m/m|/mu/mn/mg/m`/mY/mR/mK/mD/m=/m6/m//m(/m!/m/m/m /m/m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.my.mr.mk.md.m].mV.mO.mH.mA.m:.m3.m,.m%.m.m.m.m .m.m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m}-mv-mo-mh-ma-mZ-mS-mL-mE-m>-m7-m0-m)-m"-m-m-m -m-m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,mz,ms,ml,me,m^,mW,mP,mI,mB,m;,m4,m-,m&,m,m,m,m ,m,m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m~+mw+mp+mi+mb+m[+mT+mM+mF+m?+m8+m1+m*+m#+m+m+m+m+m+m*m*m*m*m*m*m*m*m*m*m*m*m*m*m*m*m*m*m{*mt*mm*mf*m_*mX*mQ*mJ*mC*m<*m5*m.*m'*m *m*m*m *m*m)m)m)m)m)m)m)m)m)m)m)m)m)m)m)m)m)m)m)mx)mq)mj)mc)m\)mU)mN)mG)m@)m9)m2)m+)m$)m)m)m)m)m)m(m(m(m(m(m(m(m(m(m(m(m(m(m(m(m(m(m(m|(mu(mn(mg(m`(mY(mR(mK(mD(m=(m6(m/(m((m!(m(m(m (m(m'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'my'mr'mk'md'm]'mV'mO'mH'mA'm:'m3'm,'m%'m'm'm'm 'm'm&m&m&m&m&m&m&m&m&m&m&m&m&m&m&m&m&m&m}&mv&mo&mh&ma&mZ&mS&mL&mE&m>&m7&m0&m)&m"&m&m&m &m&m%m%m%m%m%m%m%m%m%m%m%m%m%m%m%m%m%m%m%mz%ms%ml%me%m^%mW%mP%mI%mB%m;%m4%m-%m&%m%m%m%m %m%m$m$m$m$m$m$m$m$m$m$m$m$m$m$m$m$m$m$m~$mw$mp$mi$mb$m[$mT$mM$mF$m?$m8$m1$m*$m#$m$m$m$m$m$m#m#m#m#m#m#m#m#m#m#m#m#m#m#m#m#m#m#m{#mt#mm#mf#m_#mX#mQ#mJ#mC#m<#m5#m.#m'#m #m#m#m #m#m"m"m"m"m"m"m"m"m"m"m"m"m"m"m"m"m"m"m"mx"mq"mj"mc"m\"mU"mN"mG"m@"m9"m2"m+"m$"m"m"m"m"m"m!m!m!m!m!m!m!m!m!m!m!m!m!m!m!m!m!m!m|!mu!mn!mg!m`!mY!mR!mK!mD!m=!m6!m/!m(!m!!m!m!m !m!m m m m m m m m m m m m m m m m m m m my mr mk md m] mV mO mH mA m: m3 m, m% m m m m m mmmmmmmmmmmmmmmmmmm}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mmmmmmmmmmmmmmmmmmmmmxmqmjmcm\mUmNmGm@m9m2m+m$mmmmmmmmmmmmmmmmmmmmmmmm|mumnmgm`mYmRmKmDm=m6m/m(m!mmm mmmmmmmmmmmmmmmmmmmmmymrmkmdm]mVmOmHmAm:m3m,m%mmmm mmmmmmmmmmmmmmmmmmmm}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mmmmmmmmmmmmmmmmmmmmmxmqmjmcm\mUmNmGm@m9m2m+m$mmmmmmmmmmmmmmmmmmmmmmmm|mumnmgm`mYmRmKmDm=m6m/m(m!mmm mmmmmmmmmmmmmmmmmmmmmymrmkmdm]mVmOmHmAm:m3m,m%mmmm mmmmmmmmmmmmmmmmmmmm}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mm m m m m m m m m m m m m m m m m m m mx mq mj mc m\ mU mN mG m@ m9 m2 m+ m$ m m m m m m m m m m m m m m m m m m m m m m m m| mu mn mg m` mY mR mK mD m= m6 m/ m( m! m m m m m m m m m m m m m m m m m m m m m m m my mr mk md m] mV mO mH mA m: m3 m, m% m m m m m m m m m m m m m m m m m m m m m m m m} mv mo mh ma mZ mS mL mE m> m7 m0 m) m" m m m m m m m m m m m m m m m m m m m m m m m mz ms ml me m^ mW mP mI mB m; m4 m- m& m m m m m mmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mmmmmmmmmmmmmmmmmmmmmxmqmjmcm\mUmNmGm@m9m2m+m$mmmmmmmmmmmmmmmmmmmmmmmm|mumnmgm`mYmRmKmDm=m6m/m(m!mmm mmmmmmmmmmmmmmmmmmmmmymrmkmdm]mVmOmHmAm:m3m,m%mmmm mmmmmmmmmmmmmmmmmmmm}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mmlllllllllllllllllllxlqljlcl\lUlNlGl@l9l2l+l$llllllllllllllllllllllll|lulnlgl`lYlRlKlDl=l6l/l(l!lll lllllllllllllllllllllylrlkldl]lVlOlHlAl:l3l,l%llll llllllllllllllllllll}lvlolhlalZlSlLlEl>l7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllܼlռlμlǼlllllllllllzlslllel^lWlPlIlBl;l4l-l&llll lllllllٻlһl˻lĻllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllݺlֺlϺlȺlllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllܵlյlεlǵlllllllllllzlslllel^lWlPlIlBl;l4l-l&llll lllllllٴlҴl˴lĴllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllݳlֳlϳlȳlllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllܮlծlήlǮlllllllllllzlslllel^lWlPlIlBl;l4l-l&llll lllllll٭lҭl˭lĭllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllݬl֬lϬlȬlllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllܧlէlΧlǧlllllllllllzlslllel^lWlPlIlBl;l4l-l&llll lllllll٦lҦl˦lĦllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllݥl֥lϥlȥlllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllܠlՠlΠlǠlllllllllllzlslllel^lWlPlIlBl;l4l-l&llll lllllllٟlҟl˟lğllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllݞl֞lϞlȞlllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllܙlՙlΙlǙlllllllllllzlslllel^lWlPlIlBl;l4l-l&llll lllllll٘lҘl˘lĘllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllݗl֗lϗlȗlllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllllܒlՒlΒlǒlllllllllllzlslllel^lWlPlIlBl;l4l-l&llll lllllllّlґlˑlđllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllݐl֐lϐlȐlllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllll܋lՋl΋lNjlllllllllllzlslllel^lWlPlIlBl;l4l-l&llll lllllllيlҊlˊlĊllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllll݉l։lωlȉlllllllllll{ltlmlfl_lXlQlJlCll7l0l)l"lll lllllll܄lՄl΄lDŽlllllllllllzlslllel^lWlPlIlBl;l4l-l&llll lllllllكl҃l˃lăllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllll݂lւlςlȂlllllllllll{ltlmlfl_lXlQlJlCl~l7~l0~l)~l"~l~l~l ~l~l}l}l}l}l}l}l}l}l}l}l}l}l}l}l}l}l}l}l}lz}ls}ll}le}l^}lW}lP}lI}lB}l;}l4}l-}l&}l}l}l}l }l}l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l~|lw|lp|li|lb|l[|lT|lM|lF|l?|l8|l1|l*|l#|l|l|l|l|l|l{l{l{l{l{l{l{l{l{l{l{l{l{l{l{l{l{l{l{{lt{lm{lf{l_{lX{lQ{lJ{lC{l<{l5{l.{l'{l {l{l{l {l{lzlzlzlzlzlzlzlzlzlzlzlzlzlzlzlzlzlzlzlxzlqzljzlczl\zlUzlNzlGzl@zl9zl2zl+zl$zlzlzlzlzlzlylylylylylylylylylylylylylylylylylyl|yluylnylgyl`ylYylRylKylDyl=yl6yl/yl(yl!ylylyl ylylxlxlxlxlxlxlxlxlxlxlxlxlxlxlxlxlxlxlxlyxlrxlkxldxl]xlVxlOxlHxlAxl:xl3xl,xl%xlxlxlxl xlxlwlwlwlwlwlwlwlwlwlwlwlwlwlwlwlwlwlwl}wlvwlowlhwlawlZwlSwlLwlEwl>wl7wl0wl)wl"wlwlwl wlwlvlvlvlvlvlvlvlvlvlvlvlvlvlvlvlvlvlvlvlzvlsvllvlevl^vlWvlPvlIvlBvl;vl4vl-vl&vlvlvlvl vlvlulululululululululululululululululul~ulwulpuliulbul[ulTulMulFul?ul8ul1ul*ul#ulululululultltltltltltltltltltltltltltltltltltl{tlttlmtlftl_tlXtlQtlJtlCtlpl7pl0pl)pl"plplpl plplolololololololololololololololololololzolsolloleol^olWolPolIolBol;ol4ol-ol&olololol ololnlnlnlnlnlnlnlnlnlnlnlnlnlnlnlnlnlnl~nlwnlpnlinlbnl[nlTnlMnlFnl?nl8nl1nl*nl#nlnlnlnlnlnlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlml{mltmlmmlfml_mlXmlQmlJmlCmlil7il0il)il"ililil ililhlhlhlhlhlhlhlhlhlhlhlhlhlhlhlhlhlhlhlzhlshllhlehl^hlWhlPhlIhlBhl;hl4hl-hl&hlhlhlhl hlhlglglglglglglglglglglglglglglglglglgl~glwglpgliglbgl[glTglMglFgl?gl8gl1gl*gl#glglglglglglflflflflflflflflflflflflflflflflflfl{fltflmflffl_flXflQflJflCflbl7bl0bl)bl"blblbl blblalalalalalalalalalalalalalalalalalalalzalsallaleal^alWalPalIalBal;al4al-al&alalalal alal`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l~`lw`lp`li`lb`l[`lT`lM`lF`l?`l8`l1`l*`l#`l`l`l`l`l`l_l_l_l_l_l_l_l_l_l_l_l_l_l_l_l_l_l_l{_lt_lm_lf_l__lX_lQ_lJ_lC_l<_l5_l._l'_l _l_l_l _l_l^l^l^l^l^l^l^l^l^l^l^l^l^l^l^l^l^l^l^lx^lq^lj^lc^l\^lU^lN^lG^l@^l9^l2^l+^l$^l^l^l^l^l^l]l]l]l]l]l]l]l]l]l]l]l]l]l]l]l]l]l]l|]lu]ln]lg]l`]lY]lR]lK]lD]l=]l6]l/]l(]l!]l]l]l ]l]l\l\l\l\l\l\l\l\l\l\l\l\l\l\l\l\l\l\l\ly\lr\lk\ld\l]\lV\lO\lH\lA\l:\l3\l,\l%\l\l\l\l \l\l[l[l[l[l[l[l[l[l[l[l[l[l[l[l[l[l[l[l}[lv[lo[lh[la[lZ[lS[lL[lE[l>[l7[l0[l)[l"[l[l [l[lZlZlZlZlZlZlZlZlZlZlZlZlZlZlZlZlZlZlZlzZlsZllZleZl^ZlWZlPZlIZlBZl;Zl4Zl-Zl&ZlZlZlZl ZlZlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYl~YlwYlpYliYlbYl[YlTYlMYlFYl?Yl8Yl1Yl*Yl#YlYlYlYlYlYlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXl{XltXlmXlfXl_XlXXlQXlJXlCXlTl7Tl0Tl)Tl"TlTlTl TlTlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlzSlsSllSleSl^SlWSlPSlISlBSl;Sl4Sl-Sl&SlSlSlSl SlSlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRl~RlwRlpRliRlbRl[RlTRlMRlFRl?Rl8Rl1Rl*Rl#RlRlRlRlRlRlQlQlQlQlQlQlQlQlQlQlQlQlQlQlQlQlQlQl{QltQlmQlfQl_QlXQlQQlJQlCQlMl7Ml0Ml)Ml"MlMlMl MlMlLlLlLlLlLlLlLlLlLlLlLlLlLlLlLlLlLlLlLlzLlsLllLleLl^LlWLlPLlILlBLl;Ll4Ll-Ll&LlLlLlLl LlLlKlKlKlKlKlKlKlKlKlKlKlKlKlKlKlKlKlKl~KlwKlpKliKlbKl[KlTKlMKlFKl?Kl8Kl1Kl*Kl#KlKlKlKlKlKlJlJlJlJlJlJlJlJlJlJlJlJlJlJlJlJlJlJl{JltJlmJlfJl_JlXJlQJlJJlCJlFl7Fl0Fl)Fl"FlFlFl FlFlElElElElElElElElElElElElElElElElElElElzElsEllEleEl^ElWElPElIElBEl;El4El-El&ElElElEl ElElDlDlDlDlDlDlDlDlDlDlDlDlDlDlDlDlDlDl~DlwDlpDliDlbDl[DlTDlMDlFDl?Dl8Dl1Dl*Dl#DlDlDlDlDlDlClClClClClClClClClClClClClClClClClCl{CltClmClfCl_ClXClQClJClCCl?l7?l0?l)?l"?l?l?l ?l?l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>lz>ls>ll>le>l^>lW>lP>lI>lB>l;>l4>l->l&>l>l>l>l >l>l=l=l=l=l=l=l=l=l=l=l=l=l=l=l=l=l=l=l~=lw=lp=li=lb=l[=lT=lM=lF=l?=l8=l1=l*=l#=l=l=l=l=l=l8l78l08l)8l"8l8l8l 8l8l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7lz7ls7ll7le7l^7lW7lP7lI7lB7l;7l47l-7l&7l7l7l7l 7l7l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l~6lw6lp6li6lb6l[6lT6lM6lF6l?6l86l16l*6l#6l6l6l6l6l6l5l5l5l5l5l5l5l5l5l5l5l5l5l5l5l5l5l5l{5lt5lm5lf5l_5lX5lQ5lJ5lC5l<5l55l.5l'5l 5l5l5l 5l5l4l4l4l4l4l4l4l4l4l4l4l4l4l4l4l4l4l4l4lx4lq4lj4lc4l\4lU4lN4lG4l@4l94l24l+4l$4l4l4l4l4l4l3l3l3l3l3l3l3l3l3l3l3l3l3l3l3l3l3l3l|3lu3ln3lg3l`3lY3lR3lK3lD3l=3l63l/3l(3l!3l3l3l 3l3l2l2l2l2l2l2l2l2l2l2l2l2l2l2l2l2l2l2l2ly2lr2lk2ld2l]2lV2lO2lH2lA2l:2l32l,2l%2l2l2l2l 2l2l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l}1lv1lo1lh1la1lZ1lS1lL1lE1l>1l71l01l)1l"1l1l1l 1l1l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0lz0ls0ll0le0l^0lW0lP0lI0lB0l;0l40l-0l&0l0l0l0l 0l0l/l/l/l/l/l/l/l/l/l/l/l/l/l/l/l/l/l/l~/lw/lp/li/lb/l[/lT/lM/lF/l?/l8/l1/l*/l#/l/l/l/l/l/l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l{.lt.lm.lf.l_.lX.lQ.lJ.lC.l<.l5.l..l'.l .l.l.l .l.l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-lx-lq-lj-lc-l\-lU-lN-lG-l@-l9-l2-l+-l$-l-l-l-l-l-l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l|,lu,ln,lg,l`,lY,lR,lK,lD,l=,l6,l/,l(,l!,l,l,l ,l,l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+l+ly+lr+lk+ld+l]+lV+lO+lH+lA+l:+l3+l,+l%+l+l+l+l +l+l*l*l*l*l*l*l*l*l*l*l*l*l*l*l*l*l*l*l}*lv*lo*lh*la*lZ*lS*lL*lE*l>*l7*l0*l)*l"*l*l*l *l*l)l)l)l)l)l)l)l)l)l)l)l)l)l)l)l)l)l)l)lz)ls)ll)le)l^)lW)lP)lI)lB)l;)l4)l-)l&)l)l)l)l )l)l(l(l(l(l(l(l(l(l(l(l(l(l(l(l(l(l(l(l~(lw(lp(li(lb(l[(lT(lM(lF(l?(l8(l1(l*(l#(l(l(l(l(l(l'l'l'l'l'l'l'l'l'l'l'l'l'l'l'l'l'l'l{'lt'lm'lf'l_'lX'lQ'lJ'lC'l<'l5'l.'l''l 'l'l'l 'l'l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&lx&lq&lj&lc&l\&lU&lN&lG&l@&l9&l2&l+&l$&l&l&l&l&l&l%l%l%l%l%l%l%l%l%l%l%l%l%l%l%l%l%l%l|%lu%ln%lg%l`%lY%lR%lK%lD%l=%l6%l/%l(%l!%l%l%l %l%l$l$l$l$l$l$l$l$l$l$l$l$l$l$l$l$l$l$l$ly$lr$lk$ld$l]$lV$lO$lH$lA$l:$l3$l,$l%$l$l$l$l $l$l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l}#lv#lo#lh#la#lZ#lS#lL#lE#l>#l7#l0#l)#l"#l#l#l #l#l"l"l"l"l"l"l"l"l"l"l"l"l"l"l"l"l"l"l"lz"ls"ll"le"l^"lW"lP"lI"lB"l;"l4"l-"l&"l"l"l"l "l"l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l~!lw!lp!li!lb!l[!lT!lM!lF!l?!l8!l1!l*!l#!l!l!l!l!l!l l l l l l l l l l l l l l l l l l l{ lt lm lf l_ lX lQ lJ lC l< l5 l. l' l l l l l llllllllllllllllllllxlqljlcl\lUlNlGl@l9l2l+l$llllllllllllllllllllllll|lulnlgl`lYlRlKlDl=l6l/l(l!lll lllllllllllllllllllllylrlkldl]lVlOlHlAl:l3l,l%llll llllllllllllllllllll}lvlolhlalZlSlLlEl>l7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCl<l5l.l'l lll lllllllllllllllllllllxlqljlcl\lUlNlGl@l9l2l+l$llllllllllllllllllllllll|lulnlgl`lYlRlKlDl=l6l/l(l!lll lllllllllllllllllllllylrlkldl]lVlOlHlAl:l3l,l%llll llllllllllllllllllll}lvlolhlalZlSlLlEl>l7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCl<l5l.l'l lll lllllllllllllllllllllxlqljlcl\lUlNlGl@l9l2l+l$llllllllllllllllllllllll|lulnlgl`lYlRlKlDl=l6l/l(l!lll lllllllllllllllllllllylrlkldl]lVlOlHlAl:l3l,l%llll llllllllllllllllllll}lvlolhlalZlSlLlEl>l7l0l)l"lll ll l l l l l l l l l l l l l l l l l l lz ls ll le l^ lW lP lI lB l; l4 l- l& l l l l l l l l l l l l l l l l l l l l l l l l~ lw lp li lb l[ lT lM lF l? l8 l1 l* l# l l l l l l l l l l l l l l l l l l l l l l l l{ lt lm lf l_ lX lQ lJ lC l< l5 l. l' l l l l l l l l l l l l l l l l l l l l l l l l lx lq lj lc l\ lU lN lG l@ l9 l2 l+ l$ l l l l l l l l l l l l l l l l l l l l l l l l| lu ln lg l` lY lR lK lD l= l6 l/ l( l! l l l l llllllllllllllllllllylrlkldl]lVlOlHlAl:l3l,l%llll llllllllllllllllllll}lvlolhlalZlSlLlEl>l7l0l)l"lll lllllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllllllllllllllllllll{ltlmlfl_lXlQlJlCl<l5l.l'l lll lllllllllllllllllllllxlqljlcl\lUlNlGl@l9l2l+l$llllllllllllllllllllllll|lulnlgl`lYlRlKlDl=l6l/l(l!lll lllllllllllllllllllllylrlkldl]lVlOlHlAl:l3l,l%llll llllllllllllllllllll}lvlolhlalZlSlLlEl>l7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkٿkҿk˿kĿkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkݾk־kϾkȾkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkܹkչkιkǹkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkٸkҸk˸kĸkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkݷkַkϷkȷkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkܲkղkβkDzkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkٱkұk˱kıkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkݰkְkϰkȰkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkܫkիkΫkǫkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkk٪kҪk˪kĪkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkݩk֩kϩkȩkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkܤkդkΤkǤkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkk٣kңkˣkģkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkݢk֢kϢkȢkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkܝk՝kΝkǝkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkٜkҜk˜kĜkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkݛk֛kϛkțkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkkܖkՖkΖkǖkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkٕkҕk˕kĕkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkݔk֔kϔkȔkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkk܏kՏkΏkǏkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkَkҎkˎkĎkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkݍk֍kύkȍkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkk܈kՈkΈkLjkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkهk҇kˇkćkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkk݆kֆkφkȆkkkkkkkkkkk{ktkmkfk_kXkQkJkCkk7k0k)k"kkk kkkkkkk܁kՁk΁kǁkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkـkҀkˀkĀkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kk~k~k~k~k~k~k~k~k~k~k~k~k~k~k~k~k~k~k~kx~kq~kj~kc~k\~kU~kN~kG~k@~k9~k2~k+~k$~k~k~k~k~k~k}k}k}k}k}k}k}k}k}k}k}k}k}k}k}k}k}k}k|}ku}kn}kg}k`}kY}kR}kK}kD}k=}k6}k/}k(}k!}k}k}k }k}k|k|k|k|k|k|k|k|k|k|k|k|k|k|k|k|k|k|k|ky|kr|kk|kd|k]|kV|kO|kH|kA|k:|k3|k,|k%|k|k|k|k |k|k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k}{kv{ko{kh{ka{kZ{kS{kL{kE{k>{k7{k0{k){k"{k{k{k {k{kzkzkzkzkzkzkzkzkzkzkzkzkzkzkzkzkzkzkzkzzkszklzkezk^zkWzkPzkIzkBzk;zk4zk-zk&zkzkzkzk zkzkykykykykykykykykykykykykykykykykykyk~ykwykpykiykbyk[ykTykMykFyk?yk8yk1yk*yk#ykykykykykykxkxkxkxkxkxkxkxkxkxkxkxkxkxkxkxkxkxk{xktxkmxkfxk_xkXxkQxkJxkCxktk7tk0tk)tk"tktktk tktkskskskskskskskskskskskskskskskskskskskzskssklskesk^skWskPskIskBsk;sk4sk-sk&sksksksk skskrkrkrkrkrkrkrkrkrkrkrkrkrkrkrkrkrkrk~rkwrkprkirkbrk[rkTrkMrkFrk?rk8rk1rk*rk#rkrkrkrkrkrkqkqkqkqkqkqkqkqkqkqkqkqkqkqkqkqkqkqk{qktqkmqkfqk_qkXqkQqkJqkCqkmk7mk0mk)mk"mkmkmk mkmklklklklklklklklklklklklklklklklklklklkzlkslkllkelk^lkWlkPlkIlkBlk;lk4lk-lk&lklklklk lklkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk~kkwkkpkkikkbkk[kkTkkMkkFkk?kk8kk1kk*kk#kkkkkkkkkkkkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjk{jktjkmjkfjk_jkXjkQjkJjkCjkfk7fk0fk)fk"fkfkfk fkfkekekekekekekekekekekekekekekekekekekekzekseklekeek^ekWekPekIekBek;ek4ek-ek&ekekekek ekekdkdkdkdkdkdkdkdkdkdkdkdkdkdkdkdkdkdk~dkwdkpdkidkbdk[dkTdkMdkFdk?dk8dk1dk*dk#dkdkdkdkdkdkckckckckckckckckckckckckckckckckckck{cktckmckfck_ckXckQckJckCck_k7_k0_k)_k"_k_k_k _k_k^k^k^k^k^k^k^k^k^k^k^k^k^k^k^k^k^k^k^kz^ks^kl^ke^k^^kW^kP^kI^kB^k;^k4^k-^k&^k^k^k^k ^k^k]k]k]k]k]k]k]k]k]k]k]k]k]k]k]k]k]k]k~]kw]kp]ki]kb]k[]kT]kM]kF]k?]k8]k1]k*]k#]k]k]k]k]k]k\k\k\k\k\k\k\k\k\k\k\k\k\k\k\k\k\k\k{\kt\km\kf\k_\kX\kQ\kJ\kC\k<\k5\k.\k'\k \k\k\k \k\k[k[k[k[k[k[k[k[k[k[k[k[k[k[k[k[k[k[k[kx[kq[kj[kc[k\[kU[kN[kG[k@[k9[k2[k+[k$[k[k[k[k[k[kZkZkZkZkZkZkZkZkZkZkZkZkZkZkZkZkZkZk|ZkuZknZkgZk`ZkYZkRZkKZkDZk=Zk6Zk/Zk(Zk!ZkZkZk ZkZkYkYkYkYkYkYkYkYkYkYkYkYkYkYkYkYkYkYkYkyYkrYkkYkdYk]YkVYkOYkHYkAYk:Yk3Yk,Yk%YkYkYkYk YkYkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXk}XkvXkoXkhXkaXkZXkSXkLXkEXk>Xk7Xk0Xk)Xk"XkXkXk XkXkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkzWksWklWkeWk^WkWWkPWkIWkBWk;Wk4Wk-Wk&WkWkWkWk WkWkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVk~VkwVkpVkiVkbVk[VkTVkMVkFVk?Vk8Vk1Vk*Vk#VkVkVkVkVkVkUkUkUkUkUkUkUkUkUkUkUkUkUkUkUkUkUkUk{UktUkmUkfUk_UkXUkQUkJUkCUkQk7Qk0Qk)Qk"QkQkQk QkQkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkzPksPklPkePk^PkWPkPPkIPkBPk;Pk4Pk-Pk&PkPkPkPk PkPkOkOkOkOkOkOkOkOkOkOkOkOkOkOkOkOkOkOk~OkwOkpOkiOkbOk[OkTOkMOkFOk?Ok8Ok1Ok*Ok#OkOkOkOkOkOkNkNkNkNkNkNkNkNkNkNkNkNkNkNkNkNkNkNk{NktNkmNkfNk_NkXNkQNkJNkCNkJk7Jk0Jk)Jk"JkJkJk JkJkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkzIksIklIkeIk^IkWIkPIkIIkBIk;Ik4Ik-Ik&IkIkIkIk IkIkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHk~HkwHkpHkiHkbHk[HkTHkMHkFHk?Hk8Hk1Hk*Hk#HkHkHkHkHkHkGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkGk{GktGkmGkfGk_GkXGkQGkJGkCGkCk7Ck0Ck)Ck"CkCkCk CkCkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkzBksBklBkeBk^BkWBkPBkIBkBBk;Bk4Bk-Bk&BkBkBkBk BkBkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk~AkwAkpAkiAkbAk[AkTAkMAkFAk?Ak8Ak1Ak*Ak#AkAkAkAkAkAk@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k{@kt@km@kf@k_@kX@kQ@kJ@kC@k<@k5@k.@k'@k @k@k@k @k@k?k?k?k?k?k?k?k?k?k?k?k?k?k?k?k?k?k?k?kx?kq?kj?kc?k\?kU?kN?kG?k@?k9?k2?k+?k$?k?k?k?k?k?k>k>k>k>k>k>k>k>k>k>k>k>k>k>k>k>k>k>k|>ku>kn>kg>k`>kY>kR>kK>kD>k=>k6>k/>k(>k!>k>k>k >k>k=k=k=k=k=k=k=k=k=k=k=k=k=k=k=k=k=k=k=ky=kr=kk=kd=k]=kV=kO=kH=kA=k:=k3=k,=k%=k=k=k=k =k=k5k75k05k)5k"5k5k5k 5k5k4k4k4k4k4k4k4k4k4k4k4k4k4k4k4k4k4k4k4kz4ks4kl4ke4k^4kW4kP4kI4kB4k;4k44k-4k&4k4k4k4k 4k4k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k~3kw3kp3ki3kb3k[3kT3kM3kF3k?3k83k13k*3k#3k3k3k3k3k3k2k2k2k2k2k2k2k2k2k2k2k2k2k2k2k2k2k2k{2kt2km2kf2k_2kX2kQ2kJ2kC2k<2k52k.2k'2k 2k2k2k 2k2k1k1k1k1k1k1k1k1k1k1k1k1k1k1k1k1k1k1k1kx1kq1kj1kc1k\1kU1kN1kG1k@1k91k21k+1k$1k1k1k1k1k1k0k0k0k0k0k0k0k0k0k0k0k0k0k0k0k0k0k0k|0ku0kn0kg0k`0kY0kR0kK0kD0k=0k60k/0k(0k!0k0k0k 0k0k/k/k/k/k/k/k/k/k/k/k/k/k/k/k/k/k/k/k/ky/kr/kk/kd/k]/kV/kO/kH/kA/k:/k3/k,/k%/k/k/k/k /k/k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k}.kv.ko.kh.ka.kZ.kS.kL.kE.k>.k7.k0.k).k".k.k.k .k.k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-k-kz-ks-kl-ke-k^-kW-kP-kI-kB-k;-k4-k--k&-k-k-k-k -k-k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k~,kw,kp,ki,kb,k[,kT,kM,kF,k?,k8,k1,k*,k#,k,k,k,k,k,k+k+k+k+k+k+k+k+k+k+k+k+k+k+k+k+k+k+k{+kt+km+kf+k_+kX+kQ+kJ+kC+k<+k5+k.+k'+k +k+k+k +k+k*k*k*k*k*k*k*k*k*k*k*k*k*k*k*k*k*k*k*kx*kq*kj*kc*k\*kU*kN*kG*k@*k9*k2*k+*k$*k*k*k*k*k*k)k)k)k)k)k)k)k)k)k)k)k)k)k)k)k)k)k)k|)ku)kn)kg)k`)kY)kR)kK)kD)k=)k6)k/)k()k!)k)k)k )k)k(k(k(k(k(k(k(k(k(k(k(k(k(k(k(k(k(k(k(ky(kr(kk(kd(k](kV(kO(kH(kA(k:(k3(k,(k%(k(k(k(k (k(k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k}'kv'ko'kh'ka'kZ'kS'kL'kE'k>'k7'k0'k)'k"'k'k'k 'k'k&k&k&k&k&k&k&k&k&k&k&k&k&k&k&k&k&k&k&kz&ks&kl&ke&k^&kW&kP&kI&kB&k;&k4&k-&k&&k&k&k&k &k&k%k%k%k%k%k%k%k%k%k%k%k%k%k%k%k%k%k%k~%kw%kp%ki%kb%k[%kT%kM%kF%k?%k8%k1%k*%k#%k%k%k%k%k%k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k{$kt$km$kf$k_$kX$kQ$kJ$kC$k<$k5$k.$k'$k $k$k$k $k$k#k#k#k#k#k#k#k#k#k#k#k#k#k#k#k#k#k#k#kx#kq#kj#kc#k\#kU#kN#kG#k@#k9#k2#k+#k$#k#k#k#k#k#k"k"k"k"k"k"k"k"k"k"k"k"k"k"k"k"k"k"k|"ku"kn"kg"k`"kY"kR"kK"kD"k="k6"k/"k("k!"k"k"k "k"k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!ky!kr!kk!kd!k]!kV!kO!kH!kA!k:!k3!k,!k%!k!k!k!k !k!k k k k k k k k k k k k k k k k k k k} kv ko kh ka kZ kS kL kE k> k7 k0 k) k" k k k k kkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkkkkkkkkkkkkkkkkkkkkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkkkkkkkkkkkkkkkkkkkk|kuknkgk`kYkRkKkDk=k6k/k(k!kkk kkkkkkkkkkkkkkkkkkkkkykrkkkdk]kVkOkHkAk:k3k,k%kkkk kkkkkkkkkkkkkkkkkkkk}kvkokhkakZkSkLkEk>k7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkkkkkkkkkkkkkkkkkkkkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkkkkkkkkkkkkkkkkkkkk|kuknkgk`kYkRkKkDk=k6k/k(k!kkk kkkkkkkkkkkkkkkkkkkkkykrkkkdk]kVkOkHkAk:k3k,k%kkkk kkkkkkkkkkkkkkkkkkkk}kvkokhkakZkSkLkEk>k7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkkkkkkkkkkkkkkkkkkkkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkk k k k k k k k k k k k k k k k k k k| ku kn kg k` kY kR kK kD k= k6 k/ k( k! k k k k k k k k k k k k k k k k k k k k k k k ky kr kk kd k] kV kO kH kA k: k3 k, k% k k k k k k k k k k k k k k k k k k k k k k k k} kv ko kh ka kZ kS kL kE k> k7 k0 k) k" k k k k k k k k k k k k k k k k k k k k k k k kz ks kl ke k^ kW kP kI kB k; k4 k- k& k k k k k k k k k k k k k k k k k k k k k k k k~ kw kp ki kb k[ kT kM kF k? k8 k1 k* k# k k k k k kkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkkkkkkkkkkkkkkkkkkkkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkkkkkkkkkkkkkkkkkkkk|kuknkgk`kYkRkKkDk=k6k/k(k!kkk kkkkkkkkkkkkkkkkkkkkkykrkkkdk]kVkOkHkAk:k3k,k%kkkk kkkkkkkkkkkkkkkkkkkk}kvkokhkakZkSkLkEk>k7k0k)k"kkk kkkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkkkkkkkkkkkkkkkkkkkkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkkjjjjjjjjjjjjjjjjjj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjjjjjjjjjjjjjjjjjjjjyjrjkjdj]jVjOjHjAj:j3j,j%jjjj jjjjjjjjjjjjjjjjjjjj}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjܽjսjνjǽjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjټjҼj˼jļjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjݻjֻjϻjȻjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjܶjնjζjǶjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjٵjҵj˵jĵjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjݴjִjϴjȴjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjܯjկjίjǯjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjٮjҮjˮjĮjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjݭj֭jϭjȭjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjܨjըjΨjǨjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjj٧jҧj˧jħjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjݦj֦jϦjȦjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjܡjաjΡjǡjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjj٠jҠjˠjĠjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjݟj֟jϟjȟjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjܚj՚jΚjǚjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjٙjҙj˙jęjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjݘj֘jϘjȘjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjjܓjՓjΓjǓjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjْjҒj˒jĒjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjݑj֑jϑjȑjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjj܌jՌjΌjnjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjًjҋjˋjċjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjj݊j֊jϊjȊjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jjjjjjj܅jՅj΅jDžjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjلj҄j˄jĄjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjj݃jփjσjȃjjjjjjjjjjj{jtjmjfj_jXjQjJjCjj7j0j)j"jjj jj~j~j~j~j~j~j~j~j~j~j~j~j~j~j~j~j~j~j~jz~js~jl~je~j^~jW~jP~jI~jB~j;~j4~j-~j&~j~j~j~j ~j~j}j}j}j}j}j}j}j}j}j}j}j}j}j}j}j}j}j}j~}jw}jp}ji}jb}j[}jT}jM}jF}j?}j8}j1}j*}j#}j}j}j}j}j}j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j{|jt|jm|jf|j_|jX|jQ|jJ|jC|j<|j5|j.|j'|j |j|j|j |j|j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{jx{jq{jj{jc{j\{jU{jN{jG{j@{j9{j2{j+{j${j{j{j{j{j{jzjzjzjzjzjzjzjzjzjzjzjzjzjzjzjzjzjzj|zjuzjnzjgzj`zjYzjRzjKzjDzj=zj6zj/zj(zj!zjzjzj zjzjyjyjyjyjyjyjyjyjyjyjyjyjyjyjyjyjyjyjyjyyjryjkyjdyj]yjVyjOyjHyjAyj:yj3yj,yj%yjyjyjyj yjyjxjxjxjxjxjxjxjxjxjxjxjxjxjxjxjxjxjxj}xjvxjoxjhxjaxjZxjSxjLxjExj>xj7xj0xj)xj"xjxjxj xjxjwjwjwjwjwjwjwjwjwjwjwjwjwjwjwjwjwjwjwjzwjswjlwjewj^wjWwjPwjIwjBwj;wj4wj-wj&wjwjwjwj wjwjvjvjvjvjvjvjvjvjvjvjvjvjvjvjvjvjvjvj~vjwvjpvjivjbvj[vjTvjMvjFvj?vj8vj1vj*vj#vjvjvjvjvjvjujujujujujujujujujujujujujujujujujuj{ujtujmujfuj_ujXujQujJujCujqj7qj0qj)qj"qjqjqj qjqjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjzpjspjlpjepj^pjWpjPpjIpjBpj;pj4pj-pj&pjpjpjpj pjpjojojojojojojojojojojojojojojojojojoj~ojwojpojiojboj[ojTojMojFoj?oj8oj1oj*oj#ojojojojojojnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnj{njtnjmnjfnj_njXnjQnjJnjCnjjj7jj0jj)jj"jjjjjj jjjjijijijijijijijijijijijijijijijijijijijzijsijlijeij^ijWijPijIijBij;ij4ij-ij&ijijijij ijijhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhj~hjwhjphjihjbhj[hjThjMhjFhj?hj8hj1hj*hj#hjhjhjhjhjhjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgj{gjtgjmgjfgj_gjXgjQgjJgjCgjcj7cj0cj)cj"cjcjcj cjcjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjzbjsbjlbjebj^bjWbjPbjIbjBbj;bj4bj-bj&bjbjbjbj bjbjajajajajajajajajajajajajajajajajajaj~ajwajpajiajbaj[ajTajMajFaj?aj8aj1aj*aj#ajajajajajaj`j`j`j`j`j`j`j`j`j`j`j`j`j`j`j`j`j`j{`jt`jm`jf`j_`jX`jQ`jJ`jC`j<`j5`j.`j'`j `j`j`j `j`j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jx_jq_jj_jc_j\_jU_jN_jG_j@_j9_j2_j+_j$_j_j_j_j_j_j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j^j|^ju^jn^jg^j`^jY^jR^jK^jD^j=^j6^j/^j(^j!^j^j^j ^j^j]j]j]j]j]j]j]j]j]j]j]j]j]j]j]j]j]j]j]jy]jr]jk]jd]j]]jV]jO]jH]jA]j:]j3]j,]j%]j]j]j]j ]j]j\j\j\j\j\j\j\j\j\j\j\j\j\j\j\j\j\j\j}\jv\jo\jh\ja\jZ\jS\jL\jE\j>\j7\j0\j)\j"\j\j\j \j\j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[jz[js[jl[je[j^[jW[jP[jI[jB[j;[j4[j-[j&[j[j[j[j [j[jZjZjZjZjZjZjZjZjZjZjZjZjZjZjZjZjZjZj~ZjwZjpZjiZjbZj[ZjTZjMZjFZj?Zj8Zj1Zj*Zj#ZjZjZjZjZjZjYjYjYjYjYjYjYjYjYjYjYjYjYjYjYjYjYjYj{YjtYjmYjfYj_YjXYjQYjJYjCYjUj7Uj0Uj)Uj"UjUjUj UjUjTjTjTjTjTjTjTjTjTjTjTjTjTjTjTjTjTjTjTjzTjsTjlTjeTj^TjWTjPTjITjBTj;Tj4Tj-Tj&TjTjTjTj TjTjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSj~SjwSjpSjiSjbSj[SjTSjMSjFSj?Sj8Sj1Sj*Sj#SjSjSjSjSjSjRjRjRjRjRjRjRjRjRjRjRjRjRjRjRjRjRjRj{RjtRjmRjfRj_RjXRjQRjJRjCRjNj7Nj0Nj)Nj"NjNjNj NjNjMjMjMjMjMjMjMjMjMjMjMjMjMjMjMjMjMjMjMjzMjsMjlMjeMj^MjWMjPMjIMjBMj;Mj4Mj-Mj&MjMjMjMj MjMjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLj~LjwLjpLjiLjbLj[LjTLjMLjFLj?Lj8Lj1Lj*Lj#LjLjLjLjLjLjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKj{KjtKjmKjfKj_KjXKjQKjJKjCKjGj7Gj0Gj)Gj"GjGjGj GjGjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjzFjsFjlFjeFj^FjWFjPFjIFjBFj;Fj4Fj-Fj&FjFjFjFj FjFjEjEjEjEjEjEjEjEjEjEjEjEjEjEjEjEjEjEj~EjwEjpEjiEjbEj[EjTEjMEjFEj?Ej8Ej1Ej*Ej#EjEjEjEjEjEjDjDjDjDjDjDjDjDjDjDjDjDjDjDjDjDjDjDj{DjtDjmDjfDj_DjXDjQDjJDjCDj@j7@j0@j)@j"@j@j@j @j@j?j?j?j?j?j?j?j?j?j?j?j?j?j?j?j?j?j?j?jz?js?jl?je?j^?jW?jP?jI?jB?j;?j4?j-?j&?j?j?j?j ?j?j>j>j>j>j>j>j>j>j>j>j>j>j>j>j>j>j>j>j~>jw>jp>ji>jb>j[>jT>jM>jF>j?>j8>j1>j*>j#>j>j>j>j>j>j=j=j=j=j=j=j=j=j=j=j=j=j=j=j=j=j=j=j{=jt=jm=jf=j_=jX=jQ=jJ=jC=j<=j5=j.=j'=j =j=j=j =j=j9j79j09j)9j"9j9j9j 9j9j8j8j8j8j8j8j8j8j8j8j8j8j8j8j8j8j8j8j8jz8js8jl8je8j^8jW8jP8jI8jB8j;8j48j-8j&8j8j8j8j 8j8j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j~7jw7jp7ji7jb7j[7jT7jM7jF7j?7j87j17j*7j#7j7j7j7j7j7j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j{6jt6jm6jf6j_6jX6jQ6jJ6jC6j<6j56j.6j'6j 6j6j6j 6j6j5j5j5j5j5j5j5j5j5j5j5j5j5j5j5j5j5j5j5jx5jq5jj5jc5j\5jU5jN5jG5j@5j95j25j+5j$5j5j5j5j5j5j4j4j4j4j4j4j4j4j4j4j4j4j4j4j4j4j4j4j|4ju4jn4jg4j`4jY4jR4jK4jD4j=4j64j/4j(4j!4j4j4j 4j4j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3jy3jr3jk3jd3j]3jV3jO3jH3jA3j:3j33j,3j%3j3j3j3j 3j3j2j2j2j2j2j2j2j2j2j2j2j2j2j2j2j2j2j2j}2jv2jo2jh2ja2jZ2jS2jL2jE2j>2j72j02j)2j"2j2j2j 2j2j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1j1jz1js1jl1je1j^1jW1jP1jI1jB1j;1j41j-1j&1j1j1j1j 1j1j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0j~0jw0jp0ji0jb0j[0jT0jM0jF0j?0j80j10j*0j#0j0j0j0j0j0j/j/j/j/j/j/j/j/j/j/j/j/j/j/j/j/j/j/j{/jt/jm/jf/j_/jX/jQ/jJ/jC/j+j7+j0+j)+j"+j+j+j +j+j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*jz*js*jl*je*j^*jW*jP*jI*jB*j;*j4*j-*j&*j*j*j*j *j*j)j)j)j)j)j)j)j)j)j)j)j)j)j)j)j)j)j)j~)jw)jp)ji)jb)j[)jT)jM)jF)j?)j8)j1)j*)j#)j)j)j)j)j)j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j{(jt(jm(jf(j_(jX(jQ(jJ(jC(j<(j5(j.(j'(j (j(j(j (j(j'j'j'j'j'j'j'j'j'j'j'j'j'j'j'j'j'j'j'jx'jq'jj'jc'j\'jU'jN'jG'j@'j9'j2'j+'j$'j'j'j'j'j'j&j&j&j&j&j&j&j&j&j&j&j&j&j&j&j&j&j&j|&ju&jn&jg&j`&jY&jR&jK&jD&j=&j6&j/&j(&j!&j&j&j &j&j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%jy%jr%jk%jd%j]%jV%jO%jH%jA%j:%j3%j,%j%%j%j%j%j %j%j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j}$jv$jo$jh$ja$jZ$jS$jL$jE$j>$j7$j0$j)$j"$j$j$j $j$j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#jz#js#jl#je#j^#jW#jP#jI#jB#j;#j4#j-#j&#j#j#j#j #j#j"j"j"j"j"j"j"j"j"j"j"j"j"j"j"j"j"j"j~"jw"jp"ji"jb"j["jT"jM"jF"j?"j8"j1"j*"j#"j"j"j"j"j"j!j!j!j!j!j!j!j!j!j!j!j!j!j!j!j!j!j!j{!jt!jm!jf!j_!jX!jQ!jJ!jC!jj7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCj<j5j.j'j jjj jjjjjjjjjjjjjjjjjjjjjxjqjjjcj\jUjNjGj@j9j2j+j$jjjjjjjjjjjjjjjjjjjjjjjj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjjjjjjjjjjjjjjjjjjjjyjrjkjdj]jVjOjHjAj:j3j,j%jjjj jjjjjjjjjjjjjjjjjjjj}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCj<j5j.j'j jjj jjjjjjjjjjjjjjjjjjjjjxjqjjjcj\jUjNjGj@j9j2j+j$jjjjjjjjjjjjjjjjjjjjjjjj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjjjjjjjjjjjjjjjjjjjjyjrjkjdj]jVjOjHjAj:j3j,j%jjjj jjjjjjjjjjjjjjjjjjjj}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jj j j j j j j j j j j j j j j j j j j~ jw jp ji jb j[ jT jM jF j? j8 j1 j* j# j j j j j j j j j j j j j j j j j j j j j j j j{ jt jm jf j_ jX jQ jJ jC j< j5 j. j' j j j j j j j j j j j j j j j j j j j j j j j j jx jq jj jc j\ jU jN jG j@ j9 j2 j+ j$ j j j j j j j j j j j j j j j j j j j j j j j j| ju jn jg j` jY jR jK jD j= j6 j/ j( j! j j j j j j j j j j j j j j j j j j j j j j j jy jr jk jd j] jV jO jH jA j: j3 j, j% j j j j j jjjjjjjjjjjjjjjjjjj}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCj<j5j.j'j jjj jjjjjjjjjjjjjjjjjjjjjxjqjjjcj\jUjNjGj@j9j2j+j$jjjjjjjjjjjjjjjjjjjjjjjj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjjjjjjjjjjjjjjjjjjjjyjrjkjdj]jVjOjHjAj:j3j,j%jjjj jjjjjjjjjjjjjjjjjjjj}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiݿiֿiϿiȿiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiܺiպiκiǺiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiٹiҹi˹iĹiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiݸiָiϸiȸiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiܳiճiγidziiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiٲiҲi˲iIJiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiݱiֱiϱiȱiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiܬiլiάiǬiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiii٫iҫi˫iīiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiݪi֪iϪiȪiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiܥiեiΥiǥiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiii٤iҤiˤiĤiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiݣi֣iϣiȣiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiܞi՞iΞiǞiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiٝiҝi˝iĝiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiݜi֜iϜiȜiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiܗi՗iΗiǗiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiٖiҖi˖iĖiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiݕi֕iϕiȕiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiiiܐiՐiΐiǐiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiُiҏiˏiďiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiݎi֎iώiȎiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiii܉iՉiΉiljiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiوi҈iˈiĈiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiii݇iևiχiȇiiiiiiiiiii{itimifi_iXiQiJiCii7i0i)i"iii iiiiiii܂iՂi΂iǂiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiفiҁiˁiāiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiii݀iրiπiȀiiiiiiiiiii{itimifi_iXiQiJiCi|i7|i0|i)|i"|i|i|i |i|i{i{i{i{i{i{i{i{i{i{i{i{i{i{i{i{i{i{i{iz{is{il{ie{i^{iW{iP{iI{iB{i;{i4{i-{i&{i{i{i{i {i{izizizizizizizizizizizizizizizizizizi~ziwzipziizibzi[ziTziMziFzi?zi8zi1zi*zi#ziziziziziziyiyiyiyiyiyiyiyiyiyiyiyiyiyiyiyiyiyi{yityimyifyi_yiXyiQyiJyiCyiui7ui0ui)ui"uiuiui uiuitititititititititititititititititititiztistiltieti^tiWtiPtiItiBti;ti4ti-ti&titititi titisisisisisisisisisisisisisisisisisisi~siwsipsiisibsi[siTsiMsiFsi?si8si1si*si#sisisisisisiriririririririririririririririririri{ritrimrifri_riXriQriJriCrini7ni0ni)ni"ninini ninimimimimimimimimimimimimimimimimimimimizmismilmiemi^miWmiPmiImiBmi;mi4mi-mi&mimimimi mimilililililililililililililililililili~liwlipliilibli[liTliMliFli?li8li1li*li#lilililililikikikikikikikikikikikikikikikikikiki{kitkimkifki_kiXkiQkiJkiCkigi7gi0gi)gi"gigigi gigifififififififififififififififififififizfisfilfiefi^fiWfiPfiIfiBfi;fi4fi-fi&fifififi fifieieieieieieieieieieieieieieieieieiei~eiweipeiieibei[eiTeiMeiFei?ei8ei1ei*ei#eieieieieieididididididididididididididididididi{ditdimdifdi_diXdiQdiJdiCdi`i7`i0`i)`i"`i`i`i `i`i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_iz_is_il_ie_i^_iW_iP_iI_iB_i;_i4_i-_i&_i_i_i_i _i_i^i^i^i^i^i^i^i^i^i^i^i^i^i^i^i^i^i^i~^iw^ip^ii^ib^i[^iT^iM^iF^i?^i8^i1^i*^i#^i^i^i^i^i^i]i]i]i]i]i]i]i]i]i]i]i]i]i]i]i]i]i]i{]it]im]if]i_]iX]iQ]iJ]iC]i<]i5]i.]i']i ]i]i]i ]i]i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\ix\iq\ij\ic\i\\iU\iN\iG\i@\i9\i2\i+\i$\i\i\i\i\i\i[i[i[i[i[i[i[i[i[i[i[i[i[i[i[i[i[i[i|[iu[in[ig[i`[iY[iR[iK[iD[i=[i6[i/[i([i![i[i[i [i[iZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiyZirZikZidZi]ZiVZiOZiHZiAZi:Zi3Zi,Zi%ZiZiZiZi ZiZiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYi}YivYioYihYiaYiZYiSYiLYiEYi>Yi7Yi0Yi)Yi"YiYiYi YiYiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXizXisXilXieXi^XiWXiPXiIXiBXi;Xi4Xi-Xi&XiXiXiXi XiXiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWi~WiwWipWiiWibWi[WiTWiMWiFWi?Wi8Wi1Wi*Wi#WiWiWiWiWiWiViViViViViViViViViViViViViViViViViVi{VitVimVifVi_ViXViQViJViCViRi7Ri0Ri)Ri"RiRiRi RiRiQiQiQiQiQiQiQiQiQiQiQiQiQiQiQiQiQiQiQizQisQilQieQi^QiWQiPQiIQiBQi;Qi4Qi-Qi&QiQiQiQi QiQiPiPiPiPiPiPiPiPiPiPiPiPiPiPiPiPiPiPi~PiwPipPiiPibPi[PiTPiMPiFPi?Pi8Pi1Pi*Pi#PiPiPiPiPiPiOiOiOiOiOiOiOiOiOiOiOiOiOiOiOiOiOiOi{OitOimOifOi_OiXOiQOiJOiCOiKi7Ki0Ki)Ki"KiKiKi KiKiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJizJisJilJieJi^JiWJiPJiIJiBJi;Ji4Ji-Ji&JiJiJiJi JiJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi~IiwIipIiiIibIi[IiTIiMIiFIi?Ii8Ii1Ii*Ii#IiIiIiIiIiIiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHi{HitHimHifHi_HiXHiQHiJHiCHiDi7Di0Di)Di"DiDiDi DiDiCiCiCiCiCiCiCiCiCiCiCiCiCiCiCiCiCiCiCizCisCilCieCi^CiWCiPCiICiBCi;Ci4Ci-Ci&CiCiCiCi CiCiBiBiBiBiBiBiBiBiBiBiBiBiBiBiBiBiBiBi~BiwBipBiiBibBi[BiTBiMBiFBi?Bi8Bi1Bi*Bi#BiBiBiBiBiBiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAi{AitAimAifAi_AiXAiQAiJAiCAii>i>i>i>i>i>i>i>i>i>i>i>i>i>i>i>i>i>iy>ir>ik>id>i]>iV>iO>iH>iA>i:>i3>i,>i%>i>i>i>i >i>i=i=i=i=i=i=i=i=i=i=i=i=i=i=i=i=i=i=i}=iv=io=ih=ia=iZ=iS=iL=iE=i>=i7=i0=i)=i"=i=i=i =i=i6i76i06i)6i"6i6i6i 6i6i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5iz5is5il5ie5i^5iW5iP5iI5iB5i;5i45i-5i&5i5i5i5i 5i5i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i~4iw4ip4ii4ib4i[4iT4iM4iF4i?4i84i14i*4i#4i4i4i4i4i4i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i{3it3im3if3i_3iX3iQ3iJ3iC3i<3i53i.3i'3i 3i3i3i 3i3i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2ix2iq2ij2ic2i\2iU2iN2iG2i@2i92i22i+2i$2i2i2i2i2i2i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i|1iu1in1ig1i`1iY1iR1iK1iD1i=1i61i/1i(1i!1i1i1i 1i1i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0iy0ir0ik0id0i]0iV0iO0iH0iA0i:0i30i,0i%0i0i0i0i 0i0i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i}/iv/io/ih/ia/iZ/iS/iL/iE/i>/i7/i0/i)/i"/i/i/i /i/i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.iz.is.il.ie.i^.iW.iP.iI.iB.i;.i4.i-.i&.i.i.i.i .i.i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i~-iw-ip-ii-ib-i[-iT-iM-iF-i?-i8-i1-i*-i#-i-i-i-i-i-i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i{,it,im,if,i_,iX,iQ,iJ,iC,i<,i5,i.,i',i ,i,i,i ,i,i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+ix+iq+ij+ic+i\+iU+iN+iG+i@+i9+i2+i++i$+i+i+i+i+i+i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i|*iu*in*ig*i`*iY*iR*iK*iD*i=*i6*i/*i(*i!*i*i*i *i*i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)iy)ir)ik)id)i])iV)iO)iH)iA)i:)i3)i,)i%)i)i)i)i )i)i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i}(iv(io(ih(ia(iZ(iS(iL(iE(i>(i7(i0(i)(i"(i(i(i (i(i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'iz'is'il'ie'i^'iW'iP'iI'iB'i;'i4'i-'i&'i'i'i'i 'i'i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i~&iw&ip&ii&ib&i[&iT&iM&iF&i?&i8&i1&i*&i#&i&i&i&i&i&i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i{%it%im%if%i_%iX%iQ%iJ%iC%i<%i5%i.%i'%i %i%i%i %i%i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$ix$iq$ij$ic$i\$iU$iN$iG$i@$i9$i2$i+$i$$i$i$i$i$i$i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i|#iu#in#ig#i`#iY#iR#iK#iD#i=#i6#i/#i(#i!#i#i#i #i#i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"iy"ir"ik"id"i]"iV"iO"iH"iA"i:"i3"i,"i%"i"i"i"i "i"i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i}!iv!io!ih!ia!iZ!iS!iL!iE!i>!i7!i0!i)!i"!i!i!i !i!i i i i i i i i i i i i i i i i i i i iz is il ie i^ iW iP iI iB i; i4 i- i& i i i i i iiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCi<i5i.i'i iii iiiiiiiiiiiiiiiiiiiiixiqijici\iUiNiGi@i9i2i+i$iiiiiiiiiiiiiiiiiiiiiiii|iuinigi`iYiRiKiDi=i6i/i(i!iii iiiiiiiiiiiiiiiiiiiiiyirikidi]iViOiHiAi:i3i,i%iiii iiiiiiiiiiiiiiiiiiii}ivioihiaiZiSiLiEi>i7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCi<i5i.i'i iii iiiiiiiiiiiiiiiiiiiiixiqijici\iUiNiGi@i9i2i+i$iiiiiiiiiiiiiiiiiiiiiiii|iuinigi`iYiRiKiDi=i6i/i(i!iii iiiiiiiiiiiiiiiiiiiiiyirikidi]iViOiHiAi:i3i,i%iiii iiiiiiiiiiiiiiiiiiii}ivioihiaiZiSiLiEi>i7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCi<i5i.i'i iii iiiiiiiiiiiiiiiiiiiiixiqijici\iUiNiGi@i9i2i+i$iiiiiiiiiiiiiiiiiiiiiiii|iuinigi`iYiRiKiDi=i6i/i(i!iii ii i i i i i i i i i i i i i i i i i i iy ir ik id i] iV iO iH iA i: i3 i, i% i i i i i i i i i i i i i i i i i i i i i i i i} iv io ih ia iZ iS iL iE i> i7 i0 i) i" i i i i i i i i i i i i i i i i i i i i i i i iz is il ie i^ iW iP iI iB i; i4 i- i& i i i i i i i i i i i i i i i i i i i i i i i i~ iw ip ii ib i[ iT iM iF i? i8 i1 i* i# i i i i i i i i i i i i i i i i i i i i i i i i{ it im if i_ iX iQ iJ iC i< i5 i. i' i i i i i iiiiiiiiiiiiiiiiiiiixiqijici\iUiNiGi@i9i2i+i$iiiiiiiiiiiiiiiiiiiiiiii|iuinigi`iYiRiKiDi=i6i/i(i!iii iiiiiiiiiiiiiiiiiiiiiyirikidi]iViOiHiAi:i3i,i%iiii iiiiiiiiiiiiiiiiiiii}ivioihiaiZiSiLiEi>i7i0i)i"iii iiiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iiiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCi<i5i.i'i iii iiiiiiiiiiiiiiiiiiiiixiqijici\iUiNiGi@i9i2i+i$iiiiiiiiiiiiiiiiiiiiiiii|iuinigi`iYiRiKiDi=i6i/i(i!iii iihhhhhhhhhhhhhhhhhhhyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhhhhhhhhhhhhhhhhhhh}hvhohhhahZhShLhEh>h7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhܾhվhξhǾhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhٽhҽh˽hĽhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhݼhּhϼhȼhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhܷhշhηhǷhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhٶhҶh˶hĶhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhݵhֵhϵhȵhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhܰhհhΰhǰhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhٯhүh˯hįhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhݮh֮hϮhȮhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhܩhթhΩhǩhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhh٨hҨh˨hĨhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhݧh֧hϧhȧhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhܢhբh΢hǢhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhh١hҡhˡhġhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhݠh֠hϠhȠhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhܛh՛hΛhǛhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhٚhҚh˚hĚhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhݙh֙hϙhșhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhܔhՔhΔhǔhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhٓhғh˓hēhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhݒh֒hϒhȒhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhh܍hՍh΍hǍhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhٌhҌhˌhČhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhh݋h֋hϋhȋhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhh܆hՆhΆhdžhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhمh҅h˅hąhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhh݄hքhτhȄhhhhhhhhhhh{hthmhfh_hXhQhJhChh7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hh~h~h~h~h~h~h~h~h~h~h~h~h~h~h~h~h~h~h~~hw~hp~hi~hb~h[~hT~hM~hF~h?~h8~h1~h*~h#~h~h~h~h~h~h}h}h}h}h}h}h}h}h}h}h}h}h}h}h}h}h}h}h{}ht}hm}hf}h_}hX}hQ}hJ}hC}h<}h5}h.}h'}h }h}h}h }h}h|h|h|h|h|h|h|h|h|h|h|h|h|h|h|h|h|h|h|hx|hq|hj|hc|h\|hU|hN|hG|h@|h9|h2|h+|h$|h|h|h|h|h|h{h{h{h{h{h{h{h{h{h{h{h{h{h{h{h{h{h{h|{hu{hn{hg{h`{hY{hR{hK{hD{h={h6{h/{h({h!{h{h{h {h{hzhzhzhzhzhzhzhzhzhzhzhzhzhzhzhzhzhzhzhyzhrzhkzhdzh]zhVzhOzhHzhAzh:zh3zh,zh%zhzhzhzh zhzhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyh}yhvyhoyhhyhayhZyhSyhLyhEyh>yh7yh0yh)yh"yhyhyh yhyhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhzxhsxhlxhexh^xhWxhPxhIxhBxh;xh4xh-xh&xhxhxhxh xhxhwhwhwhwhwhwhwhwhwhwhwhwhwhwhwhwhwhwh~whwwhpwhiwhbwh[whTwhMwhFwh?wh8wh1wh*wh#whwhwhwhwhwhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvh{vhtvhmvhfvh_vhXvhQvhJvhCvhrh7rh0rh)rh"rhrhrh rhrhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhzqhsqhlqheqh^qhWqhPqhIqhBqh;qh4qh-qh&qhqhqhqh qhqhphphphphphphphphphphphphphphphphphph~phwphpphiphbph[phTphMphFph?ph8ph1ph*ph#phphphphphphohohohohohohohohohohohohohohohohohoh{ohtohmohfoh_ohXohQohJohCohkh7kh0kh)kh"khkhkh khkhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhzjhsjhljhejh^jhWjhPjhIjhBjh;jh4jh-jh&jhjhjhjh jhjhihihihihihihihihihihihihihihihihihih~ihwihpihiihbih[ihTihMihFih?ih8ih1ih*ih#ihihihihihihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh{hhthhmhhfhh_hhXhhQhhJhhChhdh7dh0dh)dh"dhdhdh dhdhchchchchchchchchchchchchchchchchchchchzchschlchech^chWchPchIchBch;ch4ch-ch&chchchch chchbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbh~bhwbhpbhibhbbh[bhTbhMbhFbh?bh8bh1bh*bh#bhbhbhbhbhbhahahahahahahahahahahahahahahahahahah{ahtahmahfah_ahXahQahJahCah]h7]h0]h)]h"]h]h]h ]h]h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\hz\hs\hl\he\h^\hW\hP\hI\hB\h;\h4\h-\h&\h\h\h\h \h\h[h[h[h[h[h[h[h[h[h[h[h[h[h[h[h[h[h[h~[hw[hp[hi[hb[h[[hT[hM[hF[h?[h8[h1[h*[h#[h[h[h[h[h[hZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZh{ZhtZhmZhfZh_ZhXZhQZhJZhCZhVh7Vh0Vh)Vh"VhVhVh VhVhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhzUhsUhlUheUh^UhWUhPUhIUhBUh;Uh4Uh-Uh&UhUhUhUh UhUhThThThThThThThThThThThThThThThThThTh~ThwThpThiThbTh[ThTThMThFTh?Th8Th1Th*Th#ThThThThThThShShShShShShShShShShShShShShShShShSh{ShtShmShfSh_ShXShQShJShCShOh7Oh0Oh)Oh"OhOhOh OhOhNhNhNhNhNhNhNhNhNhNhNhNhNhNhNhNhNhNhNhzNhsNhlNheNh^NhWNhPNhINhBNh;Nh4Nh-Nh&NhNhNhNh NhNhMhMhMhMhMhMhMhMhMhMhMhMhMhMhMhMhMhMh~MhwMhpMhiMhbMh[MhTMhMMhFMh?Mh8Mh1Mh*Mh#MhMhMhMhMhMhLhLhLhLhLhLhLhLhLhLhLhLhLhLhLhLhLhLh{LhtLhmLhfLh_LhXLhQLhJLhCLhHh7Hh0Hh)Hh"HhHhHh HhHhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhzGhsGhlGheGh^GhWGhPGhIGhBGh;Gh4Gh-Gh&GhGhGhGh GhGhFhFhFhFhFhFhFhFhFhFhFhFhFhFhFhFhFhFh~FhwFhpFhiFhbFh[FhTFhMFhFFh?Fh8Fh1Fh*Fh#FhFhFhFhFhFhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEh{EhtEhmEhfEh_EhXEhQEhJEhCEhAh7Ah0Ah)Ah"AhAhAh AhAh@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@hz@hs@hl@he@h^@hW@hP@hI@hB@h;@h4@h-@h&@h@h@h@h @h@h?h?h?h?h?h?h?h?h?h?h?h?h?h?h?h?h?h?h~?hw?hp?hi?hb?h[?hT?hM?hF?h??h8?h1?h*?h#?h?h?h?h?h?h>h>h>h>h>h>h>h>h>h>h>h>h>h>h>h>h>h>h{>ht>hm>hf>h_>hX>hQ>hJ>hC>h<>h5>h.>h'>h >h>h>h >h>h=h=h=h=h=h=h=h=h=h=h=h=h=h=h=h=h=h=h=hx=hq=hj=hc=h\=hU=hN=hG=h@=h9=h2=h+=h$=h=h=h=h=h=h:h7:h0:h):h":h:h:h :h:h9h9h9h9h9h9h9h9h9h9h9h9h9h9h9h9h9h9h9hz9hs9hl9he9h^9hW9hP9hI9hB9h;9h49h-9h&9h9h9h9h 9h9h8h8h8h8h8h8h8h8h8h8h8h8h8h8h8h8h8h8h~8hw8hp8hi8hb8h[8hT8hM8hF8h?8h88h18h*8h#8h8h8h8h8h8h7h7h7h7h7h7h7h7h7h7h7h7h7h7h7h7h7h7h{7ht7hm7hf7h_7hX7hQ7hJ7hC7h<7h57h.7h'7h 7h7h7h 7h7h6h6h6h6h6h6h6h6h6h6h6h6h6h6h6h6h6h6h6hx6hq6hj6hc6h\6hU6hN6hG6h@6h96h26h+6h$6h6h6h6h6h6h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h|5hu5hn5hg5h`5hY5hR5hK5hD5h=5h65h/5h(5h!5h5h5h 5h5h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4hy4hr4hk4hd4h]4hV4hO4hH4hA4h:4h34h,4h%4h4h4h4h 4h4h3h3h3h3h3h3h3h3h3h3h3h3h3h3h3h3h3h3h}3hv3ho3hh3ha3hZ3hS3hL3hE3h>3h73h03h)3h"3h3h3h 3h3h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2hz2hs2hl2he2h^2hW2hP2hI2hB2h;2h42h-2h&2h2h2h2h 2h2h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h~1hw1hp1hi1hb1h[1hT1hM1hF1h?1h81h11h*1h#1h1h1h1h1h1h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h{0ht0hm0hf0h_0hX0hQ0hJ0hC0h<0h50h.0h'0h 0h0h0h 0h0h/h/h/h/h/h/h/h/h/h/h/h/h/h/h/h/h/h/h/hx/hq/hj/hc/h\/hU/hN/hG/h@/h9/h2/h+/h$/h/h/h/h/h/h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h|.hu.hn.hg.h`.hY.hR.hK.hD.h=.h6.h/.h(.h!.h.h.h .h.h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-hy-hr-hk-hd-h]-hV-hO-hH-hA-h:-h3-h,-h%-h-h-h-h -h-h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h},hv,ho,hh,ha,hZ,hS,hL,hE,h>,h7,h0,h),h",h,h,h ,h,h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+hz+hs+hl+he+h^+hW+hP+hI+hB+h;+h4+h-+h&+h+h+h+h +h+h*h*h*h*h*h*h*h*h*h*h*h*h*h*h*h*h*h*h~*hw*hp*hi*hb*h[*hT*hM*hF*h?*h8*h1*h**h#*h*h*h*h*h*h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h{)ht)hm)hf)h_)hX)hQ)hJ)hC)h<)h5)h.)h')h )h)h)h )h)h(h(h(h(h(h(h(h(h(h(h(h(h(h(h(h(h(h(h(hx(hq(hj(hc(h\(hU(hN(hG(h@(h9(h2(h+(h$(h(h(h(h(h(h'h'h'h'h'h'h'h'h'h'h'h'h'h'h'h'h'h'h|'hu'hn'hg'h`'hY'hR'hK'hD'h='h6'h/'h('h!'h'h'h 'h'h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&hy&hr&hk&hd&h]&hV&hO&hH&hA&h:&h3&h,&h%&h&h&h&h &h&h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h}%hv%ho%hh%ha%hZ%hS%hL%hE%h>%h7%h0%h)%h"%h%h%h %h%h$h$h$h$h$h$h$h$h$h$h$h$h$h$h$h$h$h$h$hz$hs$hl$he$h^$hW$hP$hI$hB$h;$h4$h-$h&$h$h$h$h $h$h#h#h#h#h#h#h#h#h#h#h#h#h#h#h#h#h#h#h~#hw#hp#hi#hb#h[#hT#hM#hF#h?#h8#h1#h*#h##h#h#h#h#h#h"h"h"h"h"h"h"h"h"h"h"h"h"h"h"h"h"h"h{"ht"hm"hf"h_"hX"hQ"hJ"hC"h<"h5"h."h'"h "h"h"h "h"h!h!h!h!h!h!h!h!h!h!h!h!h!h!h!h!h!h!h!hx!hq!hj!hc!h\!hU!hN!hG!h@!h9!h2!h+!h$!h!h!h!h!h!h h h h h h h h h h h h h h h h h h h| hu hn hg h` hY hR hK hD h= h6 h/ h( h! h h h h hhhhhhhhhhhhhhhhhhhhyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhhhhhhhhhhhhhhhhhhh}hvhohhhahZhShLhEh>h7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhCh<h5h.h'h hhh hhhhhhhhhhhhhhhhhhhhhxhqhjhch\hUhNhGh@h9h2h+h$hhhhhhhhhhhhhhhhhhhhhhhh|huhnhgh`hYhRhKhDh=h6h/h(h!hhh hhhhhhhhhhhhhhhhhhhhhyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhhhhhhhhhhhhhhhhhhh}hvhohhhahZhShLhEh>h7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhCh<h5h.h'h hhh hhhhhhhhhhhhhhhhhhhhhxhqhjhch\hUhNhGh@h9h2h+h$hhhhhhhhhhhhhhhhhhhhhhhh|huhnhgh`hYhRhKhDh=h6h/h(h!hhh hhhhhhhhhhhhhhhhhhhhhyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhhhhhhhhhhhhhhhhhhh}hvhohhhahZhShLhEh>h7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhh h h h h h h h h h h h h h h h h h h{ ht hm hf h_ hX hQ hJ hC h< h5 h. h' h h h h h h h h h h h h h h h h h h h h h h h h hx hq hj hc h\ hU hN hG h@ h9 h2 h+ h$ h h h h h h h h h h h h h h h h h h h h h h h h| hu hn hg h` hY hR hK hD h= h6 h/ h( h! h h h h h h h h h h h h h h h h h h h h h h h hy hr hk hd h] hV hO hH hA h: h3 h, h% h h h h h h h h h h h h h h h h h h h h h h h h} hv ho hh ha hZ hS hL hE h> h7 h0 h) h" h h h h hhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhhhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhCh<h5h.h'h hhh hhhhhhhhhhhhhhhhhhhhhxhqhjhch\hUhNhGh@h9h2h+h$hhhhhhhhhhhhhhhhhhhhhhhh|huhnhgh`hYhRhKhDh=h6h/h(h!hhh hhhhhhhhhhhhhhhhhhhhhyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhhhhhhhhhhhhhhhhhhh}hvhohhhahZhShLhEh>h7h0h)h"hhh hhhhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhhhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggܻgջgλgǻgggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggٺgҺg˺gĺgggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggggggݹgֹgϹgȹggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggܴgմgδgǴgggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggٳgҳg˳gijgggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggggggݲgֲgϲgȲggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggܭgխgέgǭgggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggggggg٬gҬgˬgĬgggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggggggݫg֫gϫgȫggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggܦgզgΦgǦgggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggggggg٥gҥg˥gĥgggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggggggݤg֤gϤgȤggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggܟg՟gΟgǟgggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggٞgҞg˞gĞgggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggggggݝg֝gϝgȝggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggܘg՘gΘgǘgggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggٗgҗg˗gėgggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggggggݖg֖gϖgȖggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg gggggggܑgՑgΑgǑgggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggِgҐgːgĐgggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggggggݏg֏gϏgȏggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg ggggggg܊gՊgΊgNJgggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggىg҉gˉgĉgggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggg݈gֈgψgȈggggggggggg{gtgmgfg_gXgQgJgCgg7g0g)g"ggg ggggggg܃gՃg΃gǃgggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggقg҂g˂gĂgggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggg݁gցgρgȁggggggggggg{gtgmgfg_gXgQgJgCg}g7}g0}g)}g"}g}g}g }g}g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|g|gz|gs|gl|ge|g^|gW|gP|gI|gB|g;|g4|g-|g&|g|g|g|g |g|g{g{g{g{g{g{g{g{g{g{g{g{g{g{g{g{g{g{g~{gw{gp{gi{gb{g[{gT{gM{gF{g?{g8{g1{g*{g#{g{g{g{g{g{gzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzg{zgtzgmzgfzg_zgXzgQzgJzgCzgvg7vg0vg)vg"vgvgvg vgvgugugugugugugugugugugugugugugugugugugugzugsuglugeug^ugWugPugIugBug;ug4ug-ug&ugugugug ugugtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtg~tgwtgptgitgbtg[tgTtgMtgFtg?tg8tg1tg*tg#tgtgtgtgtgtgsgsgsgsgsgsgsgsgsgsgsgsgsgsgsgsgsgsg{sgtsgmsgfsg_sgXsgQsgJsgCsgog7og0og)og"ogogog ogogngngngngngngngngngngngngngngngngngngngzngsnglngeng^ngWngPngIngBng;ng4ng-ng&ngngngng ngngmgmgmgmgmgmgmgmgmgmgmgmgmgmgmgmgmgmg~mgwmgpmgimgbmg[mgTmgMmgFmg?mg8mg1mg*mg#mgmgmgmgmgmglglglglglglglglglglglglglglglglglglg{lgtlgmlgflg_lgXlgQlgJlgClghg7hg0hg)hg"hghghg hghgggggggggggggggggggggggggggggggggggggggzggsgglggegg^ggWggPggIggBgg;gg4gg-gg&gggggggg ggggfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfg~fgwfgpfgifgbfg[fgTfgMfgFfg?fg8fg1fg*fg#fgfgfgfgfgfgegegegegegegegegegegegegegegegegegeg{egtegmegfeg_egXegQegJegCegag7ag0ag)ag"agagag agag`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gz`gs`gl`ge`g^`gW`gP`gI`gB`g;`g4`g-`g&`g`g`g`g `g`g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g~_gw_gp_gi_gb_g[_gT_gM_gF_g?_g8_g1_g*_g#_g_g_g_g_g_g^g^g^g^g^g^g^g^g^g^g^g^g^g^g^g^g^g^g{^gt^gm^gf^g_^gX^gQ^gJ^gC^g<^g5^g.^g'^g ^g^g^g ^g^g]g]g]g]g]g]g]g]g]g]g]g]g]g]g]g]g]g]g]gx]gq]gj]gc]g\]gU]gN]gG]g@]g9]g2]g+]g$]g]g]g]g]g]g\g\g\g\g\g\g\g\g\g\g\g\g\g\g\g\g\g\g|\gu\gn\gg\g`\gY\gR\gK\gD\g=\g6\g/\g(\g!\g\g\g \g\g[g[g[g[g[g[g[g[g[g[g[g[g[g[g[g[g[g[g[gy[gr[gk[gd[g][gV[gO[gH[gA[g:[g3[g,[g%[g[g[g[g [g[gZgZgZgZgZgZgZgZgZgZgZgZgZgZgZgZgZgZg}ZgvZgoZghZgaZgZZgSZgLZgEZg>Zg7Zg0Zg)Zg"ZgZgZg ZgZgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgzYgsYglYgeYg^YgWYgPYgIYgBYg;Yg4Yg-Yg&YgYgYgYg YgYgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXg~XgwXgpXgiXgbXg[XgTXgMXgFXg?Xg8Xg1Xg*Xg#XgXgXgXgXgXgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWg{WgtWgmWgfWg_WgXWgQWgJWgCWgSg7Sg0Sg)Sg"SgSgSg SgSgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgzRgsRglRgeRg^RgWRgPRgIRgBRg;Rg4Rg-Rg&RgRgRgRg RgRgQgQgQgQgQgQgQgQgQgQgQgQgQgQgQgQgQgQg~QgwQgpQgiQgbQg[QgTQgMQgFQg?Qg8Qg1Qg*Qg#QgQgQgQgQgQgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPg{PgtPgmPgfPg_PgXPgQPgJPgCPgLg7Lg0Lg)Lg"LgLgLg LgLgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgzKgsKglKgeKg^KgWKgPKgIKgBKg;Kg4Kg-Kg&KgKgKgKg KgKgJgJgJgJgJgJgJgJgJgJgJgJgJgJgJgJgJgJg~JgwJgpJgiJgbJg[JgTJgMJgFJg?Jg8Jg1Jg*Jg#JgJgJgJgJgJgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIg{IgtIgmIgfIg_IgXIgQIgJIgCIgEg7Eg0Eg)Eg"EgEgEg EgEgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgzDgsDglDgeDg^DgWDgPDgIDgBDg;Dg4Dg-Dg&DgDgDgDg DgDgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCg~CgwCgpCgiCgbCg[CgTCgMCgFCg?Cg8Cg1Cg*Cg#CgCgCgCgCgCgBgBgBgBgBgBgBgBgBgBgBgBgBgBgBgBgBgBg{BgtBgmBgfBg_BgXBgQBgJBgCBgg>g>g>g>g>g>g>g>g>g>g>g>g>g>g>g>g>g}>gv>go>gh>ga>gZ>gS>gL>gE>g>>g7>g0>g)>g">g>g>g >g>g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=gz=gs=gl=ge=g^=gW=gP=gI=gB=g;=g4=g-=g&=g=g=g=g =g=g7g77g07g)7g"7g7g7g 7g7g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6gz6gs6gl6ge6g^6gW6gP6gI6gB6g;6g46g-6g&6g6g6g6g 6g6g5g5g5g5g5g5g5g5g5g5g5g5g5g5g5g5g5g5g~5gw5gp5gi5gb5g[5gT5gM5gF5g?5g85g15g*5g#5g5g5g5g5g5g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g{4gt4gm4gf4g_4gX4gQ4gJ4gC4g<4g54g.4g'4g 4g4g4g 4g4g3g3g3g3g3g3g3g3g3g3g3g3g3g3g3g3g3g3g3gx3gq3gj3gc3g\3gU3gN3gG3g@3g93g23g+3g$3g3g3g3g3g3g2g2g2g2g2g2g2g2g2g2g2g2g2g2g2g2g2g2g|2gu2gn2gg2g`2gY2gR2gK2gD2g=2g62g/2g(2g!2g2g2g 2g2g1g1g1g1g1g1g1g1g1g1g1g1g1g1g1g1g1g1g1gy1gr1gk1gd1g]1gV1gO1gH1gA1g:1g31g,1g%1g1g1g1g 1g1g0g0g0g0g0g0g0g0g0g0g0g0g0g0g0g0g0g0g}0gv0go0gh0ga0gZ0gS0gL0gE0g>0g70g00g)0g"0g0g0g 0g0g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/gz/gs/gl/ge/g^/gW/gP/gI/gB/g;/g4/g-/g&/g/g/g/g /g/g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g~.gw.gp.gi.gb.g[.gT.gM.gF.g?.g8.g1.g*.g#.g.g.g.g.g.g-g-g-g-g-g-g-g-g-g-g-g-g-g-g-g-g-g-g{-gt-gm-gf-g_-gX-gQ-gJ-gC-g<-g5-g.-g'-g -g-g-g -g-g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,gx,gq,gj,gc,g\,gU,gN,gG,g@,g9,g2,g+,g$,g,g,g,g,g,g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g|+gu+gn+gg+g`+gY+gR+gK+gD+g=+g6+g/+g(+g!+g+g+g +g+g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*gy*gr*gk*gd*g]*gV*gO*gH*gA*g:*g3*g,*g%*g*g*g*g *g*g)g)g)g)g)g)g)g)g)g)g)g)g)g)g)g)g)g)g})gv)go)gh)ga)gZ)gS)gL)gE)g>)g7)g0)g))g")g)g)g )g)g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(gz(gs(gl(ge(g^(gW(gP(gI(gB(g;(g4(g-(g&(g(g(g(g (g(g'g'g'g'g'g'g'g'g'g'g'g'g'g'g'g'g'g'g~'gw'gp'gi'gb'g['gT'gM'gF'g?'g8'g1'g*'g#'g'g'g'g'g'g&g&g&g&g&g&g&g&g&g&g&g&g&g&g&g&g&g&g{&gt&gm&gf&g_&gX&gQ&gJ&gC&g<&g5&g.&g'&g &g&g&g &g&g%g%g%g%g%g%g%g%g%g%g%g%g%g%g%g%g%g%g%gx%gq%gj%gc%g\%gU%gN%gG%g@%g9%g2%g+%g$%g%g%g%g%g%g$g$g$g$g$g$g$g$g$g$g$g$g$g$g$g$g$g$g|$gu$gn$gg$g`$gY$gR$gK$gD$g=$g6$g/$g($g!$g$g$g $g$g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#gy#gr#gk#gd#g]#gV#gO#gH#gA#g:#g3#g,#g%#g#g#g#g #g#g"g"g"g"g"g"g"g"g"g"g"g"g"g"g"g"g"g"g}"gv"go"gh"ga"gZ"gS"gL"gE"g>"g7"g0"g)"g""g"g"g "g"g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!gz!gs!gl!ge!g^!gW!gP!gI!gB!g;!g4!g-!g&!g!g!g!g !g!g g g g g g g g g g g g g g g g g g g~ gw gp gi gb g[ gT gM gF g? g8 g1 g* g# g g g g g ggggggggggggggggggg{gtgmgfg_gXgQgJgCg<g5g.g'g ggg gggggggggggggggggggggxgqgjgcg\gUgNgGg@g9g2g+g$gggggggggggggggggggggggg|gugnggg`gYgRgKgDg=g6g/g(g!ggg gggggggggggggggggggggygrgkgdg]gVgOgHgAg:g3g,g%gggg gggggggggggggggggggg}gvgoghgagZgSgLgEg>g7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCg<g5g.g'g ggg gggggggggggggggggggggxgqgjgcg\gUgNgGg@g9g2g+g$gggggggggggggggggggggggg|gugnggg`gYgRgKgDg=g6g/g(g!ggg gggggggggggggggggggggygrgkgdg]gVgOgHgAg:g3g,g%gggg gggggggggggggggggggg}gvgoghgagZgSgLgEg>g7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCg<g5g.g'g ggg gggggggggggggggggggggxgqgjgcg\gUgNgGg@g9g2g+g$gggggggggggggggggggggggg|gugnggg`gYgRgKgDg=g6g/g(g!ggg gggggggggggggggggggggygrgkgdg]gVgOgHgAg:g3g,g%gggg gg g g g g g g g g g g g g g g g g g g} gv go gh ga gZ gS gL gE g> g7 g0 g) g" g g g g g g g g g g g g g g g g g g g g g g g gz gs gl ge g^ gW gP gI gB g; g4 g- g& g g g g g g g g g g g g g g g g g g g g g g g g~ gw gp gi gb g[ gT gM gF g? g8 g1 g* g# g g g g g g g g g g g g g g g g g g g g g g g g{ gt gm gf g_ gX gQ gJ gC g< g5 g. g' g g g g g g g g g g g g g g g g g g g g g g g g gx gq gj gc g\ gU gN gG g@ g9 g2 g+ g$ g g g g g ggggggggggggggggggg|gugnggg`gYgRgKgDg=g6g/g(g!ggg gggggggggggggggggggggygrgkgdg]gVgOgHgAg:g3g,g%gggg gggggggggggggggggggg}gvgoghgagZgSgLgEg>g7g0g)g"ggg gggggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg gggggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#gggggggggggggggggggggggg{gtgmgfg_gXgQgJgCg<g5g.g'g ggg gggggggggggggggggggggxgqgjgcg\gUgNgGg@g9g2g+g$gggggggggggggggggggggggg|gugnggg`gYgRgKgDg=g6g/g(g!ggg gggggggggggggggggggggygrgkgdg]gVgOgHgAg:g3g,g%gggg ggffffffffffffffffff}fvfofhfafZfSfLfEf>f7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffܿfտfοfǿfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff fffffffپfҾf˾fľffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffݽfֽfϽfȽfffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffܸfոfθfǸfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff fffffffٷfҷf˷fķffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffݶfֶf϶fȶfffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffܱfձfαfDZfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff fffffffٰfҰf˰fİffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffݯf֯fϯfȯfffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffܪfժfΪfǪfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff fffffff٩fҩf˩fĩffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffݨf֨fϨfȨfffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffܣfգfΣfǣfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff fffffff٢fҢfˢfĢffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffݡf֡fϡfȡfffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffܜf՜fΜfǜfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff fffffffٛfқf˛fěffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffݚf֚fϚfȚfffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffffܕfՕfΕfǕfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff fffffffٔfҔf˔fĔffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffݓf֓fϓfȓfffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffff܎fՎfΎfǎfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff fffffffٍfҍfˍfčffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffff݌f֌fόfȌfffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffff܇fՇf·fLJfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff fffffffنf҆fˆfĆffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffff݅fօfυfȅfffffffffff{ftfmfff_fXfQfJfCff7f0f)f"fff fffffff܀fՀf΀fǀfffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffff~f~f~f~f~f~f~f~f~f~f~f~f~f~f~f~f~f~f{~ft~fm~ff~f_~fX~fQ~fJ~fC~f<~f5~f.~f'~f ~f~f~f ~f~f}f}f}f}f}f}f}f}f}f}f}f}f}f}f}f}f}f}f}fx}fq}fj}fc}f\}fU}fN}fG}f@}f9}f2}f+}f$}f}f}f}f}f}f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f||fu|fn|fg|f`|fY|fR|fK|fD|f=|f6|f/|f(|f!|f|f|f |f|f{f{f{f{f{f{f{f{f{f{f{f{f{f{f{f{f{f{f{fy{fr{fk{fd{f]{fV{fO{fH{fA{f:{f3{f,{f%{f{f{f{f {f{fzfzfzfzfzfzfzfzfzfzfzfzfzfzfzfzfzfzf}zfvzfozfhzfazfZzfSzfLzfEzf>zf7zf0zf)zf"zfzfzf zfzfyfyfyfyfyfyfyfyfyfyfyfyfyfyfyfyfyfyfyfzyfsyflyfeyf^yfWyfPyfIyfByf;yf4yf-yf&yfyfyfyf yfyfxfxfxfxfxfxfxfxfxfxfxfxfxfxfxfxfxfxf~xfwxfpxfixfbxf[xfTxfMxfFxf?xf8xf1xf*xf#xfxfxfxfxfxfwfwfwfwfwfwfwfwfwfwfwfwfwfwfwfwfwfwf{wftwfmwffwf_wfXwfQwfJwfCwfsf7sf0sf)sf"sfsfsf sfsfrfrfrfrfrfrfrfrfrfrfrfrfrfrfrfrfrfrfrfzrfsrflrferf^rfWrfPrfIrfBrf;rf4rf-rf&rfrfrfrf rfrfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqf~qfwqfpqfiqfbqf[qfTqfMqfFqf?qf8qf1qf*qf#qfqfqfqfqfqfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpf{pftpfmpffpf_pfXpfQpfJpfCpflf7lf0lf)lf"lflflf lflfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfzkfskflkfekf^kfWkfPkfIkfBkf;kf4kf-kf&kfkfkfkf kfkfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjf~jfwjfpjfijfbjf[jfTjfMjfFjf?jf8jf1jf*jf#jfjfjfjfjfjfifififififififififififififififififif{iftifmiffif_ifXifQifJifCifef7ef0ef)ef"efefef efefdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfzdfsdfldfedf^dfWdfPdfIdfBdf;df4df-df&dfdfdfdf dfdfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf~cfwcfpcficfbcf[cfTcfMcfFcf?cf8cf1cf*cf#cfcfcfcfcfcfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbf{bftbfmbffbf_bfXbfQbfJbfCbf^f7^f0^f)^f"^f^f^f ^f^f]f]f]f]f]f]f]f]f]f]f]f]f]f]f]f]f]f]f]fz]fs]fl]fe]f^]fW]fP]fI]fB]f;]f4]f-]f&]f]f]f]f ]f]f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f~\fw\fp\fi\fb\f[\fT\fM\fF\f?\f8\f1\f*\f#\f\f\f\f\f\f[f[f[f[f[f[f[f[f[f[f[f[f[f[f[f[f[f[f{[ft[fm[ff[f_[fX[fQ[fJ[fC[f<[f5[f.[f'[f [f[f[f [f[fZfZfZfZfZfZfZfZfZfZfZfZfZfZfZfZfZfZfZfxZfqZfjZfcZf\ZfUZfNZfGZf@Zf9Zf2Zf+Zf$ZfZfZfZfZfZfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYf|YfuYfnYfgYf`YfYYfRYfKYfDYf=Yf6Yf/Yf(Yf!YfYfYf YfYfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfyXfrXfkXfdXf]XfVXfOXfHXfAXf:Xf3Xf,Xf%XfXfXfXf XfXfWfWfWfWfWfWfWfWfWfWfWfWfWfWfWfWfWfWf}WfvWfoWfhWfaWfZWfSWfLWfEWf>Wf7Wf0Wf)Wf"WfWfWf WfWfVfVfVfVfVfVfVfVfVfVfVfVfVfVfVfVfVfVfVfzVfsVflVfeVf^VfWVfPVfIVfBVf;Vf4Vf-Vf&VfVfVfVf VfVfUfUfUfUfUfUfUfUfUfUfUfUfUfUfUfUfUfUf~UfwUfpUfiUfbUf[UfTUfMUfFUf?Uf8Uf1Uf*Uf#UfUfUfUfUfUfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTf{TftTfmTffTf_TfXTfQTfJTfCTfPf7Pf0Pf)Pf"PfPfPf PfPfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfzOfsOflOfeOf^OfWOfPOfIOfBOf;Of4Of-Of&OfOfOfOf OfOfNfNfNfNfNfNfNfNfNfNfNfNfNfNfNfNfNfNf~NfwNfpNfiNfbNf[NfTNfMNfFNf?Nf8Nf1Nf*Nf#NfNfNfNfNfNfMfMfMfMfMfMfMfMfMfMfMfMfMfMfMfMfMfMf{MftMfmMffMf_MfXMfQMfJMfCMfIf7If0If)If"IfIfIf IfIfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfzHfsHflHfeHf^HfWHfPHfIHfBHf;Hf4Hf-Hf&HfHfHfHf HfHfGfGfGfGfGfGfGfGfGfGfGfGfGfGfGfGfGfGf~GfwGfpGfiGfbGf[GfTGfMGfFGf?Gf8Gf1Gf*Gf#GfGfGfGfGfGfFfFfFfFfFfFfFfFfFfFfFfFfFfFfFfFfFfFf{FftFfmFffFf_FfXFfQFfJFfCFfBf7Bf0Bf)Bf"BfBfBf BfBfAfAfAfAfAfAfAfAfAfAfAfAfAfAfAfAfAfAfAfzAfsAflAfeAf^AfWAfPAfIAfBAf;Af4Af-Af&AfAfAfAf AfAf@f@f@f@f@f@f@f@f@f@f@f@f@f@f@f@f@f@f~@fw@fp@fi@fb@f[@fT@fM@fF@f?@f8@f1@f*@f#@f@f@f@f@f@f?f?f?f?f?f?f?f?f?f?f?f?f?f?f?f?f?f?f{?ft?fm?ff?f_?fX?fQ?fJ?fC?ff>f>f>f>f>f>f>f>f>f>f>f>f>f>f>f>f>f>fx>fq>fj>fc>f\>fU>fN>fG>f@>f9>f2>f+>f$>f>f>f>f>f>f=f=f=f=f=f=f=f=f=f=f=f=f=f=f=f=f=f=f|=fu=fn=fg=f`=fY=fR=fK=fD=f==f6=f/=f(=f!=f=f=f =f=f;f7;f0;f);f";f;f;f ;f;f:f:f:f:f:f:f:f:f:f:f:f:f:f:f:f:f:f:f:fz:fs:fl:fe:f^:fW:fP:fI:fB:f;:f4:f-:f&:f:f:f:f :f:f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f~9fw9fp9fi9fb9f[9fT9fM9fF9f?9f89f19f*9f#9f9f9f9f9f9f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f{8ft8fm8ff8f_8fX8fQ8fJ8fC8f<8f58f.8f'8f 8f8f8f 8f8f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fx7fq7fj7fc7f\7fU7fN7fG7f@7f97f27f+7f$7f7f7f7f7f7f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f|6fu6fn6fg6f`6fY6fR6fK6fD6f=6f66f/6f(6f!6f6f6f 6f6f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5fy5fr5fk5fd5f]5fV5fO5fH5fA5f:5f35f,5f%5f5f5f5f 5f5f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f}4fv4fo4fh4fa4fZ4fS4fL4fE4f>4f74f04f)4f"4f4f4f 4f4f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3fz3fs3fl3fe3f^3fW3fP3fI3fB3f;3f43f-3f&3f3f3f3f 3f3f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f~2fw2fp2fi2fb2f[2fT2fM2fF2f?2f82f12f*2f#2f2f2f2f2f2f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f{1ft1fm1ff1f_1fX1fQ1fJ1fC1f<1f51f.1f'1f 1f1f1f 1f1f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0fx0fq0fj0fc0f\0fU0fN0fG0f@0f90f20f+0f$0f0f0f0f0f0f/f/f/f/f/f/f/f/f/f/f/f/f/f/f/f/f/f/f|/fu/fn/fg/f`/fY/fR/fK/fD/f=/f6/f//f(/f!/f/f/f /f/f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.fy.fr.fk.fd.f].fV.fO.fH.fA.f:.f3.f,.f%.f.f.f.f .f.f-f-f-f-f-f-f-f-f-f-f-f-f-f-f-f-f-f-f}-fv-fo-fh-fa-fZ-fS-fL-fE-f>-f7-f0-f)-f"-f-f-f -f-f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,fz,fs,fl,fe,f^,fW,fP,fI,fB,f;,f4,f-,f&,f,f,f,f ,f,f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f~+fw+fp+fi+fb+f[+fT+fM+fF+f?+f8+f1+f*+f#+f+f+f+f+f+f*f*f*f*f*f*f*f*f*f*f*f*f*f*f*f*f*f*f{*ft*fm*ff*f_*fX*fQ*fJ*fC*f<*f5*f.*f'*f *f*f*f *f*f)f)f)f)f)f)f)f)f)f)f)f)f)f)f)f)f)f)f)fx)fq)fj)fc)f\)fU)fN)fG)f@)f9)f2)f+)f$)f)f)f)f)f)f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f|(fu(fn(fg(f`(fY(fR(fK(fD(f=(f6(f/(f((f!(f(f(f (f(f'f'f'f'f'f'f'f'f'f'f'f'f'f'f'f'f'f'f'fy'fr'fk'fd'f]'fV'fO'fH'fA'f:'f3'f,'f%'f'f'f'f 'f'f&f&f&f&f&f&f&f&f&f&f&f&f&f&f&f&f&f&f}&fv&fo&fh&fa&fZ&fS&fL&fE&f>&f7&f0&f)&f"&f&f&f &f&f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%fz%fs%fl%fe%f^%fW%fP%fI%fB%f;%f4%f-%f&%f%f%f%f %f%f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f~$fw$fp$fi$fb$f[$fT$fM$fF$f?$f8$f1$f*$f#$f$f$f$f$f$f#f#f#f#f#f#f#f#f#f#f#f#f#f#f#f#f#f#f{#ft#fm#ff#f_#fX#fQ#fJ#fC#f<#f5#f.#f'#f #f#f#f #f#f"f"f"f"f"f"f"f"f"f"f"f"f"f"f"f"f"f"f"fx"fq"fj"fc"f\"fU"fN"fG"f@"f9"f2"f+"f$"f"f"f"f"f"f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f|!fu!fn!fg!f`!fY!fR!fK!fD!f=!f6!f/!f(!f!!f!f!f !f!f f f f f f f f f f f f f f f f f f f fy fr fk fd f] fV fO fH fA f: f3 f, f% f f f f f fffffffffffffffffff}fvfofhfafZfSfLfEf>f7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCf<f5f.f'f fff fffffffffffffffffffffxfqfjfcf\fUfNfGf@f9f2f+f$ffffffffffffffffffffffff|fufnfgf`fYfRfKfDf=f6f/f(f!fff fffffffffffffffffffffyfrfkfdf]fVfOfHfAf:f3f,f%ffff ffffffffffffffffffff}fvfofhfafZfSfLfEf>f7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCf<f5f.f'f fff fffffffffffffffffffffxfqfjfcf\fUfNfGf@f9f2f+f$ffffffffffffffffffffffff|fufnfgf`fYfRfKfDf=f6f/f(f!fff fffffffffffffffffffffyfrfkfdf]fVfOfHfAf:f3f,f%ffff ffffffffffffffffffff}fvfofhfafZfSfLfEf>f7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCf<f5f.f'f fff ff f f f f f f f f f f f f f f f f f f fx fq fj fc f\ fU fN fG f@ f9 f2 f+ f$ f f f f f f f f f f f f f f f f f f f f f f f f| fu fn fg f` fY fR fK fD f= f6 f/ f( f! f f f f f f f f f f f f f f f f f f f f f f f fy fr fk fd f] fV fO fH fA f: f3 f, f% f f f f f f f f f f f f f f f f f f f f f f f f} fv fo fh fa fZ fS fL fE f> f7 f0 f) f" f f f f f f f f f f f f f f f f f f f f f f f fz fs fl fe f^ fW fP fI fB f; f4 f- f& f f f f f fffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCf<f5f.f'f fff fffffffffffffffffffffxfqfjfcf\fUfNfGf@f9f2f+f$ffffffffffffffffffffffff|fufnfgf`fYfRfKfDf=f6f/f(f!fff fffffffffffffffffffffyfrfkfdf]fVfOfHfAf:f3f,f%ffff ffffffffffffffffffff}fvfofhfafZfSfLfEf>f7f0f)f"fff fffffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffffffffffffffffffff{ftfmfff_fXfQfJfCf<f5f.f'f fff ffeeeeeeeeeeeeeeeeeeexeqejece\eUeNeGe@e9e2e+e$eeeeeeeeeeeeeeeeeeeeeeee|euenege`eYeReKeDe=e6e/e(e!eee eeeeeeeeeeeeeeeeeeeeeyerekede]eVeOeHeAe:e3e,e%eeee eeeeeeeeeeeeeeeeeeee}eveoeheaeZeSeLeEe>e7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeܼeռeμeǼeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeٻeһe˻eĻeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeݺeֺeϺeȺeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeܵeյeεeǵeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeٴeҴe˴eĴeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeݳeֳeϳeȳeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeܮeծeήeǮeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeee٭eҭe˭eĭeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeݬe֬eϬeȬeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeܧeէeΧeǧeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeee٦eҦe˦eĦeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeݥe֥eϥeȥeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeܠeՠeΠeǠeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeٟeҟe˟eğeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeݞe֞eϞeȞeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeܙeՙeΙeǙeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeee٘eҘe˘eĘeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeݗe֗eϗeȗeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeeeܒeՒeΒeǒeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeّeґeˑeđeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeݐe֐eϐeȐeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeee܋eՋe΋eNjeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeيeҊeˊeĊeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeee݉e։eωeȉeeeeeeeeeee{etemefe_eXeQeJeCee7e0e)e"eee eeeeeee܄eՄe΄eDŽeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeكe҃e˃eăeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeee݂eւeςeȂeeeeeeeeeee{etemefe_eXeQeJeCe~e7~e0~e)~e"~e~e~e ~e~e}e}e}e}e}e}e}e}e}e}e}e}e}e}e}e}e}e}e}ez}es}el}ee}e^}eW}eP}eI}eB}e;}e4}e-}e&}e}e}e}e }e}e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e~|ew|ep|ei|eb|e[|eT|eM|eF|e?|e8|e1|e*|e#|e|e|e|e|e|e{e{e{e{e{e{e{e{e{e{e{e{e{e{e{e{e{e{e{{et{em{ef{e_{eX{eQ{eJ{eC{e<{e5{e.{e'{e {e{e{e {e{ezezezezezezezezezezezezezezezezezezezexzeqzejzecze\zeUzeNzeGze@ze9ze2ze+ze$zezezezezezeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeye|yeuyenyegye`yeYyeRyeKyeDye=ye6ye/ye(ye!yeyeye yeyexexexexexexexexexexexexexexexexexexexeyxerxekxedxe]xeVxeOxeHxeAxe:xe3xe,xe%xexexexe xexewewewewewewewewewewewewewewewewewewe}wevweowehweaweZweSweLweEwe>we7we0we)we"wewewe wewevevevevevevevevevevevevevevevevevevevezvesvelveeve^veWvePveIveBve;ve4ve-ve&veveveve veveueueueueueueueueueueueueueueueueueue~uewuepueiuebue[ueTueMueFue?ue8ue1ue*ue#ueueueueueuetetetetetetetetetetetetetetetetetete{tettemtefte_teXteQteJteCtepe7pe0pe)pe"pepepe pepeoeoeoeoeoeoeoeoeoeoeoeoeoeoeoeoeoeoeoezoesoeloeeoe^oeWoePoeIoeBoe;oe4oe-oe&oeoeoeoe oeoenenenenenenenenenenenenenenenenenene~newnepneinebne[neTneMneFne?ne8ne1ne*ne#nenenenenenememememememememememememememememememe{metmemmefme_meXmeQmeJmeCmeie7ie0ie)ie"ieieie ieiehehehehehehehehehehehehehehehehehehehezheshelheehe^heWhePheIheBhe;he4he-he&hehehehe hehegegegegegegegegegegegegegegegegegege~gewgepgeigebge[geTgeMgeFge?ge8ge1ge*ge#gegegegegegefefefefefefefefefefefefefefefefefefe{fetfemfeffe_feXfeQfeJfeCfebe7be0be)be"bebebe bebeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaezaesaelaeeae^aeWaePaeIaeBae;ae4ae-ae&aeaeaeae aeae`e`e`e`e`e`e`e`e`e`e`e`e`e`e`e`e`e`e~`ew`ep`ei`eb`e[`eT`eM`eF`e?`e8`e1`e*`e#`e`e`e`e`e`e_e_e_e_e_e_e_e_e_e_e_e_e_e_e_e_e_e_e{_et_em_ef_e__eX_eQ_eJ_eC_e<_e5_e._e'_e _e_e_e _e_e^e^e^e^e^e^e^e^e^e^e^e^e^e^e^e^e^e^e^ex^eq^ej^ec^e\^eU^eN^eG^e@^e9^e2^e+^e$^e^e^e^e^e^e]e]e]e]e]e]e]e]e]e]e]e]e]e]e]e]e]e]e|]eu]en]eg]e`]eY]eR]eK]eD]e=]e6]e/]e(]e!]e]e]e ]e]e\e\e\e\e\e\e\e\e\e\e\e\e\e\e\e\e\e\e\ey\er\ek\ed\e]\eV\eO\eH\eA\e:\e3\e,\e%\e\e\e\e \e\e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e}[ev[eo[eh[ea[eZ[eS[eL[eE[e>[e7[e0[e)[e"[e[e [e[eZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZezZesZelZeeZe^ZeWZePZeIZeBZe;Ze4Ze-Ze&ZeZeZeZe ZeZeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYe~YewYepYeiYebYe[YeTYeMYeFYe?Ye8Ye1Ye*Ye#YeYeYeYeYeYeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXe{XetXemXefXe_XeXXeQXeJXeCXeTe7Te0Te)Te"TeTeTe TeTeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSezSesSelSeeSe^SeWSePSeISeBSe;Se4Se-Se&SeSeSeSe SeSeReReReReReReReReReReReReReReReReReRe~RewRepReiRebRe[ReTReMReFRe?Re8Re1Re*Re#ReReReReReReQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQe{QetQemQefQe_QeXQeQQeJQeCQeMe7Me0Me)Me"MeMeMe MeMeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLezLesLelLeeLe^LeWLePLeILeBLe;Le4Le-Le&LeLeLeLe LeLeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKe~KewKepKeiKebKe[KeTKeMKeFKe?Ke8Ke1Ke*Ke#KeKeKeKeKeKeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJeJe{JetJemJefJe_JeXJeQJeJJeCJeFe7Fe0Fe)Fe"FeFeFe FeFeEeEeEeEeEeEeEeEeEeEeEeEeEeEeEeEeEeEeEezEesEelEeeEe^EeWEePEeIEeBEe;Ee4Ee-Ee&EeEeEeEe EeEeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDe~DewDepDeiDebDe[DeTDeMDeFDe?De8De1De*De#DeDeDeDeDeDeCeCeCeCeCeCeCeCeCeCeCeCeCeCeCeCeCeCe{CetCemCefCe_CeXCeQCeJCeCCe?e7?e0?e)?e"?e?e?e ?e?e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>ez>es>el>ee>e^>eW>eP>eI>eB>e;>e4>e->e&>e>e>e>e >e>e=e=e=e=e=e=e=e=e=e=e=e=e=e=e=e=e=e=e~=ew=ep=ei=eb=e[=eT=eM=eF=e?=e8=e1=e*=e#=e=e=e=e=e=e8e78e08e)8e"8e8e8e 8e8e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7ez7es7el7ee7e^7eW7eP7eI7eB7e;7e47e-7e&7e7e7e7e 7e7e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e~6ew6ep6ei6eb6e[6eT6eM6eF6e?6e86e16e*6e#6e6e6e6e6e6e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e{5et5em5ef5e_5eX5eQ5eJ5eC5e<5e55e.5e'5e 5e5e5e 5e5e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4ex4eq4ej4ec4e\4eU4eN4eG4e@4e94e24e+4e$4e4e4e4e4e4e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e|3eu3en3eg3e`3eY3eR3eK3eD3e=3e63e/3e(3e!3e3e3e 3e3e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2ey2er2ek2ed2e]2eV2eO2eH2eA2e:2e32e,2e%2e2e2e2e 2e2e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e}1ev1eo1eh1ea1eZ1eS1eL1eE1e>1e71e01e)1e"1e1e1e 1e1e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0ez0es0el0ee0e^0eW0eP0eI0eB0e;0e40e-0e&0e0e0e0e 0e0e/e/e/e/e/e/e/e/e/e/e/e/e/e/e/e/e/e/e~/ew/ep/ei/eb/e[/eT/eM/eF/e?/e8/e1/e*/e#/e/e/e/e/e/e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e{.et.em.ef.e_.eX.eQ.eJ.eC.e<.e5.e..e'.e .e.e.e .e.e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-ex-eq-ej-ec-e\-eU-eN-eG-e@-e9-e2-e+-e$-e-e-e-e-e-e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e|,eu,en,eg,e`,eY,eR,eK,eD,e=,e6,e/,e(,e!,e,e,e ,e,e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+ey+er+ek+ed+e]+eV+eO+eH+eA+e:+e3+e,+e%+e+e+e+e +e+e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e}*ev*eo*eh*ea*eZ*eS*eL*eE*e>*e7*e0*e)*e"*e*e*e *e*e)e)e)e)e)e)e)e)e)e)e)e)e)e)e)e)e)e)e)ez)es)el)ee)e^)eW)eP)eI)eB)e;)e4)e-)e&)e)e)e)e )e)e(e(e(e(e(e(e(e(e(e(e(e(e(e(e(e(e(e(e~(ew(ep(ei(eb(e[(eT(eM(eF(e?(e8(e1(e*(e#(e(e(e(e(e(e'e'e'e'e'e'e'e'e'e'e'e'e'e'e'e'e'e'e{'et'em'ef'e_'eX'eQ'eJ'eC'e<'e5'e.'e''e 'e'e'e 'e'e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&ex&eq&ej&ec&e\&eU&eN&eG&e@&e9&e2&e+&e$&e&e&e&e&e&e%e%e%e%e%e%e%e%e%e%e%e%e%e%e%e%e%e%e|%eu%en%eg%e`%eY%eR%eK%eD%e=%e6%e/%e(%e!%e%e%e %e%e$e$e$e$e$e$e$e$e$e$e$e$e$e$e$e$e$e$e$ey$er$ek$ed$e]$eV$eO$eH$eA$e:$e3$e,$e%$e$e$e$e $e$e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e}#ev#eo#eh#ea#eZ#eS#eL#eE#e>#e7#e0#e)#e"#e#e#e #e#e"e"e"e"e"e"e"e"e"e"e"e"e"e"e"e"e"e"e"ez"es"el"ee"e^"eW"eP"eI"eB"e;"e4"e-"e&"e"e"e"e "e"e!e!e!e!e!e!e!e!e!e!e!e!e!e!e!e!e!e!e~!ew!ep!ei!eb!e[!eT!eM!eF!e?!e8!e1!e*!e#!e!e!e!e!e!e e e e e e e e e e e e e e e e e e e{ et em ef e_ eX eQ eJ eC e< e5 e. e' e e e e e eeeeeeeeeeeeeeeeeeeexeqejece\eUeNeGe@e9e2e+e$eeeeeeeeeeeeeeeeeeeeeeee|euenege`eYeReKeDe=e6e/e(e!eee eeeeeeeeeeeeeeeeeeeeeyerekede]eVeOeHeAe:e3e,e%eeee eeeeeeeeeeeeeeeeeeee}eveoeheaeZeSeLeEe>e7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCe<e5e.e'e eee eeeeeeeeeeeeeeeeeeeeexeqejece\eUeNeGe@e9e2e+e$eeeeeeeeeeeeeeeeeeeeeeee|euenege`eYeReKeDe=e6e/e(e!eee eeeeeeeeeeeeeeeeeeeeeyerekede]eVeOeHeAe:e3e,e%eeee eeeeeeeeeeeeeeeeeeee}eveoeheaeZeSeLeEe>e7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCe<e5e.e'e eee eeeeeeeeeeeeeeeeeeeeexeqejece\eUeNeGe@e9e2e+e$eeeeeeeeeeeeeeeeeeeeeeee|euenege`eYeReKeDe=e6e/e(e!eee eeeeeeeeeeeeeeeeeeeeeyerekede]eVeOeHeAe:e3e,e%eeee eeeeeeeeeeeeeeeeeeee}eveoeheaeZeSeLeEe>e7e0e)e"eee ee e e e e e e e e e e e e e e e e e e ez es el ee e^ eW eP eI eB e; e4 e- e& e e e e e e e e e e e e e e e e e e e e e e e e~ ew ep ei eb e[ eT eM eF e? e8 e1 e* e# e e e e e e e e e e e e e e e e e e e e e e e e{ et em ef e_ eX eQ eJ eC e< e5 e. e' e e e e e e e e e e e e e e e e e e e e e e e e ex eq ej ec e\ eU eN eG e@ e9 e2 e+ e$ e e e e e e e e e e e e e e e e e e e e e e e e| eu en eg e` eY eR eK eD e= e6 e/ e( e! e e e e eeeeeeeeeeeeeeeeeeeeyerekede]eVeOeHeAe:e3e,e%eeee eeeeeeeeeeeeeeeeeeee}eveoeheaeZeSeLeEe>e7e0e)e"eee eeeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eeeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCe<e5e.e'e eee eeeeeeeeeeeeeeeeeeeeexeqejece\eUeNeGe@e9e2e+e$eeeeeeeeeeeeeeeeeeeeeeee|euenege`eYeReKeDe=e6e/e(e!eee eeeeeeeeeeeeeeeeeeeeeyerekede]eVeOeHeAe:e3e,e%eeee eeeeeeeeeeeeeeeeeeee}eveoeheaeZeSeLeEe>e7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddٿdҿd˿dĿdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddddddݾd־dϾdȾddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddܹdչdιdǹdddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddٸdҸd˸dĸdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddddddݷdַdϷdȷddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddܲdղdβdDzdddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddٱdұd˱dıdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddddddݰdְdϰdȰddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddܫdիdΫdǫdddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddddddd٪dҪd˪dĪdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddddddݩd֩dϩdȩddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddܤdդdΤdǤdddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddddddd٣dңdˣdģdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddddddݢd֢dϢdȢddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddܝd՝dΝdǝdddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddٜdҜd˜dĜdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddddddݛd֛dϛdțddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd dddddddܖdՖdΖdǖdddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddٕdҕd˕dĕdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddddddݔd֔dϔdȔddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd ddddddd܏dՏdΏdǏdddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddَdҎdˎdĎdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddddddݍd֍dύdȍddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd ddddddd܈dՈdΈdLjdddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddهd҇dˇdćdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddd݆dֆdφdȆddddddddddd{dtdmdfd_dXdQdJdCdd7d0d)d"ddd ddddddd܁dՁd΁dǁdddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddـdҀdˀdĀdddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCd<d5d.d'd ddd dd~d~d~d~d~d~d~d~d~d~d~d~d~d~d~d~d~d~d~dx~dq~dj~dc~d\~dU~dN~dG~d@~d9~d2~d+~d$~d~d~d~d~d~d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d|}du}dn}dg}d`}dY}dR}dK}dD}d=}d6}d/}d(}d!}d}d}d }d}d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|dy|dr|dk|dd|d]|dV|dO|dH|dA|d:|d3|d,|d%|d|d|d|d |d|d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d}{dv{do{dh{da{dZ{dS{dL{dE{d>{d7{d0{d){d"{d{d{d {d{dzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzzdszdlzdezd^zdWzdPzdIzdBzd;zd4zd-zd&zdzdzdzd zdzdydydydydydydydydydydydydydydydydydyd~ydwydpydiydbyd[ydTydMydFyd?yd8yd1yd*yd#ydydydydydydxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxd{xdtxdmxdfxd_xdXxdQxdJxdCxdtd7td0td)td"tdtdtd tdtdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdzsdssdlsdesd^sdWsdPsdIsdBsd;sd4sd-sd&sdsdsdsd sdsdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrd~rdwrdprdirdbrd[rdTrdMrdFrd?rd8rd1rd*rd#rdrdrdrdrdrdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqd{qdtqdmqdfqd_qdXqdQqdJqdCqdmd7md0md)md"mdmdmd mdmdldldldldldldldldldldldldldldldldldldldzldsldlldeld^ldWldPldIldBld;ld4ld-ld&ldldldld ldldkdkdkdkdkdkdkdkdkdkdkdkdkdkdkdkdkdkd~kdwkdpkdikdbkd[kdTkdMkdFkd?kd8kd1kd*kd#kdkdkdkdkdkdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjd{jdtjdmjdfjd_jdXjdQjdJjdCjdfd7fd0fd)fd"fdfdfd fdfdedededededededededededededededededededzedsedledeed^edWedPedIedBed;ed4ed-ed&edededed ededdddddddddddddddddddddddddddddddddddd~ddwddpddiddbdd[ddTddMddFdd?dd8dd1dd*dd#ddddddddddddcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd{cdtcdmcdfcd_cdXcdQcdJcdCcd_d7_d0_d)_d"_d_d_d _d_d^d^d^d^d^d^d^d^d^d^d^d^d^d^d^d^d^d^d^dz^ds^dl^de^d^^dW^dP^dI^dB^d;^d4^d-^d&^d^d^d^d ^d^d]d]d]d]d]d]d]d]d]d]d]d]d]d]d]d]d]d]d~]dw]dp]di]db]d[]dT]dM]dF]d?]d8]d1]d*]d#]d]d]d]d]d]d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d{\dt\dm\df\d_\dX\dQ\dJ\dC\d<\d5\d.\d'\d \d\d\d \d\d[d[d[d[d[d[d[d[d[d[d[d[d[d[d[d[d[d[d[dx[dq[dj[dc[d\[dU[dN[dG[d@[d9[d2[d+[d$[d[d[d[d[d[dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd|ZduZdnZdgZd`ZdYZdRZdKZdDZd=Zd6Zd/Zd(Zd!ZdZdZd ZdZdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdyYdrYdkYddYd]YdVYdOYdHYdAYd:Yd3Yd,Yd%YdYdYdYd YdYdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXd}XdvXdoXdhXdaXdZXdSXdLXdEXd>Xd7Xd0Xd)Xd"XdXdXd XdXdWdWdWdWdWdWdWdWdWdWdWdWdWdWdWdWdWdWdWdzWdsWdlWdeWd^WdWWdPWdIWdBWd;Wd4Wd-Wd&WdWdWdWd WdWdVdVdVdVdVdVdVdVdVdVdVdVdVdVdVdVdVdVd~VdwVdpVdiVdbVd[VdTVdMVdFVd?Vd8Vd1Vd*Vd#VdVdVdVdVdVdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUd{UdtUdmUdfUd_UdXUdQUdJUdCUdQd7Qd0Qd)Qd"QdQdQd QdQdPdPdPdPdPdPdPdPdPdPdPdPdPdPdPdPdPdPdPdzPdsPdlPdePd^PdWPdPPdIPdBPd;Pd4Pd-Pd&PdPdPdPd PdPdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOd~OdwOdpOdiOdbOd[OdTOdMOdFOd?Od8Od1Od*Od#OdOdOdOdOdOdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNd{NdtNdmNdfNd_NdXNdQNdJNdCNdJd7Jd0Jd)Jd"JdJdJd JdJdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdzIdsIdlIdeId^IdWIdPIdIIdBId;Id4Id-Id&IdIdIdId IdIdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHd~HdwHdpHdiHdbHd[HdTHdMHdFHd?Hd8Hd1Hd*Hd#HdHdHdHdHdHdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGd{GdtGdmGdfGd_GdXGdQGdJGdCGdCd7Cd0Cd)Cd"CdCdCd CdCdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdzBdsBdlBdeBd^BdWBdPBdIBdBBd;Bd4Bd-Bd&BdBdBdBd BdBdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAd~AdwAdpAdiAdbAd[AdTAdMAdFAd?Ad8Ad1Ad*Ad#AdAdAdAdAdAd@d@d@d@d@d@d@d@d@d@d@d@d@d@d@d@d@d@d{@dt@dm@df@d_@dX@dQ@dJ@dC@d<@d5@d.@d'@d @d@d@d @d@d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?dx?dq?dj?dc?d\?dU?dN?dG?d@?d9?d2?d+?d$?d?d?d?d?d?d>d>d>d>d>d>d>d>d>d>d>d>d>d>d>d>d>d>d|>du>dn>dg>d`>dY>dR>dK>dD>d=>d6>d/>d(>d!>d>d>d >d>d=d=d=d=d=d=d=d=d=d=d=d=d=d=d=d=d=d=d=dy=dr=dk=dd=d]=dV=dO=dH=dA=d:=d3=d,=d%=d=d=d=d =d=d5d75d05d)5d"5d5d5d 5d5d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4dz4ds4dl4de4d^4dW4dP4dI4dB4d;4d44d-4d&4d4d4d4d 4d4d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d~3dw3dp3di3db3d[3dT3dM3dF3d?3d83d13d*3d#3d3d3d3d3d3d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d{2dt2dm2df2d_2dX2dQ2dJ2dC2d<2d52d.2d'2d 2d2d2d 2d2d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1dx1dq1dj1dc1d\1dU1dN1dG1d@1d91d21d+1d$1d1d1d1d1d1d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d|0du0dn0dg0d`0dY0dR0dK0dD0d=0d60d/0d(0d!0d0d0d 0d0d/d/d/d/d/d/d/d/d/d/d/d/d/d/d/d/d/d/d/dy/dr/dk/dd/d]/dV/dO/dH/dA/d:/d3/d,/d%/d/d/d/d /d/d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d}.dv.do.dh.da.dZ.dS.dL.dE.d>.d7.d0.d).d".d.d.d .d.d-d-d-d-d-d-d-d-d-d-d-d-d-d-d-d-d-d-d-dz-ds-dl-de-d^-dW-dP-dI-dB-d;-d4-d--d&-d-d-d-d -d-d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d~,dw,dp,di,db,d[,dT,dM,dF,d?,d8,d1,d*,d#,d,d,d,d,d,d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d{+dt+dm+df+d_+dX+dQ+dJ+dC+d<+d5+d.+d'+d +d+d+d +d+d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*dx*dq*dj*dc*d\*dU*dN*dG*d@*d9*d2*d+*d$*d*d*d*d*d*d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d|)du)dn)dg)d`)dY)dR)dK)dD)d=)d6)d/)d()d!)d)d)d )d)d(d(d(d(d(d(d(d(d(d(d(d(d(d(d(d(d(d(d(dy(dr(dk(dd(d](dV(dO(dH(dA(d:(d3(d,(d%(d(d(d(d (d(d'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd}'dv'do'dh'da'dZ'dS'dL'dE'd>'d7'd0'd)'d"'d'd'd 'd'd&d&d&d&d&d&d&d&d&d&d&d&d&d&d&d&d&d&d&dz&ds&dl&de&d^&dW&dP&dI&dB&d;&d4&d-&d&&d&d&d&d &d&d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d~%dw%dp%di%db%d[%dT%dM%dF%d?%d8%d1%d*%d#%d%d%d%d%d%d$d$d$d$d$d$d$d$d$d$d$d$d$d$d$d$d$d$d{$dt$dm$df$d_$dX$dQ$dJ$dC$d<$d5$d.$d'$d $d$d$d $d$d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#dx#dq#dj#dc#d\#dU#dN#dG#d@#d9#d2#d+#d$#d#d#d#d#d#d"d"d"d"d"d"d"d"d"d"d"d"d"d"d"d"d"d"d|"du"dn"dg"d`"dY"dR"dK"dD"d="d6"d/"d("d!"d"d"d "d"d!d!d!d!d!d!d!d!d!d!d!d!d!d!d!d!d!d!d!dy!dr!dk!dd!d]!dV!dO!dH!dA!d:!d3!d,!d%!d!d!d!d !d!d d d d d d d d d d d d d d d d d d d} dv do dh da dZ dS dL dE d> d7 d0 d) d" d d d d ddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCd<d5d.d'd ddd dddddddddddddddddddddxdqdjdcd\dUdNdGd@d9d2d+d$dddddddddddddddddddddddd|dudndgd`dYdRdKdDd=d6d/d(d!ddd dddddddddddddddddddddydrdkddd]dVdOdHdAd:d3d,d%dddd dddddddddddddddddddd}dvdodhdadZdSdLdEd>d7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCd<d5d.d'd ddd dddddddddddddddddddddxdqdjdcd\dUdNdGd@d9d2d+d$dddddddddddddddddddddddd|dudndgd`dYdRdKdDd=d6d/d(d!ddd dddddddddddddddddddddydrdkddd]dVdOdHdAd:d3d,d%dddd dddddddddddddddddddd}dvdodhdadZdSdLdEd>d7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCd<d5d.d'd ddd dddddddddddddddddddddxdqdjdcd\dUdNdGd@d9d2d+d$dddddd d d d d d d d d d d d d d d d d d d| du dn dg d` dY dR dK dD d= d6 d/ d( d! d d d d d d d d d d d d d d d d d d d d d d d dy dr dk dd d] dV dO dH dA d: d3 d, d% d d d d d d d d d d d d d d d d d d d d d d d d} dv do dh da dZ dS dL dE d> d7 d0 d) d" d d d d d d d d d d d d d d d d d d d d d d d dz ds dl de d^ dW dP dI dB d; d4 d- d& d d d d d d d d d d d d d d d d d d d d d d d d~ dw dp di db d[ dT dM dF d? d8 d1 d* d# d d d d d ddddddddddddddddddd{dtdmdfd_dXdQdJdCd<d5d.d'd ddd dddddddddddddddddddddxdqdjdcd\dUdNdGd@d9d2d+d$dddddddddddddddddddddddd|dudndgd`dYdRdKdDd=d6d/d(d!ddd dddddddddddddddddddddydrdkddd]dVdOdHdAd:d3d,d%dddd dddddddddddddddddddd}dvdodhdadZdSdLdEd>d7d0d)d"ddd dddddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd dddddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#dddddddddddddddddddddddd{dtdmdfd_dXdQdJdCd<d5d.d'd ddd dddddddddddddddddddddxdqdjdcd\dUdNdGd@d9d2d+d$ddddddcccccccccccccccccc|cucncgc`cYcRcKcDc=c6c/c(c!ccc cccccccccccccccccccccycrckcdc]cVcOcHcAc:c3c,c%cccc cccccccccccccccccccc}cvcochcacZcScLcEc>c7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc cccccccܽcսcνcǽccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccټcҼc˼cļcccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccccccݻcֻcϻcȻccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc cccccccܶcնcζcǶccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccٵcҵc˵cĵcccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccccccݴcִcϴcȴccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc cccccccܯcկcίcǯccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccٮcҮcˮcĮcccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccccccݭc֭cϭcȭccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc cccccccܨcըcΨcǨccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccccccc٧cҧc˧cħcccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccccccݦc֦cϦcȦccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc cccccccܡcաcΡcǡccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccccccc٠cҠcˠcĠcccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccccccݟc֟cϟcȟccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc cccccccܚc՚cΚcǚccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccٙcҙc˙cęcccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccccccݘc֘cϘcȘccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc cccccccܓcՓcΓcǓccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccْcҒc˒cĒcccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccccccݑc֑cϑcȑccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccc܌cՌcΌcnjccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccًcҋcˋcċcccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccc݊c֊cϊcȊccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc ccccccc܅cՅc΅cDžccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccلc҄c˄cĄcccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccc݃cփcσcȃccccccccccc{ctcmcfc_cXcQcJcCcc7c0c)c"ccc cc~c~c~c~c~c~c~c~c~c~c~c~c~c~c~c~c~c~c~cz~cs~cl~ce~c^~cW~cP~cI~cB~c;~c4~c-~c&~c~c~c~c ~c~c}c}c}c}c}c}c}c}c}c}c}c}c}c}c}c}c}c}c~}cw}cp}ci}cb}c[}cT}cM}cF}c?}c8}c1}c*}c#}c}c}c}c}c}c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c{|ct|cm|cf|c_|cX|cQ|cJ|cC|c<|c5|c.|c'|c |c|c|c |c|c{c{c{c{c{c{c{c{c{c{c{c{c{c{c{c{c{c{c{cx{cq{cj{cc{c\{cU{cN{cG{c@{c9{c2{c+{c${c{c{c{c{c{czczczczczczczczczczczczczczczczczczc|zcuzcnzcgzc`zcYzcRzcKzcDzc=zc6zc/zc(zc!zczczc zczcycycycycycycycycycycycycycycycycycycycyycryckycdyc]ycVycOycHycAyc:yc3yc,yc%ycycycyc ycycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxc}xcvxcoxchxcaxcZxcSxcLxcExc>xc7xc0xc)xc"xcxcxc xcxcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwczwcswclwcewc^wcWwcPwcIwcBwc;wc4wc-wc&wcwcwcwc wcwcvcvcvcvcvcvcvcvcvcvcvcvcvcvcvcvcvcvc~vcwvcpvcivcbvc[vcTvcMvcFvc?vc8vc1vc*vc#vcvcvcvcvcvcucucucucucucucucucucucucucucucucucuc{uctucmucfuc_ucXucQucJucCucqc7qc0qc)qc"qcqcqc qcqcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpczpcspclpcepc^pcWpcPpcIpcBpc;pc4pc-pc&pcpcpcpc pcpcococococococococococococococococococ~ocwocpociocboc[ocTocMocFoc?oc8oc1oc*oc#ococococococncncncncncncncncncncncncncncncncncnc{nctncmncfnc_ncXncQncJncCncjc7jc0jc)jc"jcjcjc jcjciciciciciciciciciciciciciciciciciciciczicsicliceic^icWicPicIicBic;ic4ic-ic&icicicic icichchchchchchchchchchchchchchchchchchc~hcwhcphcihcbhc[hcThcMhcFhc?hc8hc1hc*hc#hchchchchchcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcgc{gctgcmgcfgc_gcXgcQgcJgcCgccc7cc0cc)cc"cccccc ccccbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbczbcsbclbcebc^bcWbcPbcIbcBbc;bc4bc-bc&bcbcbcbc bcbcacacacacacacacacacacacacacacacacacac~acwacpaciacbac[acTacMacFac?ac8ac1ac*ac#acacacacacac`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c{`ct`cm`cf`c_`cX`cQ`cJ`cC`c<`c5`c.`c'`c `c`c`c `c`c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_cx_cq_cj_cc_c\_cU_cN_cG_c@_c9_c2_c+_c$_c_c_c_c_c_c^c^c^c^c^c^c^c^c^c^c^c^c^c^c^c^c^c^c|^cu^cn^cg^c`^cY^cR^cK^cD^c=^c6^c/^c(^c!^c^c^c ^c^c]c]c]c]c]c]c]c]c]c]c]c]c]c]c]c]c]c]c]cy]cr]ck]cd]c]]cV]cO]cH]cA]c:]c3]c,]c%]c]c]c]c ]c]c\c\c\c\c\c\c\c\c\c\c\c\c\c\c\c\c\c\c}\cv\co\ch\ca\cZ\cS\cL\cE\c>\c7\c0\c)\c"\c\c\c \c\c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[cz[cs[cl[ce[c^[cW[cP[cI[cB[c;[c4[c-[c&[c[c[c[c [c[cZcZcZcZcZcZcZcZcZcZcZcZcZcZcZcZcZcZc~ZcwZcpZciZcbZc[ZcTZcMZcFZc?Zc8Zc1Zc*Zc#ZcZcZcZcZcZcYcYcYcYcYcYcYcYcYcYcYcYcYcYcYcYcYcYc{YctYcmYcfYc_YcXYcQYcJYcCYcUc7Uc0Uc)Uc"UcUcUc UcUcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTczTcsTclTceTc^TcWTcPTcITcBTc;Tc4Tc-Tc&TcTcTcTc TcTcScScScScScScScScScScScScScScScScScSc~ScwScpSciScbSc[ScTScMScFSc?Sc8Sc1Sc*Sc#ScScScScScScRcRcRcRcRcRcRcRcRcRcRcRcRcRcRcRcRcRc{RctRcmRcfRc_RcXRcQRcJRcCRcNc7Nc0Nc)Nc"NcNcNc NcNcMcMcMcMcMcMcMcMcMcMcMcMcMcMcMcMcMcMcMczMcsMclMceMc^McWMcPMcIMcBMc;Mc4Mc-Mc&McMcMcMc McMcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLc~LcwLcpLciLcbLc[LcTLcMLcFLc?Lc8Lc1Lc*Lc#LcLcLcLcLcLcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKcKc{KctKcmKcfKc_KcXKcQKcJKcCKcGc7Gc0Gc)Gc"GcGcGc GcGcFcFcFcFcFcFcFcFcFcFcFcFcFcFcFcFcFcFcFczFcsFclFceFc^FcWFcPFcIFcBFc;Fc4Fc-Fc&FcFcFcFc FcFcEcEcEcEcEcEcEcEcEcEcEcEcEcEcEcEcEcEc~EcwEcpEciEcbEc[EcTEcMEcFEc?Ec8Ec1Ec*Ec#EcEcEcEcEcEcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDc{DctDcmDcfDc_DcXDcQDcJDcCDc@c7@c0@c)@c"@c@c@c @c@c?c?c?c?c?c?c?c?c?c?c?c?c?c?c?c?c?c?c?cz?cs?cl?ce?c^?cW?cP?cI?cB?c;?c4?c-?c&?c?c?c?c ?c?c>c>c>c>c>c>c>c>c>c>c>c>c>c>c>c>c>c>c~>cw>cp>ci>cb>c[>cT>cM>cF>c?>c8>c1>c*>c#>c>c>c>c>c>c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c=c{=ct=cm=cf=c_=cX=cQ=cJ=cC=c<=c5=c.=c'=c =c=c=c =c=c9c79c09c)9c"9c9c9c 9c9c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8cz8cs8cl8ce8c^8cW8cP8cI8cB8c;8c48c-8c&8c8c8c8c 8c8c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c~7cw7cp7ci7cb7c[7cT7cM7cF7c?7c87c17c*7c#7c7c7c7c7c7c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c{6ct6cm6cf6c_6cX6cQ6cJ6cC6c<6c56c.6c'6c 6c6c6c 6c6c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5cx5cq5cj5cc5c\5cU5cN5cG5c@5c95c25c+5c$5c5c5c5c5c5c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c|4cu4cn4cg4c`4cY4cR4cK4cD4c=4c64c/4c(4c!4c4c4c 4c4c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3cy3cr3ck3cd3c]3cV3cO3cH3cA3c:3c33c,3c%3c3c3c3c 3c3c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c}2cv2co2ch2ca2cZ2cS2cL2cE2c>2c72c02c)2c"2c2c2c 2c2c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1cz1cs1cl1ce1c^1cW1cP1cI1cB1c;1c41c-1c&1c1c1c1c 1c1c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c~0cw0cp0ci0cb0c[0cT0cM0cF0c?0c80c10c*0c#0c0c0c0c0c0c/c/c/c/c/c/c/c/c/c/c/c/c/c/c/c/c/c/c{/ct/cm/cf/c_/cX/cQ/cJ/cC/c+c7+c0+c)+c"+c+c+c +c+c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*cz*cs*cl*ce*c^*cW*cP*cI*cB*c;*c4*c-*c&*c*c*c*c *c*c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c~)cw)cp)ci)cb)c[)cT)cM)cF)c?)c8)c1)c*)c#)c)c)c)c)c)c(c(c(c(c(c(c(c(c(c(c(c(c(c(c(c(c(c(c{(ct(cm(cf(c_(cX(cQ(cJ(cC(c<(c5(c.(c'(c (c(c(c (c(c'c'c'c'c'c'c'c'c'c'c'c'c'c'c'c'c'c'c'cx'cq'cj'cc'c\'cU'cN'cG'c@'c9'c2'c+'c$'c'c'c'c'c'c&c&c&c&c&c&c&c&c&c&c&c&c&c&c&c&c&c&c|&cu&cn&cg&c`&cY&cR&cK&cD&c=&c6&c/&c(&c!&c&c&c &c&c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%cy%cr%ck%cd%c]%cV%cO%cH%cA%c:%c3%c,%c%%c%c%c%c %c%c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c}$cv$co$ch$ca$cZ$cS$cL$cE$c>$c7$c0$c)$c"$c$c$c $c$c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#c#cz#cs#cl#ce#c^#cW#cP#cI#cB#c;#c4#c-#c&#c#c#c#c #c#c"c"c"c"c"c"c"c"c"c"c"c"c"c"c"c"c"c"c~"cw"cp"ci"cb"c["cT"cM"cF"c?"c8"c1"c*"c#"c"c"c"c"c"c!c!c!c!c!c!c!c!c!c!c!c!c!c!c!c!c!c!c{!ct!cm!cf!c_!cX!cQ!cJ!cC!cc7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCc<c5c.c'c ccc cccccccccccccccccccccxcqcjccc\cUcNcGc@c9c2c+c$cccccccccccccccccccccccc|cucncgc`cYcRcKcDc=c6c/c(c!ccc cccccccccccccccccccccycrckcdc]cVcOcHcAc:c3c,c%cccc cccccccccccccccccccc}cvcochcacZcScLcEc>c7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCc<c5c.c'c ccc cccccccccccccccccccccxcqcjccc\cUcNcGc@c9c2c+c$cccccccccccccccccccccccc|cucncgc`cYcRcKcDc=c6c/c(c!ccc cccccccccccccccccccccycrckcdc]cVcOcHcAc:c3c,c%cccc cccccccccccccccccccc}cvcochcacZcScLcEc>c7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cc c c c c c c c c c c c c c c c c c c~ cw cp ci cb c[ cT cM cF c? c8 c1 c* c# c c c c c c c c c c c c c c c c c c c c c c c c{ ct cm cf c_ cX cQ cJ cC c< c5 c. c' c c c c c c c c c c c c c c c c c c c c c c c c cx cq cj cc c\ cU cN cG c@ c9 c2 c+ c$ c c c c c c c c c c c c c c c c c c c c c c c c| cu cn cg c` cY cR cK cD c= c6 c/ c( c! c c c c c c c c c c c c c c c c c c c c c c c cy cr ck cd c] cV cO cH cA c: c3 c, c% c c c c c ccccccccccccccccccc}cvcochcacZcScLcEc>c7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc cccccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#cccccccccccccccccccccccc{ctcmcfc_cXcQcJcCc<c5c.c'c ccc cccccccccccccccccccccxcqcjccc\cUcNcGc@c9c2c+c$cccccccccccccccccccccccc|cucncgc`cYcRcKcDc=c6c/c(c!ccc cccccccccccccccccccccycrckcdc]cVcOcHcAc:c3c,c%cccc cccccccccccccccccccc}cvcochcacZcScLcEc>c7c0c)c"ccc ccccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbݿbֿbϿbȿbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbܺbպbκbǺbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbٹbҹb˹bĹbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbݸbָbϸbȸbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbܳbճbγbdzbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbٲbҲb˲bIJbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbݱbֱbϱbȱbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbܬbլbάbǬbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbb٫bҫb˫bībbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbݪb֪bϪbȪbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbܥbեbΥbǥbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbb٤bҤbˤbĤbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbݣb֣bϣbȣbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbܞb՞bΞbǞbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbٝbҝb˝bĝbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbݜb֜bϜbȜbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbܗb՗bΗbǗbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbٖbҖb˖bĖbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbݕb֕bϕbȕbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbbܐbՐbΐbǐbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbُbҏbˏbďbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbݎb֎bώbȎbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbb܉bՉbΉbljbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbوb҈bˈbĈbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbb݇bևbχbȇbbbbbbbbbbb{btbmbfb_bXbQbJbCbb7b0b)b"bbb bbbbbbb܂bՂb΂bǂbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbفbҁbˁbābbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbb݀bրbπbȀbbbbbbbbbbb{btbmbfb_bXbQbJbCb|b7|b0|b)|b"|b|b|b |b|b{b{b{b{b{b{b{b{b{b{b{b{b{b{b{b{b{b{b{bz{bs{bl{be{b^{bW{bP{bI{bB{b;{b4{b-{b&{b{b{b{b {b{bzbzbzbzbzbzbzbzbzbzbzbzbzbzbzbzbzbzb~zbwzbpzbizbbzb[zbTzbMzbFzb?zb8zb1zb*zb#zbzbzbzbzbzbybybybybybybybybybybybybybybybybybyb{ybtybmybfyb_ybXybQybJybCybub7ub0ub)ub"ububub ububtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbztbstbltbetb^tbWtbPtbItbBtb;tb4tb-tb&tbtbtbtb tbtbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsb~sbwsbpsbisbbsb[sbTsbMsbFsb?sb8sb1sb*sb#sbsbsbsbsbsbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrb{rbtrbmrbfrb_rbXrbQrbJrbCrbnb7nb0nb)nb"nbnbnb nbnbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbzmbsmblmbemb^mbWmbPmbImbBmb;mb4mb-mb&mbmbmbmb mbmblblblblblblblblblblblblblblblblblblb~lbwlbplbilbblb[lbTlbMlbFlb?lb8lb1lb*lb#lblblblblblbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkb{kbtkbmkbfkb_kbXkbQkbJkbCkbgb7gb0gb)gb"gbgbgb gbgbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbzfbsfblfbefb^fbWfbPfbIfbBfb;fb4fb-fb&fbfbfbfb fbfbebebebebebebebebebebebebebebebebebeb~ebwebpebiebbeb[ebTebMebFeb?eb8eb1eb*eb#ebebebebebebdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb{dbtdbmdbfdb_dbXdbQdbJdbCdb`b7`b0`b)`b"`b`b`b `b`b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_bz_bs_bl_be_b^_bW_bP_bI_bB_b;_b4_b-_b&_b_b_b_b _b_b^b^b^b^b^b^b^b^b^b^b^b^b^b^b^b^b^b^b~^bw^bp^bi^bb^b[^bT^bM^bF^b?^b8^b1^b*^b#^b^b^b^b^b^b]b]b]b]b]b]b]b]b]b]b]b]b]b]b]b]b]b]b{]bt]bm]bf]b_]bX]bQ]bJ]bC]b<]b5]b.]b']b ]b]b]b ]b]b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bx\bq\bj\bc\b\\bU\bN\bG\b@\b9\b2\b+\b$\b\b\b\b\b\b[b[b[b[b[b[b[b[b[b[b[b[b[b[b[b[b[b[b|[bu[bn[bg[b`[bY[bR[bK[bD[b=[b6[b/[b([b![b[b[b [b[bZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbyZbrZbkZbdZb]ZbVZbOZbHZbAZb:Zb3Zb,Zb%ZbZbZbZb ZbZbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYb}YbvYboYbhYbaYbZYbSYbLYbEYb>Yb7Yb0Yb)Yb"YbYbYb YbYbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbzXbsXblXbeXb^XbWXbPXbIXbBXb;Xb4Xb-Xb&XbXbXbXb XbXbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWb~WbwWbpWbiWbbWb[WbTWbMWbFWb?Wb8Wb1Wb*Wb#WbWbWbWbWbWbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVb{VbtVbmVbfVb_VbXVbQVbJVbCVbRb7Rb0Rb)Rb"RbRbRb RbRbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbzQbsQblQbeQb^QbWQbPQbIQbBQb;Qb4Qb-Qb&QbQbQbQb QbQbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPb~PbwPbpPbiPbbPb[PbTPbMPbFPb?Pb8Pb1Pb*Pb#PbPbPbPbPbPbObObObObObObObObObObObObObObObObObOb{ObtObmObfOb_ObXObQObJObCObKb7Kb0Kb)Kb"KbKbKb KbKbJbJbJbJbJbJbJbJbJbJbJbJbJbJbJbJbJbJbJbzJbsJblJbeJb^JbWJbPJbIJbBJb;Jb4Jb-Jb&JbJbJbJb JbJbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIb~IbwIbpIbiIbbIb[IbTIbMIbFIb?Ib8Ib1Ib*Ib#IbIbIbIbIbIbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHb{HbtHbmHbfHb_HbXHbQHbJHbCHbDb7Db0Db)Db"DbDbDb DbDbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbzCbsCblCbeCb^CbWCbPCbICbBCb;Cb4Cb-Cb&CbCbCbCb CbCbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBb~BbwBbpBbiBbbBb[BbTBbMBbFBb?Bb8Bb1Bb*Bb#BbBbBbBbBbBbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAb{AbtAbmAbfAb_AbXAbQAbJAbCAbb>b>b>b>b>b>b>b>b>b>b>b>b>b>b>b>b>b>by>br>bk>bd>b]>bV>bO>bH>bA>b:>b3>b,>b%>b>b>b>b >b>b=b=b=b=b=b=b=b=b=b=b=b=b=b=b=b=b=b=b}=bv=bo=bh=ba=bZ=bS=bL=bE=b>=b7=b0=b)=b"=b=b=b =b=b6b76b06b)6b"6b6b6b 6b6b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5bz5bs5bl5be5b^5bW5bP5bI5bB5b;5b45b-5b&5b5b5b5b 5b5b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b~4bw4bp4bi4bb4b[4bT4bM4bF4b?4b84b14b*4b#4b4b4b4b4b4b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b{3bt3bm3bf3b_3bX3bQ3bJ3bC3b<3b53b.3b'3b 3b3b3b 3b3b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2bx2bq2bj2bc2b\2bU2bN2bG2b@2b92b22b+2b$2b2b2b2b2b2b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b|1bu1bn1bg1b`1bY1bR1bK1bD1b=1b61b/1b(1b!1b1b1b 1b1b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0by0br0bk0bd0b]0bV0bO0bH0bA0b:0b30b,0b%0b0b0b0b 0b0b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b}/bv/bo/bh/ba/bZ/bS/bL/bE/b>/b7/b0/b)/b"/b/b/b /b/b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.bz.bs.bl.be.b^.bW.bP.bI.bB.b;.b4.b-.b&.b.b.b.b .b.b-b-b-b-b-b-b-b-b-b-b-b-b-b-b-b-b-b-b~-bw-bp-bi-bb-b[-bT-bM-bF-b?-b8-b1-b*-b#-b-b-b-b-b-b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b{,bt,bm,bf,b_,bX,bQ,bJ,bC,b<,b5,b.,b',b ,b,b,b ,b,b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+bx+bq+bj+bc+b\+bU+bN+bG+b@+b9+b2+b++b$+b+b+b+b+b+b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b|*bu*bn*bg*b`*bY*bR*bK*bD*b=*b6*b/*b(*b!*b*b*b *b*b)b)b)b)b)b)b)b)b)b)b)b)b)b)b)b)b)b)b)by)br)bk)bd)b])bV)bO)bH)bA)b:)b3)b,)b%)b)b)b)b )b)b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b}(bv(bo(bh(ba(bZ(bS(bL(bE(b>(b7(b0(b)(b"(b(b(b (b(b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'bz'bs'bl'be'b^'bW'bP'bI'bB'b;'b4'b-'b&'b'b'b'b 'b'b&b&b&b&b&b&b&b&b&b&b&b&b&b&b&b&b&b&b~&bw&bp&bi&bb&b[&bT&bM&bF&b?&b8&b1&b*&b#&b&b&b&b&b&b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b{%bt%bm%bf%b_%bX%bQ%bJ%bC%b<%b5%b.%b'%b %b%b%b %b%b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$bx$bq$bj$bc$b\$bU$bN$bG$b@$b9$b2$b+$b$$b$b$b$b$b$b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b|#bu#bn#bg#b`#bY#bR#bK#bD#b=#b6#b/#b(#b!#b#b#b #b#b"b"b"b"b"b"b"b"b"b"b"b"b"b"b"b"b"b"b"by"br"bk"bd"b]"bV"bO"bH"bA"b:"b3"b,"b%"b"b"b"b "b"b!b!b!b!b!b!b!b!b!b!b!b!b!b!b!b!b!b!b}!bv!bo!bh!ba!bZ!bS!bL!bE!b>!b7!b0!b)!b"!b!b!b !b!b b b b b b b b b b b b b b b b b b b bz bs bl be b^ bW bP bI bB b; b4 b- b& b b b b b bbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb<b5b.b'b bbb bbbbbbbbbbbbbbbbbbbbbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbbbbbbbbbbbbbbbbbbb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bbbbbbbbbbbbbbbbbbbbbybrbkbdb]bVbObHbAb:b3b,b%bbbb bbbbbbbbbbbbbbbbbbbb}bvbobhbabZbSbLbEb>b7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb<b5b.b'b bbb bbbbbbbbbbbbbbbbbbbbbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbbbbbbbbbbbbbbbbbbb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bbbbbbbbbbbbbbbbbbbbbybrbkbdb]bVbObHbAb:b3b,b%bbbb bbbbbbbbbbbbbbbbbbbb}bvbobhbabZbSbLbEb>b7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb<b5b.b'b bbb bbbbbbbbbbbbbbbbbbbbbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbbbbbbbbbbbbbbbbbbb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bb b b b b b b b b b b b b b b b b b b by br bk bd b] bV bO bH bA b: b3 b, b% b b b b b b b b b b b b b b b b b b b b b b b b} bv bo bh ba bZ bS bL bE b> b7 b0 b) b" b b b b b b b b b b b b b b b b b b b b b b b bz bs bl be b^ bW bP bI bB b; b4 b- b& b b b b b b b b b b b b b b b b b b b b b b b b~ bw bp bi bb b[ bT bM bF b? b8 b1 b* b# b b b b b b b b b b b b b b b b b b b b b b b b{ bt bm bf b_ bX bQ bJ bC b< b5 b. b' b b b b b bbbbbbbbbbbbbbbbbbbbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbbbbbbbbbbbbbbbbbbb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bbbbbbbbbbbbbbbbbbbbbybrbkbdb]bVbObHbAb:b3b,b%bbbb bbbbbbbbbbbbbbbbbbbb}bvbobhbabZbSbLbEb>b7b0b)b"bbb bbbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb<b5b.b'b bbb bbbbbbbbbbbbbbbbbbbbbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbbbbbbbbbbbbbbbbbbb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bbaaaaaaaaaaaaaaaaaaayarakada]aVaOaHaAa:a3a,a%aaaa aaaaaaaaaaaaaaaaaaaa}avaoahaaaZaSaLaEa>a7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaܾaվaξaǾaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaٽaҽa˽aĽaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaݼaּaϼaȼaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaܷaշaηaǷaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaٶaҶa˶aĶaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaݵaֵaϵaȵaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaܰaհaΰaǰaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaٯaүa˯aįaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaݮa֮aϮaȮaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaܩaթaΩaǩaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaa٨aҨa˨aĨaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaݧa֧aϧaȧaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaܢaբa΢aǢaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaa١aҡaˡaġaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaݠa֠aϠaȠaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaܛa՛aΛaǛaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaٚaҚa˚aĚaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaݙa֙aϙașaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaܔaՔaΔaǔaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaٓaғa˓aēaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaݒa֒aϒaȒaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaa܍aՍa΍aǍaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaٌaҌaˌaČaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaa݋a֋aϋaȋaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaa܆aՆaΆadžaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaمa҅a˅aąaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaa݄aքaτaȄaaaaaaaaaaa{atamafa_aXaQaJaCaa7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa~a~a~a~a~a~a~a~a~a~a~a~a~a~a~a~a~a~a~~aw~ap~ai~ab~a[~aT~aM~aF~a?~a8~a1~a*~a#~a~a~a~a~a~a}a}a}a}a}a}a}a}a}a}a}a}a}a}a}a}a}a}a{}at}am}af}a_}aX}aQ}aJ}aC}a<}a5}a.}a'}a }a}a}a }a}a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|ax|aq|aj|ac|a\|aU|aN|aG|a@|a9|a2|a+|a$|a|a|a|a|a|a{a{a{a{a{a{a{a{a{a{a{a{a{a{a{a{a{a{a|{au{an{ag{a`{aY{aR{aK{aD{a={a6{a/{a({a!{a{a{a {a{azazazazazazazazazazazazazazazazazazazayzarzakzadza]zaVzaOzaHzaAza:za3za,za%zazazaza zazayayayayayayayayayayayayayayayayayaya}yavyaoyahyaayaZyaSyaLyaEya>ya7ya0ya)ya"yayaya yayaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxazxasxalxaexa^xaWxaPxaIxaBxa;xa4xa-xa&xaxaxaxa xaxawawawawawawawawawawawawawawawawawawa~wawwapwaiwabwa[waTwaMwaFwa?wa8wa1wa*wa#wawawawawawavavavavavavavavavavavavavavavavavava{vatvamvafva_vaXvaQvaJvaCvara7ra0ra)ra"rarara raraqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqazqasqalqaeqa^qaWqaPqaIqaBqa;qa4qa-qa&qaqaqaqa qaqapapapapapapapapapapapapapapapapapapa~pawpappaipabpa[paTpaMpaFpa?pa8pa1pa*pa#papapapapapaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoa{oatoamoafoa_oaXoaQoaJoaCoaka7ka0ka)ka"kakaka kakajajajajajajajajajajajajajajajajajajajazjasjaljaeja^jaWjaPjaIjaBja;ja4ja-ja&jajajaja jajaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaia~iawiapiaiiabia[iaTiaMiaFia?ia8ia1ia*ia#iaiaiaiaiaiahahahahahahahahahahahahahahahahahaha{hathamhafha_haXhaQhaJhaChada7da0da)da"dadada dadacacacacacacacacacacacacacacacacacacacazcascalcaeca^caWcaPcaIcaBca;ca4ca-ca&cacacaca cacababababababababababababababababababa~bawbapbaibabba[baTbaMbaFba?ba8ba1ba*ba#babababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{aataamaafaa_aaXaaQaaJaaCaa]a7]a0]a)]a"]a]a]a ]a]a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\az\as\al\ae\a^\aW\aP\aI\aB\a;\a4\a-\a&\a\a\a\a \a\a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a[a~[aw[ap[ai[ab[a[[aT[aM[aF[a?[a8[a1[a*[a#[a[a[a[a[a[aZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZa{ZatZamZafZa_ZaXZaQZaJZaCZaVa7Va0Va)Va"VaVaVa VaVaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUazUasUalUaeUa^UaWUaPUaIUaBUa;Ua4Ua-Ua&UaUaUaUa UaUaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTa~TawTapTaiTabTa[TaTTaMTaFTa?Ta8Ta1Ta*Ta#TaTaTaTaTaTaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSa{SatSamSafSa_SaXSaQSaJSaCSaOa7Oa0Oa)Oa"OaOaOa OaOaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNazNasNalNaeNa^NaWNaPNaINaBNa;Na4Na-Na&NaNaNaNa NaNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMa~MawMapMaiMabMa[MaTMaMMaFMa?Ma8Ma1Ma*Ma#MaMaMaMaMaMaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLa{LatLamLafLa_LaXLaQLaJLaCLaHa7Ha0Ha)Ha"HaHaHa HaHaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGazGasGalGaeGa^GaWGaPGaIGaBGa;Ga4Ga-Ga&GaGaGaGa GaGaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFa~FawFapFaiFabFa[FaTFaMFaFFa?Fa8Fa1Fa*Fa#FaFaFaFaFaFaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEa{EatEamEafEa_EaXEaQEaJEaCEaAa7Aa0Aa)Aa"AaAaAa AaAa@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@az@as@al@ae@a^@aW@aP@aI@aB@a;@a4@a-@a&@a@a@a@a @a@a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a~?aw?ap?ai?ab?a[?aT?aM?aF?a??a8?a1?a*?a#?a?a?a?a?a?a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a{>at>am>af>a_>aX>aQ>aJ>aC>a<>a5>a.>a'>a >a>a>a >a>a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=ax=aq=aj=ac=a\=aU=aN=aG=a@=a9=a2=a+=a$=a=a=a=a=a=a:a7:a0:a):a":a:a:a :a:a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9az9as9al9ae9a^9aW9aP9aI9aB9a;9a49a-9a&9a9a9a9a 9a9a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a~8aw8ap8ai8ab8a[8aT8aM8aF8a?8a88a18a*8a#8a8a8a8a8a8a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a{7at7am7af7a_7aX7aQ7aJ7aC7a<7a57a.7a'7a 7a7a7a 7a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6ax6aq6aj6ac6a\6aU6aN6aG6a@6a96a26a+6a$6a6a6a6a6a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a|5au5an5ag5a`5aY5aR5aK5aD5a=5a65a/5a(5a!5a5a5a 5a5a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4ay4ar4ak4ad4a]4aV4aO4aH4aA4a:4a34a,4a%4a4a4a4a 4a4a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a}3av3ao3ah3aa3aZ3aS3aL3aE3a>3a73a03a)3a"3a3a3a 3a3a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2az2as2al2ae2a^2aW2aP2aI2aB2a;2a42a-2a&2a2a2a2a 2a2a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a~1aw1ap1ai1ab1a[1aT1aM1aF1a?1a81a11a*1a#1a1a1a1a1a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a{0at0am0af0a_0aX0aQ0aJ0aC0a<0a50a.0a'0a 0a0a0a 0a0a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/ax/aq/aj/ac/a\/aU/aN/aG/a@/a9/a2/a+/a$/a/a/a/a/a/a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a|.au.an.ag.a`.aY.aR.aK.aD.a=.a6.a/.a(.a!.a.a.a .a.a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-ay-ar-ak-ad-a]-aV-aO-aH-aA-a:-a3-a,-a%-a-a-a-a -a-a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a},av,ao,ah,aa,aZ,aS,aL,aE,a>,a7,a0,a),a",a,a,a ,a,a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+az+as+al+ae+a^+aW+aP+aI+aB+a;+a4+a-+a&+a+a+a+a +a+a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a~*aw*ap*ai*ab*a[*aT*aM*aF*a?*a8*a1*a**a#*a*a*a*a*a*a)a)a)a)a)a)a)a)a)a)a)a)a)a)a)a)a)a)a{)at)am)af)a_)aX)aQ)aJ)aC)a<)a5)a.)a')a )a)a)a )a)a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(ax(aq(aj(ac(a\(aU(aN(aG(a@(a9(a2(a+(a$(a(a(a(a(a(a'a'a'a'a'a'a'a'a'a'a'a'a'a'a'a'a'a'a|'au'an'ag'a`'aY'aR'aK'aD'a='a6'a/'a('a!'a'a'a 'a'a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&ay&ar&ak&ad&a]&aV&aO&aH&aA&a:&a3&a,&a%&a&a&a&a &a&a%a%a%a%a%a%a%a%a%a%a%a%a%a%a%a%a%a%a}%av%ao%ah%aa%aZ%aS%aL%aE%a>%a7%a0%a)%a"%a%a%a %a%a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$az$as$al$ae$a^$aW$aP$aI$aB$a;$a4$a-$a&$a$a$a$a $a$a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a#a~#aw#ap#ai#ab#a[#aT#aM#aF#a?#a8#a1#a*#a##a#a#a#a#a#a"a"a"a"a"a"a"a"a"a"a"a"a"a"a"a"a"a"a{"at"am"af"a_"aX"aQ"aJ"aC"a<"a5"a."a'"a "a"a"a "a"a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!ax!aq!aj!ac!a\!aU!aN!aG!a@!a9!a2!a+!a$!a!a!a!a!a!a a a a a a a a a a a a a a a a a a a| au an ag a` aY aR aK aD a= a6 a/ a( a! a a a a aaaaaaaaaaaaaaaaaaaayarakada]aVaOaHaAa:a3a,a%aaaa aaaaaaaaaaaaaaaaaaaa}avaoahaaaZaSaLaEa>a7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa<a5a.a'a aaa aaaaaaaaaaaaaaaaaaaaaxaqajaca\aUaNaGa@a9a2a+a$aaaaaaaaaaaaaaaaaaaaaaaa|auanaga`aYaRaKaDa=a6a/a(a!aaa aaaaaaaaaaaaaaaaaaaaayarakada]aVaOaHaAa:a3a,a%aaaa aaaaaaaaaaaaaaaaaaaa}avaoahaaaZaSaLaEa>a7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa<a5a.a'a aaa aaaaaaaaaaaaaaaaaaaaaxaqajaca\aUaNaGa@a9a2a+a$aaaaaaaaaaaaaaaaaaaaaaaa|auanaga`aYaRaKaDa=a6a/a(a!aaa aaaaaaaaaaaaaaaaaaaaayarakada]aVaOaHaAa:a3a,a%aaaa aaaaaaaaaaaaaaaaaaaa}avaoahaaaZaSaLaEa>a7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa a a a a a a a a a a a a a a a a a a{ at am af a_ aX aQ aJ aC a< a5 a. a' a a a a a a a a a a a a a a a a a a a a a a a a ax aq aj ac a\ aU aN aG a@ a9 a2 a+ a$ a a a a a a a a a a a a a a a a a a a a a a a a| au an ag a` aY aR aK aD a= a6 a/ a( a! a a a a a a a a a a a a a a a a a a a a a a a ay ar ak ad a] aV aO aH aA a: a3 a, a% a a a a a a a a a a a a a a a a a a a a a a a a} av ao ah aa aZ aS aL aE a> a7 a0 a) a" a a a a aaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa<a5a.a'a aaa aaaaaaaaaaaaaaaaaaaaaxaqajaca\aUaNaGa@a9a2a+a$aaaaaaaaaaaaaaaaaaaaaaaa|auanaga`aYaRaKaDa=a6a/a(a!aaa aaaaaaaaaaaaaaaaaaaaayarakada]aVaOaHaAa:a3a,a%aaaa aaaaaaaaaaaaaaaaaaaa}avaoahaaaZaSaLaEa>a7a0a)a"aaa aaaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aaaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڿ`ӿ`̿`ſ```````````x`q`j`c`\`U`N`G`@`9`2`+`$``````````޾`׾`о`ɾ`¾``````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ```````۽`Խ`ͽ`ƽ```````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``````߼`ؼ`Ѽ`ʼ`ü``````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ```````ܻ`ջ`λ`ǻ```````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ```````ٺ`Һ`˺`ĺ``````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````````ݹ`ֹ`Ϲ`ȹ```````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڸ`Ӹ`̸`Ÿ```````````x`q`j`c`\`U`N`G`@`9`2`+`$``````````޷`׷`з`ɷ`·``````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ```````۶`Զ`Ͷ`ƶ```````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``````ߵ`ص`ѵ`ʵ`õ``````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ```````ܴ`մ`δ`Ǵ```````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ```````ٳ`ҳ`˳`ij``````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````````ݲ`ֲ`ϲ`Ȳ```````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڱ`ӱ`̱`ű```````````x`q`j`c`\`U`N`G`@`9`2`+`$``````````ް`װ`а`ɰ`°``````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ```````ۯ`ԯ`ͯ`Ư```````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``````߮`خ`Ѯ`ʮ`î``````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ```````ܭ`խ`έ`ǭ```````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ```````٬`Ҭ`ˬ`Ĭ``````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````````ݫ`֫`ϫ`ȫ```````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڪ`Ӫ`̪`Ū```````````x`q`j`c`\`U`N`G`@`9`2`+`$``````````ީ`ש`Щ`ɩ`©``````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ```````ۨ`Ԩ`ͨ`ƨ```````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``````ߧ`ا`ѧ`ʧ`ç``````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ```````ܦ`զ`Φ`Ǧ```````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ```````٥`ҥ`˥`ĥ``````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````````ݤ`֤`Ϥ`Ȥ```````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڣ`ӣ`̣`ţ```````````x`q`j`c`\`U`N`G`@`9`2`+`$``````````ޢ`ע`Т`ɢ`¢``````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ```````ۡ`ԡ`͡`ơ```````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``````ߠ`ؠ`Ѡ`ʠ`à``````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ```````ܟ`՟`Ο`ǟ```````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ```````ٞ`Ҟ`˞`Ğ``````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````````ݝ`֝`ϝ`ȝ```````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڜ`Ӝ`̜`Ŝ```````````x`q`j`c`\`U`N`G`@`9`2`+`$``````````ޛ`כ`Л`ɛ`›``````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ```````ۚ`Ԛ`͚`ƚ```````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``````ߙ`ؙ`љ`ʙ`Ù``````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ```````ܘ`՘`Θ`ǘ```````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ```````ٗ`җ`˗`ė``````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````````ݖ`֖`ϖ`Ȗ```````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڕ`ӕ`̕`ŕ```````````x`q`j`c`\`U`N`G`@`9`2`+`$``````````ޔ`ה`Д`ɔ`”``````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ```````ۓ`ԓ`͓`Ɠ```````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``````ߒ`ؒ`ђ`ʒ`Ò``````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ```````ܑ`Ց`Α`Ǒ```````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ```````ِ`Ґ`ː`Đ``````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````````ݏ`֏`Ϗ`ȏ```````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڎ`ӎ`̎`Ŏ```````````x`q`j`c`\`U`N`G`@`9`2`+`$``````````ލ`׍`Ѝ`ɍ```````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ```````ی`Ԍ`͌`ƌ```````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``````ߋ`؋`ы`ʋ`Ë``````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ```````܊`Պ`Ί`NJ```````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ```````ى`҉`ˉ`ĉ``````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````````݈`ֈ`ψ`Ȉ```````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڇ`Ӈ`̇`Ň```````````x`q`j`c`\`U`N`G`@`9`2`+`$``````````ކ`׆`І`Ɇ`†``````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ```````ۅ`ԅ`ͅ`ƅ```````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``````߄`؄`ф`ʄ`Ä``````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ```````܃`Ճ`΃`ǃ```````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ```````ق`҂`˂`Ă``````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````````݁`ց`ρ`ȁ```````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ```````ڀ`Ӏ`̀`ŀ```````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` ``~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`y~`r~`k~`d~`]~`V~`O~`H~`A~`:~`3~`,~`%~`~`~`~` ~`~`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}}`v}`o}`h}`a}`Z}`S}`L}`E}`>}`7}`0}`)}`"}`}`}` }`}`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`|`z|`s|`l|`e|`^|`W|`P|`I|`B|`;|`4|`-|`&|`|`|`|` |`|`{`{`{`{`{`{`{`{`{`{`{`{`{`{`{`{`{`{`~{`w{`p{`i{`b{`[{`T{`M{`F{`?{`8{`1{`*{`#{`{`{`{`{`{`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`{z`tz`mz`fz`_z`Xz`Qz`Jz`Cz`v`7v`0v`)v`"v`v`v` v`v`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`u`zu`su`lu`eu`^u`Wu`Pu`Iu`Bu`;u`4u`-u`&u`u`u`u` u`u`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`~t`wt`pt`it`bt`[t`Tt`Mt`Ft`?t`8t`1t`*t`#t`t`t`t`t`t`s`s`s`s`s`s`s`s`s`s`s`s`s`s`s`s`s`s`{s`ts`ms`fs`_s`Xs`Qs`Js`Cs`o`7o`0o`)o`"o`o`o` o`o`n`n`n`n`n`n`n`n`n`n`n`n`n`n`n`n`n`n`n`zn`sn`ln`en`^n`Wn`Pn`In`Bn`;n`4n`-n`&n`n`n`n` n`n`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`~m`wm`pm`im`bm`[m`Tm`Mm`Fm`?m`8m`1m`*m`#m`m`m`m`m`m`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`{l`tl`ml`fl`_l`Xl`Ql`Jl`Cl`h`7h`0h`)h`"h`h`h` h`h`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`zg`sg`lg`eg`^g`Wg`Pg`Ig`Bg`;g`4g`-g`&g`g`g`g` g`g`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`~f`wf`pf`if`bf`[f`Tf`Mf`Ff`?f`8f`1f`*f`#f`f`f`f`f`f`e`e`e`e`e`e`e`e`e`e`e`e`e`e`e`e`e`e`{e`te`me`fe`_e`Xe`Qe`Je`Ce`a`7a`0a`)a`"a`a`a` a`a```````````````````````````````````````z``s``l``e``^``W``P``I``B``;``4``-``&```````` ````_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`~_`w_`p_`i_`b_`[_`T_`M_`F_`?_`8_`1_`*_`#_`_`_`_`_`_`^`^`^`^`^`^`^`^`^`^`^`^`^`^`^`^`^`^`{^`t^`m^`f^`_^`X^`Q^`J^`C^`<^`5^`.^`'^` ^`^`^` ^`^`]`]`]`]`]`]`]`]`]`]`]`]`]`]`]`]`]`]`]`x]`q]`j]`c]`\]`U]`N]`G]`@]`9]`2]`+]`$]`]`]`]`]`]`\`\`\`\`\`\`\`\`\`\`\`\`\`\`\`\`\`\`|\`u\`n\`g\``\`Y\`R\`K\`D\`=\`6\`/\`(\`!\`\`\` \`\`[`[`[`[`[`[`[`[`[`[`[`[`[`[`[`[`[`[`[`y[`r[`k[`d[`][`V[`O[`H[`A[`:[`3[`,[`%[`[`[`[` [`[`Z`Z`Z`Z`Z`Z`Z`Z`Z`Z`Z`Z`Z`Z`Z`Z`Z`Z`}Z`vZ`oZ`hZ`aZ`ZZ`SZ`LZ`EZ`>Z`7Z`0Z`)Z`"Z`Z`Z` Z`Z`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`zY`sY`lY`eY`^Y`WY`PY`IY`BY`;Y`4Y`-Y`&Y`Y`Y`Y` Y`Y`X`X`X`X`X`X`X`X`X`X`X`X`X`X`X`X`X`X`~X`wX`pX`iX`bX`[X`TX`MX`FX`?X`8X`1X`*X`#X`X`X`X`X`X`W`W`W`W`W`W`W`W`W`W`W`W`W`W`W`W`W`W`{W`tW`mW`fW`_W`XW`QW`JW`CW`S`7S`0S`)S`"S`S`S` S`S`R`R`R`R`R`R`R`R`R`R`R`R`R`R`R`R`R`R`R`zR`sR`lR`eR`^R`WR`PR`IR`BR`;R`4R`-R`&R`R`R`R` R`R`Q`Q`Q`Q`Q`Q`Q`Q`Q`Q`Q`Q`Q`Q`Q`Q`Q`Q`~Q`wQ`pQ`iQ`bQ`[Q`TQ`MQ`FQ`?Q`8Q`1Q`*Q`#Q`Q`Q`Q`Q`Q`P`P`P`P`P`P`P`P`P`P`P`P`P`P`P`P`P`P`{P`tP`mP`fP`_P`XP`QP`JP`CP`L`7L`0L`)L`"L`L`L` L`L`K`K`K`K`K`K`K`K`K`K`K`K`K`K`K`K`K`K`K`zK`sK`lK`eK`^K`WK`PK`IK`BK`;K`4K`-K`&K`K`K`K` K`K`J`J`J`J`J`J`J`J`J`J`J`J`J`J`J`J`J`J`~J`wJ`pJ`iJ`bJ`[J`TJ`MJ`FJ`?J`8J`1J`*J`#J`J`J`J`J`J`I`I`I`I`I`I`I`I`I`I`I`I`I`I`I`I`I`I`{I`tI`mI`fI`_I`XI`QI`JI`CI`E`7E`0E`)E`"E`E`E` E`E`D`D`D`D`D`D`D`D`D`D`D`D`D`D`D`D`D`D`D`zD`sD`lD`eD`^D`WD`PD`ID`BD`;D`4D`-D`&D`D`D`D` D`D`C`C`C`C`C`C`C`C`C`C`C`C`C`C`C`C`C`C`~C`wC`pC`iC`bC`[C`TC`MC`FC`?C`8C`1C`*C`#C`C`C`C`C`C`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`{B`tB`mB`fB`_B`XB`QB`JB`CB``>`>`>`>`>`>`>`>`>`>`>`>`>`>`>`>`>`}>`v>`o>`h>`a>`Z>`S>`L>`E>`>>`7>`0>`)>`">`>`>` >`>`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`z=`s=`l=`e=`^=`W=`P=`I=`B=`;=`4=`-=`&=`=`=`=` =`=`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`~<`w<`p<`i<`b<`[<`T<`M<`F<`?<`8<`1<`*<`#<`<`<`<`<`<`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`{;`t;`m;`f;`_;`X;`Q;`J;`C;`<;`5;`.;`';` ;`;`;` ;`;`:`:`:`:`:`:`:`:`:`:`:`:`:`:`:`:`:`:`:`x:`q:`j:`c:`\:`U:`N:`G:`@:`9:`2:`+:`$:`:`:`:`:`:`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`|9`u9`n9`g9``9`Y9`R9`K9`D9`=9`69`/9`(9`!9`9`9` 9`9`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`8`y8`r8`k8`d8`]8`V8`O8`H8`A8`:8`38`,8`%8`8`8`8` 8`8`7`7`7`7`7`7`7`7`7`7`7`7`7`7`7`7`7`7`}7`v7`o7`h7`a7`Z7`S7`L7`E7`>7`77`07`)7`"7`7`7` 7`7`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`z6`s6`l6`e6`^6`W6`P6`I6`B6`;6`46`-6`&6`6`6`6` 6`6`5`5`5`5`5`5`5`5`5`5`5`5`5`5`5`5`5`5`~5`w5`p5`i5`b5`[5`T5`M5`F5`?5`85`15`*5`#5`5`5`5`5`5`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`{4`t4`m4`f4`_4`X4`Q4`J4`C4`<4`54`.4`'4` 4`4`4` 4`4`3`3`3`3`3`3`3`3`3`3`3`3`3`3`3`3`3`3`3`x3`q3`j3`c3`\3`U3`N3`G3`@3`93`23`+3`$3`3`3`3`3`3`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`|2`u2`n2`g2``2`Y2`R2`K2`D2`=2`62`/2`(2`!2`2`2` 2`2`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`y1`r1`k1`d1`]1`V1`O1`H1`A1`:1`31`,1`%1`1`1`1` 1`1`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`}0`v0`o0`h0`a0`Z0`S0`L0`E0`>0`70`00`)0`"0`0`0` 0`0`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`z/`s/`l/`e/`^/`W/`P/`I/`B/`;/`4/`-/`&/`/`/`/` /`/`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`~.`w.`p.`i.`b.`[.`T.`M.`F.`?.`8.`1.`*.`#.`.`.`.`.`.`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`{-`t-`m-`f-`_-`X-`Q-`J-`C-`<-`5-`.-`'-` -`-`-` -`-`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`x,`q,`j,`c,`\,`U,`N,`G,`@,`9,`2,`+,`$,`,`,`,`,`,`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`|+`u+`n+`g+``+`Y+`R+`K+`D+`=+`6+`/+`(+`!+`+`+` +`+`*`*`*`*`*`*`*`*`*`*`*`*`*`*`*`*`*`*`*`y*`r*`k*`d*`]*`V*`O*`H*`A*`:*`3*`,*`%*`*`*`*` *`*`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`})`v)`o)`h)`a)`Z)`S)`L)`E)`>)`7)`0)`))`")`)`)` )`)`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`z(`s(`l(`e(`^(`W(`P(`I(`B(`;(`4(`-(`&(`(`(`(` (`(`'`'`'`'`'`'`'`'`'`'`'`'`'`'`'`'`'`'`~'`w'`p'`i'`b'`['`T'`M'`F'`?'`8'`1'`*'`#'`'`'`'`'`'`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`{&`t&`m&`f&`_&`X&`Q&`J&`C&`<&`5&`.&`'&` &`&`&` &`&`%`%`%`%`%`%`%`%`%`%`%`%`%`%`%`%`%`%`%`x%`q%`j%`c%`\%`U%`N%`G%`@%`9%`2%`+%`$%`%`%`%`%`%`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`|$`u$`n$`g$``$`Y$`R$`K$`D$`=$`6$`/$`($`!$`$`$` $`$`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`y#`r#`k#`d#`]#`V#`O#`H#`A#`:#`3#`,#`%#`#`#`#` #`#`"`"`"`"`"`"`"`"`"`"`"`"`"`"`"`"`"`"`}"`v"`o"`h"`a"`Z"`S"`L"`E"`>"`7"`0"`)"`""`"`"` "`"`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`z!`s!`l!`e!`^!`W!`P!`I!`B!`;!`4!`-!`&!`!`!`!` !`!` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `~ `w `p `i `b `[ `T `M `F `? `8 `1 `* `# ` ` ` ` ` ```````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` `` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `} `v `o `h `a `Z `S `L `E `> `7 `0 `) `" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `z `s `l `e `^ `W `P `I `B `; `4 `- `& ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `~ `w `p `i `b `[ `T `M `F `? `8 `1 `* `# ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `{ `t `m `f `_ `X `Q `J `C `< `5 `. `' ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `x `q `j `c `\ `U `N `G `@ `9 `2 `+ `$ ` ` ` ` ` ```````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ````````````````````}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` `````````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ````````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#````````````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` `````````````````````x`q`j`c`\`U`N`G`@`9`2`+`$````````````````````````|`u`n`g```Y`R`K`D`=`6`/`(`!``` `````````````````````y`r`k`d`]`V`O`H`A`:`3`,`%```` ``__________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______ܿ_տ_ο_ǿ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ _______پ_Ҿ_˾_ľ__________~_w_p_i_b_[_T_M_F_?_8_1_*_#__________ݽ_ֽ_Ͻ_Ƚ___________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _______ڼ_Ӽ_̼_ż___________x_q_j_c_\_U_N_G_@_9_2_+_$__________޻_׻_л_ɻ_»__________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _______ۺ_Ժ_ͺ_ƺ___________y_r_k_d_]_V_O_H_A_:_3_,_%____ ______߹_ع_ѹ_ʹ_ù__________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______ܸ_ո_θ_Ǹ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ _______ٷ_ҷ_˷_ķ__________~_w_p_i_b_[_T_M_F_?_8_1_*_#__________ݶ_ֶ_϶_ȶ___________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _______ڵ_ӵ_̵_ŵ___________x_q_j_c_\_U_N_G_@_9_2_+_$__________޴_״_д_ɴ_´__________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _______۳_Գ_ͳ_Ƴ___________y_r_k_d_]_V_O_H_A_:_3_,_%____ ______߲_ز_Ѳ_ʲ_ò__________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______ܱ_ձ_α_DZ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ _______ٰ_Ұ_˰_İ__________~_w_p_i_b_[_T_M_F_?_8_1_*_#__________ݯ_֯_ϯ_ȯ___________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _______ڮ_Ӯ_̮_Ů___________x_q_j_c_\_U_N_G_@_9_2_+_$__________ޭ_׭_Э_ɭ_­__________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _______۬_Ԭ_ͬ_Ƭ___________y_r_k_d_]_V_O_H_A_:_3_,_%____ ______߫_ث_ѫ_ʫ_ë__________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______ܪ_ժ_Ϊ_Ǫ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ _______٩_ҩ_˩_ĩ__________~_w_p_i_b_[_T_M_F_?_8_1_*_#__________ݨ_֨_Ϩ_Ȩ___________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _______ڧ_ӧ_̧_ŧ___________x_q_j_c_\_U_N_G_@_9_2_+_$__________ަ_צ_Ц_ɦ_¦__________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _______ۥ_ԥ_ͥ_ƥ___________y_r_k_d_]_V_O_H_A_:_3_,_%____ ______ߤ_ؤ_Ѥ_ʤ_ä__________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______ܣ_գ_Σ_ǣ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ _______٢_Ң_ˢ_Ģ__________~_w_p_i_b_[_T_M_F_?_8_1_*_#__________ݡ_֡_ϡ_ȡ___________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _______ڠ_Ӡ_̠_Š___________x_q_j_c_\_U_N_G_@_9_2_+_$__________ޟ_ן_П_ɟ_Ÿ__________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _______۞_Ԟ_͞_ƞ___________y_r_k_d_]_V_O_H_A_:_3_,_%____ ______ߝ_؝_ѝ_ʝ_Ý__________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______ܜ_՜_Μ_ǜ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ _______ٛ_қ_˛_ě__________~_w_p_i_b_[_T_M_F_?_8_1_*_#__________ݚ_֚_Ϛ_Ț___________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _______ڙ_ә_̙_ř___________x_q_j_c_\_U_N_G_@_9_2_+_$__________ޘ_ט_И_ɘ_˜__________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _______ۗ_ԗ_͗_Ɨ___________y_r_k_d_]_V_O_H_A_:_3_,_%____ ______ߖ_ؖ_і_ʖ_Ö__________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______ܕ_Օ_Ε_Ǖ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ _______ٔ_Ҕ_˔_Ĕ__________~_w_p_i_b_[_T_M_F_?_8_1_*_#__________ݓ_֓_ϓ_ȓ___________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _______ڒ_Ӓ_̒_Œ___________x_q_j_c_\_U_N_G_@_9_2_+_$__________ޑ_ב_Б_ɑ_‘__________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _______ې_Ԑ_͐_Ɛ___________y_r_k_d_]_V_O_H_A_:_3_,_%____ ______ߏ_؏_я_ʏ_Ï__________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______܎_Վ_Ύ_ǎ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ _______ٍ_ҍ_ˍ_č__________~_w_p_i_b_[_T_M_F_?_8_1_*_#__________݌_֌_ό_Ȍ___________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _______ڋ_Ӌ_̋_ŋ___________x_q_j_c_\_U_N_G_@_9_2_+_$__________ފ_׊_Њ_Ɋ_Š__________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _______ۉ_ԉ_͉_Ɖ___________y_r_k_d_]_V_O_H_A_:_3_,_%____ ______߈_؈_ш_ʈ_È__________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______܇_Շ_·_LJ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ _______ن_҆_ˆ_Ć__________~_w_p_i_b_[_T_M_F_?_8_1_*_#__________݅_օ_υ_ȅ___________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _______ڄ_ӄ_̄_ń___________x_q_j_c_\_U_N_G_@_9_2_+_$__________ރ_׃_Ѓ_Ƀ_ƒ__________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _______ۂ_Ԃ_͂_Ƃ___________y_r_k_d_]_V_O_H_A_:_3_,_%____ ______߁_؁_с_ʁ_Á__________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _______܀_Հ_΀_ǀ___________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_~_{~_t~_m~_f~__~_X~_Q~_J~_C~_<~_5~_.~_'~_ ~_~_~_ ~_~_}_}_}_}_}_}_}_}_}_}_}_}_}_}_}_}_}_}_}_x}_q}_j}_c}_\}_U}_N}_G}_@}_9}_2}_+}_$}_}_}_}_}_}_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_||_u|_n|_g|_`|_Y|_R|_K|_D|_=|_6|_/|_(|_!|_|_|_ |_|_{_{_{_{_{_{_{_{_{_{_{_{_{_{_{_{_{_{_{_y{_r{_k{_d{_]{_V{_O{_H{_A{_:{_3{_,{_%{_{_{_{_ {_{_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_}z_vz_oz_hz_az_Zz_Sz_Lz_Ez_>z_7z_0z_)z_"z_z_z_ z_z_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_zy_sy_ly_ey_^y_Wy_Py_Iy_By_;y_4y_-y_&y_y_y_y_ y_y_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_~x_wx_px_ix_bx_[x_Tx_Mx_Fx_?x_8x_1x_*x_#x_x_x_x_x_x_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_{w_tw_mw_fw__w_Xw_Qw_Jw_Cw_s_7s_0s_)s_"s_s_s_ s_s_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_zr_sr_lr_er_^r_Wr_Pr_Ir_Br_;r_4r_-r_&r_r_r_r_ r_r_q_q_q_q_q_q_q_q_q_q_q_q_q_q_q_q_q_q_~q_wq_pq_iq_bq_[q_Tq_Mq_Fq_?q_8q_1q_*q_#q_q_q_q_q_q_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_{p_tp_mp_fp__p_Xp_Qp_Jp_Cp_l_7l_0l_)l_"l_l_l_ l_l_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_zk_sk_lk_ek_^k_Wk_Pk_Ik_Bk_;k_4k_-k_&k_k_k_k_ k_k_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_~j_wj_pj_ij_bj_[j_Tj_Mj_Fj_?j_8j_1j_*j_#j_j_j_j_j_j_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_{i_ti_mi_fi__i_Xi_Qi_Ji_Ci_e_7e_0e_)e_"e_e_e_ e_e_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_zd_sd_ld_ed_^d_Wd_Pd_Id_Bd_;d_4d_-d_&d_d_d_d_ d_d_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_c_~c_wc_pc_ic_bc_[c_Tc_Mc_Fc_?c_8c_1c_*c_#c_c_c_c_c_c_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_{b_tb_mb_fb__b_Xb_Qb_Jb_Cb_^_7^_0^_)^_"^_^_^_ ^_^_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_z]_s]_l]_e]_^]_W]_P]_I]_B]_;]_4]_-]_&]_]_]_]_ ]_]_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_~\_w\_p\_i\_b\_[\_T\_M\_F\_?\_8\_1\_*\_#\_\_\_\_\_\_[_[_[_[_[_[_[_[_[_[_[_[_[_[_[_[_[_[_{[_t[_m[_f[__[_X[_Q[_J[_C[_<[_5[_.[_'[_ [_[_[_ [_[_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_xZ_qZ_jZ_cZ_\Z_UZ_NZ_GZ_@Z_9Z_2Z_+Z_$Z_Z_Z_Z_Z_Z_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_|Y_uY_nY_gY_`Y_YY_RY_KY_DY_=Y_6Y_/Y_(Y_!Y_Y_Y_ Y_Y_X_X_X_X_X_X_X_X_X_X_X_X_X_X_X_X_X_X_X_yX_rX_kX_dX_]X_VX_OX_HX_AX_:X_3X_,X_%X_X_X_X_ X_X_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_}W_vW_oW_hW_aW_ZW_SW_LW_EW_>W_7W_0W_)W_"W_W_W_ W_W_V_V_V_V_V_V_V_V_V_V_V_V_V_V_V_V_V_V_V_zV_sV_lV_eV_^V_WV_PV_IV_BV_;V_4V_-V_&V_V_V_V_ V_V_U_U_U_U_U_U_U_U_U_U_U_U_U_U_U_U_U_U_~U_wU_pU_iU_bU_[U_TU_MU_FU_?U_8U_1U_*U_#U_U_U_U_U_U_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_{T_tT_mT_fT__T_XT_QT_JT_CT_P_7P_0P_)P_"P_P_P_ P_P_O_O_O_O_O_O_O_O_O_O_O_O_O_O_O_O_O_O_O_zO_sO_lO_eO_^O_WO_PO_IO_BO_;O_4O_-O_&O_O_O_O_ O_O_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_~N_wN_pN_iN_bN_[N_TN_MN_FN_?N_8N_1N_*N_#N_N_N_N_N_N_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_{M_tM_mM_fM__M_XM_QM_JM_CM_I_7I_0I_)I_"I_I_I_ I_I_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_zH_sH_lH_eH_^H_WH_PH_IH_BH_;H_4H_-H_&H_H_H_H_ H_H_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_~G_wG_pG_iG_bG_[G_TG_MG_FG_?G_8G_1G_*G_#G_G_G_G_G_G_F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_{F_tF_mF_fF__F_XF_QF_JF_CF_B_7B_0B_)B_"B_B_B_ B_B_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_zA_sA_lA_eA_^A_WA_PA_IA_BA_;A_4A_-A_&A_A_A_A_ A_A_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_~@_w@_p@_i@_b@_[@_T@_M@_F@_?@_8@_1@_*@_#@_@_@_@_@_@_?_?_?_?_?_?_?_?_?_?_?_?_?_?_?_?_?_?_{?_t?_m?_f?__?_X?_Q?_J?_C?__>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_x>_q>_j>_c>_\>_U>_N>_G>_@>_9>_2>_+>_$>_>_>_>_>_>_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_|=_u=_n=_g=_`=_Y=_R=_K=_D=_==_6=_/=_(=_!=_=_=_ =_=_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_y<_r<_k<_d<_]<_V<_O<_H<_A<_:<_3<_,<_%<_<_<_<_ <_<_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_};_v;_o;_h;_a;_Z;_S;_L;_E;_>;_7;_0;_);_";_;_;_ ;_;_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_z:_s:_l:_e:_^:_W:_P:_I:_B:_;:_4:_-:_&:_:_:_:_ :_:_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_~9_w9_p9_i9_b9_[9_T9_M9_F9_?9_89_19_*9_#9_9_9_9_9_9_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_{8_t8_m8_f8__8_X8_Q8_J8_C8_<8_58_.8_'8_ 8_8_8_ 8_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_x7_q7_j7_c7_\7_U7_N7_G7_@7_97_27_+7_$7_7_7_7_7_7_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_|6_u6_n6_g6_`6_Y6_R6_K6_D6_=6_66_/6_(6_!6_6_6_ 6_6_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_y5_r5_k5_d5_]5_V5_O5_H5_A5_:5_35_,5_%5_5_5_5_ 5_5_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_}4_v4_o4_h4_a4_Z4_S4_L4_E4_>4_74_04_)4_"4_4_4_ 4_4_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_z3_s3_l3_e3_^3_W3_P3_I3_B3_;3_43_-3_&3_3_3_3_ 3_3_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_~2_w2_p2_i2_b2_[2_T2_M2_F2_?2_82_12_*2_#2_2_2_2_2_2_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_{1_t1_m1_f1__1_X1_Q1_J1_C1_<1_51_.1_'1_ 1_1_1_ 1_1_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_x0_q0_j0_c0_\0_U0_N0_G0_@0_90_20_+0_$0_0_0_0_0_0_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_|/_u/_n/_g/_`/_Y/_R/_K/_D/_=/_6/_//_(/_!/_/_/_ /_/_._._._._._._._._._._._._._._._._._._._y._r._k._d._]._V._O._H._A._:._3._,._%._._._._ ._._-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_}-_v-_o-_h-_a-_Z-_S-_L-_E-_>-_7-_0-_)-_"-_-_-_ -_-_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_z,_s,_l,_e,_^,_W,_P,_I,_B,_;,_4,_-,_&,_,_,_,_ ,_,_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_~+_w+_p+_i+_b+_[+_T+_M+_F+_?+_8+_1+_*+_#+_+_+_+_+_+_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_{*_t*_m*_f*__*_X*_Q*_J*_C*_<*_5*_.*_'*_ *_*_*_ *_*_)_)_)_)_)_)_)_)_)_)_)_)_)_)_)_)_)_)_)_x)_q)_j)_c)_\)_U)_N)_G)_@)_9)_2)_+)_$)_)_)_)_)_)_(_(_(_(_(_(_(_(_(_(_(_(_(_(_(_(_(_(_|(_u(_n(_g(_`(_Y(_R(_K(_D(_=(_6(_/(_((_!(_(_(_ (_(_'_'_'_'_'_'_'_'_'_'_'_'_'_'_'_'_'_'_'_y'_r'_k'_d'_]'_V'_O'_H'_A'_:'_3'_,'_%'_'_'_'_ '_'_&_&_&_&_&_&_&_&_&_&_&_&_&_&_&_&_&_&_}&_v&_o&_h&_a&_Z&_S&_L&_E&_>&_7&_0&_)&_"&_&_&_ &_&_%_%_%_%_%_%_%_%_%_%_%_%_%_%_%_%_%_%_%_z%_s%_l%_e%_^%_W%_P%_I%_B%_;%_4%_-%_&%_%_%_%_ %_%_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_~$_w$_p$_i$_b$_[$_T$_M$_F$_?$_8$_1$_*$_#$_$_$_$_$_$_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_{#_t#_m#_f#__#_X#_Q#_J#_C#_<#_5#_.#_'#_ #_#_#_ #_#_"_"_"_"_"_"_"_"_"_"_"_"_"_"_"_"_"_"_"_x"_q"_j"_c"_\"_U"_N"_G"_@"_9"_2"_+"_$"_"_"_"_"_"_!_!_!_!_!_!_!_!_!_!_!_!_!_!_!_!_!_!_|!_u!_n!_g!_`!_Y!_R!_K!_D!_=!_6!_/!_(!_!!_!_!_ !_!_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _y _r _k _d _] _V _O _H _A _: _3 _, _% _ _ _ _ _ ___________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _x _q _j _c _\ _U _N _G _@ _9 _2 _+ _$ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| _u _n _g _` _Y _R _K _D _= _6 _/ _( _! _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _y _r _k _d _] _V _O _H _A _: _3 _, _% _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _} _v _o _h _a _Z _S _L _E _> _7 _0 _) _" _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _z _s _l _e _^ _W _P _I _B _; _4 _- _& _ _ _ _ _ ___________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ _____________________x_q_j_c_\_U_N_G_@_9_2_+_$________________________|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ _____________________y_r_k_d_]_V_O_H_A_:_3_,_%____ ____________________}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ _____________________z_s_l_e_^_W_P_I_B_;_4_-_&____ ____________________~_w_p_i_b_[_T_M_F_?_8_1_*_#________________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^޿^׿^п^ɿ^¿^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^۾^Ծ^;^ƾ^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^߽^ؽ^ѽ^ʽ^ý^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^ܼ^ռ^μ^Ǽ^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^ٻ^һ^˻^Ļ^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^ݺ^ֺ^Ϻ^Ⱥ^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^ڹ^ӹ^̹^Ź^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^޸^׸^и^ɸ^¸^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^۷^Է^ͷ^Ʒ^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^߶^ض^Ѷ^ʶ^ö^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^ܵ^յ^ε^ǵ^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^ٴ^Ҵ^˴^Ĵ^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^ݳ^ֳ^ϳ^ȳ^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^ڲ^Ӳ^̲^Ų^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^ޱ^ױ^б^ɱ^±^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^۰^԰^Ͱ^ư^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^߯^د^ѯ^ʯ^ï^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^ܮ^ծ^ή^Ǯ^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^٭^ҭ^˭^ĭ^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^ݬ^֬^Ϭ^Ȭ^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^ګ^ӫ^̫^ū^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^ު^ת^Ъ^ɪ^ª^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^۩^ԩ^ͩ^Ʃ^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^ߨ^ب^Ѩ^ʨ^è^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^ܧ^է^Χ^ǧ^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^٦^Ҧ^˦^Ħ^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^ݥ^֥^ϥ^ȥ^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^ڤ^Ӥ^̤^Ť^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^ޣ^ף^У^ɣ^£^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^ۢ^Ԣ^͢^Ƣ^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^ߡ^ء^ѡ^ʡ^á^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^ܠ^ՠ^Π^Ǡ^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^ٟ^ҟ^˟^ğ^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^ݞ^֞^Ϟ^Ȟ^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^ڝ^ӝ^̝^ŝ^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^ޜ^ל^М^ɜ^œ^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^ۛ^ԛ^͛^ƛ^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^ߚ^ؚ^њ^ʚ^Ú^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^ܙ^ՙ^Ι^Ǚ^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^٘^Ҙ^˘^Ę^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^ݗ^֗^ϗ^ȗ^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^ږ^Ӗ^̖^Ŗ^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^ޕ^ו^Е^ɕ^•^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^۔^Ԕ^͔^Ɣ^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^ߓ^ؓ^ѓ^ʓ^Ó^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^ܒ^Ւ^Β^ǒ^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^ّ^ґ^ˑ^đ^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^ݐ^֐^ϐ^Ȑ^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^ڏ^ӏ^̏^ŏ^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^ގ^׎^Ў^Ɏ^Ž^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^ۍ^ԍ^͍^ƍ^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^ߌ^،^ь^ʌ^Ì^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^܋^Ջ^΋^Nj^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^ي^Ҋ^ˊ^Ċ^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^݉^։^ω^ȉ^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^ڈ^ӈ^̈^ň^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^އ^ׇ^Ї^ɇ^‡^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^ۆ^Ԇ^͆^Ɔ^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^߅^؅^х^ʅ^Å^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^܄^Մ^΄^DŽ^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^ك^҃^˃^ă^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^݂^ւ^ς^Ȃ^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^ځ^Ӂ^́^Ł^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^ހ^׀^Ѐ^ɀ^€^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^}~^v~^o~^h~^a~^Z~^S~^L~^E~^>~^7~^0~^)~^"~^~^~^ ~^~^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^z}^s}^l}^e}^^}^W}^P}^I}^B}^;}^4}^-}^&}^}^}^}^ }^}^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^~|^w|^p|^i|^b|^[|^T|^M|^F|^?|^8|^1|^*|^#|^|^|^|^|^|^{^{^{^{^{^{^{^{^{^{^{^{^{^{^{^{^{^{^{{^t{^m{^f{^_{^X{^Q{^J{^C{^<{^5{^.{^'{^ {^{^{^ {^{^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^xz^qz^jz^cz^\z^Uz^Nz^Gz^@z^9z^2z^+z^$z^z^z^z^z^z^y^y^y^y^y^y^y^y^y^y^y^y^y^y^y^y^y^y^|y^uy^ny^gy^`y^Yy^Ry^Ky^Dy^=y^6y^/y^(y^!y^y^y^ y^y^x^x^x^x^x^x^x^x^x^x^x^x^x^x^x^x^x^x^x^yx^rx^kx^dx^]x^Vx^Ox^Hx^Ax^:x^3x^,x^%x^x^x^x^ x^x^w^w^w^w^w^w^w^w^w^w^w^w^w^w^w^w^w^w^}w^vw^ow^hw^aw^Zw^Sw^Lw^Ew^>w^7w^0w^)w^"w^w^w^ w^w^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^zv^sv^lv^ev^^v^Wv^Pv^Iv^Bv^;v^4v^-v^&v^v^v^v^ v^v^u^u^u^u^u^u^u^u^u^u^u^u^u^u^u^u^u^u^~u^wu^pu^iu^bu^[u^Tu^Mu^Fu^?u^8u^1u^*u^#u^u^u^u^u^u^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^{t^tt^mt^ft^_t^Xt^Qt^Jt^Ct^p^7p^0p^)p^"p^p^p^ p^p^o^o^o^o^o^o^o^o^o^o^o^o^o^o^o^o^o^o^o^zo^so^lo^eo^^o^Wo^Po^Io^Bo^;o^4o^-o^&o^o^o^o^ o^o^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^~n^wn^pn^in^bn^[n^Tn^Mn^Fn^?n^8n^1n^*n^#n^n^n^n^n^n^m^m^m^m^m^m^m^m^m^m^m^m^m^m^m^m^m^m^{m^tm^mm^fm^_m^Xm^Qm^Jm^Cm^i^7i^0i^)i^"i^i^i^ i^i^h^h^h^h^h^h^h^h^h^h^h^h^h^h^h^h^h^h^h^zh^sh^lh^eh^^h^Wh^Ph^Ih^Bh^;h^4h^-h^&h^h^h^h^ h^h^g^g^g^g^g^g^g^g^g^g^g^g^g^g^g^g^g^g^~g^wg^pg^ig^bg^[g^Tg^Mg^Fg^?g^8g^1g^*g^#g^g^g^g^g^g^f^f^f^f^f^f^f^f^f^f^f^f^f^f^f^f^f^f^{f^tf^mf^ff^_f^Xf^Qf^Jf^Cf^b^7b^0b^)b^"b^b^b^ b^b^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^a^za^sa^la^ea^^a^Wa^Pa^Ia^Ba^;a^4a^-a^&a^a^a^a^ a^a^`^`^`^`^`^`^`^`^`^`^`^`^`^`^`^`^`^`^~`^w`^p`^i`^b`^[`^T`^M`^F`^?`^8`^1`^*`^#`^`^`^`^`^`^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^{_^t_^m_^f_^__^X_^Q_^J_^C_^<_^5_^._^'_^ _^_^_^ _^_^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^x^^q^^j^^c^^\^^U^^N^^G^^@^^9^^2^^+^^$^^^^^^^^^^^^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^|]^u]^n]^g]^`]^Y]^R]^K]^D]^=]^6]^/]^(]^!]^]^]^ ]^]^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^y\^r\^k\^d\^]\^V\^O\^H\^A\^:\^3\^,\^%\^\^\^\^ \^\^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^}[^v[^o[^h[^a[^Z[^S[^L[^E[^>[^7[^0[^)[^"[^[^[^ [^[^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^Z^zZ^sZ^lZ^eZ^^Z^WZ^PZ^IZ^BZ^;Z^4Z^-Z^&Z^Z^Z^Z^ Z^Z^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^~Y^wY^pY^iY^bY^[Y^TY^MY^FY^?Y^8Y^1Y^*Y^#Y^Y^Y^Y^Y^Y^X^X^X^X^X^X^X^X^X^X^X^X^X^X^X^X^X^X^{X^tX^mX^fX^_X^XX^QX^JX^CX^T^7T^0T^)T^"T^T^T^ T^T^S^S^S^S^S^S^S^S^S^S^S^S^S^S^S^S^S^S^S^zS^sS^lS^eS^^S^WS^PS^IS^BS^;S^4S^-S^&S^S^S^S^ S^S^R^R^R^R^R^R^R^R^R^R^R^R^R^R^R^R^R^R^~R^wR^pR^iR^bR^[R^TR^MR^FR^?R^8R^1R^*R^#R^R^R^R^R^R^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^{Q^tQ^mQ^fQ^_Q^XQ^QQ^JQ^CQ^M^7M^0M^)M^"M^M^M^ M^M^L^L^L^L^L^L^L^L^L^L^L^L^L^L^L^L^L^L^L^zL^sL^lL^eL^^L^WL^PL^IL^BL^;L^4L^-L^&L^L^L^L^ L^L^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^~K^wK^pK^iK^bK^[K^TK^MK^FK^?K^8K^1K^*K^#K^K^K^K^K^K^J^J^J^J^J^J^J^J^J^J^J^J^J^J^J^J^J^J^{J^tJ^mJ^fJ^_J^XJ^QJ^JJ^CJ^F^7F^0F^)F^"F^F^F^ F^F^E^E^E^E^E^E^E^E^E^E^E^E^E^E^E^E^E^E^E^zE^sE^lE^eE^^E^WE^PE^IE^BE^;E^4E^-E^&E^E^E^E^ E^E^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^~D^wD^pD^iD^bD^[D^TD^MD^FD^?D^8D^1D^*D^#D^D^D^D^D^D^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^{C^tC^mC^fC^_C^XC^QC^JC^CC^?^7?^0?^)?^"?^?^?^ ?^?^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^z>^s>^l>^e>^^>^W>^P>^I>^B>^;>^4>^->^&>^>^>^>^ >^>^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^~=^w=^p=^i=^b=^[=^T=^M=^F=^?=^8=^1=^*=^#=^=^=^=^=^=^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^{<^t<^m<^f<^_<^X<^Q<^J<^C<^<<^5<^.<^'<^ <^<^<^ <^<^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^x;^q;^j;^c;^\;^U;^N;^G;^@;^9;^2;^+;^$;^;^;^;^;^;^:^:^:^:^:^:^:^:^:^:^:^:^:^:^:^:^:^:^|:^u:^n:^g:^`:^Y:^R:^K:^D:^=:^6:^/:^(:^!:^:^:^ :^:^9^9^9^9^9^9^9^9^9^9^9^9^9^9^9^9^9^9^9^y9^r9^k9^d9^]9^V9^O9^H9^A9^:9^39^,9^%9^9^9^9^ 9^9^8^8^8^8^8^8^8^8^8^8^8^8^8^8^8^8^8^8^}8^v8^o8^h8^a8^Z8^S8^L8^E8^>8^78^08^)8^"8^8^8^ 8^8^7^7^7^7^7^7^7^7^7^7^7^7^7^7^7^7^7^7^7^z7^s7^l7^e7^^7^W7^P7^I7^B7^;7^47^-7^&7^7^7^7^ 7^7^6^6^6^6^6^6^6^6^6^6^6^6^6^6^6^6^6^6^~6^w6^p6^i6^b6^[6^T6^M6^F6^?6^86^16^*6^#6^6^6^6^6^6^5^5^5^5^5^5^5^5^5^5^5^5^5^5^5^5^5^5^{5^t5^m5^f5^_5^X5^Q5^J5^C5^<5^55^.5^'5^ 5^5^5^ 5^5^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^x4^q4^j4^c4^\4^U4^N4^G4^@4^94^24^+4^$4^4^4^4^4^4^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^|3^u3^n3^g3^`3^Y3^R3^K3^D3^=3^63^/3^(3^!3^3^3^ 3^3^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^y2^r2^k2^d2^]2^V2^O2^H2^A2^:2^32^,2^%2^2^2^2^ 2^2^1^1^1^1^1^1^1^1^1^1^1^1^1^1^1^1^1^1^}1^v1^o1^h1^a1^Z1^S1^L1^E1^>1^71^01^)1^"1^1^1^ 1^1^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^z0^s0^l0^e0^^0^W0^P0^I0^B0^;0^40^-0^&0^0^0^0^ 0^0^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^~/^w/^p/^i/^b/^[/^T/^M/^F/^?/^8/^1/^*/^#/^/^/^/^/^/^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^{.^t.^m.^f.^_.^X.^Q.^J.^C.^<.^5.^..^'.^ .^.^.^ .^.^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^x-^q-^j-^c-^\-^U-^N-^G-^@-^9-^2-^+-^$-^-^-^-^-^-^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^|,^u,^n,^g,^`,^Y,^R,^K,^D,^=,^6,^/,^(,^!,^,^,^ ,^,^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^y+^r+^k+^d+^]+^V+^O+^H+^A+^:+^3+^,+^%+^+^+^+^ +^+^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^}*^v*^o*^h*^a*^Z*^S*^L*^E*^>*^7*^0*^)*^"*^*^*^ *^*^)^)^)^)^)^)^)^)^)^)^)^)^)^)^)^)^)^)^)^z)^s)^l)^e)^^)^W)^P)^I)^B)^;)^4)^-)^&)^)^)^)^ )^)^(^(^(^(^(^(^(^(^(^(^(^(^(^(^(^(^(^(^~(^w(^p(^i(^b(^[(^T(^M(^F(^?(^8(^1(^*(^#(^(^(^(^(^(^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^{'^t'^m'^f'^_'^X'^Q'^J'^C'^<'^5'^.'^''^ '^'^'^ '^'^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^x&^q&^j&^c&^\&^U&^N&^G&^@&^9&^2&^+&^$&^&^&^&^&^&^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^|%^u%^n%^g%^`%^Y%^R%^K%^D%^=%^6%^/%^(%^!%^%^%^ %^%^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^y$^r$^k$^d$^]$^V$^O$^H$^A$^:$^3$^,$^%$^$^$^$^ $^$^#^#^#^#^#^#^#^#^#^#^#^#^#^#^#^#^#^#^}#^v#^o#^h#^a#^Z#^S#^L#^E#^>#^7#^0#^)#^"#^#^#^ #^#^"^"^"^"^"^"^"^"^"^"^"^"^"^"^"^"^"^"^"^z"^s"^l"^e"^^"^W"^P"^I"^B"^;"^4"^-"^&"^"^"^"^ "^"^!^!^!^!^!^!^!^!^!^!^!^!^!^!^!^!^!^!^~!^w!^p!^i!^b!^[!^T!^M!^F!^?!^8!^1!^*!^#!^!^!^!^!^!^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^{ ^t ^m ^f ^_ ^X ^Q ^J ^C ^< ^5 ^. ^' ^ ^ ^ ^ ^ ^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^z ^s ^l ^e ^^ ^W ^P ^I ^B ^; ^4 ^- ^& ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^~ ^w ^p ^i ^b ^[ ^T ^M ^F ^? ^8 ^1 ^* ^# ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^{ ^t ^m ^f ^_ ^X ^Q ^J ^C ^< ^5 ^. ^' ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^x ^q ^j ^c ^\ ^U ^N ^G ^@ ^9 ^2 ^+ ^$ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^| ^u ^n ^g ^` ^Y ^R ^K ^D ^= ^6 ^/ ^( ^! ^ ^ ^ ^ ^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^^^^^^^^^^^^^^^^^^^^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^^^^^^^^^^^^^^^^^^^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]ٿ]ҿ]˿]Ŀ]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]ݾ]־]Ͼ]Ⱦ]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]ڽ]ӽ]̽]Ž]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]޼]׼]м]ɼ]¼]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]ۻ]Ի]ͻ]ƻ]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]ߺ]غ]Ѻ]ʺ]ú]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]ܹ]չ]ι]ǹ]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]ٸ]Ҹ]˸]ĸ]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]ݷ]ַ]Ϸ]ȷ]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]ڶ]Ӷ]̶]Ŷ]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]޵]׵]е]ɵ]µ]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]۴]Դ]ʹ]ƴ]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]߳]س]ѳ]ʳ]ó]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]ܲ]ղ]β]Dz]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]ٱ]ұ]˱]ı]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]ݰ]ְ]ϰ]Ȱ]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]گ]ӯ]̯]ů]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]ޮ]׮]Ю]ɮ]®]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]ۭ]ԭ]ͭ]ƭ]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]߬]ج]Ѭ]ʬ]ì]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]ܫ]ի]Ϋ]ǫ]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]٪]Ҫ]˪]Ī]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]ݩ]֩]ϩ]ȩ]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]ڨ]Ө]̨]Ũ]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]ާ]ק]Ч]ɧ]§]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]ۦ]Ԧ]ͦ]Ʀ]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]ߥ]إ]ѥ]ʥ]å]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]ܤ]դ]Τ]Ǥ]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]٣]ң]ˣ]ģ]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]ݢ]֢]Ϣ]Ȣ]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]ڡ]ӡ]̡]š]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]ޠ]נ]Р]ɠ] ]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]۟]ԟ]͟]Ɵ]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]ߞ]؞]ў]ʞ]Þ]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]ܝ]՝]Ν]ǝ]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]ٜ]Ҝ]˜]Ĝ]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]ݛ]֛]ϛ]ț]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]ښ]Ӛ]̚]Ś]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]ޙ]י]Й]ə]™]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]ۘ]Ԙ]͘]Ƙ]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]ߗ]ؗ]ї]ʗ]×]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]ܖ]Ֆ]Ζ]ǖ]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]ٕ]ҕ]˕]ĕ]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]ݔ]֔]ϔ]Ȕ]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]ړ]ӓ]̓]œ]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]ޒ]ג]В]ɒ]’]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]ۑ]ԑ]͑]Ƒ]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]ߐ]ؐ]ѐ]ʐ]Ð]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]܏]Տ]Ώ]Ǐ]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]َ]Ҏ]ˎ]Ď]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]ݍ]֍]ύ]ȍ]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]ڌ]ӌ]̌]Ō]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]ދ]׋]Ћ]ɋ]‹]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]ۊ]Ԋ]͊]Ɗ]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]߉]؉]щ]ʉ]É]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]܈]Ո]Έ]Lj]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]ه]҇]ˇ]ć]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]݆]ֆ]φ]Ȇ]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]څ]Ӆ]̅]Ņ]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]ބ]ׄ]Є]Ʉ]„]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]ۃ]ԃ]̓]ƃ]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]߂]؂]т]ʂ]Â]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]܁]Ձ]΁]ǁ]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]ـ]Ҁ]ˀ]Ā]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]~]~]~]~]~]~]~]~]~]~]~]~]~]~]~]~]~]~]~]x~]q~]j~]c~]\~]U~]N~]G~]@~]9~]2~]+~]$~]~]~]~]~]~]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]|}]u}]n}]g}]`}]Y}]R}]K}]D}]=}]6}]/}](}]!}]}]}] }]}]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]|]y|]r|]k|]d|]]|]V|]O|]H|]A|]:|]3|],|]%|]|]|]|] |]|]{]{]{]{]{]{]{]{]{]{]{]{]{]{]{]{]{]{]}{]v{]o{]h{]a{]Z{]S{]L{]E{]>{]7{]0{]){]"{]{]{] {]{]z]z]z]z]z]z]z]z]z]z]z]z]z]z]z]z]z]z]z]zz]sz]lz]ez]^z]Wz]Pz]Iz]Bz];z]4z]-z]&z]z]z]z] z]z]y]y]y]y]y]y]y]y]y]y]y]y]y]y]y]y]y]y]~y]wy]py]iy]by][y]Ty]My]Fy]?y]8y]1y]*y]#y]y]y]y]y]y]x]x]x]x]x]x]x]x]x]x]x]x]x]x]x]x]x]x]{x]tx]mx]fx]_x]Xx]Qx]Jx]Cx]t]7t]0t])t]"t]t]t] t]t]s]s]s]s]s]s]s]s]s]s]s]s]s]s]s]s]s]s]s]zs]ss]ls]es]^s]Ws]Ps]Is]Bs];s]4s]-s]&s]s]s]s] s]s]r]r]r]r]r]r]r]r]r]r]r]r]r]r]r]r]r]r]~r]wr]pr]ir]br][r]Tr]Mr]Fr]?r]8r]1r]*r]#r]r]r]r]r]r]q]q]q]q]q]q]q]q]q]q]q]q]q]q]q]q]q]q]{q]tq]mq]fq]_q]Xq]Qq]Jq]Cq]m]7m]0m])m]"m]m]m] m]m]l]l]l]l]l]l]l]l]l]l]l]l]l]l]l]l]l]l]l]zl]sl]ll]el]^l]Wl]Pl]Il]Bl];l]4l]-l]&l]l]l]l] l]l]k]k]k]k]k]k]k]k]k]k]k]k]k]k]k]k]k]k]~k]wk]pk]ik]bk][k]Tk]Mk]Fk]?k]8k]1k]*k]#k]k]k]k]k]k]j]j]j]j]j]j]j]j]j]j]j]j]j]j]j]j]j]j]{j]tj]mj]fj]_j]Xj]Qj]Jj]Cj]f]7f]0f])f]"f]f]f] f]f]e]e]e]e]e]e]e]e]e]e]e]e]e]e]e]e]e]e]e]ze]se]le]ee]^e]We]Pe]Ie]Be];e]4e]-e]&e]e]e]e] e]e]d]d]d]d]d]d]d]d]d]d]d]d]d]d]d]d]d]d]~d]wd]pd]id]bd][d]Td]Md]Fd]?d]8d]1d]*d]#d]d]d]d]d]d]c]c]c]c]c]c]c]c]c]c]c]c]c]c]c]c]c]c]{c]tc]mc]fc]_c]Xc]Qc]Jc]Cc]_]7_]0_])_]"_]_]_] _]_]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]z^]s^]l^]e^]^^]W^]P^]I^]B^];^]4^]-^]&^]^]^]^] ^]^]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]~]]w]]p]]i]]b]][]]T]]M]]F]]?]]8]]1]]*]]#]]]]]]]]]]]]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]{\]t\]m\]f\]_\]X\]Q\]J\]C\]<\]5\].\]'\] \]\]\] \]\][][][][][][][][][][][][][][][][][][][]x[]q[]j[]c[]\[]U[]N[]G[]@[]9[]2[]+[]$[][][][][][]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]|Z]uZ]nZ]gZ]`Z]YZ]RZ]KZ]DZ]=Z]6Z]/Z](Z]!Z]Z]Z] Z]Z]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]yY]rY]kY]dY]]Y]VY]OY]HY]AY]:Y]3Y],Y]%Y]Y]Y]Y] Y]Y]X]X]X]X]X]X]X]X]X]X]X]X]X]X]X]X]X]X]}X]vX]oX]hX]aX]ZX]SX]LX]EX]>X]7X]0X])X]"X]X]X] X]X]W]W]W]W]W]W]W]W]W]W]W]W]W]W]W]W]W]W]W]zW]sW]lW]eW]^W]WW]PW]IW]BW];W]4W]-W]&W]W]W]W] W]W]V]V]V]V]V]V]V]V]V]V]V]V]V]V]V]V]V]V]~V]wV]pV]iV]bV][V]TV]MV]FV]?V]8V]1V]*V]#V]V]V]V]V]V]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]{U]tU]mU]fU]_U]XU]QU]JU]CU]Q]7Q]0Q])Q]"Q]Q]Q] Q]Q]P]P]P]P]P]P]P]P]P]P]P]P]P]P]P]P]P]P]P]zP]sP]lP]eP]^P]WP]PP]IP]BP];P]4P]-P]&P]P]P]P] P]P]O]O]O]O]O]O]O]O]O]O]O]O]O]O]O]O]O]O]~O]wO]pO]iO]bO][O]TO]MO]FO]?O]8O]1O]*O]#O]O]O]O]O]O]N]N]N]N]N]N]N]N]N]N]N]N]N]N]N]N]N]N]{N]tN]mN]fN]_N]XN]QN]JN]CN]J]7J]0J])J]"J]J]J] J]J]I]I]I]I]I]I]I]I]I]I]I]I]I]I]I]I]I]I]I]zI]sI]lI]eI]^I]WI]PI]II]BI];I]4I]-I]&I]I]I]I] I]I]H]H]H]H]H]H]H]H]H]H]H]H]H]H]H]H]H]H]~H]wH]pH]iH]bH][H]TH]MH]FH]?H]8H]1H]*H]#H]H]H]H]H]H]G]G]G]G]G]G]G]G]G]G]G]G]G]G]G]G]G]G]{G]tG]mG]fG]_G]XG]QG]JG]CG]C]7C]0C])C]"C]C]C] C]C]B]B]B]B]B]B]B]B]B]B]B]B]B]B]B]B]B]B]B]zB]sB]lB]eB]^B]WB]PB]IB]BB];B]4B]-B]&B]B]B]B] B]B]A]A]A]A]A]A]A]A]A]A]A]A]A]A]A]A]A]A]~A]wA]pA]iA]bA][A]TA]MA]FA]?A]8A]1A]*A]#A]A]A]A]A]A]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]{@]t@]m@]f@]_@]X@]Q@]J@]C@]<@]5@].@]'@] @]@]@] @]@]?]?]?]?]?]?]?]?]?]?]?]?]?]?]?]?]?]?]?]x?]q?]j?]c?]\?]U?]N?]G?]@?]9?]2?]+?]$?]?]?]?]?]?]>]>]>]>]>]>]>]>]>]>]>]>]>]>]>]>]>]>]|>]u>]n>]g>]`>]Y>]R>]K>]D>]=>]6>]/>](>]!>]>]>] >]>]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]y=]r=]k=]d=]]=]V=]O=]H=]A=]:=]3=],=]%=]=]=]=] =]=]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]}<]v<]o<]h<]a<]Z<]S<]L<]E<]><]7<]0<])<]"<]<]<] <]<];];];];];];];];];];];];];];];];];];];]z;]s;]l;]e;]^;]W;]P;]I;]B;];;]4;]-;]&;];];];] ;];]:]:]:]:]:]:]:]:]:]:]:]:]:]:]:]:]:]:]~:]w:]p:]i:]b:][:]T:]M:]F:]?:]8:]1:]*:]#:]:]:]:]:]:]9]9]9]9]9]9]9]9]9]9]9]9]9]9]9]9]9]9]{9]t9]m9]f9]_9]X9]Q9]J9]C9]<9]59].9]'9] 9]9]9] 9]9]8]8]8]8]8]8]8]8]8]8]8]8]8]8]8]8]8]8]8]x8]q8]j8]c8]\8]U8]N8]G8]@8]98]28]+8]$8]8]8]8]8]8]7]7]7]7]7]7]7]7]7]7]7]7]7]7]7]7]7]7]|7]u7]n7]g7]`7]Y7]R7]K7]D7]=7]67]/7](7]!7]7]7] 7]7]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]y6]r6]k6]d6]]6]V6]O6]H6]A6]:6]36],6]%6]6]6]6] 6]6]5]5]5]5]5]5]5]5]5]5]5]5]5]5]5]5]5]5]}5]v5]o5]h5]a5]Z5]S5]L5]E5]>5]75]05])5]"5]5]5] 5]5]4]4]4]4]4]4]4]4]4]4]4]4]4]4]4]4]4]4]4]z4]s4]l4]e4]^4]W4]P4]I4]B4];4]44]-4]&4]4]4]4] 4]4]3]3]3]3]3]3]3]3]3]3]3]3]3]3]3]3]3]3]~3]w3]p3]i3]b3][3]T3]M3]F3]?3]83]13]*3]#3]3]3]3]3]3]2]2]2]2]2]2]2]2]2]2]2]2]2]2]2]2]2]2]{2]t2]m2]f2]_2]X2]Q2]J2]C2]<2]52].2]'2] 2]2]2] 2]2]1]1]1]1]1]1]1]1]1]1]1]1]1]1]1]1]1]1]1]x1]q1]j1]c1]\1]U1]N1]G1]@1]91]21]+1]$1]1]1]1]1]1]0]0]0]0]0]0]0]0]0]0]0]0]0]0]0]0]0]0]|0]u0]n0]g0]`0]Y0]R0]K0]D0]=0]60]/0](0]!0]0]0] 0]0]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]y/]r/]k/]d/]]/]V/]O/]H/]A/]:/]3/],/]%/]/]/]/] /]/].].].].].].].].].].].].].].].].].].]}.]v.]o.]h.]a.]Z.]S.]L.]E.]>.]7.]0.]).]".].].] .].]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]z-]s-]l-]e-]^-]W-]P-]I-]B-];-]4-]--]&-]-]-]-] -]-],],],],],],],],],],],],],],],],],],]~,]w,]p,]i,]b,][,]T,]M,]F,]?,]8,]1,]*,]#,],],],],],]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]{+]t+]m+]f+]_+]X+]Q+]J+]C+]<+]5+].+]'+] +]+]+] +]+]*]*]*]*]*]*]*]*]*]*]*]*]*]*]*]*]*]*]*]x*]q*]j*]c*]\*]U*]N*]G*]@*]9*]2*]+*]$*]*]*]*]*]*])])])])])])])])])])])])])])])])])])]|)]u)]n)]g)]`)]Y)]R)]K)]D)]=)]6)]/)]()]!)])])] )])](](](](](](](](](](](](](](](](](](](]y(]r(]k(]d(]](]V(]O(]H(]A(]:(]3(],(]%(](](](] (](]']']']']']']']']']']']']']']']']']']}']v']o']h']a']Z']S']L']E']>']7']0'])']"']']'] ']']&]&]&]&]&]&]&]&]&]&]&]&]&]&]&]&]&]&]&]z&]s&]l&]e&]^&]W&]P&]I&]B&];&]4&]-&]&&]&]&]&] &]&]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]~%]w%]p%]i%]b%][%]T%]M%]F%]?%]8%]1%]*%]#%]%]%]%]%]%]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]{$]t$]m$]f$]_$]X$]Q$]J$]C$]<$]5$].$]'$] $]$]$] $]$]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]x#]q#]j#]c#]\#]U#]N#]G#]@#]9#]2#]+#]$#]#]#]#]#]#]"]"]"]"]"]"]"]"]"]"]"]"]"]"]"]"]"]"]|"]u"]n"]g"]`"]Y"]R"]K"]D"]="]6"]/"]("]!"]"]"] "]"]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]y!]r!]k!]d!]]!]V!]O!]H!]A!]:!]3!],!]%!]!]!]!] !]!] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]} ]v ]o ]h ]a ]Z ]S ]L ]E ]> ]7 ]0 ]) ]" ] ] ] ] ]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]| ]u ]n ]g ]` ]Y ]R ]K ]D ]= ]6 ]/ ]( ]! ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]y ]r ]k ]d ]] ]V ]O ]H ]A ]: ]3 ], ]% ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]} ]v ]o ]h ]a ]Z ]S ]L ]E ]> ]7 ]0 ]) ]" ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]z ]s ]l ]e ]^ ]W ]P ]I ]B ]; ]4 ]- ]& ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]~ ]w ]p ]i ]b ][ ]T ]M ]F ]? ]8 ]1 ]* ]# ] ] ] ] ] ]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]]]]]]]]]]]]]]]]]]]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\ۿ\Կ\Ϳ\ƿ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\߾\ؾ\Ѿ\ʾ\þ\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\ܽ\ս\ν\ǽ\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\ټ\Ҽ\˼\ļ\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\ݻ\ֻ\ϻ\Ȼ\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\ں\Ӻ\̺\ź\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\޹\׹\й\ɹ\¹\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\۸\Ը\͸\Ƹ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\߷\ط\ѷ\ʷ\÷\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\ܶ\ն\ζ\Ƕ\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\ٵ\ҵ\˵\ĵ\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\ݴ\ִ\ϴ\ȴ\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\ڳ\ӳ\̳\ų\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\޲\ײ\в\ɲ\²\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\۱\Ա\ͱ\Ʊ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\߰\ذ\Ѱ\ʰ\ð\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\ܯ\կ\ί\ǯ\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\ٮ\Ү\ˮ\Į\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\ݭ\֭\ϭ\ȭ\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\ڬ\Ӭ\̬\Ŭ\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\ޫ\׫\Ы\ɫ\«\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\۪\Ԫ\ͪ\ƪ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\ߩ\ة\ѩ\ʩ\é\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\ܨ\ը\Ψ\Ǩ\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\٧\ҧ\˧\ħ\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\ݦ\֦\Ϧ\Ȧ\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\ڥ\ӥ\̥\ť\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\ޤ\פ\Ф\ɤ\¤\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\ۣ\ԣ\ͣ\ƣ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\ߢ\آ\Ѣ\ʢ\â\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\ܡ\ա\Ρ\ǡ\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\٠\Ҡ\ˠ\Ġ\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\ݟ\֟\ϟ\ȟ\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\ڞ\Ӟ\̞\Ş\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\ޝ\ם\Н\ɝ\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\ۜ\Ԝ\͜\Ɯ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\ߛ\؛\ћ\ʛ\Û\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\ܚ\՚\Κ\ǚ\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\ٙ\ҙ\˙\ę\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\ݘ\֘\Ϙ\Ș\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\ڗ\ӗ\̗\ŗ\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\ޖ\ז\Ж\ɖ\–\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\ە\ԕ\͕\ƕ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\ߔ\ؔ\є\ʔ\Ô\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\ܓ\Փ\Γ\Ǔ\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\ْ\Ғ\˒\Ē\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\ݑ\֑\ϑ\ȑ\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\ڐ\Ӑ\̐\Ő\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\ޏ\׏\Џ\ɏ\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\ێ\Ԏ\͎\Ǝ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\ߍ\؍\э\ʍ\Í\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\܌\Ռ\Ό\nj\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\ً\ҋ\ˋ\ċ\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\݊\֊\ϊ\Ȋ\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\ډ\Ӊ\̉\ʼn\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\ވ\׈\Ј\Ɉ\ˆ\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\ۇ\ԇ\͇\Ƈ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\߆\؆\ц\ʆ\Æ\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\܅\Յ\΅\Dž\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\ل\҄\˄\Ą\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\݃\փ\σ\ȃ\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\ڂ\ӂ\̂\ł\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\ށ\ׁ\Ё\Ɂ\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\ۀ\Ԁ\̀\ƀ\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\z~\s~\l~\e~\^~\W~\P~\I~\B~\;~\4~\-~\&~\~\~\~\ ~\~\}\}\}\}\}\}\}\}\}\}\}\}\}\}\}\}\}\}\~}\w}\p}\i}\b}\[}\T}\M}\F}\?}\8}\1}\*}\#}\}\}\}\}\}\|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\{|\t|\m|\f|\_|\X|\Q|\J|\C|\<|\5|\.|\'|\ |\|\|\ |\|\{\{\{\{\{\{\{\{\{\{\{\{\{\{\{\{\{\{\{\x{\q{\j{\c{\\{\U{\N{\G{\@{\9{\2{\+{\${\{\{\{\{\{\z\z\z\z\z\z\z\z\z\z\z\z\z\z\z\z\z\z\|z\uz\nz\gz\`z\Yz\Rz\Kz\Dz\=z\6z\/z\(z\!z\z\z\ z\z\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\yy\ry\ky\dy\]y\Vy\Oy\Hy\Ay\:y\3y\,y\%y\y\y\y\ y\y\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\}x\vx\ox\hx\ax\Zx\Sx\Lx\Ex\>x\7x\0x\)x\"x\x\x\ x\x\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\zw\sw\lw\ew\^w\Ww\Pw\Iw\Bw\;w\4w\-w\&w\w\w\w\ w\w\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\~v\wv\pv\iv\bv\[v\Tv\Mv\Fv\?v\8v\1v\*v\#v\v\v\v\v\v\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\{u\tu\mu\fu\_u\Xu\Qu\Ju\Cu\q\7q\0q\)q\"q\q\q\ q\q\p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\p\zp\sp\lp\ep\^p\Wp\Pp\Ip\Bp\;p\4p\-p\&p\p\p\p\ p\p\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\~o\wo\po\io\bo\[o\To\Mo\Fo\?o\8o\1o\*o\#o\o\o\o\o\o\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\{n\tn\mn\fn\_n\Xn\Qn\Jn\Cn\j\7j\0j\)j\"j\j\j\ j\j\i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\i\zi\si\li\ei\^i\Wi\Pi\Ii\Bi\;i\4i\-i\&i\i\i\i\ i\i\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\~h\wh\ph\ih\bh\[h\Th\Mh\Fh\?h\8h\1h\*h\#h\h\h\h\h\h\g\g\g\g\g\g\g\g\g\g\g\g\g\g\g\g\g\g\{g\tg\mg\fg\_g\Xg\Qg\Jg\Cg\c\7c\0c\)c\"c\c\c\ c\c\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\zb\sb\lb\eb\^b\Wb\Pb\Ib\Bb\;b\4b\-b\&b\b\b\b\ b\b\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\~a\wa\pa\ia\ba\[a\Ta\Ma\Fa\?a\8a\1a\*a\#a\a\a\a\a\a\`\`\`\`\`\`\`\`\`\`\`\`\`\`\`\`\`\`\{`\t`\m`\f`\_`\X`\Q`\J`\C`\<`\5`\.`\'`\ `\`\`\ `\`\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\x_\q_\j_\c_\\_\U_\N_\G_\@_\9_\2_\+_\$_\_\_\_\_\_\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\|^\u^\n^\g^\`^\Y^\R^\K^\D^\=^\6^\/^\(^\!^\^\^\ ^\^\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\y]\r]\k]\d]\]]\V]\O]\H]\A]\:]\3]\,]\%]\]\]\]\ ]\]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}\\v\\o\\h\\a\\Z\\S\\L\\E\\>\\7\\0\\)\\"\\\\\\ \\\\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\z[\s[\l[\e[\^[\W[\P[\I[\B[\;[\4[\-[\&[\[\[\[\ [\[\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\~Z\wZ\pZ\iZ\bZ\[Z\TZ\MZ\FZ\?Z\8Z\1Z\*Z\#Z\Z\Z\Z\Z\Z\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\{Y\tY\mY\fY\_Y\XY\QY\JY\CY\U\7U\0U\)U\"U\U\U\ U\U\T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\zT\sT\lT\eT\^T\WT\PT\IT\BT\;T\4T\-T\&T\T\T\T\ T\T\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\~S\wS\pS\iS\bS\[S\TS\MS\FS\?S\8S\1S\*S\#S\S\S\S\S\S\R\R\R\R\R\R\R\R\R\R\R\R\R\R\R\R\R\R\{R\tR\mR\fR\_R\XR\QR\JR\CR\N\7N\0N\)N\"N\N\N\ N\N\M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\zM\sM\lM\eM\^M\WM\PM\IM\BM\;M\4M\-M\&M\M\M\M\ M\M\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\~L\wL\pL\iL\bL\[L\TL\ML\FL\?L\8L\1L\*L\#L\L\L\L\L\L\K\K\K\K\K\K\K\K\K\K\K\K\K\K\K\K\K\K\{K\tK\mK\fK\_K\XK\QK\JK\CK\G\7G\0G\)G\"G\G\G\ G\G\F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\zF\sF\lF\eF\^F\WF\PF\IF\BF\;F\4F\-F\&F\F\F\F\ F\F\E\E\E\E\E\E\E\E\E\E\E\E\E\E\E\E\E\E\~E\wE\pE\iE\bE\[E\TE\ME\FE\?E\8E\1E\*E\#E\E\E\E\E\E\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\{D\tD\mD\fD\_D\XD\QD\JD\CD\@\7@\0@\)@\"@\@\@\ @\@\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\z?\s?\l?\e?\^?\W?\P?\I?\B?\;?\4?\-?\&?\?\?\?\ ?\?\>\>\>\>\>\>\>\>\>\>\>\>\>\>\>\>\>\>\~>\w>\p>\i>\b>\[>\T>\M>\F>\?>\8>\1>\*>\#>\>\>\>\>\>\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\{=\t=\m=\f=\_=\X=\Q=\J=\C=\<=\5=\.=\'=\ =\=\=\ =\=\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\x<\q<\j<\c<\\<\U<\N<\G<\@<\9<\2<\+<\$<\<\<\<\<\<\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\|;\u;\n;\g;\`;\Y;\R;\K;\D;\=;\6;\/;\(;\!;\;\;\ ;\;\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\y:\r:\k:\d:\]:\V:\O:\H:\A:\::\3:\,:\%:\:\:\:\ :\:\9\9\9\9\9\9\9\9\9\9\9\9\9\9\9\9\9\9\}9\v9\o9\h9\a9\Z9\S9\L9\E9\>9\79\09\)9\"9\9\9\ 9\9\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\z8\s8\l8\e8\^8\W8\P8\I8\B8\;8\48\-8\&8\8\8\8\ 8\8\7\7\7\7\7\7\7\7\7\7\7\7\7\7\7\7\7\7\~7\w7\p7\i7\b7\[7\T7\M7\F7\?7\87\17\*7\#7\7\7\7\7\7\6\6\6\6\6\6\6\6\6\6\6\6\6\6\6\6\6\6\{6\t6\m6\f6\_6\X6\Q6\J6\C6\<6\56\.6\'6\ 6\6\6\ 6\6\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\x5\q5\j5\c5\\5\U5\N5\G5\@5\95\25\+5\$5\5\5\5\5\5\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\|4\u4\n4\g4\`4\Y4\R4\K4\D4\=4\64\/4\(4\!4\4\4\ 4\4\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\y3\r3\k3\d3\]3\V3\O3\H3\A3\:3\33\,3\%3\3\3\3\ 3\3\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\}2\v2\o2\h2\a2\Z2\S2\L2\E2\>2\72\02\)2\"2\2\2\ 2\2\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\z1\s1\l1\e1\^1\W1\P1\I1\B1\;1\41\-1\&1\1\1\1\ 1\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\~0\w0\p0\i0\b0\[0\T0\M0\F0\?0\80\10\*0\#0\0\0\0\0\0\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\{/\t/\m/\f/\_/\X/\Q/\J/\C/\+\7+\0+\)+\"+\+\+\ +\+\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\z*\s*\l*\e*\^*\W*\P*\I*\B*\;*\4*\-*\&*\*\*\*\ *\*\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\~)\w)\p)\i)\b)\[)\T)\M)\F)\?)\8)\1)\*)\#)\)\)\)\)\)\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\{(\t(\m(\f(\_(\X(\Q(\J(\C(\<(\5(\.(\'(\ (\(\(\ (\(\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\x'\q'\j'\c'\\'\U'\N'\G'\@'\9'\2'\+'\$'\'\'\'\'\'\&\&\&\&\&\&\&\&\&\&\&\&\&\&\&\&\&\&\|&\u&\n&\g&\`&\Y&\R&\K&\D&\=&\6&\/&\(&\!&\&\&\ &\&\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\y%\r%\k%\d%\]%\V%\O%\H%\A%\:%\3%\,%\%%\%\%\%\ %\%\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\}$\v$\o$\h$\a$\Z$\S$\L$\E$\>$\7$\0$\)$\"$\$\$\ $\$\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\z#\s#\l#\e#\^#\W#\P#\I#\B#\;#\4#\-#\&#\#\#\#\ #\#\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\~"\w"\p"\i"\b"\["\T"\M"\F"\?"\8"\1"\*"\#"\"\"\"\"\"\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\{!\t!\m!\f!\_!\X!\Q!\J!\C!\\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \~ \w \p \i \b \[ \T \M \F \? \8 \1 \* \# \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{ \t \m \f \_ \X \Q \J \C \< \5 \. \' \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \x \q \j \c \\ \U \N \G \@ \9 \2 \+ \$ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \| \u \n \g \` \Y \R \K \D \= \6 \/ \( \! \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \y \r \k \d \] \V \O \H \A \: \3 \, \% \ \ \ \ \ \\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[ݿ[ֿ[Ͽ[ȿ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[ھ[Ӿ[̾[ž[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[޽[׽[н[ɽ[½[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[ۼ[Լ[ͼ[Ƽ[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[߻[ػ[ѻ[ʻ[û[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[ܺ[պ[κ[Ǻ[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[ٹ[ҹ[˹[Ĺ[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[ݸ[ָ[ϸ[ȸ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[ڷ[ӷ[̷[ŷ[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[޶[׶[ж[ɶ[¶[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[۵[Ե[͵[Ƶ[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[ߴ[ش[Ѵ[ʴ[ô[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[ܳ[ճ[γ[dz[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[ٲ[Ҳ[˲[IJ[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[ݱ[ֱ[ϱ[ȱ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[ڰ[Ӱ[̰[Ű[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[ޯ[ׯ[Я[ɯ[¯[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[ۮ[Ԯ[ͮ[Ʈ[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[߭[ح[ѭ[ʭ[í[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[ܬ[լ[ά[Ǭ[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[٫[ҫ[˫[ī[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[ݪ[֪[Ϫ[Ȫ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[ک[ө[̩[ũ[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[ި[ר[Ш[ɨ[¨[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[ۧ[ԧ[ͧ[Ƨ[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[ߦ[ئ[Ѧ[ʦ[æ[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[ܥ[ե[Υ[ǥ[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[٤[Ҥ[ˤ[Ĥ[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[ݣ[֣[ϣ[ȣ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[ڢ[Ӣ[̢[Ţ[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[ޡ[ס[С[ɡ[¡[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[۠[Ԡ[͠[Ơ[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[ߟ[؟[џ[ʟ[ß[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[ܞ[՞[Ξ[Ǟ[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[ٝ[ҝ[˝[ĝ[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[ݜ[֜[Ϝ[Ȝ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[ڛ[ӛ[̛[ś[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[ޚ[ך[К[ɚ[š[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[ۙ[ԙ[͙[ƙ[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[ߘ[ؘ[ј[ʘ[Ø[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[ܗ[՗[Η[Ǘ[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[ٖ[Җ[˖[Ė[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[ݕ[֕[ϕ[ȕ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[ڔ[Ӕ[̔[Ŕ[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[ޓ[ד[Г[ɓ[“[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[ے[Ԓ[͒[ƒ[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[ߑ[ؑ[ё[ʑ[Ñ[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[ܐ[Ր[ΐ[ǐ[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[ُ[ҏ[ˏ[ď[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[ݎ[֎[ώ[Ȏ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[ڍ[Ӎ[̍[ō[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[ތ[׌[Ќ[Ɍ[Œ[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[ۋ[ԋ[͋[Ƌ[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[ߊ[؊[ъ[ʊ[Ê[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[܉[Չ[Ή[lj[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[و[҈[ˈ[Ĉ[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[݇[և[χ[ȇ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[چ[ӆ[̆[ņ[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[ޅ[ׅ[Ѕ[Ʌ[…[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[ۄ[Ԅ[̈́[Ƅ[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[߃[؃[у[ʃ[Ã[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[܂[Ղ[΂[ǂ[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[ف[ҁ[ˁ[ā[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[݀[ր[π[Ȁ[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[|~[u~[n~[g~[`~[Y~[R~[K~[D~[=~[6~[/~[(~[!~[~[~[ ~[~[}[}[}[}[}[}[}[}[}[}[}[}[}[}[}[}[}[}[}[y}[r}[k}[d}[]}[V}[O}[H}[A}[:}[3}[,}[%}[}[}[}[ }[}[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[}|[v|[o|[h|[a|[Z|[S|[L|[E|[>|[7|[0|[)|["|[|[|[ |[|[{[{[{[{[{[{[{[{[{[{[{[{[{[{[{[{[{[{[{[z{[s{[l{[e{[^{[W{[P{[I{[B{[;{[4{[-{[&{[{[{[{[ {[{[z[z[z[z[z[z[z[z[z[z[z[z[z[z[z[z[z[z[~z[wz[pz[iz[bz[[z[Tz[Mz[Fz[?z[8z[1z[*z[#z[z[z[z[z[z[y[y[y[y[y[y[y[y[y[y[y[y[y[y[y[y[y[y[{y[ty[my[fy[_y[Xy[Qy[Jy[Cy[u[7u[0u[)u["u[u[u[ u[u[t[t[t[t[t[t[t[t[t[t[t[t[t[t[t[t[t[t[t[zt[st[lt[et[^t[Wt[Pt[It[Bt[;t[4t[-t[&t[t[t[t[ t[t[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[~s[ws[ps[is[bs[[s[Ts[Ms[Fs[?s[8s[1s[*s[#s[s[s[s[s[s[r[r[r[r[r[r[r[r[r[r[r[r[r[r[r[r[r[r[{r[tr[mr[fr[_r[Xr[Qr[Jr[Cr[n[7n[0n[)n["n[n[n[ n[n[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[zm[sm[lm[em[^m[Wm[Pm[Im[Bm[;m[4m[-m[&m[m[m[m[ m[m[l[l[l[l[l[l[l[l[l[l[l[l[l[l[l[l[l[l[~l[wl[pl[il[bl[[l[Tl[Ml[Fl[?l[8l[1l[*l[#l[l[l[l[l[l[k[k[k[k[k[k[k[k[k[k[k[k[k[k[k[k[k[k[{k[tk[mk[fk[_k[Xk[Qk[Jk[Ck[g[7g[0g[)g["g[g[g[ g[g[f[f[f[f[f[f[f[f[f[f[f[f[f[f[f[f[f[f[f[zf[sf[lf[ef[^f[Wf[Pf[If[Bf[;f[4f[-f[&f[f[f[f[ f[f[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[~e[we[pe[ie[be[[e[Te[Me[Fe[?e[8e[1e[*e[#e[e[e[e[e[e[d[d[d[d[d[d[d[d[d[d[d[d[d[d[d[d[d[d[{d[td[md[fd[_d[Xd[Qd[Jd[Cd[`[7`[0`[)`["`[`[`[ `[`[_[_[_[_[_[_[_[_[_[_[_[_[_[_[_[_[_[_[_[z_[s_[l_[e_[^_[W_[P_[I_[B_[;_[4_[-_[&_[_[_[_[ _[_[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[~^[w^[p^[i^[b^[[^[T^[M^[F^[?^[8^[1^[*^[#^[^[^[^[^[^[][][][][][][][][][][][][][][][][][][{][t][m][f][_][X][Q][J][C][<][5][.]['][ ][][][ ][][\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[x\[q\[j\[c\[\\[U\[N\[G\[@\[9\[2\[+\[$\[\[\[\[\[\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[|[[u[[n[[g[[`[[Y[[R[[K[[D[[=[[6[[/[[([[![[[[[[ [[[[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[yZ[rZ[kZ[dZ[]Z[VZ[OZ[HZ[AZ[:Z[3Z[,Z[%Z[Z[Z[Z[ Z[Z[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[}Y[vY[oY[hY[aY[ZY[SY[LY[EY[>Y[7Y[0Y[)Y["Y[Y[Y[ Y[Y[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[zX[sX[lX[eX[^X[WX[PX[IX[BX[;X[4X[-X[&X[X[X[X[ X[X[W[W[W[W[W[W[W[W[W[W[W[W[W[W[W[W[W[W[~W[wW[pW[iW[bW[[W[TW[MW[FW[?W[8W[1W[*W[#W[W[W[W[W[W[V[V[V[V[V[V[V[V[V[V[V[V[V[V[V[V[V[V[{V[tV[mV[fV[_V[XV[QV[JV[CV[R[7R[0R[)R["R[R[R[ R[R[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[zQ[sQ[lQ[eQ[^Q[WQ[PQ[IQ[BQ[;Q[4Q[-Q[&Q[Q[Q[Q[ Q[Q[P[P[P[P[P[P[P[P[P[P[P[P[P[P[P[P[P[P[~P[wP[pP[iP[bP[[P[TP[MP[FP[?P[8P[1P[*P[#P[P[P[P[P[P[O[O[O[O[O[O[O[O[O[O[O[O[O[O[O[O[O[O[{O[tO[mO[fO[_O[XO[QO[JO[CO[K[7K[0K[)K["K[K[K[ K[K[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[zJ[sJ[lJ[eJ[^J[WJ[PJ[IJ[BJ[;J[4J[-J[&J[J[J[J[ J[J[I[I[I[I[I[I[I[I[I[I[I[I[I[I[I[I[I[I[~I[wI[pI[iI[bI[[I[TI[MI[FI[?I[8I[1I[*I[#I[I[I[I[I[I[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[{H[tH[mH[fH[_H[XH[QH[JH[CH[D[7D[0D[)D["D[D[D[ D[D[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[zC[sC[lC[eC[^C[WC[PC[IC[BC[;C[4C[-C[&C[C[C[C[ C[C[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[~B[wB[pB[iB[bB[[B[TB[MB[FB[?B[8B[1B[*B[#B[B[B[B[B[B[A[A[A[A[A[A[A[A[A[A[A[A[A[A[A[A[A[A[{A[tA[mA[fA[_A[XA[QA[JA[CA[[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[y>[r>[k>[d>[]>[V>[O>[H>[A>[:>[3>[,>[%>[>[>[>[ >[>[=[=[=[=[=[=[=[=[=[=[=[=[=[=[=[=[=[=[}=[v=[o=[h=[a=[Z=[S=[L=[E=[>=[7=[0=[)=["=[=[=[ =[=[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[z<[s<[l<[e<[^<[W<[P<[I<[B<[;<[4<[-<[&<[<[<[<[ <[<[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[~;[w;[p;[i;[b;[[;[T;[M;[F;[?;[8;[1;[*;[#;[;[;[;[;[;[:[:[:[:[:[:[:[:[:[:[:[:[:[:[:[:[:[:[{:[t:[m:[f:[_:[X:[Q:[J:[C:[<:[5:[.:[':[ :[:[:[ :[:[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[x9[q9[j9[c9[\9[U9[N9[G9[@9[99[29[+9[$9[9[9[9[9[9[8[8[8[8[8[8[8[8[8[8[8[8[8[8[8[8[8[8[|8[u8[n8[g8[`8[Y8[R8[K8[D8[=8[68[/8[(8[!8[8[8[ 8[8[7[7[7[7[7[7[7[7[7[7[7[7[7[7[7[7[7[7[7[y7[r7[k7[d7[]7[V7[O7[H7[A7[:7[37[,7[%7[7[7[7[ 7[7[6[6[6[6[6[6[6[6[6[6[6[6[6[6[6[6[6[6[}6[v6[o6[h6[a6[Z6[S6[L6[E6[>6[76[06[)6["6[6[6[ 6[6[5[5[5[5[5[5[5[5[5[5[5[5[5[5[5[5[5[5[5[z5[s5[l5[e5[^5[W5[P5[I5[B5[;5[45[-5[&5[5[5[5[ 5[5[4[4[4[4[4[4[4[4[4[4[4[4[4[4[4[4[4[4[~4[w4[p4[i4[b4[[4[T4[M4[F4[?4[84[14[*4[#4[4[4[4[4[4[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[{3[t3[m3[f3[_3[X3[Q3[J3[C3[<3[53[.3['3[ 3[3[3[ 3[3[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[x2[q2[j2[c2[\2[U2[N2[G2[@2[92[22[+2[$2[2[2[2[2[2[1[1[1[1[1[1[1[1[1[1[1[1[1[1[1[1[1[1[|1[u1[n1[g1[`1[Y1[R1[K1[D1[=1[61[/1[(1[!1[1[1[ 1[1[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[y0[r0[k0[d0[]0[V0[O0[H0[A0[:0[30[,0[%0[0[0[0[ 0[0[/[/[/[/[/[/[/[/[/[/[/[/[/[/[/[/[/[/[}/[v/[o/[h/[a/[Z/[S/[L/[E/[>/[7/[0/[)/["/[/[/[ /[/[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[z.[s.[l.[e.[^.[W.[P.[I.[B.[;.[4.[-.[&.[.[.[.[ .[.[-[-[-[-[-[-[-[-[-[-[-[-[-[-[-[-[-[-[~-[w-[p-[i-[b-[[-[T-[M-[F-[?-[8-[1-[*-[#-[-[-[-[-[-[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[{,[t,[m,[f,[_,[X,[Q,[J,[C,[<,[5,[.,[',[ ,[,[,[ ,[,[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[x+[q+[j+[c+[\+[U+[N+[G+[@+[9+[2+[++[$+[+[+[+[+[+[*[*[*[*[*[*[*[*[*[*[*[*[*[*[*[*[*[*[|*[u*[n*[g*[`*[Y*[R*[K*[D*[=*[6*[/*[(*[!*[*[*[ *[*[)[)[)[)[)[)[)[)[)[)[)[)[)[)[)[)[)[)[)[y)[r)[k)[d)[])[V)[O)[H)[A)[:)[3)[,)[%)[)[)[)[ )[)[([([([([([([([([([([([([([([([([([([}([v([o([h([a([Z([S([L([E([>([7([0([)(["([([([ ([(['['['['['['['['['['['['['['['['['['['[z'[s'[l'[e'[^'[W'[P'[I'[B'[;'[4'[-'[&'['['['[ '['[&[&[&[&[&[&[&[&[&[&[&[&[&[&[&[&[&[&[~&[w&[p&[i&[b&[[&[T&[M&[F&[?&[8&[1&[*&[#&[&[&[&[&[&[%[%[%[%[%[%[%[%[%[%[%[%[%[%[%[%[%[%[{%[t%[m%[f%[_%[X%[Q%[J%[C%[<%[5%[.%['%[ %[%[%[ %[%[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[x$[q$[j$[c$[\$[U$[N$[G$[@$[9$[2$[+$[$$[$[$[$[$[$[#[#[#[#[#[#[#[#[#[#[#[#[#[#[#[#[#[#[|#[u#[n#[g#[`#[Y#[R#[K#[D#[=#[6#[/#[(#[!#[#[#[ #[#["["["["["["["["["["["["["["["["["["["[y"[r"[k"[d"[]"[V"[O"[H"[A"[:"[3"[,"[%"["["["[ "["[![![![![![![![![![![![![![![![![![![}![v![o![h![a![Z![S![L![E![>![7![0![)!["![![![ ![![ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [z [s [l [e [^ [W [P [I [B [; [4 [- [& [ [ [ [ [ [[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [y [r [k [d [] [V [O [H [A [: [3 [, [% [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [} [v [o [h [a [Z [S [L [E [> [7 [0 [) [" [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [z [s [l [e [^ [W [P [I [B [; [4 [- [& [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [~ [w [p [i [b [[ [T [M [F [? [8 [1 [* [# [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [{ [t [m [f [_ [X [Q [J [C [< [5 [. [' [ [ [ [ [ [[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZܾZվZξZǾZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZٽZҽZ˽ZĽZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZݼZּZϼZȼZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZܷZշZηZǷZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZٶZҶZ˶ZĶZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZݵZֵZϵZȵZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZܰZհZΰZǰZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZٯZүZ˯ZįZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZݮZ֮ZϮZȮZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZܩZթZΩZǩZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZ٨ZҨZ˨ZĨZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZݧZ֧ZϧZȧZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZܢZբZ΢ZǢZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZ١ZҡZˡZġZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZݠZ֠ZϠZȠZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZܛZ՛ZΛZǛZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZٚZҚZ˚ZĚZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZݙZ֙ZϙZșZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZܔZՔZΔZǔZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZٓZғZ˓ZēZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZݒZ֒ZϒZȒZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZ܍ZՍZ΍ZǍZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZٌZҌZˌZČZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZ݋Z֋ZϋZȋZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZ܆ZՆZΆZdžZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZمZ҅Z˅ZąZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZ݄ZքZτZȄZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZZ7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZ~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~Z~~Zw~Zp~Zi~Zb~Z[~ZT~ZM~ZF~Z?~Z8~Z1~Z*~Z#~Z~Z~Z~Z~Z~Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z}Z{}Zt}Zm}Zf}Z_}ZX}ZQ}ZJ}ZC}Z<}Z5}Z.}Z'}Z }Z}Z}Z }Z}Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Z|Zx|Zq|Zj|Zc|Z\|ZU|ZN|ZG|Z@|Z9|Z2|Z+|Z$|Z|Z|Z|Z|Z|Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z{Z|{Zu{Zn{Zg{Z`{ZY{ZR{ZK{ZD{Z={Z6{Z/{Z({Z!{Z{Z{Z {Z{ZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzZzZyzZrzZkzZdzZ]zZVzZOzZHzZAzZ:zZ3zZ,zZ%zZzZzZzZ zZzZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZ}yZvyZoyZhyZayZZyZSyZLyZEyZ>yZ7yZ0yZ)yZ"yZyZyZ yZyZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZzxZsxZlxZexZ^xZWxZPxZIxZBxZ;xZ4xZ-xZ&xZxZxZxZ xZxZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwZ~wZwwZpwZiwZbwZ[wZTwZMwZFwZ?wZ8wZ1wZ*wZ#wZwZwZwZwZwZvZvZvZvZvZvZvZvZvZvZvZvZvZvZvZvZvZvZ{vZtvZmvZfvZ_vZXvZQvZJvZCvZrZ7rZ0rZ)rZ"rZrZrZ rZrZqZqZqZqZqZqZqZqZqZqZqZqZqZqZqZqZqZqZqZzqZsqZlqZeqZ^qZWqZPqZIqZBqZ;qZ4qZ-qZ&qZqZqZqZ qZqZpZpZpZpZpZpZpZpZpZpZpZpZpZpZpZpZpZpZ~pZwpZppZipZbpZ[pZTpZMpZFpZ?pZ8pZ1pZ*pZ#pZpZpZpZpZpZoZoZoZoZoZoZoZoZoZoZoZoZoZoZoZoZoZoZ{oZtoZmoZfoZ_oZXoZQoZJoZCoZkZ7kZ0kZ)kZ"kZkZkZ kZkZjZjZjZjZjZjZjZjZjZjZjZjZjZjZjZjZjZjZjZzjZsjZljZejZ^jZWjZPjZIjZBjZ;jZ4jZ-jZ&jZjZjZjZ jZjZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZ~iZwiZpiZiiZbiZ[iZTiZMiZFiZ?iZ8iZ1iZ*iZ#iZiZiZiZiZiZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZ{hZthZmhZfhZ_hZXhZQhZJhZChZdZ7dZ0dZ)dZ"dZdZdZ dZdZcZcZcZcZcZcZcZcZcZcZcZcZcZcZcZcZcZcZcZzcZscZlcZecZ^cZWcZPcZIcZBcZ;cZ4cZ-cZ&cZcZcZcZ cZcZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZ~bZwbZpbZibZbbZ[bZTbZMbZFbZ?bZ8bZ1bZ*bZ#bZbZbZbZbZbZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZ{aZtaZmaZfaZ_aZXaZQaZJaZCaZ]Z7]Z0]Z)]Z"]Z]Z]Z ]Z]Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Z\Zz\Zs\Zl\Ze\Z^\ZW\ZP\ZI\ZB\Z;\Z4\Z-\Z&\Z\Z\Z\Z \Z\Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z~[Zw[Zp[Zi[Zb[Z[[ZT[ZM[ZF[Z?[Z8[Z1[Z*[Z#[Z[Z[Z[Z[Z[ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ{ZZtZZmZZfZZ_ZZXZZQZZJZZCZZVZ7VZ0VZ)VZ"VZVZVZ VZVZUZUZUZUZUZUZUZUZUZUZUZUZUZUZUZUZUZUZUZzUZsUZlUZeUZ^UZWUZPUZIUZBUZ;UZ4UZ-UZ&UZUZUZUZ UZUZTZTZTZTZTZTZTZTZTZTZTZTZTZTZTZTZTZTZ~TZwTZpTZiTZbTZ[TZTTZMTZFTZ?TZ8TZ1TZ*TZ#TZTZTZTZTZTZSZSZSZSZSZSZSZSZSZSZSZSZSZSZSZSZSZSZ{SZtSZmSZfSZ_SZXSZQSZJSZCSZOZ7OZ0OZ)OZ"OZOZOZ OZOZNZNZNZNZNZNZNZNZNZNZNZNZNZNZNZNZNZNZNZzNZsNZlNZeNZ^NZWNZPNZINZBNZ;NZ4NZ-NZ&NZNZNZNZ NZNZMZMZMZMZMZMZMZMZMZMZMZMZMZMZMZMZMZMZ~MZwMZpMZiMZbMZ[MZTMZMMZFMZ?MZ8MZ1MZ*MZ#MZMZMZMZMZMZLZLZLZLZLZLZLZLZLZLZLZLZLZLZLZLZLZLZ{LZtLZmLZfLZ_LZXLZQLZJLZCLZHZ7HZ0HZ)HZ"HZHZHZ HZHZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZzGZsGZlGZeGZ^GZWGZPGZIGZBGZ;GZ4GZ-GZ&GZGZGZGZ GZGZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZ~FZwFZpFZiFZbFZ[FZTFZMFZFFZ?FZ8FZ1FZ*FZ#FZFZFZFZFZFZEZEZEZEZEZEZEZEZEZEZEZEZEZEZEZEZEZEZ{EZtEZmEZfEZ_EZXEZQEZJEZCEZAZ7AZ0AZ)AZ"AZAZAZ AZAZ@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Zz@Zs@Zl@Ze@Z^@ZW@ZP@ZI@ZB@Z;@Z4@Z-@Z&@Z@Z@Z@Z @Z@Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z~?Zw?Zp?Zi?Zb?Z[?ZT?ZM?ZF?Z??Z8?Z1?Z*?Z#?Z?Z?Z?Z?Z?Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z{>Zt>Zm>Zf>Z_>ZX>ZQ>ZJ>ZC>Z<>Z5>Z.>Z'>Z >Z>Z>Z >Z>Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Zx=Zq=Zj=Zc=Z\=ZU=ZN=ZG=Z@=Z9=Z2=Z+=Z$=Z=Z=Z=Z=Z=Z:Z7:Z0:Z):Z":Z:Z:Z :Z:Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Zz9Zs9Zl9Ze9Z^9ZW9ZP9ZI9ZB9Z;9Z49Z-9Z&9Z9Z9Z9Z 9Z9Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z~8Zw8Zp8Zi8Zb8Z[8ZT8ZM8ZF8Z?8Z88Z18Z*8Z#8Z8Z8Z8Z8Z8Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z{7Zt7Zm7Zf7Z_7ZX7ZQ7ZJ7ZC7Z<7Z57Z.7Z'7Z 7Z7Z7Z 7Z7Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Zx6Zq6Zj6Zc6Z\6ZU6ZN6ZG6Z@6Z96Z26Z+6Z$6Z6Z6Z6Z6Z6Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z|5Zu5Zn5Zg5Z`5ZY5ZR5ZK5ZD5Z=5Z65Z/5Z(5Z!5Z5Z5Z 5Z5Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Zy4Zr4Zk4Zd4Z]4ZV4ZO4ZH4ZA4Z:4Z34Z,4Z%4Z4Z4Z4Z 4Z4Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z}3Zv3Zo3Zh3Za3ZZ3ZS3ZL3ZE3Z>3Z73Z03Z)3Z"3Z3Z3Z 3Z3Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Zz2Zs2Zl2Ze2Z^2ZW2ZP2ZI2ZB2Z;2Z42Z-2Z&2Z2Z2Z2Z 2Z2Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z~1Zw1Zp1Zi1Zb1Z[1ZT1ZM1ZF1Z?1Z81Z11Z*1Z#1Z1Z1Z1Z1Z1Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z{0Zt0Zm0Zf0Z_0ZX0ZQ0ZJ0ZC0Z<0Z50Z.0Z'0Z 0Z0Z0Z 0Z0Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Zx/Zq/Zj/Zc/Z\/ZU/ZN/ZG/Z@/Z9/Z2/Z+/Z$/Z/Z/Z/Z/Z/Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z|.Zu.Zn.Zg.Z`.ZY.ZR.ZK.ZD.Z=.Z6.Z/.Z(.Z!.Z.Z.Z .Z.Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Zy-Zr-Zk-Zd-Z]-ZV-ZO-ZH-ZA-Z:-Z3-Z,-Z%-Z-Z-Z-Z -Z-Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z},Zv,Zo,Zh,Za,ZZ,ZS,ZL,ZE,Z>,Z7,Z0,Z),Z",Z,Z,Z ,Z,Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Zz+Zs+Zl+Ze+Z^+ZW+ZP+ZI+ZB+Z;+Z4+Z-+Z&+Z+Z+Z+Z +Z+Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z~*Zw*Zp*Zi*Zb*Z[*ZT*ZM*ZF*Z?*Z8*Z1*Z**Z#*Z*Z*Z*Z*Z*Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z{)Zt)Zm)Zf)Z_)ZX)ZQ)ZJ)ZC)Z<)Z5)Z.)Z')Z )Z)Z)Z )Z)Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Zx(Zq(Zj(Zc(Z\(ZU(ZN(ZG(Z@(Z9(Z2(Z+(Z$(Z(Z(Z(Z(Z(Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z|'Zu'Zn'Zg'Z`'ZY'ZR'ZK'ZD'Z='Z6'Z/'Z('Z!'Z'Z'Z 'Z'Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Zy&Zr&Zk&Zd&Z]&ZV&ZO&ZH&ZA&Z:&Z3&Z,&Z%&Z&Z&Z&Z &Z&Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z}%Zv%Zo%Zh%Za%ZZ%ZS%ZL%ZE%Z>%Z7%Z0%Z)%Z"%Z%Z%Z %Z%Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Zz$Zs$Zl$Ze$Z^$ZW$ZP$ZI$ZB$Z;$Z4$Z-$Z&$Z$Z$Z$Z $Z$Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z~#Zw#Zp#Zi#Zb#Z[#ZT#ZM#ZF#Z?#Z8#Z1#Z*#Z##Z#Z#Z#Z#Z#Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z{"Zt"Zm"Zf"Z_"ZX"ZQ"ZJ"ZC"Z<"Z5"Z."Z'"Z "Z"Z"Z "Z"Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Zx!Zq!Zj!Zc!Z\!ZU!ZN!ZG!Z@!Z9!Z2!Z+!Z$!Z!Z!Z!Z!Z!Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z| Zu Zn Zg Z` ZY ZR ZK ZD Z= Z6 Z/ Z( Z! Z Z Z Z ZZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZ<Z5Z.Z'Z ZZZ ZZZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZ<Z5Z.Z'Z ZZZ ZZZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z{ Zt Zm Zf Z_ ZX ZQ ZJ ZC Z< Z5 Z. Z' Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Zx Zq Zj Zc Z\ ZU ZN ZG Z@ Z9 Z2 Z+ Z$ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z| Zu Zn Zg Z` ZY ZR ZK ZD Z= Z6 Z/ Z( Z! Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Zy Zr Zk Zd Z] ZV ZO ZH ZA Z: Z3 Z, Z% Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z} Zv Zo Zh Za ZZ ZS ZL ZE Z> Z7 Z0 Z) Z" Z Z Z Z ZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZ<Z5Z.Z'Z ZZZ ZZZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYܻYջYλYǻYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYٺYҺY˺YĺYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYݹYֹYϹYȹYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYܴYմYδYǴYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYٳYҳY˳YijYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYݲYֲYϲYȲYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYܭYխYέYǭYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYY٬YҬYˬYĬYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYݫY֫YϫYȫYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYܦYզYΦYǦYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYY٥YҥY˥YĥYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYݤY֤YϤYȤYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYܟY՟YΟYǟYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYٞYҞY˞YĞYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYݝY֝YϝYȝYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYܘY՘YΘYǘYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYٗYҗY˗YėYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYݖY֖YϖYȖYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYYܑYՑYΑYǑYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYِYҐYːYĐYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYݏY֏YϏYȏYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYY܊YՊYΊYNJYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYىY҉YˉYĉYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYY݈YֈYψYȈYYYYYYYYYYY{YtYmYfY_YXYQYJYCYY7Y0Y)Y"YYY YYYYYYY܃YՃY΃YǃYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYقY҂Y˂YĂYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYY݁YցYρYȁYYYYYYYYYYY{YtYmYfY_YXYQYJYCY}Y7}Y0}Y)}Y"}Y}Y}Y }Y}Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Yz|Ys|Yl|Ye|Y^|YW|YP|YI|YB|Y;|Y4|Y-|Y&|Y|Y|Y|Y |Y|Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y{Y~{Yw{Yp{Yi{Yb{Y[{YT{YM{YF{Y?{Y8{Y1{Y*{Y#{Y{Y{Y{Y{Y{YzYzYzYzYzYzYzYzYzYzYzYzYzYzYzYzYzYzY{zYtzYmzYfzY_zYXzYQzYJzYCzYvY7vY0vY)vY"vYvYvY vYvYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYuYzuYsuYluYeuY^uYWuYPuYIuYBuY;uY4uY-uY&uYuYuYuY uYuYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtY~tYwtYptYitYbtY[tYTtYMtYFtY?tY8tY1tY*tY#tYtYtYtYtYtYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsY{sYtsYmsYfsY_sYXsYQsYJsYCsYoY7oY0oY)oY"oYoYoY oYoYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYnYznYsnYlnYenY^nYWnYPnYInYBnY;nY4nY-nY&nYnYnYnY nYnYmYmYmYmYmYmYmYmYmYmYmYmYmYmYmYmYmYmY~mYwmYpmYimYbmY[mYTmYMmYFmY?mY8mY1mY*mY#mYmYmYmYmYmYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlY{lYtlYmlYflY_lYXlYQlYJlYClYhY7hY0hY)hY"hYhYhY hYhYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYgYzgYsgYlgYegY^gYWgYPgYIgYBgY;gY4gY-gY&gYgYgYgY gYgYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfY~fYwfYpfYifYbfY[fYTfYMfYFfY?fY8fY1fY*fY#fYfYfYfYfYfYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeY{eYteYmeYfeY_eYXeYQeYJeYCeYaY7aY0aY)aY"aYaYaY aYaY`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Y`Yz`Ys`Yl`Ye`Y^`YW`YP`YI`YB`Y;`Y4`Y-`Y&`Y`Y`Y`Y `Y`Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y~_Yw_Yp_Yi_Yb_Y[_YT_YM_YF_Y?_Y8_Y1_Y*_Y#_Y_Y_Y_Y_Y_Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y{^Yt^Ym^Yf^Y_^YX^YQ^YJ^YC^Y<^Y5^Y.^Y'^Y ^Y^Y^Y ^Y^Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Yx]Yq]Yj]Yc]Y\]YU]YN]YG]Y@]Y9]Y2]Y+]Y$]Y]Y]Y]Y]Y]Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y|\Yu\Yn\Yg\Y`\YY\YR\YK\YD\Y=\Y6\Y/\Y(\Y!\Y\Y\Y \Y\Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Yy[Yr[Yk[Yd[Y][YV[YO[YH[YA[Y:[Y3[Y,[Y%[Y[Y[Y[Y [Y[YZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZY}ZYvZYoZYhZYaZYZZYSZYLZYEZY>ZY7ZY0ZY)ZY"ZYZYZY ZYZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYzYYsYYlYYeYY^YYWYYPYYIYYBYY;YY4YY-YY&YYYYYYYY YYYYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY~XYwXYpXYiXYbXY[XYTXYMXYFXY?XY8XY1XY*XY#XYXYXYXYXYXYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWY{WYtWYmWYfWY_WYXWYQWYJWYCWYSY7SY0SY)SY"SYSYSY SYSYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYzRYsRYlRYeRY^RYWRYPRYIRYBRY;RY4RY-RY&RYRYRYRY RYRYQYQYQYQYQYQYQYQYQYQYQYQYQYQYQYQYQYQY~QYwQYpQYiQYbQY[QYTQYMQYFQY?QY8QY1QY*QY#QYQYQYQYQYQYPYPYPYPYPYPYPYPYPYPYPYPYPYPYPYPYPYPY{PYtPYmPYfPY_PYXPYQPYJPYCPYLY7LY0LY)LY"LYLYLY LYLYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYzKYsKYlKYeKY^KYWKYPKYIKYBKY;KY4KY-KY&KYKYKYKY KYKYJYJYJYJYJYJYJYJYJYJYJYJYJYJYJYJYJYJY~JYwJYpJYiJYbJY[JYTJYMJYFJY?JY8JY1JY*JY#JYJYJYJYJYJYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIY{IYtIYmIYfIY_IYXIYQIYJIYCIYEY7EY0EY)EY"EYEYEY EYEYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYzDYsDYlDYeDY^DYWDYPDYIDYBDY;DY4DY-DY&DYDYDYDY DYDYCYCYCYCYCYCYCYCYCYCYCYCYCYCYCYCYCYCY~CYwCYpCYiCYbCY[CYTCYMCYFCY?CY8CY1CY*CY#CYCYCYCYCYCYBYBYBYBYBYBYBYBYBYBYBYBYBYBYBYBYBYBY{BYtBYmBYfBY_BYXBYQBYJBYCBYY>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y}>Yv>Yo>Yh>Ya>YZ>YS>YL>YE>Y>>Y7>Y0>Y)>Y">Y>Y>Y >Y>Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Yz=Ys=Yl=Ye=Y^=YW=YP=YI=YB=Y;=Y4=Y-=Y&=Y=Y=Y=Y =Y=Y7Y77Y07Y)7Y"7Y7Y7Y 7Y7Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Yz6Ys6Yl6Ye6Y^6YW6YP6YI6YB6Y;6Y46Y-6Y&6Y6Y6Y6Y 6Y6Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y~5Yw5Yp5Yi5Yb5Y[5YT5YM5YF5Y?5Y85Y15Y*5Y#5Y5Y5Y5Y5Y5Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y{4Yt4Ym4Yf4Y_4YX4YQ4YJ4YC4Y<4Y54Y.4Y'4Y 4Y4Y4Y 4Y4Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Yx3Yq3Yj3Yc3Y\3YU3YN3YG3Y@3Y93Y23Y+3Y$3Y3Y3Y3Y3Y3Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y|2Yu2Yn2Yg2Y`2YY2YR2YK2YD2Y=2Y62Y/2Y(2Y!2Y2Y2Y 2Y2Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Yy1Yr1Yk1Yd1Y]1YV1YO1YH1YA1Y:1Y31Y,1Y%1Y1Y1Y1Y 1Y1Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y}0Yv0Yo0Yh0Ya0YZ0YS0YL0YE0Y>0Y70Y00Y)0Y"0Y0Y0Y 0Y0Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Yz/Ys/Yl/Ye/Y^/YW/YP/YI/YB/Y;/Y4/Y-/Y&/Y/Y/Y/Y /Y/Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y~.Yw.Yp.Yi.Yb.Y[.YT.YM.YF.Y?.Y8.Y1.Y*.Y#.Y.Y.Y.Y.Y.Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y{-Yt-Ym-Yf-Y_-YX-YQ-YJ-YC-Y<-Y5-Y.-Y'-Y -Y-Y-Y -Y-Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Yx,Yq,Yj,Yc,Y\,YU,YN,YG,Y@,Y9,Y2,Y+,Y$,Y,Y,Y,Y,Y,Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y|+Yu+Yn+Yg+Y`+YY+YR+YK+YD+Y=+Y6+Y/+Y(+Y!+Y+Y+Y +Y+Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Yy*Yr*Yk*Yd*Y]*YV*YO*YH*YA*Y:*Y3*Y,*Y%*Y*Y*Y*Y *Y*Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y)Y})Yv)Yo)Yh)Ya)YZ)YS)YL)YE)Y>)Y7)Y0)Y))Y")Y)Y)Y )Y)Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Yz(Ys(Yl(Ye(Y^(YW(YP(YI(YB(Y;(Y4(Y-(Y&(Y(Y(Y(Y (Y(Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y~'Yw'Yp'Yi'Yb'Y['YT'YM'YF'Y?'Y8'Y1'Y*'Y#'Y'Y'Y'Y'Y'Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y{&Yt&Ym&Yf&Y_&YX&YQ&YJ&YC&Y<&Y5&Y.&Y'&Y &Y&Y&Y &Y&Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Yx%Yq%Yj%Yc%Y\%YU%YN%YG%Y@%Y9%Y2%Y+%Y$%Y%Y%Y%Y%Y%Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y|$Yu$Yn$Yg$Y`$YY$YR$YK$YD$Y=$Y6$Y/$Y($Y!$Y$Y$Y $Y$Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Yy#Yr#Yk#Yd#Y]#YV#YO#YH#YA#Y:#Y3#Y,#Y%#Y#Y#Y#Y #Y#Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y}"Yv"Yo"Yh"Ya"YZ"YS"YL"YE"Y>"Y7"Y0"Y)"Y""Y"Y"Y "Y"Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Yz!Ys!Yl!Ye!Y^!YW!YP!YI!YB!Y;!Y4!Y-!Y&!Y!Y!Y!Y !Y!Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y~ Yw Yp Yi Yb Y[ YT YM YF Y? Y8 Y1 Y* Y# Y Y Y Y Y YYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCY<Y5Y.Y'Y YYY YYYYYYYYYYYYYYYYYYYYYxYqYjYcY\YUYNYGY@Y9Y2Y+Y$YYYYYYYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCY<Y5Y.Y'Y YYY YYYYYYYYYYYYYYYYYYYYYxYqYjYcY\YUYNYGY@Y9Y2Y+Y$YYYYYYYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCY<Y5Y.Y'Y YYY YYYYYYYYYYYYYYYYYYYYYxYqYjYcY\YUYNYGY@Y9Y2Y+Y$YYYYYYYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YY Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y} Yv Yo Yh Ya YZ YS YL YE Y> Y7 Y0 Y) Y" Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Yz Ys Yl Ye Y^ YW YP YI YB Y; Y4 Y- Y& Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y~ Yw Yp Yi Yb Y[ YT YM YF Y? Y8 Y1 Y* Y# Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y{ Yt Ym Yf Y_ YX YQ YJ YC Y< Y5 Y. Y' Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Yx Yq Yj Yc Y\ YU YN YG Y@ Y9 Y2 Y+ Y$ Y Y Y Y Y YYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCY<Y5Y.Y'Y YYY YYYYYYYYYYYYYYYYYYYYYxYqYjYcY\YUYNYGY@Y9Y2Y+Y$YYYYYYYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXܿXտXοXǿXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXپXҾX˾XľXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXݽXֽXϽXȽXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXܸXոXθXǸXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXٷXҷX˷XķXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXݶXֶX϶XȶXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXܱXձXαXDZXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXٰXҰX˰XİXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXݯX֯XϯXȯXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXܪXժXΪXǪXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXX٩XҩX˩XĩXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXݨX֨XϨXȨXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXܣXգXΣXǣXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXX٢XҢXˢXĢXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXݡX֡XϡXȡXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXܜX՜XΜXǜXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXٛXқX˛XěXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXݚX֚XϚXȚXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXXܕXՕXΕXǕXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXٔXҔX˔XĔXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXݓX֓XϓXȓXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXX܎XՎXΎXǎXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXٍXҍXˍXčXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXX݌X֌XόXȌXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXX܇XՇX·XLJXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXنX҆XˆXĆXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXX݅XօXυXȅXXXXXXXXXXX{XtXmXfX_XXXQXJXCXX7X0X)X"XXX XXXXXXX܀XՀX΀XǀXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXX~X~X~X~X~X~X~X~X~X~X~X~X~X~X~X~X~X~X{~Xt~Xm~Xf~X_~XX~XQ~XJ~XC~X<~X5~X.~X'~X ~X~X~X ~X~X}X}X}X}X}X}X}X}X}X}X}X}X}X}X}X}X}X}X}Xx}Xq}Xj}Xc}X\}XU}XN}XG}X@}X9}X2}X+}X$}X}X}X}X}X}X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X||Xu|Xn|Xg|X`|XY|XR|XK|XD|X=|X6|X/|X(|X!|X|X|X |X|X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{X{Xy{Xr{Xk{Xd{X]{XV{XO{XH{XA{X:{X3{X,{X%{X{X{X{X {X{XzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX}zXvzXozXhzXazXZzXSzXLzXEzX>zX7zX0zX)zX"zXzXzX zXzXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXzyXsyXlyXeyX^yXWyXPyXIyXByX;yX4yX-yX&yXyXyXyX yXyXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX~xXwxXpxXixXbxX[xXTxXMxXFxX?xX8xX1xX*xX#xXxXxXxXxXxXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwX{wXtwXmwXfwX_wXXwXQwXJwXCwXsX7sX0sX)sX"sXsXsX sXsXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXzrXsrXlrXerX^rXWrXPrXIrXBrX;rX4rX-rX&rXrXrXrX rXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX~qXwqXpqXiqXbqX[qXTqXMqXFqX?qX8qX1qX*qX#qXqXqXqXqXqXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpX{pXtpXmpXfpX_pXXpXQpXJpXCpXlX7lX0lX)lX"lXlXlX lXlXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXzkXskXlkXekX^kXWkXPkXIkXBkX;kX4kX-kX&kXkXkXkX kXkXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX~jXwjXpjXijXbjX[jXTjXMjXFjX?jX8jX1jX*jX#jXjXjXjXjXjXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiX{iXtiXmiXfiX_iXXiXQiXJiXCiXeX7eX0eX)eX"eXeXeX eXeXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXzdXsdXldXedX^dXWdXPdXIdXBdX;dX4dX-dX&dXdXdXdX dXdXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcX~cXwcXpcXicXbcX[cXTcXMcXFcX?cX8cX1cX*cX#cXcXcXcXcXcXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbX{bXtbXmbXfbX_bXXbXQbXJbXCbX^X7^X0^X)^X"^X^X^X ^X^X]X]X]X]X]X]X]X]X]X]X]X]X]X]X]X]X]X]X]Xz]Xs]Xl]Xe]X^]XW]XP]XI]XB]X;]X4]X-]X&]X]X]X]X ]X]X\X\X\X\X\X\X\X\X\X\X\X\X\X\X\X\X\X\X~\Xw\Xp\Xi\Xb\X[\XT\XM\XF\X?\X8\X1\X*\X#\X\X\X\X\X\X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X{[Xt[Xm[Xf[X_[XX[XQ[XJ[XC[X<[X5[X.[X'[X [X[X[X [X[XZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZXqZXjZXcZX\ZXUZXNZXGZX@ZX9ZX2ZX+ZX$ZXZXZXZXZXZXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX|YXuYXnYXgYX`YXYYXRYXKYXDYX=YX6YX/YX(YX!YXYXYX YXYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXyXXrXXkXXdXX]XXVXXOXXHXXAXX:XX3XX,XX%XXXXXXXX XXXXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWX}WXvWXoWXhWXaWXZWXSWXLWXEWX>WX7WX0WX)WX"WXWXWX WXWXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXzVXsVXlVXeVX^VXWVXPVXIVXBVX;VX4VX-VX&VXVXVXVX VXVXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX~UXwUXpUXiUXbUX[UXTUXMUXFUX?UX8UX1UX*UX#UXUXUXUXUXUXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTX{TXtTXmTXfTX_TXXTXQTXJTXCTXPX7PX0PX)PX"PXPXPX PXPXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXzOXsOXlOXeOX^OXWOXPOXIOXBOX;OX4OX-OX&OXOXOXOX OXOXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNX~NXwNXpNXiNXbNX[NXTNXMNXFNX?NX8NX1NX*NX#NXNXNXNXNXNXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMX{MXtMXmMXfMX_MXXMXQMXJMXCMXIX7IX0IX)IX"IXIXIX IXIXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXzHXsHXlHXeHX^HXWHXPHXIHXBHX;HX4HX-HX&HXHXHXHX HXHXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGX~GXwGXpGXiGXbGX[GXTGXMGXFGX?GX8GX1GX*GX#GXGXGXGXGXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX{FXtFXmFXfFX_FXXFXQFXJFXCFXBX7BX0BX)BX"BXBXBX BXBXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXzAXsAXlAXeAX^AXWAXPAXIAXBAX;AX4AX-AX&AXAXAXAX AXAX@X@X@X@X@X@X@X@X@X@X@X@X@X@X@X@X@X@X~@Xw@Xp@Xi@Xb@X[@XT@XM@XF@X?@X8@X1@X*@X#@X@X@X@X@X@X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X{?Xt?Xm?Xf?X_?XX?XQ?XJ?XC?XX>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>Xx>Xq>Xj>Xc>X\>XU>XN>XG>X@>X9>X2>X+>X$>X>X>X>X>X>X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X|=Xu=Xn=Xg=X`=XY=XR=XK=XD=X==X6=X/=X(=X!=X=X=X =X=X;X7;X0;X);X";X;X;X ;X;X:X:X:X:X:X:X:X:X:X:X:X:X:X:X:X:X:X:X:Xz:Xs:Xl:Xe:X^:XW:XP:XI:XB:X;:X4:X-:X&:X:X:X:X :X:X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X~9Xw9Xp9Xi9Xb9X[9XT9XM9XF9X?9X89X19X*9X#9X9X9X9X9X9X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X{8Xt8Xm8Xf8X_8XX8XQ8XJ8XC8X<8X58X.8X'8X 8X8X8X 8X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7Xx7Xq7Xj7Xc7X\7XU7XN7XG7X@7X97X27X+7X$7X7X7X7X7X7X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X|6Xu6Xn6Xg6X`6XY6XR6XK6XD6X=6X66X/6X(6X!6X6X6X 6X6X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5Xy5Xr5Xk5Xd5X]5XV5XO5XH5XA5X:5X35X,5X%5X5X5X5X 5X5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X}4Xv4Xo4Xh4Xa4XZ4XS4XL4XE4X>4X74X04X)4X"4X4X4X 4X4X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xz3Xs3Xl3Xe3X^3XW3XP3XI3XB3X;3X43X-3X&3X3X3X3X 3X3X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X~2Xw2Xp2Xi2Xb2X[2XT2XM2XF2X?2X82X12X*2X#2X2X2X2X2X2X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X{1Xt1Xm1Xf1X_1XX1XQ1XJ1XC1X<1X51X.1X'1X 1X1X1X 1X1X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0Xx0Xq0Xj0Xc0X\0XU0XN0XG0X@0X90X20X+0X$0X0X0X0X0X0X/X/X/X/X/X/X/X/X/X/X/X/X/X/X/X/X/X/X|/Xu/Xn/Xg/X`/XY/XR/XK/XD/X=/X6/X//X(/X!/X/X/X /X/X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.Xy.Xr.Xk.Xd.X].XV.XO.XH.XA.X:.X3.X,.X%.X.X.X.X .X.X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X}-Xv-Xo-Xh-Xa-XZ-XS-XL-XE-X>-X7-X0-X)-X"-X-X-X -X-X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,Xz,Xs,Xl,Xe,X^,XW,XP,XI,XB,X;,X4,X-,X&,X,X,X,X ,X,X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X~+Xw+Xp+Xi+Xb+X[+XT+XM+XF+X?+X8+X1+X*+X#+X+X+X+X+X+X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X{*Xt*Xm*Xf*X_*XX*XQ*XJ*XC*X<*X5*X.*X'*X *X*X*X *X*X)X)X)X)X)X)X)X)X)X)X)X)X)X)X)X)X)X)X)Xx)Xq)Xj)Xc)X\)XU)XN)XG)X@)X9)X2)X+)X$)X)X)X)X)X)X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X|(Xu(Xn(Xg(X`(XY(XR(XK(XD(X=(X6(X/(X((X!(X(X(X (X(X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'Xy'Xr'Xk'Xd'X]'XV'XO'XH'XA'X:'X3'X,'X%'X'X'X'X 'X'X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X}&Xv&Xo&Xh&Xa&XZ&XS&XL&XE&X>&X7&X0&X)&X"&X&X&X &X&X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%Xz%Xs%Xl%Xe%X^%XW%XP%XI%XB%X;%X4%X-%X&%X%X%X%X %X%X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X~$Xw$Xp$Xi$Xb$X[$XT$XM$XF$X?$X8$X1$X*$X#$X$X$X$X$X$X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X{#Xt#Xm#Xf#X_#XX#XQ#XJ#XC#X<#X5#X.#X'#X #X#X#X #X#X"X"X"X"X"X"X"X"X"X"X"X"X"X"X"X"X"X"X"Xx"Xq"Xj"Xc"X\"XU"XN"XG"X@"X9"X2"X+"X$"X"X"X"X"X"X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X|!Xu!Xn!Xg!X`!XY!XR!XK!XD!X=!X6!X/!X(!X!!X!X!X !X!X X X X X X X X X X X X X X X X X X X Xy Xr Xk Xd X] XV XO XH XA X: X3 X, X% X X X X X XXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XXXXXXXXXXXXXXXXXXXXXxXqXjXcX\XUXNXGX@X9X2X+X$XXXXXXXXXXXXXXXXXXXXXXXX|XuXnXgX`XYXRXKXDX=X6X/X(X!XXX XXXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XXXXXXXXXXXXXXXXXXXXXxXqXjXcX\XUXNXGX@X9X2X+X$XXXXXXXXXXXXXXXXXXXXXXXX|XuXnXgX`XYXRXKXDX=X6X/X(X!XXX XXXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XX X X X X X X X X X X X X X X X X X X Xx Xq Xj Xc X\ XU XN XG X@ X9 X2 X+ X$ X X X X X X X X X X X X X X X X X X X X X X X X| Xu Xn Xg X` XY XR XK XD X= X6 X/ X( X! X X X X X X X X X X X X X X X X X X X X X X X Xy Xr Xk Xd X] XV XO XH XA X: X3 X, X% X X X X X X X X X X X X X X X X X X X X X X X X} Xv Xo Xh Xa XZ XS XL XE X> X7 X0 X) X" X X X X X X X X X X X X X X X X X X X X X X X Xz Xs Xl Xe X^ XW XP XI XB X; X4 X- X& X X X X X XXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XXXXXXXXXXXXXXXXXXXXXxXqXjXcX\XUXNXGX@X9X2X+X$XXXXXXXXXXXXXXXXXXXXXXXX|XuXnXgX`XYXRXKXDX=X6X/X(X!XXX XXXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XXWWWWWWWWWWWWWWWWWWWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWWWWWWWWWWWWWWWWWWW|WuWnWgW`WYWRWKWDW=W6W/W(W!WWW WWWWWWWWWWWWWWWWWWWWWyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWܼWռWμWǼWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWٻWһW˻WĻWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWݺWֺWϺWȺWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWܵWյWεWǵWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWٴWҴW˴WĴWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWݳWֳWϳWȳWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWܮWծWήWǮWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWW٭WҭW˭WĭWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWݬW֬WϬWȬWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWܧWէWΧWǧWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWW٦WҦW˦WĦWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWݥW֥WϥWȥWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWܠWՠWΠWǠWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWٟWҟW˟WğWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWݞW֞WϞWȞWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWܙWՙWΙWǙWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWW٘WҘW˘WĘWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWݗW֗WϗWȗWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWWܒWՒWΒWǒWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWّWґWˑWđWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWݐW֐WϐWȐWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWW܋WՋW΋WNjWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWيWҊWˊWĊWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWW݉W։WωWȉWWWWWWWWWWW{WtWmWfW_WXWQWJWCWW7W0W)W"WWW WWWWWWW܄WՄW΄WDŽWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWكW҃W˃WăWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWW݂WւWςWȂWWWWWWWWWWW{WtWmWfW_WXWQWJWCW~W7~W0~W)~W"~W~W~W ~W~W}W}W}W}W}W}W}W}W}W}W}W}W}W}W}W}W}W}W}Wz}Ws}Wl}We}W^}WW}WP}WI}WB}W;}W4}W-}W&}W}W}W}W }W}W|W|W|W|W|W|W|W|W|W|W|W|W|W|W|W|W|W|W~|Ww|Wp|Wi|Wb|W[|WT|WM|WF|W?|W8|W1|W*|W#|W|W|W|W|W|W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{{Wt{Wm{Wf{W_{WX{WQ{WJ{WC{W<{W5{W.{W'{W {W{W{W {W{WzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWxzWqzWjzWczW\zWUzWNzWGzW@zW9zW2zW+zW$zWzWzWzWzWzWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyW|yWuyWnyWgyW`yWYyWRyWKyWDyW=yW6yW/yW(yW!yWyWyW yWyWxWxWxWxWxWxWxWxWxWxWxWxWxWxWxWxWxWxWxWyxWrxWkxWdxW]xWVxWOxWHxWAxW:xW3xW,xW%xWxWxWxW xWxWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwWwW}wWvwWowWhwWawWZwWSwWLwWEwW>wW7wW0wW)wW"wWwWwW wWwWvWvWvWvWvWvWvWvWvWvWvWvWvWvWvWvWvWvWvWzvWsvWlvWevW^vWWvWPvWIvWBvW;vW4vW-vW&vWvWvWvW vWvWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuW~uWwuWpuWiuWbuW[uWTuWMuWFuW?uW8uW1uW*uW#uWuWuWuWuWuWtWtWtWtWtWtWtWtWtWtWtWtWtWtWtWtWtWtW{tWttWmtWftW_tWXtWQtWJtWCtWpW7pW0pW)pW"pWpWpW pWpWoWoWoWoWoWoWoWoWoWoWoWoWoWoWoWoWoWoWoWzoWsoWloWeoW^oWWoWPoWIoWBoW;oW4oW-oW&oWoWoWoW oWoWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnW~nWwnWpnWinWbnW[nWTnWMnWFnW?nW8nW1nW*nW#nWnWnWnWnWnWmWmWmWmWmWmWmWmWmWmWmWmWmWmWmWmWmWmW{mWtmWmmWfmW_mWXmWQmWJmWCmWiW7iW0iW)iW"iWiWiW iWiWhWhWhWhWhWhWhWhWhWhWhWhWhWhWhWhWhWhWhWzhWshWlhWehW^hWWhWPhWIhWBhW;hW4hW-hW&hWhWhWhW hWhWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgW~gWwgWpgWigWbgW[gWTgWMgWFgW?gW8gW1gW*gW#gWgWgWgWgWgWfWfWfWfWfWfWfWfWfWfWfWfWfWfWfWfWfWfW{fWtfWmfWffW_fWXfWQfWJfWCfWbW7bW0bW)bW"bWbWbW bWbWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWzaWsaWlaWeaW^aWWaWPaWIaWBaW;aW4aW-aW&aWaWaWaW aWaW`W`W`W`W`W`W`W`W`W`W`W`W`W`W`W`W`W`W~`Ww`Wp`Wi`Wb`W[`WT`WM`WF`W?`W8`W1`W*`W#`W`W`W`W`W`W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W{_Wt_Wm_Wf_W__WX_WQ_WJ_WC_W<_W5_W._W'_W _W_W_W _W_W^W^W^W^W^W^W^W^W^W^W^W^W^W^W^W^W^W^W^Wx^Wq^Wj^Wc^W\^WU^WN^WG^W@^W9^W2^W+^W$^W^W^W^W^W^W]W]W]W]W]W]W]W]W]W]W]W]W]W]W]W]W]W]W|]Wu]Wn]Wg]W`]WY]WR]WK]WD]W=]W6]W/]W(]W!]W]W]W ]W]W\W\W\W\W\W\W\W\W\W\W\W\W\W\W\W\W\W\W\Wy\Wr\Wk\Wd\W]\WV\WO\WH\WA\W:\W3\W,\W%\W\W\W\W \W\W[W[W[W[W[W[W[W[W[W[W[W[W[W[W[W[W[W[W}[Wv[Wo[Wh[Wa[WZ[WS[WL[WE[W>[W7[W0[W)[W"[W[W [W[WZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWzZWsZWlZWeZW^ZWWZWPZWIZWBZW;ZW4ZW-ZW&ZWZWZWZW ZWZWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYW~YWwYWpYWiYWbYW[YWTYWMYWFYW?YW8YW1YW*YW#YWYWYWYWYWYWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXW{XWtXWmXWfXW_XWXXWQXWJXWCXWTW7TW0TW)TW"TWTWTW TWTWSWSWSWSWSWSWSWSWSWSWSWSWSWSWSWSWSWSWSWzSWsSWlSWeSW^SWWSWPSWISWBSW;SW4SW-SW&SWSWSWSW SWSWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRW~RWwRWpRWiRWbRW[RWTRWMRWFRW?RW8RW1RW*RW#RWRWRWRWRWRWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQW{QWtQWmQWfQW_QWXQWQQWJQWCQWMW7MW0MW)MW"MWMWMW MWMWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWzLWsLWlLWeLW^LWWLWPLWILWBLW;LW4LW-LW&LWLWLWLW LWLWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKW~KWwKWpKWiKWbKW[KWTKWMKWFKW?KW8KW1KW*KW#KWKWKWKWKWKWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJW{JWtJWmJWfJW_JWXJWQJWJJWCJWFW7FW0FW)FW"FWFWFW FWFWEWEWEWEWEWEWEWEWEWEWEWEWEWEWEWEWEWEWEWzEWsEWlEWeEW^EWWEWPEWIEWBEW;EW4EW-EW&EWEWEWEW EWEWDWDWDWDWDWDWDWDWDWDWDWDWDWDWDWDWDWDW~DWwDWpDWiDWbDW[DWTDWMDWFDW?DW8DW1DW*DW#DWDWDWDWDWDWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCW{CWtCWmCWfCW_CWXCWQCWJCWCCW?W7?W0?W)?W"?W?W?W ?W?W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>Wz>Ws>Wl>We>W^>WW>WP>WI>WB>W;>W4>W->W&>W>W>W>W >W>W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W~=Ww=Wp=Wi=Wb=W[=WT=WM=WF=W?=W8=W1=W*=W#=W=W=W=W=W=W8W78W08W)8W"8W8W8W 8W8W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7Wz7Ws7Wl7We7W^7WW7WP7WI7WB7W;7W47W-7W&7W7W7W7W 7W7W6W6W6W6W6W6W6W6W6W6W6W6W6W6W6W6W6W6W~6Ww6Wp6Wi6Wb6W[6WT6WM6WF6W?6W86W16W*6W#6W6W6W6W6W6W5W5W5W5W5W5W5W5W5W5W5W5W5W5W5W5W5W5W{5Wt5Wm5Wf5W_5WX5WQ5WJ5WC5W<5W55W.5W'5W 5W5W5W 5W5W4W4W4W4W4W4W4W4W4W4W4W4W4W4W4W4W4W4W4Wx4Wq4Wj4Wc4W\4WU4WN4WG4W@4W94W24W+4W$4W4W4W4W4W4W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W|3Wu3Wn3Wg3W`3WY3WR3WK3WD3W=3W63W/3W(3W!3W3W3W 3W3W2W2W2W2W2W2W2W2W2W2W2W2W2W2W2W2W2W2W2Wy2Wr2Wk2Wd2W]2WV2WO2WH2WA2W:2W32W,2W%2W2W2W2W 2W2W1W1W1W1W1W1W1W1W1W1W1W1W1W1W1W1W1W1W}1Wv1Wo1Wh1Wa1WZ1WS1WL1WE1W>1W71W01W)1W"1W1W1W 1W1W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0Wz0Ws0Wl0We0W^0WW0WP0WI0WB0W;0W40W-0W&0W0W0W0W 0W0W/W/W/W/W/W/W/W/W/W/W/W/W/W/W/W/W/W/W~/Ww/Wp/Wi/Wb/W[/WT/WM/WF/W?/W8/W1/W*/W#/W/W/W/W/W/W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W{.Wt.Wm.Wf.W_.WX.WQ.WJ.WC.W<.W5.W..W'.W .W.W.W .W.W-W-W-W-W-W-W-W-W-W-W-W-W-W-W-W-W-W-W-Wx-Wq-Wj-Wc-W\-WU-WN-WG-W@-W9-W2-W+-W$-W-W-W-W-W-W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W|,Wu,Wn,Wg,W`,WY,WR,WK,WD,W=,W6,W/,W(,W!,W,W,W ,W,W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+Wy+Wr+Wk+Wd+W]+WV+WO+WH+WA+W:+W3+W,+W%+W+W+W+W +W+W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W}*Wv*Wo*Wh*Wa*WZ*WS*WL*WE*W>*W7*W0*W)*W"*W*W*W *W*W)W)W)W)W)W)W)W)W)W)W)W)W)W)W)W)W)W)W)Wz)Ws)Wl)We)W^)WW)WP)WI)WB)W;)W4)W-)W&)W)W)W)W )W)W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W~(Ww(Wp(Wi(Wb(W[(WT(WM(WF(W?(W8(W1(W*(W#(W(W(W(W(W(W'W'W'W'W'W'W'W'W'W'W'W'W'W'W'W'W'W'W{'Wt'Wm'Wf'W_'WX'WQ'WJ'WC'W<'W5'W.'W''W 'W'W'W 'W'W&W&W&W&W&W&W&W&W&W&W&W&W&W&W&W&W&W&W&Wx&Wq&Wj&Wc&W\&WU&WN&WG&W@&W9&W2&W+&W$&W&W&W&W&W&W%W%W%W%W%W%W%W%W%W%W%W%W%W%W%W%W%W%W|%Wu%Wn%Wg%W`%WY%WR%WK%WD%W=%W6%W/%W(%W!%W%W%W %W%W$W$W$W$W$W$W$W$W$W$W$W$W$W$W$W$W$W$W$Wy$Wr$Wk$Wd$W]$WV$WO$WH$WA$W:$W3$W,$W%$W$W$W$W $W$W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W}#Wv#Wo#Wh#Wa#WZ#WS#WL#WE#W>#W7#W0#W)#W"#W#W#W #W#W"W"W"W"W"W"W"W"W"W"W"W"W"W"W"W"W"W"W"Wz"Ws"Wl"We"W^"WW"WP"WI"WB"W;"W4"W-"W&"W"W"W"W "W"W!W!W!W!W!W!W!W!W!W!W!W!W!W!W!W!W!W!W~!Ww!Wp!Wi!Wb!W[!WT!WM!WF!W?!W8!W1!W*!W#!W!W!W!W!W!W W W W W W W W W W W W W W W W W W W{ Wt Wm Wf W_ WX WQ WJ WC W< W5 W. W' W W W W W WWWWWWWWWWWWWWWWWWWWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWWWWWWWWWWWWWWWWWWW|WuWnWgW`WYWRWKWDW=W6W/W(W!WWW WWWWWWWWWWWWWWWWWWWWWyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCW<W5W.W'W WWW WWWWWWWWWWWWWWWWWWWWWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWWWWWWWWWWWWWWWWWWW|WuWnWgW`WYWRWKWDW=W6W/W(W!WWW WWWWWWWWWWWWWWWWWWWWWyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCW<W5W.W'W WWW WWWWWWWWWWWWWWWWWWWWWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWWWWWWWWWWWWWWWWWWW|WuWnWgW`WYWRWKWDW=W6W/W(W!WWW WWWWWWWWWWWWWWWWWWWWWyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WW W W W W W W W W W W W W W W W W W W Wz Ws Wl We W^ WW WP WI WB W; W4 W- W& W W W W W W W W W W W W W W W W W W W W W W W W~ Ww Wp Wi Wb W[ WT WM WF W? W8 W1 W* W# W W W W W W W W W W W W W W W W W W W W W W W W{ Wt Wm Wf W_ WX WQ WJ WC W< W5 W. W' W W W W W W W W W W W W W W W W W W W W W W W W Wx Wq Wj Wc W\ WU WN WG W@ W9 W2 W+ W$ W W W W W W W W W W W W W W W W W W W W W W W W| Wu Wn Wg W` WY WR WK WD W= W6 W/ W( W! W W W W WWWWWWWWWWWWWWWWWWWWyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCW<W5W.W'W WWW WWWWWWWWWWWWWWWWWWWWWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWWWWWWWWWWWWWWWWWWW|WuWnWgW`WYWRWKWDW=W6W/W(W!WWW WWWWWWWWWWWWWWWWWWWWWyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVٿVҿV˿VĿVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVݾV־VϾVȾVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVܹVչVιVǹVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVٸVҸV˸VĸVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVݷVַVϷVȷVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVܲVղVβVDzVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVٱVұV˱VıVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVݰVְVϰVȰVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVܫVիVΫVǫVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVV٪VҪV˪VĪVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVݩV֩VϩVȩVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVܤVդVΤVǤVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVV٣VңVˣVģVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVݢV֢VϢVȢVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVܝV՝VΝVǝVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVٜVҜV˜VĜVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVݛV֛VϛVțVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVVܖVՖVΖVǖVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVٕVҕV˕VĕVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVݔV֔VϔVȔVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVV܏VՏVΏVǏVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVَVҎVˎVĎVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVݍV֍VύVȍVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVV܈VՈVΈVLjVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVهV҇VˇVćVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVV݆VֆVφVȆVVVVVVVVVVV{VtVmVfV_VXVQVJVCVV7V0V)V"VVV VVVVVVV܁VՁV΁VǁVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVـVҀVˀVĀVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VV~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~Vx~Vq~Vj~Vc~V\~VU~VN~VG~V@~V9~V2~V+~V$~V~V~V~V~V~V}V}V}V}V}V}V}V}V}V}V}V}V}V}V}V}V}V}V|}Vu}Vn}Vg}V`}VY}VR}VK}VD}V=}V6}V/}V(}V!}V}V}V }V}V|V|V|V|V|V|V|V|V|V|V|V|V|V|V|V|V|V|V|Vy|Vr|Vk|Vd|V]|VV|VO|VH|VA|V:|V3|V,|V%|V|V|V|V |V|V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V}{Vv{Vo{Vh{Va{VZ{VS{VL{VE{V>{V7{V0{V){V"{V{V{V {V{VzVzVzVzVzVzVzVzVzVzVzVzVzVzVzVzVzVzVzVzzVszVlzVezV^zVWzVPzVIzVBzV;zV4zV-zV&zVzVzVzV zVzVyVyVyVyVyVyVyVyVyVyVyVyVyVyVyVyVyVyV~yVwyVpyViyVbyV[yVTyVMyVFyV?yV8yV1yV*yV#yVyVyVyVyVyVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxV{xVtxVmxVfxV_xVXxVQxVJxVCxVtV7tV0tV)tV"tVtVtV tVtVsVsVsVsVsVsVsVsVsVsVsVsVsVsVsVsVsVsVsVzsVssVlsVesV^sVWsVPsVIsVBsV;sV4sV-sV&sVsVsVsV sVsVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrV~rVwrVprVirVbrV[rVTrVMrVFrV?rV8rV1rV*rV#rVrVrVrVrVrVqVqVqVqVqVqVqVqVqVqVqVqVqVqVqVqVqVqV{qVtqVmqVfqV_qVXqVQqVJqVCqVmV7mV0mV)mV"mVmVmV mVmVlVlVlVlVlVlVlVlVlVlVlVlVlVlVlVlVlVlVlVzlVslVllVelV^lVWlVPlVIlVBlV;lV4lV-lV&lVlVlVlV lVlVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkV~kVwkVpkVikVbkV[kVTkVMkVFkV?kV8kV1kV*kV#kVkVkVkVkVkVjVjVjVjVjVjVjVjVjVjVjVjVjVjVjVjVjVjV{jVtjVmjVfjV_jVXjVQjVJjVCjVfV7fV0fV)fV"fVfVfV fVfVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVzeVseVleVeeV^eVWeVPeVIeVBeV;eV4eV-eV&eVeVeVeV eVeVdVdVdVdVdVdVdVdVdVdVdVdVdVdVdVdVdVdV~dVwdVpdVidVbdV[dVTdVMdVFdV?dV8dV1dV*dV#dVdVdVdVdVdVcVcVcVcVcVcVcVcVcVcVcVcVcVcVcVcVcVcV{cVtcVmcVfcV_cVXcVQcVJcVCcV_V7_V0_V)_V"_V_V_V _V_V^V^V^V^V^V^V^V^V^V^V^V^V^V^V^V^V^V^V^Vz^Vs^Vl^Ve^V^^VW^VP^VI^VB^V;^V4^V-^V&^V^V^V^V ^V^V]V]V]V]V]V]V]V]V]V]V]V]V]V]V]V]V]V]V~]Vw]Vp]Vi]Vb]V[]VT]VM]VF]V?]V8]V1]V*]V#]V]V]V]V]V]V\V\V\V\V\V\V\V\V\V\V\V\V\V\V\V\V\V\V{\Vt\Vm\Vf\V_\VX\VQ\VJ\VC\V<\V5\V.\V'\V \V\V\V \V\V[V[V[V[V[V[V[V[V[V[V[V[V[V[V[V[V[V[V[Vx[Vq[Vj[Vc[V\[VU[VN[VG[V@[V9[V2[V+[V$[V[V[V[V[V[VZVZVZVZVZVZVZVZVZVZVZVZVZVZVZVZVZVZV|ZVuZVnZVgZV`ZVYZVRZVKZVDZV=ZV6ZV/ZV(ZV!ZVZVZV ZVZVYVYVYVYVYVYVYVYVYVYVYVYVYVYVYVYVYVYVYVyYVrYVkYVdYV]YVVYVOYVHYVAYV:YV3YV,YV%YVYVYVYV YVYVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXV}XVvXVoXVhXVaXVZXVSXVLXVEXV>XV7XV0XV)XV"XVXVXV XVXVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVzWVsWVlWVeWV^WVWWVPWVIWVBWV;WV4WV-WV&WVWVWVWV WVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV~VVwVVpVViVVbVV[VVTVVMVVFVV?VV8VV1VV*VV#VVVVVVVVVVVVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUV{UVtUVmUVfUV_UVXUVQUVJUVCUVQV7QV0QV)QV"QVQVQV QVQVPVPVPVPVPVPVPVPVPVPVPVPVPVPVPVPVPVPVPVzPVsPVlPVePV^PVWPVPPVIPVBPV;PV4PV-PV&PVPVPVPV PVPVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOV~OVwOVpOViOVbOV[OVTOVMOVFOV?OV8OV1OV*OV#OVOVOVOVOVOVNVNVNVNVNVNVNVNVNVNVNVNVNVNVNVNVNVNV{NVtNVmNVfNV_NVXNVQNVJNVCNVJV7JV0JV)JV"JVJVJV JVJVIVIVIVIVIVIVIVIVIVIVIVIVIVIVIVIVIVIVIVzIVsIVlIVeIV^IVWIVPIVIIVBIV;IV4IV-IV&IVIVIVIV IVIVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHV~HVwHVpHViHVbHV[HVTHVMHVFHV?HV8HV1HV*HV#HVHVHVHVHVHVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGV{GVtGVmGVfGV_GVXGVQGVJGVCGVCV7CV0CV)CV"CVCVCV CVCVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVzBVsBVlBVeBV^BVWBVPBVIBVBBV;BV4BV-BV&BVBVBVBV BVBVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAV~AVwAVpAViAVbAV[AVTAVMAVFAV?AV8AV1AV*AV#AVAVAVAVAVAV@V@V@V@V@V@V@V@V@V@V@V@V@V@V@V@V@V@V{@Vt@Vm@Vf@V_@VX@VQ@VJ@VC@V<@V5@V.@V'@V @V@V@V @V@V?V?V?V?V?V?V?V?V?V?V?V?V?V?V?V?V?V?V?Vx?Vq?Vj?Vc?V\?VU?VN?VG?V@?V9?V2?V+?V$?V?V?V?V?V?V>V>V>V>V>V>V>V>V>V>V>V>V>V>V>V>V>V>V|>Vu>Vn>Vg>V`>VY>VR>VK>VD>V=>V6>V/>V(>V!>V>V>V >V>V=V=V=V=V=V=V=V=V=V=V=V=V=V=V=V=V=V=V=Vy=Vr=Vk=Vd=V]=VV=VO=VH=VA=V:=V3=V,=V%=V=V=V=V =V=V5V75V05V)5V"5V5V5V 5V5V4V4V4V4V4V4V4V4V4V4V4V4V4V4V4V4V4V4V4Vz4Vs4Vl4Ve4V^4VW4VP4VI4VB4V;4V44V-4V&4V4V4V4V 4V4V3V3V3V3V3V3V3V3V3V3V3V3V3V3V3V3V3V3V~3Vw3Vp3Vi3Vb3V[3VT3VM3VF3V?3V83V13V*3V#3V3V3V3V3V3V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V{2Vt2Vm2Vf2V_2VX2VQ2VJ2VC2V<2V52V.2V'2V 2V2V2V 2V2V1V1V1V1V1V1V1V1V1V1V1V1V1V1V1V1V1V1V1Vx1Vq1Vj1Vc1V\1VU1VN1VG1V@1V91V21V+1V$1V1V1V1V1V1V0V0V0V0V0V0V0V0V0V0V0V0V0V0V0V0V0V0V|0Vu0Vn0Vg0V`0VY0VR0VK0VD0V=0V60V/0V(0V!0V0V0V 0V0V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/V/Vy/Vr/Vk/Vd/V]/VV/VO/VH/VA/V:/V3/V,/V%/V/V/V/V /V/V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V}.Vv.Vo.Vh.Va.VZ.VS.VL.VE.V>.V7.V0.V).V".V.V.V .V.V-V-V-V-V-V-V-V-V-V-V-V-V-V-V-V-V-V-V-Vz-Vs-Vl-Ve-V^-VW-VP-VI-VB-V;-V4-V--V&-V-V-V-V -V-V,V,V,V,V,V,V,V,V,V,V,V,V,V,V,V,V,V,V~,Vw,Vp,Vi,Vb,V[,VT,VM,VF,V?,V8,V1,V*,V#,V,V,V,V,V,V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V{+Vt+Vm+Vf+V_+VX+VQ+VJ+VC+V<+V5+V.+V'+V +V+V+V +V+V*V*V*V*V*V*V*V*V*V*V*V*V*V*V*V*V*V*V*Vx*Vq*Vj*Vc*V\*VU*VN*VG*V@*V9*V2*V+*V$*V*V*V*V*V*V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V|)Vu)Vn)Vg)V`)VY)VR)VK)VD)V=)V6)V/)V()V!)V)V)V )V)V(V(V(V(V(V(V(V(V(V(V(V(V(V(V(V(V(V(V(Vy(Vr(Vk(Vd(V](VV(VO(VH(VA(V:(V3(V,(V%(V(V(V(V (V(V'V'V'V'V'V'V'V'V'V'V'V'V'V'V'V'V'V'V}'Vv'Vo'Vh'Va'VZ'VS'VL'VE'V>'V7'V0'V)'V"'V'V'V 'V'V&V&V&V&V&V&V&V&V&V&V&V&V&V&V&V&V&V&V&Vz&Vs&Vl&Ve&V^&VW&VP&VI&VB&V;&V4&V-&V&&V&V&V&V &V&V%V%V%V%V%V%V%V%V%V%V%V%V%V%V%V%V%V%V~%Vw%Vp%Vi%Vb%V[%VT%VM%VF%V?%V8%V1%V*%V#%V%V%V%V%V%V$V$V$V$V$V$V$V$V$V$V$V$V$V$V$V$V$V$V{$Vt$Vm$Vf$V_$VX$VQ$VJ$VC$V<$V5$V.$V'$V $V$V$V $V$V#V#V#V#V#V#V#V#V#V#V#V#V#V#V#V#V#V#V#Vx#Vq#Vj#Vc#V\#VU#VN#VG#V@#V9#V2#V+#V$#V#V#V#V#V#V"V"V"V"V"V"V"V"V"V"V"V"V"V"V"V"V"V"V|"Vu"Vn"Vg"V`"VY"VR"VK"VD"V="V6"V/"V("V!"V"V"V "V"V!V!V!V!V!V!V!V!V!V!V!V!V!V!V!V!V!V!V!Vy!Vr!Vk!Vd!V]!VV!VO!VH!VA!V:!V3!V,!V%!V!V!V!V !V!V V V V V V V V V V V V V V V V V V V} Vv Vo Vh Va VZ VS VL VE V> V7 V0 V) V" V V V V VVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVVVVVVVVVVVVVVVVVVVVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVVVVVVVVVVVVVVVVVVVV|VuVnVgV`VYVRVKVDV=V6V/V(V!VVV VVVVVVVVVVVVVVVVVVVVVyVrVkVdV]VVVOVHVAV:V3V,V%VVVV VVVVVVVVVVVVVVVVVVVV}VvVoVhVaVZVSVLVEV>V7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVVVVVVVVVVVVVVVVVVVVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVVVVVVVVVVVVVVVVVVVV|VuVnVgV`VYVRVKVDV=V6V/V(V!VVV VVVVVVVVVVVVVVVVVVVVVyVrVkVdV]VVVOVHVAV:V3V,V%VVVV VVVVVVVVVVVVVVVVVVVV}VvVoVhVaVZVSVLVEV>V7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVVVVVVVVVVVVVVVVVVVVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVV V V V V V V V V V V V V V V V V V V| Vu Vn Vg V` VY VR VK VD V= V6 V/ V( V! V V V V V V V V V V V V V V V V V V V V V V V Vy Vr Vk Vd V] VV VO VH VA V: V3 V, V% V V V V V V V V V V V V V V V V V V V V V V V V} Vv Vo Vh Va VZ VS VL VE V> V7 V0 V) V" V V V V V V V V V V V V V V V V V V V V V V V Vz Vs Vl Ve V^ VW VP VI VB V; V4 V- V& V V V V V V V V V V V V V V V V V V V V V V V V~ Vw Vp Vi Vb V[ VT VM VF V? V8 V1 V* V# V V V V V VVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVVVVVVVVVVVVVVVVVVVVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVVVVVVVVVVVVVVVVVVVV|VuVnVgV`VYVRVKVDV=V6V/V(V!VVV VVVVVVVVVVVVVVVVVVVVVyVrVkVdV]VVVOVHVAV:V3V,V%VVVV VVVVVVVVVVVVVVVVVVVV}VvVoVhVaVZVSVLVEV>V7V0V)V"VVV VVVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVVVVVVVVVVVVVVVVVVVVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVVUUUUUUUUUUUUUUUUUU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUUUUUUUUUUUUUUUUUUUUyUrUkUdU]UVUOUHUAU:U3U,U%UUUU UUUUUUUUUUUUUUUUUUUU}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUܽUսUνUǽUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUټUҼU˼UļUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUݻUֻUϻUȻUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUܶUնUζUǶUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUٵUҵU˵UĵUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUݴUִUϴUȴUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUܯUկUίUǯUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUٮUҮUˮUĮUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUݭU֭UϭUȭUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUܨUըUΨUǨUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUU٧UҧU˧UħUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUݦU֦UϦUȦUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUܡUաUΡUǡUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUU٠UҠUˠUĠUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUݟU֟UϟUȟUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUܚU՚UΚUǚUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUٙUҙU˙UęUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUݘU֘UϘUȘUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUUܓUՓUΓUǓUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUْUҒU˒UĒUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUݑU֑UϑUȑUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUU܌UՌUΌUnjUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUًUҋUˋUċUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUU݊U֊UϊUȊUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UUUUUUU܅UՅU΅UDžUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUلU҄U˄UĄUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUU݃UփUσUȃUUUUUUUUUUU{UtUmUfU_UXUQUJUCUU7U0U)U"UUU UU~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~Uz~Us~Ul~Ue~U^~UW~UP~UI~UB~U;~U4~U-~U&~U~U~U~U ~U~U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U~}Uw}Up}Ui}Ub}U[}UT}UM}UF}U?}U8}U1}U*}U#}U}U}U}U}U}U|U|U|U|U|U|U|U|U|U|U|U|U|U|U|U|U|U|U{|Ut|Um|Uf|U_|UX|UQ|UJ|UC|U<|U5|U.|U'|U |U|U|U |U|U{U{U{U{U{U{U{U{U{U{U{U{U{U{U{U{U{U{U{Ux{Uq{Uj{Uc{U\{UU{UN{UG{U@{U9{U2{U+{U${U{U{U{U{U{UzUzUzUzUzUzUzUzUzUzUzUzUzUzUzUzUzUzU|zUuzUnzUgzU`zUYzURzUKzUDzU=zU6zU/zU(zU!zUzUzU zUzUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyyUryUkyUdyU]yUVyUOyUHyUAyU:yU3yU,yU%yUyUyUyU yUyUxUxUxUxUxUxUxUxUxUxUxUxUxUxUxUxUxUxU}xUvxUoxUhxUaxUZxUSxULxUExU>xU7xU0xU)xU"xUxUxU xUxUwUwUwUwUwUwUwUwUwUwUwUwUwUwUwUwUwUwUwUzwUswUlwUewU^wUWwUPwUIwUBwU;wU4wU-wU&wUwUwUwU wUwUvUvUvUvUvUvUvUvUvUvUvUvUvUvUvUvUvUvU~vUwvUpvUivUbvU[vUTvUMvUFvU?vU8vU1vU*vU#vUvUvUvUvUvUuUuUuUuUuUuUuUuUuUuUuUuUuUuUuUuUuUuU{uUtuUmuUfuU_uUXuUQuUJuUCuUqU7qU0qU)qU"qUqUqU qUqUpUpUpUpUpUpUpUpUpUpUpUpUpUpUpUpUpUpUpUzpUspUlpUepU^pUWpUPpUIpUBpU;pU4pU-pU&pUpUpUpU pUpUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoU~oUwoUpoUioUboU[oUToUMoUFoU?oU8oU1oU*oU#oUoUoUoUoUoUnUnUnUnUnUnUnUnUnUnUnUnUnUnUnUnUnUnU{nUtnUmnUfnU_nUXnUQnUJnUCnUjU7jU0jU)jU"jUjUjU jUjUiUiUiUiUiUiUiUiUiUiUiUiUiUiUiUiUiUiUiUziUsiUliUeiU^iUWiUPiUIiUBiU;iU4iU-iU&iUiUiUiU iUiUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhU~hUwhUphUihUbhU[hUThUMhUFhU?hU8hU1hU*hU#hUhUhUhUhUhUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgU{gUtgUmgUfgU_gUXgUQgUJgUCgUcU7cU0cU)cU"cUcUcU cUcUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUzbUsbUlbUebU^bUWbUPbUIbUBbU;bU4bU-bU&bUbUbUbU bUbUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaU~aUwaUpaUiaUbaU[aUTaUMaUFaU?aU8aU1aU*aU#aUaUaUaUaUaU`U`U`U`U`U`U`U`U`U`U`U`U`U`U`U`U`U`U{`Ut`Um`Uf`U_`UX`UQ`UJ`UC`U<`U5`U.`U'`U `U`U`U `U`U_U_U_U_U_U_U_U_U_U_U_U_U_U_U_U_U_U_U_Ux_Uq_Uj_Uc_U\_UU_UN_UG_U@_U9_U2_U+_U$_U_U_U_U_U_U^U^U^U^U^U^U^U^U^U^U^U^U^U^U^U^U^U^U|^Uu^Un^Ug^U`^UY^UR^UK^UD^U=^U6^U/^U(^U!^U^U^U ^U^U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]Uy]Ur]Uk]Ud]U]]UV]UO]UH]UA]U:]U3]U,]U%]U]U]U]U ]U]U\U\U\U\U\U\U\U\U\U\U\U\U\U\U\U\U\U\U}\Uv\Uo\Uh\Ua\UZ\US\UL\UE\U>\U7\U0\U)\U"\U\U\U \U\U[U[U[U[U[U[U[U[U[U[U[U[U[U[U[U[U[U[U[Uz[Us[Ul[Ue[U^[UW[UP[UI[UB[U;[U4[U-[U&[U[U[U[U [U[UZUZUZUZUZUZUZUZUZUZUZUZUZUZUZUZUZUZU~ZUwZUpZUiZUbZU[ZUTZUMZUFZU?ZU8ZU1ZU*ZU#ZUZUZUZUZUZUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYU{YUtYUmYUfYU_YUXYUQYUJYUCYUUU7UU0UU)UU"UUUUUU UUUUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUzTUsTUlTUeTU^TUWTUPTUITUBTU;TU4TU-TU&TUTUTUTU TUTUSUSUSUSUSUSUSUSUSUSUSUSUSUSUSUSUSUSU~SUwSUpSUiSUbSU[SUTSUMSUFSU?SU8SU1SU*SU#SUSUSUSUSUSURURURURURURURURURURURURURURURURURURU{RUtRUmRUfRU_RUXRUQRUJRUCRUNU7NU0NU)NU"NUNUNU NUNUMUMUMUMUMUMUMUMUMUMUMUMUMUMUMUMUMUMUMUzMUsMUlMUeMU^MUWMUPMUIMUBMU;MU4MU-MU&MUMUMUMU MUMULULULULULULULULULULULULULULULULULULU~LUwLUpLUiLUbLU[LUTLUMLUFLU?LU8LU1LU*LU#LULULULULULUKUKUKUKUKUKUKUKUKUKUKUKUKUKUKUKUKUKU{KUtKUmKUfKU_KUXKUQKUJKUCKUGU7GU0GU)GU"GUGUGU GUGUFUFUFUFUFUFUFUFUFUFUFUFUFUFUFUFUFUFUFUzFUsFUlFUeFU^FUWFUPFUIFUBFU;FU4FU-FU&FUFUFUFU FUFUEUEUEUEUEUEUEUEUEUEUEUEUEUEUEUEUEUEU~EUwEUpEUiEUbEU[EUTEUMEUFEU?EU8EU1EU*EU#EUEUEUEUEUEUDUDUDUDUDUDUDUDUDUDUDUDUDUDUDUDUDUDU{DUtDUmDUfDU_DUXDUQDUJDUCDU@U7@U0@U)@U"@U@U@U @U@U?U?U?U?U?U?U?U?U?U?U?U?U?U?U?U?U?U?U?Uz?Us?Ul?Ue?U^?UW?UP?UI?UB?U;?U4?U-?U&?U?U?U?U ?U?U>U>U>U>U>U>U>U>U>U>U>U>U>U>U>U>U>U>U~>Uw>Up>Ui>Ub>U[>UT>UM>UF>U?>U8>U1>U*>U#>U>U>U>U>U>U=U=U=U=U=U=U=U=U=U=U=U=U=U=U=U=U=U=U{=Ut=Um=Uf=U_=UX=UQ=UJ=UC=U<=U5=U.=U'=U =U=U=U =U=U9U79U09U)9U"9U9U9U 9U9U8U8U8U8U8U8U8U8U8U8U8U8U8U8U8U8U8U8U8Uz8Us8Ul8Ue8U^8UW8UP8UI8UB8U;8U48U-8U&8U8U8U8U 8U8U7U7U7U7U7U7U7U7U7U7U7U7U7U7U7U7U7U7U~7Uw7Up7Ui7Ub7U[7UT7UM7UF7U?7U87U17U*7U#7U7U7U7U7U7U6U6U6U6U6U6U6U6U6U6U6U6U6U6U6U6U6U6U{6Ut6Um6Uf6U_6UX6UQ6UJ6UC6U<6U56U.6U'6U 6U6U6U 6U6U5U5U5U5U5U5U5U5U5U5U5U5U5U5U5U5U5U5U5Ux5Uq5Uj5Uc5U\5UU5UN5UG5U@5U95U25U+5U$5U5U5U5U5U5U4U4U4U4U4U4U4U4U4U4U4U4U4U4U4U4U4U4U|4Uu4Un4Ug4U`4UY4UR4UK4UD4U=4U64U/4U(4U!4U4U4U 4U4U3U3U3U3U3U3U3U3U3U3U3U3U3U3U3U3U3U3U3Uy3Ur3Uk3Ud3U]3UV3UO3UH3UA3U:3U33U,3U%3U3U3U3U 3U3U2U2U2U2U2U2U2U2U2U2U2U2U2U2U2U2U2U2U}2Uv2Uo2Uh2Ua2UZ2US2UL2UE2U>2U72U02U)2U"2U2U2U 2U2U1U1U1U1U1U1U1U1U1U1U1U1U1U1U1U1U1U1U1Uz1Us1Ul1Ue1U^1UW1UP1UI1UB1U;1U41U-1U&1U1U1U1U 1U1U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U~0Uw0Up0Ui0Ub0U[0UT0UM0UF0U?0U80U10U*0U#0U0U0U0U0U0U/U/U/U/U/U/U/U/U/U/U/U/U/U/U/U/U/U/U{/Ut/Um/Uf/U_/UX/UQ/UJ/UC/U+U7+U0+U)+U"+U+U+U +U+U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*Uz*Us*Ul*Ue*U^*UW*UP*UI*UB*U;*U4*U-*U&*U*U*U*U *U*U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U~)Uw)Up)Ui)Ub)U[)UT)UM)UF)U?)U8)U1)U*)U#)U)U)U)U)U)U(U(U(U(U(U(U(U(U(U(U(U(U(U(U(U(U(U(U{(Ut(Um(Uf(U_(UX(UQ(UJ(UC(U<(U5(U.(U'(U (U(U(U (U(U'U'U'U'U'U'U'U'U'U'U'U'U'U'U'U'U'U'U'Ux'Uq'Uj'Uc'U\'UU'UN'UG'U@'U9'U2'U+'U$'U'U'U'U'U'U&U&U&U&U&U&U&U&U&U&U&U&U&U&U&U&U&U&U|&Uu&Un&Ug&U`&UY&UR&UK&UD&U=&U6&U/&U(&U!&U&U&U &U&U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%Uy%Ur%Uk%Ud%U]%UV%UO%UH%UA%U:%U3%U,%U%%U%U%U%U %U%U$U$U$U$U$U$U$U$U$U$U$U$U$U$U$U$U$U$U}$Uv$Uo$Uh$Ua$UZ$US$UL$UE$U>$U7$U0$U)$U"$U$U$U $U$U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#Uz#Us#Ul#Ue#U^#UW#UP#UI#UB#U;#U4#U-#U&#U#U#U#U #U#U"U"U"U"U"U"U"U"U"U"U"U"U"U"U"U"U"U"U~"Uw"Up"Ui"Ub"U["UT"UM"UF"U?"U8"U1"U*"U#"U"U"U"U"U"U!U!U!U!U!U!U!U!U!U!U!U!U!U!U!U!U!U!U{!Ut!Um!Uf!U_!UX!UQ!UJ!UC!UU7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCU<U5U.U'U UUU UUUUUUUUUUUUUUUUUUUUUxUqUjUcU\UUUNUGU@U9U2U+U$UUUUUUUUUUUUUUUUUUUUUUUU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUUUUUUUUUUUUUUUUUUUUyUrUkUdU]UVUOUHUAU:U3U,U%UUUU UUUUUUUUUUUUUUUUUUUU}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCU<U5U.U'U UUU UUUUUUUUUUUUUUUUUUUUUxUqUjUcU\UUUNUGU@U9U2U+U$UUUUUUUUUUUUUUUUUUUUUUUU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUUUUUUUUUUUUUUUUUUUUyUrUkUdU]UVUOUHUAU:U3U,U%UUUU UUUUUUUUUUUUUUUUUUUU}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UU U U U U U U U U U U U U U U U U U U~ Uw Up Ui Ub U[ UT UM UF U? U8 U1 U* U# U U U U U U U U U U U U U U U U U U U U U U U U{ Ut Um Uf U_ UX UQ UJ UC U< U5 U. U' U U U U U U U U U U U U U U U U U U U U U U U U Ux Uq Uj Uc U\ UU UN UG U@ U9 U2 U+ U$ U U U U U U U U U U U U U U U U U U U U U U U U| Uu Un Ug U` UY UR UK UD U= U6 U/ U( U! U U U U U U U U U U U U U U U U U U U U U U U Uy Ur Uk Ud U] UV UO UH UA U: U3 U, U% U U U U U UUUUUUUUUUUUUUUUUUU}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCU<U5U.U'U UUU UUUUUUUUUUUUUUUUUUUUUxUqUjUcU\UUUNUGU@U9U2U+U$UUUUUUUUUUUUUUUUUUUUUUUU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUUUUUUUUUUUUUUUUUUUUyUrUkUdU]UVUOUHUAU:U3U,U%UUUU UUUUUUUUUUUUUUUUUUUU}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTݿTֿTϿTȿTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTܺTպTκTǺTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTٹTҹT˹TĹTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTݸTָTϸTȸTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTܳTճTγTdzTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTٲTҲT˲TIJTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTݱTֱTϱTȱTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTܬTլTάTǬTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTT٫TҫT˫TīTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTݪT֪TϪTȪTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTܥTեTΥTǥTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTT٤TҤTˤTĤTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTݣT֣TϣTȣTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTܞT՞TΞTǞTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTٝTҝT˝TĝTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTݜT֜TϜTȜTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTܗT՗TΗTǗTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTٖTҖT˖TĖTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTݕT֕TϕTȕTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTTܐTՐTΐTǐTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTُTҏTˏTďTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTݎT֎TώTȎTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTT܉TՉTΉTljTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTوT҈TˈTĈTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTT݇TևTχTȇTTTTTTTTTTT{TtTmTfT_TXTQTJTCTT7T0T)T"TTT TTTTTTT܂TՂT΂TǂTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTفTҁTˁTāTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTT݀TրTπTȀTTTTTTTTTTT{TtTmTfT_TXTQTJTCT|T7|T0|T)|T"|T|T|T |T|T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{Tz{Ts{Tl{Te{T^{TW{TP{TI{TB{T;{T4{T-{T&{T{T{T{T {T{TzTzTzTzTzTzTzTzTzTzTzTzTzTzTzTzTzTzT~zTwzTpzTizTbzT[zTTzTMzTFzT?zT8zT1zT*zT#zTzTzTzTzTzTyTyTyTyTyTyTyTyTyTyTyTyTyTyTyTyTyTyT{yTtyTmyTfyT_yTXyTQyTJyTCyTuT7uT0uT)uT"uTuTuT uTuTtTtTtTtTtTtTtTtTtTtTtTtTtTtTtTtTtTtTtTztTstTltTetT^tTWtTPtTItTBtT;tT4tT-tT&tTtTtTtT tTtTsTsTsTsTsTsTsTsTsTsTsTsTsTsTsTsTsTsT~sTwsTpsTisTbsT[sTTsTMsTFsT?sT8sT1sT*sT#sTsTsTsTsTsTrTrTrTrTrTrTrTrTrTrTrTrTrTrTrTrTrTrT{rTtrTmrTfrT_rTXrTQrTJrTCrTnT7nT0nT)nT"nTnTnT nTnTmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTzmTsmTlmTemT^mTWmTPmTImTBmT;mT4mT-mT&mTmTmTmT mTmTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlT~lTwlTplTilTblT[lTTlTMlTFlT?lT8lT1lT*lT#lTlTlTlTlTlTkTkTkTkTkTkTkTkTkTkTkTkTkTkTkTkTkTkT{kTtkTmkTfkT_kTXkTQkTJkTCkTgT7gT0gT)gT"gTgTgT gTgTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTzfTsfTlfTefT^fTWfTPfTIfTBfT;fT4fT-fT&fTfTfTfT fTfTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeT~eTweTpeTieTbeT[eTTeTMeTFeT?eT8eT1eT*eT#eTeTeTeTeTeTdTdTdTdTdTdTdTdTdTdTdTdTdTdTdTdTdTdT{dTtdTmdTfdT_dTXdTQdTJdTCdT`T7`T0`T)`T"`T`T`T `T`T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_Tz_Ts_Tl_Te_T^_TW_TP_TI_TB_T;_T4_T-_T&_T_T_T_T _T_T^T^T^T^T^T^T^T^T^T^T^T^T^T^T^T^T^T^T~^Tw^Tp^Ti^Tb^T[^TT^TM^TF^T?^T8^T1^T*^T#^T^T^T^T^T^T]T]T]T]T]T]T]T]T]T]T]T]T]T]T]T]T]T]T{]Tt]Tm]Tf]T_]TX]TQ]TJ]TC]T<]T5]T.]T']T ]T]T]T ]T]T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\T\Tx\Tq\Tj\Tc\T\\TU\TN\TG\T@\T9\T2\T+\T$\T\T\T\T\T\T[T[T[T[T[T[T[T[T[T[T[T[T[T[T[T[T[T[T|[Tu[Tn[Tg[T`[TY[TR[TK[TD[T=[T6[T/[T([T![T[T[T [T[TZTZTZTZTZTZTZTZTZTZTZTZTZTZTZTZTZTZTZTyZTrZTkZTdZT]ZTVZTOZTHZTAZT:ZT3ZT,ZT%ZTZTZTZT ZTZTYTYTYTYTYTYTYTYTYTYTYTYTYTYTYTYTYTYT}YTvYToYThYTaYTZYTSYTLYTEYT>YT7YT0YT)YT"YTYTYT YTYTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTzXTsXTlXTeXT^XTWXTPXTIXTBXT;XT4XT-XT&XTXTXTXT XTXTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWT~WTwWTpWTiWTbWT[WTTWTMWTFWT?WT8WT1WT*WT#WTWTWTWTWTWTVTVTVTVTVTVTVTVTVTVTVTVTVTVTVTVTVTVT{VTtVTmVTfVT_VTXVTQVTJVTCVTRT7RT0RT)RT"RTRTRT RTRTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTzQTsQTlQTeQT^QTWQTPQTIQTBQT;QT4QT-QT&QTQTQTQT QTQTPTPTPTPTPTPTPTPTPTPTPTPTPTPTPTPTPTPT~PTwPTpPTiPTbPT[PTTPTMPTFPT?PT8PT1PT*PT#PTPTPTPTPTPTOTOTOTOTOTOTOTOTOTOTOTOTOTOTOTOTOTOT{OTtOTmOTfOT_OTXOTQOTJOTCOTKT7KT0KT)KT"KTKTKT KTKTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTzJTsJTlJTeJT^JTWJTPJTIJTBJT;JT4JT-JT&JTJTJTJT JTJTITITITITITITITITITITITITITITITITITIT~ITwITpITiITbIT[ITTITMITFIT?IT8IT1IT*IT#ITITITITITITHTHTHTHTHTHTHTHTHTHTHTHTHTHTHTHTHTHT{HTtHTmHTfHT_HTXHTQHTJHTCHTDT7DT0DT)DT"DTDTDT DTDTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTzCTsCTlCTeCT^CTWCTPCTICTBCT;CT4CT-CT&CTCTCTCT CTCTBTBTBTBTBTBTBTBTBTBTBTBTBTBTBTBTBTBT~BTwBTpBTiBTbBT[BTTBTMBTFBT?BT8BT1BT*BT#BTBTBTBTBTBTATATATATATATATATATATATATATATATATATAT{ATtATmATfAT_ATXATQATJATCATT>T>T>T>T>T>T>T>T>T>T>T>T>T>T>T>T>T>Ty>Tr>Tk>Td>T]>TV>TO>TH>TA>T:>T3>T,>T%>T>T>T>T >T>T=T=T=T=T=T=T=T=T=T=T=T=T=T=T=T=T=T=T}=Tv=To=Th=Ta=TZ=TS=TL=TE=T>=T7=T0=T)=T"=T=T=T =T=T6T76T06T)6T"6T6T6T 6T6T5T5T5T5T5T5T5T5T5T5T5T5T5T5T5T5T5T5T5Tz5Ts5Tl5Te5T^5TW5TP5TI5TB5T;5T45T-5T&5T5T5T5T 5T5T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T~4Tw4Tp4Ti4Tb4T[4TT4TM4TF4T?4T84T14T*4T#4T4T4T4T4T4T3T3T3T3T3T3T3T3T3T3T3T3T3T3T3T3T3T3T{3Tt3Tm3Tf3T_3TX3TQ3TJ3TC3T<3T53T.3T'3T 3T3T3T 3T3T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2Tx2Tq2Tj2Tc2T\2TU2TN2TG2T@2T92T22T+2T$2T2T2T2T2T2T1T1T1T1T1T1T1T1T1T1T1T1T1T1T1T1T1T1T|1Tu1Tn1Tg1T`1TY1TR1TK1TD1T=1T61T/1T(1T!1T1T1T 1T1T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0Ty0Tr0Tk0Td0T]0TV0TO0TH0TA0T:0T30T,0T%0T0T0T0T 0T0T/T/T/T/T/T/T/T/T/T/T/T/T/T/T/T/T/T/T}/Tv/To/Th/Ta/TZ/TS/TL/TE/T>/T7/T0/T)/T"/T/T/T /T/T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Tz.Ts.Tl.Te.T^.TW.TP.TI.TB.T;.T4.T-.T&.T.T.T.T .T.T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T-T~-Tw-Tp-Ti-Tb-T[-TT-TM-TF-T?-T8-T1-T*-T#-T-T-T-T-T-T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T{,Tt,Tm,Tf,T_,TX,TQ,TJ,TC,T<,T5,T.,T',T ,T,T,T ,T,T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+Tx+Tq+Tj+Tc+T\+TU+TN+TG+T@+T9+T2+T++T$+T+T+T+T+T+T*T*T*T*T*T*T*T*T*T*T*T*T*T*T*T*T*T*T|*Tu*Tn*Tg*T`*TY*TR*TK*TD*T=*T6*T/*T(*T!*T*T*T *T*T)T)T)T)T)T)T)T)T)T)T)T)T)T)T)T)T)T)T)Ty)Tr)Tk)Td)T])TV)TO)TH)TA)T:)T3)T,)T%)T)T)T)T )T)T(T(T(T(T(T(T(T(T(T(T(T(T(T(T(T(T(T(T}(Tv(To(Th(Ta(TZ(TS(TL(TE(T>(T7(T0(T)(T"(T(T(T (T(T'T'T'T'T'T'T'T'T'T'T'T'T'T'T'T'T'T'T'Tz'Ts'Tl'Te'T^'TW'TP'TI'TB'T;'T4'T-'T&'T'T'T'T 'T'T&T&T&T&T&T&T&T&T&T&T&T&T&T&T&T&T&T&T~&Tw&Tp&Ti&Tb&T[&TT&TM&TF&T?&T8&T1&T*&T#&T&T&T&T&T&T%T%T%T%T%T%T%T%T%T%T%T%T%T%T%T%T%T%T{%Tt%Tm%Tf%T_%TX%TQ%TJ%TC%T<%T5%T.%T'%T %T%T%T %T%T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$Tx$Tq$Tj$Tc$T\$TU$TN$TG$T@$T9$T2$T+$T$$T$T$T$T$T$T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T|#Tu#Tn#Tg#T`#TY#TR#TK#TD#T=#T6#T/#T(#T!#T#T#T #T#T"T"T"T"T"T"T"T"T"T"T"T"T"T"T"T"T"T"T"Ty"Tr"Tk"Td"T]"TV"TO"TH"TA"T:"T3"T,"T%"T"T"T"T "T"T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T}!Tv!To!Th!Ta!TZ!TS!TL!TE!T>!T7!T0!T)!T"!T!T!T !T!T T T T T T T T T T T T T T T T T T T Tz Ts Tl Te T^ TW TP TI TB T; T4 T- T& T T T T T TTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCT<T5T.T'T TTT TTTTTTTTTTTTTTTTTTTTTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTTTTTTTTTTTTTTTTTTT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TTTTTTTTTTTTTTTTTTTTTyTrTkTdT]TVTOTHTAT:T3T,T%TTTT TTTTTTTTTTTTTTTTTTTT}TvToThTaTZTSTLTET>T7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCT<T5T.T'T TTT TTTTTTTTTTTTTTTTTTTTTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTTTTTTTTTTTTTTTTTTT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TTTTTTTTTTTTTTTTTTTTTyTrTkTdT]TVTOTHTAT:T3T,T%TTTT TTTTTTTTTTTTTTTTTTTT}TvToThTaTZTSTLTET>T7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCT<T5T.T'T TTT TTTTTTTTTTTTTTTTTTTTTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTTTTTTTTTTTTTTTTTTT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TT T T T T T T T T T T T T T T T T T T Ty Tr Tk Td T] TV TO TH TA T: T3 T, T% T T T T T T T T T T T T T T T T T T T T T T T T} Tv To Th Ta TZ TS TL TE T> T7 T0 T) T" T T T T T T T T T T T T T T T T T T T T T T T Tz Ts Tl Te T^ TW TP TI TB T; T4 T- T& T T T T T T T T T T T T T T T T T T T T T T T T~ Tw Tp Ti Tb T[ TT TM TF T? T8 T1 T* T# T T T T T T T T T T T T T T T T T T T T T T T T{ Tt Tm Tf T_ TX TQ TJ TC T< T5 T. T' T T T T T TTTTTTTTTTTTTTTTTTTTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTTTTTTTTTTTTTTTTTTT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TTTTTTTTTTTTTTTTTTTTTyTrTkTdT]TVTOTHTAT:T3T,T%TTTT TTTTTTTTTTTTTTTTTTTT}TvToThTaTZTSTLTET>T7T0T)T"TTT TTTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCT<T5T.T'T TTT TTTTTTTTTTTTTTTTTTTTTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTTTTTTTTTTTTTTTTTTT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TTSSSSSSSSSSSSSSSSSSSySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSSSSSSSSSSSSSSSSSSS}SvSoShSaSZSSSLSES>S7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSܾSվSξSǾSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSٽSҽS˽SĽSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSݼSּSϼSȼSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSܷSշSηSǷSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSٶSҶS˶SĶSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSݵSֵSϵSȵSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSܰSհSΰSǰSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSٯSүS˯SįSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSݮS֮SϮSȮSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSܩSթSΩSǩSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSS٨SҨS˨SĨSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSݧS֧SϧSȧSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSܢSբS΢SǢSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSS١SҡSˡSġSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSݠS֠SϠSȠSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSܛS՛SΛSǛSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSٚSҚS˚SĚSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSݙS֙SϙSșSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSܔSՔSΔSǔSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSٓSғS˓SēSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSݒS֒SϒSȒSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSS܍SՍS΍SǍSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSٌSҌSˌSČSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSS݋S֋SϋSȋSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSS܆SՆSΆSdžSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSمS҅S˅SąSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSS݄SքSτSȄSSSSSSSSSSS{StSmSfS_SXSQSJSCSS7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SS~S~S~S~S~S~S~S~S~S~S~S~S~S~S~S~S~S~S~~Sw~Sp~Si~Sb~S[~ST~SM~SF~S?~S8~S1~S*~S#~S~S~S~S~S~S}S}S}S}S}S}S}S}S}S}S}S}S}S}S}S}S}S}S{}St}Sm}Sf}S_}SX}SQ}SJ}SC}S<}S5}S.}S'}S }S}S}S }S}S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|Sx|Sq|Sj|Sc|S\|SU|SN|SG|S@|S9|S2|S+|S$|S|S|S|S|S|S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S|{Su{Sn{Sg{S`{SY{SR{SK{SD{S={S6{S/{S({S!{S{S{S {S{SzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSyzSrzSkzSdzS]zSVzSOzSHzSAzS:zS3zS,zS%zSzSzSzS zSzSySySySySySySySySySySySySySySySySySyS}ySvySoyShySaySZySSySLySEyS>yS7yS0yS)yS"ySySyS ySySxSxSxSxSxSxSxSxSxSxSxSxSxSxSxSxSxSxSxSzxSsxSlxSexS^xSWxSPxSIxSBxS;xS4xS-xS&xSxSxSxS xSxSwSwSwSwSwSwSwSwSwSwSwSwSwSwSwSwSwSwS~wSwwSpwSiwSbwS[wSTwSMwSFwS?wS8wS1wS*wS#wSwSwSwSwSwSvSvSvSvSvSvSvSvSvSvSvSvSvSvSvSvSvSvS{vStvSmvSfvS_vSXvSQvSJvSCvSrS7rS0rS)rS"rSrSrS rSrSqSqSqSqSqSqSqSqSqSqSqSqSqSqSqSqSqSqSqSzqSsqSlqSeqS^qSWqSPqSIqSBqS;qS4qS-qS&qSqSqSqS qSqSpSpSpSpSpSpSpSpSpSpSpSpSpSpSpSpSpSpS~pSwpSppSipSbpS[pSTpSMpSFpS?pS8pS1pS*pS#pSpSpSpSpSpSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoS{oStoSmoSfoS_oSXoSQoSJoSCoSkS7kS0kS)kS"kSkSkS kSkSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSzjSsjSljSejS^jSWjSPjSIjSBjS;jS4jS-jS&jSjSjSjS jSjSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiS~iSwiSpiSiiSbiS[iSTiSMiSFiS?iS8iS1iS*iS#iSiSiSiSiSiShShShShShShShShShShShShShShShShShShS{hSthSmhSfhS_hSXhSQhSJhSChSdS7dS0dS)dS"dSdSdS dSdScScScScScScScScScScScScScScScScScScScSzcSscSlcSecS^cSWcSPcSIcSBcS;cS4cS-cS&cScScScS cScSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbS~bSwbSpbSibSbbS[bSTbSMbSFbS?bS8bS1bS*bS#bSbSbSbSbSbSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaS{aStaSmaSfaS_aSXaSQaSJaSCaS]S7]S0]S)]S"]S]S]S ]S]S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\Sz\Ss\Sl\Se\S^\SW\SP\SI\SB\S;\S4\S-\S&\S\S\S\S \S\S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S~[Sw[Sp[Si[Sb[S[[ST[SM[SF[S?[S8[S1[S*[S#[S[S[S[S[S[SZSZSZSZSZSZSZSZSZSZSZSZSZSZSZSZSZSZS{ZStZSmZSfZS_ZSXZSQZSJZSCZSVS7VS0VS)VS"VSVSVS VSVSUSUSUSUSUSUSUSUSUSUSUSUSUSUSUSUSUSUSUSzUSsUSlUSeUS^USWUSPUSIUSBUS;US4US-US&USUSUSUS USUSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTS~TSwTSpTSiTSbTS[TSTTSMTSFTS?TS8TS1TS*TS#TSTSTSTSTSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS{SStSSmSSfSS_SSXSSQSSJSSCSSOS7OS0OS)OS"OSOSOS OSOSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSzNSsNSlNSeNS^NSWNSPNSINSBNS;NS4NS-NS&NSNSNSNS NSNSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMS~MSwMSpMSiMSbMS[MSTMSMMSFMS?MS8MS1MS*MS#MSMSMSMSMSMSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLS{LStLSmLSfLS_LSXLSQLSJLSCLSHS7HS0HS)HS"HSHSHS HSHSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSzGSsGSlGSeGS^GSWGSPGSIGSBGS;GS4GS-GS&GSGSGSGS GSGSFSFSFSFSFSFSFSFSFSFSFSFSFSFSFSFSFSFS~FSwFSpFSiFSbFS[FSTFSMFSFFS?FS8FS1FS*FS#FSFSFSFSFSFSESESESESESESESESESESESESESESESESESES{EStESmESfES_ESXESQESJESCESAS7AS0AS)AS"ASASAS ASAS@S@S@S@S@S@S@S@S@S@S@S@S@S@S@S@S@S@S@Sz@Ss@Sl@Se@S^@SW@SP@SI@SB@S;@S4@S-@S&@S@S@S@S @S@S?S?S?S?S?S?S?S?S?S?S?S?S?S?S?S?S?S?S~?Sw?Sp?Si?Sb?S[?ST?SM?SF?S??S8?S1?S*?S#?S?S?S?S?S?S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S{>St>Sm>Sf>S_>SX>SQ>SJ>SC>S<>S5>S.>S'>S >S>S>S >S>S=S=S=S=S=S=S=S=S=S=S=S=S=S=S=S=S=S=S=Sx=Sq=Sj=Sc=S\=SU=SN=SG=S@=S9=S2=S+=S$=S=S=S=S=S=S:S7:S0:S):S":S:S:S :S:S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9Sz9Ss9Sl9Se9S^9SW9SP9SI9SB9S;9S49S-9S&9S9S9S9S 9S9S8S8S8S8S8S8S8S8S8S8S8S8S8S8S8S8S8S8S~8Sw8Sp8Si8Sb8S[8ST8SM8SF8S?8S88S18S*8S#8S8S8S8S8S8S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S{7St7Sm7Sf7S_7SX7SQ7SJ7SC7S<7S57S.7S'7S 7S7S7S 7S7S6S6S6S6S6S6S6S6S6S6S6S6S6S6S6S6S6S6S6Sx6Sq6Sj6Sc6S\6SU6SN6SG6S@6S96S26S+6S$6S6S6S6S6S6S5S5S5S5S5S5S5S5S5S5S5S5S5S5S5S5S5S5S|5Su5Sn5Sg5S`5SY5SR5SK5SD5S=5S65S/5S(5S!5S5S5S 5S5S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4Sy4Sr4Sk4Sd4S]4SV4SO4SH4SA4S:4S34S,4S%4S4S4S4S 4S4S3S3S3S3S3S3S3S3S3S3S3S3S3S3S3S3S3S3S}3Sv3So3Sh3Sa3SZ3SS3SL3SE3S>3S73S03S)3S"3S3S3S 3S3S2S2S2S2S2S2S2S2S2S2S2S2S2S2S2S2S2S2S2Sz2Ss2Sl2Se2S^2SW2SP2SI2SB2S;2S42S-2S&2S2S2S2S 2S2S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S~1Sw1Sp1Si1Sb1S[1ST1SM1SF1S?1S81S11S*1S#1S1S1S1S1S1S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S{0St0Sm0Sf0S_0SX0SQ0SJ0SC0S<0S50S.0S'0S 0S0S0S 0S0S/S/S/S/S/S/S/S/S/S/S/S/S/S/S/S/S/S/S/Sx/Sq/Sj/Sc/S\/SU/SN/SG/S@/S9/S2/S+/S$/S/S/S/S/S/S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S|.Su.Sn.Sg.S`.SY.SR.SK.SD.S=.S6.S/.S(.S!.S.S.S .S.S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-Sy-Sr-Sk-Sd-S]-SV-SO-SH-SA-S:-S3-S,-S%-S-S-S-S -S-S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S},Sv,So,Sh,Sa,SZ,SS,SL,SE,S>,S7,S0,S),S",S,S,S ,S,S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+Sz+Ss+Sl+Se+S^+SW+SP+SI+SB+S;+S4+S-+S&+S+S+S+S +S+S*S*S*S*S*S*S*S*S*S*S*S*S*S*S*S*S*S*S~*Sw*Sp*Si*Sb*S[*ST*SM*SF*S?*S8*S1*S**S#*S*S*S*S*S*S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S{)St)Sm)Sf)S_)SX)SQ)SJ)SC)S<)S5)S.)S')S )S)S)S )S)S(S(S(S(S(S(S(S(S(S(S(S(S(S(S(S(S(S(S(Sx(Sq(Sj(Sc(S\(SU(SN(SG(S@(S9(S2(S+(S$(S(S(S(S(S(S'S'S'S'S'S'S'S'S'S'S'S'S'S'S'S'S'S'S|'Su'Sn'Sg'S`'SY'SR'SK'SD'S='S6'S/'S('S!'S'S'S 'S'S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&Sy&Sr&Sk&Sd&S]&SV&SO&SH&SA&S:&S3&S,&S%&S&S&S&S &S&S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S%S}%Sv%So%Sh%Sa%SZ%SS%SL%SE%S>%S7%S0%S)%S"%S%S%S %S%S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$Sz$Ss$Sl$Se$S^$SW$SP$SI$SB$S;$S4$S-$S&$S$S$S$S $S$S#S#S#S#S#S#S#S#S#S#S#S#S#S#S#S#S#S#S~#Sw#Sp#Si#Sb#S[#ST#SM#SF#S?#S8#S1#S*#S##S#S#S#S#S#S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S{"St"Sm"Sf"S_"SX"SQ"SJ"SC"S<"S5"S."S'"S "S"S"S "S"S!S!S!S!S!S!S!S!S!S!S!S!S!S!S!S!S!S!S!Sx!Sq!Sj!Sc!S\!SU!SN!SG!S@!S9!S2!S+!S$!S!S!S!S!S!S S S S S S S S S S S S S S S S S S S| Su Sn Sg S` SY SR SK SD S= S6 S/ S( S! S S S S SSSSSSSSSSSSSSSSSSSSySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSSSSSSSSSSSSSSSSSSS}SvSoShSaSZSSSLSES>S7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCS<S5S.S'S SSS SSSSSSSSSSSSSSSSSSSSSxSqSjScS\SUSNSGS@S9S2S+S$SSSSSSSSSSSSSSSSSSSSSSSS|SuSnSgS`SYSRSKSDS=S6S/S(S!SSS SSSSSSSSSSSSSSSSSSSSSySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSSSSSSSSSSSSSSSSSSS}SvSoShSaSZSSSLSES>S7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCS<S5S.S'S SSS SSSSSSSSSSSSSSSSSSSSSxSqSjScS\SUSNSGS@S9S2S+S$SSSSSSSSSSSSSSSSSSSSSSSS|SuSnSgS`SYSRSKSDS=S6S/S(S!SSS SSSSSSSSSSSSSSSSSSSSSySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSSSSSSSSSSSSSSSSSSS}SvSoShSaSZSSSLSES>S7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSS S S S S S S S S S S S S S S S S S S{ St Sm Sf S_ SX SQ SJ SC S< S5 S. S' S S S S S S S S S S S S S S S S S S S S S S S S Sx Sq Sj Sc S\ SU SN SG S@ S9 S2 S+ S$ S S S S S S S S S S S S S S S S S S S S S S S S| Su Sn Sg S` SY SR SK SD S= S6 S/ S( S! S S S S S S S S S S S S S S S S S S S S S S S Sy Sr Sk Sd S] SV SO SH SA S: S3 S, S% S S S S S S S S S S S S S S S S S S S S S S S S} Sv So Sh Sa SZ SS SL SE S> S7 S0 S) S" S S S S SSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCS<S5S.S'S SSS SSSSSSSSSSSSSSSSSSSSSxSqSjScS\SUSNSGS@S9S2S+S$SSSSSSSSSSSSSSSSSSSSSSSS|SuSnSgS`SYSRSKSDS=S6S/S(S!SSS SSSSSSSSSSSSSSSSSSSSSySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSSSSSSSSSSSSSSSSSSS}SvSoShSaSZSSSLSES>S7S0S)S"SSS SSSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRܻRջRλRǻRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRٺRҺR˺RĺRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRݹRֹRϹRȹRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRܴRմRδRǴRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRٳRҳR˳RijRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRݲRֲRϲRȲRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRܭRխRέRǭRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRR٬RҬRˬRĬRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRݫR֫RϫRȫRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRܦRզRΦRǦRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRR٥RҥR˥RĥRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRݤR֤RϤRȤRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRܟR՟RΟRǟRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRٞRҞR˞RĞRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRݝR֝RϝRȝRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRܘR՘RΘRǘRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRٗRҗR˗RėRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRݖR֖RϖRȖRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRRܑRՑRΑRǑRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRِRҐRːRĐRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRݏR֏RϏRȏRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRR܊RՊRΊRNJRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRىR҉RˉRĉRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRR݈RֈRψRȈRRRRRRRRRRR{RtRmRfR_RXRQRJRCRR7R0R)R"RRR RRRRRRR܃RՃR΃RǃRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRقR҂R˂RĂRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRR݁RցRρRȁRRRRRRRRRRR{RtRmRfR_RXRQRJRCR}R7}R0}R)}R"}R}R}R }R}R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|R|Rz|Rs|Rl|Re|R^|RW|RP|RI|RB|R;|R4|R-|R&|R|R|R|R |R|R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R~{Rw{Rp{Ri{Rb{R[{RT{RM{RF{R?{R8{R1{R*{R#{R{R{R{R{R{RzRzRzRzRzRzRzRzRzRzRzRzRzRzRzRzRzRzR{zRtzRmzRfzR_zRXzRQzRJzRCzRvR7vR0vR)vR"vRvRvR vRvRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRuRzuRsuRluReuR^uRWuRPuRIuRBuR;uR4uR-uR&uRuRuRuR uRuRtRtRtRtRtRtRtRtRtRtRtRtRtRtRtRtRtRtR~tRwtRptRitRbtR[tRTtRMtRFtR?tR8tR1tR*tR#tRtRtRtRtRtRsRsRsRsRsRsRsRsRsRsRsRsRsRsRsRsRsRsR{sRtsRmsRfsR_sRXsRQsRJsRCsRoR7oR0oR)oR"oRoRoR oRoRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRznRsnRlnRenR^nRWnRPnRInRBnR;nR4nR-nR&nRnRnRnR nRnRmRmRmRmRmRmRmRmRmRmRmRmRmRmRmRmRmRmR~mRwmRpmRimRbmR[mRTmRMmRFmR?mR8mR1mR*mR#mRmRmRmRmRmRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlR{lRtlRmlRflR_lRXlRQlRJlRClRhR7hR0hR)hR"hRhRhR hRhRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRgRzgRsgRlgRegR^gRWgRPgRIgRBgR;gR4gR-gR&gRgRgRgR gRgRfRfRfRfRfRfRfRfRfRfRfRfRfRfRfRfRfRfR~fRwfRpfRifRbfR[fRTfRMfRFfR?fR8fR1fR*fR#fRfRfRfRfRfReReReReReReReReReReReReReReReReReReR{eRteRmeRfeR_eRXeRQeRJeRCeRaR7aR0aR)aR"aRaRaR aRaR`R`R`R`R`R`R`R`R`R`R`R`R`R`R`R`R`R`R`Rz`Rs`Rl`Re`R^`RW`RP`RI`RB`R;`R4`R-`R&`R`R`R`R `R`R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R~_Rw_Rp_Ri_Rb_R[_RT_RM_RF_R?_R8_R1_R*_R#_R_R_R_R_R_R^R^R^R^R^R^R^R^R^R^R^R^R^R^R^R^R^R^R{^Rt^Rm^Rf^R_^RX^RQ^RJ^RC^R<^R5^R.^R'^R ^R^R^R ^R^R]R]R]R]R]R]R]R]R]R]R]R]R]R]R]R]R]R]R]Rx]Rq]Rj]Rc]R\]RU]RN]RG]R@]R9]R2]R+]R$]R]R]R]R]R]R\R\R\R\R\R\R\R\R\R\R\R\R\R\R\R\R\R\R|\Ru\Rn\Rg\R`\RY\RR\RK\RD\R=\R6\R/\R(\R!\R\R\R \R\R[R[R[R[R[R[R[R[R[R[R[R[R[R[R[R[R[R[R[Ry[Rr[Rk[Rd[R][RV[RO[RH[RA[R:[R3[R,[R%[R[R[R[R [R[RZRZRZRZRZRZRZRZRZRZRZRZRZRZRZRZRZRZR}ZRvZRoZRhZRaZRZZRSZRLZREZR>ZR7ZR0ZR)ZR"ZRZRZR ZRZRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRYRzYRsYRlYReYR^YRWYRPYRIYRBYR;YR4YR-YR&YRYRYRYR YRYRXRXRXRXRXRXRXRXRXRXRXRXRXRXRXRXRXRXR~XRwXRpXRiXRbXR[XRTXRMXRFXR?XR8XR1XR*XR#XRXRXRXRXRXRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWR{WRtWRmWRfWR_WRXWRQWRJWRCWRSR7SR0SR)SR"SRSRSR SRSRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRzRRsRRlRReRR^RRWRRPRRIRRBRR;RR4RR-RR&RRRRRRRR RRRRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQR~QRwQRpQRiQRbQR[QRTQRMQRFQR?QR8QR1QR*QR#QRQRQRQRQRQRPRPRPRPRPRPRPRPRPRPRPRPRPRPRPRPRPRPR{PRtPRmPRfPR_PRXPRQPRJPRCPRLR7LR0LR)LR"LRLRLR LRLRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRzKRsKRlKReKR^KRWKRPKRIKRBKR;KR4KR-KR&KRKRKRKR KRKRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJR~JRwJRpJRiJRbJR[JRTJRMJRFJR?JR8JR1JR*JR#JRJRJRJRJRJRIRIRIRIRIRIRIRIRIRIRIRIRIRIRIRIRIRIR{IRtIRmIRfIR_IRXIRQIRJIRCIRER7ER0ER)ER"ERERER ERERDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRzDRsDRlDReDR^DRWDRPDRIDRBDR;DR4DR-DR&DRDRDRDR DRDRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCRCR~CRwCRpCRiCRbCR[CRTCRMCRFCR?CR8CR1CR*CR#CRCRCRCRCRCRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBR{BRtBRmBRfBR_BRXBRQBRJBRCBRR>R>R>R>R>R>R>R>R>R>R>R>R>R>R>R>R>R}>Rv>Ro>Rh>Ra>RZ>RS>RL>RE>R>>R7>R0>R)>R">R>R>R >R>R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=Rz=Rs=Rl=Re=R^=RW=RP=RI=RB=R;=R4=R-=R&=R=R=R=R =R=R7R77R07R)7R"7R7R7R 7R7R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6Rz6Rs6Rl6Re6R^6RW6RP6RI6RB6R;6R46R-6R&6R6R6R6R 6R6R5R5R5R5R5R5R5R5R5R5R5R5R5R5R5R5R5R5R~5Rw5Rp5Ri5Rb5R[5RT5RM5RF5R?5R85R15R*5R#5R5R5R5R5R5R4R4R4R4R4R4R4R4R4R4R4R4R4R4R4R4R4R4R{4Rt4Rm4Rf4R_4RX4RQ4RJ4RC4R<4R54R.4R'4R 4R4R4R 4R4R3R3R3R3R3R3R3R3R3R3R3R3R3R3R3R3R3R3R3Rx3Rq3Rj3Rc3R\3RU3RN3RG3R@3R93R23R+3R$3R3R3R3R3R3R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R|2Ru2Rn2Rg2R`2RY2RR2RK2RD2R=2R62R/2R(2R!2R2R2R 2R2R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1Ry1Rr1Rk1Rd1R]1RV1RO1RH1RA1R:1R31R,1R%1R1R1R1R 1R1R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R}0Rv0Ro0Rh0Ra0RZ0RS0RL0RE0R>0R70R00R)0R"0R0R0R 0R0R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/Rz/Rs/Rl/Re/R^/RW/RP/RI/RB/R;/R4/R-/R&/R/R/R/R /R/R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R~.Rw.Rp.Ri.Rb.R[.RT.RM.RF.R?.R8.R1.R*.R#.R.R.R.R.R.R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R{-Rt-Rm-Rf-R_-RX-RQ-RJ-RC-R<-R5-R.-R'-R -R-R-R -R-R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,Rx,Rq,Rj,Rc,R\,RU,RN,RG,R@,R9,R2,R+,R$,R,R,R,R,R,R+R+R+R+R+R+R+R+R+R+R+R+R+R+R+R+R+R+R|+Ru+Rn+Rg+R`+RY+RR+RK+RD+R=+R6+R/+R(+R!+R+R+R +R+R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*Ry*Rr*Rk*Rd*R]*RV*RO*RH*RA*R:*R3*R,*R%*R*R*R*R *R*R)R)R)R)R)R)R)R)R)R)R)R)R)R)R)R)R)R)R})Rv)Ro)Rh)Ra)RZ)RS)RL)RE)R>)R7)R0)R))R")R)R)R )R)R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(Rz(Rs(Rl(Re(R^(RW(RP(RI(RB(R;(R4(R-(R&(R(R(R(R (R(R'R'R'R'R'R'R'R'R'R'R'R'R'R'R'R'R'R'R~'Rw'Rp'Ri'Rb'R['RT'RM'RF'R?'R8'R1'R*'R#'R'R'R'R'R'R&R&R&R&R&R&R&R&R&R&R&R&R&R&R&R&R&R&R{&Rt&Rm&Rf&R_&RX&RQ&RJ&RC&R<&R5&R.&R'&R &R&R&R &R&R%R%R%R%R%R%R%R%R%R%R%R%R%R%R%R%R%R%R%Rx%Rq%Rj%Rc%R\%RU%RN%RG%R@%R9%R2%R+%R$%R%R%R%R%R%R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R|$Ru$Rn$Rg$R`$RY$RR$RK$RD$R=$R6$R/$R($R!$R$R$R $R$R#R#R#R#R#R#R#R#R#R#R#R#R#R#R#R#R#R#R#Ry#Rr#Rk#Rd#R]#RV#RO#RH#RA#R:#R3#R,#R%#R#R#R#R #R#R"R"R"R"R"R"R"R"R"R"R"R"R"R"R"R"R"R"R}"Rv"Ro"Rh"Ra"RZ"RS"RL"RE"R>"R7"R0"R)"R""R"R"R "R"R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!Rz!Rs!Rl!Re!R^!RW!RP!RI!RB!R;!R4!R-!R&!R!R!R!R !R!R R R R R R R R R R R R R R R R R R R~ Rw Rp Ri Rb R[ RT RM RF R? R8 R1 R* R# R R R R R RRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCR<R5R.R'R RRR RRRRRRRRRRRRRRRRRRRRRxRqRjRcR\RURNRGR@R9R2R+R$RRRRRRRRRRRRRRRRRRRRRRRR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRRRRRRRRRRRRRRRRRRRRyRrRkRdR]RVRORHRAR:R3R,R%RRRR RRRRRRRRRRRRRRRRRRRR}RvRoRhRaRZRSRLRER>R7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCR<R5R.R'R RRR RRRRRRRRRRRRRRRRRRRRRxRqRjRcR\RURNRGR@R9R2R+R$RRRRRRRRRRRRRRRRRRRRRRRR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRRRRRRRRRRRRRRRRRRRRyRrRkRdR]RVRORHRAR:R3R,R%RRRR RRRRRRRRRRRRRRRRRRRR}RvRoRhRaRZRSRLRER>R7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCR<R5R.R'R RRR RRRRRRRRRRRRRRRRRRRRRxRqRjRcR\RURNRGR@R9R2R+R$RRRRRRRRRRRRRRRRRRRRRRRR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRRRRRRRRRRRRRRRRRRRRyRrRkRdR]RVRORHRAR:R3R,R%RRRR RR R R R R R R R R R R R R R R R R R R} Rv Ro Rh Ra RZ RS RL RE R> R7 R0 R) R" R R R R R R R R R R R R R R R R R R R R R R R Rz Rs Rl Re R^ RW RP RI RB R; R4 R- R& R R R R R R R R R R R R R R R R R R R R R R R R~ Rw Rp Ri Rb R[ RT RM RF R? R8 R1 R* R# R R R R R R R R R R R R R R R R R R R R R R R R{ Rt Rm Rf R_ RX RQ RJ RC R< R5 R. R' R R R R R R R R R R R R R R R R R R R R R R R R Rx Rq Rj Rc R\ RU RN RG R@ R9 R2 R+ R$ R R R R R RRRRRRRRRRRRRRRRRRR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRRRRRRRRRRRRRRRRRRRRyRrRkRdR]RVRORHRAR:R3R,R%RRRR RRRRRRRRRRRRRRRRRRRR}RvRoRhRaRZRSRLRER>R7R0R)R"RRR RRRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCR<R5R.R'R RRR RRRRRRRRRRRRRRRRRRRRRxRqRjRcR\RURNRGR@R9R2R+R$RRRRRRRRRRRRRRRRRRRRRRRR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRRRRRRRRRRRRRRRRRRRRyRrRkRdR]RVRORHRAR:R3R,R%RRRR RRQQQQQQQQQQQQQQQQQQ}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQܿQտQοQǿQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQپQҾQ˾QľQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQݽQֽQϽQȽQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQܸQոQθQǸQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQٷQҷQ˷QķQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQݶQֶQ϶QȶQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQܱQձQαQDZQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQٰQҰQ˰QİQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQݯQ֯QϯQȯQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQܪQժQΪQǪQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQ٩QҩQ˩QĩQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQݨQ֨QϨQȨQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQܣQգQΣQǣQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQ٢QҢQˢQĢQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQݡQ֡QϡQȡQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQܜQ՜QΜQǜQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQٛQқQ˛QěQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQݚQ֚QϚQȚQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQܕQՕQΕQǕQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQٔQҔQ˔QĔQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQݓQ֓QϓQȓQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQ܎QՎQΎQǎQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQٍQҍQˍQčQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQ݌Q֌QόQȌQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQ܇QՇQ·QLJQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQنQ҆QˆQĆQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQ݅QօQυQȅQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQQ7Q0Q)Q"QQQ QQQQQQQ܀QՀQ΀QǀQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQ~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q~Q{~Qt~Qm~Qf~Q_~QX~QQ~QJ~QC~Q<~Q5~Q.~Q'~Q ~Q~Q~Q ~Q~Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}Qx}Qq}Qj}Qc}Q\}QU}QN}QG}Q@}Q9}Q2}Q+}Q$}Q}Q}Q}Q}Q}Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q|Q||Qu|Qn|Qg|Q`|QY|QR|QK|QD|Q=|Q6|Q/|Q(|Q!|Q|Q|Q |Q|Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Qy{Qr{Qk{Qd{Q]{QV{QO{QH{QA{Q:{Q3{Q,{Q%{Q{Q{Q{Q {Q{QzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQzQ}zQvzQozQhzQazQZzQSzQLzQEzQ>zQ7zQ0zQ)zQ"zQzQzQ zQzQyQyQyQyQyQyQyQyQyQyQyQyQyQyQyQyQyQyQyQzyQsyQlyQeyQ^yQWyQPyQIyQByQ;yQ4yQ-yQ&yQyQyQyQ yQyQxQxQxQxQxQxQxQxQxQxQxQxQxQxQxQxQxQxQ~xQwxQpxQixQbxQ[xQTxQMxQFxQ?xQ8xQ1xQ*xQ#xQxQxQxQxQxQwQwQwQwQwQwQwQwQwQwQwQwQwQwQwQwQwQwQ{wQtwQmwQfwQ_wQXwQQwQJwQCwQsQ7sQ0sQ)sQ"sQsQsQ sQsQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQzrQsrQlrQerQ^rQWrQPrQIrQBrQ;rQ4rQ-rQ&rQrQrQrQ rQrQqQqQqQqQqQqQqQqQqQqQqQqQqQqQqQqQqQqQ~qQwqQpqQiqQbqQ[qQTqQMqQFqQ?qQ8qQ1qQ*qQ#qQqQqQqQqQqQpQpQpQpQpQpQpQpQpQpQpQpQpQpQpQpQpQpQ{pQtpQmpQfpQ_pQXpQQpQJpQCpQlQ7lQ0lQ)lQ"lQlQlQ lQlQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQzkQskQlkQekQ^kQWkQPkQIkQBkQ;kQ4kQ-kQ&kQkQkQkQ kQkQjQjQjQjQjQjQjQjQjQjQjQjQjQjQjQjQjQjQ~jQwjQpjQijQbjQ[jQTjQMjQFjQ?jQ8jQ1jQ*jQ#jQjQjQjQjQjQiQiQiQiQiQiQiQiQiQiQiQiQiQiQiQiQiQiQ{iQtiQmiQfiQ_iQXiQQiQJiQCiQeQ7eQ0eQ)eQ"eQeQeQ eQeQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQzdQsdQldQedQ^dQWdQPdQIdQBdQ;dQ4dQ-dQ&dQdQdQdQ dQdQcQcQcQcQcQcQcQcQcQcQcQcQcQcQcQcQcQcQ~cQwcQpcQicQbcQ[cQTcQMcQFcQ?cQ8cQ1cQ*cQ#cQcQcQcQcQcQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQ{bQtbQmbQfbQ_bQXbQQbQJbQCbQ^Q7^Q0^Q)^Q"^Q^Q^Q ^Q^Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Q]Qz]Qs]Ql]Qe]Q^]QW]QP]QI]QB]Q;]Q4]Q-]Q&]Q]Q]Q]Q ]Q]Q\Q\Q\Q\Q\Q\Q\Q\Q\Q\Q\Q\Q\Q\Q\Q\Q\Q\Q~\Qw\Qp\Qi\Qb\Q[\QT\QM\QF\Q?\Q8\Q1\Q*\Q#\Q\Q\Q\Q\Q\Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q[Q{[Qt[Qm[Qf[Q_[QX[QQ[QJ[QC[Q<[Q5[Q.[Q'[Q [Q[Q[Q [Q[QZQZQZQZQZQZQZQZQZQZQZQZQZQZQZQZQZQZQZQxZQqZQjZQcZQ\ZQUZQNZQGZQ@ZQ9ZQ2ZQ+ZQ$ZQZQZQZQZQZQYQYQYQYQYQYQYQYQYQYQYQYQYQYQYQYQYQYQ|YQuYQnYQgYQ`YQYYQRYQKYQDYQ=YQ6YQ/YQ(YQ!YQYQYQ YQYQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQyXQrXQkXQdXQ]XQVXQOXQHXQAXQ:XQ3XQ,XQ%XQXQXQXQ XQXQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQ}WQvWQoWQhWQaWQZWQSWQLWQEWQ>WQ7WQ0WQ)WQ"WQWQWQ WQWQVQVQVQVQVQVQVQVQVQVQVQVQVQVQVQVQVQVQVQzVQsVQlVQeVQ^VQWVQPVQIVQBVQ;VQ4VQ-VQ&VQVQVQVQ VQVQUQUQUQUQUQUQUQUQUQUQUQUQUQUQUQUQUQUQ~UQwUQpUQiUQbUQ[UQTUQMUQFUQ?UQ8UQ1UQ*UQ#UQUQUQUQUQUQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQ{TQtTQmTQfTQ_TQXTQQTQJTQCTQPQ7PQ0PQ)PQ"PQPQPQ PQPQOQOQOQOQOQOQOQOQOQOQOQOQOQOQOQOQOQOQOQzOQsOQlOQeOQ^OQWOQPOQIOQBOQ;OQ4OQ-OQ&OQOQOQOQ OQOQNQNQNQNQNQNQNQNQNQNQNQNQNQNQNQNQNQNQ~NQwNQpNQiNQbNQ[NQTNQMNQFNQ?NQ8NQ1NQ*NQ#NQNQNQNQNQNQMQMQMQMQMQMQMQMQMQMQMQMQMQMQMQMQMQMQ{MQtMQmMQfMQ_MQXMQQMQJMQCMQIQ7IQ0IQ)IQ"IQIQIQ IQIQHQHQHQHQHQHQHQHQHQHQHQHQHQHQHQHQHQHQHQzHQsHQlHQeHQ^HQWHQPHQIHQBHQ;HQ4HQ-HQ&HQHQHQHQ HQHQGQGQGQGQGQGQGQGQGQGQGQGQGQGQGQGQGQGQ~GQwGQpGQiGQbGQ[GQTGQMGQFGQ?GQ8GQ1GQ*GQ#GQGQGQGQGQGQFQFQFQFQFQFQFQFQFQFQFQFQFQFQFQFQFQFQ{FQtFQmFQfFQ_FQXFQQFQJFQCFQBQ7BQ0BQ)BQ"BQBQBQ BQBQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQzAQsAQlAQeAQ^AQWAQPAQIAQBAQ;AQ4AQ-AQ&AQAQAQAQ AQAQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q~@Qw@Qp@Qi@Qb@Q[@QT@QM@QF@Q?@Q8@Q1@Q*@Q#@Q@Q@Q@Q@Q@Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q{?Qt?Qm?Qf?Q_?QX?QQ?QJ?QC?QQ>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Qx>Qq>Qj>Qc>Q\>QU>QN>QG>Q@>Q9>Q2>Q+>Q$>Q>Q>Q>Q>Q>Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q|=Qu=Qn=Qg=Q`=QY=QR=QK=QD=Q==Q6=Q/=Q(=Q!=Q=Q=Q =Q=Q;Q7;Q0;Q);Q";Q;Q;Q ;Q;Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Qz:Qs:Ql:Qe:Q^:QW:QP:QI:QB:Q;:Q4:Q-:Q&:Q:Q:Q:Q :Q:Q9Q9Q9Q9Q9Q9Q9Q9Q9Q9Q9Q9Q9Q9Q9Q9Q9Q9Q~9Qw9Qp9Qi9Qb9Q[9QT9QM9QF9Q?9Q89Q19Q*9Q#9Q9Q9Q9Q9Q9Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q{8Qt8Qm8Qf8Q_8QX8QQ8QJ8QC8Q<8Q58Q.8Q'8Q 8Q8Q8Q 8Q8Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Qx7Qq7Qj7Qc7Q\7QU7QN7QG7Q@7Q97Q27Q+7Q$7Q7Q7Q7Q7Q7Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q|6Qu6Qn6Qg6Q`6QY6QR6QK6QD6Q=6Q66Q/6Q(6Q!6Q6Q6Q 6Q6Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Q5Qy5Qr5Qk5Qd5Q]5QV5QO5QH5QA5Q:5Q35Q,5Q%5Q5Q5Q5Q 5Q5Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q}4Qv4Qo4Qh4Qa4QZ4QS4QL4QE4Q>4Q74Q04Q)4Q"4Q4Q4Q 4Q4Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Q3Qz3Qs3Ql3Qe3Q^3QW3QP3QI3QB3Q;3Q43Q-3Q&3Q3Q3Q3Q 3Q3Q2Q2Q2Q2Q2Q2Q2Q2Q2Q2Q2Q2Q2Q2Q2Q2Q2Q2Q~2Qw2Qp2Qi2Qb2Q[2QT2QM2QF2Q?2Q82Q12Q*2Q#2Q2Q2Q2Q2Q2Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q{1Qt1Qm1Qf1Q_1QX1QQ1QJ1QC1Q<1Q51Q.1Q'1Q 1Q1Q1Q 1Q1Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Qx0Qq0Qj0Qc0Q\0QU0QN0QG0Q@0Q90Q20Q+0Q$0Q0Q0Q0Q0Q0Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q|/Qu/Qn/Qg/Q`/QY/QR/QK/QD/Q=/Q6/Q//Q(/Q!/Q/Q/Q /Q/Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Qy.Qr.Qk.Qd.Q].QV.QO.QH.QA.Q:.Q3.Q,.Q%.Q.Q.Q.Q .Q.Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q}-Qv-Qo-Qh-Qa-QZ-QS-QL-QE-Q>-Q7-Q0-Q)-Q"-Q-Q-Q -Q-Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,Qz,Qs,Ql,Qe,Q^,QW,QP,QI,QB,Q;,Q4,Q-,Q&,Q,Q,Q,Q ,Q,Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q+Q~+Qw+Qp+Qi+Qb+Q[+QT+QM+QF+Q?+Q8+Q1+Q*+Q#+Q+Q+Q+Q+Q+Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q{*Qt*Qm*Qf*Q_*QX*QQ*QJ*QC*Q<*Q5*Q.*Q'*Q *Q*Q*Q *Q*Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Qx)Qq)Qj)Qc)Q\)QU)QN)QG)Q@)Q9)Q2)Q+)Q$)Q)Q)Q)Q)Q)Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q|(Qu(Qn(Qg(Q`(QY(QR(QK(QD(Q=(Q6(Q/(Q((Q!(Q(Q(Q (Q(Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Q'Qy'Qr'Qk'Qd'Q]'QV'QO'QH'QA'Q:'Q3'Q,'Q%'Q'Q'Q'Q 'Q'Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q}&Qv&Qo&Qh&Qa&QZ&QS&QL&QE&Q>&Q7&Q0&Q)&Q"&Q&Q&Q &Q&Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Qz%Qs%Ql%Qe%Q^%QW%QP%QI%QB%Q;%Q4%Q-%Q&%Q%Q%Q%Q %Q%Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q$Q~$Qw$Qp$Qi$Qb$Q[$QT$QM$QF$Q?$Q8$Q1$Q*$Q#$Q$Q$Q$Q$Q$Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q{#Qt#Qm#Qf#Q_#QX#QQ#QJ#QC#Q<#Q5#Q.#Q'#Q #Q#Q#Q #Q#Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Q"Qx"Qq"Qj"Qc"Q\"QU"QN"QG"Q@"Q9"Q2"Q+"Q$"Q"Q"Q"Q"Q"Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q|!Qu!Qn!Qg!Q`!QY!QR!QK!QD!Q=!Q6!Q/!Q(!Q!!Q!Q!Q !Q!Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Qy Qr Qk Qd Q] QV QO QH QA Q: Q3 Q, Q% Q Q Q Q Q QQQQQQQQQQQQQQQQQQQ}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQQQQQQQQQQQQQQQQQQQQxQqQjQcQ\QUQNQGQ@Q9Q2Q+Q$QQQQQQQQQQQQQQQQQQQQQQQQ|QuQnQgQ`QYQRQKQDQ=Q6Q/Q(Q!QQQ QQQQQQQQQQQQQQQQQQQQQyQrQkQdQ]QVQOQHQAQ:Q3Q,Q%QQQQ QQQQQQQQQQQQQQQQQQQQ}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQQQQQQQQQQQQQQQQQQQQxQqQjQcQ\QUQNQGQ@Q9Q2Q+Q$QQQQQQQQQQQQQQQQQQQQQQQQ|QuQnQgQ`QYQRQKQDQ=Q6Q/Q(Q!QQQ QQQQQQQQQQQQQQQQQQQQQyQrQkQdQ]QVQOQHQAQ:Q3Q,Q%QQQQ QQQQQQQQQQQQQQQQQQQQ}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Qx Qq Qj Qc Q\ QU QN QG Q@ Q9 Q2 Q+ Q$ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q| Qu Qn Qg Q` QY QR QK QD Q= Q6 Q/ Q( Q! Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Qy Qr Qk Qd Q] QV QO QH QA Q: Q3 Q, Q% Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q} Qv Qo Qh Qa QZ QS QL QE Q> Q7 Q0 Q) Q" Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Qz Qs Ql Qe Q^ QW QP QI QB Q; Q4 Q- Q& Q Q Q Q Q QQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQQQQQQQQQQQQQQQQQQQQxQqQjQcQ\QUQNQGQ@Q9Q2Q+Q$QQQQQQQQQQQQQQQQQQQQQQQQ|QuQnQgQ`QYQRQKQDQ=Q6Q/Q(Q!QQQ QQQQQQQQQQQQQQQQQQQQQyQrQkQdQ]QVQOQHQAQ:Q3Q,Q%QQQQ QQQQQQQQQQQQQQQQQQQQ}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQPPPPPPPPPPPPPPPPPPPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPPPPPPPPPPPPPPPPPPP|PuPnPgP`PYPRPKPDP=P6P/P(P!PPP PPPPPPPPPPPPPPPPPPPPPyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPPPPPPPPPPPPPPPPPPP}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPܼPռPμPǼPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPٻPһP˻PĻPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPݺPֺPϺPȺPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPܵPյPεPǵPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPٴPҴP˴PĴPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPݳPֳPϳPȳPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPܮPծPήPǮPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPP٭PҭP˭PĭPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPݬP֬PϬPȬPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPܧPէPΧPǧPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPP٦PҦP˦PĦPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPݥP֥PϥPȥPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPܠPՠPΠPǠPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPٟPҟP˟PğPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPݞP֞PϞPȞPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPܙPՙPΙPǙPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPP٘PҘP˘PĘPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPݗP֗PϗPȗPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPPܒPՒPΒPǒPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPّPґPˑPđPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPݐP֐PϐPȐPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPP܋PՋP΋PNjPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPيPҊPˊPĊPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPP݉P։PωPȉPPPPPPPPPPP{PtPmPfP_PXPQPJPCPP7P0P)P"PPP PPPPPPP܄PՄP΄PDŽPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPكP҃P˃PăPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPP݂PւPςPȂPPPPPPPPPPP{PtPmPfP_PXPQPJPCP~P7~P0~P)~P"~P~P~P ~P~P}P}P}P}P}P}P}P}P}P}P}P}P}P}P}P}P}P}P}Pz}Ps}Pl}Pe}P^}PW}PP}PI}PB}P;}P4}P-}P&}P}P}P}P }P}P|P|P|P|P|P|P|P|P|P|P|P|P|P|P|P|P|P|P~|Pw|Pp|Pi|Pb|P[|PT|PM|PF|P?|P8|P1|P*|P#|P|P|P|P|P|P{P{P{P{P{P{P{P{P{P{P{P{P{P{P{P{P{P{P{{Pt{Pm{Pf{P_{PX{PQ{PJ{PC{P<{P5{P.{P'{P {P{P{P {P{PzPzPzPzPzPzPzPzPzPzPzPzPzPzPzPzPzPzPzPxzPqzPjzPczP\zPUzPNzPGzP@zP9zP2zP+zP$zPzPzPzPzPzPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyP|yPuyPnyPgyP`yPYyPRyPKyPDyP=yP6yP/yP(yP!yPyPyP yPyPxPxPxPxPxPxPxPxPxPxPxPxPxPxPxPxPxPxPxPyxPrxPkxPdxP]xPVxPOxPHxPAxP:xP3xP,xP%xPxPxPxP xPxPwPwPwPwPwPwPwPwPwPwPwPwPwPwPwPwPwPwP}wPvwPowPhwPawPZwPSwPLwPEwP>wP7wP0wP)wP"wPwPwP wPwPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPzvPsvPlvPevP^vPWvPPvPIvPBvP;vP4vP-vP&vPvPvPvP vPvPuPuPuPuPuPuPuPuPuPuPuPuPuPuPuPuPuPuP~uPwuPpuPiuPbuP[uPTuPMuPFuP?uP8uP1uP*uP#uPuPuPuPuPuPtPtPtPtPtPtPtPtPtPtPtPtPtPtPtPtPtPtP{tPttPmtPftP_tPXtPQtPJtPCtPpP7pP0pP)pP"pPpPpP pPpPoPoPoPoPoPoPoPoPoPoPoPoPoPoPoPoPoPoPoPzoPsoPloPeoP^oPWoPPoPIoPBoP;oP4oP-oP&oPoPoPoP oPoPnPnPnPnPnPnPnPnPnPnPnPnPnPnPnPnPnPnP~nPwnPpnPinPbnP[nPTnPMnPFnP?nP8nP1nP*nP#nPnPnPnPnPnPmPmPmPmPmPmPmPmPmPmPmPmPmPmPmPmPmPmP{mPtmPmmPfmP_mPXmPQmPJmPCmPiP7iP0iP)iP"iPiPiP iPiPhPhPhPhPhPhPhPhPhPhPhPhPhPhPhPhPhPhPhPzhPshPlhPehP^hPWhPPhPIhPBhP;hP4hP-hP&hPhPhPhP hPhPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgP~gPwgPpgPigPbgP[gPTgPMgPFgP?gP8gP1gP*gP#gPgPgPgPgPgPfPfPfPfPfPfPfPfPfPfPfPfPfPfPfPfPfPfP{fPtfPmfPffP_fPXfPQfPJfPCfPbP7bP0bP)bP"bPbPbP bPbPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPzaPsaPlaPeaP^aPWaPPaPIaPBaP;aP4aP-aP&aPaPaPaP aPaP`P`P`P`P`P`P`P`P`P`P`P`P`P`P`P`P`P`P~`Pw`Pp`Pi`Pb`P[`PT`PM`PF`P?`P8`P1`P*`P#`P`P`P`P`P`P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P{_Pt_Pm_Pf_P__PX_PQ_PJ_PC_P<_P5_P._P'_P _P_P_P _P_P^P^P^P^P^P^P^P^P^P^P^P^P^P^P^P^P^P^P^Px^Pq^Pj^Pc^P\^PU^PN^PG^P@^P9^P2^P+^P$^P^P^P^P^P^P]P]P]P]P]P]P]P]P]P]P]P]P]P]P]P]P]P]P|]Pu]Pn]Pg]P`]PY]PR]PK]PD]P=]P6]P/]P(]P!]P]P]P ]P]P\P\P\P\P\P\P\P\P\P\P\P\P\P\P\P\P\P\P\Py\Pr\Pk\Pd\P]\PV\PO\PH\PA\P:\P3\P,\P%\P\P\P\P \P\P[P[P[P[P[P[P[P[P[P[P[P[P[P[P[P[P[P[P}[Pv[Po[Ph[Pa[PZ[PS[PL[PE[P>[P7[P0[P)[P"[P[P [P[PZPZPZPZPZPZPZPZPZPZPZPZPZPZPZPZPZPZPZPzZPsZPlZPeZP^ZPWZPPZPIZPBZP;ZP4ZP-ZP&ZPZPZPZP ZPZPYPYPYPYPYPYPYPYPYPYPYPYPYPYPYPYPYPYP~YPwYPpYPiYPbYP[YPTYPMYPFYP?YP8YP1YP*YP#YPYPYPYPYPYPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXP{XPtXPmXPfXP_XPXXPQXPJXPCXPTP7TP0TP)TP"TPTPTP TPTPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPzSPsSPlSPeSP^SPWSPPSPISPBSP;SP4SP-SP&SPSPSPSP SPSPRPRPRPRPRPRPRPRPRPRPRPRPRPRPRPRPRPRP~RPwRPpRPiRPbRP[RPTRPMRPFRP?RP8RP1RP*RP#RPRPRPRPRPRPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQP{QPtQPmQPfQP_QPXQPQQPJQPCQPMP7MP0MP)MP"MPMPMP MPMPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPzLPsLPlLPeLP^LPWLPPLPILPBLP;LP4LP-LP&LPLPLPLP LPLPKPKPKPKPKPKPKPKPKPKPKPKPKPKPKPKPKPKP~KPwKPpKPiKPbKP[KPTKPMKPFKP?KP8KP1KP*KP#KPKPKPKPKPKPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJP{JPtJPmJPfJP_JPXJPQJPJJPCJPFP7FP0FP)FP"FPFPFP FPFPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPzEPsEPlEPeEP^EPWEPPEPIEPBEP;EP4EP-EP&EPEPEPEP EPEPDPDPDPDPDPDPDPDPDPDPDPDPDPDPDPDPDPDP~DPwDPpDPiDPbDP[DPTDPMDPFDP?DP8DP1DP*DP#DPDPDPDPDPDPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP{CPtCPmCPfCP_CPXCPQCPJCPCCP?P7?P0?P)?P"?P?P?P ?P?P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>Pz>Ps>Pl>Pe>P^>PW>PP>PI>PB>P;>P4>P->P&>P>P>P>P >P>P=P=P=P=P=P=P=P=P=P=P=P=P=P=P=P=P=P=P~=Pw=Pp=Pi=Pb=P[=PT=PM=PF=P?=P8=P1=P*=P#=P=P=P=P=P=P8P78P08P)8P"8P8P8P 8P8P7P7P7P7P7P7P7P7P7P7P7P7P7P7P7P7P7P7P7Pz7Ps7Pl7Pe7P^7PW7PP7PI7PB7P;7P47P-7P&7P7P7P7P 7P7P6P6P6P6P6P6P6P6P6P6P6P6P6P6P6P6P6P6P~6Pw6Pp6Pi6Pb6P[6PT6PM6PF6P?6P86P16P*6P#6P6P6P6P6P6P5P5P5P5P5P5P5P5P5P5P5P5P5P5P5P5P5P5P{5Pt5Pm5Pf5P_5PX5PQ5PJ5PC5P<5P55P.5P'5P 5P5P5P 5P5P4P4P4P4P4P4P4P4P4P4P4P4P4P4P4P4P4P4P4Px4Pq4Pj4Pc4P\4PU4PN4PG4P@4P94P24P+4P$4P4P4P4P4P4P3P3P3P3P3P3P3P3P3P3P3P3P3P3P3P3P3P3P|3Pu3Pn3Pg3P`3PY3PR3PK3PD3P=3P63P/3P(3P!3P3P3P 3P3P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2Py2Pr2Pk2Pd2P]2PV2PO2PH2PA2P:2P32P,2P%2P2P2P2P 2P2P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P}1Pv1Po1Ph1Pa1PZ1PS1PL1PE1P>1P71P01P)1P"1P1P1P 1P1P0P0P0P0P0P0P0P0P0P0P0P0P0P0P0P0P0P0P0Pz0Ps0Pl0Pe0P^0PW0PP0PI0PB0P;0P40P-0P&0P0P0P0P 0P0P/P/P/P/P/P/P/P/P/P/P/P/P/P/P/P/P/P/P~/Pw/Pp/Pi/Pb/P[/PT/PM/PF/P?/P8/P1/P*/P#/P/P/P/P/P/P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P{.Pt.Pm.Pf.P_.PX.PQ.PJ.PC.P<.P5.P..P'.P .P.P.P .P.P-P-P-P-P-P-P-P-P-P-P-P-P-P-P-P-P-P-P-Px-Pq-Pj-Pc-P\-PU-PN-PG-P@-P9-P2-P+-P$-P-P-P-P-P-P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P|,Pu,Pn,Pg,P`,PY,PR,PK,PD,P=,P6,P/,P(,P!,P,P,P ,P,P+P+P+P+P+P+P+P+P+P+P+P+P+P+P+P+P+P+P+Py+Pr+Pk+Pd+P]+PV+PO+PH+PA+P:+P3+P,+P%+P+P+P+P +P+P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P}*Pv*Po*Ph*Pa*PZ*PS*PL*PE*P>*P7*P0*P)*P"*P*P*P *P*P)P)P)P)P)P)P)P)P)P)P)P)P)P)P)P)P)P)P)Pz)Ps)Pl)Pe)P^)PW)PP)PI)PB)P;)P4)P-)P&)P)P)P)P )P)P(P(P(P(P(P(P(P(P(P(P(P(P(P(P(P(P(P(P~(Pw(Pp(Pi(Pb(P[(PT(PM(PF(P?(P8(P1(P*(P#(P(P(P(P(P(P'P'P'P'P'P'P'P'P'P'P'P'P'P'P'P'P'P'P{'Pt'Pm'Pf'P_'PX'PQ'PJ'PC'P<'P5'P.'P''P 'P'P'P 'P'P&P&P&P&P&P&P&P&P&P&P&P&P&P&P&P&P&P&P&Px&Pq&Pj&Pc&P\&PU&PN&PG&P@&P9&P2&P+&P$&P&P&P&P&P&P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P|%Pu%Pn%Pg%P`%PY%PR%PK%PD%P=%P6%P/%P(%P!%P%P%P %P%P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$Py$Pr$Pk$Pd$P]$PV$PO$PH$PA$P:$P3$P,$P%$P$P$P$P $P$P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P}#Pv#Po#Ph#Pa#PZ#PS#PL#PE#P>#P7#P0#P)#P"#P#P#P #P#P"P"P"P"P"P"P"P"P"P"P"P"P"P"P"P"P"P"P"Pz"Ps"Pl"Pe"P^"PW"PP"PI"PB"P;"P4"P-"P&"P"P"P"P "P"P!P!P!P!P!P!P!P!P!P!P!P!P!P!P!P!P!P!P~!Pw!Pp!Pi!Pb!P[!PT!PM!PF!P?!P8!P1!P*!P#!P!P!P!P!P!P P P P P P P P P P P P P P P P P P P{ Pt Pm Pf P_ PX PQ PJ PC P< P5 P. P' P P P P P PPPPPPPPPPPPPPPPPPPPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPPPPPPPPPPPPPPPPPPP|PuPnPgP`PYPRPKPDP=P6P/P(P!PPP PPPPPPPPPPPPPPPPPPPPPyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPPPPPPPPPPPPPPPPPPP}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCP<P5P.P'P PPP PPPPPPPPPPPPPPPPPPPPPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPPPPPPPPPPPPPPPPPPP|PuPnPgP`PYPRPKPDP=P6P/P(P!PPP PPPPPPPPPPPPPPPPPPPPPyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPPPPPPPPPPPPPPPPPPP}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCP<P5P.P'P PPP PPPPPPPPPPPPPPPPPPPPPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPPPPPPPPPPPPPPPPPPP|PuPnPgP`PYPRPKPDP=P6P/P(P!PPP PPPPPPPPPPPPPPPPPPPPPyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPPPPPPPPPPPPPPPPPPP}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PP P P P P P P P P P P P P P P P P P P Pz Ps Pl Pe P^ PW PP PI PB P; P4 P- P& P P P P P P P P P P P P P P P P P P P P P P P P~ Pw Pp Pi Pb P[ PT PM PF P? P8 P1 P* P# P P P P P P P P P P P P P P P P P P P P P P P P{ Pt Pm Pf P_ PX PQ PJ PC P< P5 P. P' P P P P P P P P P P P P P P P P P P P P P P P P Px Pq Pj Pc P\ PU PN PG P@ P9 P2 P+ P$ P P P P P P P P P P P P P P P P P P P P P P P P| Pu Pn Pg P` PY PR PK PD P= P6 P/ P( P! P P P P PPPPPPPPPPPPPPPPPPPPyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPPPPPPPPPPPPPPPPPPP}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCP<P5P.P'P PPP PPPPPPPPPPPPPPPPPPPPPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPPPPPPPPPPPPPPPPPPP|PuPnPgP`PYPRPKPDP=P6P/P(P!PPP PPPPPPPPPPPPPPPPPPPPPyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPPPPPPPPPPPPPPPPPPP}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOٿOҿO˿OĿOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOݾO־OϾOȾOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOܹOչOιOǹOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOٸOҸO˸OĸOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOݷOַOϷOȷOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOܲOղOβODzOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOٱOұO˱OıOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOݰOְOϰOȰOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOܫOիOΫOǫOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOO٪OҪO˪OĪOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOݩO֩OϩOȩOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOܤOդOΤOǤOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOO٣OңOˣOģOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOݢO֢OϢOȢOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOܝO՝OΝOǝOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOٜOҜO˜OĜOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOݛO֛OϛOțOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOOܖOՖOΖOǖOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOٕOҕO˕OĕOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOݔO֔OϔOȔOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOO܏OՏOΏOǏOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOَOҎOˎOĎOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOݍO֍OύOȍOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOO܈OՈOΈOLjOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOهO҇OˇOćOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOO݆OֆOφOȆOOOOOOOOOOO{OtOmOfO_OXOQOJOCOO7O0O)O"OOO OOOOOOO܁OՁO΁OǁOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOـOҀOˀOĀOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OO~O~O~O~O~O~O~O~O~O~O~O~O~O~O~O~O~O~O~Ox~Oq~Oj~Oc~O\~OU~ON~OG~O@~O9~O2~O+~O$~O~O~O~O~O~O}O}O}O}O}O}O}O}O}O}O}O}O}O}O}O}O}O}O|}Ou}On}Og}O`}OY}OR}OK}OD}O=}O6}O/}O(}O!}O}O}O }O}O|O|O|O|O|O|O|O|O|O|O|O|O|O|O|O|O|O|O|Oy|Or|Ok|Od|O]|OV|OO|OH|OA|O:|O3|O,|O%|O|O|O|O |O|O{O{O{O{O{O{O{O{O{O{O{O{O{O{O{O{O{O{O}{Ov{Oo{Oh{Oa{OZ{OS{OL{OE{O>{O7{O0{O){O"{O{O{O {O{OzOzOzOzOzOzOzOzOzOzOzOzOzOzOzOzOzOzOzOzzOszOlzOezO^zOWzOPzOIzOBzO;zO4zO-zO&zOzOzOzO zOzOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyO~yOwyOpyOiyObyO[yOTyOMyOFyO?yO8yO1yO*yO#yOyOyOyOyOyOxOxOxOxOxOxOxOxOxOxOxOxOxOxOxOxOxOxO{xOtxOmxOfxO_xOXxOQxOJxOCxOtO7tO0tO)tO"tOtOtO tOtOsOsOsOsOsOsOsOsOsOsOsOsOsOsOsOsOsOsOsOzsOssOlsOesO^sOWsOPsOIsOBsO;sO4sO-sO&sOsOsOsO sOsOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrO~rOwrOprOirObrO[rOTrOMrOFrO?rO8rO1rO*rO#rOrOrOrOrOrOqOqOqOqOqOqOqOqOqOqOqOqOqOqOqOqOqOqO{qOtqOmqOfqO_qOXqOQqOJqOCqOmO7mO0mO)mO"mOmOmO mOmOlOlOlOlOlOlOlOlOlOlOlOlOlOlOlOlOlOlOlOzlOslOllOelO^lOWlOPlOIlOBlO;lO4lO-lO&lOlOlOlO lOlOkOkOkOkOkOkOkOkOkOkOkOkOkOkOkOkOkOkO~kOwkOpkOikObkO[kOTkOMkOFkO?kO8kO1kO*kO#kOkOkOkOkOkOjOjOjOjOjOjOjOjOjOjOjOjOjOjOjOjOjOjO{jOtjOmjOfjO_jOXjOQjOJjOCjOfO7fO0fO)fO"fOfOfO fOfOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOzeOseOleOeeO^eOWeOPeOIeOBeO;eO4eO-eO&eOeOeOeO eOeOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO~dOwdOpdOidObdO[dOTdOMdOFdO?dO8dO1dO*dO#dOdOdOdOdOdOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcO{cOtcOmcOfcO_cOXcOQcOJcOCcO_O7_O0_O)_O"_O_O_O _O_O^O^O^O^O^O^O^O^O^O^O^O^O^O^O^O^O^O^O^Oz^Os^Ol^Oe^O^^OW^OP^OI^OB^O;^O4^O-^O&^O^O^O^O ^O^O]O]O]O]O]O]O]O]O]O]O]O]O]O]O]O]O]O]O~]Ow]Op]Oi]Ob]O[]OT]OM]OF]O?]O8]O1]O*]O#]O]O]O]O]O]O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O{\Ot\Om\Of\O_\OX\OQ\OJ\OC\O<\O5\O.\O'\O \O\O\O \O\O[O[O[O[O[O[O[O[O[O[O[O[O[O[O[O[O[O[O[Ox[Oq[Oj[Oc[O\[OU[ON[OG[O@[O9[O2[O+[O$[O[O[O[O[O[OZOZOZOZOZOZOZOZOZOZOZOZOZOZOZOZOZOZO|ZOuZOnZOgZO`ZOYZORZOKZODZO=ZO6ZO/ZO(ZO!ZOZOZO ZOZOYOYOYOYOYOYOYOYOYOYOYOYOYOYOYOYOYOYOYOyYOrYOkYOdYO]YOVYOOYOHYOAYO:YO3YO,YO%YOYOYOYO YOYOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO}XOvXOoXOhXOaXOZXOSXOLXOEXO>XO7XO0XO)XO"XOXOXO XOXOWOWOWOWOWOWOWOWOWOWOWOWOWOWOWOWOWOWOWOzWOsWOlWOeWO^WOWWOPWOIWOBWO;WO4WO-WO&WOWOWOWO WOWOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVO~VOwVOpVOiVObVO[VOTVOMVOFVO?VO8VO1VO*VO#VOVOVOVOVOVOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUO{UOtUOmUOfUO_UOXUOQUOJUOCUOQO7QO0QO)QO"QOQOQO QOQOPOPOPOPOPOPOPOPOPOPOPOPOPOPOPOPOPOPOPOzPOsPOlPOePO^POWPOPPOIPOBPO;PO4PO-PO&POPOPOPO POPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO~OOwOOpOOiOObOO[OOTOOMOOFOO?OO8OO1OO*OO#OOOOOOOOOOOONONONONONONONONONONONONONONONONONONO{NOtNOmNOfNO_NOXNOQNOJNOCNOJO7JO0JO)JO"JOJOJO JOJOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOzIOsIOlIOeIO^IOWIOPIOIIOBIO;IO4IO-IO&IOIOIOIO IOIOHOHOHOHOHOHOHOHOHOHOHOHOHOHOHOHOHOHO~HOwHOpHOiHObHO[HOTHOMHOFHO?HO8HO1HO*HO#HOHOHOHOHOHOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGO{GOtGOmGOfGO_GOXGOQGOJGOCGOCO7CO0CO)CO"COCOCO COCOBOBOBOBOBOBOBOBOBOBOBOBOBOBOBOBOBOBOBOzBOsBOlBOeBO^BOWBOPBOIBOBBO;BO4BO-BO&BOBOBOBO BOBOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO~AOwAOpAOiAObAO[AOTAOMAOFAO?AO8AO1AO*AO#AOAOAOAOAOAO@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O{@Ot@Om@Of@O_@OX@OQ@OJ@OC@O<@O5@O.@O'@O @O@O@O @O@O?O?O?O?O?O?O?O?O?O?O?O?O?O?O?O?O?O?O?Ox?Oq?Oj?Oc?O\?OU?ON?OG?O@?O9?O2?O+?O$?O?O?O?O?O?O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O|>Ou>On>Og>O`>OY>OR>OK>OD>O=>O6>O/>O(>O!>O>O>O >O>O=O=O=O=O=O=O=O=O=O=O=O=O=O=O=O=O=O=O=Oy=Or=Ok=Od=O]=OV=OO=OH=OA=O:=O3=O,=O%=O=O=O=O =O=O5O75O05O)5O"5O5O5O 5O5O4O4O4O4O4O4O4O4O4O4O4O4O4O4O4O4O4O4O4Oz4Os4Ol4Oe4O^4OW4OP4OI4OB4O;4O44O-4O&4O4O4O4O 4O4O3O3O3O3O3O3O3O3O3O3O3O3O3O3O3O3O3O3O~3Ow3Op3Oi3Ob3O[3OT3OM3OF3O?3O83O13O*3O#3O3O3O3O3O3O2O2O2O2O2O2O2O2O2O2O2O2O2O2O2O2O2O2O{2Ot2Om2Of2O_2OX2OQ2OJ2OC2O<2O52O.2O'2O 2O2O2O 2O2O1O1O1O1O1O1O1O1O1O1O1O1O1O1O1O1O1O1O1Ox1Oq1Oj1Oc1O\1OU1ON1OG1O@1O91O21O+1O$1O1O1O1O1O1O0O0O0O0O0O0O0O0O0O0O0O0O0O0O0O0O0O0O|0Ou0On0Og0O`0OY0OR0OK0OD0O=0O60O/0O(0O!0O0O0O 0O0O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/Oy/Or/Ok/Od/O]/OV/OO/OH/OA/O:/O3/O,/O%/O/O/O/O /O/O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O}.Ov.Oo.Oh.Oa.OZ.OS.OL.OE.O>.O7.O0.O).O".O.O.O .O.O-O-O-O-O-O-O-O-O-O-O-O-O-O-O-O-O-O-O-Oz-Os-Ol-Oe-O^-OW-OP-OI-OB-O;-O4-O--O&-O-O-O-O -O-O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O~,Ow,Op,Oi,Ob,O[,OT,OM,OF,O?,O8,O1,O*,O#,O,O,O,O,O,O+O+O+O+O+O+O+O+O+O+O+O+O+O+O+O+O+O+O{+Ot+Om+Of+O_+OX+OQ+OJ+OC+O<+O5+O.+O'+O +O+O+O +O+O*O*O*O*O*O*O*O*O*O*O*O*O*O*O*O*O*O*O*Ox*Oq*Oj*Oc*O\*OU*ON*OG*O@*O9*O2*O+*O$*O*O*O*O*O*O)O)O)O)O)O)O)O)O)O)O)O)O)O)O)O)O)O)O|)Ou)On)Og)O`)OY)OR)OK)OD)O=)O6)O/)O()O!)O)O)O )O)O(O(O(O(O(O(O(O(O(O(O(O(O(O(O(O(O(O(O(Oy(Or(Ok(Od(O](OV(OO(OH(OA(O:(O3(O,(O%(O(O(O(O (O(O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O}'Ov'Oo'Oh'Oa'OZ'OS'OL'OE'O>'O7'O0'O)'O"'O'O'O 'O'O&O&O&O&O&O&O&O&O&O&O&O&O&O&O&O&O&O&O&Oz&Os&Ol&Oe&O^&OW&OP&OI&OB&O;&O4&O-&O&&O&O&O&O &O&O%O%O%O%O%O%O%O%O%O%O%O%O%O%O%O%O%O%O~%Ow%Op%Oi%Ob%O[%OT%OM%OF%O?%O8%O1%O*%O#%O%O%O%O%O%O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O{$Ot$Om$Of$O_$OX$OQ$OJ$OC$O<$O5$O.$O'$O $O$O$O $O$O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#Ox#Oq#Oj#Oc#O\#OU#ON#OG#O@#O9#O2#O+#O$#O#O#O#O#O#O"O"O"O"O"O"O"O"O"O"O"O"O"O"O"O"O"O"O|"Ou"On"Og"O`"OY"OR"OK"OD"O="O6"O/"O("O!"O"O"O "O"O!O!O!O!O!O!O!O!O!O!O!O!O!O!O!O!O!O!O!Oy!Or!Ok!Od!O]!OV!OO!OH!OA!O:!O3!O,!O%!O!O!O!O !O!O O O O O O O O O O O O O O O O O O O} Ov Oo Oh Oa OZ OS OL OE O> O7 O0 O) O" O O O O OOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOOOOOOOOOOOOOOOOOOOOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOOOOOOOOOOOOOOOOOOOO|OuOnOgO`OYOROKODO=O6O/O(O!OOO OOOOOOOOOOOOOOOOOOOOOyOrOkOdO]OVOOOHOAO:O3O,O%OOOO OOOOOOOOOOOOOOOOOOOO}OvOoOhOaOZOSOLOEO>O7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOOOOOOOOOOOOOOOOOOOOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOOOOOOOOOOOOOOOOOOOO|OuOnOgO`OYOROKODO=O6O/O(O!OOO OOOOOOOOOOOOOOOOOOOOOyOrOkOdO]OVOOOHOAO:O3O,O%OOOO OOOOOOOOOOOOOOOOOOOO}OvOoOhOaOZOSOLOEO>O7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOOOOOOOOOOOOOOOOOOOOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOO O O O O O O O O O O O O O O O O O O| Ou On Og O` OY OR OK OD O= O6 O/ O( O! O O O O O O O O O O O O O O O O O O O O O O O Oy Or Ok Od O] OV OO OH OA O: O3 O, O% O O O O O O O O O O O O O O O O O O O O O O O O} Ov Oo Oh Oa OZ OS OL OE O> O7 O0 O) O" O O O O O O O O O O O O O O O O O O O O O O O Oz Os Ol Oe O^ OW OP OI OB O; O4 O- O& O O O O O O O O O O O O O O O O O O O O O O O O~ Ow Op Oi Ob O[ OT OM OF O? O8 O1 O* O# O O O O O OOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOOOOOOOOOOOOOOOOOOOOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOOOOOOOOOOOOOOOOOOOO|OuOnOgO`OYOROKODO=O6O/O(O!OOO OOOOOOOOOOOOOOOOOOOOOyOrOkOdO]OVOOOHOAO:O3O,O%OOOO OOOOOOOOOOOOOOOOOOOO}OvOoOhOaOZOSOLOEO>O7O0O)O"OOO OOOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOOOOOOOOOOOOOOOOOOOOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOONNNNNNNNNNNNNNNNNN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNNNNNNNNNNNNNNNNNNNNyNrNkNdN]NVNONHNAN:N3N,N%NNNN NNNNNNNNNNNNNNNNNNNN}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNܽNսNνNǽNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNټNҼN˼NļNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNݻNֻNϻNȻNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNܶNնNζNǶNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNٵNҵN˵NĵNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNݴNִNϴNȴNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNܯNկNίNǯNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNٮNҮNˮNĮNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNݭN֭NϭNȭNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNܨNըNΨNǨNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNN٧NҧN˧NħNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNݦN֦NϦNȦNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNܡNաNΡNǡNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNN٠NҠNˠNĠNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNݟN֟NϟNȟNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNܚN՚NΚNǚNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNٙNҙN˙NęNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNݘN֘NϘNȘNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNNܓNՓNΓNǓNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNْNҒN˒NĒNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNݑN֑NϑNȑNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNN܌NՌNΌNnjNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNًNҋNˋNċNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNN݊N֊NϊNȊNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NNNNNNN܅NՅN΅NDžNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNلN҄N˄NĄNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNN݃NփNσNȃNNNNNNNNNNN{NtNmNfN_NXNQNJNCNN7N0N)N"NNN NN~N~N~N~N~N~N~N~N~N~N~N~N~N~N~N~N~N~N~Nz~Ns~Nl~Ne~N^~NW~NP~NI~NB~N;~N4~N-~N&~N~N~N~N ~N~N}N}N}N}N}N}N}N}N}N}N}N}N}N}N}N}N}N}N~}Nw}Np}Ni}Nb}N[}NT}NM}NF}N?}N8}N1}N*}N#}N}N}N}N}N}N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N{|Nt|Nm|Nf|N_|NX|NQ|NJ|NC|N<|N5|N.|N'|N |N|N|N |N|N{N{N{N{N{N{N{N{N{N{N{N{N{N{N{N{N{N{N{Nx{Nq{Nj{Nc{N\{NU{NN{NG{N@{N9{N2{N+{N${N{N{N{N{N{NzNzNzNzNzNzNzNzNzNzNzNzNzNzNzNzNzNzN|zNuzNnzNgzN`zNYzNRzNKzNDzN=zN6zN/zN(zN!zNzNzN zNzNyNyNyNyNyNyNyNyNyNyNyNyNyNyNyNyNyNyNyNyyNryNkyNdyN]yNVyNOyNHyNAyN:yN3yN,yN%yNyNyNyN yNyNxNxNxNxNxNxNxNxNxNxNxNxNxNxNxNxNxNxN}xNvxNoxNhxNaxNZxNSxNLxNExN>xN7xN0xN)xN"xNxNxN xNxNwNwNwNwNwNwNwNwNwNwNwNwNwNwNwNwNwNwNwNzwNswNlwNewN^wNWwNPwNIwNBwN;wN4wN-wN&wNwNwNwN wNwNvNvNvNvNvNvNvNvNvNvNvNvNvNvNvNvNvNvN~vNwvNpvNivNbvN[vNTvNMvNFvN?vN8vN1vN*vN#vNvNvNvNvNvNuNuNuNuNuNuNuNuNuNuNuNuNuNuNuNuNuNuN{uNtuNmuNfuN_uNXuNQuNJuNCuNqN7qN0qN)qN"qNqNqN qNqNpNpNpNpNpNpNpNpNpNpNpNpNpNpNpNpNpNpNpNzpNspNlpNepN^pNWpNPpNIpNBpN;pN4pN-pN&pNpNpNpN pNpNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoN~oNwoNpoNioNboN[oNToNMoNFoN?oN8oN1oN*oN#oNoNoNoNoNoNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnN{nNtnNmnNfnN_nNXnNQnNJnNCnNjN7jN0jN)jN"jNjNjN jNjNiNiNiNiNiNiNiNiNiNiNiNiNiNiNiNiNiNiNiNziNsiNliNeiN^iNWiNPiNIiNBiN;iN4iN-iN&iNiNiNiN iNiNhNhNhNhNhNhNhNhNhNhNhNhNhNhNhNhNhNhN~hNwhNphNihNbhN[hNThNMhNFhN?hN8hN1hN*hN#hNhNhNhNhNhNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgN{gNtgNmgNfgN_gNXgNQgNJgNCgNcN7cN0cN)cN"cNcNcN cNcNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNzbNsbNlbNebN^bNWbNPbNIbNBbN;bN4bN-bN&bNbNbNbN bNbNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN~aNwaNpaNiaNbaN[aNTaNMaNFaN?aN8aN1aN*aN#aNaNaNaNaNaN`N`N`N`N`N`N`N`N`N`N`N`N`N`N`N`N`N`N{`Nt`Nm`Nf`N_`NX`NQ`NJ`NC`N<`N5`N.`N'`N `N`N`N `N`N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_Nx_Nq_Nj_Nc_N\_NU_NN_NG_N@_N9_N2_N+_N$_N_N_N_N_N_N^N^N^N^N^N^N^N^N^N^N^N^N^N^N^N^N^N^N|^Nu^Nn^Ng^N`^NY^NR^NK^ND^N=^N6^N/^N(^N!^N^N^N ^N^N]N]N]N]N]N]N]N]N]N]N]N]N]N]N]N]N]N]N]Ny]Nr]Nk]Nd]N]]NV]NO]NH]NA]N:]N3]N,]N%]N]N]N]N ]N]N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N}\Nv\No\Nh\Na\NZ\NS\NL\NE\N>\N7\N0\N)\N"\N\N\N \N\N[N[N[N[N[N[N[N[N[N[N[N[N[N[N[N[N[N[N[Nz[Ns[Nl[Ne[N^[NW[NP[NI[NB[N;[N4[N-[N&[N[N[N[N [N[NZNZNZNZNZNZNZNZNZNZNZNZNZNZNZNZNZNZN~ZNwZNpZNiZNbZN[ZNTZNMZNFZN?ZN8ZN1ZN*ZN#ZNZNZNZNZNZNYNYNYNYNYNYNYNYNYNYNYNYNYNYNYNYNYNYN{YNtYNmYNfYN_YNXYNQYNJYNCYNUN7UN0UN)UN"UNUNUN UNUNTNTNTNTNTNTNTNTNTNTNTNTNTNTNTNTNTNTNTNzTNsTNlTNeTN^TNWTNPTNITNBTN;TN4TN-TN&TNTNTNTN TNTNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSN~SNwSNpSNiSNbSN[SNTSNMSNFSN?SN8SN1SN*SN#SNSNSNSNSNSNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRN{RNtRNmRNfRN_RNXRNQRNJRNCRNNN7NN0NN)NN"NNNNNN NNNNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNzMNsMNlMNeMN^MNWMNPMNIMNBMN;MN4MN-MN&MNMNMNMN MNMNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN~LNwLNpLNiLNbLN[LNTLNMLNFLN?LN8LN1LN*LN#LNLNLNLNLNLNKNKNKNKNKNKNKNKNKNKNKNKNKNKNKNKNKNKN{KNtKNmKNfKN_KNXKNQKNJKNCKNGN7GN0GN)GN"GNGNGN GNGNFNFNFNFNFNFNFNFNFNFNFNFNFNFNFNFNFNFNFNzFNsFNlFNeFN^FNWFNPFNIFNBFN;FN4FN-FN&FNFNFNFN FNFNENENENENENENENENENENENENENENENENENEN~ENwENpENiENbEN[ENTENMENFEN?EN8EN1EN*EN#ENENENENENENDNDNDNDNDNDNDNDNDNDNDNDNDNDNDNDNDNDN{DNtDNmDNfDN_DNXDNQDNJDNCDN@N7@N0@N)@N"@N@N@N @N@N?N?N?N?N?N?N?N?N?N?N?N?N?N?N?N?N?N?N?Nz?Ns?Nl?Ne?N^?NW?NP?NI?NB?N;?N4?N-?N&?N?N?N?N ?N?N>N>N>N>N>N>N>N>N>N>N>N>N>N>N>N>N>N>N~>Nw>Np>Ni>Nb>N[>NT>NM>NF>N?>N8>N1>N*>N#>N>N>N>N>N>N=N=N=N=N=N=N=N=N=N=N=N=N=N=N=N=N=N=N{=Nt=Nm=Nf=N_=NX=NQ=NJ=NC=N<=N5=N.=N'=N =N=N=N =N=N9N79N09N)9N"9N9N9N 9N9N8N8N8N8N8N8N8N8N8N8N8N8N8N8N8N8N8N8N8Nz8Ns8Nl8Ne8N^8NW8NP8NI8NB8N;8N48N-8N&8N8N8N8N 8N8N7N7N7N7N7N7N7N7N7N7N7N7N7N7N7N7N7N7N~7Nw7Np7Ni7Nb7N[7NT7NM7NF7N?7N87N17N*7N#7N7N7N7N7N7N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N{6Nt6Nm6Nf6N_6NX6NQ6NJ6NC6N<6N56N.6N'6N 6N6N6N 6N6N5N5N5N5N5N5N5N5N5N5N5N5N5N5N5N5N5N5N5Nx5Nq5Nj5Nc5N\5NU5NN5NG5N@5N95N25N+5N$5N5N5N5N5N5N4N4N4N4N4N4N4N4N4N4N4N4N4N4N4N4N4N4N|4Nu4Nn4Ng4N`4NY4NR4NK4ND4N=4N64N/4N(4N!4N4N4N 4N4N3N3N3N3N3N3N3N3N3N3N3N3N3N3N3N3N3N3N3Ny3Nr3Nk3Nd3N]3NV3NO3NH3NA3N:3N33N,3N%3N3N3N3N 3N3N2N2N2N2N2N2N2N2N2N2N2N2N2N2N2N2N2N2N}2Nv2No2Nh2Na2NZ2NS2NL2NE2N>2N72N02N)2N"2N2N2N 2N2N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1Nz1Ns1Nl1Ne1N^1NW1NP1NI1NB1N;1N41N-1N&1N1N1N1N 1N1N0N0N0N0N0N0N0N0N0N0N0N0N0N0N0N0N0N0N~0Nw0Np0Ni0Nb0N[0NT0NM0NF0N?0N80N10N*0N#0N0N0N0N0N0N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N{/Nt/Nm/Nf/N_/NX/NQ/NJ/NC/N+N7+N0+N)+N"+N+N+N +N+N*N*N*N*N*N*N*N*N*N*N*N*N*N*N*N*N*N*N*Nz*Ns*Nl*Ne*N^*NW*NP*NI*NB*N;*N4*N-*N&*N*N*N*N *N*N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N~)Nw)Np)Ni)Nb)N[)NT)NM)NF)N?)N8)N1)N*)N#)N)N)N)N)N)N(N(N(N(N(N(N(N(N(N(N(N(N(N(N(N(N(N(N{(Nt(Nm(Nf(N_(NX(NQ(NJ(NC(N<(N5(N.(N'(N (N(N(N (N(N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'Nx'Nq'Nj'Nc'N\'NU'NN'NG'N@'N9'N2'N+'N$'N'N'N'N'N'N&N&N&N&N&N&N&N&N&N&N&N&N&N&N&N&N&N&N|&Nu&Nn&Ng&N`&NY&NR&NK&ND&N=&N6&N/&N(&N!&N&N&N &N&N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%Ny%Nr%Nk%Nd%N]%NV%NO%NH%NA%N:%N3%N,%N%%N%N%N%N %N%N$N$N$N$N$N$N$N$N$N$N$N$N$N$N$N$N$N$N}$Nv$No$Nh$Na$NZ$NS$NL$NE$N>$N7$N0$N)$N"$N$N$N $N$N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#Nz#Ns#Nl#Ne#N^#NW#NP#NI#NB#N;#N4#N-#N&#N#N#N#N #N#N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N~"Nw"Np"Ni"Nb"N["NT"NM"NF"N?"N8"N1"N*"N#"N"N"N"N"N"N!N!N!N!N!N!N!N!N!N!N!N!N!N!N!N!N!N!N{!Nt!Nm!Nf!N_!NX!NQ!NJ!NC!NN7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCN<N5N.N'N NNN NNNNNNNNNNNNNNNNNNNNNxNqNjNcN\NUNNNGN@N9N2N+N$NNNNNNNNNNNNNNNNNNNNNNNN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNNNNNNNNNNNNNNNNNNNNyNrNkNdN]NVNONHNAN:N3N,N%NNNN NNNNNNNNNNNNNNNNNNNN}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCN<N5N.N'N NNN NNNNNNNNNNNNNNNNNNNNNxNqNjNcN\NUNNNGN@N9N2N+N$NNNNNNNNNNNNNNNNNNNNNNNN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNNNNNNNNNNNNNNNNNNNNyNrNkNdN]NVNONHNAN:N3N,N%NNNN NNNNNNNNNNNNNNNNNNNN}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NN N N N N N N N N N N N N N N N N N N~ Nw Np Ni Nb N[ NT NM NF N? N8 N1 N* N# N N N N N N N N N N N N N N N N N N N N N N N N{ Nt Nm Nf N_ NX NQ NJ NC N< N5 N. N' N N N N N N N N N N N N N N N N N N N N N N N N Nx Nq Nj Nc N\ NU NN NG N@ N9 N2 N+ N$ N N N N N N N N N N N N N N N N N N N N N N N N| Nu Nn Ng N` NY NR NK ND N= N6 N/ N( N! N N N N N N N N N N N N N N N N N N N N N N N Ny Nr Nk Nd N] NV NO NH NA N: N3 N, N% N N N N N NNNNNNNNNNNNNNNNNNN}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNNNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNNNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCN<N5N.N'N NNN NNNNNNNNNNNNNNNNNNNNNxNqNjNcN\NUNNNGN@N9N2N+N$NNNNNNNNNNNNNNNNNNNNNNNN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNNNNNNNNNNNNNNNNNNNNyNrNkNdN]NVNONHNAN:N3N,N%NNNN NNNNNNNNNNNNNNNNNNNN}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNNNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMݿMֿMϿMȿMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMܺMպMκMǺMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMٹMҹM˹MĹMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMݸMָMϸMȸMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMܳMճMγMdzMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMٲMҲM˲MIJMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMݱMֱMϱMȱMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMܬMլMάMǬMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMM٫MҫM˫MīMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMݪM֪MϪMȪMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMܥMեMΥMǥMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMM٤MҤMˤMĤMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMݣM֣MϣMȣMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMܞM՞MΞMǞMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMٝMҝM˝MĝMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMݜM֜MϜMȜMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMܗM՗MΗMǗMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMٖMҖM˖MĖMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMݕM֕MϕMȕMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMMܐMՐMΐMǐMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMُMҏMˏMďMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMݎM֎MώMȎMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMM܉MՉMΉMljMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMوM҈MˈMĈMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMM݇MևMχMȇMMMMMMMMMMM{MtMmMfM_MXMQMJMCMM7M0M)M"MMM MMMMMMM܂MՂM΂MǂMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMفMҁMˁMāMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMM݀MրMπMȀMMMMMMMMMMM{MtMmMfM_MXMQMJMCM|M7|M0|M)|M"|M|M|M |M|M{M{M{M{M{M{M{M{M{M{M{M{M{M{M{M{M{M{M{Mz{Ms{Ml{Me{M^{MW{MP{MI{MB{M;{M4{M-{M&{M{M{M{M {M{MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM~zMwzMpzMizMbzM[zMTzMMzMFzM?zM8zM1zM*zM#zMzMzMzMzMzMyMyMyMyMyMyMyMyMyMyMyMyMyMyMyMyMyMyM{yMtyMmyMfyM_yMXyMQyMJyMCyMuM7uM0uM)uM"uMuMuM uMuMtMtMtMtMtMtMtMtMtMtMtMtMtMtMtMtMtMtMtMztMstMltMetM^tMWtMPtMItMBtM;tM4tM-tM&tMtMtMtM tMtMsMsMsMsMsMsMsMsMsMsMsMsMsMsMsMsMsMsM~sMwsMpsMisMbsM[sMTsMMsMFsM?sM8sM1sM*sM#sMsMsMsMsMsMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrM{rMtrMmrMfrM_rMXrMQrMJrMCrMnM7nM0nM)nM"nMnMnM nMnMmMmMmMmMmMmMmMmMmMmMmMmMmMmMmMmMmMmMmMzmMsmMlmMemM^mMWmMPmMImMBmM;mM4mM-mM&mMmMmMmM mMmMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlM~lMwlMplMilMblM[lMTlMMlMFlM?lM8lM1lM*lM#lMlMlMlMlMlMkMkMkMkMkMkMkMkMkMkMkMkMkMkMkMkMkMkM{kMtkMmkMfkM_kMXkMQkMJkMCkMgM7gM0gM)gM"gMgMgM gMgMfMfMfMfMfMfMfMfMfMfMfMfMfMfMfMfMfMfMfMzfMsfMlfMefM^fMWfMPfMIfMBfM;fM4fM-fM&fMfMfMfM fMfMeMeMeMeMeMeMeMeMeMeMeMeMeMeMeMeMeMeM~eMweMpeMieMbeM[eMTeMMeMFeM?eM8eM1eM*eM#eMeMeMeMeMeMdMdMdMdMdMdMdMdMdMdMdMdMdMdMdMdMdMdM{dMtdMmdMfdM_dMXdMQdMJdMCdM`M7`M0`M)`M"`M`M`M `M`M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_Mz_Ms_Ml_Me_M^_MW_MP_MI_MB_M;_M4_M-_M&_M_M_M_M _M_M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M~^Mw^Mp^Mi^Mb^M[^MT^MM^MF^M?^M8^M1^M*^M#^M^M^M^M^M^M]M]M]M]M]M]M]M]M]M]M]M]M]M]M]M]M]M]M{]Mt]Mm]Mf]M_]MX]MQ]MJ]MC]M<]M5]M.]M']M ]M]M]M ]M]M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\M\Mx\Mq\Mj\Mc\M\\MU\MN\MG\M@\M9\M2\M+\M$\M\M\M\M\M\M[M[M[M[M[M[M[M[M[M[M[M[M[M[M[M[M[M[M|[Mu[Mn[Mg[M`[MY[MR[MK[MD[M=[M6[M/[M([M![M[M[M [M[MZMZMZMZMZMZMZMZMZMZMZMZMZMZMZMZMZMZMZMyZMrZMkZMdZM]ZMVZMOZMHZMAZM:ZM3ZM,ZM%ZMZMZMZM ZMZMYMYMYMYMYMYMYMYMYMYMYMYMYMYMYMYMYMYM}YMvYMoYMhYMaYMZYMSYMLYMEYM>YM7YM0YM)YM"YMYMYM YMYMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMzXMsXMlXMeXM^XMWXMPXMIXMBXM;XM4XM-XM&XMXMXMXM XMXMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM~WMwWMpWMiWMbWM[WMTWMMWMFWM?WM8WM1WM*WM#WMWMWMWMWMWMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVM{VMtVMmVMfVM_VMXVMQVMJVMCVMRM7RM0RM)RM"RMRMRM RMRMQMQMQMQMQMQMQMQMQMQMQMQMQMQMQMQMQMQMQMzQMsQMlQMeQM^QMWQMPQMIQMBQM;QM4QM-QM&QMQMQMQM QMQMPMPMPMPMPMPMPMPMPMPMPMPMPMPMPMPMPMPM~PMwPMpPMiPMbPM[PMTPMMPMFPM?PM8PM1PM*PM#PMPMPMPMPMPMOMOMOMOMOMOMOMOMOMOMOMOMOMOMOMOMOMOM{OMtOMmOMfOM_OMXOMQOMJOMCOMKM7KM0KM)KM"KMKMKM KMKMJMJMJMJMJMJMJMJMJMJMJMJMJMJMJMJMJMJMJMzJMsJMlJMeJM^JMWJMPJMIJMBJM;JM4JM-JM&JMJMJMJM JMJMIMIMIMIMIMIMIMIMIMIMIMIMIMIMIMIMIMIM~IMwIMpIMiIMbIM[IMTIMMIMFIM?IM8IM1IM*IM#IMIMIMIMIMIMHMHMHMHMHMHMHMHMHMHMHMHMHMHMHMHMHMHM{HMtHMmHMfHM_HMXHMQHMJHMCHMDM7DM0DM)DM"DMDMDM DMDMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMzCMsCMlCMeCM^CMWCMPCMICMBCM;CM4CM-CM&CMCMCMCM CMCMBMBMBMBMBMBMBMBMBMBMBMBMBMBMBMBMBMBM~BMwBMpBMiBMbBM[BMTBMMBMFBM?BM8BM1BM*BM#BMBMBMBMBMBMAMAMAMAMAMAMAMAMAMAMAMAMAMAMAMAMAMAM{AMtAMmAMfAM_AMXAMQAMJAMCAMM>M>M>M>M>M>M>M>M>M>M>M>M>M>M>M>M>M>My>Mr>Mk>Md>M]>MV>MO>MH>MA>M:>M3>M,>M%>M>M>M>M >M>M=M=M=M=M=M=M=M=M=M=M=M=M=M=M=M=M=M=M}=Mv=Mo=Mh=Ma=MZ=MS=ML=ME=M>=M7=M0=M)=M"=M=M=M =M=M6M76M06M)6M"6M6M6M 6M6M5M5M5M5M5M5M5M5M5M5M5M5M5M5M5M5M5M5M5Mz5Ms5Ml5Me5M^5MW5MP5MI5MB5M;5M45M-5M&5M5M5M5M 5M5M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M~4Mw4Mp4Mi4Mb4M[4MT4MM4MF4M?4M84M14M*4M#4M4M4M4M4M4M3M3M3M3M3M3M3M3M3M3M3M3M3M3M3M3M3M3M{3Mt3Mm3Mf3M_3MX3MQ3MJ3MC3M<3M53M.3M'3M 3M3M3M 3M3M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2Mx2Mq2Mj2Mc2M\2MU2MN2MG2M@2M92M22M+2M$2M2M2M2M2M2M1M1M1M1M1M1M1M1M1M1M1M1M1M1M1M1M1M1M|1Mu1Mn1Mg1M`1MY1MR1MK1MD1M=1M61M/1M(1M!1M1M1M 1M1M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0My0Mr0Mk0Md0M]0MV0MO0MH0MA0M:0M30M,0M%0M0M0M0M 0M0M/M/M/M/M/M/M/M/M/M/M/M/M/M/M/M/M/M/M}/Mv/Mo/Mh/Ma/MZ/MS/ML/ME/M>/M7/M0/M)/M"/M/M/M /M/M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.Mz.Ms.Ml.Me.M^.MW.MP.MI.MB.M;.M4.M-.M&.M.M.M.M .M.M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M~-Mw-Mp-Mi-Mb-M[-MT-MM-MF-M?-M8-M1-M*-M#-M-M-M-M-M-M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M{,Mt,Mm,Mf,M_,MX,MQ,MJ,MC,M<,M5,M.,M',M ,M,M,M ,M,M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+Mx+Mq+Mj+Mc+M\+MU+MN+MG+M@+M9+M2+M++M$+M+M+M+M+M+M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M|*Mu*Mn*Mg*M`*MY*MR*MK*MD*M=*M6*M/*M(*M!*M*M*M *M*M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)My)Mr)Mk)Md)M])MV)MO)MH)MA)M:)M3)M,)M%)M)M)M)M )M)M(M(M(M(M(M(M(M(M(M(M(M(M(M(M(M(M(M(M}(Mv(Mo(Mh(Ma(MZ(MS(ML(ME(M>(M7(M0(M)(M"(M(M(M (M(M'M'M'M'M'M'M'M'M'M'M'M'M'M'M'M'M'M'M'Mz'Ms'Ml'Me'M^'MW'MP'MI'MB'M;'M4'M-'M&'M'M'M'M 'M'M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M~&Mw&Mp&Mi&Mb&M[&MT&MM&MF&M?&M8&M1&M*&M#&M&M&M&M&M&M%M%M%M%M%M%M%M%M%M%M%M%M%M%M%M%M%M%M{%Mt%Mm%Mf%M_%MX%MQ%MJ%MC%M<%M5%M.%M'%M %M%M%M %M%M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$Mx$Mq$Mj$Mc$M\$MU$MN$MG$M@$M9$M2$M+$M$$M$M$M$M$M$M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M|#Mu#Mn#Mg#M`#MY#MR#MK#MD#M=#M6#M/#M(#M!#M#M#M #M#M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"My"Mr"Mk"Md"M]"MV"MO"MH"MA"M:"M3"M,"M%"M"M"M"M "M"M!M!M!M!M!M!M!M!M!M!M!M!M!M!M!M!M!M!M}!Mv!Mo!Mh!Ma!MZ!MS!ML!ME!M>!M7!M0!M)!M"!M!M!M !M!M M M M M M M M M M M M M M M M M M M Mz Ms Ml Me M^ MW MP MI MB M; M4 M- M& M M M M M MMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCM<M5M.M'M MMM MMMMMMMMMMMMMMMMMMMMMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMMMMMMMMMMMMMMMMMMM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MMMMMMMMMMMMMMMMMMMMMyMrMkMdM]MVMOMHMAM:M3M,M%MMMM MMMMMMMMMMMMMMMMMMMM}MvMoMhMaMZMSMLMEM>M7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCM<M5M.M'M MMM MMMMMMMMMMMMMMMMMMMMMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMMMMMMMMMMMMMMMMMMM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MMMMMMMMMMMMMMMMMMMMMyMrMkMdM]MVMOMHMAM:M3M,M%MMMM MMMMMMMMMMMMMMMMMMMM}MvMoMhMaMZMSMLMEM>M7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCM<M5M.M'M MMM MMMMMMMMMMMMMMMMMMMMMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMMMMMMMMMMMMMMMMMMM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MM M M M M M M M M M M M M M M M M M M My Mr Mk Md M] MV MO MH MA M: M3 M, M% M M M M M M M M M M M M M M M M M M M M M M M M} Mv Mo Mh Ma MZ MS ML ME M> M7 M0 M) M" M M M M M M M M M M M M M M M M M M M M M M M Mz Ms Ml Me M^ MW MP MI MB M; M4 M- M& M M M M M M M M M M M M M M M M M M M M M M M M~ Mw Mp Mi Mb M[ MT MM MF M? M8 M1 M* M# M M M M M M M M M M M M M M M M M M M M M M M M{ Mt Mm Mf M_ MX MQ MJ MC M< M5 M. M' M M M M M MMMMMMMMMMMMMMMMMMMMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMMMMMMMMMMMMMMMMMMM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MMMMMMMMMMMMMMMMMMMMMyMrMkMdM]MVMOMHMAM:M3M,M%MMMM MMMMMMMMMMMMMMMMMMMM}MvMoMhMaMZMSMLMEM>M7M0M)M"MMM MMMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCM<M5M.M'M MMM MMMMMMMMMMMMMMMMMMMMMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMMMMMMMMMMMMMMMMMMM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MMLLLLLLLLLLLLLLLLLLLyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLLLLLLLLLLLLLLLLLLL}LvLoLhLaLZLSLLLEL>L7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLܾLվLξLǾLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLٽLҽL˽LĽLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLݼLּLϼLȼLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLܷLշLηLǷLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLٶLҶL˶LĶLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLݵLֵLϵLȵLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLܰLհLΰLǰLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLٯLүL˯LįLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLݮL֮LϮLȮLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLܩLթLΩLǩLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLL٨LҨL˨LĨLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLݧL֧LϧLȧLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLܢLբL΢LǢLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLL١LҡLˡLġLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLݠL֠LϠLȠLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLܛL՛LΛLǛLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLٚLҚL˚LĚLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLݙL֙LϙLșLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLܔLՔLΔLǔLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLٓLғL˓LēLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLݒL֒LϒLȒLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLL܍LՍL΍LǍLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLٌLҌLˌLČLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLL݋L֋LϋLȋLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLL܆LՆLΆLdžLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLمL҅L˅LąLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLL݄LքLτLȄLLLLLLLLLLL{LtLmLfL_LXLQLJLCLL7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LL~L~L~L~L~L~L~L~L~L~L~L~L~L~L~L~L~L~L~~Lw~Lp~Li~Lb~L[~LT~LM~LF~L?~L8~L1~L*~L#~L~L~L~L~L~L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}L{}Lt}Lm}Lf}L_}LX}LQ}LJ}LC}L<}L5}L.}L'}L }L}L}L }L}L|L|L|L|L|L|L|L|L|L|L|L|L|L|L|L|L|L|L|Lx|Lq|Lj|Lc|L\|LU|LN|LG|L@|L9|L2|L+|L$|L|L|L|L|L|L{L{L{L{L{L{L{L{L{L{L{L{L{L{L{L{L{L{L|{Lu{Ln{Lg{L`{LY{LR{LK{LD{L={L6{L/{L({L!{L{L{L {L{LzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLyzLrzLkzLdzL]zLVzLOzLHzLAzL:zL3zL,zL%zLzLzLzL zLzLyLyLyLyLyLyLyLyLyLyLyLyLyLyLyLyLyLyL}yLvyLoyLhyLayLZyLSyLLyLEyL>yL7yL0yL)yL"yLyLyL yLyLxLxLxLxLxLxLxLxLxLxLxLxLxLxLxLxLxLxLxLzxLsxLlxLexL^xLWxLPxLIxLBxL;xL4xL-xL&xLxLxLxL xLxLwLwLwLwLwLwLwLwLwLwLwLwLwLwLwLwLwLwL~wLwwLpwLiwLbwL[wLTwLMwLFwL?wL8wL1wL*wL#wLwLwLwLwLwLvLvLvLvLvLvLvLvLvLvLvLvLvLvLvLvLvLvL{vLtvLmvLfvL_vLXvLQvLJvLCvLrL7rL0rL)rL"rLrLrL rLrLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLzqLsqLlqLeqL^qLWqLPqLIqLBqL;qL4qL-qL&qLqLqLqL qLqLpLpLpLpLpLpLpLpLpLpLpLpLpLpLpLpLpLpL~pLwpLppLipLbpL[pLTpLMpLFpL?pL8pL1pL*pL#pLpLpLpLpLpLoLoLoLoLoLoLoLoLoLoLoLoLoLoLoLoLoLoL{oLtoLmoLfoL_oLXoLQoLJoLCoLkL7kL0kL)kL"kLkLkL kLkLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLjLzjLsjLljLejL^jLWjLPjLIjLBjL;jL4jL-jL&jLjLjLjL jLjLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL~iLwiLpiLiiLbiL[iLTiLMiLFiL?iL8iL1iL*iL#iLiLiLiLiLiLhLhLhLhLhLhLhLhLhLhLhLhLhLhLhLhLhLhL{hLthLmhLfhL_hLXhLQhLJhLChLdL7dL0dL)dL"dLdLdL dLdLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLzcLscLlcLecL^cLWcLPcLIcLBcL;cL4cL-cL&cLcLcLcL cLcLbLbLbLbLbLbLbLbLbLbLbLbLbLbLbLbLbLbL~bLwbLpbLibLbbL[bLTbLMbLFbL?bL8bL1bL*bL#bLbLbLbLbLbLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaL{aLtaLmaLfaL_aLXaLQaLJaLCaL]L7]L0]L)]L"]L]L]L ]L]L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\L\Lz\Ls\Ll\Le\L^\LW\LP\LI\LB\L;\L4\L-\L&\L\L\L\L \L\L[L[L[L[L[L[L[L[L[L[L[L[L[L[L[L[L[L[L~[Lw[Lp[Li[Lb[L[[LT[LM[LF[L?[L8[L1[L*[L#[L[L[L[L[L[LZLZLZLZLZLZLZLZLZLZLZLZLZLZLZLZLZLZL{ZLtZLmZLfZL_ZLXZLQZLJZLCZLVL7VL0VL)VL"VLVLVL VLVLULULULULULULULULULULULULULULULULULULULzULsULlULeUL^ULWULPULIULBUL;UL4UL-UL&ULULULUL ULULTLTLTLTLTLTLTLTLTLTLTLTLTLTLTLTLTLTL~TLwTLpTLiTLbTL[TLTTLMTLFTL?TL8TL1TL*TL#TLTLTLTLTLTLSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLSL{SLtSLmSLfSL_SLXSLQSLJSLCSLOL7OL0OL)OL"OLOLOL OLOLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLzNLsNLlNLeNL^NLWNLPNLINLBNL;NL4NL-NL&NLNLNLNL NLNLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLML~MLwMLpMLiMLbML[MLTMLMMLFML?ML8ML1ML*ML#MLMLMLMLMLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL{LLtLLmLLfLL_LLXLLQLLJLLCLLHL7HL0HL)HL"HLHLHL HLHLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLzGLsGLlGLeGL^GLWGLPGLIGLBGL;GL4GL-GL&GLGLGLGL GLGLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFL~FLwFLpFLiFLbFL[FLTFLMFLFFL?FL8FL1FL*FL#FLFLFLFLFLFLELELELELELELELELELELELELELELELELELEL{ELtELmELfEL_ELXELQELJELCELAL7AL0AL)AL"ALALAL ALAL@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@Lz@Ls@Ll@Le@L^@LW@LP@LI@LB@L;@L4@L-@L&@L@L@L@L @L@L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L~?Lw?Lp?Li?Lb?L[?LT?LM?LF?L??L8?L1?L*?L#?L?L?L?L?L?L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L{>Lt>Lm>Lf>L_>LX>LQ>LJ>LC>L<>L5>L.>L'>L >L>L>L >L>L=L=L=L=L=L=L=L=L=L=L=L=L=L=L=L=L=L=L=Lx=Lq=Lj=Lc=L\=LU=LN=LG=L@=L9=L2=L+=L$=L=L=L=L=L=L:L7:L0:L):L":L:L:L :L:L9L9L9L9L9L9L9L9L9L9L9L9L9L9L9L9L9L9L9Lz9Ls9Ll9Le9L^9LW9LP9LI9LB9L;9L49L-9L&9L9L9L9L 9L9L8L8L8L8L8L8L8L8L8L8L8L8L8L8L8L8L8L8L~8Lw8Lp8Li8Lb8L[8LT8LM8LF8L?8L88L18L*8L#8L8L8L8L8L8L7L7L7L7L7L7L7L7L7L7L7L7L7L7L7L7L7L7L{7Lt7Lm7Lf7L_7LX7LQ7LJ7LC7L<7L57L.7L'7L 7L7L7L 7L7L6L6L6L6L6L6L6L6L6L6L6L6L6L6L6L6L6L6L6Lx6Lq6Lj6Lc6L\6LU6LN6LG6L@6L96L26L+6L$6L6L6L6L6L6L5L5L5L5L5L5L5L5L5L5L5L5L5L5L5L5L5L5L|5Lu5Ln5Lg5L`5LY5LR5LK5LD5L=5L65L/5L(5L!5L5L5L 5L5L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4Ly4Lr4Lk4Ld4L]4LV4LO4LH4LA4L:4L34L,4L%4L4L4L4L 4L4L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L}3Lv3Lo3Lh3La3LZ3LS3LL3LE3L>3L73L03L)3L"3L3L3L 3L3L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2Lz2Ls2Ll2Le2L^2LW2LP2LI2LB2L;2L42L-2L&2L2L2L2L 2L2L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L~1Lw1Lp1Li1Lb1L[1LT1LM1LF1L?1L81L11L*1L#1L1L1L1L1L1L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L{0Lt0Lm0Lf0L_0LX0LQ0LJ0LC0L<0L50L.0L'0L 0L0L0L 0L0L/L/L/L/L/L/L/L/L/L/L/L/L/L/L/L/L/L/L/Lx/Lq/Lj/Lc/L\/LU/LN/LG/L@/L9/L2/L+/L$/L/L/L/L/L/L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L|.Lu.Ln.Lg.L`.LY.LR.LK.LD.L=.L6.L/.L(.L!.L.L.L .L.L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-Ly-Lr-Lk-Ld-L]-LV-LO-LH-LA-L:-L3-L,-L%-L-L-L-L -L-L,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L},Lv,Lo,Lh,La,LZ,LS,LL,LE,L>,L7,L0,L),L",L,L,L ,L,L+L+L+L+L+L+L+L+L+L+L+L+L+L+L+L+L+L+L+Lz+Ls+Ll+Le+L^+LW+LP+LI+LB+L;+L4+L-+L&+L+L+L+L +L+L*L*L*L*L*L*L*L*L*L*L*L*L*L*L*L*L*L*L~*Lw*Lp*Li*Lb*L[*LT*LM*LF*L?*L8*L1*L**L#*L*L*L*L*L*L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L{)Lt)Lm)Lf)L_)LX)LQ)LJ)LC)L<)L5)L.)L')L )L)L)L )L)L(L(L(L(L(L(L(L(L(L(L(L(L(L(L(L(L(L(L(Lx(Lq(Lj(Lc(L\(LU(LN(LG(L@(L9(L2(L+(L$(L(L(L(L(L(L'L'L'L'L'L'L'L'L'L'L'L'L'L'L'L'L'L'L|'Lu'Ln'Lg'L`'LY'LR'LK'LD'L='L6'L/'L('L!'L'L'L 'L'L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&Ly&Lr&Lk&Ld&L]&LV&LO&LH&LA&L:&L3&L,&L%&L&L&L&L &L&L%L%L%L%L%L%L%L%L%L%L%L%L%L%L%L%L%L%L}%Lv%Lo%Lh%La%LZ%LS%LL%LE%L>%L7%L0%L)%L"%L%L%L %L%L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$Lz$Ls$Ll$Le$L^$LW$LP$LI$LB$L;$L4$L-$L&$L$L$L$L $L$L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L~#Lw#Lp#Li#Lb#L[#LT#LM#LF#L?#L8#L1#L*#L##L#L#L#L#L#L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L{"Lt"Lm"Lf"L_"LX"LQ"LJ"LC"L<"L5"L."L'"L "L"L"L "L"L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!Lx!Lq!Lj!Lc!L\!LU!LN!LG!L@!L9!L2!L+!L$!L!L!L!L!L!L L L L L L L L L L L L L L L L L L L| Lu Ln Lg L` LY LR LK LD L= L6 L/ L( L! L L L L LLLLLLLLLLLLLLLLLLLLyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLLLLLLLLLLLLLLLLLLL}LvLoLhLaLZLSLLLEL>L7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCL<L5L.L'L LLL LLLLLLLLLLLLLLLLLLLLLxLqLjLcL\LULNLGL@L9L2L+L$LLLLLLLLLLLLLLLLLLLLLLLL|LuLnLgL`LYLRLKLDL=L6L/L(L!LLL LLLLLLLLLLLLLLLLLLLLLyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLLLLLLLLLLLLLLLLLLL}LvLoLhLaLZLSLLLEL>L7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCL<L5L.L'L LLL LLLLLLLLLLLLLLLLLLLLLxLqLjLcL\LULNLGL@L9L2L+L$LLLLLLLLLLLLLLLLLLLLLLLL|LuLnLgL`LYLRLKLDL=L6L/L(L!LLL LLLLLLLLLLLLLLLLLLLLLyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLLLLLLLLLLLLLLLLLLL}LvLoLhLaLZLSLLLEL>L7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLL L L L L L L L L L L L L L L L L L L{ Lt Lm Lf L_ LX LQ LJ LC L< L5 L. L' L L L L L L L L L L L L L L L L L L L L L L L L Lx Lq Lj Lc L\ LU LN LG L@ L9 L2 L+ L$ L L L L L L L L L L L L L L L L L L L L L L L L| Lu Ln Lg L` LY LR LK LD L= L6 L/ L( L! L L L L L L L L L L L L L L L L L L L L L L L Ly Lr Lk Ld L] LV LO LH LA L: L3 L, L% L L L L L L L L L L L L L L L L L L L L L L L L} Lv Lo Lh La LZ LS LL LE L> L7 L0 L) L" L L L L LLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCL<L5L.L'L LLL LLLLLLLLLLLLLLLLLLLLLxLqLjLcL\LULNLGL@L9L2L+L$LLLLLLLLLLLLLLLLLLLLLLLL|LuLnLgL`LYLRLKLDL=L6L/L(L!LLL LLLLLLLLLLLLLLLLLLLLLyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLLLLLLLLLLLLLLLLLLL}LvLoLhLaLZLSLLLEL>L7L0L)L"LLL LLLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKܻKջKλKǻKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKٺKҺK˺KĺKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKݹKֹKϹKȹKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKܴKմKδKǴKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKٳKҳK˳KijKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKݲKֲKϲKȲKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKܭKխKέKǭKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKK٬KҬKˬKĬKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKݫK֫KϫKȫKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKܦKզKΦKǦKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKK٥KҥK˥KĥKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKݤK֤KϤKȤKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKܟK՟KΟKǟKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKٞKҞK˞KĞKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKݝK֝KϝKȝKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKܘK՘KΘKǘKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKٗKҗK˗KėKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKݖK֖KϖKȖKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKKܑKՑKΑKǑKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKِKҐKːKĐKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKݏK֏KϏKȏKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKK܊KՊKΊKNJKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKىK҉KˉKĉKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKK݈KֈKψKȈKKKKKKKKKKK{KtKmKfK_KXKQKJKCKK7K0K)K"KKK KKKKKKK܃KՃK΃KǃKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKقK҂K˂KĂKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKK݁KցKρKȁKKKKKKKKKKK{KtKmKfK_KXKQKJKCK}K7}K0}K)}K"}K}K}K }K}K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|K|Kz|Ks|Kl|Ke|K^|KW|KP|KI|KB|K;|K4|K-|K&|K|K|K|K |K|K{K{K{K{K{K{K{K{K{K{K{K{K{K{K{K{K{K{K~{Kw{Kp{Ki{Kb{K[{KT{KM{KF{K?{K8{K1{K*{K#{K{K{K{K{K{KzKzKzKzKzKzKzKzKzKzKzKzKzKzKzKzKzKzK{zKtzKmzKfzK_zKXzKQzKJzKCzKvK7vK0vK)vK"vKvKvK vKvKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKuKzuKsuKluKeuK^uKWuKPuKIuKBuK;uK4uK-uK&uKuKuKuK uKuKtKtKtKtKtKtKtKtKtKtKtKtKtKtKtKtKtKtK~tKwtKptKitKbtK[tKTtKMtKFtK?tK8tK1tK*tK#tKtKtKtKtKtKsKsKsKsKsKsKsKsKsKsKsKsKsKsKsKsKsKsK{sKtsKmsKfsK_sKXsKQsKJsKCsKoK7oK0oK)oK"oKoKoK oKoKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKznKsnKlnKenK^nKWnKPnKInKBnK;nK4nK-nK&nKnKnKnK nKnKmKmKmKmKmKmKmKmKmKmKmKmKmKmKmKmKmKmK~mKwmKpmKimKbmK[mKTmKMmKFmK?mK8mK1mK*mK#mKmKmKmKmKmKlKlKlKlKlKlKlKlKlKlKlKlKlKlKlKlKlKlK{lKtlKmlKflK_lKXlKQlKJlKClKhK7hK0hK)hK"hKhKhK hKhKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKgKzgKsgKlgKegK^gKWgKPgKIgKBgK;gK4gK-gK&gKgKgKgK gKgKfKfKfKfKfKfKfKfKfKfKfKfKfKfKfKfKfKfK~fKwfKpfKifKbfK[fKTfKMfKFfK?fK8fK1fK*fK#fKfKfKfKfKfKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeK{eKteKmeKfeK_eKXeKQeKJeKCeKaK7aK0aK)aK"aKaKaK aKaK`K`K`K`K`K`K`K`K`K`K`K`K`K`K`K`K`K`K`Kz`Ks`Kl`Ke`K^`KW`KP`KI`KB`K;`K4`K-`K&`K`K`K`K `K`K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K~_Kw_Kp_Ki_Kb_K[_KT_KM_KF_K?_K8_K1_K*_K#_K_K_K_K_K_K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K{^Kt^Km^Kf^K_^KX^KQ^KJ^KC^K<^K5^K.^K'^K ^K^K^K ^K^K]K]K]K]K]K]K]K]K]K]K]K]K]K]K]K]K]K]K]Kx]Kq]Kj]Kc]K\]KU]KN]KG]K@]K9]K2]K+]K$]K]K]K]K]K]K\K\K\K\K\K\K\K\K\K\K\K\K\K\K\K\K\K\K|\Ku\Kn\Kg\K`\KY\KR\KK\KD\K=\K6\K/\K(\K!\K\K\K \K\K[K[K[K[K[K[K[K[K[K[K[K[K[K[K[K[K[K[K[Ky[Kr[Kk[Kd[K][KV[KO[KH[KA[K:[K3[K,[K%[K[K[K[K [K[KZKZKZKZKZKZKZKZKZKZKZKZKZKZKZKZKZKZK}ZKvZKoZKhZKaZKZZKSZKLZKEZK>ZK7ZK0ZK)ZK"ZKZKZK ZKZKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKYKzYKsYKlYKeYK^YKWYKPYKIYKBYK;YK4YK-YK&YKYKYKYK YKYKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK~XKwXKpXKiXKbXK[XKTXKMXKFXK?XK8XK1XK*XK#XKXKXKXKXKXKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK{WKtWKmWKfWK_WKXWKQWKJWKCWKSK7SK0SK)SK"SKSKSK SKSKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKRKzRKsRKlRKeRK^RKWRKPRKIRKBRK;RK4RK-RK&RKRKRKRK RKRKQKQKQKQKQKQKQKQKQKQKQKQKQKQKQKQKQKQK~QKwQKpQKiQKbQK[QKTQKMQKFQK?QK8QK1QK*QK#QKQKQKQKQKQKPKPKPKPKPKPKPKPKPKPKPKPKPKPKPKPKPKPK{PKtPKmPKfPK_PKXPKQPKJPKCPKLK7LK0LK)LK"LKLKLK LKLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKzKKsKKlKKeKK^KKWKKPKKIKKBKK;KK4KK-KK&KKKKKKKK KKKKJKJKJKJKJKJKJKJKJKJKJKJKJKJKJKJKJKJK~JKwJKpJKiJKbJK[JKTJKMJKFJK?JK8JK1JK*JK#JKJKJKJKJKJKIKIKIKIKIKIKIKIKIKIKIKIKIKIKIKIKIKIK{IKtIKmIKfIK_IKXIKQIKJIKCIKEK7EK0EK)EK"EKEKEK EKEKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKzDKsDKlDKeDK^DKWDKPDKIDKBDK;DK4DK-DK&DKDKDKDK DKDKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCK~CKwCKpCKiCKbCK[CKTCKMCKFCK?CK8CK1CK*CK#CKCKCKCKCKCKBKBKBKBKBKBKBKBKBKBKBKBKBKBKBKBKBKBK{BKtBKmBKfBK_BKXBKQBKJBKCBKK>K>K>K>K>K>K>K>K>K>K>K>K>K>K>K>K>K}>Kv>Ko>Kh>Ka>KZ>KS>KL>KE>K>>K7>K0>K)>K">K>K>K >K>K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=Kz=Ks=Kl=Ke=K^=KW=KP=KI=KB=K;=K4=K-=K&=K=K=K=K =K=K7K77K07K)7K"7K7K7K 7K7K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6Kz6Ks6Kl6Ke6K^6KW6KP6KI6KB6K;6K46K-6K&6K6K6K6K 6K6K5K5K5K5K5K5K5K5K5K5K5K5K5K5K5K5K5K5K~5Kw5Kp5Ki5Kb5K[5KT5KM5KF5K?5K85K15K*5K#5K5K5K5K5K5K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K{4Kt4Km4Kf4K_4KX4KQ4KJ4KC4K<4K54K.4K'4K 4K4K4K 4K4K3K3K3K3K3K3K3K3K3K3K3K3K3K3K3K3K3K3K3Kx3Kq3Kj3Kc3K\3KU3KN3KG3K@3K93K23K+3K$3K3K3K3K3K3K2K2K2K2K2K2K2K2K2K2K2K2K2K2K2K2K2K2K|2Ku2Kn2Kg2K`2KY2KR2KK2KD2K=2K62K/2K(2K!2K2K2K 2K2K1K1K1K1K1K1K1K1K1K1K1K1K1K1K1K1K1K1K1Ky1Kr1Kk1Kd1K]1KV1KO1KH1KA1K:1K31K,1K%1K1K1K1K 1K1K0K0K0K0K0K0K0K0K0K0K0K0K0K0K0K0K0K0K}0Kv0Ko0Kh0Ka0KZ0KS0KL0KE0K>0K70K00K)0K"0K0K0K 0K0K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/Kz/Ks/Kl/Ke/K^/KW/KP/KI/KB/K;/K4/K-/K&/K/K/K/K /K/K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K~.Kw.Kp.Ki.Kb.K[.KT.KM.KF.K?.K8.K1.K*.K#.K.K.K.K.K.K-K-K-K-K-K-K-K-K-K-K-K-K-K-K-K-K-K-K{-Kt-Km-Kf-K_-KX-KQ-KJ-KC-K<-K5-K.-K'-K -K-K-K -K-K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,Kx,Kq,Kj,Kc,K\,KU,KN,KG,K@,K9,K2,K+,K$,K,K,K,K,K,K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K|+Ku+Kn+Kg+K`+KY+KR+KK+KD+K=+K6+K/+K(+K!+K+K+K +K+K*K*K*K*K*K*K*K*K*K*K*K*K*K*K*K*K*K*K*Ky*Kr*Kk*Kd*K]*KV*KO*KH*KA*K:*K3*K,*K%*K*K*K*K *K*K)K)K)K)K)K)K)K)K)K)K)K)K)K)K)K)K)K)K})Kv)Ko)Kh)Ka)KZ)KS)KL)KE)K>)K7)K0)K))K")K)K)K )K)K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(Kz(Ks(Kl(Ke(K^(KW(KP(KI(KB(K;(K4(K-(K&(K(K(K(K (K(K'K'K'K'K'K'K'K'K'K'K'K'K'K'K'K'K'K'K~'Kw'Kp'Ki'Kb'K['KT'KM'KF'K?'K8'K1'K*'K#'K'K'K'K'K'K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K{&Kt&Km&Kf&K_&KX&KQ&KJ&KC&K<&K5&K.&K'&K &K&K&K &K&K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%K%Kx%Kq%Kj%Kc%K\%KU%KN%KG%K@%K9%K2%K+%K$%K%K%K%K%K%K$K$K$K$K$K$K$K$K$K$K$K$K$K$K$K$K$K$K|$Ku$Kn$Kg$K`$KY$KR$KK$KD$K=$K6$K/$K($K!$K$K$K $K$K#K#K#K#K#K#K#K#K#K#K#K#K#K#K#K#K#K#K#Ky#Kr#Kk#Kd#K]#KV#KO#KH#KA#K:#K3#K,#K%#K#K#K#K #K#K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K}"Kv"Ko"Kh"Ka"KZ"KS"KL"KE"K>"K7"K0"K)"K""K"K"K "K"K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!Kz!Ks!Kl!Ke!K^!KW!KP!KI!KB!K;!K4!K-!K&!K!K!K!K !K!K K K K K K K K K K K K K K K K K K K~ Kw Kp Ki Kb K[ KT KM KF K? K8 K1 K* K# K K K K K KKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCK<K5K.K'K KKK KKKKKKKKKKKKKKKKKKKKKxKqKjKcK\KUKNKGK@K9K2K+K$KKKKKKKKKKKKKKKKKKKKKKKK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKKKKKKKKKKKKKKKKKKKKyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KKKKKKKKKKKKKKKKKKKK}KvKoKhKaKZKSKLKEK>K7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCK<K5K.K'K KKK KKKKKKKKKKKKKKKKKKKKKxKqKjKcK\KUKNKGK@K9K2K+K$KKKKKKKKKKKKKKKKKKKKKKKK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKKKKKKKKKKKKKKKKKKKKyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KKKKKKKKKKKKKKKKKKKK}KvKoKhKaKZKSKLKEK>K7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCK<K5K.K'K KKK KKKKKKKKKKKKKKKKKKKKKxKqKjKcK\KUKNKGK@K9K2K+K$KKKKKKKKKKKKKKKKKKKKKKKK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKKKKKKKKKKKKKKKKKKKKyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KK K K K K K K K K K K K K K K K K K K} Kv Ko Kh Ka KZ KS KL KE K> K7 K0 K) K" K K K K K K K K K K K K K K K K K K K K K K K Kz Ks Kl Ke K^ KW KP KI KB K; K4 K- K& K K K K K K K K K K K K K K K K K K K K K K K K~ Kw Kp Ki Kb K[ KT KM KF K? K8 K1 K* K# K K K K K K K K K K K K K K K K K K K K K K K K{ Kt Km Kf K_ KX KQ KJ KC K< K5 K. K' K K K K K K K K K K K K K K K K K K K K K K K K Kx Kq Kj Kc K\ KU KN KG K@ K9 K2 K+ K$ K K K K K KKKKKKKKKKKKKKKKKKK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKKKKKKKKKKKKKKKKKKKKyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KKKKKKKKKKKKKKKKKKKK}KvKoKhKaKZKSKLKEK>K7K0K)K"KKK KKKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCK<K5K.K'K KKK KKKKKKKKKKKKKKKKKKKKKxKqKjKcK\KUKNKGK@K9K2K+K$KKKKKKKKKKKKKKKKKKKKKKKK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKKKKKKKKKKKKKKKKKKKKyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KKJJJJJJJJJJJJJJJJJJ}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJܿJտJοJǿJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJپJҾJ˾JľJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJݽJֽJϽJȽJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJܸJոJθJǸJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJٷJҷJ˷JķJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJݶJֶJ϶JȶJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJܱJձJαJDZJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJٰJҰJ˰JİJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJݯJ֯JϯJȯJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJܪJժJΪJǪJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJ٩JҩJ˩JĩJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJݨJ֨JϨJȨJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJܣJգJΣJǣJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJ٢JҢJˢJĢJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJݡJ֡JϡJȡJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJܜJ՜JΜJǜJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJٛJқJ˛JěJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJݚJ֚JϚJȚJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJܕJՕJΕJǕJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJٔJҔJ˔JĔJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJݓJ֓JϓJȓJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJ܎JՎJΎJǎJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJٍJҍJˍJčJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJ݌J֌JόJȌJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJ܇JՇJ·JLJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJنJ҆JˆJĆJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJ݅JօJυJȅJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJJ7J0J)J"JJJ JJJJJJJ܀JՀJ΀JǀJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJ~J~J~J~J~J~J~J~J~J~J~J~J~J~J~J~J~J~J{~Jt~Jm~Jf~J_~JX~JQ~JJ~JC~J<~J5~J.~J'~J ~J~J~J ~J~J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}J}Jx}Jq}Jj}Jc}J\}JU}JN}JG}J@}J9}J2}J+}J$}J}J}J}J}J}J|J|J|J|J|J|J|J|J|J|J|J|J|J|J|J|J|J|J||Ju|Jn|Jg|J`|JY|JR|JK|JD|J=|J6|J/|J(|J!|J|J|J |J|J{J{J{J{J{J{J{J{J{J{J{J{J{J{J{J{J{J{J{Jy{Jr{Jk{Jd{J]{JV{JO{JH{JA{J:{J3{J,{J%{J{J{J{J {J{JzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJzJ}zJvzJozJhzJazJZzJSzJLzJEzJ>zJ7zJ0zJ)zJ"zJzJzJ zJzJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJzyJsyJlyJeyJ^yJWyJPyJIyJByJ;yJ4yJ-yJ&yJyJyJyJ yJyJxJxJxJxJxJxJxJxJxJxJxJxJxJxJxJxJxJxJ~xJwxJpxJixJbxJ[xJTxJMxJFxJ?xJ8xJ1xJ*xJ#xJxJxJxJxJxJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJ{wJtwJmwJfwJ_wJXwJQwJJwJCwJsJ7sJ0sJ)sJ"sJsJsJ sJsJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJzrJsrJlrJerJ^rJWrJPrJIrJBrJ;rJ4rJ-rJ&rJrJrJrJ rJrJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJ~qJwqJpqJiqJbqJ[qJTqJMqJFqJ?qJ8qJ1qJ*qJ#qJqJqJqJqJqJpJpJpJpJpJpJpJpJpJpJpJpJpJpJpJpJpJpJ{pJtpJmpJfpJ_pJXpJQpJJpJCpJlJ7lJ0lJ)lJ"lJlJlJ lJlJkJkJkJkJkJkJkJkJkJkJkJkJkJkJkJkJkJkJkJzkJskJlkJekJ^kJWkJPkJIkJBkJ;kJ4kJ-kJ&kJkJkJkJ kJkJjJjJjJjJjJjJjJjJjJjJjJjJjJjJjJjJjJjJ~jJwjJpjJijJbjJ[jJTjJMjJFjJ?jJ8jJ1jJ*jJ#jJjJjJjJjJjJiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJ{iJtiJmiJfiJ_iJXiJQiJJiJCiJeJ7eJ0eJ)eJ"eJeJeJ eJeJdJdJdJdJdJdJdJdJdJdJdJdJdJdJdJdJdJdJdJzdJsdJldJedJ^dJWdJPdJIdJBdJ;dJ4dJ-dJ&dJdJdJdJ dJdJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJ~cJwcJpcJicJbcJ[cJTcJMcJFcJ?cJ8cJ1cJ*cJ#cJcJcJcJcJcJbJbJbJbJbJbJbJbJbJbJbJbJbJbJbJbJbJbJ{bJtbJmbJfbJ_bJXbJQbJJbJCbJ^J7^J0^J)^J"^J^J^J ^J^J]J]J]J]J]J]J]J]J]J]J]J]J]J]J]J]J]J]J]Jz]Js]Jl]Je]J^]JW]JP]JI]JB]J;]J4]J-]J&]J]J]J]J ]J]J\J\J\J\J\J\J\J\J\J\J\J\J\J\J\J\J\J\J~\Jw\Jp\Ji\Jb\J[\JT\JM\JF\J?\J8\J1\J*\J#\J\J\J\J\J\J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J[J{[Jt[Jm[Jf[J_[JX[JQ[JJ[JC[J<[J5[J.[J'[J [J[J[J [J[JZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJxZJqZJjZJcZJ\ZJUZJNZJGZJ@ZJ9ZJ2ZJ+ZJ$ZJZJZJZJZJZJYJYJYJYJYJYJYJYJYJYJYJYJYJYJYJYJYJYJ|YJuYJnYJgYJ`YJYYJRYJKYJDYJ=YJ6YJ/YJ(YJ!YJYJYJ YJYJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJyXJrXJkXJdXJ]XJVXJOXJHXJAXJ:XJ3XJ,XJ%XJXJXJXJ XJXJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJWJ}WJvWJoWJhWJaWJZWJSWJLWJEWJ>WJ7WJ0WJ)WJ"WJWJWJ WJWJVJVJVJVJVJVJVJVJVJVJVJVJVJVJVJVJVJVJVJzVJsVJlVJeVJ^VJWVJPVJIVJBVJ;VJ4VJ-VJ&VJVJVJVJ VJVJUJUJUJUJUJUJUJUJUJUJUJUJUJUJUJUJUJUJ~UJwUJpUJiUJbUJ[UJTUJMUJFUJ?UJ8UJ1UJ*UJ#UJUJUJUJUJUJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJ{TJtTJmTJfTJ_TJXTJQTJJTJCTJPJ7PJ0PJ)PJ"PJPJPJ PJPJOJOJOJOJOJOJOJOJOJOJOJOJOJOJOJOJOJOJOJzOJsOJlOJeOJ^OJWOJPOJIOJBOJ;OJ4OJ-OJ&OJOJOJOJ OJOJNJNJNJNJNJNJNJNJNJNJNJNJNJNJNJNJNJNJ~NJwNJpNJiNJbNJ[NJTNJMNJFNJ?NJ8NJ1NJ*NJ#NJNJNJNJNJNJMJMJMJMJMJMJMJMJMJMJMJMJMJMJMJMJMJMJ{MJtMJmMJfMJ_MJXMJQMJJMJCMJIJ7IJ0IJ)IJ"IJIJIJ IJIJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJzHJsHJlHJeHJ^HJWHJPHJIHJBHJ;HJ4HJ-HJ&HJHJHJHJ HJHJGJGJGJGJGJGJGJGJGJGJGJGJGJGJGJGJGJGJ~GJwGJpGJiGJbGJ[GJTGJMGJFGJ?GJ8GJ1GJ*GJ#GJGJGJGJGJGJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJ{FJtFJmFJfFJ_FJXFJQFJJFJCFJBJ7BJ0BJ)BJ"BJBJBJ BJBJAJAJAJAJAJAJAJAJAJAJAJAJAJAJAJAJAJAJAJzAJsAJlAJeAJ^AJWAJPAJIAJBAJ;AJ4AJ-AJ&AJAJAJAJ AJAJ@J@J@J@J@J@J@J@J@J@J@J@J@J@J@J@J@J@J~@Jw@Jp@Ji@Jb@J[@JT@JM@JF@J?@J8@J1@J*@J#@J@J@J@J@J@J?J?J?J?J?J?J?J?J?J?J?J?J?J?J?J?J?J?J{?Jt?Jm?Jf?J_?JX?JQ?JJ?JC?JJ>J>J>J>J>J>J>J>J>J>J>J>J>J>J>J>J>J>Jx>Jq>Jj>Jc>J\>JU>JN>JG>J@>J9>J2>J+>J$>J>J>J>J>J>J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J|=Ju=Jn=Jg=J`=JY=JR=JK=JD=J==J6=J/=J(=J!=J=J=J =J=J;J7;J0;J);J";J;J;J ;J;J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:Jz:Js:Jl:Je:J^:JW:JP:JI:JB:J;:J4:J-:J&:J:J:J:J :J:J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J~9Jw9Jp9Ji9Jb9J[9JT9JM9JF9J?9J89J19J*9J#9J9J9J9J9J9J8J8J8J8J8J8J8J8J8J8J8J8J8J8J8J8J8J8J{8Jt8Jm8Jf8J_8JX8JQ8JJ8JC8J<8J58J.8J'8J 8J8J8J 8J8J7J7J7J7J7J7J7J7J7J7J7J7J7J7J7J7J7J7J7Jx7Jq7Jj7Jc7J\7JU7JN7JG7J@7J97J27J+7J$7J7J7J7J7J7J6J6J6J6J6J6J6J6J6J6J6J6J6J6J6J6J6J6J|6Ju6Jn6Jg6J`6JY6JR6JK6JD6J=6J66J/6J(6J!6J6J6J 6J6J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5Jy5Jr5Jk5Jd5J]5JV5JO5JH5JA5J:5J35J,5J%5J5J5J5J 5J5J4J4J4J4J4J4J4J4J4J4J4J4J4J4J4J4J4J4J}4Jv4Jo4Jh4Ja4JZ4JS4JL4JE4J>4J74J04J)4J"4J4J4J 4J4J3J3J3J3J3J3J3J3J3J3J3J3J3J3J3J3J3J3J3Jz3Js3Jl3Je3J^3JW3JP3JI3JB3J;3J43J-3J&3J3J3J3J 3J3J2J2J2J2J2J2J2J2J2J2J2J2J2J2J2J2J2J2J~2Jw2Jp2Ji2Jb2J[2JT2JM2JF2J?2J82J12J*2J#2J2J2J2J2J2J1J1J1J1J1J1J1J1J1J1J1J1J1J1J1J1J1J1J{1Jt1Jm1Jf1J_1JX1JQ1JJ1JC1J<1J51J.1J'1J 1J1J1J 1J1J0J0J0J0J0J0J0J0J0J0J0J0J0J0J0J0J0J0J0Jx0Jq0Jj0Jc0J\0JU0JN0JG0J@0J90J20J+0J$0J0J0J0J0J0J/J/J/J/J/J/J/J/J/J/J/J/J/J/J/J/J/J/J|/Ju/Jn/Jg/J`/JY/JR/JK/JD/J=/J6/J//J(/J!/J/J/J /J/J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.Jy.Jr.Jk.Jd.J].JV.JO.JH.JA.J:.J3.J,.J%.J.J.J.J .J.J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J}-Jv-Jo-Jh-Ja-JZ-JS-JL-JE-J>-J7-J0-J)-J"-J-J-J -J-J,J,J,J,J,J,J,J,J,J,J,J,J,J,J,J,J,J,J,Jz,Js,Jl,Je,J^,JW,JP,JI,JB,J;,J4,J-,J&,J,J,J,J ,J,J+J+J+J+J+J+J+J+J+J+J+J+J+J+J+J+J+J+J~+Jw+Jp+Ji+Jb+J[+JT+JM+JF+J?+J8+J1+J*+J#+J+J+J+J+J+J*J*J*J*J*J*J*J*J*J*J*J*J*J*J*J*J*J*J{*Jt*Jm*Jf*J_*JX*JQ*JJ*JC*J<*J5*J.*J'*J *J*J*J *J*J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)Jx)Jq)Jj)Jc)J\)JU)JN)JG)J@)J9)J2)J+)J$)J)J)J)J)J)J(J(J(J(J(J(J(J(J(J(J(J(J(J(J(J(J(J(J|(Ju(Jn(Jg(J`(JY(JR(JK(JD(J=(J6(J/(J((J!(J(J(J (J(J'J'J'J'J'J'J'J'J'J'J'J'J'J'J'J'J'J'J'Jy'Jr'Jk'Jd'J]'JV'JO'JH'JA'J:'J3'J,'J%'J'J'J'J 'J'J&J&J&J&J&J&J&J&J&J&J&J&J&J&J&J&J&J&J}&Jv&Jo&Jh&Ja&JZ&JS&JL&JE&J>&J7&J0&J)&J"&J&J&J &J&J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%J%Jz%Js%Jl%Je%J^%JW%JP%JI%JB%J;%J4%J-%J&%J%J%J%J %J%J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J~$Jw$Jp$Ji$Jb$J[$JT$JM$JF$J?$J8$J1$J*$J#$J$J$J$J$J$J#J#J#J#J#J#J#J#J#J#J#J#J#J#J#J#J#J#J{#Jt#Jm#Jf#J_#JX#JQ#JJ#JC#J<#J5#J.#J'#J #J#J#J #J#J"J"J"J"J"J"J"J"J"J"J"J"J"J"J"J"J"J"J"Jx"Jq"Jj"Jc"J\"JU"JN"JG"J@"J9"J2"J+"J$"J"J"J"J"J"J!J!J!J!J!J!J!J!J!J!J!J!J!J!J!J!J!J!J|!Ju!Jn!Jg!J`!JY!JR!JK!JD!J=!J6!J/!J(!J!!J!J!J !J!J J J J J J J J J J J J J J J J J J J Jy Jr Jk Jd J] JV JO JH JA J: J3 J, J% J J J J J JJJJJJJJJJJJJJJJJJJ}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJJJJJJJJJJJJJJJJJJJJxJqJjJcJ\JUJNJGJ@J9J2J+J$JJJJJJJJJJJJJJJJJJJJJJJJ|JuJnJgJ`JYJRJKJDJ=J6J/J(J!JJJ JJJJJJJJJJJJJJJJJJJJJyJrJkJdJ]JVJOJHJAJ:J3J,J%JJJJ JJJJJJJJJJJJJJJJJJJJ}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJJJJJJJJJJJJJJJJJJJJxJqJjJcJ\JUJNJGJ@J9J2J+J$JJJJJJJJJJJJJJJJJJJJJJJJ|JuJnJgJ`JYJRJKJDJ=J6J/J(J!JJJ JJJJJJJJJJJJJJJJJJJJJyJrJkJdJ]JVJOJHJAJ:J3J,J%JJJJ JJJJJJJJJJJJJJJJJJJJ}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJ J J J J J J J J J J J J J J J J J J Jx Jq Jj Jc J\ JU JN JG J@ J9 J2 J+ J$ J J J J J J J J J J J J J J J J J J J J J J J J| Ju Jn Jg J` JY JR JK JD J= J6 J/ J( J! J J J J J J J J J J J J J J J J J J J J J J J Jy Jr Jk Jd J] JV JO JH JA J: J3 J, J% J J J J J J J J J J J J J J J J J J J J J J J J} Jv Jo Jh Ja JZ JS JL JE J> J7 J0 J) J" J J J J J J J J J J J J J J J J J J J J J J J Jz Js Jl Je J^ JW JP JI JB J; J4 J- J& J J J J J JJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJJJJJJJJJJJJJJJJJJJJxJqJjJcJ\JUJNJGJ@J9J2J+J$JJJJJJJJJJJJJJJJJJJJJJJJ|JuJnJgJ`JYJRJKJDJ=J6J/J(J!JJJ JJJJJJJJJJJJJJJJJJJJJyJrJkJdJ]JVJOJHJAJ:J3J,J%JJJJ JJJJJJJJJJJJJJJJJJJJ}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJIIIIIIIIIIIIIIIIIIIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIIIIIIIIIIIIIIIIIII|IuInIgI`IYIRIKIDI=I6I/I(I!III IIIIIIIIIIIIIIIIIIIIIyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIIIIIIIIIIIIIIIIIII}IvIoIhIaIZISILIEI>I7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIܼIռIμIǼIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIٻIһI˻IĻIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIݺIֺIϺIȺIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIܵIյIεIǵIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIٴIҴI˴IĴIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIݳIֳIϳIȳIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIܮIծIήIǮIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIII٭IҭI˭IĭIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIݬI֬IϬIȬIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIܧIէIΧIǧIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIII٦IҦI˦IĦIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIݥI֥IϥIȥIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIܠIՠIΠIǠIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIٟIҟI˟IğIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIݞI֞IϞIȞIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIܙIՙIΙIǙIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIII٘IҘI˘IĘIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIݗI֗IϗIȗIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIIIܒIՒIΒIǒIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIّIґIˑIđIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIݐI֐IϐIȐIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIII܋IՋI΋INjIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIيIҊIˊIĊIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIII݉I։IωIȉIIIIIIIIIII{ItImIfI_IXIQIJICII7I0I)I"III IIIIIII܄IՄI΄IDŽIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIكI҃I˃IăIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIII݂IւIςIȂIIIIIIIIIII{ItImIfI_IXIQIJICI~I7~I0~I)~I"~I~I~I ~I~I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}Iz}Is}Il}Ie}I^}IW}IP}II}IB}I;}I4}I-}I&}I}I}I}I }I}I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I~|Iw|Ip|Ii|Ib|I[|IT|IM|IF|I?|I8|I1|I*|I#|I|I|I|I|I|I{I{I{I{I{I{I{I{I{I{I{I{I{I{I{I{I{I{I{{It{Im{If{I_{IX{IQ{IJ{IC{I<{I5{I.{I'{I {I{I{I {I{IzIzIzIzIzIzIzIzIzIzIzIzIzIzIzIzIzIzIzIxzIqzIjzIczI\zIUzINzIGzI@zI9zI2zI+zI$zIzIzIzIzIzIyIyIyIyIyIyIyIyIyIyIyIyIyIyIyIyIyIyI|yIuyInyIgyI`yIYyIRyIKyIDyI=yI6yI/yI(yI!yIyIyI yIyIxIxIxIxIxIxIxIxIxIxIxIxIxIxIxIxIxIxIxIyxIrxIkxIdxI]xIVxIOxIHxIAxI:xI3xI,xI%xIxIxIxI xIxIwIwIwIwIwIwIwIwIwIwIwIwIwIwIwIwIwIwI}wIvwIowIhwIawIZwISwILwIEwI>wI7wI0wI)wI"wIwIwI wIwIvIvIvIvIvIvIvIvIvIvIvIvIvIvIvIvIvIvIvIzvIsvIlvIevI^vIWvIPvIIvIBvI;vI4vI-vI&vIvIvIvI vIvIuIuIuIuIuIuIuIuIuIuIuIuIuIuIuIuIuIuI~uIwuIpuIiuIbuI[uITuIMuIFuI?uI8uI1uI*uI#uIuIuIuIuIuItItItItItItItItItItItItItItItItItItI{tIttImtIftI_tIXtIQtIJtICtIpI7pI0pI)pI"pIpIpI pIpIoIoIoIoIoIoIoIoIoIoIoIoIoIoIoIoIoIoIoIzoIsoIloIeoI^oIWoIPoIIoIBoI;oI4oI-oI&oIoIoIoI oIoInInInInInInInInInInInInInInInInInInI~nIwnIpnIinIbnI[nITnIMnIFnI?nI8nI1nI*nI#nInInInInInImImImImImImImImImImImImImImImImImImI{mItmImmIfmI_mIXmIQmIJmICmIiI7iI0iI)iI"iIiIiI iIiIhIhIhIhIhIhIhIhIhIhIhIhIhIhIhIhIhIhIhIzhIshIlhIehI^hIWhIPhIIhIBhI;hI4hI-hI&hIhIhIhI hIhIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgI~gIwgIpgIigIbgI[gITgIMgIFgI?gI8gI1gI*gI#gIgIgIgIgIgIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfIfI{fItfImfIffI_fIXfIQfIJfICfIbI7bI0bI)bI"bIbIbI bIbIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIaIzaIsaIlaIeaI^aIWaIPaIIaIBaI;aI4aI-aI&aIaIaIaI aIaI`I`I`I`I`I`I`I`I`I`I`I`I`I`I`I`I`I`I~`Iw`Ip`Ii`Ib`I[`IT`IM`IF`I?`I8`I1`I*`I#`I`I`I`I`I`I_I_I_I_I_I_I_I_I_I_I_I_I_I_I_I_I_I_I{_It_Im_If_I__IX_IQ_IJ_IC_I<_I5_I._I'_I _I_I_I _I_I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^Ix^Iq^Ij^Ic^I\^IU^IN^IG^I@^I9^I2^I+^I$^I^I^I^I^I^I]I]I]I]I]I]I]I]I]I]I]I]I]I]I]I]I]I]I|]Iu]In]Ig]I`]IY]IR]IK]ID]I=]I6]I/]I(]I!]I]I]I ]I]I\I\I\I\I\I\I\I\I\I\I\I\I\I\I\I\I\I\I\Iy\Ir\Ik\Id\I]\IV\IO\IH\IA\I:\I3\I,\I%\I\I\I\I \I\I[I[I[I[I[I[I[I[I[I[I[I[I[I[I[I[I[I[I}[Iv[Io[Ih[Ia[IZ[IS[IL[IE[I>[I7[I0[I)[I"[I[I [I[IZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIzZIsZIlZIeZI^ZIWZIPZIIZIBZI;ZI4ZI-ZI&ZIZIZIZI ZIZIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYIYI~YIwYIpYIiYIbYI[YITYIMYIFYI?YI8YI1YI*YI#YIYIYIYIYIYIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXI{XItXImXIfXI_XIXXIQXIJXICXITI7TI0TI)TI"TITITI TITISISISISISISISISISISISISISISISISISISISIzSIsSIlSIeSI^SIWSIPSIISIBSI;SI4SI-SI&SISISISI SISIRIRIRIRIRIRIRIRIRIRIRIRIRIRIRIRIRIRI~RIwRIpRIiRIbRI[RITRIMRIFRI?RI8RI1RI*RI#RIRIRIRIRIRIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQIQI{QItQImQIfQI_QIXQIQQIJQICQIMI7MI0MI)MI"MIMIMI MIMILILILILILILILILILILILILILILILILILILILIzLIsLIlLIeLI^LIWLIPLIILIBLI;LI4LI-LI&LILILILI LILIKIKIKIKIKIKIKIKIKIKIKIKIKIKIKIKIKIKI~KIwKIpKIiKIbKI[KITKIMKIFKI?KI8KI1KI*KI#KIKIKIKIKIKIJIJIJIJIJIJIJIJIJIJIJIJIJIJIJIJIJIJI{JItJImJIfJI_JIXJIQJIJJICJIFI7FI0FI)FI"FIFIFI FIFIEIEIEIEIEIEIEIEIEIEIEIEIEIEIEIEIEIEIEIzEIsEIlEIeEI^EIWEIPEIIEIBEI;EI4EI-EI&EIEIEIEI EIEIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDI~DIwDIpDIiDIbDI[DITDIMDIFDI?DI8DI1DI*DI#DIDIDIDIDIDICICICICICICICICICICICICICICICICICICI{CItCImCIfCI_CIXCIQCIJCICCI?I7?I0?I)?I"?I?I?I ?I?I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>Iz>Is>Il>Ie>I^>IW>IP>II>IB>I;>I4>I->I&>I>I>I>I >I>I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I~=Iw=Ip=Ii=Ib=I[=IT=IM=IF=I?=I8=I1=I*=I#=I=I=I=I=I=I8I78I08I)8I"8I8I8I 8I8I7I7I7I7I7I7I7I7I7I7I7I7I7I7I7I7I7I7I7Iz7Is7Il7Ie7I^7IW7IP7II7IB7I;7I47I-7I&7I7I7I7I 7I7I6I6I6I6I6I6I6I6I6I6I6I6I6I6I6I6I6I6I~6Iw6Ip6Ii6Ib6I[6IT6IM6IF6I?6I86I16I*6I#6I6I6I6I6I6I5I5I5I5I5I5I5I5I5I5I5I5I5I5I5I5I5I5I{5It5Im5If5I_5IX5IQ5IJ5IC5I<5I55I.5I'5I 5I5I5I 5I5I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4Ix4Iq4Ij4Ic4I\4IU4IN4IG4I@4I94I24I+4I$4I4I4I4I4I4I3I3I3I3I3I3I3I3I3I3I3I3I3I3I3I3I3I3I|3Iu3In3Ig3I`3IY3IR3IK3ID3I=3I63I/3I(3I!3I3I3I 3I3I2I2I2I2I2I2I2I2I2I2I2I2I2I2I2I2I2I2I2Iy2Ir2Ik2Id2I]2IV2IO2IH2IA2I:2I32I,2I%2I2I2I2I 2I2I1I1I1I1I1I1I1I1I1I1I1I1I1I1I1I1I1I1I}1Iv1Io1Ih1Ia1IZ1IS1IL1IE1I>1I71I01I)1I"1I1I1I 1I1I0I0I0I0I0I0I0I0I0I0I0I0I0I0I0I0I0I0I0Iz0Is0Il0Ie0I^0IW0IP0II0IB0I;0I40I-0I&0I0I0I0I 0I0I/I/I/I/I/I/I/I/I/I/I/I/I/I/I/I/I/I/I~/Iw/Ip/Ii/Ib/I[/IT/IM/IF/I?/I8/I1/I*/I#/I/I/I/I/I/I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I{.It.Im.If.I_.IX.IQ.IJ.IC.I<.I5.I..I'.I .I.I.I .I.I-I-I-I-I-I-I-I-I-I-I-I-I-I-I-I-I-I-I-Ix-Iq-Ij-Ic-I\-IU-IN-IG-I@-I9-I2-I+-I$-I-I-I-I-I-I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I|,Iu,In,Ig,I`,IY,IR,IK,ID,I=,I6,I/,I(,I!,I,I,I ,I,I+I+I+I+I+I+I+I+I+I+I+I+I+I+I+I+I+I+I+Iy+Ir+Ik+Id+I]+IV+IO+IH+IA+I:+I3+I,+I%+I+I+I+I +I+I*I*I*I*I*I*I*I*I*I*I*I*I*I*I*I*I*I*I}*Iv*Io*Ih*Ia*IZ*IS*IL*IE*I>*I7*I0*I)*I"*I*I*I *I*I)I)I)I)I)I)I)I)I)I)I)I)I)I)I)I)I)I)I)Iz)Is)Il)Ie)I^)IW)IP)II)IB)I;)I4)I-)I&)I)I)I)I )I)I(I(I(I(I(I(I(I(I(I(I(I(I(I(I(I(I(I(I~(Iw(Ip(Ii(Ib(I[(IT(IM(IF(I?(I8(I1(I*(I#(I(I(I(I(I(I'I'I'I'I'I'I'I'I'I'I'I'I'I'I'I'I'I'I{'It'Im'If'I_'IX'IQ'IJ'IC'I<'I5'I.'I''I 'I'I'I 'I'I&I&I&I&I&I&I&I&I&I&I&I&I&I&I&I&I&I&I&Ix&Iq&Ij&Ic&I\&IU&IN&IG&I@&I9&I2&I+&I$&I&I&I&I&I&I%I%I%I%I%I%I%I%I%I%I%I%I%I%I%I%I%I%I|%Iu%In%Ig%I`%IY%IR%IK%ID%I=%I6%I/%I(%I!%I%I%I %I%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$Iy$Ir$Ik$Id$I]$IV$IO$IH$IA$I:$I3$I,$I%$I$I$I$I $I$I#I#I#I#I#I#I#I#I#I#I#I#I#I#I#I#I#I#I}#Iv#Io#Ih#Ia#IZ#IS#IL#IE#I>#I7#I0#I)#I"#I#I#I #I#I"I"I"I"I"I"I"I"I"I"I"I"I"I"I"I"I"I"I"Iz"Is"Il"Ie"I^"IW"IP"II"IB"I;"I4"I-"I&"I"I"I"I "I"I!I!I!I!I!I!I!I!I!I!I!I!I!I!I!I!I!I!I~!Iw!Ip!Ii!Ib!I[!IT!IM!IF!I?!I8!I1!I*!I#!I!I!I!I!I!I I I I I I I I I I I I I I I I I I I{ It Im If I_ IX IQ IJ IC I< I5 I. I' I I I I I IIIIIIIIIIIIIIIIIIIIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIIIIIIIIIIIIIIIIIII|IuInIgI`IYIRIKIDI=I6I/I(I!III IIIIIIIIIIIIIIIIIIIIIyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIIIIIIIIIIIIIIIIIII}IvIoIhIaIZISILIEI>I7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICI<I5I.I'I III IIIIIIIIIIIIIIIIIIIIIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIIIIIIIIIIIIIIIIIII|IuInIgI`IYIRIKIDI=I6I/I(I!III IIIIIIIIIIIIIIIIIIIIIyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIIIIIIIIIIIIIIIIIII}IvIoIhIaIZISILIEI>I7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICI<I5I.I'I III IIIIIIIIIIIIIIIIIIIIIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIIIIIIIIIIIIIIIIIII|IuInIgI`IYIRIKIDI=I6I/I(I!III IIIIIIIIIIIIIIIIIIIIIyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIIIIIIIIIIIIIIIIIII}IvIoIhIaIZISILIEI>I7I0I)I"III II I I I I I I I I I I I I I I I I I I Iz Is Il Ie I^ IW IP II IB I; I4 I- I& I I I I I I I I I I I I I I I I I I I I I I I I~ Iw Ip Ii Ib I[ IT IM IF I? I8 I1 I* I# I I I I I I I I I I I I I I I I I I I I I I I I{ It Im If I_ IX IQ IJ IC I< I5 I. I' I I I I I I I I I I I I I I I I I I I I I I I I Ix Iq Ij Ic I\ IU IN IG I@ I9 I2 I+ I$ I I I I I I I I I I I I I I I I I I I I I I I I| Iu In Ig I` IY IR IK ID I= I6 I/ I( I! I I I I IIIIIIIIIIIIIIIIIIIIyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIIIIIIIIIIIIIIIIIII}IvIoIhIaIZISILIEI>I7I0I)I"III IIIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICI<I5I.I'I III IIIIIIIIIIIIIIIIIIIIIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIIIIIIIIIIIIIIIIIII|IuInIgI`IYIRIKIDI=I6I/I(I!III IIIIIIIIIIIIIIIIIIIIIyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIIIIIIIIIIIIIIIIIII}IvIoIhIaIZISILIEI>I7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHٿHҿH˿HĿHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHݾH־HϾHȾHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHܹHչHιHǹHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHٸHҸH˸HĸHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHݷHַHϷHȷHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHܲHղHβHDzHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHٱHұH˱HıHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHݰHְHϰHȰHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHܫHիHΫHǫHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHH٪HҪH˪HĪHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHݩH֩HϩHȩHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHܤHդHΤHǤHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHH٣HңHˣHģHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHݢH֢HϢHȢHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHܝH՝HΝHǝHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHٜHҜH˜HĜHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHݛH֛HϛHțHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHHܖHՖHΖHǖHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHٕHҕH˕HĕHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHݔH֔HϔHȔHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHH܏HՏHΏHǏHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHَHҎHˎHĎHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHݍH֍HύHȍHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHH܈HՈHΈHLjHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHهH҇HˇHćHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHH݆HֆHφHȆHHHHHHHHHHH{HtHmHfH_HXHQHJHCHH7H0H)H"HHH HHHHHHH܁HՁH΁HǁHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHـHҀHˀHĀHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HH~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~Hx~Hq~Hj~Hc~H\~HU~HN~HG~H@~H9~H2~H+~H$~H~H~H~H~H~H}H}H}H}H}H}H}H}H}H}H}H}H}H}H}H}H}H}H|}Hu}Hn}Hg}H`}HY}HR}HK}HD}H=}H6}H/}H(}H!}H}H}H }H}H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|H|Hy|Hr|Hk|Hd|H]|HV|HO|HH|HA|H:|H3|H,|H%|H|H|H|H |H|H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H{H}{Hv{Ho{Hh{Ha{HZ{HS{HL{HE{H>{H7{H0{H){H"{H{H{H {H{HzHzHzHzHzHzHzHzHzHzHzHzHzHzHzHzHzHzHzHzzHszHlzHezH^zHWzHPzHIzHBzH;zH4zH-zH&zHzHzHzH zHzHyHyHyHyHyHyHyHyHyHyHyHyHyHyHyHyHyHyH~yHwyHpyHiyHbyH[yHTyHMyHFyH?yH8yH1yH*yH#yHyHyHyHyHyHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxH{xHtxHmxHfxH_xHXxHQxHJxHCxHtH7tH0tH)tH"tHtHtH tHtHsHsHsHsHsHsHsHsHsHsHsHsHsHsHsHsHsHsHsHzsHssHlsHesH^sHWsHPsHIsHBsH;sH4sH-sH&sHsHsHsH sHsHrHrHrHrHrHrHrHrHrHrHrHrHrHrHrHrHrHrH~rHwrHprHirHbrH[rHTrHMrHFrH?rH8rH1rH*rH#rHrHrHrHrHrHqHqHqHqHqHqHqHqHqHqHqHqHqHqHqHqHqHqH{qHtqHmqHfqH_qHXqHQqHJqHCqHmH7mH0mH)mH"mHmHmH mHmHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHzlHslHllHelH^lHWlHPlHIlHBlH;lH4lH-lH&lHlHlHlH lHlHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkH~kHwkHpkHikHbkH[kHTkHMkHFkH?kH8kH1kH*kH#kHkHkHkHkHkHjHjHjHjHjHjHjHjHjHjHjHjHjHjHjHjHjHjH{jHtjHmjHfjH_jHXjHQjHJjHCjHfH7fH0fH)fH"fHfHfH fHfHeHeHeHeHeHeHeHeHeHeHeHeHeHeHeHeHeHeHeHzeHseHleHeeH^eHWeHPeHIeHBeH;eH4eH-eH&eHeHeHeH eHeHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdH~dHwdHpdHidHbdH[dHTdHMdHFdH?dH8dH1dH*dH#dHdHdHdHdHdHcHcHcHcHcHcHcHcHcHcHcHcHcHcHcHcHcHcH{cHtcHmcHfcH_cHXcHQcHJcHCcH_H7_H0_H)_H"_H_H_H _H_H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^Hz^Hs^Hl^He^H^^HW^HP^HI^HB^H;^H4^H-^H&^H^H^H^H ^H^H]H]H]H]H]H]H]H]H]H]H]H]H]H]H]H]H]H]H~]Hw]Hp]Hi]Hb]H[]HT]HM]HF]H?]H8]H1]H*]H#]H]H]H]H]H]H\H\H\H\H\H\H\H\H\H\H\H\H\H\H\H\H\H\H{\Ht\Hm\Hf\H_\HX\HQ\HJ\HC\H<\H5\H.\H'\H \H\H\H \H\H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[Hx[Hq[Hj[Hc[H\[HU[HN[HG[H@[H9[H2[H+[H$[H[H[H[H[H[HZHZHZHZHZHZHZHZHZHZHZHZHZHZHZHZHZHZH|ZHuZHnZHgZH`ZHYZHRZHKZHDZH=ZH6ZH/ZH(ZH!ZHZHZH ZHZHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHyYHrYHkYHdYH]YHVYHOYHHYHAYH:YH3YH,YH%YHYHYHYH YHYHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXH}XHvXHoXHhXHaXHZXHSXHLXHEXH>XH7XH0XH)XH"XHXHXH XHXHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHzWHsWHlWHeWH^WHWWHPWHIWHBWH;WH4WH-WH&WHWHWHWH WHWHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVH~VHwVHpVHiVHbVH[VHTVHMVHFVH?VH8VH1VH*VH#VHVHVHVHVHVHUHUHUHUHUHUHUHUHUHUHUHUHUHUHUHUHUHUH{UHtUHmUHfUH_UHXUHQUHJUHCUHQH7QH0QH)QH"QHQHQH QHQHPHPHPHPHPHPHPHPHPHPHPHPHPHPHPHPHPHPHPHzPHsPHlPHePH^PHWPHPPHIPHBPH;PH4PH-PH&PHPHPHPH PHPHOHOHOHOHOHOHOHOHOHOHOHOHOHOHOHOHOHOH~OHwOHpOHiOHbOH[OHTOHMOHFOH?OH8OH1OH*OH#OHOHOHOHOHOHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNH{NHtNHmNHfNH_NHXNHQNHJNHCNHJH7JH0JH)JH"JHJHJH JHJHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHzIHsIHlIHeIH^IHWIHPIHIIHBIH;IH4IH-IH&IHIHIHIH IHIHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH~HHwHHpHHiHHbHH[HHTHHMHHFHH?HH8HH1HH*HH#HHHHHHHHHHHHGHGHGHGHGHGHGHGHGHGHGHGHGHGHGHGHGHGH{GHtGHmGHfGH_GHXGHQGHJGHCGHCH7CH0CH)CH"CHCHCH CHCHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHzBHsBHlBHeBH^BHWBHPBHIBHBBH;BH4BH-BH&BHBHBHBH BHBHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH~AHwAHpAHiAHbAH[AHTAHMAHFAH?AH8AH1AH*AH#AHAHAHAHAHAH@H@H@H@H@H@H@H@H@H@H@H@H@H@H@H@H@H@H{@Ht@Hm@Hf@H_@HX@HQ@HJ@HC@H<@H5@H.@H'@H @H@H@H @H@H?H?H?H?H?H?H?H?H?H?H?H?H?H?H?H?H?H?H?Hx?Hq?Hj?Hc?H\?HU?HN?HG?H@?H9?H2?H+?H$?H?H?H?H?H?H>H>H>H>H>H>H>H>H>H>H>H>H>H>H>H>H>H>H|>Hu>Hn>Hg>H`>HY>HR>HK>HD>H=>H6>H/>H(>H!>H>H>H >H>H=H=H=H=H=H=H=H=H=H=H=H=H=H=H=H=H=H=H=Hy=Hr=Hk=Hd=H]=HV=HO=HH=HA=H:=H3=H,=H%=H=H=H=H =H=H5H75H05H)5H"5H5H5H 5H5H4H4H4H4H4H4H4H4H4H4H4H4H4H4H4H4H4H4H4Hz4Hs4Hl4He4H^4HW4HP4HI4HB4H;4H44H-4H&4H4H4H4H 4H4H3H3H3H3H3H3H3H3H3H3H3H3H3H3H3H3H3H3H~3Hw3Hp3Hi3Hb3H[3HT3HM3HF3H?3H83H13H*3H#3H3H3H3H3H3H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H{2Ht2Hm2Hf2H_2HX2HQ2HJ2HC2H<2H52H.2H'2H 2H2H2H 2H2H1H1H1H1H1H1H1H1H1H1H1H1H1H1H1H1H1H1H1Hx1Hq1Hj1Hc1H\1HU1HN1HG1H@1H91H21H+1H$1H1H1H1H1H1H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H|0Hu0Hn0Hg0H`0HY0HR0HK0HD0H=0H60H/0H(0H!0H0H0H 0H0H/H/H/H/H/H/H/H/H/H/H/H/H/H/H/H/H/H/H/Hy/Hr/Hk/Hd/H]/HV/HO/HH/HA/H:/H3/H,/H%/H/H/H/H /H/H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H}.Hv.Ho.Hh.Ha.HZ.HS.HL.HE.H>.H7.H0.H).H".H.H.H .H.H-H-H-H-H-H-H-H-H-H-H-H-H-H-H-H-H-H-H-Hz-Hs-Hl-He-H^-HW-HP-HI-HB-H;-H4-H--H&-H-H-H-H -H-H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H~,Hw,Hp,Hi,Hb,H[,HT,HM,HF,H?,H8,H1,H*,H#,H,H,H,H,H,H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H{+Ht+Hm+Hf+H_+HX+HQ+HJ+HC+H<+H5+H.+H'+H +H+H+H +H+H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*Hx*Hq*Hj*Hc*H\*HU*HN*HG*H@*H9*H2*H+*H$*H*H*H*H*H*H)H)H)H)H)H)H)H)H)H)H)H)H)H)H)H)H)H)H|)Hu)Hn)Hg)H`)HY)HR)HK)HD)H=)H6)H/)H()H!)H)H)H )H)H(H(H(H(H(H(H(H(H(H(H(H(H(H(H(H(H(H(H(Hy(Hr(Hk(Hd(H](HV(HO(HH(HA(H:(H3(H,(H%(H(H(H(H (H(H'H'H'H'H'H'H'H'H'H'H'H'H'H'H'H'H'H'H}'Hv'Ho'Hh'Ha'HZ'HS'HL'HE'H>'H7'H0'H)'H"'H'H'H 'H'H&H&H&H&H&H&H&H&H&H&H&H&H&H&H&H&H&H&H&Hz&Hs&Hl&He&H^&HW&HP&HI&HB&H;&H4&H-&H&&H&H&H&H &H&H%H%H%H%H%H%H%H%H%H%H%H%H%H%H%H%H%H%H~%Hw%Hp%Hi%Hb%H[%HT%HM%HF%H?%H8%H1%H*%H#%H%H%H%H%H%H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H{$Ht$Hm$Hf$H_$HX$HQ$HJ$HC$H<$H5$H.$H'$H $H$H$H $H$H#H#H#H#H#H#H#H#H#H#H#H#H#H#H#H#H#H#H#Hx#Hq#Hj#Hc#H\#HU#HN#HG#H@#H9#H2#H+#H$#H#H#H#H#H#H"H"H"H"H"H"H"H"H"H"H"H"H"H"H"H"H"H"H|"Hu"Hn"Hg"H`"HY"HR"HK"HD"H="H6"H/"H("H!"H"H"H "H"H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!Hy!Hr!Hk!Hd!H]!HV!HO!HH!HA!H:!H3!H,!H%!H!H!H!H !H!H H H H H H H H H H H H H H H H H H H} Hv Ho Hh Ha HZ HS HL HE H> H7 H0 H) H" H H H H HHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHHHHHHHHHHHHHHHHHHHHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHHHHHHHHHHHHHHHHHHHH|HuHnHgH`HYHRHKHDH=H6H/H(H!HHH HHHHHHHHHHHHHHHHHHHHHyHrHkHdH]HVHOHHHAH:H3H,H%HHHH HHHHHHHHHHHHHHHHHHHH}HvHoHhHaHZHSHLHEH>H7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHHHHHHHHHHHHHHHHHHHHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHHHHHHHHHHHHHHHHHHHH|HuHnHgH`HYHRHKHDH=H6H/H(H!HHH HHHHHHHHHHHHHHHHHHHHHyHrHkHdH]HVHOHHHAH:H3H,H%HHHH HHHHHHHHHHHHHHHHHHHH}HvHoHhHaHZHSHLHEH>H7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHHHHHHHHHHHHHHHHHHHHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHH H H H H H H H H H H H H H H H H H H| Hu Hn Hg H` HY HR HK HD H= H6 H/ H( H! H H H H H H H H H H H H H H H H H H H H H H H Hy Hr Hk Hd H] HV HO HH HA H: H3 H, H% H H H H H H H H H H H H H H H H H H H H H H H H} Hv Ho Hh Ha HZ HS HL HE H> H7 H0 H) H" H H H H H H H H H H H H H H H H H H H H H H H Hz Hs Hl He H^ HW HP HI HB H; H4 H- H& H H H H H H H H H H H H H H H H H H H H H H H H~ Hw Hp Hi Hb H[ HT HM HF H? H8 H1 H* H# H H H H H HHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHHHHHHHHHHHHHHHHHHHHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHHHHHHHHHHHHHHHHHHHH|HuHnHgH`HYHRHKHDH=H6H/H(H!HHH HHHHHHHHHHHHHHHHHHHHHyHrHkHdH]HVHOHHHAH:H3H,H%HHHH HHHHHHHHHHHHHHHHHHHH}HvHoHhHaHZHSHLHEH>H7H0H)H"HHH HHHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHHHHHHHHHHHHHHHHHHHHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHHGGGGGGGGGGGGGGGGGG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGGGGGGGGGGGGGGGGGGGGyGrGkGdG]GVGOGHGAG:G3G,G%GGGG GGGGGGGGGGGGGGGGGGGG}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGܽGսGνGǽGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGټGҼG˼GļGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGݻGֻGϻGȻGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGܶGնGζGǶGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGٵGҵG˵GĵGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGݴGִGϴGȴGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGܯGկGίGǯGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGٮGҮGˮGĮGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGݭG֭GϭGȭGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGܨGըGΨGǨGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGG٧GҧG˧GħGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGݦG֦GϦGȦGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGܡGաGΡGǡGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGG٠GҠGˠGĠGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGݟG֟GϟGȟGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGܚG՚GΚGǚGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGٙGҙG˙GęGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGݘG֘GϘGȘGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGGܓGՓGΓGǓGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGْGҒG˒GĒGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGݑG֑GϑGȑGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGG܌GՌGΌGnjGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGًGҋGˋGċGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGG݊G֊GϊGȊGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GGGGGGG܅GՅG΅GDžGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGلG҄G˄GĄGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGG݃GփGσGȃGGGGGGGGGGG{GtGmGfG_GXGQGJGCGG7G0G)G"GGG GG~G~G~G~G~G~G~G~G~G~G~G~G~G~G~G~G~G~G~Gz~Gs~Gl~Ge~G^~GW~GP~GI~GB~G;~G4~G-~G&~G~G~G~G ~G~G}G}G}G}G}G}G}G}G}G}G}G}G}G}G}G}G}G}G~}Gw}Gp}Gi}Gb}G[}GT}GM}GF}G?}G8}G1}G*}G#}G}G}G}G}G}G|G|G|G|G|G|G|G|G|G|G|G|G|G|G|G|G|G|G{|Gt|Gm|Gf|G_|GX|GQ|GJ|GC|G<|G5|G.|G'|G |G|G|G |G|G{G{G{G{G{G{G{G{G{G{G{G{G{G{G{G{G{G{G{Gx{Gq{Gj{Gc{G\{GU{GN{GG{G@{G9{G2{G+{G${G{G{G{G{G{GzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzG|zGuzGnzGgzG`zGYzGRzGKzGDzG=zG6zG/zG(zG!zGzGzG zGzGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyyGryGkyGdyG]yGVyGOyGHyGAyG:yG3yG,yG%yGyGyGyG yGyGxGxGxGxGxGxGxGxGxGxGxGxGxGxGxGxGxGxG}xGvxGoxGhxGaxGZxGSxGLxGExG>xG7xG0xG)xG"xGxGxG xGxGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGzwGswGlwGewG^wGWwGPwGIwGBwG;wG4wG-wG&wGwGwGwG wGwGvGvGvGvGvGvGvGvGvGvGvGvGvGvGvGvGvGvG~vGwvGpvGivGbvG[vGTvGMvGFvG?vG8vG1vG*vG#vGvGvGvGvGvGuGuGuGuGuGuGuGuGuGuGuGuGuGuGuGuGuGuG{uGtuGmuGfuG_uGXuGQuGJuGCuGqG7qG0qG)qG"qGqGqG qGqGpGpGpGpGpGpGpGpGpGpGpGpGpGpGpGpGpGpGpGzpGspGlpGepG^pGWpGPpGIpGBpG;pG4pG-pG&pGpGpGpG pGpGoGoGoGoGoGoGoGoGoGoGoGoGoGoGoGoGoGoG~oGwoGpoGioGboG[oGToGMoGFoG?oG8oG1oG*oG#oGoGoGoGoGoGnGnGnGnGnGnGnGnGnGnGnGnGnGnGnGnGnGnG{nGtnGmnGfnG_nGXnGQnGJnGCnGjG7jG0jG)jG"jGjGjG jGjGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGziGsiGliGeiG^iGWiGPiGIiGBiG;iG4iG-iG&iGiGiGiG iGiGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhG~hGwhGphGihGbhG[hGThGMhGFhG?hG8hG1hG*hG#hGhGhGhGhGhGgGgGgGgGgGgGgGgGgGgGgGgGgGgGgGgGgGgG{gGtgGmgGfgG_gGXgGQgGJgGCgGcG7cG0cG)cG"cGcGcG cGcGbGbGbGbGbGbGbGbGbGbGbGbGbGbGbGbGbGbGbGzbGsbGlbGebG^bGWbGPbGIbGBbG;bG4bG-bG&bGbGbGbG bGbGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG~aGwaGpaGiaGbaG[aGTaGMaGFaG?aG8aG1aG*aG#aGaGaGaGaGaG`G`G`G`G`G`G`G`G`G`G`G`G`G`G`G`G`G`G{`Gt`Gm`Gf`G_`GX`GQ`GJ`GC`G<`G5`G.`G'`G `G`G`G `G`G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_Gx_Gq_Gj_Gc_G\_GU_GN_GG_G@_G9_G2_G+_G$_G_G_G_G_G_G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G|^Gu^Gn^Gg^G`^GY^GR^GK^GD^G=^G6^G/^G(^G!^G^G^G ^G^G]G]G]G]G]G]G]G]G]G]G]G]G]G]G]G]G]G]G]Gy]Gr]Gk]Gd]G]]GV]GO]GH]GA]G:]G3]G,]G%]G]G]G]G ]G]G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G}\Gv\Go\Gh\Ga\GZ\GS\GL\GE\G>\G7\G0\G)\G"\G\G\G \G\G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[Gz[Gs[Gl[Ge[G^[GW[GP[GI[GB[G;[G4[G-[G&[G[G[G[G [G[GZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZG~ZGwZGpZGiZGbZG[ZGTZGMZGFZG?ZG8ZG1ZG*ZG#ZGZGZGZGZGZGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYG{YGtYGmYGfYG_YGXYGQYGJYGCYGUG7UG0UG)UG"UGUGUG UGUGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGzTGsTGlTGeTG^TGWTGPTGITGBTG;TG4TG-TG&TGTGTGTG TGTGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSG~SGwSGpSGiSGbSG[SGTSGMSGFSG?SG8SG1SG*SG#SGSGSGSGSGSGRGRGRGRGRGRGRGRGRGRGRGRGRGRGRGRGRGRG{RGtRGmRGfRG_RGXRGQRGJRGCRGNG7NG0NG)NG"NGNGNG NGNGMGMGMGMGMGMGMGMGMGMGMGMGMGMGMGMGMGMGMGzMGsMGlMGeMG^MGWMGPMGIMGBMG;MG4MG-MG&MGMGMGMG MGMGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLG~LGwLGpLGiLGbLG[LGTLGMLGFLG?LG8LG1LG*LG#LGLGLGLGLGLGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKG{KGtKGmKGfKG_KGXKGQKGJKGCKGGG7GG0GG)GG"GGGGGG GGGGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGzFGsFGlFGeFG^FGWFGPFGIFGBFG;FG4FG-FG&FGFGFGFG FGFGEGEGEGEGEGEGEGEGEGEGEGEGEGEGEGEGEGEG~EGwEGpEGiEGbEG[EGTEGMEGFEG?EG8EG1EG*EG#EGEGEGEGEGEGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDG{DGtDGmDGfDG_DGXDGQDGJDGCDG@G7@G0@G)@G"@G@G@G @G@G?G?G?G?G?G?G?G?G?G?G?G?G?G?G?G?G?G?G?Gz?Gs?Gl?Ge?G^?GW?GP?GI?GB?G;?G4?G-?G&?G?G?G?G ?G?G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G~>Gw>Gp>Gi>Gb>G[>GT>GM>GF>G?>G8>G1>G*>G#>G>G>G>G>G>G=G=G=G=G=G=G=G=G=G=G=G=G=G=G=G=G=G=G{=Gt=Gm=Gf=G_=GX=GQ=GJ=GC=G<=G5=G.=G'=G =G=G=G =G=G9G79G09G)9G"9G9G9G 9G9G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8Gz8Gs8Gl8Ge8G^8GW8GP8GI8GB8G;8G48G-8G&8G8G8G8G 8G8G7G7G7G7G7G7G7G7G7G7G7G7G7G7G7G7G7G7G~7Gw7Gp7Gi7Gb7G[7GT7GM7GF7G?7G87G17G*7G#7G7G7G7G7G7G6G6G6G6G6G6G6G6G6G6G6G6G6G6G6G6G6G6G{6Gt6Gm6Gf6G_6GX6GQ6GJ6GC6G<6G56G.6G'6G 6G6G6G 6G6G5G5G5G5G5G5G5G5G5G5G5G5G5G5G5G5G5G5G5Gx5Gq5Gj5Gc5G\5GU5GN5GG5G@5G95G25G+5G$5G5G5G5G5G5G4G4G4G4G4G4G4G4G4G4G4G4G4G4G4G4G4G4G|4Gu4Gn4Gg4G`4GY4GR4GK4GD4G=4G64G/4G(4G!4G4G4G 4G4G3G3G3G3G3G3G3G3G3G3G3G3G3G3G3G3G3G3G3Gy3Gr3Gk3Gd3G]3GV3GO3GH3GA3G:3G33G,3G%3G3G3G3G 3G3G2G2G2G2G2G2G2G2G2G2G2G2G2G2G2G2G2G2G}2Gv2Go2Gh2Ga2GZ2GS2GL2GE2G>2G72G02G)2G"2G2G2G 2G2G1G1G1G1G1G1G1G1G1G1G1G1G1G1G1G1G1G1G1Gz1Gs1Gl1Ge1G^1GW1GP1GI1GB1G;1G41G-1G&1G1G1G1G 1G1G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G~0Gw0Gp0Gi0Gb0G[0GT0GM0GF0G?0G80G10G*0G#0G0G0G0G0G0G/G/G/G/G/G/G/G/G/G/G/G/G/G/G/G/G/G/G{/Gt/Gm/Gf/G_/GX/GQ/GJ/GC/G+G7+G0+G)+G"+G+G+G +G+G*G*G*G*G*G*G*G*G*G*G*G*G*G*G*G*G*G*G*Gz*Gs*Gl*Ge*G^*GW*GP*GI*GB*G;*G4*G-*G&*G*G*G*G *G*G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G~)Gw)Gp)Gi)Gb)G[)GT)GM)GF)G?)G8)G1)G*)G#)G)G)G)G)G)G(G(G(G(G(G(G(G(G(G(G(G(G(G(G(G(G(G(G{(Gt(Gm(Gf(G_(GX(GQ(GJ(GC(G<(G5(G.(G'(G (G(G(G (G(G'G'G'G'G'G'G'G'G'G'G'G'G'G'G'G'G'G'G'Gx'Gq'Gj'Gc'G\'GU'GN'GG'G@'G9'G2'G+'G$'G'G'G'G'G'G&G&G&G&G&G&G&G&G&G&G&G&G&G&G&G&G&G&G|&Gu&Gn&Gg&G`&GY&GR&GK&GD&G=&G6&G/&G(&G!&G&G&G &G&G%G%G%G%G%G%G%G%G%G%G%G%G%G%G%G%G%G%G%Gy%Gr%Gk%Gd%G]%GV%GO%GH%GA%G:%G3%G,%G%%G%G%G%G %G%G$G$G$G$G$G$G$G$G$G$G$G$G$G$G$G$G$G$G}$Gv$Go$Gh$Ga$GZ$GS$GL$GE$G>$G7$G0$G)$G"$G$G$G $G$G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#Gz#Gs#Gl#Ge#G^#GW#GP#GI#GB#G;#G4#G-#G&#G#G#G#G #G#G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G~"Gw"Gp"Gi"Gb"G["GT"GM"GF"G?"G8"G1"G*"G#"G"G"G"G"G"G!G!G!G!G!G!G!G!G!G!G!G!G!G!G!G!G!G!G{!Gt!Gm!Gf!G_!GX!GQ!GJ!GC!GG7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCG<G5G.G'G GGG GGGGGGGGGGGGGGGGGGGGGxGqGjGcG\GUGNGGG@G9G2G+G$GGGGGGGGGGGGGGGGGGGGGGGG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGGGGGGGGGGGGGGGGGGGGyGrGkGdG]GVGOGHGAG:G3G,G%GGGG GGGGGGGGGGGGGGGGGGGG}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCG<G5G.G'G GGG GGGGGGGGGGGGGGGGGGGGGxGqGjGcG\GUGNGGG@G9G2G+G$GGGGGGGGGGGGGGGGGGGGGGGG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGGGGGGGGGGGGGGGGGGGGyGrGkGdG]GVGOGHGAG:G3G,G%GGGG GGGGGGGGGGGGGGGGGGGG}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GG G G G G G G G G G G G G G G G G G G~ Gw Gp Gi Gb G[ GT GM GF G? G8 G1 G* G# G G G G G G G G G G G G G G G G G G G G G G G G{ Gt Gm Gf G_ GX GQ GJ GC G< G5 G. G' G G G G G G G G G G G G G G G G G G G G G G G G Gx Gq Gj Gc G\ GU GN GG G@ G9 G2 G+ G$ G G G G G G G G G G G G G G G G G G G G G G G G| Gu Gn Gg G` GY GR GK GD G= G6 G/ G( G! G G G G G G G G G G G G G G G G G G G G G G G Gy Gr Gk Gd G] GV GO GH GA G: G3 G, G% G G G G G GGGGGGGGGGGGGGGGGGG}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCG<G5G.G'G GGG GGGGGGGGGGGGGGGGGGGGGxGqGjGcG\GUGNGGG@G9G2G+G$GGGGGGGGGGGGGGGGGGGGGGGG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGGGGGGGGGGGGGGGGGGGGyGrGkGdG]GVGOGHGAG:G3G,G%GGGG GGGGGGGGGGGGGGGGGGGG}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFݿFֿFϿFȿFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFܺFպFκFǺFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFٹFҹF˹FĹFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFݸFָFϸFȸFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFܳFճFγFdzFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFٲFҲF˲FIJFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFݱFֱFϱFȱFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFܬFլFάFǬFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFF٫FҫF˫FīFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFݪF֪FϪFȪFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFܥFեFΥFǥFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFF٤FҤFˤFĤFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFݣF֣FϣFȣFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFܞF՞FΞFǞFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFٝFҝF˝FĝFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFݜF֜FϜFȜFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFܗF՗FΗFǗFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFٖFҖF˖FĖFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFݕF֕FϕFȕFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFFܐFՐFΐFǐFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFُFҏFˏFďFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFݎF֎FώFȎFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFF܉FՉFΉFljFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFوF҈FˈFĈFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFF݇FևFχFȇFFFFFFFFFFF{FtFmFfF_FXFQFJFCFF7F0F)F"FFF FFFFFFF܂FՂF΂FǂFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFفFҁFˁFāFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFF݀FրFπFȀFFFFFFFFFFF{FtFmFfF_FXFQFJFCF|F7|F0|F)|F"|F|F|F |F|F{F{F{F{F{F{F{F{F{F{F{F{F{F{F{F{F{F{F{Fz{Fs{Fl{Fe{F^{FW{FP{FI{FB{F;{F4{F-{F&{F{F{F{F {F{FzFzFzFzFzFzFzFzFzFzFzFzFzFzFzFzFzFzF~zFwzFpzFizFbzF[zFTzFMzFFzF?zF8zF1zF*zF#zFzFzFzFzFzFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyF{yFtyFmyFfyF_yFXyFQyFJyFCyFuF7uF0uF)uF"uFuFuF uFuFtFtFtFtFtFtFtFtFtFtFtFtFtFtFtFtFtFtFtFztFstFltFetF^tFWtFPtFItFBtF;tF4tF-tF&tFtFtFtF tFtFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsF~sFwsFpsFisFbsF[sFTsFMsFFsF?sF8sF1sF*sF#sFsFsFsFsFsFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrF{rFtrFmrFfrF_rFXrFQrFJrFCrFnF7nF0nF)nF"nFnFnF nFnFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFzmFsmFlmFemF^mFWmFPmFImFBmF;mF4mF-mF&mFmFmFmF mFmFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlF~lFwlFplFilFblF[lFTlFMlFFlF?lF8lF1lF*lF#lFlFlFlFlFlFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkF{kFtkFmkFfkF_kFXkFQkFJkFCkFgF7gF0gF)gF"gFgFgF gFgFfFfFfFfFfFfFfFfFfFfFfFfFfFfFfFfFfFfFfFzfFsfFlfFefF^fFWfFPfFIfFBfF;fF4fF-fF&fFfFfFfF fFfFeFeFeFeFeFeFeFeFeFeFeFeFeFeFeFeFeFeF~eFweFpeFieFbeF[eFTeFMeFFeF?eF8eF1eF*eF#eFeFeFeFeFeFdFdFdFdFdFdFdFdFdFdFdFdFdFdFdFdFdFdF{dFtdFmdFfdF_dFXdFQdFJdFCdF`F7`F0`F)`F"`F`F`F `F`F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_Fz_Fs_Fl_Fe_F^_FW_FP_FI_FB_F;_F4_F-_F&_F_F_F_F _F_F^F^F^F^F^F^F^F^F^F^F^F^F^F^F^F^F^F^F~^Fw^Fp^Fi^Fb^F[^FT^FM^FF^F?^F8^F1^F*^F#^F^F^F^F^F^F]F]F]F]F]F]F]F]F]F]F]F]F]F]F]F]F]F]F{]Ft]Fm]Ff]F_]FX]FQ]FJ]FC]F<]F5]F.]F']F ]F]F]F ]F]F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\F\Fx\Fq\Fj\Fc\F\\FU\FN\FG\F@\F9\F2\F+\F$\F\F\F\F\F\F[F[F[F[F[F[F[F[F[F[F[F[F[F[F[F[F[F[F|[Fu[Fn[Fg[F`[FY[FR[FK[FD[F=[F6[F/[F([F![F[F[F [F[FZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFyZFrZFkZFdZF]ZFVZFOZFHZFAZF:ZF3ZF,ZF%ZFZFZFZF ZFZFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYF}YFvYFoYFhYFaYFZYFSYFLYFEYF>YF7YF0YF)YF"YFYFYF YFYFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFzXFsXFlXFeXF^XFWXFPXFIXFBXF;XF4XF-XF&XFXFXFXF XFXFWFWFWFWFWFWFWFWFWFWFWFWFWFWFWFWFWFWF~WFwWFpWFiWFbWF[WFTWFMWFFWF?WF8WF1WF*WF#WFWFWFWFWFWFVFVFVFVFVFVFVFVFVFVFVFVFVFVFVFVFVFVF{VFtVFmVFfVF_VFXVFQVFJVFCVFRF7RF0RF)RF"RFRFRF RFRFQFQFQFQFQFQFQFQFQFQFQFQFQFQFQFQFQFQFQFzQFsQFlQFeQF^QFWQFPQFIQFBQF;QF4QF-QF&QFQFQFQF QFQFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPF~PFwPFpPFiPFbPF[PFTPFMPFFPF?PF8PF1PF*PF#PFPFPFPFPFPFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOF{OFtOFmOFfOF_OFXOFQOFJOFCOFKF7KF0KF)KF"KFKFKF KFKFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFzJFsJFlJFeJF^JFWJFPJFIJFBJF;JF4JF-JF&JFJFJFJF JFJFIFIFIFIFIFIFIFIFIFIFIFIFIFIFIFIFIFIF~IFwIFpIFiIFbIF[IFTIFMIFFIF?IF8IF1IF*IF#IFIFIFIFIFIFHFHFHFHFHFHFHFHFHFHFHFHFHFHFHFHFHFHF{HFtHFmHFfHF_HFXHFQHFJHFCHFDF7DF0DF)DF"DFDFDF DFDFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFzCFsCFlCFeCF^CFWCFPCFICFBCF;CF4CF-CF&CFCFCFCF CFCFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF~BFwBFpBFiBFbBF[BFTBFMBFFBF?BF8BF1BF*BF#BFBFBFBFBFBFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF{AFtAFmAFfAF_AFXAFQAFJAFCAFF>F>F>F>F>F>F>F>F>F>F>F>F>F>F>F>F>F>Fy>Fr>Fk>Fd>F]>FV>FO>FH>FA>F:>F3>F,>F%>F>F>F>F >F>F=F=F=F=F=F=F=F=F=F=F=F=F=F=F=F=F=F=F}=Fv=Fo=Fh=Fa=FZ=FS=FL=FE=F>=F7=F0=F)=F"=F=F=F =F=F6F76F06F)6F"6F6F6F 6F6F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5Fz5Fs5Fl5Fe5F^5FW5FP5FI5FB5F;5F45F-5F&5F5F5F5F 5F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F~4Fw4Fp4Fi4Fb4F[4FT4FM4FF4F?4F84F14F*4F#4F4F4F4F4F4F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F{3Ft3Fm3Ff3F_3FX3FQ3FJ3FC3F<3F53F.3F'3F 3F3F3F 3F3F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2Fx2Fq2Fj2Fc2F\2FU2FN2FG2F@2F92F22F+2F$2F2F2F2F2F2F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F|1Fu1Fn1Fg1F`1FY1FR1FK1FD1F=1F61F/1F(1F!1F1F1F 1F1F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0Fy0Fr0Fk0Fd0F]0FV0FO0FH0FA0F:0F30F,0F%0F0F0F0F 0F0F/F/F/F/F/F/F/F/F/F/F/F/F/F/F/F/F/F/F}/Fv/Fo/Fh/Fa/FZ/FS/FL/FE/F>/F7/F0/F)/F"/F/F/F /F/F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.Fz.Fs.Fl.Fe.F^.FW.FP.FI.FB.F;.F4.F-.F&.F.F.F.F .F.F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F~-Fw-Fp-Fi-Fb-F[-FT-FM-FF-F?-F8-F1-F*-F#-F-F-F-F-F-F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F{,Ft,Fm,Ff,F_,FX,FQ,FJ,FC,F<,F5,F.,F',F ,F,F,F ,F,F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+Fx+Fq+Fj+Fc+F\+FU+FN+FG+F@+F9+F2+F++F$+F+F+F+F+F+F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F|*Fu*Fn*Fg*F`*FY*FR*FK*FD*F=*F6*F/*F(*F!*F*F*F *F*F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)Fy)Fr)Fk)Fd)F])FV)FO)FH)FA)F:)F3)F,)F%)F)F)F)F )F)F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F}(Fv(Fo(Fh(Fa(FZ(FS(FL(FE(F>(F7(F0(F)(F"(F(F(F (F(F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'Fz'Fs'Fl'Fe'F^'FW'FP'FI'FB'F;'F4'F-'F&'F'F'F'F 'F'F&F&F&F&F&F&F&F&F&F&F&F&F&F&F&F&F&F&F~&Fw&Fp&Fi&Fb&F[&FT&FM&FF&F?&F8&F1&F*&F#&F&F&F&F&F&F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F{%Ft%Fm%Ff%F_%FX%FQ%FJ%FC%F<%F5%F.%F'%F %F%F%F %F%F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$Fx$Fq$Fj$Fc$F\$FU$FN$FG$F@$F9$F2$F+$F$$F$F$F$F$F$F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F|#Fu#Fn#Fg#F`#FY#FR#FK#FD#F=#F6#F/#F(#F!#F#F#F #F#F"F"F"F"F"F"F"F"F"F"F"F"F"F"F"F"F"F"F"Fy"Fr"Fk"Fd"F]"FV"FO"FH"FA"F:"F3"F,"F%"F"F"F"F "F"F!F!F!F!F!F!F!F!F!F!F!F!F!F!F!F!F!F!F}!Fv!Fo!Fh!Fa!FZ!FS!FL!FE!F>!F7!F0!F)!F"!F!F!F !F!F F F F F F F F F F F F F F F F F F F Fz Fs Fl Fe F^ FW FP FI FB F; F4 F- F& F F F F F FFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCF<F5F.F'F FFF FFFFFFFFFFFFFFFFFFFFFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFFFFFFFFFFFFFFFFFFF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FFFFFFFFFFFFFFFFFFFFFyFrFkFdF]FVFOFHFAF:F3F,F%FFFF FFFFFFFFFFFFFFFFFFFF}FvFoFhFaFZFSFLFEF>F7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCF<F5F.F'F FFF FFFFFFFFFFFFFFFFFFFFFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFFFFFFFFFFFFFFFFFFF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FFFFFFFFFFFFFFFFFFFFFyFrFkFdF]FVFOFHFAF:F3F,F%FFFF FFFFFFFFFFFFFFFFFFFF}FvFoFhFaFZFSFLFEF>F7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCF<F5F.F'F FFF FFFFFFFFFFFFFFFFFFFFFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFFFFFFFFFFFFFFFFFFF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FF F F F F F F F F F F F F F F F F F F Fy Fr Fk Fd F] FV FO FH FA F: F3 F, F% F F F F F F F F F F F F F F F F F F F F F F F F} Fv Fo Fh Fa FZ FS FL FE F> F7 F0 F) F" F F F F F F F F F F F F F F F F F F F F F F F Fz Fs Fl Fe F^ FW FP FI FB F; F4 F- F& F F F F F F F F F F F F F F F F F F F F F F F F~ Fw Fp Fi Fb F[ FT FM FF F? F8 F1 F* F# F F F F F F F F F F F F F F F F F F F F F F F F{ Ft Fm Ff F_ FX FQ FJ FC F< F5 F. F' F F F F F FFFFFFFFFFFFFFFFFFFFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFFFFFFFFFFFFFFFFFFF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FFFFFFFFFFFFFFFFFFFFFyFrFkFdF]FVFOFHFAF:F3F,F%FFFF FFFFFFFFFFFFFFFFFFFF}FvFoFhFaFZFSFLFEF>F7F0F)F"FFF FFFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCF<F5F.F'F FFF FFFFFFFFFFFFFFFFFFFFFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFFFFFFFFFFFFFFFFFFF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FFEEEEEEEEEEEEEEEEEEEyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEEEEEEEEEEEEEEEEEEE}EvEoEhEaEZESELEEE>E7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEܾEվEξEǾEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEٽEҽE˽EĽEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEݼEּEϼEȼEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEܷEշEηEǷEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEٶEҶE˶EĶEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEݵEֵEϵEȵEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEܰEհEΰEǰEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEٯEүE˯EįEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEݮE֮EϮEȮEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEܩEթEΩEǩEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEE٨EҨE˨EĨEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEݧE֧EϧEȧEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEܢEբE΢EǢEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEE١EҡEˡEġEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEݠE֠EϠEȠEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEܛE՛EΛEǛEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEٚEҚE˚EĚEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEݙE֙EϙEșEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEܔEՔEΔEǔEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEٓEғE˓EēEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEݒE֒EϒEȒEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEE܍EՍE΍EǍEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEٌEҌEˌEČEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEE݋E֋EϋEȋEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEE܆EՆEΆEdžEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEمE҅E˅EąEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEE݄EքEτEȄEEEEEEEEEEE{EtEmEfE_EXEQEJECEE7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EE~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~~Ew~Ep~Ei~Eb~E[~ET~EM~EF~E?~E8~E1~E*~E#~E~E~E~E~E~E}E}E}E}E}E}E}E}E}E}E}E}E}E}E}E}E}E}E{}Et}Em}Ef}E_}EX}EQ}EJ}EC}E<}E5}E.}E'}E }E}E}E }E}E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|Ex|Eq|Ej|Ec|E\|EU|EN|EG|E@|E9|E2|E+|E$|E|E|E|E|E|E{E{E{E{E{E{E{E{E{E{E{E{E{E{E{E{E{E{E|{Eu{En{Eg{E`{EY{ER{EK{ED{E={E6{E/{E({E!{E{E{E {E{EzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEyzErzEkzEdzE]zEVzEOzEHzEAzE:zE3zE,zE%zEzEzEzE zEzEyEyEyEyEyEyEyEyEyEyEyEyEyEyEyEyEyEyE}yEvyEoyEhyEayEZyESyELyEEyE>yE7yE0yE)yE"yEyEyE yEyExExExExExExExExExExExExExExExExExExExEzxEsxElxEexE^xEWxEPxEIxEBxE;xE4xE-xE&xExExExE xExEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwE~wEwwEpwEiwEbwE[wETwEMwEFwE?wE8wE1wE*wE#wEwEwEwEwEwEvEvEvEvEvEvEvEvEvEvEvEvEvEvEvEvEvEvE{vEtvEmvEfvE_vEXvEQvEJvECvErE7rE0rE)rE"rErErE rErEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEqEzqEsqElqEeqE^qEWqEPqEIqEBqE;qE4qE-qE&qEqEqEqE qEqEpEpEpEpEpEpEpEpEpEpEpEpEpEpEpEpEpEpE~pEwpEppEipEbpE[pETpEMpEFpE?pE8pE1pE*pE#pEpEpEpEpEpEoEoEoEoEoEoEoEoEoEoEoEoEoEoEoEoEoEoE{oEtoEmoEfoE_oEXoEQoEJoECoEkE7kE0kE)kE"kEkEkE kEkEjEjEjEjEjEjEjEjEjEjEjEjEjEjEjEjEjEjEjEzjEsjEljEejE^jEWjEPjEIjEBjE;jE4jE-jE&jEjEjEjE jEjEiEiEiEiEiEiEiEiEiEiEiEiEiEiEiEiEiEiE~iEwiEpiEiiEbiE[iETiEMiEFiE?iE8iE1iE*iE#iEiEiEiEiEiEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhE{hEthEmhEfhE_hEXhEQhEJhEChEdE7dE0dE)dE"dEdEdE dEdEcEcEcEcEcEcEcEcEcEcEcEcEcEcEcEcEcEcEcEzcEscElcEecE^cEWcEPcEIcEBcE;cE4cE-cE&cEcEcEcE cEcEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbE~bEwbEpbEibEbbE[bETbEMbEFbE?bE8bE1bE*bE#bEbEbEbEbEbEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaE{aEtaEmaEfaE_aEXaEQaEJaECaE]E7]E0]E)]E"]E]E]E ]E]E\E\E\E\E\E\E\E\E\E\E\E\E\E\E\E\E\E\E\Ez\Es\El\Ee\E^\EW\EP\EI\EB\E;\E4\E-\E&\E\E\E\E \E\E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E~[Ew[Ep[Ei[Eb[E[[ET[EM[EF[E?[E8[E1[E*[E#[E[E[E[E[E[EZEZEZEZEZEZEZEZEZEZEZEZEZEZEZEZEZEZE{ZEtZEmZEfZE_ZEXZEQZEJZECZEVE7VE0VE)VE"VEVEVE VEVEUEUEUEUEUEUEUEUEUEUEUEUEUEUEUEUEUEUEUEzUEsUElUEeUE^UEWUEPUEIUEBUE;UE4UE-UE&UEUEUEUE UEUETETETETETETETETETETETETETETETETETETE~TEwTEpTEiTEbTE[TETTEMTEFTE?TE8TE1TE*TE#TETETETETETESESESESESESESESESESESESESESESESESESE{SEtSEmSEfSE_SEXSEQSEJSECSEOE7OE0OE)OE"OEOEOE OEOENENENENENENENENENENENENENENENENENENENEzNEsNElNEeNE^NEWNEPNEINEBNE;NE4NE-NE&NENENENE NENEMEMEMEMEMEMEMEMEMEMEMEMEMEMEMEMEMEME~MEwMEpMEiMEbME[METMEMMEFME?ME8ME1ME*ME#MEMEMEMEMEMELELELELELELELELELELELELELELELELELELE{LEtLEmLEfLE_LEXLEQLEJLECLEHE7HE0HE)HE"HEHEHE HEHEGEGEGEGEGEGEGEGEGEGEGEGEGEGEGEGEGEGEGEzGEsGElGEeGE^GEWGEPGEIGEBGE;GE4GE-GE&GEGEGEGE GEGEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE~FEwFEpFEiFEbFE[FETFEMFEFFE?FE8FE1FE*FE#FEFEFEFEFEFEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE{EEtEEmEEfEE_EEXEEQEEJEECEEAE7AE0AE)AE"AEAEAE AEAE@E@E@E@E@E@E@E@E@E@E@E@E@E@E@E@E@E@E@Ez@Es@El@Ee@E^@EW@EP@EI@EB@E;@E4@E-@E&@E@E@E@E @E@E?E?E?E?E?E?E?E?E?E?E?E?E?E?E?E?E?E?E~?Ew?Ep?Ei?Eb?E[?ET?EM?EF?E??E8?E1?E*?E#?E?E?E?E?E?E>E>E>E>E>E>E>E>E>E>E>E>E>E>E>E>E>E>E{>Et>Em>Ef>E_>EX>EQ>EJ>EC>E<>E5>E.>E'>E >E>E>E >E>E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=Ex=Eq=Ej=Ec=E\=EU=EN=EG=E@=E9=E2=E+=E$=E=E=E=E=E=E:E7:E0:E):E":E:E:E :E:E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9Ez9Es9El9Ee9E^9EW9EP9EI9EB9E;9E49E-9E&9E9E9E9E 9E9E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E~8Ew8Ep8Ei8Eb8E[8ET8EM8EF8E?8E88E18E*8E#8E8E8E8E8E8E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E{7Et7Em7Ef7E_7EX7EQ7EJ7EC7E<7E57E.7E'7E 7E7E7E 7E7E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6Ex6Eq6Ej6Ec6E\6EU6EN6EG6E@6E96E26E+6E$6E6E6E6E6E6E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E|5Eu5En5Eg5E`5EY5ER5EK5ED5E=5E65E/5E(5E!5E5E5E 5E5E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4Ey4Er4Ek4Ed4E]4EV4EO4EH4EA4E:4E34E,4E%4E4E4E4E 4E4E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E}3Ev3Eo3Eh3Ea3EZ3ES3EL3EE3E>3E73E03E)3E"3E3E3E 3E3E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2Ez2Es2El2Ee2E^2EW2EP2EI2EB2E;2E42E-2E&2E2E2E2E 2E2E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E~1Ew1Ep1Ei1Eb1E[1ET1EM1EF1E?1E81E11E*1E#1E1E1E1E1E1E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E{0Et0Em0Ef0E_0EX0EQ0EJ0EC0E<0E50E.0E'0E 0E0E0E 0E0E/E/E/E/E/E/E/E/E/E/E/E/E/E/E/E/E/E/E/Ex/Eq/Ej/Ec/E\/EU/EN/EG/E@/E9/E2/E+/E$/E/E/E/E/E/E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E|.Eu.En.Eg.E`.EY.ER.EK.ED.E=.E6.E/.E(.E!.E.E.E .E.E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-Ey-Er-Ek-Ed-E]-EV-EO-EH-EA-E:-E3-E,-E%-E-E-E-E -E-E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E},Ev,Eo,Eh,Ea,EZ,ES,EL,EE,E>,E7,E0,E),E",E,E,E ,E,E+E+E+E+E+E+E+E+E+E+E+E+E+E+E+E+E+E+E+Ez+Es+El+Ee+E^+EW+EP+EI+EB+E;+E4+E-+E&+E+E+E+E +E+E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E~*Ew*Ep*Ei*Eb*E[*ET*EM*EF*E?*E8*E1*E**E#*E*E*E*E*E*E)E)E)E)E)E)E)E)E)E)E)E)E)E)E)E)E)E)E{)Et)Em)Ef)E_)EX)EQ)EJ)EC)E<)E5)E.)E')E )E)E)E )E)E(E(E(E(E(E(E(E(E(E(E(E(E(E(E(E(E(E(E(Ex(Eq(Ej(Ec(E\(EU(EN(EG(E@(E9(E2(E+(E$(E(E(E(E(E(E'E'E'E'E'E'E'E'E'E'E'E'E'E'E'E'E'E'E|'Eu'En'Eg'E`'EY'ER'EK'ED'E='E6'E/'E('E!'E'E'E 'E'E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&Ey&Er&Ek&Ed&E]&EV&EO&EH&EA&E:&E3&E,&E%&E&E&E&E &E&E%E%E%E%E%E%E%E%E%E%E%E%E%E%E%E%E%E%E}%Ev%Eo%Eh%Ea%EZ%ES%EL%EE%E>%E7%E0%E)%E"%E%E%E %E%E$E$E$E$E$E$E$E$E$E$E$E$E$E$E$E$E$E$E$Ez$Es$El$Ee$E^$EW$EP$EI$EB$E;$E4$E-$E&$E$E$E$E $E$E#E#E#E#E#E#E#E#E#E#E#E#E#E#E#E#E#E#E~#Ew#Ep#Ei#Eb#E[#ET#EM#EF#E?#E8#E1#E*#E##E#E#E#E#E#E"E"E"E"E"E"E"E"E"E"E"E"E"E"E"E"E"E"E{"Et"Em"Ef"E_"EX"EQ"EJ"EC"E<"E5"E."E'"E "E"E"E "E"E!E!E!E!E!E!E!E!E!E!E!E!E!E!E!E!E!E!E!Ex!Eq!Ej!Ec!E\!EU!EN!EG!E@!E9!E2!E+!E$!E!E!E!E!E!E E E E E E E E E E E E E E E E E E E| Eu En Eg E` EY ER EK ED E= E6 E/ E( E! E E E E EEEEEEEEEEEEEEEEEEEEyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEEEEEEEEEEEEEEEEEEE}EvEoEhEaEZESELEEE>E7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECE<E5E.E'E EEE EEEEEEEEEEEEEEEEEEEEExEqEjEcE\EUENEGE@E9E2E+E$EEEEEEEEEEEEEEEEEEEEEEEE|EuEnEgE`EYEREKEDE=E6E/E(E!EEE EEEEEEEEEEEEEEEEEEEEEyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEEEEEEEEEEEEEEEEEEE}EvEoEhEaEZESELEEE>E7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECE<E5E.E'E EEE EEEEEEEEEEEEEEEEEEEEExEqEjEcE\EUENEGE@E9E2E+E$EEEEEEEEEEEEEEEEEEEEEEEE|EuEnEgE`EYEREKEDE=E6E/E(E!EEE EEEEEEEEEEEEEEEEEEEEEyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEEEEEEEEEEEEEEEEEEE}EvEoEhEaEZESELEEE>E7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEE E E E E E E E E E E E E E E E E E E{ Et Em Ef E_ EX EQ EJ EC E< E5 E. E' E E E E E E E E E E E E E E E E E E E E E E E E Ex Eq Ej Ec E\ EU EN EG E@ E9 E2 E+ E$ E E E E E E E E E E E E E E E E E E E E E E E E| Eu En Eg E` EY ER EK ED E= E6 E/ E( E! E E E E E E E E E E E E E E E E E E E E E E E Ey Er Ek Ed E] EV EO EH EA E: E3 E, E% E E E E E E E E E E E E E E E E E E E E E E E E} Ev Eo Eh Ea EZ ES EL EE E> E7 E0 E) E" E E E E EEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECE<E5E.E'E EEE EEEEEEEEEEEEEEEEEEEEExEqEjEcE\EUENEGE@E9E2E+E$EEEEEEEEEEEEEEEEEEEEEEEE|EuEnEgE`EYEREKEDE=E6E/E(E!EEE EEEEEEEEEEEEEEEEEEEEEyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEEEEEEEEEEEEEEEEEEE}EvEoEhEaEZESELEEE>E7E0E)E"EEE EEEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDܻDջDλDǻDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDٺDҺD˺DĺDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDݹDֹDϹDȹDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDܴDմDδDǴDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDٳDҳD˳DijDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDݲDֲDϲDȲDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDܭDխDέDǭDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDD٬DҬDˬDĬDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDݫD֫DϫDȫDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDܦDզDΦDǦDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDD٥DҥD˥DĥDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDݤD֤DϤDȤDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDܟD՟DΟDǟDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDٞDҞD˞DĞDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDݝD֝DϝDȝDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDܘD՘DΘDǘDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDٗDҗD˗DėDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDݖD֖DϖDȖDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDDܑDՑDΑDǑDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDِDҐDːDĐDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDݏD֏DϏDȏDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDD܊DՊDΊDNJDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDىD҉DˉDĉDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDD݈DֈDψDȈDDDDDDDDDDD{DtDmDfD_DXDQDJDCDD7D0D)D"DDD DDDDDDD܃DՃD΃DǃDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDقD҂D˂DĂDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDD݁DցDρDȁDDDDDDDDDDD{DtDmDfD_DXDQDJDCD}D7}D0}D)}D"}D}D}D }D}D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|Dz|Ds|Dl|De|D^|DW|DP|DI|DB|D;|D4|D-|D&|D|D|D|D |D|D{D{D{D{D{D{D{D{D{D{D{D{D{D{D{D{D{D{D~{Dw{Dp{Di{Db{D[{DT{DM{DF{D?{D8{D1{D*{D#{D{D{D{D{D{DzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzDzD{zDtzDmzDfzD_zDXzDQzDJzDCzDvD7vD0vD)vD"vDvDvD vDvDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDuDzuDsuDluDeuD^uDWuDPuDIuDBuD;uD4uD-uD&uDuDuDuD uDuDtDtDtDtDtDtDtDtDtDtDtDtDtDtDtDtDtDtD~tDwtDptDitDbtD[tDTtDMtDFtD?tD8tD1tD*tD#tDtDtDtDtDtDsDsDsDsDsDsDsDsDsDsDsDsDsDsDsDsDsDsD{sDtsDmsDfsD_sDXsDQsDJsDCsDoD7oD0oD)oD"oDoDoD oDoDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDnDznDsnDlnDenD^nDWnDPnDInDBnD;nD4nD-nD&nDnDnDnD nDnDmDmDmDmDmDmDmDmDmDmDmDmDmDmDmDmDmDmD~mDwmDpmDimDbmD[mDTmDMmDFmD?mD8mD1mD*mD#mDmDmDmDmDmDlDlDlDlDlDlDlDlDlDlDlDlDlDlDlDlDlDlD{lDtlDmlDflD_lDXlDQlDJlDClDhD7hD0hD)hD"hDhDhD hDhDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDzgDsgDlgDegD^gDWgDPgDIgDBgD;gD4gD-gD&gDgDgDgD gDgDfDfDfDfDfDfDfDfDfDfDfDfDfDfDfDfDfDfD~fDwfDpfDifDbfD[fDTfDMfDFfD?fD8fD1fD*fD#fDfDfDfDfDfDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeD{eDteDmeDfeD_eDXeDQeDJeDCeDaD7aD0aD)aD"aDaDaD aDaD`D`D`D`D`D`D`D`D`D`D`D`D`D`D`D`D`D`D`Dz`Ds`Dl`De`D^`DW`DP`DI`DB`D;`D4`D-`D&`D`D`D`D `D`D_D_D_D_D_D_D_D_D_D_D_D_D_D_D_D_D_D_D~_Dw_Dp_Di_Db_D[_DT_DM_DF_D?_D8_D1_D*_D#_D_D_D_D_D_D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D{^Dt^Dm^Df^D_^DX^DQ^DJ^DC^D<^D5^D.^D'^D ^D^D^D ^D^D]D]D]D]D]D]D]D]D]D]D]D]D]D]D]D]D]D]D]Dx]Dq]Dj]Dc]D\]DU]DN]DG]D@]D9]D2]D+]D$]D]D]D]D]D]D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D|\Du\Dn\Dg\D`\DY\DR\DK\DD\D=\D6\D/\D(\D!\D\D\D \D\D[D[D[D[D[D[D[D[D[D[D[D[D[D[D[D[D[D[D[Dy[Dr[Dk[Dd[D][DV[DO[DH[DA[D:[D3[D,[D%[D[D[D[D [D[DZDZDZDZDZDZDZDZDZDZDZDZDZDZDZDZDZDZD}ZDvZDoZDhZDaZDZZDSZDLZDEZD>ZD7ZD0ZD)ZD"ZDZDZD ZDZDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDYDzYDsYDlYDeYD^YDWYDPYDIYDBYD;YD4YD-YD&YDYDYDYD YDYDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXD~XDwXDpXDiXDbXD[XDTXDMXDFXD?XD8XD1XD*XD#XDXDXDXDXDXDWDWDWDWDWDWDWDWDWDWDWDWDWDWDWDWDWDWD{WDtWDmWDfWD_WDXWDQWDJWDCWDSD7SD0SD)SD"SDSDSD SDSDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRDRDzRDsRDlRDeRD^RDWRDPRDIRDBRD;RD4RD-RD&RDRDRDRD RDRDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQD~QDwQDpQDiQDbQD[QDTQDMQDFQD?QD8QD1QD*QD#QDQDQDQDQDQDPDPDPDPDPDPDPDPDPDPDPDPDPDPDPDPDPDPD{PDtPDmPDfPD_PDXPDQPDJPDCPDLD7LD0LD)LD"LDLDLD LDLDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDKDzKDsKDlKDeKD^KDWKDPKDIKDBKD;KD4KD-KD&KDKDKDKD KDKDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJD~JDwJDpJDiJDbJD[JDTJDMJDFJD?JD8JD1JD*JD#JDJDJDJDJDJDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDID{IDtIDmIDfID_IDXIDQIDJIDCIDED7ED0ED)ED"EDEDED EDEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDzDDsDDlDDeDD^DDWDDPDDIDDBDD;DD4DD-DD&DDDDDDDD DDDDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD~CDwCDpCDiCDbCD[CDTCDMCDFCD?CD8CD1CD*CD#CDCDCDCDCDCDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD{BDtBDmBDfBD_BDXBDQBDJBDCBDD>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D}>Dv>Do>Dh>Da>DZ>DS>DL>DE>D>>D7>D0>D)>D">D>D>D >D>D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=Dz=Ds=Dl=De=D^=DW=DP=DI=DB=D;=D4=D-=D&=D=D=D=D =D=D7D77D07D)7D"7D7D7D 7D7D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6Dz6Ds6Dl6De6D^6DW6DP6DI6DB6D;6D46D-6D&6D6D6D6D 6D6D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D~5Dw5Dp5Di5Db5D[5DT5DM5DF5D?5D85D15D*5D#5D5D5D5D5D5D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D{4Dt4Dm4Df4D_4DX4DQ4DJ4DC4D<4D54D.4D'4D 4D4D4D 4D4D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3Dx3Dq3Dj3Dc3D\3DU3DN3DG3D@3D93D23D+3D$3D3D3D3D3D3D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D|2Du2Dn2Dg2D`2DY2DR2DK2DD2D=2D62D/2D(2D!2D2D2D 2D2D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1Dy1Dr1Dk1Dd1D]1DV1DO1DH1DA1D:1D31D,1D%1D1D1D1D 1D1D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D}0Dv0Do0Dh0Da0DZ0DS0DL0DE0D>0D70D00D)0D"0D0D0D 0D0D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/Dz/Ds/Dl/De/D^/DW/DP/DI/DB/D;/D4/D-/D&/D/D/D/D /D/D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D~.Dw.Dp.Di.Db.D[.DT.DM.DF.D?.D8.D1.D*.D#.D.D.D.D.D.D-D-D-D-D-D-D-D-D-D-D-D-D-D-D-D-D-D-D{-Dt-Dm-Df-D_-DX-DQ-DJ-DC-D<-D5-D.-D'-D -D-D-D -D-D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,Dx,Dq,Dj,Dc,D\,DU,DN,DG,D@,D9,D2,D+,D$,D,D,D,D,D,D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D|+Du+Dn+Dg+D`+DY+DR+DK+DD+D=+D6+D/+D(+D!+D+D+D +D+D*D*D*D*D*D*D*D*D*D*D*D*D*D*D*D*D*D*D*Dy*Dr*Dk*Dd*D]*DV*DO*DH*DA*D:*D3*D,*D%*D*D*D*D *D*D)D)D)D)D)D)D)D)D)D)D)D)D)D)D)D)D)D)D})Dv)Do)Dh)Da)DZ)DS)DL)DE)D>)D7)D0)D))D")D)D)D )D)D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(Dz(Ds(Dl(De(D^(DW(DP(DI(DB(D;(D4(D-(D&(D(D(D(D (D(D'D'D'D'D'D'D'D'D'D'D'D'D'D'D'D'D'D'D~'Dw'Dp'Di'Db'D['DT'DM'DF'D?'D8'D1'D*'D#'D'D'D'D'D'D&D&D&D&D&D&D&D&D&D&D&D&D&D&D&D&D&D&D{&Dt&Dm&Df&D_&DX&DQ&DJ&DC&D<&D5&D.&D'&D &D&D&D &D&D%D%D%D%D%D%D%D%D%D%D%D%D%D%D%D%D%D%D%Dx%Dq%Dj%Dc%D\%DU%DN%DG%D@%D9%D2%D+%D$%D%D%D%D%D%D$D$D$D$D$D$D$D$D$D$D$D$D$D$D$D$D$D$D|$Du$Dn$Dg$D`$DY$DR$DK$DD$D=$D6$D/$D($D!$D$D$D $D$D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D#Dy#Dr#Dk#Dd#D]#DV#DO#DH#DA#D:#D3#D,#D%#D#D#D#D #D#D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D}"Dv"Do"Dh"Da"DZ"DS"DL"DE"D>"D7"D0"D)"D""D"D"D "D"D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!Dz!Ds!Dl!De!D^!DW!DP!DI!DB!D;!D4!D-!D&!D!D!D!D !D!D D D D D D D D D D D D D D D D D D D~ Dw Dp Di Db D[ DT DM DF D? D8 D1 D* D# D D D D D DDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD<D5D.D'D DDD DDDDDDDDDDDDDDDDDDDDDxDqDjDcD\DUDNDGD@D9D2D+D$DDDDDDDDDDDDDDDDDDDDDDDD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDDDDDDDDDDDDDDDDDDDDyDrDkDdD]DVDODHDAD:D3D,D%DDDD DDDDDDDDDDDDDDDDDDDD}DvDoDhDaDZDSDLDED>D7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD<D5D.D'D DDD DDDDDDDDDDDDDDDDDDDDDxDqDjDcD\DUDNDGD@D9D2D+D$DDDDDDDDDDDDDDDDDDDDDDDD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDDDDDDDDDDDDDDDDDDDDyDrDkDdD]DVDODHDAD:D3D,D%DDDD DDDDDDDDDDDDDDDDDDDD}DvDoDhDaDZDSDLDED>D7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD<D5D.D'D DDD DDDDDDDDDDDDDDDDDDDDDxDqDjDcD\DUDNDGD@D9D2D+D$DDDDDDDDDDDDDDDDDDDDDDDD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDDDDDDDDDDDDDDDDDDDDyDrDkDdD]DVDODHDAD:D3D,D%DDDD DD D D D D D D D D D D D D D D D D D D} Dv Do Dh Da DZ DS DL DE D> D7 D0 D) D" D D D D D D D D D D D D D D D D D D D D D D D Dz Ds Dl De D^ DW DP DI DB D; D4 D- D& D D D D D D D D D D D D D D D D D D D D D D D D~ Dw Dp Di Db D[ DT DM DF D? D8 D1 D* D# D D D D D D D D D D D D D D D D D D D D D D D D{ Dt Dm Df D_ DX DQ DJ DC D< D5 D. D' D D D D D D D D D D D D D D D D D D D D D D D D Dx Dq Dj Dc D\ DU DN DG D@ D9 D2 D+ D$ D D D D D DDDDDDDDDDDDDDDDDDD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDDDDDDDDDDDDDDDDDDDDyDrDkDdD]DVDODHDAD:D3D,D%DDDD DDDDDDDDDDDDDDDDDDDD}DvDoDhDaDZDSDLDED>D7D0D)D"DDD DDDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD<D5D.D'D DDD DDDDDDDDDDDDDDDDDDDDDxDqDjDcD\DUDNDGD@D9D2D+D$DDDDDDDDDDDDDDDDDDDDDDDD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDDDDDDDDDDDDDDDDDDDDyDrDkDdD]DVDODHDAD:D3D,D%DDDD DDCCCCCCCCCCCCCCCCCC}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCܿCտCοCǿCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCپCҾC˾CľCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCݽCֽCϽCȽCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCܸCոCθCǸCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCٷCҷC˷CķCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCݶCֶC϶CȶCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCܱCձCαCDZCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCٰCҰC˰CİCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCݯC֯CϯCȯCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCܪCժCΪCǪCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCC٩CҩC˩CĩCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCݨC֨CϨCȨCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCܣCգCΣCǣCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCC٢CҢCˢCĢCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCݡC֡CϡCȡCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCܜC՜CΜCǜCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCٛCқC˛CěCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCݚC֚CϚCȚCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCCܕCՕCΕCǕCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCٔCҔC˔CĔCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCݓC֓CϓCȓCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCC܎CՎCΎCǎCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCٍCҍCˍCčCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCC݌C֌CόCȌCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCC܇CՇC·CLJCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCنC҆CˆCĆCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCC݅CօCυCȅCCCCCCCCCCC{CtCmCfC_CXCQCJCCCC7C0C)C"CCC CCCCCCC܀CՀC΀CǀCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCC~C~C~C~C~C~C~C~C~C~C~C~C~C~C~C~C~C~C{~Ct~Cm~Cf~C_~CX~CQ~CJ~CC~C<~C5~C.~C'~C ~C~C~C ~C~C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}Cx}Cq}Cj}Cc}C\}CU}CN}CG}C@}C9}C2}C+}C$}C}C}C}C}C}C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C||Cu|Cn|Cg|C`|CY|CR|CK|CD|C=|C6|C/|C(|C!|C|C|C |C|C{C{C{C{C{C{C{C{C{C{C{C{C{C{C{C{C{C{C{Cy{Cr{Ck{Cd{C]{CV{CO{CH{CA{C:{C3{C,{C%{C{C{C{C {C{CzCzCzCzCzCzCzCzCzCzCzCzCzCzCzCzCzCzC}zCvzCozChzCazCZzCSzCLzCEzC>zC7zC0zC)zC"zCzCzC zCzCyCyCyCyCyCyCyCyCyCyCyCyCyCyCyCyCyCyCyCzyCsyClyCeyC^yCWyCPyCIyCByC;yC4yC-yC&yCyCyCyC yCyCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxC~xCwxCpxCixCbxC[xCTxCMxCFxC?xC8xC1xC*xC#xCxCxCxCxCxCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwC{wCtwCmwCfwC_wCXwCQwCJwCCwCsC7sC0sC)sC"sCsCsC sCsCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCzrCsrClrCerC^rCWrCPrCIrCBrC;rC4rC-rC&rCrCrCrC rCrCqCqCqCqCqCqCqCqCqCqCqCqCqCqCqCqCqCqC~qCwqCpqCiqCbqC[qCTqCMqCFqC?qC8qC1qC*qC#qCqCqCqCqCqCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpC{pCtpCmpCfpC_pCXpCQpCJpCCpClC7lC0lC)lC"lClClC lClCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCkCzkCskClkCekC^kCWkCPkCIkCBkC;kC4kC-kC&kCkCkCkC kCkCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjC~jCwjCpjCijCbjC[jCTjCMjCFjC?jC8jC1jC*jC#jCjCjCjCjCjCiCiCiCiCiCiCiCiCiCiCiCiCiCiCiCiCiCiC{iCtiCmiCfiC_iCXiCQiCJiCCiCeC7eC0eC)eC"eCeCeC eCeCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCzdCsdCldCedC^dCWdCPdCIdCBdC;dC4dC-dC&dCdCdCdC dCdCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcC~cCwcCpcCicCbcC[cCTcCMcCFcC?cC8cC1cC*cC#cCcCcCcCcCcCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbC{bCtbCmbCfbC_bCXbCQbCJbCCbC^C7^C0^C)^C"^C^C^C ^C^C]C]C]C]C]C]C]C]C]C]C]C]C]C]C]C]C]C]C]Cz]Cs]Cl]Ce]C^]CW]CP]CI]CB]C;]C4]C-]C&]C]C]C]C ]C]C\C\C\C\C\C\C\C\C\C\C\C\C\C\C\C\C\C\C~\Cw\Cp\Ci\Cb\C[\CT\CM\CF\C?\C8\C1\C*\C#\C\C\C\C\C\C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C{[Ct[Cm[Cf[C_[CX[CQ[CJ[CC[C<[C5[C.[C'[C [C[C[C [C[CZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCxZCqZCjZCcZC\ZCUZCNZCGZC@ZC9ZC2ZC+ZC$ZCZCZCZCZCZCYCYCYCYCYCYCYCYCYCYCYCYCYCYCYCYCYCYC|YCuYCnYCgYC`YCYYCRYCKYCDYC=YC6YC/YC(YC!YCYCYC YCYCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCyXCrXCkXCdXC]XCVXCOXCHXCAXC:XC3XC,XC%XCXCXCXC XCXCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWC}WCvWCoWChWCaWCZWCSWCLWCEWC>WC7WC0WC)WC"WCWCWC WCWCVCVCVCVCVCVCVCVCVCVCVCVCVCVCVCVCVCVCVCzVCsVClVCeVC^VCWVCPVCIVCBVC;VC4VC-VC&VCVCVCVC VCVCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUC~UCwUCpUCiUCbUC[UCTUCMUCFUC?UC8UC1UC*UC#UCUCUCUCUCUCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTC{TCtTCmTCfTC_TCXTCQTCJTCCTCPC7PC0PC)PC"PCPCPC PCPCOCOCOCOCOCOCOCOCOCOCOCOCOCOCOCOCOCOCOCzOCsOClOCeOC^OCWOCPOCIOCBOC;OC4OC-OC&OCOCOCOC OCOCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNC~NCwNCpNCiNCbNC[NCTNCMNCFNC?NC8NC1NC*NC#NCNCNCNCNCNCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMC{MCtMCmMCfMC_MCXMCQMCJMCCMCIC7IC0IC)IC"ICICIC ICICHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCzHCsHClHCeHC^HCWHCPHCIHCBHC;HC4HC-HC&HCHCHCHC HCHCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGC~GCwGCpGCiGCbGC[GCTGCMGCFGC?GC8GC1GC*GC#GCGCGCGCGCGCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC{FCtFCmFCfFC_FCXFCQFCJFCCFCBC7BC0BC)BC"BCBCBC BCBCACACACACACACACACACACACACACACACACACACACzACsAClACeAC^ACWACPACIACBAC;AC4AC-AC&ACACACAC ACAC@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C~@Cw@Cp@Ci@Cb@C[@CT@CM@CF@C?@C8@C1@C*@C#@C@C@C@C@C@C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C{?Ct?Cm?Cf?C_?CX?CQ?CJ?CC?CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>Cx>Cq>Cj>Cc>C\>CU>CN>CG>C@>C9>C2>C+>C$>C>C>C>C>C>C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C|=Cu=Cn=Cg=C`=CY=CR=CK=CD=C==C6=C/=C(=C!=C=C=C =C=C;C7;C0;C);C";C;C;C ;C;C:C:C:C:C:C:C:C:C:C:C:C:C:C:C:C:C:C:C:Cz:Cs:Cl:Ce:C^:CW:CP:CI:CB:C;:C4:C-:C&:C:C:C:C :C:C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C~9Cw9Cp9Ci9Cb9C[9CT9CM9CF9C?9C89C19C*9C#9C9C9C9C9C9C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C{8Ct8Cm8Cf8C_8CX8CQ8CJ8CC8C<8C58C.8C'8C 8C8C8C 8C8C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7Cx7Cq7Cj7Cc7C\7CU7CN7CG7C@7C97C27C+7C$7C7C7C7C7C7C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C|6Cu6Cn6Cg6C`6CY6CR6CK6CD6C=6C66C/6C(6C!6C6C6C 6C6C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5Cy5Cr5Ck5Cd5C]5CV5CO5CH5CA5C:5C35C,5C%5C5C5C5C 5C5C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C}4Cv4Co4Ch4Ca4CZ4CS4CL4CE4C>4C74C04C)4C"4C4C4C 4C4C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3Cz3Cs3Cl3Ce3C^3CW3CP3CI3CB3C;3C43C-3C&3C3C3C3C 3C3C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C~2Cw2Cp2Ci2Cb2C[2CT2CM2CF2C?2C82C12C*2C#2C2C2C2C2C2C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C{1Ct1Cm1Cf1C_1CX1CQ1CJ1CC1C<1C51C.1C'1C 1C1C1C 1C1C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0Cx0Cq0Cj0Cc0C\0CU0CN0CG0C@0C90C20C+0C$0C0C0C0C0C0C/C/C/C/C/C/C/C/C/C/C/C/C/C/C/C/C/C/C|/Cu/Cn/Cg/C`/CY/CR/CK/CD/C=/C6/C//C(/C!/C/C/C /C/C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.Cy.Cr.Ck.Cd.C].CV.CO.CH.CA.C:.C3.C,.C%.C.C.C.C .C.C-C-C-C-C-C-C-C-C-C-C-C-C-C-C-C-C-C-C}-Cv-Co-Ch-Ca-CZ-CS-CL-CE-C>-C7-C0-C)-C"-C-C-C -C-C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,Cz,Cs,Cl,Ce,C^,CW,CP,CI,CB,C;,C4,C-,C&,C,C,C,C ,C,C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C~+Cw+Cp+Ci+Cb+C[+CT+CM+CF+C?+C8+C1+C*+C#+C+C+C+C+C+C*C*C*C*C*C*C*C*C*C*C*C*C*C*C*C*C*C*C{*Ct*Cm*Cf*C_*CX*CQ*CJ*CC*C<*C5*C.*C'*C *C*C*C *C*C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)C)Cx)Cq)Cj)Cc)C\)CU)CN)CG)C@)C9)C2)C+)C$)C)C)C)C)C)C(C(C(C(C(C(C(C(C(C(C(C(C(C(C(C(C(C(C|(Cu(Cn(Cg(C`(CY(CR(CK(CD(C=(C6(C/(C((C!(C(C(C (C(C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'Cy'Cr'Ck'Cd'C]'CV'CO'CH'CA'C:'C3'C,'C%'C'C'C'C 'C'C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C}&Cv&Co&Ch&Ca&CZ&CS&CL&CE&C>&C7&C0&C)&C"&C&C&C &C&C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%Cz%Cs%Cl%Ce%C^%CW%CP%CI%CB%C;%C4%C-%C&%C%C%C%C %C%C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C~$Cw$Cp$Ci$Cb$C[$CT$CM$CF$C?$C8$C1$C*$C#$C$C$C$C$C$C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C{#Ct#Cm#Cf#C_#CX#CQ#CJ#CC#C<#C5#C.#C'#C #C#C#C #C#C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"Cx"Cq"Cj"Cc"C\"CU"CN"CG"C@"C9"C2"C+"C$"C"C"C"C"C"C!C!C!C!C!C!C!C!C!C!C!C!C!C!C!C!C!C!C|!Cu!Cn!Cg!C`!CY!CR!CK!CD!C=!C6!C/!C(!C!!C!C!C !C!C C C C C C C C C C C C C C C C C C C Cy Cr Ck Cd C] CV CO CH CA C: C3 C, C% C C C C C CCCCCCCCCCCCCCCCCCC}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CCCCCCCCCCCCCCCCCCCCCxCqCjCcC\CUCNCGC@C9C2C+C$CCCCCCCCCCCCCCCCCCCCCCCC|CuCnCgC`CYCRCKCDC=C6C/C(C!CCC CCCCCCCCCCCCCCCCCCCCCyCrCkCdC]CVCOCHCAC:C3C,C%CCCC CCCCCCCCCCCCCCCCCCCC}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CCCCCCCCCCCCCCCCCCCCCxCqCjCcC\CUCNCGC@C9C2C+C$CCCCCCCCCCCCCCCCCCCCCCCC|CuCnCgC`CYCRCKCDC=C6C/C(C!CCC CCCCCCCCCCCCCCCCCCCCCyCrCkCdC]CVCOCHCAC:C3C,C%CCCC CCCCCCCCCCCCCCCCCCCC}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CC C C C C C C C C C C C C C C C C C C Cx Cq Cj Cc C\ CU CN CG C@ C9 C2 C+ C$ C C C C C C C C C C C C C C C C C C C C C C C C| Cu Cn Cg C` CY CR CK CD C= C6 C/ C( C! C C C C C C C C C C C C C C C C C C C C C C C Cy Cr Ck Cd C] CV CO CH CA C: C3 C, C% C C C C C C C C C C C C C C C C C C C C C C C C} Cv Co Ch Ca CZ CS CL CE C> C7 C0 C) C" C C C C C C C C C C C C C C C C C C C C C C C Cz Cs Cl Ce C^ CW CP CI CB C; C4 C- C& C C C C C CCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CCCCCCCCCCCCCCCCCCCCCxCqCjCcC\CUCNCGC@C9C2C+C$CCCCCCCCCCCCCCCCCCCCCCCC|CuCnCgC`CYCRCKCDC=C6C/C(C!CCC CCCCCCCCCCCCCCCCCCCCCyCrCkCdC]CVCOCHCAC:C3C,C%CCCC CCCCCCCCCCCCCCCCCCCC}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CCBBBBBBBBBBBBBBBBBBBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBBBBBBBBBBBBBBBBBBB|BuBnBgB`BYBRBKBDB=B6B/B(B!BBB BBBBBBBBBBBBBBBBBBBBByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBBBBBBBBBBBBBBBBBBB}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBܼBռBμBǼBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBٻBһB˻BĻBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBݺBֺBϺBȺBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBܵBյBεBǵBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBٴBҴB˴BĴBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBݳBֳBϳBȳBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBܮBծBήBǮBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBB٭BҭB˭BĭBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBݬB֬BϬBȬBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBܧBէBΧBǧBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBB٦BҦB˦BĦBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBݥB֥BϥBȥBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBܠBՠBΠBǠBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBٟBҟB˟BğBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBݞB֞BϞBȞBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBܙBՙBΙBǙBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBB٘BҘB˘BĘBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBݗB֗BϗBȗBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBBܒBՒBΒBǒBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBّBґBˑBđBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBݐB֐BϐBȐBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBB܋BՋB΋BNjBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBيBҊBˊBĊBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBB݉B։BωBȉBBBBBBBBBBB{BtBmBfB_BXBQBJBCBB7B0B)B"BBB BBBBBBB܄BՄB΄BDŽBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBكB҃B˃BăBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBB݂BւBςBȂBBBBBBBBBBB{BtBmBfB_BXBQBJBCB~B7~B0~B)~B"~B~B~B ~B~B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}Bz}Bs}Bl}Be}B^}BW}BP}BI}BB}B;}B4}B-}B&}B}B}B}B }B}B|B|B|B|B|B|B|B|B|B|B|B|B|B|B|B|B|B|B~|Bw|Bp|Bi|Bb|B[|BT|BM|BF|B?|B8|B1|B*|B#|B|B|B|B|B|B{B{B{B{B{B{B{B{B{B{B{B{B{B{B{B{B{B{B{{Bt{Bm{Bf{B_{BX{BQ{BJ{BC{B<{B5{B.{B'{B {B{B{B {B{BzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBxzBqzBjzBczB\zBUzBNzBGzB@zB9zB2zB+zB$zBzBzBzBzBzByByByByByByByByByByByByByByByByByByB|yBuyBnyBgyB`yBYyBRyBKyBDyB=yB6yB/yB(yB!yByByB yByBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxByxBrxBkxBdxB]xBVxBOxBHxBAxB:xB3xB,xB%xBxBxBxB xBxBwBwBwBwBwBwBwBwBwBwBwBwBwBwBwBwBwBwB}wBvwBowBhwBawBZwBSwBLwBEwB>wB7wB0wB)wB"wBwBwB wBwBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBzvBsvBlvBevB^vBWvBPvBIvBBvB;vB4vB-vB&vBvBvBvB vBvBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuB~uBwuBpuBiuBbuB[uBTuBMuBFuB?uB8uB1uB*uB#uBuBuBuBuBuBtBtBtBtBtBtBtBtBtBtBtBtBtBtBtBtBtBtB{tBttBmtBftB_tBXtBQtBJtBCtBpB7pB0pB)pB"pBpBpB pBpBoBoBoBoBoBoBoBoBoBoBoBoBoBoBoBoBoBoBoBzoBsoBloBeoB^oBWoBPoBIoBBoB;oB4oB-oB&oBoBoBoB oBoBnBnBnBnBnBnBnBnBnBnBnBnBnBnBnBnBnBnB~nBwnBpnBinBbnB[nBTnBMnBFnB?nB8nB1nB*nB#nBnBnBnBnBnBmBmBmBmBmBmBmBmBmBmBmBmBmBmBmBmBmBmB{mBtmBmmBfmB_mBXmBQmBJmBCmBiB7iB0iB)iB"iBiBiB iBiBhBhBhBhBhBhBhBhBhBhBhBhBhBhBhBhBhBhBhBzhBshBlhBehB^hBWhBPhBIhBBhB;hB4hB-hB&hBhBhBhB hBhBgBgBgBgBgBgBgBgBgBgBgBgBgBgBgBgBgBgB~gBwgBpgBigBbgB[gBTgBMgBFgB?gB8gB1gB*gB#gBgBgBgBgBgBfBfBfBfBfBfBfBfBfBfBfBfBfBfBfBfBfBfB{fBtfBmfBffB_fBXfBQfBJfBCfBbB7bB0bB)bB"bBbBbB bBbBaBaBaBaBaBaBaBaBaBaBaBaBaBaBaBaBaBaBaBzaBsaBlaBeaB^aBWaBPaBIaBBaB;aB4aB-aB&aBaBaBaB aBaB`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B~`Bw`Bp`Bi`Bb`B[`BT`BM`BF`B?`B8`B1`B*`B#`B`B`B`B`B`B_B_B_B_B_B_B_B_B_B_B_B_B_B_B_B_B_B_B{_Bt_Bm_Bf_B__BX_BQ_BJ_BC_B<_B5_B._B'_B _B_B_B _B_B^B^B^B^B^B^B^B^B^B^B^B^B^B^B^B^B^B^B^Bx^Bq^Bj^Bc^B\^BU^BN^BG^B@^B9^B2^B+^B$^B^B^B^B^B^B]B]B]B]B]B]B]B]B]B]B]B]B]B]B]B]B]B]B|]Bu]Bn]Bg]B`]BY]BR]BK]BD]B=]B6]B/]B(]B!]B]B]B ]B]B\B\B\B\B\B\B\B\B\B\B\B\B\B\B\B\B\B\B\By\Br\Bk\Bd\B]\BV\BO\BH\BA\B:\B3\B,\B%\B\B\B\B \B\B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B}[Bv[Bo[Bh[Ba[BZ[BS[BL[BE[B>[B7[B0[B)[B"[B[B [B[BZBZBZBZBZBZBZBZBZBZBZBZBZBZBZBZBZBZBZBzZBsZBlZBeZB^ZBWZBPZBIZBBZB;ZB4ZB-ZB&ZBZBZBZB ZBZBYBYBYBYBYBYBYBYBYBYBYBYBYBYBYBYBYBYB~YBwYBpYBiYBbYB[YBTYBMYBFYB?YB8YB1YB*YB#YBYBYBYBYBYBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB{XBtXBmXBfXB_XBXXBQXBJXBCXBTB7TB0TB)TB"TBTBTB TBTBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBzSBsSBlSBeSB^SBWSBPSBISBBSB;SB4SB-SB&SBSBSBSB SBSBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRB~RBwRBpRBiRBbRB[RBTRBMRBFRB?RB8RB1RB*RB#RBRBRBRBRBRBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQB{QBtQBmQBfQB_QBXQBQQBJQBCQBMB7MB0MB)MB"MBMBMB MBMBLBLBLBLBLBLBLBLBLBLBLBLBLBLBLBLBLBLBLBzLBsLBlLBeLB^LBWLBPLBILBBLB;LB4LB-LB&LBLBLBLB LBLBKBKBKBKBKBKBKBKBKBKBKBKBKBKBKBKBKBKB~KBwKBpKBiKBbKB[KBTKBMKBFKB?KB8KB1KB*KB#KBKBKBKBKBKBJBJBJBJBJBJBJBJBJBJBJBJBJBJBJBJBJBJB{JBtJBmJBfJB_JBXJBQJBJJBCJBFB7FB0FB)FB"FBFBFB FBFBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBzEBsEBlEBeEB^EBWEBPEBIEBBEB;EB4EB-EB&EBEBEBEB EBEBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB~DBwDBpDBiDBbDB[DBTDBMDBFDB?DB8DB1DB*DB#DBDBDBDBDBDBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB{CBtCBmCBfCB_CBXCBQCBJCBCCB?B7?B0?B)?B"?B?B?B ?B?B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>Bz>Bs>Bl>Be>B^>BW>BP>BI>BB>B;>B4>B->B&>B>B>B>B >B>B=B=B=B=B=B=B=B=B=B=B=B=B=B=B=B=B=B=B~=Bw=Bp=Bi=Bb=B[=BT=BM=BF=B?=B8=B1=B*=B#=B=B=B=B=B=B8B78B08B)8B"8B8B8B 8B8B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7Bz7Bs7Bl7Be7B^7BW7BP7BI7BB7B;7B47B-7B&7B7B7B7B 7B7B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B~6Bw6Bp6Bi6Bb6B[6BT6BM6BF6B?6B86B16B*6B#6B6B6B6B6B6B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B{5Bt5Bm5Bf5B_5BX5BQ5BJ5BC5B<5B55B.5B'5B 5B5B5B 5B5B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4Bx4Bq4Bj4Bc4B\4BU4BN4BG4B@4B94B24B+4B$4B4B4B4B4B4B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B|3Bu3Bn3Bg3B`3BY3BR3BK3BD3B=3B63B/3B(3B!3B3B3B 3B3B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2By2Br2Bk2Bd2B]2BV2BO2BH2BA2B:2B32B,2B%2B2B2B2B 2B2B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B}1Bv1Bo1Bh1Ba1BZ1BS1BL1BE1B>1B71B01B)1B"1B1B1B 1B1B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0Bz0Bs0Bl0Be0B^0BW0BP0BI0BB0B;0B40B-0B&0B0B0B0B 0B0B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B~/Bw/Bp/Bi/Bb/B[/BT/BM/BF/B?/B8/B1/B*/B#/B/B/B/B/B/B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B{.Bt.Bm.Bf.B_.BX.BQ.BJ.BC.B<.B5.B..B'.B .B.B.B .B.B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-Bx-Bq-Bj-Bc-B\-BU-BN-BG-B@-B9-B2-B+-B$-B-B-B-B-B-B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B|,Bu,Bn,Bg,B`,BY,BR,BK,BD,B=,B6,B/,B(,B!,B,B,B ,B,B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+By+Br+Bk+Bd+B]+BV+BO+BH+BA+B:+B3+B,+B%+B+B+B+B +B+B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B}*Bv*Bo*Bh*Ba*BZ*BS*BL*BE*B>*B7*B0*B)*B"*B*B*B *B*B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)Bz)Bs)Bl)Be)B^)BW)BP)BI)BB)B;)B4)B-)B&)B)B)B)B )B)B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B~(Bw(Bp(Bi(Bb(B[(BT(BM(BF(B?(B8(B1(B*(B#(B(B(B(B(B(B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B{'Bt'Bm'Bf'B_'BX'BQ'BJ'BC'B<'B5'B.'B''B 'B'B'B 'B'B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&Bx&Bq&Bj&Bc&B\&BU&BN&BG&B@&B9&B2&B+&B$&B&B&B&B&B&B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B|%Bu%Bn%Bg%B`%BY%BR%BK%BD%B=%B6%B/%B(%B!%B%B%B %B%B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$By$Br$Bk$Bd$B]$BV$BO$BH$BA$B:$B3$B,$B%$B$B$B$B $B$B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B}#Bv#Bo#Bh#Ba#BZ#BS#BL#BE#B>#B7#B0#B)#B"#B#B#B #B#B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"Bz"Bs"Bl"Be"B^"BW"BP"BI"BB"B;"B4"B-"B&"B"B"B"B "B"B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B~!Bw!Bp!Bi!Bb!B[!BT!BM!BF!B?!B8!B1!B*!B#!B!B!B!B!B!B B B B B B B B B B B B B B B B B B B{ Bt Bm Bf B_ BX BQ BJ BC B< B5 B. B' B B B B B BBBBBBBBBBBBBBBBBBBBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBBBBBBBBBBBBBBBBBBB|BuBnBgB`BYBRBKBDB=B6B/B(B!BBB BBBBBBBBBBBBBBBBBBBBByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBBBBBBBBBBBBBBBBBBB}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB<B5B.B'B BBB BBBBBBBBBBBBBBBBBBBBBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBBBBBBBBBBBBBBBBBBB|BuBnBgB`BYBRBKBDB=B6B/B(B!BBB BBBBBBBBBBBBBBBBBBBBByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBBBBBBBBBBBBBBBBBBB}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB<B5B.B'B BBB BBBBBBBBBBBBBBBBBBBBBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBBBBBBBBBBBBBBBBBBB|BuBnBgB`BYBRBKBDB=B6B/B(B!BBB BBBBBBBBBBBBBBBBBBBBByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBBBBBBBBBBBBBBBBBBB}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BB B B B B B B B B B B B B B B B B B B Bz Bs Bl Be B^ BW BP BI BB B; B4 B- B& B B B B B B B B B B B B B B B B B B B B B B B B~ Bw Bp Bi Bb B[ BT BM BF B? B8 B1 B* B# B B B B B B B B B B B B B B B B B B B B B B B B{ Bt Bm Bf B_ BX BQ BJ BC B< B5 B. B' B B B B B B B B B B B B B B B B B B B B B B B B Bx Bq Bj Bc B\ BU BN BG B@ B9 B2 B+ B$ B B B B B B B B B B B B B B B B B B B B B B B B| Bu Bn Bg B` BY BR BK BD B= B6 B/ B( B! B B B B BBBBBBBBBBBBBBBBBBBByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBBBBBBBBBBBBBBBBBBB}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB<B5B.B'B BBB BBBBBBBBBBBBBBBBBBBBBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBBBBBBBBBBBBBBBBBBB|BuBnBgB`BYBRBKBDB=B6B/B(B!BBB BBBBBBBBBBBBBBBBBBBBByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBBBBBBBBBBBBBBBBBBB}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAٿAҿA˿AĿAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAݾA־AϾAȾAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAܹAչAιAǹAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAٸAҸA˸AĸAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAݷAַAϷAȷAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAܲAղAβADzAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAٱAұA˱AıAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAݰAְAϰAȰAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAܫAիAΫAǫAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAA٪AҪA˪AĪAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAݩA֩AϩAȩAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAܤAդAΤAǤAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAA٣AңAˣAģAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAݢA֢AϢAȢAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAܝA՝AΝAǝAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAٜAҜA˜AĜAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAݛA֛AϛAțAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAAܖAՖAΖAǖAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAٕAҕA˕AĕAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAݔA֔AϔAȔAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAA܏AՏAΏAǏAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAَAҎAˎAĎAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAݍA֍AύAȍAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAA܈AՈAΈALjAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAهA҇AˇAćAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAA݆AֆAφAȆAAAAAAAAAAA{AtAmAfA_AXAQAJACAA7A0A)A"AAA AAAAAAA܁AՁA΁AǁAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAـAҀAˀAĀAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA<A5A.A'A AAA AA~A~A~A~A~A~A~A~A~A~A~A~A~A~A~A~A~A~A~Ax~Aq~Aj~Ac~A\~AU~AN~AG~A@~A9~A2~A+~A$~A~A~A~A~A~A}A}A}A}A}A}A}A}A}A}A}A}A}A}A}A}A}A}A|}Au}An}Ag}A`}AY}AR}AK}AD}A=}A6}A/}A(}A!}A}A}A }A}A|A|A|A|A|A|A|A|A|A|A|A|A|A|A|A|A|A|A|Ay|Ar|Ak|Ad|A]|AV|AO|AH|AA|A:|A3|A,|A%|A|A|A|A |A|A{A{A{A{A{A{A{A{A{A{A{A{A{A{A{A{A{A{A}{Av{Ao{Ah{Aa{AZ{AS{AL{AE{A>{A7{A0{A){A"{A{A{A {A{AzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzzAszAlzAezA^zAWzAPzAIzABzA;zA4zA-zA&zAzAzAzA zAzAyAyAyAyAyAyAyAyAyAyAyAyAyAyAyAyAyAyA~yAwyApyAiyAbyA[yATyAMyAFyA?yA8yA1yA*yA#yAyAyAyAyAyAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxA{xAtxAmxAfxA_xAXxAQxAJxACxAtA7tA0tA)tA"tAtAtA tAtAsAsAsAsAsAsAsAsAsAsAsAsAsAsAsAsAsAsAsAzsAssAlsAesA^sAWsAPsAIsABsA;sA4sA-sA&sAsAsAsA sAsArArArArArArArArArArArArArArArArArArA~rAwrAprAirAbrA[rATrAMrAFrA?rA8rA1rA*rA#rArArArArArAqAqAqAqAqAqAqAqAqAqAqAqAqAqAqAqAqAqA{qAtqAmqAfqA_qAXqAQqAJqACqAmA7mA0mA)mA"mAmAmA mAmAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAzlAslAllAelA^lAWlAPlAIlABlA;lA4lA-lA&lAlAlAlA lAlAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA~kAwkApkAikAbkA[kATkAMkAFkA?kA8kA1kA*kA#kAkAkAkAkAkAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjA{jAtjAmjAfjA_jAXjAQjAJjACjAfA7fA0fA)fA"fAfAfA fAfAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAzeAseAleAeeA^eAWeAPeAIeABeA;eA4eA-eA&eAeAeAeA eAeAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdA~dAwdApdAidAbdA[dATdAMdAFdA?dA8dA1dA*dA#dAdAdAdAdAdAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcA{cAtcAmcAfcA_cAXcAQcAJcACcA_A7_A0_A)_A"_A_A_A _A_A^A^A^A^A^A^A^A^A^A^A^A^A^A^A^A^A^A^A^Az^As^Al^Ae^A^^AW^AP^AI^AB^A;^A4^A-^A&^A^A^A^A ^A^A]A]A]A]A]A]A]A]A]A]A]A]A]A]A]A]A]A]A~]Aw]Ap]Ai]Ab]A[]AT]AM]AF]A?]A8]A1]A*]A#]A]A]A]A]A]A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A{\At\Am\Af\A_\AX\AQ\AJ\AC\A<\A5\A.\A'\A \A\A\A \A\A[A[A[A[A[A[A[A[A[A[A[A[A[A[A[A[A[A[A[Ax[Aq[Aj[Ac[A\[AU[AN[AG[A@[A9[A2[A+[A$[A[A[A[A[A[AZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZA|ZAuZAnZAgZA`ZAYZARZAKZADZA=ZA6ZA/ZA(ZA!ZAZAZA ZAZAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAyYArYAkYAdYA]YAVYAOYAHYAAYA:YA3YA,YA%YAYAYAYA YAYAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXA}XAvXAoXAhXAaXAZXASXALXAEXA>XA7XA0XA)XA"XAXAXA XAXAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAzWAsWAlWAeWA^WAWWAPWAIWABWA;WA4WA-WA&WAWAWAWA WAWAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVA~VAwVApVAiVAbVA[VATVAMVAFVA?VA8VA1VA*VA#VAVAVAVAVAVAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUA{UAtUAmUAfUA_UAXUAQUAJUACUAQA7QA0QA)QA"QAQAQA QAQAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAzPAsPAlPAePA^PAWPAPPAIPABPA;PA4PA-PA&PAPAPAPA PAPAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOA~OAwOApOAiOAbOA[OATOAMOAFOA?OA8OA1OA*OA#OAOAOAOAOAOANANANANANANANANANANANANANANANANANANA{NAtNAmNAfNA_NAXNAQNAJNACNAJA7JA0JA)JA"JAJAJA JAJAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAzIAsIAlIAeIA^IAWIAPIAIIABIA;IA4IA-IA&IAIAIAIA IAIAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHA~HAwHApHAiHAbHA[HATHAMHAFHA?HA8HA1HA*HA#HAHAHAHAHAHAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGA{GAtGAmGAfGA_GAXGAQGAJGACGACA7CA0CA)CA"CACACA CACABABABABABABABABABABABABABABABABABABABAzBAsBAlBAeBA^BAWBAPBAIBABBA;BA4BA-BA&BABABABA BABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~AAwAApAAiAAbAA[AATAAMAAFAA?AA8AA1AA*AA#AAAAAAAAAAAA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A{@At@Am@Af@A_@AX@AQ@AJ@AC@A<@A5@A.@A'@A @A@A@A @A@A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?Ax?Aq?Aj?Ac?A\?AU?AN?AG?A@?A9?A2?A+?A$?A?A?A?A?A?A>A>A>A>A>A>A>A>A>A>A>A>A>A>A>A>A>A>A|>Au>An>Ag>A`>AY>AR>AK>AD>A=>A6>A/>A(>A!>A>A>A >A>A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=Ay=Ar=Ak=Ad=A]=AV=AO=AH=AA=A:=A3=A,=A%=A=A=A=A =A=A5A75A05A)5A"5A5A5A 5A5A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4Az4As4Al4Ae4A^4AW4AP4AI4AB4A;4A44A-4A&4A4A4A4A 4A4A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A~3Aw3Ap3Ai3Ab3A[3AT3AM3AF3A?3A83A13A*3A#3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A{2At2Am2Af2A_2AX2AQ2AJ2AC2A<2A52A.2A'2A 2A2A2A 2A2A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1Ax1Aq1Aj1Ac1A\1AU1AN1AG1A@1A91A21A+1A$1A1A1A1A1A1A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A|0Au0An0Ag0A`0AY0AR0AK0AD0A=0A60A/0A(0A!0A0A0A 0A0A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/Ay/Ar/Ak/Ad/A]/AV/AO/AH/AA/A:/A3/A,/A%/A/A/A/A /A/A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A}.Av.Ao.Ah.Aa.AZ.AS.AL.AE.A>.A7.A0.A).A".A.A.A .A.A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-Az-As-Al-Ae-A^-AW-AP-AI-AB-A;-A4-A--A&-A-A-A-A -A-A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A~,Aw,Ap,Ai,Ab,A[,AT,AM,AF,A?,A8,A1,A*,A#,A,A,A,A,A,A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A+A{+At+Am+Af+A_+AX+AQ+AJ+AC+A<+A5+A.+A'+A +A+A+A +A+A*A*A*A*A*A*A*A*A*A*A*A*A*A*A*A*A*A*A*Ax*Aq*Aj*Ac*A\*AU*AN*AG*A@*A9*A2*A+*A$*A*A*A*A*A*A)A)A)A)A)A)A)A)A)A)A)A)A)A)A)A)A)A)A|)Au)An)Ag)A`)AY)AR)AK)AD)A=)A6)A/)A()A!)A)A)A )A)A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(Ay(Ar(Ak(Ad(A](AV(AO(AH(AA(A:(A3(A,(A%(A(A(A(A (A(A'A'A'A'A'A'A'A'A'A'A'A'A'A'A'A'A'A'A}'Av'Ao'Ah'Aa'AZ'AS'AL'AE'A>'A7'A0'A)'A"'A'A'A 'A'A&A&A&A&A&A&A&A&A&A&A&A&A&A&A&A&A&A&A&Az&As&Al&Ae&A^&AW&AP&AI&AB&A;&A4&A-&A&&A&A&A&A &A&A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A~%Aw%Ap%Ai%Ab%A[%AT%AM%AF%A?%A8%A1%A*%A#%A%A%A%A%A%A$A$A$A$A$A$A$A$A$A$A$A$A$A$A$A$A$A$A{$At$Am$Af$A_$AX$AQ$AJ$AC$A<$A5$A.$A'$A $A$A$A $A$A#A#A#A#A#A#A#A#A#A#A#A#A#A#A#A#A#A#A#Ax#Aq#Aj#Ac#A\#AU#AN#AG#A@#A9#A2#A+#A$#A#A#A#A#A#A"A"A"A"A"A"A"A"A"A"A"A"A"A"A"A"A"A"A|"Au"An"Ag"A`"AY"AR"AK"AD"A="A6"A/"A("A!"A"A"A "A"A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!Ay!Ar!Ak!Ad!A]!AV!AO!AH!AA!A:!A3!A,!A%!A!A!A!A !A!A A A A A A A A A A A A A A A A A A A} Av Ao Ah Aa AZ AS AL AE A> A7 A0 A) A" A A A A AAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAAAAAAAAAAAAAAAAAAAAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAAAAAAAAAAAAAAAAAAAA|AuAnAgA`AYARAKADA=A6A/A(A!AAA AAAAAAAAAAAAAAAAAAAAAyArAkAdA]AVAOAHAAA:A3A,A%AAAA AAAAAAAAAAAAAAAAAAAA}AvAoAhAaAZASALAEA>A7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAAAAAAAAAAAAAAAAAAAAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAAAAAAAAAAAAAAAAAAAA|AuAnAgA`AYARAKADA=A6A/A(A!AAA AAAAAAAAAAAAAAAAAAAAAyArAkAdA]AVAOAHAAA:A3A,A%AAAA AAAAAAAAAAAAAAAAAAAA}AvAoAhAaAZASALAEA>A7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAAAAAAAAAAAAAAAAAAAAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAA A A A A A A A A A A A A A A A A A A| Au An Ag A` AY AR AK AD A= A6 A/ A( A! A A A A A A A A A A A A A A A A A A A A A A A Ay Ar Ak Ad A] AV AO AH AA A: A3 A, A% A A A A A A A A A A A A A A A A A A A A A A A A} Av Ao Ah Aa AZ AS AL AE A> A7 A0 A) A" A A A A A A A A A A A A A A A A A A A A A A A Az As Al Ae A^ AW AP AI AB A; A4 A- A& A A A A A A A A A A A A A A A A A A A A A A A A~ Aw Ap Ai Ab A[ AT AM AF A? A8 A1 A* A# A A A A A AAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAAAAAAAAAAAAAAAAAAAAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAAAAAAAAAAAAAAAAAAAA|AuAnAgA`AYARAKADA=A6A/A(A!AAA AAAAAAAAAAAAAAAAAAAAAyArAkAdA]AVAOAHAAA:A3A,A%AAAA AAAAAAAAAAAAAAAAAAAA}AvAoAhAaAZASALAEA>A7A0A)A"AAA AAAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAAAAAAAAAAAAAAAAAAAAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAA@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@ۿ@Կ@Ϳ@ƿ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@߾@ؾ@Ѿ@ʾ@þ@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@ܽ@ս@ν@ǽ@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@ټ@Ҽ@˼@ļ@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@ݻ@ֻ@ϻ@Ȼ@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@ں@Ӻ@̺@ź@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@޹@׹@й@ɹ@¹@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@۸@Ը@͸@Ƹ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@߷@ط@ѷ@ʷ@÷@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@ܶ@ն@ζ@Ƕ@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@ٵ@ҵ@˵@ĵ@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@ݴ@ִ@ϴ@ȴ@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@ڳ@ӳ@̳@ų@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@޲@ײ@в@ɲ@²@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@۱@Ա@ͱ@Ʊ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@߰@ذ@Ѱ@ʰ@ð@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@ܯ@կ@ί@ǯ@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@ٮ@Ү@ˮ@Į@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@ݭ@֭@ϭ@ȭ@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@ڬ@Ӭ@̬@Ŭ@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@ޫ@׫@Ы@ɫ@«@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@۪@Ԫ@ͪ@ƪ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@ߩ@ة@ѩ@ʩ@é@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@ܨ@ը@Ψ@Ǩ@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@٧@ҧ@˧@ħ@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@ݦ@֦@Ϧ@Ȧ@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@ڥ@ӥ@̥@ť@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@ޤ@פ@Ф@ɤ@¤@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@ۣ@ԣ@ͣ@ƣ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@ߢ@آ@Ѣ@ʢ@â@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@ܡ@ա@Ρ@ǡ@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@٠@Ҡ@ˠ@Ġ@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@ݟ@֟@ϟ@ȟ@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@ڞ@Ӟ@̞@Ş@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@ޝ@ם@Н@ɝ@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@ۜ@Ԝ@͜@Ɯ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@ߛ@؛@ћ@ʛ@Û@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@ܚ@՚@Κ@ǚ@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@ٙ@ҙ@˙@ę@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@ݘ@֘@Ϙ@Ș@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@ڗ@ӗ@̗@ŗ@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@ޖ@ז@Ж@ɖ@–@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@ە@ԕ@͕@ƕ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@ߔ@ؔ@є@ʔ@Ô@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@ܓ@Փ@Γ@Ǔ@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@ْ@Ғ@˒@Ē@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@ݑ@֑@ϑ@ȑ@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@ڐ@Ӑ@̐@Ő@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@ޏ@׏@Џ@ɏ@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@ێ@Ԏ@͎@Ǝ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@ߍ@؍@э@ʍ@Í@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@܌@Ռ@Ό@nj@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@ً@ҋ@ˋ@ċ@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@݊@֊@ϊ@Ȋ@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@ډ@Ӊ@̉@ʼn@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@ވ@׈@Ј@Ɉ@ˆ@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@ۇ@ԇ@͇@Ƈ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@߆@؆@ц@ʆ@Æ@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@܅@Յ@΅@Dž@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@ل@҄@˄@Ą@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@݃@փ@σ@ȃ@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@ڂ@ӂ@̂@ł@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@ށ@ׁ@Ё@Ɂ@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@ۀ@Ԁ@̀@ƀ@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@z~@s~@l~@e~@^~@W~@P~@I~@B~@;~@4~@-~@&~@~@~@~@ ~@~@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@~}@w}@p}@i}@b}@[}@T}@M}@F}@?}@8}@1}@*}@#}@}@}@}@}@}@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@{|@t|@m|@f|@_|@X|@Q|@J|@C|@<|@5|@.|@'|@ |@|@|@ |@|@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@x{@q{@j{@c{@\{@U{@N{@G{@@{@9{@2{@+{@${@{@{@{@{@{@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@|z@uz@nz@gz@`z@Yz@Rz@Kz@Dz@=z@6z@/z@(z@!z@z@z@ z@z@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@yy@ry@ky@dy@]y@Vy@Oy@Hy@Ay@:y@3y@,y@%y@y@y@y@ y@y@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@}x@vx@ox@hx@ax@Zx@Sx@Lx@Ex@>x@7x@0x@)x@"x@x@x@ x@x@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@zw@sw@lw@ew@^w@Ww@Pw@Iw@Bw@;w@4w@-w@&w@w@w@w@ w@w@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@~v@wv@pv@iv@bv@[v@Tv@Mv@Fv@?v@8v@1v@*v@#v@v@v@v@v@v@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@{u@tu@mu@fu@_u@Xu@Qu@Ju@Cu@q@7q@0q@)q@"q@q@q@ q@q@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@zp@sp@lp@ep@^p@Wp@Pp@Ip@Bp@;p@4p@-p@&p@p@p@p@ p@p@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@~o@wo@po@io@bo@[o@To@Mo@Fo@?o@8o@1o@*o@#o@o@o@o@o@o@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@{n@tn@mn@fn@_n@Xn@Qn@Jn@Cn@j@7j@0j@)j@"j@j@j@ j@j@i@i@i@i@i@i@i@i@i@i@i@i@i@i@i@i@i@i@i@zi@si@li@ei@^i@Wi@Pi@Ii@Bi@;i@4i@-i@&i@i@i@i@ i@i@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@~h@wh@ph@ih@bh@[h@Th@Mh@Fh@?h@8h@1h@*h@#h@h@h@h@h@h@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@{g@tg@mg@fg@_g@Xg@Qg@Jg@Cg@c@7c@0c@)c@"c@c@c@ c@c@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@zb@sb@lb@eb@^b@Wb@Pb@Ib@Bb@;b@4b@-b@&b@b@b@b@ b@b@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@~a@wa@pa@ia@ba@[a@Ta@Ma@Fa@?a@8a@1a@*a@#a@a@a@a@a@a@`@`@`@`@`@`@`@`@`@`@`@`@`@`@`@`@`@`@{`@t`@m`@f`@_`@X`@Q`@J`@C`@<`@5`@.`@'`@ `@`@`@ `@`@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@x_@q_@j_@c_@\_@U_@N_@G_@@_@9_@2_@+_@$_@_@_@_@_@_@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@|^@u^@n^@g^@`^@Y^@R^@K^@D^@=^@6^@/^@(^@!^@^@^@ ^@^@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@y]@r]@k]@d]@]]@V]@O]@H]@A]@:]@3]@,]@%]@]@]@]@ ]@]@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@}\@v\@o\@h\@a\@Z\@S\@L\@E\@>\@7\@0\@)\@"\@\@\@ \@\@[@[@[@[@[@[@[@[@[@[@[@[@[@[@[@[@[@[@[@z[@s[@l[@e[@^[@W[@P[@I[@B[@;[@4[@-[@&[@[@[@[@ [@[@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@~Z@wZ@pZ@iZ@bZ@[Z@TZ@MZ@FZ@?Z@8Z@1Z@*Z@#Z@Z@Z@Z@Z@Z@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@{Y@tY@mY@fY@_Y@XY@QY@JY@CY@U@7U@0U@)U@"U@U@U@ U@U@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@zT@sT@lT@eT@^T@WT@PT@IT@BT@;T@4T@-T@&T@T@T@T@ T@T@S@S@S@S@S@S@S@S@S@S@S@S@S@S@S@S@S@S@~S@wS@pS@iS@bS@[S@TS@MS@FS@?S@8S@1S@*S@#S@S@S@S@S@S@R@R@R@R@R@R@R@R@R@R@R@R@R@R@R@R@R@R@{R@tR@mR@fR@_R@XR@QR@JR@CR@N@7N@0N@)N@"N@N@N@ N@N@M@M@M@M@M@M@M@M@M@M@M@M@M@M@M@M@M@M@M@zM@sM@lM@eM@^M@WM@PM@IM@BM@;M@4M@-M@&M@M@M@M@ M@M@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@~L@wL@pL@iL@bL@[L@TL@ML@FL@?L@8L@1L@*L@#L@L@L@L@L@L@K@K@K@K@K@K@K@K@K@K@K@K@K@K@K@K@K@K@{K@tK@mK@fK@_K@XK@QK@JK@CK@G@7G@0G@)G@"G@G@G@ G@G@F@F@F@F@F@F@F@F@F@F@F@F@F@F@F@F@F@F@F@zF@sF@lF@eF@^F@WF@PF@IF@BF@;F@4F@-F@&F@F@F@F@ F@F@E@E@E@E@E@E@E@E@E@E@E@E@E@E@E@E@E@E@~E@wE@pE@iE@bE@[E@TE@ME@FE@?E@8E@1E@*E@#E@E@E@E@E@E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@{D@tD@mD@fD@_D@XD@QD@JD@CD@@@7@@0@@)@@"@@@@@@ @@@@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@z?@s?@l?@e?@^?@W?@P?@I?@B?@;?@4?@-?@&?@?@?@?@ ?@?@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@~>@w>@p>@i>@b>@[>@T>@M>@F>@?>@8>@1>@*>@#>@>@>@>@>@>@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@{=@t=@m=@f=@_=@X=@Q=@J=@C=@<=@5=@.=@'=@ =@=@=@ =@=@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@x<@q<@j<@c<@\<@U<@N<@G<@@<@9<@2<@+<@$<@<@<@<@<@<@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@|;@u;@n;@g;@`;@Y;@R;@K;@D;@=;@6;@/;@(;@!;@;@;@ ;@;@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@y:@r:@k:@d:@]:@V:@O:@H:@A:@::@3:@,:@%:@:@:@:@ :@:@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@}9@v9@o9@h9@a9@Z9@S9@L9@E9@>9@79@09@)9@"9@9@9@ 9@9@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@z8@s8@l8@e8@^8@W8@P8@I8@B8@;8@48@-8@&8@8@8@8@ 8@8@7@7@7@7@7@7@7@7@7@7@7@7@7@7@7@7@7@7@~7@w7@p7@i7@b7@[7@T7@M7@F7@?7@87@17@*7@#7@7@7@7@7@7@6@6@6@6@6@6@6@6@6@6@6@6@6@6@6@6@6@6@{6@t6@m6@f6@_6@X6@Q6@J6@C6@<6@56@.6@'6@ 6@6@6@ 6@6@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@x5@q5@j5@c5@\5@U5@N5@G5@@5@95@25@+5@$5@5@5@5@5@5@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@|4@u4@n4@g4@`4@Y4@R4@K4@D4@=4@64@/4@(4@!4@4@4@ 4@4@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@y3@r3@k3@d3@]3@V3@O3@H3@A3@:3@33@,3@%3@3@3@3@ 3@3@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@}2@v2@o2@h2@a2@Z2@S2@L2@E2@>2@72@02@)2@"2@2@2@ 2@2@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@z1@s1@l1@e1@^1@W1@P1@I1@B1@;1@41@-1@&1@1@1@1@ 1@1@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@~0@w0@p0@i0@b0@[0@T0@M0@F0@?0@80@10@*0@#0@0@0@0@0@0@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@{/@t/@m/@f/@_/@X/@Q/@J/@C/@+@7+@0+@)+@"+@+@+@ +@+@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@z*@s*@l*@e*@^*@W*@P*@I*@B*@;*@4*@-*@&*@*@*@*@ *@*@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@~)@w)@p)@i)@b)@[)@T)@M)@F)@?)@8)@1)@*)@#)@)@)@)@)@)@(@(@(@(@(@(@(@(@(@(@(@(@(@(@(@(@(@(@{(@t(@m(@f(@_(@X(@Q(@J(@C(@<(@5(@.(@'(@ (@(@(@ (@(@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@x'@q'@j'@c'@\'@U'@N'@G'@@'@9'@2'@+'@$'@'@'@'@'@'@&@&@&@&@&@&@&@&@&@&@&@&@&@&@&@&@&@&@|&@u&@n&@g&@`&@Y&@R&@K&@D&@=&@6&@/&@(&@!&@&@&@ &@&@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@y%@r%@k%@d%@]%@V%@O%@H%@A%@:%@3%@,%@%%@%@%@%@ %@%@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@}$@v$@o$@h$@a$@Z$@S$@L$@E$@>$@7$@0$@)$@"$@$@$@ $@$@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@z#@s#@l#@e#@^#@W#@P#@I#@B#@;#@4#@-#@&#@#@#@#@ #@#@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@~"@w"@p"@i"@b"@["@T"@M"@F"@?"@8"@1"@*"@#"@"@"@"@"@"@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@{!@t!@m!@f!@_!@X!@Q!@J!@C!@@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @~ @w @p @i @b @[ @T @M @F @? @8 @1 @* @# @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @{ @t @m @f @_ @X @Q @J @C @< @5 @. @' @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @x @q @j @c @\ @U @N @G @@ @9 @2 @+ @$ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @| @u @n @g @` @Y @R @K @D @= @6 @/ @( @! @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @y @r @k @d @] @V @O @H @A @: @3 @, @% @ @ @ @ @ @@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@@@@@@@@@@@@@@@@@@@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@@@@@@@@@@@@@@@@@@@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@@@@@@@@@@@@@@@@@@@@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@@@@@@@@@@@@@@@@@@@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????ݿ?ֿ?Ͽ?ȿ???????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ???????ܺ?պ?κ?Ǻ???????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ???????ٹ?ҹ?˹?Ĺ??????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????ݸ?ָ?ϸ?ȸ???????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ???????ܳ?ճ?γ?dz???????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ???????ٲ?Ҳ?˲?IJ??????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????ݱ?ֱ?ϱ?ȱ???????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ???????ܬ?լ?ά?Ǭ???????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ???????٫?ҫ?˫?ī??????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????ݪ?֪?Ϫ?Ȫ???????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ???????ܥ?ե?Υ?ǥ???????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ???????٤?Ҥ?ˤ?Ĥ??????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????ݣ?֣?ϣ?ȣ???????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ???????ܞ?՞?Ξ?Ǟ???????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ???????ٝ?ҝ?˝?ĝ??????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????ݜ?֜?Ϝ?Ȝ???????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ???????ܗ?՗?Η?Ǘ???????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ???????ٖ?Җ?˖?Ė??????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????ݕ?֕?ϕ?ȕ???????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ???????ܐ?Ր?ΐ?ǐ???????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ???????ُ?ҏ?ˏ?ď??????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????ݎ?֎?ώ?Ȏ???????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ???????܉?Չ?Ή?lj???????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ???????و?҈?ˈ?Ĉ??????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????݇?և?χ?ȇ???????????{?t?m?f?_?X?Q?J?C??7?0?)?"??? ???????܂?Ղ?΂?ǂ???????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ???????ف?ҁ?ˁ?ā??????????~?w?p?i?b?[?T?M?F???8?1?*?#??????????݀?ր?π?Ȁ???????????{?t?m?f?_?X?Q?J?C?|?7|?0|?)|?"|?|?|? |?|?{?{?{?{?{?{?{?{?{?{?{?{?{?{?{?{?{?{?{?z{?s{?l{?e{?^{?W{?P{?I{?B{?;{?4{?-{?&{?{?{?{? {?{?z?z?z?z?z?z?z?z?z?z?z?z?z?z?z?z?z?z?~z?wz?pz?iz?bz?[z?Tz?Mz?Fz??z?8z?1z?*z?#z?z?z?z?z?z?y?y?y?y?y?y?y?y?y?y?y?y?y?y?y?y?y?y?{y?ty?my?fy?_y?Xy?Qy?Jy?Cy?u?7u?0u?)u?"u?u?u? u?u?t?t?t?t?t?t?t?t?t?t?t?t?t?t?t?t?t?t?t?zt?st?lt?et?^t?Wt?Pt?It?Bt?;t?4t?-t?&t?t?t?t? t?t?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s?~s?ws?ps?is?bs?[s?Ts?Ms?Fs??s?8s?1s?*s?#s?s?s?s?s?s?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?r?{r?tr?mr?fr?_r?Xr?Qr?Jr?Cr?n?7n?0n?)n?"n?n?n? n?n?m?m?m?m?m?m?m?m?m?m?m?m?m?m?m?m?m?m?m?zm?sm?lm?em?^m?Wm?Pm?Im?Bm?;m?4m?-m?&m?m?m?m? m?m?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l?~l?wl?pl?il?bl?[l?Tl?Ml?Fl??l?8l?1l?*l?#l?l?l?l?l?l?k?k?k?k?k?k?k?k?k?k?k?k?k?k?k?k?k?k?{k?tk?mk?fk?_k?Xk?Qk?Jk?Ck?g?7g?0g?)g?"g?g?g? g?g?f?f?f?f?f?f?f?f?f?f?f?f?f?f?f?f?f?f?f?zf?sf?lf?ef?^f?Wf?Pf?If?Bf?;f?4f?-f?&f?f?f?f? f?f?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?~e?we?pe?ie?be?[e?Te?Me?Fe??e?8e?1e?*e?#e?e?e?e?e?e?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?{d?td?md?fd?_d?Xd?Qd?Jd?Cd?`?7`?0`?)`?"`?`?`? `?`?_?_?_?_?_?_?_?_?_?_?_?_?_?_?_?_?_?_?_?z_?s_?l_?e_?^_?W_?P_?I_?B_?;_?4_?-_?&_?_?_?_? _?_?^?^?^?^?^?^?^?^?^?^?^?^?^?^?^?^?^?^?~^?w^?p^?i^?b^?[^?T^?M^?F^??^?8^?1^?*^?#^?^?^?^?^?^?]?]?]?]?]?]?]?]?]?]?]?]?]?]?]?]?]?]?{]?t]?m]?f]?_]?X]?Q]?J]?C]?<]?5]?.]?']? ]?]?]? ]?]?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?x\?q\?j\?c\?\\?U\?N\?G\?@\?9\?2\?+\?$\?\?\?\?\?\?[?[?[?[?[?[?[?[?[?[?[?[?[?[?[?[?[?[?|[?u[?n[?g[?`[?Y[?R[?K[?D[?=[?6[?/[?([?![?[?[? [?[?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?yZ?rZ?kZ?dZ?]Z?VZ?OZ?HZ?AZ?:Z?3Z?,Z?%Z?Z?Z?Z? Z?Z?Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?}Y?vY?oY?hY?aY?ZY?SY?LY?EY?>Y?7Y?0Y?)Y?"Y?Y?Y? Y?Y?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?zX?sX?lX?eX?^X?WX?PX?IX?BX?;X?4X?-X?&X?X?X?X? X?X?W?W?W?W?W?W?W?W?W?W?W?W?W?W?W?W?W?W?~W?wW?pW?iW?bW?[W?TW?MW?FW??W?8W?1W?*W?#W?W?W?W?W?W?V?V?V?V?V?V?V?V?V?V?V?V?V?V?V?V?V?V?{V?tV?mV?fV?_V?XV?QV?JV?CV?R?7R?0R?)R?"R?R?R? R?R?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?zQ?sQ?lQ?eQ?^Q?WQ?PQ?IQ?BQ?;Q?4Q?-Q?&Q?Q?Q?Q? Q?Q?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?~P?wP?pP?iP?bP?[P?TP?MP?FP??P?8P?1P?*P?#P?P?P?P?P?P?O?O?O?O?O?O?O?O?O?O?O?O?O?O?O?O?O?O?{O?tO?mO?fO?_O?XO?QO?JO?CO?K?7K?0K?)K?"K?K?K? K?K?J?J?J?J?J?J?J?J?J?J?J?J?J?J?J?J?J?J?J?zJ?sJ?lJ?eJ?^J?WJ?PJ?IJ?BJ?;J?4J?-J?&J?J?J?J? J?J?I?I?I?I?I?I?I?I?I?I?I?I?I?I?I?I?I?I?~I?wI?pI?iI?bI?[I?TI?MI?FI??I?8I?1I?*I?#I?I?I?I?I?I?H?H?H?H?H?H?H?H?H?H?H?H?H?H?H?H?H?H?{H?tH?mH?fH?_H?XH?QH?JH?CH?D?7D?0D?)D?"D?D?D? D?D?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?zC?sC?lC?eC?^C?WC?PC?IC?BC?;C?4C?-C?&C?C?C?C? C?C?B?B?B?B?B?B?B?B?B?B?B?B?B?B?B?B?B?B?~B?wB?pB?iB?bB?[B?TB?MB?FB??B?8B?1B?*B?#B?B?B?B?B?B?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?{A?tA?mA?fA?_A?XA?QA?JA?CA??>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?y>?r>?k>?d>?]>?V>?O>?H>?A>?:>?3>?,>?%>?>?>?>? >?>?=?=?=?=?=?=?=?=?=?=?=?=?=?=?=?=?=?=?}=?v=?o=?h=?a=?Z=?S=?L=?E=?>=?7=?0=?)=?"=?=?=? =?=?6?76?06?)6?"6?6?6? 6?6?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?z5?s5?l5?e5?^5?W5?P5?I5?B5?;5?45?-5?&5?5?5?5? 5?5?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?~4?w4?p4?i4?b4?[4?T4?M4?F4??4?84?14?*4?#4?4?4?4?4?4?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?{3?t3?m3?f3?_3?X3?Q3?J3?C3?<3?53?.3?'3? 3?3?3? 3?3?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?x2?q2?j2?c2?\2?U2?N2?G2?@2?92?22?+2?$2?2?2?2?2?2?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?|1?u1?n1?g1?`1?Y1?R1?K1?D1?=1?61?/1?(1?!1?1?1? 1?1?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?y0?r0?k0?d0?]0?V0?O0?H0?A0?:0?30?,0?%0?0?0?0? 0?0?/?/?/?/?/?/?/?/?/?/?/?/?/?/?/?/?/?/?}/?v/?o/?h/?a/?Z/?S/?L/?E/?>/?7/?0/?)/?"/?/?/? /?/?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?z.?s.?l.?e.?^.?W.?P.?I.?B.?;.?4.?-.?&.?.?.?.? .?.?-?-?-?-?-?-?-?-?-?-?-?-?-?-?-?-?-?-?~-?w-?p-?i-?b-?[-?T-?M-?F-??-?8-?1-?*-?#-?-?-?-?-?-?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?{,?t,?m,?f,?_,?X,?Q,?J,?C,?<,?5,?.,?',? ,?,?,? ,?,?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?x+?q+?j+?c+?\+?U+?N+?G+?@+?9+?2+?++?$+?+?+?+?+?+?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?|*?u*?n*?g*?`*?Y*?R*?K*?D*?=*?6*?/*?(*?!*?*?*? *?*?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?y)?r)?k)?d)?])?V)?O)?H)?A)?:)?3)?,)?%)?)?)?)? )?)?(?(?(?(?(?(?(?(?(?(?(?(?(?(?(?(?(?(?}(?v(?o(?h(?a(?Z(?S(?L(?E(?>(?7(?0(?)(?"(?(?(? (?(?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?z'?s'?l'?e'?^'?W'?P'?I'?B'?;'?4'?-'?&'?'?'?'? '?'?&?&?&?&?&?&?&?&?&?&?&?&?&?&?&?&?&?&?~&?w&?p&?i&?b&?[&?T&?M&?F&??&?8&?1&?*&?#&?&?&?&?&?&?%?%?%?%?%?%?%?%?%?%?%?%?%?%?%?%?%?%?{%?t%?m%?f%?_%?X%?Q%?J%?C%?<%?5%?.%?'%? %?%?%? %?%?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?x$?q$?j$?c$?\$?U$?N$?G$?@$?9$?2$?+$?$$?$?$?$?$?$?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?|#?u#?n#?g#?`#?Y#?R#?K#?D#?=#?6#?/#?(#?!#?#?#? #?#?"?"?"?"?"?"?"?"?"?"?"?"?"?"?"?"?"?"?"?y"?r"?k"?d"?]"?V"?O"?H"?A"?:"?3"?,"?%"?"?"?"? "?"?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?}!?v!?o!?h!?a!?Z!?S!?L!?E!?>!?7!?0!?)!?"!?!?!? !?!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?z ?s ?l ?e ?^ ?W ?P ?I ?B ?; ?4 ?- ?& ? ? ? ? ? ???????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C?<?5?.?'? ??? ?????????????????????x?q?j?c?\?U?N?G?@?9?2?+?$????????????????????????|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ?????????????????????y?r?k?d?]?V?O?H?A?:?3?,?%???? ????????????????????}?v?o?h?a?Z?S?L?E?>?7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C?<?5?.?'? ??? ?????????????????????x?q?j?c?\?U?N?G?@?9?2?+?$????????????????????????|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ?????????????????????y?r?k?d?]?V?O?H?A?:?3?,?%???? ????????????????????}?v?o?h?a?Z?S?L?E?>?7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C?<?5?.?'? ??? ?????????????????????x?q?j?c?\?U?N?G?@?9?2?+?$????????????????????????|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?y ?r ?k ?d ?] ?V ?O ?H ?A ?: ?3 ?, ?% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} ?v ?o ?h ?a ?Z ?S ?L ?E ?> ?7 ?0 ?) ?" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?z ?s ?l ?e ?^ ?W ?P ?I ?B ?; ?4 ?- ?& ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?~ ?w ?p ?i ?b ?[ ?T ?M ?F ?? ?8 ?1 ?* ?# ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{ ?t ?m ?f ?_ ?X ?Q ?J ?C ?< ?5 ?. ?' ? ? ? ? ? ????????????????????x?q?j?c?\?U?N?G?@?9?2?+?$????????????????????????|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ?????????????????????y?r?k?d?]?V?O?H?A?:?3?,?%???? ????????????????????}?v?o?h?a?Z?S?L?E?>?7?0?)?"??? ?????????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ????????????????????~?w?p?i?b?[?T?M?F???8?1?*?#????????????????????????{?t?m?f?_?X?Q?J?C?<?5?.?'? ??? ?????????????????????x?q?j?c?\?U?N?G?@?9?2?+?$????????????????????????|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ??>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>߿>ؿ>ѿ>ʿ>ÿ>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>ܾ>վ>ξ>Ǿ>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>ٽ>ҽ>˽>Ľ>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>ݼ>ּ>ϼ>ȼ>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>ڻ>ӻ>̻>Ż>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>޺>׺>к>ɺ>º>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>۹>Թ>͹>ƹ>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>߸>ظ>Ѹ>ʸ>ø>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>ܷ>շ>η>Ƿ>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>ٶ>Ҷ>˶>Ķ>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>ݵ>ֵ>ϵ>ȵ>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>ڴ>Ӵ>̴>Ŵ>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>޳>׳>г>ɳ>³>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>۲>Բ>Ͳ>Ʋ>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>߱>ر>ѱ>ʱ>ñ>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>ܰ>հ>ΰ>ǰ>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>ٯ>ү>˯>į>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>ݮ>֮>Ϯ>Ȯ>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>ڭ>ӭ>̭>ŭ>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>ެ>׬>Ь>ɬ>¬>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>۫>ԫ>ͫ>ƫ>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>ߪ>ت>Ѫ>ʪ>ê>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>ܩ>թ>Ω>ǩ>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>٨>Ҩ>˨>Ĩ>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>ݧ>֧>ϧ>ȧ>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>ڦ>Ӧ>̦>Ŧ>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>ޥ>ץ>Х>ɥ>¥>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>ۤ>Ԥ>ͤ>Ƥ>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>ߣ>أ>ѣ>ʣ>ã>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>ܢ>բ>΢>Ǣ>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>١>ҡ>ˡ>ġ>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>ݠ>֠>Ϡ>Ƞ>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>ڟ>ӟ>̟>ş>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>ޞ>מ>О>ɞ>ž>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>۝>ԝ>͝>Ɲ>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>ߜ>؜>ќ>ʜ>Ü>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>ܛ>՛>Λ>Ǜ>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>ٚ>Қ>˚>Ě>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>ݙ>֙>ϙ>ș>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>ژ>Ә>̘>Ř>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>ޗ>ח>З>ɗ>—>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>ۖ>Ԗ>͖>Ɩ>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>ߕ>ؕ>ѕ>ʕ>Õ>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>ܔ>Ք>Δ>ǔ>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>ٓ>ғ>˓>ē>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>ݒ>֒>ϒ>Ȓ>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>ڑ>ӑ>̑>ő>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>ސ>א>А>ɐ>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>ۏ>ԏ>͏>Ə>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>ߎ>؎>ю>ʎ>Î>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>܍>Ս>΍>Ǎ>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>ٌ>Ҍ>ˌ>Č>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>݋>֋>ϋ>ȋ>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>ڊ>ӊ>̊>Ŋ>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>މ>׉>Љ>ɉ>‰>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>ۈ>Ԉ>͈>ƈ>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>߇>؇>ч>ʇ>Ç>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>܆>Ն>Ά>dž>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>م>҅>˅>ą>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>݄>ք>τ>Ȅ>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>ڃ>Ӄ>̃>Ń>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>ނ>ׂ>Ђ>ɂ>‚>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>ہ>ԁ>́>Ɓ>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>߀>؀>р>ʀ>À>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>~>~>~>~>~>~>~>~>~>~>~>~>~>~>~>~>~>~>~~>w~>p~>i~>b~>[~>T~>M~>F~>?~>8~>1~>*~>#~>~>~>~>~>~>}>}>}>}>}>}>}>}>}>}>}>}>}>}>}>}>}>}>{}>t}>m}>f}>_}>X}>Q}>J}>C}><}>5}>.}>'}> }>}>}> }>}>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>x|>q|>j|>c|>\|>U|>N|>G|>@|>9|>2|>+|>$|>|>|>|>|>|>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>|{>u{>n{>g{>`{>Y{>R{>K{>D{>={>6{>/{>({>!{>{>{> {>{>z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>z>yz>rz>kz>dz>]z>Vz>Oz>Hz>Az>:z>3z>,z>%z>z>z>z> z>z>y>y>y>y>y>y>y>y>y>y>y>y>y>y>y>y>y>y>}y>vy>oy>hy>ay>Zy>Sy>Ly>Ey>>y>7y>0y>)y>"y>y>y> y>y>x>x>x>x>x>x>x>x>x>x>x>x>x>x>x>x>x>x>x>zx>sx>lx>ex>^x>Wx>Px>Ix>Bx>;x>4x>-x>&x>x>x>x> x>x>w>w>w>w>w>w>w>w>w>w>w>w>w>w>w>w>w>w>~w>ww>pw>iw>bw>[w>Tw>Mw>Fw>?w>8w>1w>*w>#w>w>w>w>w>w>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>v>{v>tv>mv>fv>_v>Xv>Qv>Jv>Cv>5v>.v>'v> v>v>v> v>v>u>u>u>u>u>u>u>u>u>u>u>u>u>u>u>u>u>u>u>xu>qu>ju>cu>\u>Uu>Nu>Gu>@u>9u>2u>+u>$u>u>u>u>u>u>t>t>t>t>t>t>t>t>t>t>t>t>t>t>t>t>t>t>|t>ut>nt>gt>`t>Yt>Rt>Kt>Dt>=t>6t>/t>(t>!t>t>t> t>t>s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>s>ys>rs>ks>ds>]s>Vs>Os>Hs>As>:s>3s>,s>%s>s>s>s> s>s>r>r>r>r>r>r>r>r>r>r>r>r>r>r>r>r>r>r>}r>vr>or>hr>ar>Zr>Sr>Lr>Er>>r>7r>0r>)r>"r>r>r> r>r>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>q>zq>sq>lq>eq>^q>Wq>Pq>Iq>Bq>;q>4q>-q>&q>q>q>q> q>q>p>p>p>p>p>p>p>p>p>p>p>p>p>p>p>p>p>p>~p>wp>pp>ip>bp>[p>Tp>Mp>Fp>?p>8p>1p>*p>#p>p>p>p>p>p>o>o>o>o>o>o>o>o>o>o>o>o>o>o>o>o>o>o>{o>to>mo>fo>_o>Xo>Qo>Jo>Co>5o>.o>'o> o>o>o> o>o>n>n>n>n>n>n>n>n>n>n>n>n>n>n>n>n>n>n>n>xn>qn>jn>cn>\n>Un>Nn>Gn>@n>9n>2n>+n>$n>n>n>n>n>n>m>m>m>m>m>m>m>m>m>m>m>m>m>m>m>m>m>m>|m>um>nm>gm>`m>Ym>Rm>Km>Dm>=m>6m>/m>(m>!m>m>m> m>m>l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>l>yl>rl>kl>dl>]l>Vl>Ol>Hl>Al>:l>3l>,l>%l>l>l>l> l>l>k>k>k>k>k>k>k>k>k>k>k>k>k>k>k>k>k>k>}k>vk>ok>hk>ak>Zk>Sk>Lk>Ek>>k>7k>0k>)k>"k>k>k> k>k>j>j>j>j>j>j>j>j>j>j>j>j>j>j>j>j>j>j>j>zj>sj>lj>ej>^j>Wj>Pj>Ij>Bj>;j>4j>-j>&j>j>j>j> j>j>i>i>i>i>i>i>i>i>i>i>i>i>i>i>i>i>i>i>~i>wi>pi>ii>bi>[i>Ti>Mi>Fi>?i>8i>1i>*i>#i>i>i>i>i>i>h>h>h>h>h>h>h>h>h>h>h>h>h>h>h>h>h>h>{h>th>mh>fh>_h>Xh>Qh>Jh>Ch>5h>.h>'h> h>h>h> h>h>g>g>g>g>g>g>g>g>g>g>g>g>g>g>g>g>g>g>g>xg>qg>jg>cg>\g>Ug>Ng>Gg>@g>9g>2g>+g>$g>g>g>g>g>g>f>f>f>f>f>f>f>f>f>f>f>f>f>f>f>f>f>f>|f>uf>nf>gf>`f>Yf>Rf>Kf>Df>=f>6f>/f>(f>!f>f>f> f>f>e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>e>ye>re>ke>de>]e>Ve>Oe>He>Ae>:e>3e>,e>%e>e>e>e> e>e>d>d>d>d>d>d>d>d>d>d>d>d>d>d>d>d>d>d>}d>vd>od>hd>ad>Zd>Sd>Ld>Ed>>d>7d>0d>)d>"d>d>d> d>d>c>c>c>c>c>c>c>c>c>c>c>c>c>c>c>c>c>c>c>zc>sc>lc>ec>^c>Wc>Pc>Ic>Bc>;c>4c>-c>&c>c>c>c> c>c>b>b>b>b>b>b>b>b>b>b>b>b>b>b>b>b>b>b>~b>wb>pb>ib>bb>[b>Tb>Mb>Fb>?b>8b>1b>*b>#b>b>b>b>b>b>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>{a>ta>ma>fa>_a>Xa>Qa>Ja>Ca>5a>.a>'a> a>a>a> a>a>`>`>`>`>`>`>`>`>`>`>`>`>`>`>`>`>`>`>`>x`>q`>j`>c`>\`>U`>N`>G`>@`>9`>2`>+`>$`>`>`>`>`>`>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>|_>u_>n_>g_>`_>Y_>R_>K_>D_>=_>6_>/_>(_>!_>_>_> _>_>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>y^>r^>k^>d^>]^>V^>O^>H^>A^>:^>3^>,^>%^>^>^>^> ^>^>]>]>]>]>]>]>]>]>]>]>]>]>]>]>]>]>]>]>}]>v]>o]>h]>a]>Z]>S]>L]>E]>>]>7]>0]>)]>"]>]>]> ]>]>\>\>\>\>\>\>\>\>\>\>\>\>\>\>\>\>\>\>\>z\>s\>l\>e\>^\>W\>P\>I\>B\>;\>4\>-\>&\>\>\>\> \>\>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>~[>w[>p[>i[>b[>[[>T[>M[>F[>?[>8[>1[>*[>#[>[>[>[>[>[>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>{Z>tZ>mZ>fZ>_Z>XZ>QZ>JZ>CZ>5Z>.Z>'Z> Z>Z>Z> Z>Z>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>xY>qY>jY>cY>\Y>UY>NY>GY>@Y>9Y>2Y>+Y>$Y>Y>Y>Y>Y>Y>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>|X>uX>nX>gX>`X>YX>RX>KX>DX>=X>6X>/X>(X>!X>X>X> X>X>W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>W>yW>rW>kW>dW>]W>VW>OW>HW>AW>:W>3W>,W>%W>W>W>W> W>W>V>V>V>V>V>V>V>V>V>V>V>V>V>V>V>V>V>V>}V>vV>oV>hV>aV>ZV>SV>LV>EV>>V>7V>0V>)V>"V>V>V> V>V>U>U>U>U>U>U>U>U>U>U>U>U>U>U>U>U>U>U>U>zU>sU>lU>eU>^U>WU>PU>IU>BU>;U>4U>-U>&U>U>U>U> U>U>T>T>T>T>T>T>T>T>T>T>T>T>T>T>T>T>T>T>~T>wT>pT>iT>bT>[T>TT>MT>FT>?T>8T>1T>*T>#T>T>T>T>T>T>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>{S>tS>mS>fS>_S>XS>QS>JS>CS>5S>.S>'S> S>S>S> S>S>R>R>R>R>R>R>R>R>R>R>R>R>R>R>R>R>R>R>R>xR>qR>jR>cR>\R>UR>NR>GR>@R>9R>2R>+R>$R>R>R>R>R>R>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>Q>|Q>uQ>nQ>gQ>`Q>YQ>RQ>KQ>DQ>=Q>6Q>/Q>(Q>!Q>Q>Q> Q>Q>P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>P>yP>rP>kP>dP>]P>VP>OP>HP>AP>:P>3P>,P>%P>P>P>P> P>P>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>}O>vO>oO>hO>aO>ZO>SO>LO>EO>>O>7O>0O>)O>"O>O>O> O>O>N>N>N>N>N>N>N>N>N>N>N>N>N>N>N>N>N>N>N>zN>sN>lN>eN>^N>WN>PN>IN>BN>;N>4N>-N>&N>N>N>N> N>N>M>M>M>M>M>M>M>M>M>M>M>M>M>M>M>M>M>M>~M>wM>pM>iM>bM>[M>TM>MM>FM>?M>8M>1M>*M>#M>M>M>M>M>M>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>{L>tL>mL>fL>_L>XL>QL>JL>CL>5L>.L>'L> L>L>L> L>L>K>K>K>K>K>K>K>K>K>K>K>K>K>K>K>K>K>K>K>xK>qK>jK>cK>\K>UK>NK>GK>@K>9K>2K>+K>$K>K>K>K>K>K>J>J>J>J>J>J>J>J>J>J>J>J>J>J>J>J>J>J>|J>uJ>nJ>gJ>`J>YJ>RJ>KJ>DJ>=J>6J>/J>(J>!J>J>J> J>J>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>yI>rI>kI>dI>]I>VI>OI>HI>AI>:I>3I>,I>%I>I>I>I> I>I>H>H>H>H>H>H>H>H>H>H>H>H>H>H>H>H>H>H>}H>vH>oH>hH>aH>ZH>SH>LH>EH>>H>7H>0H>)H>"H>H>H> H>H>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>zG>sG>lG>eG>^G>WG>PG>IG>BG>;G>4G>-G>&G>G>G>G> G>G>F>F>F>F>F>F>F>F>F>F>F>F>F>F>F>F>F>F>~F>wF>pF>iF>bF>[F>TF>MF>FF>?F>8F>1F>*F>#F>F>F>F>F>F>E>E>E>E>E>E>E>E>E>E>E>E>E>E>E>E>E>E>{E>tE>mE>fE>_E>XE>QE>JE>CE>5E>.E>'E> E>E>E> E>E>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>xD>qD>jD>cD>\D>UD>ND>GD>@D>9D>2D>+D>$D>D>D>D>D>D>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>|C>uC>nC>gC>`C>YC>RC>KC>DC>=C>6C>/C>(C>!C>C>C> C>C>B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>B>yB>rB>kB>dB>]B>VB>OB>HB>AB>:B>3B>,B>%B>B>B>B> B>B>A>A>A>A>A>A>A>A>A>A>A>A>A>A>A>A>A>A>}A>vA>oA>hA>aA>ZA>SA>LA>EA>>A>7A>0A>)A>"A>A>A> A>A>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>z@>s@>l@>e@>^@>W@>P@>I@>B@>;@>4@>-@>&@>@>@>@> @>@>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>~?>w?>p?>i?>b?>[?>T?>M?>F?>??>8?>1?>*?>#?>?>?>?>?>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>{>>t>>m>>f>>_>>X>>Q>>J>>C>><>>5>>.>>'>> >>>>>> >>>>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>x=>q=>j=>c=>\=>U=>N=>G=>@=>9=>2=>+=>$=>=>=>=>=>=><><><><><><><><><><><><><><><><><><>|<>u<>n<>g<>`<>Y<>R<>K<>D<>=<>6<>/<>(<>!<><><> <><>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>y;>r;>k;>d;>];>V;>O;>H;>A;>:;>3;>,;>%;>;>;>;> ;>;>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>}:>v:>o:>h:>a:>Z:>S:>L:>E:>>:>7:>0:>):>":>:>:> :>:>9>9>9>9>9>9>9>9>9>9>9>9>9>9>9>9>9>9>9>z9>s9>l9>e9>^9>W9>P9>I9>B9>;9>49>-9>&9>9>9>9> 9>9>8>8>8>8>8>8>8>8>8>8>8>8>8>8>8>8>8>8>~8>w8>p8>i8>b8>[8>T8>M8>F8>?8>88>18>*8>#8>8>8>8>8>8>7>7>7>7>7>7>7>7>7>7>7>7>7>7>7>7>7>7>{7>t7>m7>f7>_7>X7>Q7>J7>C7><7>57>.7>'7> 7>7>7> 7>7>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>x6>q6>j6>c6>\6>U6>N6>G6>@6>96>26>+6>$6>6>6>6>6>6>5>5>5>5>5>5>5>5>5>5>5>5>5>5>5>5>5>5>|5>u5>n5>g5>`5>Y5>R5>K5>D5>=5>65>/5>(5>!5>5>5> 5>5>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>y4>r4>k4>d4>]4>V4>O4>H4>A4>:4>34>,4>%4>4>4>4> 4>4>3>3>3>3>3>3>3>3>3>3>3>3>3>3>3>3>3>3>}3>v3>o3>h3>a3>Z3>S3>L3>E3>>3>73>03>)3>"3>3>3> 3>3>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>z2>s2>l2>e2>^2>W2>P2>I2>B2>;2>42>-2>&2>2>2>2> 2>2>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>~1>w1>p1>i1>b1>[1>T1>M1>F1>?1>81>11>*1>#1>1>1>1>1>1>0>0>0>0>0>0>0>0>0>0>0>0>0>0>0>0>0>0>{0>t0>m0>f0>_0>X0>Q0>J0>C0><0>50>.0>'0> 0>0>0> 0>0>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>x/>q/>j/>c/>\/>U/>N/>G/>@/>9/>2/>+/>$/>/>/>/>/>/>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>|.>u.>n.>g.>`.>Y.>R.>K.>D.>=.>6.>/.>(.>!.>.>.> .>.>->->->->->->->->->->->->->->->->->->->y->r->k->d->]->V->O->H->A->:->3->,->%->->->-> ->->,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>},>v,>o,>h,>a,>Z,>S,>L,>E,>>,>7,>0,>),>",>,>,> ,>,>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>z+>s+>l+>e+>^+>W+>P+>I+>B+>;+>4+>-+>&+>+>+>+> +>+>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>~*>w*>p*>i*>b*>[*>T*>M*>F*>?*>8*>1*>**>#*>*>*>*>*>*>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>{)>t)>m)>f)>_)>X)>Q)>J)>C)><)>5)>.)>')> )>)>)> )>)>(>(>(>(>(>(>(>(>(>(>(>(>(>(>(>(>(>(>(>x(>q(>j(>c(>\(>U(>N(>G(>@(>9(>2(>+(>$(>(>(>(>(>(>'>'>'>'>'>'>'>'>'>'>'>'>'>'>'>'>'>'>|'>u'>n'>g'>`'>Y'>R'>K'>D'>='>6'>/'>('>!'>'>'> '>'>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>y&>r&>k&>d&>]&>V&>O&>H&>A&>:&>3&>,&>%&>&>&>&> &>&>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>}%>v%>o%>h%>a%>Z%>S%>L%>E%>>%>7%>0%>)%>"%>%>%> %>%>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>z$>s$>l$>e$>^$>W$>P$>I$>B$>;$>4$>-$>&$>$>$>$> $>$>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>~#>w#>p#>i#>b#>[#>T#>M#>F#>?#>8#>1#>*#>##>#>#>#>#>#>">">">">">">">">">">">">">">">">">">{">t">m">f">_">X">Q">J">C"><">5">.">'"> ">">"> ">">!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>x!>q!>j!>c!>\!>U!>N!>G!>@!>9!>2!>+!>$!>!>!>!>!>!> > > > > > > > > > > > > > > > > > >| >u >n >g >` >Y >R >K >D >= >6 >/ >( >! > > > > >>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>> > > > > > > > > > > > > > > > > > >{ >t >m >f >_ >X >Q >J >C >< >5 >. >' > > > > > > > > > > > > > > > > > > > > > > > > >x >q >j >c >\ >U >N >G >@ >9 >2 >+ >$ > > > > > > > > > > > > > > > > > > > > > > > >| >u >n >g >` >Y >R >K >D >= >6 >/ >( >! > > > > > > > > > > > > > > > > > > > > > > > >y >r >k >d >] >V >O >H >A >: >3 >, >% > > > > > > > > > > > > > > > > > > > > > > > >} >v >o >h >a >Z >S >L >E >> >7 >0 >) >" > > > > >>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>>>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>>>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>>>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڿ=ӿ=̿=ſ===========x=q=j=c=\=U=N=G=@=9=2=+=$==========޾=׾=о=ɾ=¾==========|=u=n=g=`=Y=R=K=D===6=/=(=!=== =======۽=Խ=ͽ=ƽ===========y=r=k=d=]=V=O=H=A=:=3=,=%==== ======߼=ؼ=Ѽ=ʼ=ü==========}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =======ܻ=ջ=λ=ǻ===========z=s=l=e=^=W=P=I=B=;=4=-=&==== =======ٺ=Һ=˺=ĺ==========~=w=p=i=b=[=T=M=F=?=8=1=*=#==========ݹ=ֹ=Ϲ=ȹ==========={=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڸ=Ӹ≠=Ÿ===========x=q=j=c=\=U=N=G=@=9=2=+=$==========޷=׷=з=ɷ=·==========|=u=n=g=`=Y=R=K=D===6=/=(=!=== =======۶=Զ=Ͷ=ƶ===========y=r=k=d=]=V=O=H=A=:=3=,=%==== ======ߵ=ص=ѵ=ʵ=õ==========}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =======ܴ=մ=δ=Ǵ===========z=s=l=e=^=W=P=I=B=;=4=-=&==== =======ٳ=ҳ=˳=ij==========~=w=p=i=b=[=T=M=F=?=8=1=*=#==========ݲ=ֲ=ϲ=Ȳ==========={=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڱ=ӱ=̱=ű===========x=q=j=c=\=U=N=G=@=9=2=+=$==========ް=װ=а=ɰ=°==========|=u=n=g=`=Y=R=K=D===6=/=(=!=== =======ۯ=ԯ=ͯ=Ư===========y=r=k=d=]=V=O=H=A=:=3=,=%==== ======߮=خ=Ѯ=ʮ=î==========}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =======ܭ=խ=έ=ǭ===========z=s=l=e=^=W=P=I=B=;=4=-=&==== =======٬=Ҭ=ˬ=Ĭ==========~=w=p=i=b=[=T=M=F=?=8=1=*=#==========ݫ=֫=ϫ=ȫ==========={=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڪ=Ӫ=̪=Ū===========x=q=j=c=\=U=N=G=@=9=2=+=$==========ީ=ש=Щ=ɩ=©==========|=u=n=g=`=Y=R=K=D===6=/=(=!=== =======ۨ=Ԩ=ͨ=ƨ===========y=r=k=d=]=V=O=H=A=:=3=,=%==== ======ߧ=ا=ѧ=ʧ=ç==========}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =======ܦ=զ=Φ=Ǧ===========z=s=l=e=^=W=P=I=B=;=4=-=&==== =======٥=ҥ=˥=ĥ==========~=w=p=i=b=[=T=M=F=?=8=1=*=#==========ݤ=֤=Ϥ=Ȥ==========={=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڣ=ӣ=̣=ţ===========x=q=j=c=\=U=N=G=@=9=2=+=$==========ޢ=ע=Т=ɢ=¢==========|=u=n=g=`=Y=R=K=D===6=/=(=!=== =======ۡ=ԡ=͡=ơ===========y=r=k=d=]=V=O=H=A=:=3=,=%==== ======ߠ=ؠ=Ѡ=ʠ=à==========}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =======ܟ=՟=Ο=ǟ===========z=s=l=e=^=W=P=I=B=;=4=-=&==== =======ٞ=Ҟ=˞=Ğ==========~=w=p=i=b=[=T=M=F=?=8=1=*=#==========ݝ=֝=ϝ=ȝ==========={=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڜ=Ӝ=̜=Ŝ===========x=q=j=c=\=U=N=G=@=9=2=+=$==========ޛ=כ=Л=ɛ=›==========|=u=n=g=`=Y=R=K=D===6=/=(=!=== =======ۚ=Ԛ=͚=ƚ===========y=r=k=d=]=V=O=H=A=:=3=,=%==== ======ߙ=ؙ=љ=ʙ=Ù==========}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =======ܘ=՘=Θ=ǘ===========z=s=l=e=^=W=P=I=B=;=4=-=&==== =======ٗ=җ=˗=ė==========~=w=p=i=b=[=T=M=F=?=8=1=*=#==========ݖ=֖=ϖ=Ȗ==========={=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڕ=ӕ=̕=ŕ===========x=q=j=c=\=U=N=G=@=9=2=+=$==========ޔ=ה=Д=ɔ=”==========|=u=n=g=`=Y=R=K=D===6=/=(=!=== =======ۓ=ԓ=͓=Ɠ===========y=r=k=d=]=V=O=H=A=:=3=,=%==== ======ߒ=ؒ=ђ=ʒ=Ò==========}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =======ܑ=Ց=Α=Ǒ===========z=s=l=e=^=W=P=I=B=;=4=-=&==== =======ِ=Ґ=ː=Đ==========~=w=p=i=b=[=T=M=F=?=8=1=*=#==========ݏ=֏=Ϗ=ȏ==========={=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڎ=ӎ=̎=Ŏ===========x=q=j=c=\=U=N=G=@=9=2=+=$==========ލ=׍=Ѝ=ɍ===========|=u=n=g=`=Y=R=K=D===6=/=(=!=== =======ی=Ԍ=͌=ƌ===========y=r=k=d=]=V=O=H=A=:=3=,=%==== ======ߋ=؋=ы=ʋ=Ë==========}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =======܊=Պ=Ί=NJ===========z=s=l=e=^=W=P=I=B=;=4=-=&==== =======ى=҉=ˉ=ĉ==========~=w=p=i=b=[=T=M=F=?=8=1=*=#==========݈=ֈ=ψ=Ȉ==========={=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڇ=Ӈ=̇=Ň===========x=q=j=c=\=U=N=G=@=9=2=+=$==========ކ=׆=І=Ɇ=†==========|=u=n=g=`=Y=R=K=D===6=/=(=!=== =======ۅ=ԅ=ͅ=ƅ===========y=r=k=d=]=V=O=H=A=:=3=,=%==== ======߄=؄=ф=ʄ=Ä==========}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =======܃=Ճ=΃=ǃ===========z=s=l=e=^=W=P=I=B=;=4=-=&==== =======ق=҂=˂=Ă==========~=w=p=i=b=[=T=M=F=?=8=1=*=#==========݁=ց=ρ=ȁ==========={=t=m=f=_=X=Q=J=C=<=5=.='= === =======ڀ=Ӏ=̀=ŀ===========x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=y~=r~=k~=d~=]~=V~=O~=H~=A~=:~=3~=,~=%~=~=~=~= ~=~=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}=}}=v}=o}=h}=a}=Z}=S}=L}=E}=>}=7}=0}=)}="}=}=}= }=}=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=z|=s|=l|=e|=^|=W|=P|=I|=B|=;|=4|=-|=&|=|=|=|= |=|={={={={={={={={={={={={={={={={={={=~{=w{=p{=i{=b{=[{=T{=M{=F{=?{=8{=1{=*{=#{={={={={={=z=z=z=z=z=z=z=z=z=z=z=z=z=z=z=z=z=z={z=tz=mz=fz=_z=Xz=Qz=Jz=Cz=v=7v=0v=)v="v=v=v= v=v=u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=u=zu=su=lu=eu=^u=Wu=Pu=Iu=Bu=;u=4u=-u=&u=u=u=u= u=u=t=t=t=t=t=t=t=t=t=t=t=t=t=t=t=t=t=t=~t=wt=pt=it=bt=[t=Tt=Mt=Ft=?t=8t=1t=*t=#t=t=t=t=t=t=s=s=s=s=s=s=s=s=s=s=s=s=s=s=s=s=s=s={s=ts=ms=fs=_s=Xs=Qs=Js=Cs=o=7o=0o=)o="o=o=o= o=o=n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=n=zn=sn=ln=en=^n=Wn=Pn=In=Bn=;n=4n=-n=&n=n=n=n= n=n=m=m=m=m=m=m=m=m=m=m=m=m=m=m=m=m=m=m=~m=wm=pm=im=bm=[m=Tm=Mm=Fm=?m=8m=1m=*m=#m=m=m=m=m=m=l=l=l=l=l=l=l=l=l=l=l=l=l=l=l=l=l=l={l=tl=ml=fl=_l=Xl=Ql=Jl=Cl=h=7h=0h=)h="h=h=h= h=h=g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=g=zg=sg=lg=eg=^g=Wg=Pg=Ig=Bg=;g=4g=-g=&g=g=g=g= g=g=f=f=f=f=f=f=f=f=f=f=f=f=f=f=f=f=f=f=~f=wf=pf=if=bf=[f=Tf=Mf=Ff=?f=8f=1f=*f=#f=f=f=f=f=f=e=e=e=e=e=e=e=e=e=e=e=e=e=e=e=e=e=e={e=te=me=fe=_e=Xe=Qe=Je=Ce=a=7a=0a=)a="a=a=a= a=a=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=`=z`=s`=l`=e`=^`=W`=P`=I`=B`=;`=4`=-`=&`=`=`=`= `=`=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=~_=w_=p_=i_=b_=[_=T_=M_=F_=?_=8_=1_=*_=#_=_=_=_=_=_=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^={^=t^=m^=f^=_^=X^=Q^=J^=C^=<^=5^=.^='^= ^=^=^= ^=^=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=]=x]=q]=j]=c]=\]=U]=N]=G]=@]=9]=2]=+]=$]=]=]=]=]=]=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=|\=u\=n\=g\=`\=Y\=R\=K\=D\==\=6\=/\=(\=!\=\=\= \=\=[=[=[=[=[=[=[=[=[=[=[=[=[=[=[=[=[=[=[=y[=r[=k[=d[=][=V[=O[=H[=A[=:[=3[=,[=%[=[=[=[= [=[=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=Z=}Z=vZ=oZ=hZ=aZ=ZZ=SZ=LZ=EZ=>Z=7Z=0Z=)Z="Z=Z=Z= Z=Z=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=Y=zY=sY=lY=eY=^Y=WY=PY=IY=BY=;Y=4Y=-Y=&Y=Y=Y=Y= Y=Y=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=~X=wX=pX=iX=bX=[X=TX=MX=FX=?X=8X=1X=*X=#X=X=X=X=X=X=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W={W=tW=mW=fW=_W=XW=QW=JW=CW=S=7S=0S=)S="S=S=S= S=S=R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=R=zR=sR=lR=eR=^R=WR=PR=IR=BR=;R=4R=-R=&R=R=R=R= R=R=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=~Q=wQ=pQ=iQ=bQ=[Q=TQ=MQ=FQ=?Q=8Q=1Q=*Q=#Q=Q=Q=Q=Q=Q=P=P=P=P=P=P=P=P=P=P=P=P=P=P=P=P=P=P={P=tP=mP=fP=_P=XP=QP=JP=CP=L=7L=0L=)L="L=L=L= L=L=K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=K=zK=sK=lK=eK=^K=WK=PK=IK=BK=;K=4K=-K=&K=K=K=K= K=K=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=~J=wJ=pJ=iJ=bJ=[J=TJ=MJ=FJ=?J=8J=1J=*J=#J=J=J=J=J=J=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I={I=tI=mI=fI=_I=XI=QI=JI=CI=E=7E=0E=)E="E=E=E= E=E=D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=D=zD=sD=lD=eD=^D=WD=PD=ID=BD=;D=4D=-D=&D=D=D=D= D=D=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=~C=wC=pC=iC=bC=[C=TC=MC=FC=?C=8C=1C=*C=#C=C=C=C=C=C=B=B=B=B=B=B=B=B=B=B=B=B=B=B=B=B=B=B={B=tB=mB=fB=_B=XB=QB=JB=CB==>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=}>=v>=o>=h>=a>=Z>=S>=L>=E>=>>=7>=0>=)>=">=>=>= >=>=======================================z==s==l==e==^==W==P==I==B==;==4==-==&======== ====<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=~<=w<=p<=i<=b<=[<=T<=M<=F<=?<=8<=1<=*<=#<=<=<=<=<=<=;=;=;=;=;=;=;=;=;=;=;=;=;=;=;=;=;=;={;=t;=m;=f;=_;=X;=Q;=J;=C;=<;=5;=.;=';= ;=;=;= ;=;=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=x:=q:=j:=c:=\:=U:=N:=G:=@:=9:=2:=+:=$:=:=:=:=:=:=9=9=9=9=9=9=9=9=9=9=9=9=9=9=9=9=9=9=|9=u9=n9=g9=`9=Y9=R9=K9=D9==9=69=/9=(9=!9=9=9= 9=9=8=8=8=8=8=8=8=8=8=8=8=8=8=8=8=8=8=8=8=y8=r8=k8=d8=]8=V8=O8=H8=A8=:8=38=,8=%8=8=8=8= 8=8=7=7=7=7=7=7=7=7=7=7=7=7=7=7=7=7=7=7=}7=v7=o7=h7=a7=Z7=S7=L7=E7=>7=77=07=)7="7=7=7= 7=7=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=z6=s6=l6=e6=^6=W6=P6=I6=B6=;6=46=-6=&6=6=6=6= 6=6=5=5=5=5=5=5=5=5=5=5=5=5=5=5=5=5=5=5=~5=w5=p5=i5=b5=[5=T5=M5=F5=?5=85=15=*5=#5=5=5=5=5=5=4=4=4=4=4=4=4=4=4=4=4=4=4=4=4=4=4=4={4=t4=m4=f4=_4=X4=Q4=J4=C4=<4=54=.4='4= 4=4=4= 4=4=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=x3=q3=j3=c3=\3=U3=N3=G3=@3=93=23=+3=$3=3=3=3=3=3=2=2=2=2=2=2=2=2=2=2=2=2=2=2=2=2=2=2=|2=u2=n2=g2=`2=Y2=R2=K2=D2==2=62=/2=(2=!2=2=2= 2=2=1=1=1=1=1=1=1=1=1=1=1=1=1=1=1=1=1=1=1=y1=r1=k1=d1=]1=V1=O1=H1=A1=:1=31=,1=%1=1=1=1= 1=1=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=}0=v0=o0=h0=a0=Z0=S0=L0=E0=>0=70=00=)0="0=0=0= 0=0=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=z/=s/=l/=e/=^/=W/=P/=I/=B/=;/=4/=-/=&/=/=/=/= /=/=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=~.=w.=p.=i.=b.=[.=T.=M.=F.=?.=8.=1.=*.=#.=.=.=.=.=.=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-={-=t-=m-=f-=_-=X-=Q-=J-=C-=<-=5-=.-='-= -=-=-= -=-=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=x,=q,=j,=c,=\,=U,=N,=G,=@,=9,=2,=+,=$,=,=,=,=,=,=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=|+=u+=n+=g+=`+=Y+=R+=K+=D+==+=6+=/+=(+=!+=+=+= +=+=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=y*=r*=k*=d*=]*=V*=O*=H*=A*=:*=3*=,*=%*=*=*=*= *=*=)=)=)=)=)=)=)=)=)=)=)=)=)=)=)=)=)=)=})=v)=o)=h)=a)=Z)=S)=L)=E)=>)=7)=0)=))=")=)=)= )=)=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=z(=s(=l(=e(=^(=W(=P(=I(=B(=;(=4(=-(=&(=(=(=(= (=(='='='='='='='='='='='='='='='='='='=~'=w'=p'=i'=b'=['=T'=M'=F'=?'=8'=1'=*'=#'='='='='='=&=&=&=&=&=&=&=&=&=&=&=&=&=&=&=&=&=&={&=t&=m&=f&=_&=X&=Q&=J&=C&=<&=5&=.&='&= &=&=&= &=&=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=x%=q%=j%=c%=\%=U%=N%=G%=@%=9%=2%=+%=$%=%=%=%=%=%=$=$=$=$=$=$=$=$=$=$=$=$=$=$=$=$=$=$=|$=u$=n$=g$=`$=Y$=R$=K$=D$==$=6$=/$=($=!$=$=$= $=$=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=y#=r#=k#=d#=]#=V#=O#=H#=A#=:#=3#=,#=%#=#=#=#= #=#="="="="="="="="="="="="="="="="="="=}"=v"=o"=h"=a"=Z"=S"=L"=E"=>"=7"=0"=)"=""="="= "="=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=z!=s!=l!=e!=^!=W!=P!=I!=B!=;!=4!=-!=&!=!=!=!= !=!= = = = = = = = = = = = = = = = = = =~ =w =p =i =b =[ =T =M =F =? =8 =1 =* =# = = = = = ==================={=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== == = = = = = = = = = = = = = = = = = =} =v =o =h =a =Z =S =L =E => =7 =0 =) =" = = = = = = = = = = = = = = = = = = = = = = = =z =s =l =e =^ =W =P =I =B =; =4 =- =& = = = = = = = = = = = = = = = = = = = = = = = =~ =w =p =i =b =[ =T =M =F =? =8 =1 =* =# = = = = = = = = = = = = = = = = = = = = = = = ={ =t =m =f =_ =X =Q =J =C =< =5 =. =' = = = = = = = = = = = = = = = = = = = = = = = = =x =q =j =c =\ =U =N =G =@ =9 =2 =+ =$ = = = = = ===================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ====================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== =====================z=s=l=e=^=W=P=I=B=;=4=-=&==== ====================~=w=p=i=b=[=T=M=F=?=8=1=*=#========================{=t=m=f=_=X=Q=J=C=<=5=.='= === =====================x=q=j=c=\=U=N=G=@=9=2=+=$========================|=u=n=g=`=Y=R=K=D===6=/=(=!=== =====================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<ܿ<տ<ο<ǿ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<پ<Ҿ<˾<ľ<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<ݽ<ֽ<Ͻ<Ƚ<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<ڼ<Ӽ<̼<ż<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<޻<׻<л<ɻ<»<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<ۺ<Ժ<ͺ<ƺ<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<߹<ع<ѹ<ʹ<ù<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<ܸ<ո<θ<Ǹ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<ٷ<ҷ<˷<ķ<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<ݶ<ֶ<϶<ȶ<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<ڵ<ӵ<̵<ŵ<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<޴<״<д<ɴ<´<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<۳<Գ<ͳ<Ƴ<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<߲<ز<Ѳ<ʲ<ò<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<ܱ<ձ<α<DZ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<ٰ<Ұ<˰<İ<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<ݯ<֯<ϯ<ȯ<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<ڮ<Ӯ<̮<Ů<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<ޭ<׭<Э<ɭ<­<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<۬<Ԭ<ͬ<Ƭ<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<߫<ث<ѫ<ʫ<ë<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<ܪ<ժ<Ϊ<Ǫ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<٩<ҩ<˩<ĩ<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<ݨ<֨<Ϩ<Ȩ<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<ڧ<ӧ<̧<ŧ<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<ަ<צ<Ц<ɦ<¦<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<ۥ<ԥ<ͥ<ƥ<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<ߤ<ؤ<Ѥ<ʤ<ä<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<ܣ<գ<Σ<ǣ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<٢<Ң<ˢ<Ģ<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<ݡ<֡<ϡ<ȡ<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<ڠ<Ӡ<̠<Š<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<ޟ<ן<П<ɟ<Ÿ<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<۞<Ԟ<͞<ƞ<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<ߝ<؝<ѝ<ʝ<Ý<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<ܜ<՜<Μ<ǜ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<ٛ<қ<˛<ě<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<ݚ<֚<Ϛ<Ț<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<ڙ<ә<̙<ř<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<ޘ<ט<И<ɘ<˜<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<ۗ<ԗ<͗<Ɨ<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<ߖ<ؖ<і<ʖ<Ö<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<ܕ<Օ<Ε<Ǖ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<ٔ<Ҕ<˔<Ĕ<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<ݓ<֓<ϓ<ȓ<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<ڒ<Ӓ<̒<Œ<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<ޑ<ב<Б<ɑ<‘<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<ې<Ԑ<͐<Ɛ<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<ߏ<؏<я<ʏ<Ï<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<܎<Վ<Ύ<ǎ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<ٍ<ҍ<ˍ<č<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<݌<֌<ό<Ȍ<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<ڋ<Ӌ<̋<ŋ<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<ފ<׊<Њ<Ɋ<Š<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<ۉ<ԉ<͉<Ɖ<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<߈<؈<ш<ʈ<È<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<܇<Շ<·<LJ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<ن<҆<ˆ<Ć<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<݅<օ<υ<ȅ<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<ڄ<ӄ<̄<ń<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<ރ<׃<Ѓ<Ƀ<ƒ<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<ۂ<Ԃ<͂<Ƃ<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<߁<؁<с<ʁ<Á<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<܀<Հ<΀<ǀ<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<{~<t~<m~<f~<_~<X~<Q~<J~<C~<<~<5~<.~<'~< ~<~<~< ~<~<}<}<}<}<}<}<}<}<}<}<}<}<}<}<}<}<}<}<}<x}<q}<j}<c}<\}<U}<N}<G}<@}<9}<2}<+}<$}<}<}<}<}<}<|<|<|<|<|<|<|<|<|<|<|<|<|<|<|<|<|<|<||<u|<n|<g|<`|<Y|<R|<K|<D|<=|<6|</|<(|<!|<|<|< |<|<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<y{<r{<k{<d{<]{<V{<O{<H{<A{<:{<3{<,{<%{<{<{<{< {<{<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<}z<vz<oz<hz<az<Zz<Sz<Lz<Ez<>z<7z<0z<)z<"z<z<z< z<z<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<zy<sy<ly<ey<^y<Wy<Py<Iy<By<;y<4y<-y<&y<y<y<y< y<y<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<~x<wx<px<ix<bx<[x<Tx<Mx<Fx<?x<8x<1x<*x<#x<x<x<x<x<x<w<w<w<w<w<w<w<w<w<w<w<w<w<w<w<w<w<w<{w<tw<mw<fw<_w<Xw<Qw<Jw<Cw<s<7s<0s<)s<"s<s<s< s<s<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<zr<sr<lr<er<^r<Wr<Pr<Ir<Br<;r<4r<-r<&r<r<r<r< r<r<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<~q<wq<pq<iq<bq<[q<Tq<Mq<Fq<?q<8q<1q<*q<#q<q<q<q<q<q<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<{p<tp<mp<fp<_p<Xp<Qp<Jp<Cp<l<7l<0l<)l<"l<l<l< l<l<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<zk<sk<lk<ek<^k<Wk<Pk<Ik<Bk<;k<4k<-k<&k<k<k<k< k<k<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<~j<wj<pj<ij<bj<[j<Tj<Mj<Fj<?j<8j<1j<*j<#j<j<j<j<j<j<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<{i<ti<mi<fi<_i<Xi<Qi<Ji<Ci<e<7e<0e<)e<"e<e<e< e<e<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<zd<sd<ld<ed<^d<Wd<Pd<Id<Bd<;d<4d<-d<&d<d<d<d< d<d<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<~c<wc<pc<ic<bc<[c<Tc<Mc<Fc<?c<8c<1c<*c<#c<c<c<c<c<c<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<{b<tb<mb<fb<_b<Xb<Qb<Jb<Cb<^<7^<0^<)^<"^<^<^< ^<^<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<z]<s]<l]<e]<^]<W]<P]<I]<B]<;]<4]<-]<&]<]<]<]< ]<]<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<~\<w\<p\<i\<b\<[\<T\<M\<F\<?\<8\<1\<*\<#\<\<\<\<\<\<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<{[<t[<m[<f[<_[<X[<Q[<J[<C[<<[<5[<.[<'[< [<[<[< [<[<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<xZ<qZ<jZ<cZ<\Z<UZ<NZ<GZ<@Z<9Z<2Z<+Z<$Z<Z<Z<Z<Z<Z<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<|Y<uY<nY<gY<`Y<YY<RY<KY<DY<=Y<6Y</Y<(Y<!Y<Y<Y< Y<Y<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<yX<rX<kX<dX<]X<VX<OX<HX<AX<:X<3X<,X<%X<X<X<X< X<X<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<}W<vW<oW<hW<aW<ZW<SW<LW<EW<>W<7W<0W<)W<"W<W<W< W<W<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<zV<sV<lV<eV<^V<WV<PV<IV<BV<;V<4V<-V<&V<V<V<V< V<V<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<~U<wU<pU<iU<bU<[U<TU<MU<FU<?U<8U<1U<*U<#U<U<U<U<U<U<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<{T<tT<mT<fT<_T<XT<QT<JT<CT<P<7P<0P<)P<"P<P<P< P<P<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<zO<sO<lO<eO<^O<WO<PO<IO<BO<;O<4O<-O<&O<O<O<O< O<O<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<~N<wN<pN<iN<bN<[N<TN<MN<FN<?N<8N<1N<*N<#N<N<N<N<N<N<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<{M<tM<mM<fM<_M<XM<QM<JM<CM<I<7I<0I<)I<"I<I<I< I<I<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<zH<sH<lH<eH<^H<WH<PH<IH<BH<;H<4H<-H<&H<H<H<H< H<H<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<~G<wG<pG<iG<bG<[G<TG<MG<FG<?G<8G<1G<*G<#G<G<G<G<G<G<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<{F<tF<mF<fF<_F<XF<QF<JF<CF<B<7B<0B<)B<"B<B<B< B<B<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<zA<sA<lA<eA<^A<WA<PA<IA<BA<;A<4A<-A<&A<A<A<A< A<A<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<~@<w@<p@<i@<b@<[@<T@<M@<F@<?@<8@<1@<*@<#@<@<@<@<@<@<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<{?<t?<m?<f?<_?<X?<Q?<J?<C?<<><><><><><><><><><><><><><><><><><><x><q><j><c><\><U><N><G><@><9><2><+><$><><><><><><=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<|=<u=<n=<g=<`=<Y=<R=<K=<D=<==<6=</=<(=<!=<=<=< =<=<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<y<<r<<k<<d<<]<<V<<O<<H<<A<<:<<3<<,<<%<<<<<<<< <<<<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<};<v;<o;<h;<a;<Z;<S;<L;<E;<>;<7;<0;<);<";<;<;< ;<;<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<z:<s:<l:<e:<^:<W:<P:<I:<B:<;:<4:<-:<&:<:<:<:< :<:<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<~9<w9<p9<i9<b9<[9<T9<M9<F9<?9<89<19<*9<#9<9<9<9<9<9<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<{8<t8<m8<f8<_8<X8<Q8<J8<C8<<8<58<.8<'8< 8<8<8< 8<8<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<x7<q7<j7<c7<\7<U7<N7<G7<@7<97<27<+7<$7<7<7<7<7<7<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<|6<u6<n6<g6<`6<Y6<R6<K6<D6<=6<66</6<(6<!6<6<6< 6<6<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<y5<r5<k5<d5<]5<V5<O5<H5<A5<:5<35<,5<%5<5<5<5< 5<5<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<}4<v4<o4<h4<a4<Z4<S4<L4<E4<>4<74<04<)4<"4<4<4< 4<4<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<z3<s3<l3<e3<^3<W3<P3<I3<B3<;3<43<-3<&3<3<3<3< 3<3<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<~2<w2<p2<i2<b2<[2<T2<M2<F2<?2<82<12<*2<#2<2<2<2<2<2<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<{1<t1<m1<f1<_1<X1<Q1<J1<C1<<1<51<.1<'1< 1<1<1< 1<1<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<x0<q0<j0<c0<\0<U0<N0<G0<@0<90<20<+0<$0<0<0<0<0<0</</</</</</</</</</</</</</</</</</<|/<u/<n/<g/<`/<Y/<R/<K/<D/<=/<6/<//<(/<!/</</< /</<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<y.<r.<k.<d.<].<V.<O.<H.<A.<:.<3.<,.<%.<.<.<.< .<.<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<}-<v-<o-<h-<a-<Z-<S-<L-<E-<>-<7-<0-<)-<"-<-<-< -<-<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<z,<s,<l,<e,<^,<W,<P,<I,<B,<;,<4,<-,<&,<,<,<,< ,<,<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<~+<w+<p+<i+<b+<[+<T+<M+<F+<?+<8+<1+<*+<#+<+<+<+<+<+<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<{*<t*<m*<f*<_*<X*<Q*<J*<C*<<*<5*<.*<'*< *<*<*< *<*<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<x)<q)<j)<c)<\)<U)<N)<G)<@)<9)<2)<+)<$)<)<)<)<)<)<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<|(<u(<n(<g(<`(<Y(<R(<K(<D(<=(<6(</(<((<!(<(<(< (<(<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<y'<r'<k'<d'<]'<V'<O'<H'<A'<:'<3'<,'<%'<'<'<'< '<'<&<&<&<&<&<&<&<&<&<&<&<&<&<&<&<&<&<&<}&<v&<o&<h&<a&<Z&<S&<L&<E&<>&<7&<0&<)&<"&<&<&< &<&<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<z%<s%<l%<e%<^%<W%<P%<I%<B%<;%<4%<-%<&%<%<%<%< %<%<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<~$<w$<p$<i$<b$<[$<T$<M$<F$<?$<8$<1$<*$<#$<$<$<$<$<$<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<{#<t#<m#<f#<_#<X#<Q#<J#<C#<<#<5#<.#<'#< #<#<#< #<#<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<x"<q"<j"<c"<\"<U"<N"<G"<@"<9"<2"<+"<$"<"<"<"<"<"<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<|!<u!<n!<g!<`!<Y!<R!<K!<D!<=!<6!</!<(!<!!<!<!< !<!< < < < < < < < < < < < < < < < < < < <y <r <k <d <] <V <O <H <A <: <3 <, <% < < < < < <<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< << < < < < < < < < < < < < < < < < < < <x <q <j <c <\ <U <N <G <@ <9 <2 <+ <$ < < < < < < < < < < < < < < < < < < < < < < < <| <u <n <g <` <Y <R <K <D <= <6 </ <( <! < < < < < < < < < < < < < < < < < < < < < < < <y <r <k <d <] <V <O <H <A <: <3 <, <% < < < < < < < < < < < < < < < < < < < < < < < <} <v <o <h <a <Z <S <L <E <> <7 <0 <) <" < < < < < < < < < < < < < < < < < < < < < < < <z <s <l <e <^ <W <P <I <B <; <4 <- <& < < < < < <<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;޿;׿;п;ɿ;¿;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;۾;Ծ;;;ƾ;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;߽;ؽ;ѽ;ʽ;ý;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;ܼ;ռ;μ;Ǽ;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;ٻ;һ;˻;Ļ;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;ݺ;ֺ;Ϻ;Ⱥ;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;ڹ;ӹ;̹;Ź;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;޸;׸;и;ɸ;¸;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;۷;Է;ͷ;Ʒ;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;߶;ض;Ѷ;ʶ;ö;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;ܵ;յ;ε;ǵ;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;ٴ;Ҵ;˴;Ĵ;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;ݳ;ֳ;ϳ;ȳ;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;ڲ;Ӳ;̲;Ų;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;ޱ;ױ;б;ɱ;±;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;۰;԰;Ͱ;ư;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;߯;د;ѯ;ʯ;ï;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;ܮ;ծ;ή;Ǯ;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;٭;ҭ;˭;ĭ;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;ݬ;֬;Ϭ;Ȭ;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;ګ;ӫ;̫;ū;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;ު;ת;Ъ;ɪ;ª;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;۩;ԩ;ͩ;Ʃ;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;ߨ;ب;Ѩ;ʨ;è;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;ܧ;է;Χ;ǧ;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;٦;Ҧ;˦;Ħ;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;ݥ;֥;ϥ;ȥ;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;ڤ;Ӥ;̤;Ť;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;ޣ;ף;У;ɣ;£;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;ۢ;Ԣ;͢;Ƣ;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;ߡ;ء;ѡ;ʡ;á;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;ܠ;ՠ;Π;Ǡ;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;ٟ;ҟ;˟;ğ;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;ݞ;֞;Ϟ;Ȟ;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;ڝ;ӝ;̝;ŝ;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;ޜ;ל;М;ɜ;œ;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;ۛ;ԛ;͛;ƛ;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;ߚ;ؚ;њ;ʚ;Ú;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;ܙ;ՙ;Ι;Ǚ;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;٘;Ҙ;˘;Ę;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;ݗ;֗;ϗ;ȗ;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;ږ;Ӗ;̖;Ŗ;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;ޕ;ו;Е;ɕ;•;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;۔;Ԕ;͔;Ɣ;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;ߓ;ؓ;ѓ;ʓ;Ó;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;ܒ;Ւ;Β;ǒ;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;ّ;ґ;ˑ;đ;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;ݐ;֐;ϐ;Ȑ;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;ڏ;ӏ;̏;ŏ;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;ގ;׎;Ў;Ɏ;Ž;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;ۍ;ԍ;͍;ƍ;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;ߌ;،;ь;ʌ;Ì;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;܋;Ջ;΋;Nj;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;ي;Ҋ;ˊ;Ċ;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;݉;։;ω;ȉ;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;ڈ;ӈ;̈;ň;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;އ;ׇ;Ї;ɇ;‡;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;ۆ;Ԇ;͆;Ɔ;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;߅;؅;х;ʅ;Å;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;܄;Մ;΄;DŽ;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;ك;҃;˃;ă;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;݂;ւ;ς;Ȃ;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;ځ;Ӂ;́;Ł;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;ހ;׀;Ѐ;ɀ;€;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;~;~;~;~;~;~;~;~;~;~;~;~;~;~;~;~;~;~;}~;v~;o~;h~;a~;Z~;S~;L~;E~;>~;7~;0~;)~;"~;~;~; ~;~;};};};};};};};};};};};};};};};};};};};z};s};l};e};^};W};P};I};B};;};4};-};&};};};}; };};|;|;|;|;|;|;|;|;|;|;|;|;|;|;|;|;|;|;~|;w|;p|;i|;b|;[|;T|;M|;F|;?|;8|;1|;*|;#|;|;|;|;|;|;{;{;{;{;{;{;{;{;{;{;{;{;{;{;{;{;{;{;{{;t{;m{;f{;_{;X{;Q{;J{;C{;<{;5{;.{;'{; {;{;{; {;{;z;z;z;z;z;z;z;z;z;z;z;z;z;z;z;z;z;z;z;xz;qz;jz;cz;\z;Uz;Nz;Gz;@z;9z;2z;+z;$z;z;z;z;z;z;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;|y;uy;ny;gy;`y;Yy;Ry;Ky;Dy;=y;6y;/y;(y;!y;y;y; y;y;x;x;x;x;x;x;x;x;x;x;x;x;x;x;x;x;x;x;x;yx;rx;kx;dx;]x;Vx;Ox;Hx;Ax;:x;3x;,x;%x;x;x;x; x;x;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;}w;vw;ow;hw;aw;Zw;Sw;Lw;Ew;>w;7w;0w;)w;"w;w;w; w;w;v;v;v;v;v;v;v;v;v;v;v;v;v;v;v;v;v;v;v;zv;sv;lv;ev;^v;Wv;Pv;Iv;Bv;;v;4v;-v;&v;v;v;v; v;v;u;u;u;u;u;u;u;u;u;u;u;u;u;u;u;u;u;u;~u;wu;pu;iu;bu;[u;Tu;Mu;Fu;?u;8u;1u;*u;#u;u;u;u;u;u;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;{t;tt;mt;ft;_t;Xt;Qt;Jt;Ct;p;7p;0p;)p;"p;p;p; p;p;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;zo;so;lo;eo;^o;Wo;Po;Io;Bo;;o;4o;-o;&o;o;o;o; o;o;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;~n;wn;pn;in;bn;[n;Tn;Mn;Fn;?n;8n;1n;*n;#n;n;n;n;n;n;m;m;m;m;m;m;m;m;m;m;m;m;m;m;m;m;m;m;{m;tm;mm;fm;_m;Xm;Qm;Jm;Cm;i;7i;0i;)i;"i;i;i; i;i;h;h;h;h;h;h;h;h;h;h;h;h;h;h;h;h;h;h;h;zh;sh;lh;eh;^h;Wh;Ph;Ih;Bh;;h;4h;-h;&h;h;h;h; h;h;g;g;g;g;g;g;g;g;g;g;g;g;g;g;g;g;g;g;~g;wg;pg;ig;bg;[g;Tg;Mg;Fg;?g;8g;1g;*g;#g;g;g;g;g;g;f;f;f;f;f;f;f;f;f;f;f;f;f;f;f;f;f;f;{f;tf;mf;ff;_f;Xf;Qf;Jf;Cf;b;7b;0b;)b;"b;b;b; b;b;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;za;sa;la;ea;^a;Wa;Pa;Ia;Ba;;a;4a;-a;&a;a;a;a; a;a;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;~`;w`;p`;i`;b`;[`;T`;M`;F`;?`;8`;1`;*`;#`;`;`;`;`;`;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;{_;t_;m_;f_;__;X_;Q_;J_;C_;<_;5_;._;'_; _;_;_; _;_;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;^;x^;q^;j^;c^;\^;U^;N^;G^;@^;9^;2^;+^;$^;^;^;^;^;^;];];];];];];];];];];];];];];];];];];|];u];n];g];`];Y];R];K];D];=];6];/];(];!];];]; ];];\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;y\;r\;k\;d\;]\;V\;O\;H\;A\;:\;3\;,\;%\;\;\;\; \;\;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;}[;v[;o[;h[;a[;Z[;S[;L[;E[;>[;7[;0[;)[;"[;[;[; [;[;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;Z;zZ;sZ;lZ;eZ;^Z;WZ;PZ;IZ;BZ;;Z;4Z;-Z;&Z;Z;Z;Z; Z;Z;Y;Y;Y;Y;Y;Y;Y;Y;Y;Y;Y;Y;Y;Y;Y;Y;Y;Y;~Y;wY;pY;iY;bY;[Y;TY;MY;FY;?Y;8Y;1Y;*Y;#Y;Y;Y;Y;Y;Y;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;{X;tX;mX;fX;_X;XX;QX;JX;CX;T;7T;0T;)T;"T;T;T; T;T;S;S;S;S;S;S;S;S;S;S;S;S;S;S;S;S;S;S;S;zS;sS;lS;eS;^S;WS;PS;IS;BS;;S;4S;-S;&S;S;S;S; S;S;R;R;R;R;R;R;R;R;R;R;R;R;R;R;R;R;R;R;~R;wR;pR;iR;bR;[R;TR;MR;FR;?R;8R;1R;*R;#R;R;R;R;R;R;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;{Q;tQ;mQ;fQ;_Q;XQ;QQ;JQ;CQ;M;7M;0M;)M;"M;M;M; M;M;L;L;L;L;L;L;L;L;L;L;L;L;L;L;L;L;L;L;L;zL;sL;lL;eL;^L;WL;PL;IL;BL;;L;4L;-L;&L;L;L;L; L;L;K;K;K;K;K;K;K;K;K;K;K;K;K;K;K;K;K;K;~K;wK;pK;iK;bK;[K;TK;MK;FK;?K;8K;1K;*K;#K;K;K;K;K;K;J;J;J;J;J;J;J;J;J;J;J;J;J;J;J;J;J;J;{J;tJ;mJ;fJ;_J;XJ;QJ;JJ;CJ;F;7F;0F;)F;"F;F;F; F;F;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;zE;sE;lE;eE;^E;WE;PE;IE;BE;;E;4E;-E;&E;E;E;E; E;E;D;D;D;D;D;D;D;D;D;D;D;D;D;D;D;D;D;D;~D;wD;pD;iD;bD;[D;TD;MD;FD;?D;8D;1D;*D;#D;D;D;D;D;D;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;{C;tC;mC;fC;_C;XC;QC;JC;CC;?;7?;0?;)?;"?;?;?; ?;?;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;z>;s>;l>;e>;^>;W>;P>;I>;B>;;>;4>;->;&>;>;>;>; >;>;=;=;=;=;=;=;=;=;=;=;=;=;=;=;=;=;=;=;~=;w=;p=;i=;b=;[=;T=;M=;F=;?=;8=;1=;*=;#=;=;=;=;=;=;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;{<;t<;m<;f<;_<;X<;Q<;J<;C<;<<;5<;.<;'<; <;<;<; <;<;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;x;;q;;j;;c;;\;;U;;N;;G;;@;;9;;2;;+;;$;;;;;;;;;;;;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;|:;u:;n:;g:;`:;Y:;R:;K:;D:;=:;6:;/:;(:;!:;:;:; :;:;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;y9;r9;k9;d9;]9;V9;O9;H9;A9;:9;39;,9;%9;9;9;9; 9;9;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;}8;v8;o8;h8;a8;Z8;S8;L8;E8;>8;78;08;)8;"8;8;8; 8;8;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;z7;s7;l7;e7;^7;W7;P7;I7;B7;;7;47;-7;&7;7;7;7; 7;7;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;~6;w6;p6;i6;b6;[6;T6;M6;F6;?6;86;16;*6;#6;6;6;6;6;6;5;5;5;5;5;5;5;5;5;5;5;5;5;5;5;5;5;5;{5;t5;m5;f5;_5;X5;Q5;J5;C5;<5;55;.5;'5; 5;5;5; 5;5;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;x4;q4;j4;c4;\4;U4;N4;G4;@4;94;24;+4;$4;4;4;4;4;4;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;|3;u3;n3;g3;`3;Y3;R3;K3;D3;=3;63;/3;(3;!3;3;3; 3;3;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;y2;r2;k2;d2;]2;V2;O2;H2;A2;:2;32;,2;%2;2;2;2; 2;2;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;}1;v1;o1;h1;a1;Z1;S1;L1;E1;>1;71;01;)1;"1;1;1; 1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;z0;s0;l0;e0;^0;W0;P0;I0;B0;;0;40;-0;&0;0;0;0; 0;0;/;/;/;/;/;/;/;/;/;/;/;/;/;/;/;/;/;/;~/;w/;p/;i/;b/;[/;T/;M/;F/;?/;8/;1/;*/;#/;/;/;/;/;/;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;{.;t.;m.;f.;_.;X.;Q.;J.;C.;<.;5.;..;'.; .;.;.; .;.;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;x-;q-;j-;c-;\-;U-;N-;G-;@-;9-;2-;+-;$-;-;-;-;-;-;,;,;,;,;,;,;,;,;,;,;,;,;,;,;,;,;,;,;|,;u,;n,;g,;`,;Y,;R,;K,;D,;=,;6,;/,;(,;!,;,;,; ,;,;+;+;+;+;+;+;+;+;+;+;+;+;+;+;+;+;+;+;+;y+;r+;k+;d+;]+;V+;O+;H+;A+;:+;3+;,+;%+;+;+;+; +;+;*;*;*;*;*;*;*;*;*;*;*;*;*;*;*;*;*;*;}*;v*;o*;h*;a*;Z*;S*;L*;E*;>*;7*;0*;)*;"*;*;*; *;*;);););););););););););););););););););z);s);l);e);^);W);P);I);B);;);4);-);&);););); ););(;(;(;(;(;(;(;(;(;(;(;(;(;(;(;(;(;(;~(;w(;p(;i(;b(;[(;T(;M(;F(;?(;8(;1(;*(;#(;(;(;(;(;(;';';';';';';';';';';';';';';';';';';{';t';m';f';_';X';Q';J';C';<';5';.';''; ';';'; ';';&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;x&;q&;j&;c&;\&;U&;N&;G&;@&;9&;2&;+&;$&;&;&;&;&;&;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;|%;u%;n%;g%;`%;Y%;R%;K%;D%;=%;6%;/%;(%;!%;%;%; %;%;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;y$;r$;k$;d$;]$;V$;O$;H$;A$;:$;3$;,$;%$;$;$;$; $;$;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;}#;v#;o#;h#;a#;Z#;S#;L#;E#;>#;7#;0#;)#;"#;#;#; #;#;";";";";";";";";";";";";";";";";";";";z";s";l";e";^";W";P";I";B";;";4";-";&";";";"; ";";!;!;!;!;!;!;!;!;!;!;!;!;!;!;!;!;!;!;~!;w!;p!;i!;b!;[!;T!;M!;F!;?!;8!;1!;*!;#!;!;!;!;!;!; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;{ ;t ;m ;f ;_ ;X ;Q ;J ;C ;< ;5 ;. ;' ; ; ; ; ; ;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;z ;s ;l ;e ;^ ;W ;P ;I ;B ;; ;4 ;- ;& ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;~ ;w ;p ;i ;b ;[ ;T ;M ;F ;? ;8 ;1 ;* ;# ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;{ ;t ;m ;f ;_ ;X ;Q ;J ;C ;< ;5 ;. ;' ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;x ;q ;j ;c ;\ ;U ;N ;G ;@ ;9 ;2 ;+ ;$ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;| ;u ;n ;g ;` ;Y ;R ;K ;D ;= ;6 ;/ ;( ;! ; ; ; ; ;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::ٿ:ҿ:˿:Ŀ::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::ݾ:־:Ͼ:Ⱦ:::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::ڽ:ӽ:̽:Ž:::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::޼:׼:м:ɼ:¼::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::ۻ:Ի:ͻ:ƻ:::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::ߺ:غ:Ѻ:ʺ:ú::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::ܹ:չ:ι:ǹ:::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::ٸ:Ҹ:˸:ĸ::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::ݷ:ַ:Ϸ:ȷ:::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::ڶ:Ӷ:̶:Ŷ:::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::޵:׵:е:ɵ:µ::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::۴:Դ:ʹ:ƴ:::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::߳:س:ѳ:ʳ:ó::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::ܲ:ղ:β:Dz:::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::ٱ:ұ:˱:ı::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::ݰ:ְ:ϰ:Ȱ:::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::گ:ӯ:̯:ů:::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::ޮ:׮:Ю:ɮ:®::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::ۭ:ԭ:ͭ:ƭ:::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::߬:ج:Ѭ:ʬ:ì::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::ܫ:ի:Ϋ:ǫ:::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::٪:Ҫ:˪:Ī::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::ݩ:֩:ϩ:ȩ:::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::ڨ:Ө:̨:Ũ:::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::ާ:ק:Ч:ɧ:§::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::ۦ:Ԧ:ͦ:Ʀ:::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::ߥ:إ:ѥ:ʥ:å::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::ܤ:դ:Τ:Ǥ:::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::٣:ң:ˣ:ģ::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::ݢ:֢:Ϣ:Ȣ:::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::ڡ:ӡ:̡:š:::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::ޠ:נ:Р:ɠ: ::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::۟:ԟ:͟:Ɵ:::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::ߞ:؞:ў:ʞ:Þ::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::ܝ:՝:Ν:ǝ:::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::ٜ:Ҝ:˜:Ĝ::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::ݛ:֛:ϛ:ț:::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::ښ:Ӛ:̚:Ś:::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::ޙ:י:Й:ə:™::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::ۘ:Ԙ:͘:Ƙ:::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::ߗ:ؗ:ї:ʗ:×::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::ܖ:Ֆ:Ζ:ǖ:::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::ٕ:ҕ:˕:ĕ::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::ݔ:֔:ϔ:Ȕ:::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::ړ:ӓ:̓:œ:::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::ޒ:ג:В:ɒ:’::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::ۑ:ԑ:͑:Ƒ:::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::ߐ:ؐ:ѐ:ʐ:Ð::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::܏:Տ:Ώ:Ǐ:::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::َ:Ҏ:ˎ:Ď::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::ݍ:֍:ύ:ȍ:::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::ڌ:ӌ:̌:Ō:::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::ދ:׋:Ћ:ɋ:‹::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::ۊ:Ԋ:͊:Ɗ:::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::߉:؉:щ:ʉ:É::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::܈:Ո:Έ:Lj:::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::ه:҇:ˇ:ć::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::݆:ֆ:φ:Ȇ:::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::څ:Ӆ:̅:Ņ:::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::ބ:ׄ:Є:Ʉ:„::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::ۃ:ԃ:̓:ƃ:::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::߂:؂:т:ʂ:Â::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::܁:Ձ:΁:ǁ:::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: :::::::ـ:Ҁ:ˀ:Ā::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:x~:q~:j~:c~:\~:U~:N~:G~:@~:9~:2~:+~:$~:~:~:~:~:~:}:}:}:}:}:}:}:}:}:}:}:}:}:}:}:}:}:}:|}:u}:n}:g}:`}:Y}:R}:K}:D}:=}:6}:/}:(}:!}:}:}: }:}:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:|:y|:r|:k|:d|:]|:V|:O|:H|:A|::|:3|:,|:%|:|:|:|: |:|:{:{:{:{:{:{:{:{:{:{:{:{:{:{:{:{:{:{:}{:v{:o{:h{:a{:Z{:S{:L{:E{:>{:7{:0{:){:"{:{:{: {:{:z:z:z:z:z:z:z:z:z:z:z:z:z:z:z:z:z:z:z:zz:sz:lz:ez:^z:Wz:Pz:Iz:Bz:;z:4z:-z:&z:z:z:z: z:z:y:y:y:y:y:y:y:y:y:y:y:y:y:y:y:y:y:y:~y:wy:py:iy:by:[y:Ty:My:Fy:?y:8y:1y:*y:#y:y:y:y:y:y:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:{x:tx:mx:fx:_x:Xx:Qx:Jx:Cx:t:7t:0t:)t:"t:t:t: t:t:s:s:s:s:s:s:s:s:s:s:s:s:s:s:s:s:s:s:s:zs:ss:ls:es:^s:Ws:Ps:Is:Bs:;s:4s:-s:&s:s:s:s: s:s:r:r:r:r:r:r:r:r:r:r:r:r:r:r:r:r:r:r:~r:wr:pr:ir:br:[r:Tr:Mr:Fr:?r:8r:1r:*r:#r:r:r:r:r:r:q:q:q:q:q:q:q:q:q:q:q:q:q:q:q:q:q:q:{q:tq:mq:fq:_q:Xq:Qq:Jq:Cq:m:7m:0m:)m:"m:m:m: m:m:l:l:l:l:l:l:l:l:l:l:l:l:l:l:l:l:l:l:l:zl:sl:ll:el:^l:Wl:Pl:Il:Bl:;l:4l:-l:&l:l:l:l: l:l:k:k:k:k:k:k:k:k:k:k:k:k:k:k:k:k:k:k:~k:wk:pk:ik:bk:[k:Tk:Mk:Fk:?k:8k:1k:*k:#k:k:k:k:k:k:j:j:j:j:j:j:j:j:j:j:j:j:j:j:j:j:j:j:{j:tj:mj:fj:_j:Xj:Qj:Jj:Cj:f:7f:0f:)f:"f:f:f: f:f:e:e:e:e:e:e:e:e:e:e:e:e:e:e:e:e:e:e:e:ze:se:le:ee:^e:We:Pe:Ie:Be:;e:4e:-e:&e:e:e:e: e:e:d:d:d:d:d:d:d:d:d:d:d:d:d:d:d:d:d:d:~d:wd:pd:id:bd:[d:Td:Md:Fd:?d:8d:1d:*d:#d:d:d:d:d:d:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:{c:tc:mc:fc:_c:Xc:Qc:Jc:Cc:_:7_:0_:)_:"_:_:_: _:_:^:^:^:^:^:^:^:^:^:^:^:^:^:^:^:^:^:^:^:z^:s^:l^:e^:^^:W^:P^:I^:B^:;^:4^:-^:&^:^:^:^: ^:^:]:]:]:]:]:]:]:]:]:]:]:]:]:]:]:]:]:]:~]:w]:p]:i]:b]:[]:T]:M]:F]:?]:8]:1]:*]:#]:]:]:]:]:]:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:{\:t\:m\:f\:_\:X\:Q\:J\:C\:<\:5\:.\:'\: \:\:\: \:\:[:[:[:[:[:[:[:[:[:[:[:[:[:[:[:[:[:[:[:x[:q[:j[:c[:\[:U[:N[:G[:@[:9[:2[:+[:$[:[:[:[:[:[:Z:Z:Z:Z:Z:Z:Z:Z:Z:Z:Z:Z:Z:Z:Z:Z:Z:Z:|Z:uZ:nZ:gZ:`Z:YZ:RZ:KZ:DZ:=Z:6Z:/Z:(Z:!Z:Z:Z: Z:Z:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:yY:rY:kY:dY:]Y:VY:OY:HY:AY::Y:3Y:,Y:%Y:Y:Y:Y: Y:Y:X:X:X:X:X:X:X:X:X:X:X:X:X:X:X:X:X:X:}X:vX:oX:hX:aX:ZX:SX:LX:EX:>X:7X:0X:)X:"X:X:X: X:X:W:W:W:W:W:W:W:W:W:W:W:W:W:W:W:W:W:W:W:zW:sW:lW:eW:^W:WW:PW:IW:BW:;W:4W:-W:&W:W:W:W: W:W:V:V:V:V:V:V:V:V:V:V:V:V:V:V:V:V:V:V:~V:wV:pV:iV:bV:[V:TV:MV:FV:?V:8V:1V:*V:#V:V:V:V:V:V:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:{U:tU:mU:fU:_U:XU:QU:JU:CU:Q:7Q:0Q:)Q:"Q:Q:Q: Q:Q:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:zP:sP:lP:eP:^P:WP:PP:IP:BP:;P:4P:-P:&P:P:P:P: P:P:O:O:O:O:O:O:O:O:O:O:O:O:O:O:O:O:O:O:~O:wO:pO:iO:bO:[O:TO:MO:FO:?O:8O:1O:*O:#O:O:O:O:O:O:N:N:N:N:N:N:N:N:N:N:N:N:N:N:N:N:N:N:{N:tN:mN:fN:_N:XN:QN:JN:CN:J:7J:0J:)J:"J:J:J: J:J:I:I:I:I:I:I:I:I:I:I:I:I:I:I:I:I:I:I:I:zI:sI:lI:eI:^I:WI:PI:II:BI:;I:4I:-I:&I:I:I:I: I:I:H:H:H:H:H:H:H:H:H:H:H:H:H:H:H:H:H:H:~H:wH:pH:iH:bH:[H:TH:MH:FH:?H:8H:1H:*H:#H:H:H:H:H:H:G:G:G:G:G:G:G:G:G:G:G:G:G:G:G:G:G:G:{G:tG:mG:fG:_G:XG:QG:JG:CG:C:7C:0C:)C:"C:C:C: C:C:B:B:B:B:B:B:B:B:B:B:B:B:B:B:B:B:B:B:B:zB:sB:lB:eB:^B:WB:PB:IB:BB:;B:4B:-B:&B:B:B:B: B:B:A:A:A:A:A:A:A:A:A:A:A:A:A:A:A:A:A:A:~A:wA:pA:iA:bA:[A:TA:MA:FA:?A:8A:1A:*A:#A:A:A:A:A:A:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:{@:t@:m@:f@:_@:X@:Q@:J@:C@:<@:5@:.@:'@: @:@:@: @:@:?:?:?:?:?:?:?:?:?:?:?:?:?:?:?:?:?:?:?:x?:q?:j?:c?:\?:U?:N?:G?:@?:9?:2?:+?:$?:?:?:?:?:?:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:|>:u>:n>:g>:`>:Y>:R>:K>:D>:=>:6>:/>:(>:!>:>:>: >:>:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:y=:r=:k=:d=:]=:V=:O=:H=:A=::=:3=:,=:%=:=:=:=: =:=:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:}<:v<:o<:h<:a<:Z<:S<:L<:E<:><:7<:0<:)<:"<:<:<: <:<:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:z;:s;:l;:e;:^;:W;:P;:I;:B;:;;:4;:-;:&;:;:;:;: ;:;:::::::::::::::::::::::::::::::::::::~::w::p::i::b::[::T::M::F::?::8::1::*::#::::::::::::9:9:9:9:9:9:9:9:9:9:9:9:9:9:9:9:9:9:{9:t9:m9:f9:_9:X9:Q9:J9:C9:<9:59:.9:'9: 9:9:9: 9:9:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:x8:q8:j8:c8:\8:U8:N8:G8:@8:98:28:+8:$8:8:8:8:8:8:7:7:7:7:7:7:7:7:7:7:7:7:7:7:7:7:7:7:|7:u7:n7:g7:`7:Y7:R7:K7:D7:=7:67:/7:(7:!7:7:7: 7:7:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:y6:r6:k6:d6:]6:V6:O6:H6:A6::6:36:,6:%6:6:6:6: 6:6:5:5:5:5:5:5:5:5:5:5:5:5:5:5:5:5:5:5:}5:v5:o5:h5:a5:Z5:S5:L5:E5:>5:75:05:)5:"5:5:5: 5:5:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:z4:s4:l4:e4:^4:W4:P4:I4:B4:;4:44:-4:&4:4:4:4: 4:4:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:~3:w3:p3:i3:b3:[3:T3:M3:F3:?3:83:13:*3:#3:3:3:3:3:3:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:{2:t2:m2:f2:_2:X2:Q2:J2:C2:<2:52:.2:'2: 2:2:2: 2:2:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:x1:q1:j1:c1:\1:U1:N1:G1:@1:91:21:+1:$1:1:1:1:1:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:|0:u0:n0:g0:`0:Y0:R0:K0:D0:=0:60:/0:(0:!0:0:0: 0:0:/:/:/:/:/:/:/:/:/:/:/:/:/:/:/:/:/:/:/:y/:r/:k/:d/:]/:V/:O/:H/:A/::/:3/:,/:%/:/:/:/: /:/:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:}.:v.:o.:h.:a.:Z.:S.:L.:E.:>.:7.:0.:).:".:.:.: .:.:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:z-:s-:l-:e-:^-:W-:P-:I-:B-:;-:4-:--:&-:-:-:-: -:-:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:~,:w,:p,:i,:b,:[,:T,:M,:F,:?,:8,:1,:*,:#,:,:,:,:,:,:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:{+:t+:m+:f+:_+:X+:Q+:J+:C+:<+:5+:.+:'+: +:+:+: +:+:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:x*:q*:j*:c*:\*:U*:N*:G*:@*:9*:2*:+*:$*:*:*:*:*:*:):):):):):):):):):):):):):):):):):):|):u):n):g):`):Y):R):K):D):=):6):/):():!):):): ):):(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:y(:r(:k(:d(:](:V(:O(:H(:A(::(:3(:,(:%(:(:(:(: (:(:':':':':':':':':':':':':':':':':':':}':v':o':h':a':Z':S':L':E':>':7':0':)':"':':': ':':&:&:&:&:&:&:&:&:&:&:&:&:&:&:&:&:&:&:&:z&:s&:l&:e&:^&:W&:P&:I&:B&:;&:4&:-&:&&:&:&:&: &:&:%:%:%:%:%:%:%:%:%:%:%:%:%:%:%:%:%:%:~%:w%:p%:i%:b%:[%:T%:M%:F%:?%:8%:1%:*%:#%:%:%:%:%:%:$:$:$:$:$:$:$:$:$:$:$:$:$:$:$:$:$:$:{$:t$:m$:f$:_$:X$:Q$:J$:C$:<$:5$:.$:'$: $:$:$: $:$:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:x#:q#:j#:c#:\#:U#:N#:G#:@#:9#:2#:+#:$#:#:#:#:#:#:":":":":":":":":":":":":":":":":":":|":u":n":g":`":Y":R":K":D":=":6":/":(":!":":": ":":!:!:!:!:!:!:!:!:!:!:!:!:!:!:!:!:!:!:!:y!:r!:k!:d!:]!:V!:O!:H!:A!::!:3!:,!:%!:!:!:!: !:!: : : : : : : : : : : : : : : : : : :} :v :o :h :a :Z :S :L :E :> :7 :0 :) :" : : : : ::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$:::::: : : : : : : : : : : : : : : : : : :| :u :n :g :` :Y :R :K :D := :6 :/ :( :! : : : : : : : : : : : : : : : : : : : : : : : :y :r :k :d :] :V :O :H :A :: :3 :, :% : : : : : : : : : : : : : : : : : : : : : : : :} :v :o :h :a :Z :S :L :E :> :7 :0 :) :" : : : : : : : : : : : : : : : : : : : : : : : :z :s :l :e :^ :W :P :I :B :; :4 :- :& : : : : : : : : : : : : : : : : : : : : : : : :~ :w :p :i :b :[ :T :M :F :? :8 :1 :* :# : : : : : :::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: :::::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: :::::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: :::::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999ۿ9Կ9Ϳ9ƿ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 999999߾9ؾ9Ѿ9ʾ9þ9999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 9999999ܽ9ս9ν9ǽ99999999999z9s9l9e9^9W9P9I9B9;949-9&9999 9999999ټ9Ҽ9˼9ļ9999999999~9w9p9i9b9[9T9M9F9?98919*9#9999999999ݻ9ֻ9ϻ9Ȼ99999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 9999999ں9Ӻ9̺9ź99999999999x9q9j9c9\9U9N9G9@99929+9$9999999999޹9׹9й9ɹ9¹9999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999۸9Ը9͸9Ƹ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 999999߷9ط9ѷ9ʷ9÷9999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 9999999ܶ9ն9ζ9Ƕ99999999999z9s9l9e9^9W9P9I9B9;949-9&9999 9999999ٵ9ҵ9˵9ĵ9999999999~9w9p9i9b9[9T9M9F9?98919*9#9999999999ݴ9ִ9ϴ9ȴ99999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 9999999ڳ9ӳ9̳9ų99999999999x9q9j9c9\9U9N9G9@99929+9$9999999999޲9ײ9в9ɲ9²9999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999۱9Ա9ͱ9Ʊ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 999999߰9ذ9Ѱ9ʰ9ð9999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 9999999ܯ9կ9ί9ǯ99999999999z9s9l9e9^9W9P9I9B9;949-9&9999 9999999ٮ9Ү9ˮ9Į9999999999~9w9p9i9b9[9T9M9F9?98919*9#9999999999ݭ9֭9ϭ9ȭ99999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 9999999ڬ9Ӭ9̬9Ŭ99999999999x9q9j9c9\9U9N9G9@99929+9$9999999999ޫ9׫9Ы9ɫ9«9999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999۪9Ԫ9ͪ9ƪ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 999999ߩ9ة9ѩ9ʩ9é9999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 9999999ܨ9ը9Ψ9Ǩ99999999999z9s9l9e9^9W9P9I9B9;949-9&9999 9999999٧9ҧ9˧9ħ9999999999~9w9p9i9b9[9T9M9F9?98919*9#9999999999ݦ9֦9Ϧ9Ȧ99999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 9999999ڥ9ӥ9̥9ť99999999999x9q9j9c9\9U9N9G9@99929+9$9999999999ޤ9פ9Ф9ɤ9¤9999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999ۣ9ԣ9ͣ9ƣ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 999999ߢ9آ9Ѣ9ʢ9â9999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 9999999ܡ9ա9Ρ9ǡ99999999999z9s9l9e9^9W9P9I9B9;949-9&9999 9999999٠9Ҡ9ˠ9Ġ9999999999~9w9p9i9b9[9T9M9F9?98919*9#9999999999ݟ9֟9ϟ9ȟ99999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 9999999ڞ9Ӟ9̞9Ş99999999999x9q9j9c9\9U9N9G9@99929+9$9999999999ޝ9ם9Н9ɝ99999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999ۜ9Ԝ9͜9Ɯ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 999999ߛ9؛9ћ9ʛ9Û9999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 9999999ܚ9՚9Κ9ǚ99999999999z9s9l9e9^9W9P9I9B9;949-9&9999 9999999ٙ9ҙ9˙9ę9999999999~9w9p9i9b9[9T9M9F9?98919*9#9999999999ݘ9֘9Ϙ9Ș99999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 9999999ڗ9ӗ9̗9ŗ99999999999x9q9j9c9\9U9N9G9@99929+9$9999999999ޖ9ז9Ж9ɖ9–9999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999ە9ԕ9͕9ƕ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 999999ߔ9ؔ9є9ʔ9Ô9999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 9999999ܓ9Փ9Γ9Ǔ99999999999z9s9l9e9^9W9P9I9B9;949-9&9999 9999999ْ9Ғ9˒9Ē9999999999~9w9p9i9b9[9T9M9F9?98919*9#9999999999ݑ9֑9ϑ9ȑ99999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 9999999ڐ9Ӑ9̐9Ő99999999999x9q9j9c9\9U9N9G9@99929+9$9999999999ޏ9׏9Џ9ɏ99999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999ێ9Ԏ9͎9Ǝ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 999999ߍ9؍9э9ʍ9Í9999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 9999999܌9Ռ9Ό9nj99999999999z9s9l9e9^9W9P9I9B9;949-9&9999 9999999ً9ҋ9ˋ9ċ9999999999~9w9p9i9b9[9T9M9F9?98919*9#9999999999݊9֊9ϊ9Ȋ99999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 9999999ډ9Ӊ9̉9ʼn99999999999x9q9j9c9\9U9N9G9@99929+9$9999999999ވ9׈9Ј9Ɉ9ˆ9999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999ۇ9ԇ9͇9Ƈ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 999999߆9؆9ц9ʆ9Æ9999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 9999999܅9Յ9΅9Dž99999999999z9s9l9e9^9W9P9I9B9;949-9&9999 9999999ل9҄9˄9Ą9999999999~9w9p9i9b9[9T9M9F9?98919*9#9999999999݃9փ9σ9ȃ99999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 9999999ڂ9ӂ9̂9ł99999999999x9q9j9c9\9U9N9G9@99929+9$9999999999ށ9ׁ9Ё9Ɂ99999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 9999999ۀ9Ԁ9̀9ƀ99999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 99~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9~9z~9s~9l~9e~9^~9W~9P~9I~9B~9;~94~9-~9&~9~9~9~9 ~9~9}9}9}9}9}9}9}9}9}9}9}9}9}9}9}9}9}9}9~}9w}9p}9i}9b}9[}9T}9M}9F}9?}98}91}9*}9#}9}9}9}9}9}9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9{|9t|9m|9f|9_|9X|9Q|9J|9C|9<|95|9.|9'|9 |9|9|9 |9|9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9x{9q{9j{9c{9\{9U{9N{9G{9@{99{92{9+{9${9{9{9{9{9{9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9|z9uz9nz9gz9`z9Yz9Rz9Kz9Dz9=z96z9/z9(z9!z9z9z9 z9z9y9y9y9y9y9y9y9y9y9y9y9y9y9y9y9y9y9y9y9yy9ry9ky9dy9]y9Vy9Oy9Hy9Ay9:y93y9,y9%y9y9y9y9 y9y9x9x9x9x9x9x9x9x9x9x9x9x9x9x9x9x9x9x9}x9vx9ox9hx9ax9Zx9Sx9Lx9Ex9>x97x90x9)x9"x9x9x9 x9x9w9w9w9w9w9w9w9w9w9w9w9w9w9w9w9w9w9w9w9zw9sw9lw9ew9^w9Ww9Pw9Iw9Bw9;w94w9-w9&w9w9w9w9 w9w9v9v9v9v9v9v9v9v9v9v9v9v9v9v9v9v9v9v9~v9wv9pv9iv9bv9[v9Tv9Mv9Fv9?v98v91v9*v9#v9v9v9v9v9v9u9u9u9u9u9u9u9u9u9u9u9u9u9u9u9u9u9u9{u9tu9mu9fu9_u9Xu9Qu9Ju9Cu9q97q90q9)q9"q9q9q9 q9q9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9zp9sp9lp9ep9^p9Wp9Pp9Ip9Bp9;p94p9-p9&p9p9p9p9 p9p9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9~o9wo9po9io9bo9[o9To9Mo9Fo9?o98o91o9*o9#o9o9o9o9o9o9n9n9n9n9n9n9n9n9n9n9n9n9n9n9n9n9n9n9{n9tn9mn9fn9_n9Xn9Qn9Jn9Cn9j97j90j9)j9"j9j9j9 j9j9i9i9i9i9i9i9i9i9i9i9i9i9i9i9i9i9i9i9i9zi9si9li9ei9^i9Wi9Pi9Ii9Bi9;i94i9-i9&i9i9i9i9 i9i9h9h9h9h9h9h9h9h9h9h9h9h9h9h9h9h9h9h9~h9wh9ph9ih9bh9[h9Th9Mh9Fh9?h98h91h9*h9#h9h9h9h9h9h9g9g9g9g9g9g9g9g9g9g9g9g9g9g9g9g9g9g9{g9tg9mg9fg9_g9Xg9Qg9Jg9Cg9c97c90c9)c9"c9c9c9 c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9zb9sb9lb9eb9^b9Wb9Pb9Ib9Bb9;b94b9-b9&b9b9b9b9 b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9~a9wa9pa9ia9ba9[a9Ta9Ma9Fa9?a98a91a9*a9#a9a9a9a9a9a9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9{`9t`9m`9f`9_`9X`9Q`9J`9C`9<`95`9.`9'`9 `9`9`9 `9`9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9_9x_9q_9j_9c_9\_9U_9N_9G_9@_99_92_9+_9$_9_9_9_9_9_9^9^9^9^9^9^9^9^9^9^9^9^9^9^9^9^9^9^9|^9u^9n^9g^9`^9Y^9R^9K^9D^9=^96^9/^9(^9!^9^9^9 ^9^9]9]9]9]9]9]9]9]9]9]9]9]9]9]9]9]9]9]9]9y]9r]9k]9d]9]]9V]9O]9H]9A]9:]93]9,]9%]9]9]9]9 ]9]9\9\9\9\9\9\9\9\9\9\9\9\9\9\9\9\9\9\9}\9v\9o\9h\9a\9Z\9S\9L\9E\9>\97\90\9)\9"\9\9\9 \9\9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9[9z[9s[9l[9e[9^[9W[9P[9I[9B[9;[94[9-[9&[9[9[9[9 [9[9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9Z9~Z9wZ9pZ9iZ9bZ9[Z9TZ9MZ9FZ9?Z98Z91Z9*Z9#Z9Z9Z9Z9Z9Z9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9{Y9tY9mY9fY9_Y9XY9QY9JY9CY9U97U90U9)U9"U9U9U9 U9U9T9T9T9T9T9T9T9T9T9T9T9T9T9T9T9T9T9T9T9zT9sT9lT9eT9^T9WT9PT9IT9BT9;T94T9-T9&T9T9T9T9 T9T9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9~S9wS9pS9iS9bS9[S9TS9MS9FS9?S98S91S9*S9#S9S9S9S9S9S9R9R9R9R9R9R9R9R9R9R9R9R9R9R9R9R9R9R9{R9tR9mR9fR9_R9XR9QR9JR9CR9N97N90N9)N9"N9N9N9 N9N9M9M9M9M9M9M9M9M9M9M9M9M9M9M9M9M9M9M9M9zM9sM9lM9eM9^M9WM9PM9IM9BM9;M94M9-M9&M9M9M9M9 M9M9L9L9L9L9L9L9L9L9L9L9L9L9L9L9L9L9L9L9~L9wL9pL9iL9bL9[L9TL9ML9FL9?L98L91L9*L9#L9L9L9L9L9L9K9K9K9K9K9K9K9K9K9K9K9K9K9K9K9K9K9K9{K9tK9mK9fK9_K9XK9QK9JK9CK9G97G90G9)G9"G9G9G9 G9G9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9zF9sF9lF9eF9^F9WF9PF9IF9BF9;F94F9-F9&F9F9F9F9 F9F9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9~E9wE9pE9iE9bE9[E9TE9ME9FE9?E98E91E9*E9#E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9{D9tD9mD9fD9_D9XD9QD9JD9CD9@97@90@9)@9"@9@9@9 @9@9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9z?9s?9l?9e?9^?9W?9P?9I?9B?9;?94?9-?9&?9?9?9?9 ?9?9>9>9>9>9>9>9>9>9>9>9>9>9>9>9>9>9>9>9~>9w>9p>9i>9b>9[>9T>9M>9F>9?>98>91>9*>9#>9>9>9>9>9>9=9=9=9=9=9=9=9=9=9=9=9=9=9=9=9=9=9=9{=9t=9m=9f=9_=9X=9Q=9J=9C=9<=95=9.=9'=9 =9=9=9 =9=9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9x<9q<9j<9c<9\<9U<9N<9G<9@<99<92<9+<9$<9<9<9<9<9<9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9|;9u;9n;9g;9`;9Y;9R;9K;9D;9=;96;9/;9(;9!;9;9;9 ;9;9:9:9:9:9:9:9:9:9:9:9:9:9:9:9:9:9:9:9:9y:9r:9k:9d:9]:9V:9O:9H:9A:9::93:9,:9%:9:9:9:9 :9:9999999999999999999999999999999999999}99v99o99h99a99Z99S99L99E99>99799099)99"999999 999989898989898989898989898989898989898989z89s89l89e89^89W89P89I89B89;89489-89&89898989 8989797979797979797979797979797979797979~79w79p79i79b79[79T79M79F79?79879179*79#797979797979696969696969696969696969696969696969{69t69m69f69_69X69Q69J69C69<69569.69'69 696969 696959595959595959595959595959595959595959x59q59j59c59\59U59N59G59@59959259+59$595959595959494949494949494949494949494949494949|49u49n49g49`49Y49R49K49D49=49649/49(49!494949 494939393939393939393939393939393939393939y39r39k39d39]39V39O39H39A39:39339,39%39393939 3939292929292929292929292929292929292929}29v29o29h29a29Z29S29L29E29>29729029)29"292929 292919191919191919191919191919191919191919z19s19l19e19^19W19P19I19B19;19419-19&19191919 1919090909090909090909090909090909090909~09w09p09i09b09[09T09M09F09?09809109*09#090909090909/9/9/9/9/9/9/9/9/9/9/9/9/9/9/9/9/9/9{/9t/9m/9f/9_/9X/9Q/9J/9C/9+97+90+9)+9"+9+9+9 +9+9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9z*9s*9l*9e*9^*9W*9P*9I*9B*9;*94*9-*9&*9*9*9*9 *9*9)9)9)9)9)9)9)9)9)9)9)9)9)9)9)9)9)9)9~)9w)9p)9i)9b)9[)9T)9M)9F)9?)98)91)9*)9#)9)9)9)9)9)9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9{(9t(9m(9f(9_(9X(9Q(9J(9C(9<(95(9.(9'(9 (9(9(9 (9(9'9'9'9'9'9'9'9'9'9'9'9'9'9'9'9'9'9'9'9x'9q'9j'9c'9\'9U'9N'9G'9@'99'92'9+'9$'9'9'9'9'9'9&9&9&9&9&9&9&9&9&9&9&9&9&9&9&9&9&9&9|&9u&9n&9g&9`&9Y&9R&9K&9D&9=&96&9/&9(&9!&9&9&9 &9&9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9y%9r%9k%9d%9]%9V%9O%9H%9A%9:%93%9,%9%%9%9%9%9 %9%9$9$9$9$9$9$9$9$9$9$9$9$9$9$9$9$9$9$9}$9v$9o$9h$9a$9Z$9S$9L$9E$9>$97$90$9)$9"$9$9$9 $9$9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9z#9s#9l#9e#9^#9W#9P#9I#9B#9;#94#9-#9 #9#9#9 #9#9"9"9"9"9"9"9"9"9"9"9"9"9"9"9"9"9"9"9~"9w"9p"9i"9b"9["9T"9M"9F"9?"98"91"9*"9#"9"9"9"9"9"9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9{!9t!9m!9f!9_!9X!9Q!9J!9C!997909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9~ 9w 9p 9i 9b 9[ 9T 9M 9F 9? 98 91 9* 9# 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9{ 9t 9m 9f 9_ 9X 9Q 9J 9C 9< 95 9. 9' 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9x 9q 9j 9c 9\ 9U 9N 9G 9@ 99 92 9+ 9$ 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9| 9u 9n 9g 9` 9Y 9R 9K 9D 9= 96 9/ 9( 9! 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9y 9r 9k 9d 9] 9V 9O 9H 9A 9: 93 9, 9% 9 9 9 9 9 9999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 999999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 999999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 999999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888ݿ8ֿ8Ͽ8ȿ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 8888888ھ8Ӿ8̾8ž88888888888x8q8j8c8\8U8N8G8@89828+8$8888888888޽8׽8н8ɽ8½8888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 8888888ۼ8Լ8ͼ8Ƽ88888888888y8r8k8d8]8V8O8H8A8:838,8%8888 888888߻8ػ8ѻ8ʻ8û8888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 8888888ܺ8պ8κ8Ǻ88888888888z8s8l8e8^8W8P8I8B8;848-8&8888 8888888ٹ8ҹ8˹8Ĺ8888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888ݸ8ָ8ϸ8ȸ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 8888888ڷ8ӷ8̷8ŷ88888888888x8q8j8c8\8U8N8G8@89828+8$8888888888޶8׶8ж8ɶ8¶8888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 8888888۵8Ե8͵8Ƶ88888888888y8r8k8d8]8V8O8H8A8:838,8%8888 888888ߴ8ش8Ѵ8ʴ8ô8888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 8888888ܳ8ճ8γ8dz88888888888z8s8l8e8^8W8P8I8B8;848-8&8888 8888888ٲ8Ҳ8˲8IJ8888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888ݱ8ֱ8ϱ8ȱ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 8888888ڰ8Ӱ8̰8Ű88888888888x8q8j8c8\8U8N8G8@89828+8$8888888888ޯ8ׯ8Я8ɯ8¯8888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 8888888ۮ8Ԯ8ͮ8Ʈ88888888888y8r8k8d8]8V8O8H8A8:838,8%8888 888888߭8ح8ѭ8ʭ8í8888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 8888888ܬ8լ8ά8Ǭ88888888888z8s8l8e8^8W8P8I8B8;848-8&8888 8888888٫8ҫ8˫8ī8888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888ݪ8֪8Ϫ8Ȫ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 8888888ک8ө8̩8ũ88888888888x8q8j8c8\8U8N8G8@89828+8$8888888888ި8ר8Ш8ɨ8¨8888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 8888888ۧ8ԧ8ͧ8Ƨ88888888888y8r8k8d8]8V8O8H8A8:838,8%8888 888888ߦ8ئ8Ѧ8ʦ8æ8888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 8888888ܥ8ե8Υ8ǥ88888888888z8s8l8e8^8W8P8I8B8;848-8&8888 8888888٤8Ҥ8ˤ8Ĥ8888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888ݣ8֣8ϣ8ȣ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 8888888ڢ8Ӣ8̢8Ţ88888888888x8q8j8c8\8U8N8G8@89828+8$8888888888ޡ8ס8С8ɡ8¡8888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 8888888۠8Ԡ8͠8Ơ88888888888y8r8k8d8]8V8O8H8A8:838,8%8888 888888ߟ8؟8џ8ʟ8ß8888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 8888888ܞ8՞8Ξ8Ǟ88888888888z8s8l8e8^8W8P8I8B8;848-8&8888 8888888ٝ8ҝ8˝8ĝ8888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888ݜ8֜8Ϝ8Ȝ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 8888888ڛ8ӛ8̛8ś88888888888x8q8j8c8\8U8N8G8@89828+8$8888888888ޚ8ך8К8ɚ8š8888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 8888888ۙ8ԙ8͙8ƙ88888888888y8r8k8d8]8V8O8H8A8:838,8%8888 888888ߘ8ؘ8ј8ʘ8Ø8888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 8888888ܗ8՗8Η8Ǘ88888888888z8s8l8e8^8W8P8I8B8;848-8&8888 8888888ٖ8Җ8˖8Ė8888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888ݕ8֕8ϕ8ȕ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 8888888ڔ8Ӕ8̔8Ŕ88888888888x8q8j8c8\8U8N8G8@89828+8$8888888888ޓ8ד8Г8ɓ8“8888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 8888888ے8Ԓ8͒8ƒ88888888888y8r8k8d8]8V8O8H8A8:838,8%8888 888888ߑ8ؑ8ё8ʑ8Ñ8888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 8888888ܐ8Ր8ΐ8ǐ88888888888z8s8l8e8^8W8P8I8B8;848-8&8888 8888888ُ8ҏ8ˏ8ď8888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888ݎ8֎8ώ8Ȏ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 8888888ڍ8Ӎ8̍8ō88888888888x8q8j8c8\8U8N8G8@89828+8$8888888888ތ8׌8Ќ8Ɍ8Œ8888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 8888888ۋ8ԋ8͋8Ƌ88888888888y8r8k8d8]8V8O8H8A8:838,8%8888 888888ߊ8؊8ъ8ʊ8Ê8888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 8888888܉8Չ8Ή8lj88888888888z8s8l8e8^8W8P8I8B8;848-8&8888 8888888و8҈8ˈ8Ĉ8888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888݇8և8χ8ȇ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 8888888چ8ӆ8̆8ņ88888888888x8q8j8c8\8U8N8G8@89828+8$8888888888ޅ8ׅ8Ѕ8Ʌ8…8888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 8888888ۄ8Ԅ8̈́8Ƅ88888888888y8r8k8d8]8V8O8H8A8:838,8%8888 888888߃8؃8у8ʃ8Ã8888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 8888888܂8Ղ8΂8ǂ88888888888z8s8l8e8^8W8P8I8B8;848-8&8888 8888888ف8ҁ8ˁ8ā8888888888~8w8p8i8b8[8T8M8F8?88818*8#8888888888݀8ր8π8Ȁ88888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888~8~8~8~8~8~8~8~8~8~8~8~8~8~8~8~8~8~8|~8u~8n~8g~8`~8Y~8R~8K~8D~8=~86~8/~8(~8!~8~8~8 ~8~8}8}8}8}8}8}8}8}8}8}8}8}8}8}8}8}8}8}8}8y}8r}8k}8d}8]}8V}8O}8H}8A}8:}83}8,}8%}8}8}8}8 }8}8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8}|8v|8o|8h|8a|8Z|8S|8L|8E|8>|87|80|8)|8"|8|8|8 |8|8{8{8{8{8{8{8{8{8{8{8{8{8{8{8{8{8{8{8{8z{8s{8l{8e{8^{8W{8P{8I{8B{8;{84{8-{8&{8{8{8{8 {8{8z8z8z8z8z8z8z8z8z8z8z8z8z8z8z8z8z8z8~z8wz8pz8iz8bz8[z8Tz8Mz8Fz8?z88z81z8*z8#z8z8z8z8z8z8y8y8y8y8y8y8y8y8y8y8y8y8y8y8y8y8y8y8{y8ty8my8fy8_y8Xy8Qy8Jy8Cy8u87u80u8)u8"u8u8u8 u8u8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8zt8st8lt8et8^t8Wt8Pt8It8Bt8;t84t8-t8&t8t8t8t8 t8t8s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8~s8ws8ps8is8bs8[s8Ts8Ms8Fs8?s88s81s8*s8#s8s8s8s8s8s8r8r8r8r8r8r8r8r8r8r8r8r8r8r8r8r8r8r8{r8tr8mr8fr8_r8Xr8Qr8Jr8Cr8n87n80n8)n8"n8n8n8 n8n8m8m8m8m8m8m8m8m8m8m8m8m8m8m8m8m8m8m8m8zm8sm8lm8em8^m8Wm8Pm8Im8Bm8;m84m8-m8&m8m8m8m8 m8m8l8l8l8l8l8l8l8l8l8l8l8l8l8l8l8l8l8l8~l8wl8pl8il8bl8[l8Tl8Ml8Fl8?l88l81l8*l8#l8l8l8l8l8l8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8k8{k8tk8mk8fk8_k8Xk8Qk8Jk8Ck8g87g80g8)g8"g8g8g8 g8g8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8zf8sf8lf8ef8^f8Wf8Pf8If8Bf8;f84f8-f8&f8f8f8f8 f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8~e8we8pe8ie8be8[e8Te8Me8Fe8?e88e81e8*e8#e8e8e8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8{d8td8md8fd8_d8Xd8Qd8Jd8Cd8`87`80`8)`8"`8`8`8 `8`8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8z_8s_8l_8e_8^_8W_8P_8I_8B_8;_84_8-_8&_8_8_8_8 _8_8^8^8^8^8^8^8^8^8^8^8^8^8^8^8^8^8^8^8~^8w^8p^8i^8b^8[^8T^8M^8F^8?^88^81^8*^8#^8^8^8^8^8^8]8]8]8]8]8]8]8]8]8]8]8]8]8]8]8]8]8]8{]8t]8m]8f]8_]8X]8Q]8J]8C]8<]85]8.]8']8 ]8]8]8 ]8]8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8\8x\8q\8j\8c\8\\8U\8N\8G\8@\89\82\8+\8$\8\8\8\8\8\8[8[8[8[8[8[8[8[8[8[8[8[8[8[8[8[8[8[8|[8u[8n[8g[8`[8Y[8R[8K[8D[8=[86[8/[8([8![8[8[8 [8[8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8yZ8rZ8kZ8dZ8]Z8VZ8OZ8HZ8AZ8:Z83Z8,Z8%Z8Z8Z8Z8 Z8Z8Y8Y8Y8Y8Y8Y8Y8Y8Y8Y8Y8Y8Y8Y8Y8Y8Y8Y8}Y8vY8oY8hY8aY8ZY8SY8LY8EY8>Y87Y80Y8)Y8"Y8Y8Y8 Y8Y8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8zX8sX8lX8eX8^X8WX8PX8IX8BX8;X84X8-X8&X8X8X8X8 X8X8W8W8W8W8W8W8W8W8W8W8W8W8W8W8W8W8W8W8~W8wW8pW8iW8bW8[W8TW8MW8FW8?W88W81W8*W8#W8W8W8W8W8W8V8V8V8V8V8V8V8V8V8V8V8V8V8V8V8V8V8V8{V8tV8mV8fV8_V8XV8QV8JV8CV8R87R80R8)R8"R8R8R8 R8R8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8Q8zQ8sQ8lQ8eQ8^Q8WQ8PQ8IQ8BQ8;Q84Q8-Q8&Q8Q8Q8Q8 Q8Q8P8P8P8P8P8P8P8P8P8P8P8P8P8P8P8P8P8P8~P8wP8pP8iP8bP8[P8TP8MP8FP8?P88P81P8*P8#P8P8P8P8P8P8O8O8O8O8O8O8O8O8O8O8O8O8O8O8O8O8O8O8{O8tO8mO8fO8_O8XO8QO8JO8CO8K87K80K8)K8"K8K8K8 K8K8J8J8J8J8J8J8J8J8J8J8J8J8J8J8J8J8J8J8J8zJ8sJ8lJ8eJ8^J8WJ8PJ8IJ8BJ8;J84J8-J8&J8J8J8J8 J8J8I8I8I8I8I8I8I8I8I8I8I8I8I8I8I8I8I8I8~I8wI8pI8iI8bI8[I8TI8MI8FI8?I88I81I8*I8#I8I8I8I8I8I8H8H8H8H8H8H8H8H8H8H8H8H8H8H8H8H8H8H8{H8tH8mH8fH8_H8XH8QH8JH8CH8D87D80D8)D8"D8D8D8 D8D8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8zC8sC8lC8eC8^C8WC8PC8IC8BC8;C84C8-C8&C8C8C8C8 C8C8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8~B8wB8pB8iB8bB8[B8TB8MB8FB8?B88B81B8*B8#B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8{A8tA8mA8fA8_A8XA8QA8JA8CA88>8>8>8>8>8>8>8>8>8>8>8>8>8>8>8>8>8>8y>8r>8k>8d>8]>8V>8O>8H>8A>8:>83>8,>8%>8>8>8>8 >8>8=8=8=8=8=8=8=8=8=8=8=8=8=8=8=8=8=8=8}=8v=8o=8h=8a=8Z=8S=8L=8E=8>=87=80=8)=8"=8=8=8 =8=8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8z<8s<8l<8e<8^<8W<8P<8I<8B<8;<84<8-<8&<8<8<8<8 <8<8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8~;8w;8p;8i;8b;8[;8T;8M;8F;8?;88;81;8*;8#;8;8;8;8;8;8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8:8{:8t:8m:8f:8_:8X:8Q:8J:8C:8<:85:8.:8':8 :8:8:8 :8:898989898989898989898989898989898989898x98q98j98c98\98U98N98G98@98998298+98$989898989898888888888888888888888888888888888888|88u88n88g88`88Y88R88K88D88=88688/88(88!888888 888878787878787878787878787878787878787878y78r78k78d78]78V78O78H78A78:78378,78%78787878 7878686868686868686868686868686868686868}68v68o68h68a68Z68S68L68E68>68768068)68"686868 686858585858585858585858585858585858585858z58s58l58e58^58W58P58I58B58;58458-58&58585858 5858484848484848484848484848484848484848~48w48p48i48b48[48T48M48F48?48848148*48#484848484848383838383838383838383838383838383838{38t38m38f38_38X38Q38J38C38<38538.38'38 383838 383828282828282828282828282828282828282828x28q28j28c28\28U28N28G28@28928228+28$282828282828181818181818181818181818181818181818|18u18n18g18`18Y18R18K18D18=18618/18(18!181818 181808080808080808080808080808080808080808y08r08k08d08]08V08O08H08A08:08308,08%08080808 0808/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8}/8v/8o/8h/8a/8Z/8S/8L/8E/8>/87/80/8)/8"/8/8/8 /8/8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8z.8s.8l.8e.8^.8W.8P.8I.8B.8;.84.8-.8&.8.8.8.8 .8.8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8~-8w-8p-8i-8b-8[-8T-8M-8F-8?-88-81-8*-8#-8-8-8-8-8-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8{,8t,8m,8f,8_,8X,8Q,8J,8C,8<,85,8.,8',8 ,8,8,8 ,8,8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8x+8q+8j+8c+8\+8U+8N+8G+8@+89+82+8++8$+8+8+8+8+8+8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8|*8u*8n*8g*8`*8Y*8R*8K*8D*8=*86*8/*8(*8!*8*8*8 *8*8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8y)8r)8k)8d)8])8V)8O)8H)8A)8:)83)8,)8%)8)8)8)8 )8)8(8(8(8(8(8(8(8(8(8(8(8(8(8(8(8(8(8(8}(8v(8o(8h(8a(8Z(8S(8L(8E(8>(87(80(8)(8"(8(8(8 (8(8'8'8'8'8'8'8'8'8'8'8'8'8'8'8'8'8'8'8'8z'8s'8l'8e'8^'8W'8P'8I'8B'8;'84'8-'8&'8'8'8'8 '8'8&8&8&8&8&8&8&8&8&8&8&8&8&8&8&8&8&8&8~&8w&8p&8i&8b&8[&8T&8M&8F&8?&88&81&8*&8#&8&8&8&8&8&8%8%8%8%8%8%8%8%8%8%8%8%8%8%8%8%8%8%8{%8t%8m%8f%8_%8X%8Q%8J%8C%8<%85%8.%8'%8 %8%8%8 %8%8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8x$8q$8j$8c$8\$8U$8N$8G$8@$89$82$8+$8$$8$8$8$8$8$8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8|#8u#8n#8g#8`#8Y#8R#8K#8D#8=#86#8/#8(#8!#8#8#8 #8#8"8"8"8"8"8"8"8"8"8"8"8"8"8"8"8"8"8"8"8y"8r"8k"8d"8]"8V"8O"8H"8A"8:"83"8,"8%"8"8"8"8 "8"8!8!8!8!8!8!8!8!8!8!8!8!8!8!8!8!8!8!8}!8v!8o!8h!8a!8Z!8S!8L!8E!8>!87!80!8)!8"!8!8!8 !8!8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8z 8s 8l 8e 8^ 8W 8P 8I 8B 8; 84 8- 8& 8 8 8 8 8 8888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 88 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8y 8r 8k 8d 8] 8V 8O 8H 8A 8: 83 8, 8% 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8} 8v 8o 8h 8a 8Z 8S 8L 8E 8> 87 80 8) 8" 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8z 8s 8l 8e 8^ 8W 8P 8I 8B 8; 84 8- 8& 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8~ 8w 8p 8i 8b 8[ 8T 8M 8F 8? 88 81 8* 8# 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8{ 8t 8m 8f 8_ 8X 8Q 8J 8C 8< 85 8. 8' 8 8 8 8 8 88888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 888888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 888888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 888888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777߿7ؿ7ѿ7ʿ7ÿ7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 7777777ܾ7վ7ξ7Ǿ77777777777z7s7l7e7^7W7P7I7B7;747-7&7777 7777777ٽ7ҽ7˽7Ľ7777777777~7w7p7i7b7[7T7M7F7?78717*7#7777777777ݼ7ּ7ϼ7ȼ77777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 7777777ڻ7ӻ7̻7Ż77777777777x7q7j7c7\7U7N7G7@79727+7$7777777777޺7׺7к7ɺ7º7777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 7777777۹7Թ7͹7ƹ77777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777߸7ظ7Ѹ7ʸ7ø7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 7777777ܷ7շ7η7Ƿ77777777777z7s7l7e7^7W7P7I7B7;747-7&7777 7777777ٶ7Ҷ7˶7Ķ7777777777~7w7p7i7b7[7T7M7F7?78717*7#7777777777ݵ7ֵ7ϵ7ȵ77777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 7777777ڴ7Ӵ7̴7Ŵ77777777777x7q7j7c7\7U7N7G7@79727+7$7777777777޳7׳7г7ɳ7³7777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 7777777۲7Բ7Ͳ7Ʋ77777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777߱7ر7ѱ7ʱ7ñ7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 7777777ܰ7հ7ΰ7ǰ77777777777z7s7l7e7^7W7P7I7B7;747-7&7777 7777777ٯ7ү7˯7į7777777777~7w7p7i7b7[7T7M7F7?78717*7#7777777777ݮ7֮7Ϯ7Ȯ77777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 7777777ڭ7ӭ7̭7ŭ77777777777x7q7j7c7\7U7N7G7@79727+7$7777777777ެ7׬7Ь7ɬ7¬7777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 7777777۫7ԫ7ͫ7ƫ77777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777ߪ7ت7Ѫ7ʪ7ê7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 7777777ܩ7թ7Ω7ǩ77777777777z7s7l7e7^7W7P7I7B7;747-7&7777 7777777٨7Ҩ7˨7Ĩ7777777777~7w7p7i7b7[7T7M7F7?78717*7#7777777777ݧ7֧7ϧ7ȧ77777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 7777777ڦ7Ӧ7̦7Ŧ77777777777x7q7j7c7\7U7N7G7@79727+7$7777777777ޥ7ץ7Х7ɥ7¥7777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 7777777ۤ7Ԥ7ͤ7Ƥ77777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777ߣ7أ7ѣ7ʣ7ã7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 7777777ܢ7բ7΢7Ǣ77777777777z7s7l7e7^7W7P7I7B7;747-7&7777 7777777١7ҡ7ˡ7ġ7777777777~7w7p7i7b7[7T7M7F7?78717*7#7777777777ݠ7֠7Ϡ7Ƞ77777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 7777777ڟ7ӟ7̟7ş77777777777x7q7j7c7\7U7N7G7@79727+7$7777777777ޞ7מ7О7ɞ7ž7777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 7777777۝7ԝ7͝7Ɲ77777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777ߜ7؜7ќ7ʜ7Ü7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 7777777ܛ7՛7Λ7Ǜ77777777777z7s7l7e7^7W7P7I7B7;747-7&7777 7777777ٚ7Қ7˚7Ě7777777777~7w7p7i7b7[7T7M7F7?78717*7#7777777777ݙ7֙7ϙ7ș77777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 7777777ژ7Ә7̘7Ř77777777777x7q7j7c7\7U7N7G7@79727+7$7777777777ޗ7ח7З7ɗ7—7777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 7777777ۖ7Ԗ7͖7Ɩ77777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777ߕ7ؕ7ѕ7ʕ7Õ7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 7777777ܔ7Ք7Δ7ǔ77777777777z7s7l7e7^7W7P7I7B7;747-7&7777 7777777ٓ7ғ7˓7ē7777777777~7w7p7i7b7[7T7M7F7?78717*7#7777777777ݒ7֒7ϒ7Ȓ77777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 7777777ڑ7ӑ7̑7ő77777777777x7q7j7c7\7U7N7G7@79727+7$7777777777ސ7א7А7ɐ77777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 7777777ۏ7ԏ7͏7Ə77777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777ߎ7؎7ю7ʎ7Î7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 7777777܍7Ս7΍7Ǎ77777777777z7s7l7e7^7W7P7I7B7;747-7&7777 7777777ٌ7Ҍ7ˌ7Č7777777777~7w7p7i7b7[7T7M7F7?78717*7#7777777777݋7֋7ϋ7ȋ77777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 7777777ڊ7ӊ7̊7Ŋ77777777777x7q7j7c7\7U7N7G7@79727+7$7777777777މ7׉7Љ7ɉ7‰7777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 7777777ۈ7Ԉ7͈7ƈ77777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777߇7؇7ч7ʇ7Ç7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 7777777܆7Ն7Ά7dž77777777777z7s7l7e7^7W7P7I7B7;747-7&7777 7777777م7҅7˅7ą7777777777~7w7p7i7b7[7T7M7F7?78717*7#7777777777݄7ք7τ7Ȅ77777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 7777777ڃ7Ӄ7̃7Ń77777777777x7q7j7c7\7U7N7G7@79727+7$7777777777ނ7ׂ7Ђ7ɂ7‚7777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 7777777ہ7ԁ7́7Ɓ77777777777y7r7k7d7]7V7O7H7A7:737,7%7777 777777߀7؀7р7ʀ7À7777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77~7~7~7~7~7~7~7~7~7~7~7~7~7~7~7~7~7~7~~7w~7p~7i~7b~7[~7T~7M~7F~7?~78~71~7*~7#~7~7~7~7~7~7}7}7}7}7}7}7}7}7}7}7}7}7}7}7}7}7}7}7{}7t}7m}7f}7_}7X}7Q}7J}7C}7<}75}7.}7'}7 }7}7}7 }7}7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7x|7q|7j|7c|7\|7U|7N|7G|7@|79|72|7+|7$|7|7|7|7|7|7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7|{7u{7n{7g{7`{7Y{7R{7K{7D{7={76{7/{7({7!{7{7{7 {7{7z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7z7yz7rz7kz7dz7]z7Vz7Oz7Hz7Az7:z73z7,z7%z7z7z7z7 z7z7y7y7y7y7y7y7y7y7y7y7y7y7y7y7y7y7y7y7}y7vy7oy7hy7ay7Zy7Sy7Ly7Ey7>y77y70y7)y7"y7y7y7 y7y7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7zx7sx7lx7ex7^x7Wx7Px7Ix7Bx7;x74x7-x7&x7x7x7x7 x7x7w7w7w7w7w7w7w7w7w7w7w7w7w7w7w7w7w7w7~w7ww7pw7iw7bw7[w7Tw7Mw7Fw7?w78w71w7*w7#w7w7w7w7w7w7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7{v7tv7mv7fv7_v7Xv7Qv7Jv7Cv7r77r70r7)r7"r7r7r7 r7r7q7q7q7q7q7q7q7q7q7q7q7q7q7q7q7q7q7q7q7zq7sq7lq7eq7^q7Wq7Pq7Iq7Bq7;q74q7-q7&q7q7q7q7 q7q7p7p7p7p7p7p7p7p7p7p7p7p7p7p7p7p7p7p7~p7wp7pp7ip7bp7[p7Tp7Mp7Fp7?p78p71p7*p7#p7p7p7p7p7p7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7{o7to7mo7fo7_o7Xo7Qo7Jo7Co7k77k70k7)k7"k7k7k7 k7k7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7j7zj7sj7lj7ej7^j7Wj7Pj7Ij7Bj7;j74j7-j7&j7j7j7j7 j7j7i7i7i7i7i7i7i7i7i7i7i7i7i7i7i7i7i7i7~i7wi7pi7ii7bi7[i7Ti7Mi7Fi7?i78i71i7*i7#i7i7i7i7i7i7h7h7h7h7h7h7h7h7h7h7h7h7h7h7h7h7h7h7{h7th7mh7fh7_h7Xh7Qh7Jh7Ch7d77d70d7)d7"d7d7d7 d7d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7zc7sc7lc7ec7^c7Wc7Pc7Ic7Bc7;c74c7-c7&c7c7c7c7 c7c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7~b7wb7pb7ib7bb7[b7Tb7Mb7Fb7?b78b71b7*b7#b7b7b7b7b7b7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7{a7ta7ma7fa7_a7Xa7Qa7Ja7Ca7]77]70]7)]7"]7]7]7 ]7]7\7\7\7\7\7\7\7\7\7\7\7\7\7\7\7\7\7\7\7z\7s\7l\7e\7^\7W\7P\7I\7B\7;\74\7-\7&\7\7\7\7 \7\7[7[7[7[7[7[7[7[7[7[7[7[7[7[7[7[7[7[7~[7w[7p[7i[7b[7[[7T[7M[7F[7?[78[71[7*[7#[7[7[7[7[7[7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7Z7{Z7tZ7mZ7fZ7_Z7XZ7QZ7JZ7CZ7V77V70V7)V7"V7V7V7 V7V7U7U7U7U7U7U7U7U7U7U7U7U7U7U7U7U7U7U7U7zU7sU7lU7eU7^U7WU7PU7IU7BU7;U74U7-U7&U7U7U7U7 U7U7T7T7T7T7T7T7T7T7T7T7T7T7T7T7T7T7T7T7~T7wT7pT7iT7bT7[T7TT7MT7FT7?T78T71T7*T7#T7T7T7T7T7T7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7{S7tS7mS7fS7_S7XS7QS7JS7CS7O77O70O7)O7"O7O7O7 O7O7N7N7N7N7N7N7N7N7N7N7N7N7N7N7N7N7N7N7N7zN7sN7lN7eN7^N7WN7PN7IN7BN7;N74N7-N7&N7N7N7N7 N7N7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7~M7wM7pM7iM7bM7[M7TM7MM7FM7?M78M71M7*M7#M7M7M7M7M7M7L7L7L7L7L7L7L7L7L7L7L7L7L7L7L7L7L7L7{L7tL7mL7fL7_L7XL7QL7JL7CL7H77H70H7)H7"H7H7H7 H7H7G7G7G7G7G7G7G7G7G7G7G7G7G7G7G7G7G7G7G7zG7sG7lG7eG7^G7WG7PG7IG7BG7;G74G7-G7&G7G7G7G7 G7G7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7~F7wF7pF7iF7bF7[F7TF7MF7FF7?F78F71F7*F7#F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7{E7tE7mE7fE7_E7XE7QE7JE7CE7A77A70A7)A7"A7A7A7 A7A7@7@7@7@7@7@7@7@7@7@7@7@7@7@7@7@7@7@7@7z@7s@7l@7e@7^@7W@7P@7I@7B@7;@74@7-@7&@7@7@7@7 @7@7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7~?7w?7p?7i?7b?7[?7T?7M?7F?7??78?71?7*?7#?7?7?7?7?7?7>7>7>7>7>7>7>7>7>7>7>7>7>7>7>7>7>7>7{>7t>7m>7f>7_>7X>7Q>7J>7C>7<>75>7.>7'>7 >7>7>7 >7>7=7=7=7=7=7=7=7=7=7=7=7=7=7=7=7=7=7=7=7x=7q=7j=7c=7\=7U=7N=7G=7@=79=72=7+=7$=7=7=7=7=7=7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7|<7u<7n<7g<7`<7Y<7R<7K<7D<7=<76<7/<7(<7!<7<7<7 <7<7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7;7y;7r;7k;7d;7];7V;7O;7H;7A;7:;73;7,;7%;7;7;7;7 ;7;7:7:7:7:7:7:7:7:7:7:7:7:7:7:7:7:7:7:7}:7v:7o:7h:7a:7Z:7S:7L:7E:7>:77:70:7):7":7:7:7 :7:797979797979797979797979797979797979797z97s97l97e97^97W97P97I97B97;97497-97&97979797 9797878787878787878787878787878787878787~87w87p87i87b87[87T87M87F87?87887187*87#878787878787777777777777777777777777777777777777{77t77m77f77_77X77Q77J77C77<77577.77'77 777777 777767676767676767676767676767676767676767x67q67j67c67\67U67N67G67@67967267+67$676767676767575757575757575757575757575757575757|57u57n57g57`57Y57R57K57D57=57657/57(57!575757 575747474747474747474747474747474747474747y47r47k47d47]47V47O47H47A47:47347,47%47474747 4747373737373737373737373737373737373737}37v37o37h37a37Z37S37L37E37>37737037)37"373737 373727272727272727272727272727272727272727z27s27l27e27^27W27P27I27B27;27427-27&27272727 2727171717171717171717171717171717171717~17w17p17i17b17[17T17M17F17?17817117*17#171717171717070707070707070707070707070707070707{07t07m07f07_07X07Q07J07C07<07507.07'07 070707 0707/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7/7x/7q/7j/7c/7\/7U/7N/7G/7@/79/72/7+/7$/7/7/7/7/7/7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7|.7u.7n.7g.7`.7Y.7R.7K.7D.7=.76.7/.7(.7!.7.7.7 .7.7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7y-7r-7k-7d-7]-7V-7O-7H-7A-7:-73-7,-7%-7-7-7-7 -7-7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7},7v,7o,7h,7a,7Z,7S,7L,7E,7>,77,70,7),7",7,7,7 ,7,7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7z+7s+7l+7e+7^+7W+7P+7I+7B+7;+74+7-+7&+7+7+7+7 +7+7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7~*7w*7p*7i*7b*7[*7T*7M*7F*7?*78*71*7**7#*7*7*7*7*7*7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7{)7t)7m)7f)7_)7X)7Q)7J)7C)7<)75)7.)7')7 )7)7)7 )7)7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7x(7q(7j(7c(7\(7U(7N(7G(7@(79(72(7+(7$(7(7(7(7(7(7'7'7'7'7'7'7'7'7'7'7'7'7'7'7'7'7'7'7|'7u'7n'7g'7`'7Y'7R'7K'7D'7='76'7/'7('7!'7'7'7 '7'7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7y&7r&7k&7d&7]&7V&7O&7H&7A&7:&73&7,&7%&7&7&7&7 &7&7%7%7%7%7%7%7%7%7%7%7%7%7%7%7%7%7%7%7}%7v%7o%7h%7a%7Z%7S%7L%7E%7>%77%70%7)%7"%7%7%7 %7%7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$7z$7s$7l$7e$7^$7W$7P$7I$7B$7;$74$7-$7&$7$7$7$7 $7$7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7~#7w#7p#7i#7b#7[#7T#7M#7F#7?#78#71#7*#7##7#7#7#7#7#7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7{"7t"7m"7f"7_"7X"7Q"7J"7C"7<"75"7."7'"7 "7"7"7 "7"7!7!7!7!7!7!7!7!7!7!7!7!7!7!7!7!7!7!7!7x!7q!7j!7c!7\!7U!7N!7G!7@!79!72!7+!7$!7!7!7!7!7!7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7| 7u 7n 7g 7` 7Y 7R 7K 7D 7= 76 7/ 7( 7! 7 7 7 7 77777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7{ 7t 7m 7f 7_ 7X 7Q 7J 7C 7< 75 7. 7' 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7x 7q 7j 7c 7\ 7U 7N 7G 7@ 79 72 7+ 7$ 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7| 7u 7n 7g 7` 7Y 7R 7K 7D 7= 76 7/ 7( 7! 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7y 7r 7k 7d 7] 7V 7O 7H 7A 7: 73 7, 7% 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7} 7v 7o 7h 7a 7Z 7S 7L 7E 7> 77 70 7) 7" 7 7 7 7 77777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 777777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 777777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 777777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڿ6ӿ6̿6ſ66666666666x6q6j6c6\6U6N6G6@69626+6$6666666666޾6׾6о6ɾ6¾6666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 6666666۽6Խ6ͽ6ƽ66666666666y6r6k6d6]6V6O6H6A6:636,6%6666 666666߼6ؼ6Ѽ6ʼ6ü6666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 6666666ܻ6ջ6λ6ǻ66666666666z6s6l6e6^6W6P6I6B6;646-6&6666 6666666ٺ6Һ6˺6ĺ6666666666~6w6p6i6b6[6T6M6F6?68616*6#6666666666ݹ6ֹ6Ϲ6ȹ66666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڸ6Ӹ6̸6Ÿ66666666666x6q6j6c6\6U6N6G6@69626+6$6666666666޷6׷6з6ɷ6·6666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 6666666۶6Զ6Ͷ6ƶ66666666666y6r6k6d6]6V6O6H6A6:636,6%6666 666666ߵ6ص6ѵ6ʵ6õ6666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 6666666ܴ6մ6δ6Ǵ66666666666z6s6l6e6^6W6P6I6B6;646-6&6666 6666666ٳ6ҳ6˳6ij6666666666~6w6p6i6b6[6T6M6F6?68616*6#6666666666ݲ6ֲ6ϲ6Ȳ66666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڱ6ӱ6̱6ű66666666666x6q6j6c6\6U6N6G6@69626+6$6666666666ް6װ6а6ɰ6°6666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 6666666ۯ6ԯ6ͯ6Ư66666666666y6r6k6d6]6V6O6H6A6:636,6%6666 666666߮6خ6Ѯ6ʮ6î6666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 6666666ܭ6խ6έ6ǭ66666666666z6s6l6e6^6W6P6I6B6;646-6&6666 6666666٬6Ҭ6ˬ6Ĭ6666666666~6w6p6i6b6[6T6M6F6?68616*6#6666666666ݫ6֫6ϫ6ȫ66666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڪ6Ӫ6̪6Ū66666666666x6q6j6c6\6U6N6G6@69626+6$6666666666ީ6ש6Щ6ɩ6©6666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 6666666ۨ6Ԩ6ͨ6ƨ66666666666y6r6k6d6]6V6O6H6A6:636,6%6666 666666ߧ6ا6ѧ6ʧ6ç6666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 6666666ܦ6զ6Φ6Ǧ66666666666z6s6l6e6^6W6P6I6B6;646-6&6666 6666666٥6ҥ6˥6ĥ6666666666~6w6p6i6b6[6T6M6F6?68616*6#6666666666ݤ6֤6Ϥ6Ȥ66666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڣ6ӣ6̣6ţ66666666666x6q6j6c6\6U6N6G6@69626+6$6666666666ޢ6ע6Т6ɢ6¢6666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 6666666ۡ6ԡ6͡6ơ66666666666y6r6k6d6]6V6O6H6A6:636,6%6666 666666ߠ6ؠ6Ѡ6ʠ6à6666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 6666666ܟ6՟6Ο6ǟ66666666666z6s6l6e6^6W6P6I6B6;646-6&6666 6666666ٞ6Ҟ6˞6Ğ6666666666~6w6p6i6b6[6T6M6F6?68616*6#6666666666ݝ6֝6ϝ6ȝ66666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڜ6Ӝ6̜6Ŝ66666666666x6q6j6c6\6U6N6G6@69626+6$6666666666ޛ6כ6Л6ɛ6›6666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 6666666ۚ6Ԛ6͚6ƚ66666666666y6r6k6d6]6V6O6H6A6:636,6%6666 666666ߙ6ؙ6љ6ʙ6Ù6666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 6666666ܘ6՘6Θ6ǘ66666666666z6s6l6e6^6W6P6I6B6;646-6&6666 6666666ٗ6җ6˗6ė6666666666~6w6p6i6b6[6T6M6F6?68616*6#6666666666ݖ6֖6ϖ6Ȗ66666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڕ6ӕ6̕6ŕ66666666666x6q6j6c6\6U6N6G6@69626+6$6666666666ޔ6ה6Д6ɔ6”6666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 6666666ۓ6ԓ6͓6Ɠ66666666666y6r6k6d6]6V6O6H6A6:636,6%6666 666666ߒ6ؒ6ђ6ʒ6Ò6666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 6666666ܑ6Ց6Α6Ǒ66666666666z6s6l6e6^6W6P6I6B6;646-6&6666 6666666ِ6Ґ6ː6Đ6666666666~6w6p6i6b6[6T6M6F6?68616*6#6666666666ݏ6֏6Ϗ6ȏ66666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڎ6ӎ6̎6Ŏ66666666666x6q6j6c6\6U6N6G6@69626+6$6666666666ލ6׍6Ѝ6ɍ66666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 6666666ی6Ԍ6͌6ƌ66666666666y6r6k6d6]6V6O6H6A6:636,6%6666 666666ߋ6؋6ы6ʋ6Ë6666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 6666666܊6Պ6Ί6NJ66666666666z6s6l6e6^6W6P6I6B6;646-6&6666 6666666ى6҉6ˉ6ĉ6666666666~6w6p6i6b6[6T6M6F6?68616*6#6666666666݈6ֈ6ψ6Ȉ66666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڇ6Ӈ6̇6Ň66666666666x6q6j6c6\6U6N6G6@69626+6$6666666666ކ6׆6І6Ɇ6†6666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 6666666ۅ6ԅ6ͅ6ƅ66666666666y6r6k6d6]6V6O6H6A6:636,6%6666 666666߄6؄6ф6ʄ6Ä6666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 6666666܃6Ճ6΃6ǃ66666666666z6s6l6e6^6W6P6I6B6;646-6&6666 6666666ق6҂6˂6Ă6666666666~6w6p6i6b6[6T6M6F6?68616*6#6666666666݁6ց6ρ6ȁ66666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 6666666ڀ6Ӏ6̀6ŀ66666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 66~6~6~6~6~6~6~6~6~6~6~6~6~6~6~6~6~6~6~6y~6r~6k~6d~6]~6V~6O~6H~6A~6:~63~6,~6%~6~6~6~6 ~6~6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}6}}6v}6o}6h}6a}6Z}6S}6L}6E}6>}67}60}6)}6"}6}6}6 }6}6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6|6z|6s|6l|6e|6^|6W|6P|6I|6B|6;|64|6-|6&|6|6|6|6 |6|6{6{6{6{6{6{6{6{6{6{6{6{6{6{6{6{6{6{6~{6w{6p{6i{6b{6[{6T{6M{6F{6?{68{61{6*{6#{6{6{6{6{6{6z6z6z6z6z6z6z6z6z6z6z6z6z6z6z6z6z6z6{z6tz6mz6fz6_z6Xz6Qz6Jz6Cz6v67v60v6)v6"v6v6v6 v6v6u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6u6zu6su6lu6eu6^u6Wu6Pu6Iu6Bu6;u64u6-u6&u6u6u6u6 u6u6t6t6t6t6t6t6t6t6t6t6t6t6t6t6t6t6t6t6~t6wt6pt6it6bt6[t6Tt6Mt6Ft6?t68t61t6*t6#t6t6t6t6t6t6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6s6{s6ts6ms6fs6_s6Xs6Qs6Js6Cs6o67o60o6)o6"o6o6o6 o6o6n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6n6zn6sn6ln6en6^n6Wn6Pn6In6Bn6;n64n6-n6&n6n6n6n6 n6n6m6m6m6m6m6m6m6m6m6m6m6m6m6m6m6m6m6m6~m6wm6pm6im6bm6[m6Tm6Mm6Fm6?m68m61m6*m6#m6m6m6m6m6m6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6{l6tl6ml6fl6_l6Xl6Ql6Jl6Cl6h67h60h6)h6"h6h6h6 h6h6g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6g6zg6sg6lg6eg6^g6Wg6Pg6Ig6Bg6;g64g6-g6&g6g6g6g6 g6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6~f6wf6pf6if6bf6[f6Tf6Mf6Ff6?f68f61f6*f6#f6f6f6f6f6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6{e6te6me6fe6_e6Xe6Qe6Je6Ce6a67a60a6)a6"a6a6a6 a6a6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6z`6s`6l`6e`6^`6W`6P`6I`6B`6;`64`6-`6&`6`6`6`6 `6`6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6~_6w_6p_6i_6b_6[_6T_6M_6F_6?_68_61_6*_6#_6_6_6_6_6_6^6^6^6^6^6^6^6^6^6^6^6^6^6^6^6^6^6^6{^6t^6m^6f^6_^6X^6Q^6J^6C^6<^65^6.^6'^6 ^6^6^6 ^6^6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6]6x]6q]6j]6c]6\]6U]6N]6G]6@]69]62]6+]6$]6]6]6]6]6]6\6\6\6\6\6\6\6\6\6\6\6\6\6\6\6\6\6\6|\6u\6n\6g\6`\6Y\6R\6K\6D\6=\66\6/\6(\6!\6\6\6 \6\6[6[6[6[6[6[6[6[6[6[6[6[6[6[6[6[6[6[6[6y[6r[6k[6d[6][6V[6O[6H[6A[6:[63[6,[6%[6[6[6[6 [6[6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6Z6}Z6vZ6oZ6hZ6aZ6ZZ6SZ6LZ6EZ6>Z67Z60Z6)Z6"Z6Z6Z6 Z6Z6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6Y6zY6sY6lY6eY6^Y6WY6PY6IY6BY6;Y64Y6-Y6&Y6Y6Y6Y6 Y6Y6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6~X6wX6pX6iX6bX6[X6TX6MX6FX6?X68X61X6*X6#X6X6X6X6X6X6W6W6W6W6W6W6W6W6W6W6W6W6W6W6W6W6W6W6{W6tW6mW6fW6_W6XW6QW6JW6CW6S67S60S6)S6"S6S6S6 S6S6R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6R6zR6sR6lR6eR6^R6WR6PR6IR6BR6;R64R6-R6&R6R6R6R6 R6R6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6Q6~Q6wQ6pQ6iQ6bQ6[Q6TQ6MQ6FQ6?Q68Q61Q6*Q6#Q6Q6Q6Q6Q6Q6P6P6P6P6P6P6P6P6P6P6P6P6P6P6P6P6P6P6{P6tP6mP6fP6_P6XP6QP6JP6CP6L67L60L6)L6"L6L6L6 L6L6K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6K6zK6sK6lK6eK6^K6WK6PK6IK6BK6;K64K6-K6&K6K6K6K6 K6K6J6J6J6J6J6J6J6J6J6J6J6J6J6J6J6J6J6J6~J6wJ6pJ6iJ6bJ6[J6TJ6MJ6FJ6?J68J61J6*J6#J6J6J6J6J6J6I6I6I6I6I6I6I6I6I6I6I6I6I6I6I6I6I6I6{I6tI6mI6fI6_I6XI6QI6JI6CI6E67E60E6)E6"E6E6E6 E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6zD6sD6lD6eD6^D6WD6PD6ID6BD6;D64D6-D6&D6D6D6D6 D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6~C6wC6pC6iC6bC6[C6TC6MC6FC6?C68C61C6*C6#C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6{B6tB6mB6fB6_B6XB6QB6JB6CB66>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6}>6v>6o>6h>6a>6Z>6S>6L>6E>6>>67>60>6)>6">6>6>6 >6>6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6=6z=6s=6l=6e=6^=6W=6P=6I=6B=6;=64=6-=6&=6=6=6=6 =6=6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6~<6w<6p<6i<6b<6[<6T<6M<6F<6?<68<61<6*<6#<6<6<6<6<6<6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6{;6t;6m;6f;6_;6X;6Q;6J;6C;6<;65;6.;6';6 ;6;6;6 ;6;6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6:6x:6q:6j:6c:6\:6U:6N:6G:6@:69:62:6+:6$:6:6:6:6:6:6969696969696969696969696969696969696|96u96n96g96`96Y96R96K96D96=96696/96(96!969696 969686868686868686868686868686868686868686y86r86k86d86]86V86O86H86A86:86386,86%86868686 8686767676767676767676767676767676767676}76v76o76h76a76Z76S76L76E76>76776076)76"767676 767666666666666666666666666666666666666666z66s66l66e66^66W66P66I66B66;66466-66&66666666 6666565656565656565656565656565656565656~56w56p56i56b56[56T56M56F56?56856156*56#565656565656464646464646464646464646464646464646{46t46m46f46_46X46Q46J46C46<46546.46'46 464646 464636363636363636363636363636363636363636x36q36j36c36\36U36N36G36@36936236+36$363636363636262626262626262626262626262626262626|26u26n26g26`26Y26R26K26D26=26626/26(26!262626 262616161616161616161616161616161616161616y16r16k16d16]16V16O16H16A16:16316,16%16161616 1616060606060606060606060606060606060606}06v06o06h06a06Z06S06L06E06>06706006)06"060606 0606/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6z/6s/6l/6e/6^/6W/6P/6I/6B/6;/64/6-/6&/6/6/6/6 /6/6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6~.6w.6p.6i.6b.6[.6T.6M.6F.6?.68.61.6*.6#.6.6.6.6.6.6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6{-6t-6m-6f-6_-6X-6Q-6J-6C-6<-65-6.-6'-6 -6-6-6 -6-6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6x,6q,6j,6c,6\,6U,6N,6G,6@,69,62,6+,6$,6,6,6,6,6,6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6|+6u+6n+6g+6`+6Y+6R+6K+6D+6=+66+6/+6(+6!+6+6+6 +6+6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6y*6r*6k*6d*6]*6V*6O*6H*6A*6:*63*6,*6%*6*6*6*6 *6*6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6})6v)6o)6h)6a)6Z)6S)6L)6E)6>)67)60)6))6")6)6)6 )6)6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6z(6s(6l(6e(6^(6W(6P(6I(6B(6;(64(6-(6&(6(6(6(6 (6(6'6'6'6'6'6'6'6'6'6'6'6'6'6'6'6'6'6'6~'6w'6p'6i'6b'6['6T'6M'6F'6?'68'61'6*'6#'6'6'6'6'6'6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6{&6t&6m&6f&6_&6X&6Q&6J&6C&6<&65&6.&6'&6 &6&6&6 &6&6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6x%6q%6j%6c%6\%6U%6N%6G%6@%69%62%6+%6$%6%6%6%6%6%6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6|$6u$6n$6g$6`$6Y$6R$6K$6D$6=$66$6/$6($6!$6$6$6 $6$6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6y#6r#6k#6d#6]#6V#6O#6H#6A#6:#63#6,#6%#6#6#6#6 #6#6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6}"6v"6o"6h"6a"6Z"6S"6L"6E"6>"67"60"6)"6""6"6"6 "6"6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6z!6s!6l!6e!6^!6W!6P!6I!6B!6;!64!6-!6&!6!6!6!6 !6!6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6~ 6w 6p 6i 6b 6[ 6T 6M 6F 6? 68 61 6* 6# 6 6 6 6 6 6666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6} 6v 6o 6h 6a 6Z 6S 6L 6E 6> 67 60 6) 6" 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6z 6s 6l 6e 6^ 6W 6P 6I 6B 6; 64 6- 6& 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6~ 6w 6p 6i 6b 6[ 6T 6M 6F 6? 68 61 6* 6# 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6{ 6t 6m 6f 6_ 6X 6Q 6J 6C 6< 65 6. 6' 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6x 6q 6j 6c 6\ 6U 6N 6G 6@ 69 62 6+ 6$ 6 6 6 6 6 6666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 666666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 666666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 666666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555ܿ5տ5ο5ǿ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 5555555پ5Ҿ5˾5ľ5555555555~5w5p5i5b5[5T5M5F5?58515*5#5555555555ݽ5ֽ5Ͻ5Ƚ55555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 5555555ڼ5Ӽ5̼5ż55555555555x5q5j5c5\5U5N5G5@59525+5$5555555555޻5׻5л5ɻ5»5555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 5555555ۺ5Ժ5ͺ5ƺ55555555555y5r5k5d5]5V5O5H5A5:535,5%5555 555555߹5ع5ѹ5ʹ5ù5555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555ܸ5ո5θ5Ǹ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 5555555ٷ5ҷ5˷5ķ5555555555~5w5p5i5b5[5T5M5F5?58515*5#5555555555ݶ5ֶ5϶5ȶ55555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 5555555ڵ5ӵ5̵5ŵ55555555555x5q5j5c5\5U5N5G5@59525+5$5555555555޴5״5д5ɴ5´5555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 5555555۳5Գ5ͳ5Ƴ55555555555y5r5k5d5]5V5O5H5A5:535,5%5555 555555߲5ز5Ѳ5ʲ5ò5555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555ܱ5ձ5α5DZ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 5555555ٰ5Ұ5˰5İ5555555555~5w5p5i5b5[5T5M5F5?58515*5#5555555555ݯ5֯5ϯ5ȯ55555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 5555555ڮ5Ӯ5̮5Ů55555555555x5q5j5c5\5U5N5G5@59525+5$5555555555ޭ5׭5Э5ɭ5­5555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 5555555۬5Ԭ5ͬ5Ƭ55555555555y5r5k5d5]5V5O5H5A5:535,5%5555 555555߫5ث5ѫ5ʫ5ë5555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555ܪ5ժ5Ϊ5Ǫ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 5555555٩5ҩ5˩5ĩ5555555555~5w5p5i5b5[5T5M5F5?58515*5#5555555555ݨ5֨5Ϩ5Ȩ55555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 5555555ڧ5ӧ5̧5ŧ55555555555x5q5j5c5\5U5N5G5@59525+5$5555555555ަ5צ5Ц5ɦ5¦5555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 5555555ۥ5ԥ5ͥ5ƥ55555555555y5r5k5d5]5V5O5H5A5:535,5%5555 555555ߤ5ؤ5Ѥ5ʤ5ä5555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555ܣ5գ5Σ5ǣ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 5555555٢5Ң5ˢ5Ģ5555555555~5w5p5i5b5[5T5M5F5?58515*5#5555555555ݡ5֡5ϡ5ȡ55555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 5555555ڠ5Ӡ5̠5Š55555555555x5q5j5c5\5U5N5G5@59525+5$5555555555ޟ5ן5П5ɟ5Ÿ5555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 5555555۞5Ԟ5͞5ƞ55555555555y5r5k5d5]5V5O5H5A5:535,5%5555 555555ߝ5؝5ѝ5ʝ5Ý5555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555ܜ5՜5Μ5ǜ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 5555555ٛ5қ5˛5ě5555555555~5w5p5i5b5[5T5M5F5?58515*5#5555555555ݚ5֚5Ϛ5Ț55555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 5555555ڙ5ә5̙5ř55555555555x5q5j5c5\5U5N5G5@59525+5$5555555555ޘ5ט5И5ɘ5˜5555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 5555555ۗ5ԗ5͗5Ɨ55555555555y5r5k5d5]5V5O5H5A5:535,5%5555 555555ߖ5ؖ5і5ʖ5Ö5555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555ܕ5Օ5Ε5Ǖ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 5555555ٔ5Ҕ5˔5Ĕ5555555555~5w5p5i5b5[5T5M5F5?58515*5#5555555555ݓ5֓5ϓ5ȓ55555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 5555555ڒ5Ӓ5̒5Œ55555555555x5q5j5c5\5U5N5G5@59525+5$5555555555ޑ5ב5Б5ɑ5‘5555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 5555555ې5Ԑ5͐5Ɛ55555555555y5r5k5d5]5V5O5H5A5:535,5%5555 555555ߏ5؏5я5ʏ5Ï5555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555܎5Վ5Ύ5ǎ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 5555555ٍ5ҍ5ˍ5č5555555555~5w5p5i5b5[5T5M5F5?58515*5#5555555555݌5֌5ό5Ȍ55555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 5555555ڋ5Ӌ5̋5ŋ55555555555x5q5j5c5\5U5N5G5@59525+5$5555555555ފ5׊5Њ5Ɋ5Š5555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 5555555ۉ5ԉ5͉5Ɖ55555555555y5r5k5d5]5V5O5H5A5:535,5%5555 555555߈5؈5ш5ʈ5È5555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555܇5Շ5·5LJ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 5555555ن5҆5ˆ5Ć5555555555~5w5p5i5b5[5T5M5F5?58515*5#5555555555݅5օ5υ5ȅ55555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 5555555ڄ5ӄ5̄5ń55555555555x5q5j5c5\5U5N5G5@59525+5$5555555555ރ5׃5Ѓ5Ƀ5ƒ5555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 5555555ۂ5Ԃ5͂5Ƃ55555555555y5r5k5d5]5V5O5H5A5:535,5%5555 555555߁5؁5с5ʁ5Á5555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 5555555܀5Հ5΀5ǀ55555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555~5~5~5~5~5~5~5~5~5~5~5~5~5~5~5~5~5~5{~5t~5m~5f~5_~5X~5Q~5J~5C~5<~55~5.~5'~5 ~5~5~5 ~5~5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5x}5q}5j}5c}5\}5U}5N}5G}5@}59}52}5+}5$}5}5}5}5}5}5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5||5u|5n|5g|5`|5Y|5R|5K|5D|5=|56|5/|5(|5!|5|5|5 |5|5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5{5y{5r{5k{5d{5]{5V{5O{5H{5A{5:{53{5,{5%{5{5{5{5 {5{5z5z5z5z5z5z5z5z5z5z5z5z5z5z5z5z5z5z5}z5vz5oz5hz5az5Zz5Sz5Lz5Ez5>z57z50z5)z5"z5z5z5 z5z5y5y5y5y5y5y5y5y5y5y5y5y5y5y5y5y5y5y5y5zy5sy5ly5ey5^y5Wy5Py5Iy5By5;y54y5-y5&y5y5y5y5 y5y5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5~x5wx5px5ix5bx5[x5Tx5Mx5Fx5?x58x51x5*x5#x5x5x5x5x5x5w5w5w5w5w5w5w5w5w5w5w5w5w5w5w5w5w5w5{w5tw5mw5fw5_w5Xw5Qw5Jw5Cw5s57s50s5)s5"s5s5s5 s5s5r5r5r5r5r5r5r5r5r5r5r5r5r5r5r5r5r5r5r5zr5sr5lr5er5^r5Wr5Pr5Ir5Br5;r54r5-r5&r5r5r5r5 r5r5q5q5q5q5q5q5q5q5q5q5q5q5q5q5q5q5q5q5~q5wq5pq5iq5bq5[q5Tq5Mq5Fq5?q58q51q5*q5#q5q5q5q5q5q5p5p5p5p5p5p5p5p5p5p5p5p5p5p5p5p5p5p5{p5tp5mp5fp5_p5Xp5Qp5Jp5Cp5l57l50l5)l5"l5l5l5 l5l5k5k5k5k5k5k5k5k5k5k5k5k5k5k5k5k5k5k5k5zk5sk5lk5ek5^k5Wk5Pk5Ik5Bk5;k54k5-k5&k5k5k5k5 k5k5j5j5j5j5j5j5j5j5j5j5j5j5j5j5j5j5j5j5~j5wj5pj5ij5bj5[j5Tj5Mj5Fj5?j58j51j5*j5#j5j5j5j5j5j5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5{i5ti5mi5fi5_i5Xi5Qi5Ji5Ci5e57e50e5)e5"e5e5e5 e5e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5zd5sd5ld5ed5^d5Wd5Pd5Id5Bd5;d54d5-d5&d5d5d5d5 d5d5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5~c5wc5pc5ic5bc5[c5Tc5Mc5Fc5?c58c51c5*c5#c5c5c5c5c5c5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5{b5tb5mb5fb5_b5Xb5Qb5Jb5Cb5^57^50^5)^5"^5^5^5 ^5^5]5]5]5]5]5]5]5]5]5]5]5]5]5]5]5]5]5]5]5z]5s]5l]5e]5^]5W]5P]5I]5B]5;]54]5-]5&]5]5]5]5 ]5]5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5\5~\5w\5p\5i\5b\5[\5T\5M\5F\5?\58\51\5*\5#\5\5\5\5\5\5[5[5[5[5[5[5[5[5[5[5[5[5[5[5[5[5[5[5{[5t[5m[5f[5_[5X[5Q[5J[5C[5<[55[5.[5'[5 [5[5[5 [5[5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5Z5xZ5qZ5jZ5cZ5\Z5UZ5NZ5GZ5@Z59Z52Z5+Z5$Z5Z5Z5Z5Z5Z5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5|Y5uY5nY5gY5`Y5YY5RY5KY5DY5=Y56Y5/Y5(Y5!Y5Y5Y5 Y5Y5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5yX5rX5kX5dX5]X5VX5OX5HX5AX5:X53X5,X5%X5X5X5X5 X5X5W5W5W5W5W5W5W5W5W5W5W5W5W5W5W5W5W5W5}W5vW5oW5hW5aW5ZW5SW5LW5EW5>W57W50W5)W5"W5W5W5 W5W5V5V5V5V5V5V5V5V5V5V5V5V5V5V5V5V5V5V5V5zV5sV5lV5eV5^V5WV5PV5IV5BV5;V54V5-V5&V5V5V5V5 V5V5U5U5U5U5U5U5U5U5U5U5U5U5U5U5U5U5U5U5~U5wU5pU5iU5bU5[U5TU5MU5FU5?U58U51U5*U5#U5U5U5U5U5U5T5T5T5T5T5T5T5T5T5T5T5T5T5T5T5T5T5T5{T5tT5mT5fT5_T5XT5QT5JT5CT5P57P50P5)P5"P5P5P5 P5P5O5O5O5O5O5O5O5O5O5O5O5O5O5O5O5O5O5O5O5zO5sO5lO5eO5^O5WO5PO5IO5BO5;O54O5-O5&O5O5O5O5 O5O5N5N5N5N5N5N5N5N5N5N5N5N5N5N5N5N5N5N5~N5wN5pN5iN5bN5[N5TN5MN5FN5?N58N51N5*N5#N5N5N5N5N5N5M5M5M5M5M5M5M5M5M5M5M5M5M5M5M5M5M5M5{M5tM5mM5fM5_M5XM5QM5JM5CM5I57I50I5)I5"I5I5I5 I5I5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5zH5sH5lH5eH5^H5WH5PH5IH5BH5;H54H5-H5&H5H5H5H5 H5H5G5G5G5G5G5G5G5G5G5G5G5G5G5G5G5G5G5G5~G5wG5pG5iG5bG5[G5TG5MG5FG5?G58G51G5*G5#G5G5G5G5G5G5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5{F5tF5mF5fF5_F5XF5QF5JF5CF5B57B50B5)B5"B5B5B5 B5B5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5zA5sA5lA5eA5^A5WA5PA5IA5BA5;A54A5-A5&A5A5A5A5 A5A5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5~@5w@5p@5i@5b@5[@5T@5M@5F@5?@58@51@5*@5#@5@5@5@5@5@5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5{?5t?5m?5f?5_?5X?5Q?5J?5C?55>5>5>5>5>5>5>5>5>5>5>5>5>5>5>5>5>5>5x>5q>5j>5c>5\>5U>5N>5G>5@>59>52>5+>5$>5>5>5>5>5>5=5=5=5=5=5=5=5=5=5=5=5=5=5=5=5=5=5=5|=5u=5n=5g=5`=5Y=5R=5K=5D=5==56=5/=5(=5!=5=5=5 =5=5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5y<5r<5k<5d<5]<5V<5O<5H<5A<5:<53<5,<5%<5<5<5<5 <5<5;5;5;5;5;5;5;5;5;5;5;5;5;5;5;5;5;5;5};5v;5o;5h;5a;5Z;5S;5L;5E;5>;57;50;5);5";5;5;5 ;5;5:5:5:5:5:5:5:5:5:5:5:5:5:5:5:5:5:5:5:5z:5s:5l:5e:5^:5W:5P:5I:5B:5;:54:5-:5&:5:5:5:5 :5:5959595959595959595959595959595959595~95w95p95i95b95[95T95M95F95?95895195*95#959595959595858585858585858585858585858585858585{85t85m85f85_85X85Q85J85C85<85585.85'85 858585 858575757575757575757575757575757575757575x75q75j75c75\75U75N75G75@75975275+75$757575757575656565656565656565656565656565656565|65u65n65g65`65Y65R65K65D65=65665/65(65!656565 656555555555555555555555555555555555555555y55r55k55d55]55V55O55H55A55:55355,55%55555555 5555454545454545454545454545454545454545}45v45o45h45a45Z45S45L45E45>45745045)45"454545 454535353535353535353535353535353535353535z35s35l35e35^35W35P35I35B35;35435-35&35353535 3535252525252525252525252525252525252525~25w25p25i25b25[25T25M25F25?25825125*25#252525252525151515151515151515151515151515151515{15t15m15f15_15X15Q15J15C15<15515.15'15 151515 151505050505050505050505050505050505050505x05q05j05c05\05U05N05G05@05905205+05$050505050505/5/5/5/5/5/5/5/5/5/5/5/5/5/5/5/5/5/5|/5u/5n/5g/5`/5Y/5R/5K/5D/5=/56/5//5(/5!/5/5/5 /5/5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5y.5r.5k.5d.5].5V.5O.5H.5A.5:.53.5,.5%.5.5.5.5 .5.5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5}-5v-5o-5h-5a-5Z-5S-5L-5E-5>-57-50-5)-5"-5-5-5 -5-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5z,5s,5l,5e,5^,5W,5P,5I,5B,5;,54,5-,5&,5,5,5,5 ,5,5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5~+5w+5p+5i+5b+5[+5T+5M+5F+5?+58+51+5*+5#+5+5+5+5+5+5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5{*5t*5m*5f*5_*5X*5Q*5J*5C*5<*55*5.*5'*5 *5*5*5 *5*5)5)5)5)5)5)5)5)5)5)5)5)5)5)5)5)5)5)5)5x)5q)5j)5c)5\)5U)5N)5G)5@)59)52)5+)5$)5)5)5)5)5)5(5(5(5(5(5(5(5(5(5(5(5(5(5(5(5(5(5(5|(5u(5n(5g(5`(5Y(5R(5K(5D(5=(56(5/(5((5!(5(5(5 (5(5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5y'5r'5k'5d'5]'5V'5O'5H'5A'5:'53'5,'5%'5'5'5'5 '5'5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5}&5v&5o&5h&5a&5Z&5S&5L&5E&5>&57&50&5)&5"&5&5&5 &5&5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5z%5s%5l%5e%5^%5W%5P%5I%5B%5;%54%5-%5&%5%5%5%5 %5%5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5~$5w$5p$5i$5b$5[$5T$5M$5F$5?$58$51$5*$5#$5$5$5$5$5$5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5{#5t#5m#5f#5_#5X#5Q#5J#5C#5<#55#5.#5'#5 #5#5#5 #5#5"5"5"5"5"5"5"5"5"5"5"5"5"5"5"5"5"5"5"5x"5q"5j"5c"5\"5U"5N"5G"5@"59"52"5+"5$"5"5"5"5"5"5!5!5!5!5!5!5!5!5!5!5!5!5!5!5!5!5!5!5|!5u!5n!5g!5`!5Y!5R!5K!5D!5=!56!5/!5(!5!!5!5!5 !5!5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5y 5r 5k 5d 5] 5V 5O 5H 5A 5: 53 5, 5% 5 5 5 5 5 5555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 55 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5x 5q 5j 5c 5\ 5U 5N 5G 5@ 59 52 5+ 5$ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5| 5u 5n 5g 5` 5Y 5R 5K 5D 5= 56 5/ 5( 5! 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5y 5r 5k 5d 5] 5V 5O 5H 5A 5: 53 5, 5% 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5} 5v 5o 5h 5a 5Z 5S 5L 5E 5> 57 50 5) 5" 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5z 5s 5l 5e 5^ 5W 5P 5I 5B 5; 54 5- 5& 5 5 5 5 5 5555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 555555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 555555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 555555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$4444444444޿4׿4п4ɿ4¿4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 4444444۾4Ծ4;4ƾ44444444444y4r4k4d4]4V4O4H4A4:434,4%4444 444444߽4ؽ4ѽ4ʽ4ý4444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 4444444ܼ4ռ4μ4Ǽ44444444444z4s4l4e4^4W4P4I4B4;444-4&4444 4444444ٻ4һ4˻4Ļ4444444444~4w4p4i4b4[4T4M4F4?48414*4#4444444444ݺ4ֺ4Ϻ4Ⱥ44444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 4444444ڹ4ӹ4̹4Ź44444444444x4q4j4c4\4U4N4G4@49424+4$4444444444޸4׸4и4ɸ4¸4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 4444444۷4Է4ͷ4Ʒ44444444444y4r4k4d4]4V4O4H4A4:434,4%4444 444444߶4ض4Ѷ4ʶ4ö4444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 4444444ܵ4յ4ε4ǵ44444444444z4s4l4e4^4W4P4I4B4;444-4&4444 4444444ٴ4Ҵ4˴4Ĵ4444444444~4w4p4i4b4[4T4M4F4?48414*4#4444444444ݳ4ֳ4ϳ4ȳ44444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 4444444ڲ4Ӳ4̲4Ų44444444444x4q4j4c4\4U4N4G4@49424+4$4444444444ޱ4ױ4б4ɱ4±4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 4444444۰4԰4Ͱ4ư44444444444y4r4k4d4]4V4O4H4A4:434,4%4444 444444߯4د4ѯ4ʯ4ï4444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 4444444ܮ4ծ4ή4Ǯ44444444444z4s4l4e4^4W4P4I4B4;444-4&4444 4444444٭4ҭ4˭4ĭ4444444444~4w4p4i4b4[4T4M4F4?48414*4#4444444444ݬ4֬4Ϭ4Ȭ44444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 4444444ګ4ӫ4̫4ū44444444444x4q4j4c4\4U4N4G4@49424+4$4444444444ު4ת4Ъ4ɪ4ª4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 4444444۩4ԩ4ͩ4Ʃ44444444444y4r4k4d4]4V4O4H4A4:434,4%4444 444444ߨ4ب4Ѩ4ʨ4è4444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 4444444ܧ4է4Χ4ǧ44444444444z4s4l4e4^4W4P4I4B4;444-4&4444 4444444٦4Ҧ4˦4Ħ4444444444~4w4p4i4b4[4T4M4F4?48414*4#4444444444ݥ4֥4ϥ4ȥ44444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 4444444ڤ4Ӥ4̤4Ť44444444444x4q4j4c4\4U4N4G4@49424+4$4444444444ޣ4ף4У4ɣ4£4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 4444444ۢ4Ԣ4͢4Ƣ44444444444y4r4k4d4]4V4O4H4A4:434,4%4444 444444ߡ4ء4ѡ4ʡ4á4444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 4444444ܠ4ՠ4Π4Ǡ44444444444z4s4l4e4^4W4P4I4B4;444-4&4444 4444444ٟ4ҟ4˟4ğ4444444444~4w4p4i4b4[4T4M4F4?48414*4#4444444444ݞ4֞4Ϟ4Ȟ44444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 4444444ڝ4ӝ4̝4ŝ44444444444x4q4j4c4\4U4N4G4@49424+4$4444444444ޜ4ל4М4ɜ4œ4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 4444444ۛ4ԛ4͛4ƛ44444444444y4r4k4d4]4V4O4H4A4:434,4%4444 444444ߚ4ؚ4њ4ʚ4Ú4444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 4444444ܙ4ՙ4Ι4Ǚ44444444444z4s4l4e4^4W4P4I4B4;444-4&4444 4444444٘4Ҙ4˘4Ę4444444444~4w4p4i4b4[4T4M4F4?48414*4#4444444444ݗ4֗4ϗ4ȗ44444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 4444444ږ4Ӗ4̖4Ŗ44444444444x4q4j4c4\4U4N4G4@49424+4$4444444444ޕ4ו4Е4ɕ4•4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 4444444۔4Ԕ4͔4Ɣ44444444444y4r4k4d4]4V4O4H4A4:434,4%4444 444444ߓ4ؓ4ѓ4ʓ4Ó4444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 4444444ܒ4Ւ4Β4ǒ44444444444z4s4l4e4^4W4P4I4B4;444-4&4444 4444444ّ4ґ4ˑ4đ4444444444~4w4p4i4b4[4T4M4F4?48414*4#4444444444ݐ4֐4ϐ4Ȑ44444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 4444444ڏ4ӏ4̏4ŏ44444444444x4q4j4c4\4U4N4G4@49424+4$4444444444ގ4׎4Ў4Ɏ4Ž4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 4444444ۍ4ԍ4͍4ƍ44444444444y4r4k4d4]4V4O4H4A4:434,4%4444 444444ߌ4،4ь4ʌ4Ì4444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 4444444܋4Ջ4΋4Nj44444444444z4s4l4e4^4W4P4I4B4;444-4&4444 4444444ي4Ҋ4ˊ4Ċ4444444444~4w4p4i4b4[4T4M4F4?48414*4#4444444444݉4։4ω4ȉ44444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 4444444ڈ4ӈ4̈4ň44444444444x4q4j4c4\4U4N4G4@49424+4$4444444444އ4ׇ4Ї4ɇ4‡4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 4444444ۆ4Ԇ4͆4Ɔ44444444444y4r4k4d4]4V4O4H4A4:434,4%4444 444444߅4؅4х4ʅ4Å4444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 4444444܄4Մ4΄4DŽ44444444444z4s4l4e4^4W4P4I4B4;444-4&4444 4444444ك4҃4˃4ă4444444444~4w4p4i4b4[4T4M4F4?48414*4#4444444444݂4ւ4ς4Ȃ44444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 4444444ځ4Ӂ4́4Ł44444444444x4q4j4c4\4U4N4G4@49424+4$4444444444ހ4׀4Ѐ4ɀ4€4444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4}~4v~4o~4h~4a~4Z~4S~4L~4E~4>~47~40~4)~4"~4~4~4 ~4~4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4}4z}4s}4l}4e}4^}4W}4P}4I}4B}4;}44}4-}4&}4}4}4}4 }4}4|4|4|4|4|4|4|4|4|4|4|4|4|4|4|4|4|4|4~|4w|4p|4i|4b|4[|4T|4M|4F|4?|48|41|4*|4#|4|4|4|4|4|4{4{4{4{4{4{4{4{4{4{4{4{4{4{4{4{4{4{4{{4t{4m{4f{4_{4X{4Q{4J{4C{4<{45{4.{4'{4 {4{4{4 {4{4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4xz4qz4jz4cz4\z4Uz4Nz4Gz4@z49z42z4+z4$z4z4z4z4z4z4y4y4y4y4y4y4y4y4y4y4y4y4y4y4y4y4y4y4|y4uy4ny4gy4`y4Yy4Ry4Ky4Dy4=y46y4/y4(y4!y4y4y4 y4y4x4x4x4x4x4x4x4x4x4x4x4x4x4x4x4x4x4x4x4yx4rx4kx4dx4]x4Vx4Ox4Hx4Ax4:x43x4,x4%x4x4x4x4 x4x4w4w4w4w4w4w4w4w4w4w4w4w4w4w4w4w4w4w4}w4vw4ow4hw4aw4Zw4Sw4Lw4Ew4>w47w40w4)w4"w4w4w4 w4w4v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4v4zv4sv4lv4ev4^v4Wv4Pv4Iv4Bv4;v44v4-v4&v4v4v4v4 v4v4u4u4u4u4u4u4u4u4u4u4u4u4u4u4u4u4u4u4~u4wu4pu4iu4bu4[u4Tu4Mu4Fu4?u48u41u4*u4#u4u4u4u4u4u4t4t4t4t4t4t4t4t4t4t4t4t4t4t4t4t4t4t4{t4tt4mt4ft4_t4Xt4Qt4Jt4Ct4p47p40p4)p4"p4p4p4 p4p4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4zo4so4lo4eo4^o4Wo4Po4Io4Bo4;o44o4-o4&o4o4o4o4 o4o4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4~n4wn4pn4in4bn4[n4Tn4Mn4Fn4?n48n41n4*n4#n4n4n4n4n4n4m4m4m4m4m4m4m4m4m4m4m4m4m4m4m4m4m4m4{m4tm4mm4fm4_m4Xm4Qm4Jm4Cm4i47i40i4)i4"i4i4i4 i4i4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4zh4sh4lh4eh4^h4Wh4Ph4Ih4Bh4;h44h4-h4&h4h4h4h4 h4h4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4g4~g4wg4pg4ig4bg4[g4Tg4Mg4Fg4?g48g41g4*g4#g4g4g4g4g4g4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4{f4tf4mf4ff4_f4Xf4Qf4Jf4Cf4b47b40b4)b4"b4b4b4 b4b4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4za4sa4la4ea4^a4Wa4Pa4Ia4Ba4;a44a4-a4&a4a4a4a4 a4a4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4~`4w`4p`4i`4b`4[`4T`4M`4F`4?`48`41`4*`4#`4`4`4`4`4`4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4{_4t_4m_4f_4__4X_4Q_4J_4C_4<_45_4._4'_4 _4_4_4 _4_4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4^4x^4q^4j^4c^4\^4U^4N^4G^4@^49^42^4+^4$^4^4^4^4^4^4]4]4]4]4]4]4]4]4]4]4]4]4]4]4]4]4]4]4|]4u]4n]4g]4`]4Y]4R]4K]4D]4=]46]4/]4(]4!]4]4]4 ]4]4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4y\4r\4k\4d\4]\4V\4O\4H\4A\4:\43\4,\4%\4\4\4\4 \4\4[4[4[4[4[4[4[4[4[4[4[4[4[4[4[4[4[4[4}[4v[4o[4h[4a[4Z[4S[4L[4E[4>[47[40[4)[4"[4[4[4 [4[4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4zZ4sZ4lZ4eZ4^Z4WZ4PZ4IZ4BZ4;Z44Z4-Z4&Z4Z4Z4Z4 Z4Z4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4Y4~Y4wY4pY4iY4bY4[Y4TY4MY4FY4?Y48Y41Y4*Y4#Y4Y4Y4Y4Y4Y4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4{X4tX4mX4fX4_X4XX4QX4JX4CX4T47T40T4)T4"T4T4T4 T4T4S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4S4zS4sS4lS4eS4^S4WS4PS4IS4BS4;S44S4-S4&S4S4S4S4 S4S4R4R4R4R4R4R4R4R4R4R4R4R4R4R4R4R4R4R4~R4wR4pR4iR4bR4[R4TR4MR4FR4?R48R41R4*R4#R4R4R4R4R4R4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4Q4{Q4tQ4mQ4fQ4_Q4XQ4QQ4JQ4CQ4M47M40M4)M4"M4M4M4 M4M4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4zL4sL4lL4eL4^L4WL4PL4IL4BL4;L44L4-L4&L4L4L4L4 L4L4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4~K4wK4pK4iK4bK4[K4TK4MK4FK4?K48K41K4*K4#K4K4K4K4K4K4J4J4J4J4J4J4J4J4J4J4J4J4J4J4J4J4J4J4{J4tJ4mJ4fJ4_J4XJ4QJ4JJ4CJ4F47F40F4)F4"F4F4F4 F4F4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4zE4sE4lE4eE4^E4WE4PE4IE4BE4;E44E4-E4&E4E4E4E4 E4E4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4~D4wD4pD4iD4bD4[D4TD4MD4FD4?D48D41D4*D4#D4D4D4D4D4D4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4{C4tC4mC4fC4_C4XC4QC4JC4CC4?47?40?4)?4"?4?4?4 ?4?4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4>4z>4s>4l>4e>4^>4W>4P>4I>4B>4;>44>4->4&>4>4>4>4 >4>4=4=4=4=4=4=4=4=4=4=4=4=4=4=4=4=4=4=4~=4w=4p=4i=4b=4[=4T=4M=4F=4?=48=41=4*=4#=4=4=4=4=4=4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4{<4t<4m<4f<4_<4X<4Q<4J<4C<4<<45<4.<4'<4 <4<4<4 <4<4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4x;4q;4j;4c;4\;4U;4N;4G;4@;49;42;4+;4$;4;4;4;4;4;4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4|:4u:4n:4g:4`:4Y:4R:4K:4D:4=:46:4/:4(:4!:4:4:4 :4:494949494949494949494949494949494949494y94r94k94d94]94V94O94H94A94:94394,94%94949494 9494848484848484848484848484848484848484}84v84o84h84a84Z84S84L84E84>84784084)84"848484 848474747474747474747474747474747474747474z74s74l74e74^74W74P74I74B74;74474-74&74747474 7474646464646464646464646464646464646464~64w64p64i64b64[64T64M64F64?64864164*64#646464646464545454545454545454545454545454545454{54t54m54f54_54X54Q54J54C54<54554.54'54 545454 545444444444444444444444444444444444444444x44q44j44c44\44U44N44G44@44944244+44$444444444444343434343434343434343434343434343434|34u34n34g34`34Y34R34K34D34=34634/34(34!343434 343424242424242424242424242424242424242424y24r24k24d24]24V24O24H24A24:24324,24%24242424 2424141414141414141414141414141414141414}14v14o14h14a14Z14S14L14E14>14714014)14"141414 141404040404040404040404040404040404040404z04s04l04e04^04W04P04I04B04;04404-04&04040404 0404/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4~/4w/4p/4i/4b/4[/4T/4M/4F/4?/48/41/4*/4#/4/4/4/4/4/4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4{.4t.4m.4f.4_.4X.4Q.4J.4C.4<.45.4..4'.4 .4.4.4 .4.4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4x-4q-4j-4c-4\-4U-4N-4G-4@-49-42-4+-4$-4-4-4-4-4-4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4|,4u,4n,4g,4`,4Y,4R,4K,4D,4=,46,4/,4(,4!,4,4,4 ,4,4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4y+4r+4k+4d+4]+4V+4O+4H+4A+4:+43+4,+4%+4+4+4+4 +4+4*4*4*4*4*4*4*4*4*4*4*4*4*4*4*4*4*4*4}*4v*4o*4h*4a*4Z*4S*4L*4E*4>*47*40*4)*4"*4*4*4 *4*4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4z)4s)4l)4e)4^)4W)4P)4I)4B)4;)44)4-)4&)4)4)4)4 )4)4(4(4(4(4(4(4(4(4(4(4(4(4(4(4(4(4(4(4~(4w(4p(4i(4b(4[(4T(4M(4F(4?(48(41(4*(4#(4(4(4(4(4(4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4{'4t'4m'4f'4_'4X'4Q'4J'4C'4<'45'4.'4''4 '4'4'4 '4'4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4x&4q&4j&4c&4\&4U&4N&4G&4@&49&42&4+&4$&4&4&4&4&4&4%4%4%4%4%4%4%4%4%4%4%4%4%4%4%4%4%4%4|%4u%4n%4g%4`%4Y%4R%4K%4D%4=%46%4/%4(%4!%4%4%4 %4%4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$4y$4r$4k$4d$4]$4V$4O$4H$4A$4:$43$4,$4%$4$4$4$4 $4$4#4#4#4#4#4#4#4#4#4#4#4#4#4#4#4#4#4#4}#4v#4o#4h#4a#4Z#4S#4L#4E#4>#47#40#4)#4"#4#4#4 #4#4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4z"4s"4l"4e"4^"4W"4P"4I"4B"4;"44"4-"4&"4"4"4"4 "4"4!4!4!4!4!4!4!4!4!4!4!4!4!4!4!4!4!4!4~!4w!4p!4i!4b!4[!4T!4M!4F!4?!48!41!4*!4#!4!4!4!4!4!4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4{ 4t 4m 4f 4_ 4X 4Q 4J 4C 4< 45 4. 4' 4 4 4 4 4 44444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4z 4s 4l 4e 4^ 4W 4P 4I 4B 4; 44 4- 4& 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4~ 4w 4p 4i 4b 4[ 4T 4M 4F 4? 48 41 4* 4# 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4{ 4t 4m 4f 4_ 4X 4Q 4J 4C 4< 45 4. 4' 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4x 4q 4j 4c 4\ 4U 4N 4G 4@ 49 42 4+ 4$ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4| 4u 4n 4g 4` 4Y 4R 4K 4D 4= 46 4/ 4( 4! 4 4 4 4 44444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 444444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 444444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 444444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333ٿ3ҿ3˿3Ŀ3333333333~3w3p3i3b3[3T3M3F3?38313*3#3333333333ݾ3־3Ͼ3Ⱦ33333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 3333333ڽ3ӽ3̽3Ž33333333333x3q3j3c3\3U3N3G3@39323+3$3333333333޼3׼3м3ɼ3¼3333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 3333333ۻ3Ի3ͻ3ƻ33333333333y3r3k3d3]3V3O3H3A3:333,3%3333 333333ߺ3غ3Ѻ3ʺ3ú3333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 3333333ܹ3չ3ι3ǹ33333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333ٸ3Ҹ3˸3ĸ3333333333~3w3p3i3b3[3T3M3F3?38313*3#3333333333ݷ3ַ3Ϸ3ȷ33333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 3333333ڶ3Ӷ3̶3Ŷ33333333333x3q3j3c3\3U3N3G3@39323+3$3333333333޵3׵3е3ɵ3µ3333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 3333333۴3Դ3ʹ3ƴ33333333333y3r3k3d3]3V3O3H3A3:333,3%3333 333333߳3س3ѳ3ʳ3ó3333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 3333333ܲ3ղ3β3Dz33333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333ٱ3ұ3˱3ı3333333333~3w3p3i3b3[3T3M3F3?38313*3#3333333333ݰ3ְ3ϰ3Ȱ33333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 3333333گ3ӯ3̯3ů33333333333x3q3j3c3\3U3N3G3@39323+3$3333333333ޮ3׮3Ю3ɮ3®3333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 3333333ۭ3ԭ3ͭ3ƭ33333333333y3r3k3d3]3V3O3H3A3:333,3%3333 333333߬3ج3Ѭ3ʬ3ì3333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 3333333ܫ3ի3Ϋ3ǫ33333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333٪3Ҫ3˪3Ī3333333333~3w3p3i3b3[3T3M3F3?38313*3#3333333333ݩ3֩3ϩ3ȩ33333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 3333333ڨ3Ө3̨3Ũ33333333333x3q3j3c3\3U3N3G3@39323+3$3333333333ާ3ק3Ч3ɧ3§3333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 3333333ۦ3Ԧ3ͦ3Ʀ33333333333y3r3k3d3]3V3O3H3A3:333,3%3333 333333ߥ3إ3ѥ3ʥ3å3333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 3333333ܤ3դ3Τ3Ǥ33333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333٣3ң3ˣ3ģ3333333333~3w3p3i3b3[3T3M3F3?38313*3#3333333333ݢ3֢3Ϣ3Ȣ33333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 3333333ڡ3ӡ3̡3š33333333333x3q3j3c3\3U3N3G3@39323+3$3333333333ޠ3נ3Р3ɠ3 3333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 3333333۟3ԟ3͟3Ɵ33333333333y3r3k3d3]3V3O3H3A3:333,3%3333 333333ߞ3؞3ў3ʞ3Þ3333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 3333333ܝ3՝3Ν3ǝ33333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333ٜ3Ҝ3˜3Ĝ3333333333~3w3p3i3b3[3T3M3F3?38313*3#3333333333ݛ3֛3ϛ3ț33333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 3333333ښ3Ӛ3̚3Ś33333333333x3q3j3c3\3U3N3G3@39323+3$3333333333ޙ3י3Й3ə3™3333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 3333333ۘ3Ԙ3͘3Ƙ33333333333y3r3k3d3]3V3O3H3A3:333,3%3333 333333ߗ3ؗ3ї3ʗ3×3333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 3333333ܖ3Ֆ3Ζ3ǖ33333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333ٕ3ҕ3˕3ĕ3333333333~3w3p3i3b3[3T3M3F3?38313*3#3333333333ݔ3֔3ϔ3Ȕ33333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 3333333ړ3ӓ3̓3œ33333333333x3q3j3c3\3U3N3G3@39323+3$3333333333ޒ3ג3В3ɒ3’3333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 3333333ۑ3ԑ3͑3Ƒ33333333333y3r3k3d3]3V3O3H3A3:333,3%3333 333333ߐ3ؐ3ѐ3ʐ3Ð3333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 3333333܏3Տ3Ώ3Ǐ33333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333َ3Ҏ3ˎ3Ď3333333333~3w3p3i3b3[3T3M3F3?38313*3#3333333333ݍ3֍3ύ3ȍ33333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 3333333ڌ3ӌ3̌3Ō33333333333x3q3j3c3\3U3N3G3@39323+3$3333333333ދ3׋3Ћ3ɋ3‹3333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 3333333ۊ3Ԋ3͊3Ɗ33333333333y3r3k3d3]3V3O3H3A3:333,3%3333 333333߉3؉3щ3ʉ3É3333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 3333333܈3Ո3Έ3Lj33333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333ه3҇3ˇ3ć3333333333~3w3p3i3b3[3T3M3F3?38313*3#3333333333݆3ֆ3φ3Ȇ33333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 3333333څ3Ӆ3̅3Ņ33333333333x3q3j3c3\3U3N3G3@39323+3$3333333333ބ3ׄ3Є3Ʉ3„3333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 3333333ۃ3ԃ3̓3ƃ33333333333y3r3k3d3]3V3O3H3A3:333,3%3333 333333߂3؂3т3ʂ3Â3333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 3333333܁3Ձ3΁3ǁ33333333333z3s3l3e3^3W3P3I3B3;343-3&3333 3333333ـ3Ҁ3ˀ3Ā3333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 33~3~3~3~3~3~3~3~3~3~3~3~3~3~3~3~3~3~3~3x~3q~3j~3c~3\~3U~3N~3G~3@~39~32~3+~3$~3~3~3~3~3~3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3|}3u}3n}3g}3`}3Y}3R}3K}3D}3=}36}3/}3(}3!}3}3}3 }3}3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3|3y|3r|3k|3d|3]|3V|3O|3H|3A|3:|33|3,|3%|3|3|3|3 |3|3{3{3{3{3{3{3{3{3{3{3{3{3{3{3{3{3{3{3}{3v{3o{3h{3a{3Z{3S{3L{3E{3>{37{30{3){3"{3{3{3 {3{3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3zz3sz3lz3ez3^z3Wz3Pz3Iz3Bz3;z34z3-z3&z3z3z3z3 z3z3y3y3y3y3y3y3y3y3y3y3y3y3y3y3y3y3y3y3~y3wy3py3iy3by3[y3Ty3My3Fy3?y38y31y3*y3#y3y3y3y3y3y3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3{x3tx3mx3fx3_x3Xx3Qx3Jx3Cx3t37t30t3)t3"t3t3t3 t3t3s3s3s3s3s3s3s3s3s3s3s3s3s3s3s3s3s3s3s3zs3ss3ls3es3^s3Ws3Ps3Is3Bs3;s34s3-s3&s3s3s3s3 s3s3r3r3r3r3r3r3r3r3r3r3r3r3r3r3r3r3r3r3~r3wr3pr3ir3br3[r3Tr3Mr3Fr3?r38r31r3*r3#r3r3r3r3r3r3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3{q3tq3mq3fq3_q3Xq3Qq3Jq3Cq3m37m30m3)m3"m3m3m3 m3m3l3l3l3l3l3l3l3l3l3l3l3l3l3l3l3l3l3l3l3zl3sl3ll3el3^l3Wl3Pl3Il3Bl3;l34l3-l3&l3l3l3l3 l3l3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3k3~k3wk3pk3ik3bk3[k3Tk3Mk3Fk3?k38k31k3*k3#k3k3k3k3k3k3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3{j3tj3mj3fj3_j3Xj3Qj3Jj3Cj3f37f30f3)f3"f3f3f3 f3f3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3ze3se3le3ee3^e3We3Pe3Ie3Be3;e34e3-e3&e3e3e3e3 e3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3~d3wd3pd3id3bd3[d3Td3Md3Fd3?d38d31d3*d3#d3d3d3d3d3d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3{c3tc3mc3fc3_c3Xc3Qc3Jc3Cc3_37_30_3)_3"_3_3_3 _3_3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3z^3s^3l^3e^3^^3W^3P^3I^3B^3;^34^3-^3&^3^3^3^3 ^3^3]3]3]3]3]3]3]3]3]3]3]3]3]3]3]3]3]3]3~]3w]3p]3i]3b]3[]3T]3M]3F]3?]38]31]3*]3#]3]3]3]3]3]3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3{\3t\3m\3f\3_\3X\3Q\3J\3C\3<\35\3.\3'\3 \3\3\3 \3\3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3x[3q[3j[3c[3\[3U[3N[3G[3@[39[32[3+[3$[3[3[3[3[3[3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3Z3|Z3uZ3nZ3gZ3`Z3YZ3RZ3KZ3DZ3=Z36Z3/Z3(Z3!Z3Z3Z3 Z3Z3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3Y3yY3rY3kY3dY3]Y3VY3OY3HY3AY3:Y33Y3,Y3%Y3Y3Y3Y3 Y3Y3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3}X3vX3oX3hX3aX3ZX3SX3LX3EX3>X37X30X3)X3"X3X3X3 X3X3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3zW3sW3lW3eW3^W3WW3PW3IW3BW3;W34W3-W3&W3W3W3W3 W3W3V3V3V3V3V3V3V3V3V3V3V3V3V3V3V3V3V3V3~V3wV3pV3iV3bV3[V3TV3MV3FV3?V38V31V3*V3#V3V3V3V3V3V3U3U3U3U3U3U3U3U3U3U3U3U3U3U3U3U3U3U3{U3tU3mU3fU3_U3XU3QU3JU3CU3Q37Q30Q3)Q3"Q3Q3Q3 Q3Q3P3P3P3P3P3P3P3P3P3P3P3P3P3P3P3P3P3P3P3zP3sP3lP3eP3^P3WP3PP3IP3BP3;P34P3-P3&P3P3P3P3 P3P3O3O3O3O3O3O3O3O3O3O3O3O3O3O3O3O3O3O3~O3wO3pO3iO3bO3[O3TO3MO3FO3?O38O31O3*O3#O3O3O3O3O3O3N3N3N3N3N3N3N3N3N3N3N3N3N3N3N3N3N3N3{N3tN3mN3fN3_N3XN3QN3JN3CN3J37J30J3)J3"J3J3J3 J3J3I3I3I3I3I3I3I3I3I3I3I3I3I3I3I3I3I3I3I3zI3sI3lI3eI3^I3WI3PI3II3BI3;I34I3-I3&I3I3I3I3 I3I3H3H3H3H3H3H3H3H3H3H3H3H3H3H3H3H3H3H3~H3wH3pH3iH3bH3[H3TH3MH3FH3?H38H31H3*H3#H3H3H3H3H3H3G3G3G3G3G3G3G3G3G3G3G3G3G3G3G3G3G3G3{G3tG3mG3fG3_G3XG3QG3JG3CG3C37C30C3)C3"C3C3C3 C3C3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3zB3sB3lB3eB3^B3WB3PB3IB3BB3;B34B3-B3&B3B3B3B3 B3B3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3~A3wA3pA3iA3bA3[A3TA3MA3FA3?A38A31A3*A3#A3A3A3A3A3A3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3{@3t@3m@3f@3_@3X@3Q@3J@3C@3<@35@3.@3'@3 @3@3@3 @3@3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3x?3q?3j?3c?3\?3U?3N?3G?3@?39?32?3+?3$?3?3?3?3?3?3>3>3>3>3>3>3>3>3>3>3>3>3>3>3>3>3>3>3|>3u>3n>3g>3`>3Y>3R>3K>3D>3=>36>3/>3(>3!>3>3>3 >3>3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3=3y=3r=3k=3d=3]=3V=3O=3H=3A=3:=33=3,=3%=3=3=3=3 =3=3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3}<3v<3o<3h<3a<3Z<3S<3L<3E<3><37<30<3)<3"<3<3<3 <3<3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3z;3s;3l;3e;3^;3W;3P;3I;3B;3;;34;3-;3&;3;3;3;3 ;3;3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3~:3w:3p:3i:3b:3[:3T:3M:3F:3?:38:31:3*:3#:3:3:3:3:3:3939393939393939393939393939393939393{93t93m93f93_93X93Q93J93C93<93593.93'93 939393 939383838383838383838383838383838383838383x83q83j83c83\83U83N83G83@83983283+83$838383838383737373737373737373737373737373737373|73u73n73g73`73Y73R73K73D73=73673/73(73!737373 737363636363636363636363636363636363636363y63r63k63d63]63V63O63H63A63:63363,63%63636363 6363535353535353535353535353535353535353}53v53o53h53a53Z53S53L53E53>53753053)53"535353 535343434343434343434343434343434343434343z43s43l43e43^43W43P43I43B43;43443-43&43434343 4343333333333333333333333333333333333333~33w33p33i33b33[33T33M33F33?33833133*33#333333333333232323232323232323232323232323232323{23t23m23f23_23X23Q23J23C23<23523.23'23 232323 232313131313131313131313131313131313131313x13q13j13c13\13U13N13G13@13913213+13$131313131313030303030303030303030303030303030303|03u03n03g03`03Y03R03K03D03=03603/03(03!030303 0303/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3y/3r/3k/3d/3]/3V/3O/3H/3A/3:/33/3,/3%/3/3/3/3 /3/3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3}.3v.3o.3h.3a.3Z.3S.3L.3E.3>.37.30.3).3".3.3.3 .3.3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3z-3s-3l-3e-3^-3W-3P-3I-3B-3;-34-3--3&-3-3-3-3 -3-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3~,3w,3p,3i,3b,3[,3T,3M,3F,3?,38,31,3*,3#,3,3,3,3,3,3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3{+3t+3m+3f+3_+3X+3Q+3J+3C+3<+35+3.+3'+3 +3+3+3 +3+3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3x*3q*3j*3c*3\*3U*3N*3G*3@*39*32*3+*3$*3*3*3*3*3*3)3)3)3)3)3)3)3)3)3)3)3)3)3)3)3)3)3)3|)3u)3n)3g)3`)3Y)3R)3K)3D)3=)36)3/)3()3!)3)3)3 )3)3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3y(3r(3k(3d(3](3V(3O(3H(3A(3:(33(3,(3%(3(3(3(3 (3(3'3'3'3'3'3'3'3'3'3'3'3'3'3'3'3'3'3'3}'3v'3o'3h'3a'3Z'3S'3L'3E'3>'37'30'3)'3"'3'3'3 '3'3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3z&3s&3l&3e&3^&3W&3P&3I&3B&3;&34&3-&3&&3&3&3&3 &3&3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3~%3w%3p%3i%3b%3[%3T%3M%3F%3?%38%31%3*%3#%3%3%3%3%3%3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3{$3t$3m$3f$3_$3X$3Q$3J$3C$3<$35$3.$3'$3 $3$3$3 $3$3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3x#3q#3j#3c#3\#3U#3N#3G#3@#39#32#3+#3$#3#3#3#3#3#3"3"3"3"3"3"3"3"3"3"3"3"3"3"3"3"3"3"3|"3u"3n"3g"3`"3Y"3R"3K"3D"3="36"3/"3("3!"3"3"3 "3"3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3y!3r!3k!3d!3]!3V!3O!3H!3A!3:!33!3,!3%!3!3!3!3 !3!3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3} 3v 3o 3h 3a 3Z 3S 3L 3E 3> 37 30 3) 3" 3 3 3 3 33333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3| 3u 3n 3g 3` 3Y 3R 3K 3D 3= 36 3/ 3( 3! 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3y 3r 3k 3d 3] 3V 3O 3H 3A 3: 33 3, 3% 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3} 3v 3o 3h 3a 3Z 3S 3L 3E 3> 37 30 3) 3" 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3z 3s 3l 3e 3^ 3W 3P 3I 3B 3; 34 3- 3& 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3~ 3w 3p 3i 3b 3[ 3T 3M 3F 3? 38 31 3* 3# 3 3 3 3 3 3333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 333333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 333333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 333333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222ۿ2Կ2Ϳ2ƿ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 222222߾2ؾ2Ѿ2ʾ2þ2222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 2222222ܽ2ս2ν2ǽ22222222222z2s2l2e2^2W2P2I2B2;242-2&2222 2222222ټ2Ҽ2˼2ļ2222222222~2w2p2i2b2[2T2M2F2?28212*2#2222222222ݻ2ֻ2ϻ2Ȼ22222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 2222222ں2Ӻ2̺2ź22222222222x2q2j2c2\2U2N2G2@29222+2$2222222222޹2׹2й2ɹ2¹2222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222۸2Ը2͸2Ƹ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 222222߷2ط2ѷ2ʷ2÷2222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 2222222ܶ2ն2ζ2Ƕ22222222222z2s2l2e2^2W2P2I2B2;242-2&2222 2222222ٵ2ҵ2˵2ĵ2222222222~2w2p2i2b2[2T2M2F2?28212*2#2222222222ݴ2ִ2ϴ2ȴ22222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 2222222ڳ2ӳ2̳2ų22222222222x2q2j2c2\2U2N2G2@29222+2$2222222222޲2ײ2в2ɲ2²2222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222۱2Ա2ͱ2Ʊ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 222222߰2ذ2Ѱ2ʰ2ð2222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 2222222ܯ2կ2ί2ǯ22222222222z2s2l2e2^2W2P2I2B2;242-2&2222 2222222ٮ2Ү2ˮ2Į2222222222~2w2p2i2b2[2T2M2F2?28212*2#2222222222ݭ2֭2ϭ2ȭ22222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 2222222ڬ2Ӭ2̬2Ŭ22222222222x2q2j2c2\2U2N2G2@29222+2$2222222222ޫ2׫2Ы2ɫ2«2222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222۪2Ԫ2ͪ2ƪ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 222222ߩ2ة2ѩ2ʩ2é2222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 2222222ܨ2ը2Ψ2Ǩ22222222222z2s2l2e2^2W2P2I2B2;242-2&2222 2222222٧2ҧ2˧2ħ2222222222~2w2p2i2b2[2T2M2F2?28212*2#2222222222ݦ2֦2Ϧ2Ȧ22222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 2222222ڥ2ӥ2̥2ť22222222222x2q2j2c2\2U2N2G2@29222+2$2222222222ޤ2פ2Ф2ɤ2¤2222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222ۣ2ԣ2ͣ2ƣ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 222222ߢ2آ2Ѣ2ʢ2â2222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 2222222ܡ2ա2Ρ2ǡ22222222222z2s2l2e2^2W2P2I2B2;242-2&2222 2222222٠2Ҡ2ˠ2Ġ2222222222~2w2p2i2b2[2T2M2F2?28212*2#2222222222ݟ2֟2ϟ2ȟ22222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 2222222ڞ2Ӟ2̞2Ş22222222222x2q2j2c2\2U2N2G2@29222+2$2222222222ޝ2ם2Н2ɝ22222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222ۜ2Ԝ2͜2Ɯ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 222222ߛ2؛2ћ2ʛ2Û2222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 2222222ܚ2՚2Κ2ǚ22222222222z2s2l2e2^2W2P2I2B2;242-2&2222 2222222ٙ2ҙ2˙2ę2222222222~2w2p2i2b2[2T2M2F2?28212*2#2222222222ݘ2֘2Ϙ2Ș22222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 2222222ڗ2ӗ2̗2ŗ22222222222x2q2j2c2\2U2N2G2@29222+2$2222222222ޖ2ז2Ж2ɖ2–2222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222ە2ԕ2͕2ƕ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 222222ߔ2ؔ2є2ʔ2Ô2222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 2222222ܓ2Փ2Γ2Ǔ22222222222z2s2l2e2^2W2P2I2B2;242-2&2222 2222222ْ2Ғ2˒2Ē2222222222~2w2p2i2b2[2T2M2F2?28212*2#2222222222ݑ2֑2ϑ2ȑ22222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 2222222ڐ2Ӑ2̐2Ő22222222222x2q2j2c2\2U2N2G2@29222+2$2222222222ޏ2׏2Џ2ɏ22222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222ێ2Ԏ2͎2Ǝ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 222222ߍ2؍2э2ʍ2Í2222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 2222222܌2Ռ2Ό2nj22222222222z2s2l2e2^2W2P2I2B2;242-2&2222 2222222ً2ҋ2ˋ2ċ2222222222~2w2p2i2b2[2T2M2F2?28212*2#2222222222݊2֊2ϊ2Ȋ22222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 2222222ډ2Ӊ2̉2ʼn22222222222x2q2j2c2\2U2N2G2@29222+2$2222222222ވ2׈2Ј2Ɉ2ˆ2222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222ۇ2ԇ2͇2Ƈ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 222222߆2؆2ц2ʆ2Æ2222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 2222222܅2Յ2΅2Dž22222222222z2s2l2e2^2W2P2I2B2;242-2&2222 2222222ل2҄2˄2Ą2222222222~2w2p2i2b2[2T2M2F2?28212*2#2222222222݃2փ2σ2ȃ22222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 2222222ڂ2ӂ2̂2ł22222222222x2q2j2c2\2U2N2G2@29222+2$2222222222ށ2ׁ2Ё2Ɂ22222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 2222222ۀ2Ԁ2̀2ƀ22222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 22~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2~2z~2s~2l~2e~2^~2W~2P~2I~2B~2;~24~2-~2&~2~2~2~2 ~2~2}2}2}2}2}2}2}2}2}2}2}2}2}2}2}2}2}2}2~}2w}2p}2i}2b}2[}2T}2M}2F}2?}28}21}2*}2#}2}2}2}2}2}2|2|2|2|2|2|2|2|2|2|2|2|2|2|2|2|2|2|2{|2t|2m|2f|2_|2X|2Q|2J|2C|2<|25|2.|2'|2 |2|2|2 |2|2{2{2{2{2{2{2{2{2{2{2{2{2{2{2{2{2{2{2{2x{2q{2j{2c{2\{2U{2N{2G{2@{29{22{2+{2${2{2{2{2{2{2z2z2z2z2z2z2z2z2z2z2z2z2z2z2z2z2z2z2|z2uz2nz2gz2`z2Yz2Rz2Kz2Dz2=z26z2/z2(z2!z2z2z2 z2z2y2y2y2y2y2y2y2y2y2y2y2y2y2y2y2y2y2y2y2yy2ry2ky2dy2]y2Vy2Oy2Hy2Ay2:y23y2,y2%y2y2y2y2 y2y2x2x2x2x2x2x2x2x2x2x2x2x2x2x2x2x2x2x2}x2vx2ox2hx2ax2Zx2Sx2Lx2Ex2>x27x20x2)x2"x2x2x2 x2x2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2zw2sw2lw2ew2^w2Ww2Pw2Iw2Bw2;w24w2-w2&w2w2w2w2 w2w2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2~v2wv2pv2iv2bv2[v2Tv2Mv2Fv2?v28v21v2*v2#v2v2v2v2v2v2u2u2u2u2u2u2u2u2u2u2u2u2u2u2u2u2u2u2{u2tu2mu2fu2_u2Xu2Qu2Ju2Cu2q27q20q2)q2"q2q2q2 q2q2p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2p2zp2sp2lp2ep2^p2Wp2Pp2Ip2Bp2;p24p2-p2&p2p2p2p2 p2p2o2o2o2o2o2o2o2o2o2o2o2o2o2o2o2o2o2o2~o2wo2po2io2bo2[o2To2Mo2Fo2?o28o21o2*o2#o2o2o2o2o2o2n2n2n2n2n2n2n2n2n2n2n2n2n2n2n2n2n2n2{n2tn2mn2fn2_n2Xn2Qn2Jn2Cn2j27j20j2)j2"j2j2j2 j2j2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2zi2si2li2ei2^i2Wi2Pi2Ii2Bi2;i24i2-i2&i2i2i2i2 i2i2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2~h2wh2ph2ih2bh2[h2Th2Mh2Fh2?h28h21h2*h2#h2h2h2h2h2h2g2g2g2g2g2g2g2g2g2g2g2g2g2g2g2g2g2g2{g2tg2mg2fg2_g2Xg2Qg2Jg2Cg2c27c20c2)c2"c2c2c2 c2c2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2zb2sb2lb2eb2^b2Wb2Pb2Ib2Bb2;b24b2-b2&b2b2b2b2 b2b2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2~a2wa2pa2ia2ba2[a2Ta2Ma2Fa2?a28a21a2*a2#a2a2a2a2a2a2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2{`2t`2m`2f`2_`2X`2Q`2J`2C`2<`25`2.`2'`2 `2`2`2 `2`2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2x_2q_2j_2c_2\_2U_2N_2G_2@_29_22_2+_2$_2_2_2_2_2_2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2|^2u^2n^2g^2`^2Y^2R^2K^2D^2=^26^2/^2(^2!^2^2^2 ^2^2]2]2]2]2]2]2]2]2]2]2]2]2]2]2]2]2]2]2]2y]2r]2k]2d]2]]2V]2O]2H]2A]2:]23]2,]2%]2]2]2]2 ]2]2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2}\2v\2o\2h\2a\2Z\2S\2L\2E\2>\27\20\2)\2"\2\2\2 \2\2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2[2z[2s[2l[2e[2^[2W[2P[2I[2B[2;[24[2-[2&[2[2[2[2 [2[2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2Z2~Z2wZ2pZ2iZ2bZ2[Z2TZ2MZ2FZ2?Z28Z21Z2*Z2#Z2Z2Z2Z2Z2Z2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2{Y2tY2mY2fY2_Y2XY2QY2JY2CY2U27U20U2)U2"U2U2U2 U2U2T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2T2zT2sT2lT2eT2^T2WT2PT2IT2BT2;T24T2-T2&T2T2T2T2 T2T2S2S2S2S2S2S2S2S2S2S2S2S2S2S2S2S2S2S2~S2wS2pS2iS2bS2[S2TS2MS2FS2?S28S21S2*S2#S2S2S2S2S2S2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2{R2tR2mR2fR2_R2XR2QR2JR2CR2N27N20N2)N2"N2N2N2 N2N2M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2M2zM2sM2lM2eM2^M2WM2PM2IM2BM2;M24M2-M2&M2M2M2M2 M2M2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2~L2wL2pL2iL2bL2[L2TL2ML2FL2?L28L21L2*L2#L2L2L2L2L2L2K2K2K2K2K2K2K2K2K2K2K2K2K2K2K2K2K2K2{K2tK2mK2fK2_K2XK2QK2JK2CK2G27G20G2)G2"G2G2G2 G2G2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2zF2sF2lF2eF2^F2WF2PF2IF2BF2;F24F2-F2&F2F2F2F2 F2F2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2~E2wE2pE2iE2bE2[E2TE2ME2FE2?E28E21E2*E2#E2E2E2E2E2E2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2{D2tD2mD2fD2_D2XD2QD2JD2CD2@27@20@2)@2"@2@2@2 @2@2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2z?2s?2l?2e?2^?2W?2P?2I?2B?2;?24?2-?2&?2?2?2?2 ?2?2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2~>2w>2p>2i>2b>2[>2T>2M>2F>2?>28>21>2*>2#>2>2>2>2>2>2=2=2=2=2=2=2=2=2=2=2=2=2=2=2=2=2=2=2{=2t=2m=2f=2_=2X=2Q=2J=2C=2<=25=2.=2'=2 =2=2=2 =2=2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2x<2q<2j<2c<2\<2U<2N<2G<2@<29<22<2+<2$<2<2<2<2<2<2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2|;2u;2n;2g;2`;2Y;2R;2K;2D;2=;26;2/;2(;2!;2;2;2 ;2;2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2y:2r:2k:2d:2]:2V:2O:2H:2A:2::23:2,:2%:2:2:2:2 :2:2929292929292929292929292929292929292}92v92o92h92a92Z92S92L92E92>92792092)92"929292 929282828282828282828282828282828282828282z82s82l82e82^82W82P82I82B82;82482-82&82828282 8282727272727272727272727272727272727272~72w72p72i72b72[72T72M72F72?72872172*72#727272727272626262626262626262626262626262626262{62t62m62f62_62X62Q62J62C62<62562.62'62 626262 626252525252525252525252525252525252525252x52q52j52c52\52U52N52G52@52952252+52$525252525252424242424242424242424242424242424242|42u42n42g42`42Y42R42K42D42=42642/42(42!424242 424232323232323232323232323232323232323232y32r32k32d32]32V32O32H32A32:32332,32%32323232 3232222222222222222222222222222222222222}22v22o22h22a22Z22S22L22E22>22722022)22"222222 222212121212121212121212121212121212121212z12s12l12e12^12W12P12I12B12;12412-12&12121212 1212020202020202020202020202020202020202~02w02p02i02b02[02T02M02F02?02802102*02#020202020202/2/2/2/2/2/2/2/2/2/2/2/2/2/2/2/2/2/2{/2t/2m/2f/2_/2X/2Q/2J/2C/2+27+20+2)+2"+2+2+2 +2+2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2z*2s*2l*2e*2^*2W*2P*2I*2B*2;*24*2-*2&*2*2*2*2 *2*2)2)2)2)2)2)2)2)2)2)2)2)2)2)2)2)2)2)2~)2w)2p)2i)2b)2[)2T)2M)2F)2?)28)21)2*)2#)2)2)2)2)2)2(2(2(2(2(2(2(2(2(2(2(2(2(2(2(2(2(2(2{(2t(2m(2f(2_(2X(2Q(2J(2C(2<(25(2.(2'(2 (2(2(2 (2(2'2'2'2'2'2'2'2'2'2'2'2'2'2'2'2'2'2'2'2x'2q'2j'2c'2\'2U'2N'2G'2@'29'22'2+'2$'2'2'2'2'2'2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2|&2u&2n&2g&2`&2Y&2R&2K&2D&2=&26&2/&2(&2!&2&2&2 &2&2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2y%2r%2k%2d%2]%2V%2O%2H%2A%2:%23%2,%2%%2%2%2%2 %2%2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2}$2v$2o$2h$2a$2Z$2S$2L$2E$2>$27$20$2)$2"$2$2$2 $2$2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2z#2s#2l#2e#2^#2W#2P#2I#2B#2;#24#2-#2#2#2#2 #2#2"2"2"2"2"2"2"2"2"2"2"2"2"2"2"2"2"2"2~"2w"2p"2i"2b"2["2T"2M"2F"2?"28"21"2*"2#"2"2"2"2"2"2!2!2!2!2!2!2!2!2!2!2!2!2!2!2!2!2!2!2{!2t!2m!2f!2_!2X!2Q!2J!2C!227202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2~ 2w 2p 2i 2b 2[ 2T 2M 2F 2? 28 21 2* 2# 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2{ 2t 2m 2f 2_ 2X 2Q 2J 2C 2< 25 2. 2' 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2x 2q 2j 2c 2\ 2U 2N 2G 2@ 29 22 2+ 2$ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2| 2u 2n 2g 2` 2Y 2R 2K 2D 2= 26 2/ 2( 2! 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2y 2r 2k 2d 2] 2V 2O 2H 2A 2: 23 2, 2% 2 2 2 2 2 2222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 222222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 222222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 222222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111ݿ1ֿ1Ͽ1ȿ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 1111111ھ1Ӿ1̾1ž11111111111x1q1j1c1\1U1N1G1@19121+1$1111111111޽1׽1н1ɽ1½1111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 1111111ۼ1Լ1ͼ1Ƽ11111111111y1r1k1d1]1V1O1H1A1:131,1%1111 111111߻1ػ1ѻ1ʻ1û1111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 1111111ܺ1պ1κ1Ǻ11111111111z1s1l1e1^1W1P1I1B1;141-1&1111 1111111ٹ1ҹ1˹1Ĺ1111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111ݸ1ָ1ϸ1ȸ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 1111111ڷ1ӷ1̷1ŷ11111111111x1q1j1c1\1U1N1G1@19121+1$1111111111޶1׶1ж1ɶ1¶1111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 1111111۵1Ե1͵1Ƶ11111111111y1r1k1d1]1V1O1H1A1:131,1%1111 111111ߴ1ش1Ѵ1ʴ1ô1111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 1111111ܳ1ճ1γ1dz11111111111z1s1l1e1^1W1P1I1B1;141-1&1111 1111111ٲ1Ҳ1˲1IJ1111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111ݱ1ֱ1ϱ1ȱ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 1111111ڰ1Ӱ1̰1Ű11111111111x1q1j1c1\1U1N1G1@19121+1$1111111111ޯ1ׯ1Я1ɯ1¯1111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 1111111ۮ1Ԯ1ͮ1Ʈ11111111111y1r1k1d1]1V1O1H1A1:131,1%1111 111111߭1ح1ѭ1ʭ1í1111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 1111111ܬ1լ1ά1Ǭ11111111111z1s1l1e1^1W1P1I1B1;141-1&1111 1111111٫1ҫ1˫1ī1111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111ݪ1֪1Ϫ1Ȫ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 1111111ک1ө1̩1ũ11111111111x1q1j1c1\1U1N1G1@19121+1$1111111111ި1ר1Ш1ɨ1¨1111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 1111111ۧ1ԧ1ͧ1Ƨ11111111111y1r1k1d1]1V1O1H1A1:131,1%1111 111111ߦ1ئ1Ѧ1ʦ1æ1111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 1111111ܥ1ե1Υ1ǥ11111111111z1s1l1e1^1W1P1I1B1;141-1&1111 1111111٤1Ҥ1ˤ1Ĥ1111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111ݣ1֣1ϣ1ȣ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 1111111ڢ1Ӣ1̢1Ţ11111111111x1q1j1c1\1U1N1G1@19121+1$1111111111ޡ1ס1С1ɡ1¡1111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 1111111۠1Ԡ1͠1Ơ11111111111y1r1k1d1]1V1O1H1A1:131,1%1111 111111ߟ1؟1џ1ʟ1ß1111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 1111111ܞ1՞1Ξ1Ǟ11111111111z1s1l1e1^1W1P1I1B1;141-1&1111 1111111ٝ1ҝ1˝1ĝ1111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111ݜ1֜1Ϝ1Ȝ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 1111111ڛ1ӛ1̛1ś11111111111x1q1j1c1\1U1N1G1@19121+1$1111111111ޚ1ך1К1ɚ1š1111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 1111111ۙ1ԙ1͙1ƙ11111111111y1r1k1d1]1V1O1H1A1:131,1%1111 111111ߘ1ؘ1ј1ʘ1Ø1111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 1111111ܗ1՗1Η1Ǘ11111111111z1s1l1e1^1W1P1I1B1;141-1&1111 1111111ٖ1Җ1˖1Ė1111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111ݕ1֕1ϕ1ȕ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 1111111ڔ1Ӕ1̔1Ŕ11111111111x1q1j1c1\1U1N1G1@19121+1$1111111111ޓ1ד1Г1ɓ1“1111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 1111111ے1Ԓ1͒1ƒ11111111111y1r1k1d1]1V1O1H1A1:131,1%1111 111111ߑ1ؑ1ё1ʑ1Ñ1111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 1111111ܐ1Ր1ΐ1ǐ11111111111z1s1l1e1^1W1P1I1B1;141-1&1111 1111111ُ1ҏ1ˏ1ď1111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111ݎ1֎1ώ1Ȏ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 1111111ڍ1Ӎ1̍1ō11111111111x1q1j1c1\1U1N1G1@19121+1$1111111111ތ1׌1Ќ1Ɍ1Œ1111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 1111111ۋ1ԋ1͋1Ƌ11111111111y1r1k1d1]1V1O1H1A1:131,1%1111 111111ߊ1؊1ъ1ʊ1Ê1111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 1111111܉1Չ1Ή1lj11111111111z1s1l1e1^1W1P1I1B1;141-1&1111 1111111و1҈1ˈ1Ĉ1111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111݇1և1χ1ȇ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 1111111چ1ӆ1̆1ņ11111111111x1q1j1c1\1U1N1G1@19121+1$1111111111ޅ1ׅ1Ѕ1Ʌ1…1111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 1111111ۄ1Ԅ1̈́1Ƅ11111111111y1r1k1d1]1V1O1H1A1:131,1%1111 111111߃1؃1у1ʃ1Ã1111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 1111111܂1Ղ1΂1ǂ11111111111z1s1l1e1^1W1P1I1B1;141-1&1111 1111111ف1ҁ1ˁ1ā1111111111~1w1p1i1b1[1T1M1F1?18111*1#1111111111݀1ր1π1Ȁ11111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1|~1u~1n~1g~1`~1Y~1R~1K~1D~1=~16~1/~1(~1!~1~1~1 ~1~1}1}1}1}1}1}1}1}1}1}1}1}1}1}1}1}1}1}1}1y}1r}1k}1d}1]}1V}1O}1H}1A}1:}13}1,}1%}1}1}1}1 }1}1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1}|1v|1o|1h|1a|1Z|1S|1L|1E|1>|17|10|1)|1"|1|1|1 |1|1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1z{1s{1l{1e{1^{1W{1P{1I{1B{1;{14{1-{1&{1{1{1{1 {1{1z1z1z1z1z1z1z1z1z1z1z1z1z1z1z1z1z1z1~z1wz1pz1iz1bz1[z1Tz1Mz1Fz1?z18z11z1*z1#z1z1z1z1z1z1y1y1y1y1y1y1y1y1y1y1y1y1y1y1y1y1y1y1{y1ty1my1fy1_y1Xy1Qy1Jy1Cy1u17u10u1)u1"u1u1u1 u1u1t1t1t1t1t1t1t1t1t1t1t1t1t1t1t1t1t1t1t1zt1st1lt1et1^t1Wt1Pt1It1Bt1;t14t1-t1&t1t1t1t1 t1t1s1s1s1s1s1s1s1s1s1s1s1s1s1s1s1s1s1s1~s1ws1ps1is1bs1[s1Ts1Ms1Fs1?s18s11s1*s1#s1s1s1s1s1s1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1{r1tr1mr1fr1_r1Xr1Qr1Jr1Cr1n17n10n1)n1"n1n1n1 n1n1m1m1m1m1m1m1m1m1m1m1m1m1m1m1m1m1m1m1m1zm1sm1lm1em1^m1Wm1Pm1Im1Bm1;m14m1-m1&m1m1m1m1 m1m1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1~l1wl1pl1il1bl1[l1Tl1Ml1Fl1?l18l11l1*l1#l1l1l1l1l1l1k1k1k1k1k1k1k1k1k1k1k1k1k1k1k1k1k1k1{k1tk1mk1fk1_k1Xk1Qk1Jk1Ck1g17g10g1)g1"g1g1g1 g1g1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1zf1sf1lf1ef1^f1Wf1Pf1If1Bf1;f14f1-f1&f1f1f1f1 f1f1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1~e1we1pe1ie1be1[e1Te1Me1Fe1?e18e11e1*e1#e1e1e1e1e1e1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1{d1td1md1fd1_d1Xd1Qd1Jd1Cd1`17`10`1)`1"`1`1`1 `1`1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1z_1s_1l_1e_1^_1W_1P_1I_1B_1;_14_1-_1&_1_1_1_1 _1_1^1^1^1^1^1^1^1^1^1^1^1^1^1^1^1^1^1^1~^1w^1p^1i^1b^1[^1T^1M^1F^1?^18^11^1*^1#^1^1^1^1^1^1]1]1]1]1]1]1]1]1]1]1]1]1]1]1]1]1]1]1{]1t]1m]1f]1_]1X]1Q]1J]1C]1<]15]1.]1']1 ]1]1]1 ]1]1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1x\1q\1j\1c\1\\1U\1N\1G\1@\19\12\1+\1$\1\1\1\1\1\1[1[1[1[1[1[1[1[1[1[1[1[1[1[1[1[1[1[1|[1u[1n[1g[1`[1Y[1R[1K[1D[1=[16[1/[1([1![1[1[1 [1[1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1Z1yZ1rZ1kZ1dZ1]Z1VZ1OZ1HZ1AZ1:Z13Z1,Z1%Z1Z1Z1Z1 Z1Z1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1Y1}Y1vY1oY1hY1aY1ZY1SY1LY1EY1>Y17Y10Y1)Y1"Y1Y1Y1 Y1Y1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1zX1sX1lX1eX1^X1WX1PX1IX1BX1;X14X1-X1&X1X1X1X1 X1X1W1W1W1W1W1W1W1W1W1W1W1W1W1W1W1W1W1W1~W1wW1pW1iW1bW1[W1TW1MW1FW1?W18W11W1*W1#W1W1W1W1W1W1V1V1V1V1V1V1V1V1V1V1V1V1V1V1V1V1V1V1{V1tV1mV1fV1_V1XV1QV1JV1CV1R17R10R1)R1"R1R1R1 R1R1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1zQ1sQ1lQ1eQ1^Q1WQ1PQ1IQ1BQ1;Q14Q1-Q1&Q1Q1Q1Q1 Q1Q1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1~P1wP1pP1iP1bP1[P1TP1MP1FP1?P18P11P1*P1#P1P1P1P1P1P1O1O1O1O1O1O1O1O1O1O1O1O1O1O1O1O1O1O1{O1tO1mO1fO1_O1XO1QO1JO1CO1K17K10K1)K1"K1K1K1 K1K1J1J1J1J1J1J1J1J1J1J1J1J1J1J1J1J1J1J1J1zJ1sJ1lJ1eJ1^J1WJ1PJ1IJ1BJ1;J14J1-J1&J1J1J1J1 J1J1I1I1I1I1I1I1I1I1I1I1I1I1I1I1I1I1I1I1~I1wI1pI1iI1bI1[I1TI1MI1FI1?I18I11I1*I1#I1I1I1I1I1I1H1H1H1H1H1H1H1H1H1H1H1H1H1H1H1H1H1H1{H1tH1mH1fH1_H1XH1QH1JH1CH1D17D10D1)D1"D1D1D1 D1D1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1zC1sC1lC1eC1^C1WC1PC1IC1BC1;C14C1-C1&C1C1C1C1 C1C1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1~B1wB1pB1iB1bB1[B1TB1MB1FB1?B18B11B1*B1#B1B1B1B1B1B1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1{A1tA1mA1fA1_A1XA1QA1JA1CA11>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1y>1r>1k>1d>1]>1V>1O>1H>1A>1:>13>1,>1%>1>1>1>1 >1>1=1=1=1=1=1=1=1=1=1=1=1=1=1=1=1=1=1=1}=1v=1o=1h=1a=1Z=1S=1L=1E=1>=17=10=1)=1"=1=1=1 =1=1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1z<1s<1l<1e<1^<1W<1P<1I<1B<1;<14<1-<1&<1<1<1<1 <1<1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1~;1w;1p;1i;1b;1[;1T;1M;1F;1?;18;11;1*;1#;1;1;1;1;1;1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1{:1t:1m:1f:1_:1X:1Q:1J:1C:1<:15:1.:1':1 :1:1:1 :1:191919191919191919191919191919191919191x91q91j91c91\91U91N91G91@91991291+91$919191919191818181818181818181818181818181818181|81u81n81g81`81Y81R81K81D81=81681/81(81!818181 818171717171717171717171717171717171717171y71r71k71d71]71V71O71H71A71:71371,71%71717171 7171616161616161616161616161616161616161}61v61o61h61a61Z61S61L61E61>61761061)61"616161 616151515151515151515151515151515151515151z51s51l51e51^51W51P51I51B51;51451-51&51515151 5151414141414141414141414141414141414141~41w41p41i41b41[41T41M41F41?41841141*41#414141414141313131313131313131313131313131313131{31t31m31f31_31X31Q31J31C31<31531.31'31 313131 313121212121212121212121212121212121212121x21q21j21c21\21U21N21G21@21921221+21$212121212121111111111111111111111111111111111111|11u11n11g11`11Y11R11K11D11=11611/11(11!111111 111101010101010101010101010101010101010101y01r01k01d01]01V01O01H01A01:01301,01%01010101 0101/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1}/1v/1o/1h/1a/1Z/1S/1L/1E/1>/17/10/1)/1"/1/1/1 /1/1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1z.1s.1l.1e.1^.1W.1P.1I.1B.1;.14.1-.1&.1.1.1.1 .1.1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1~-1w-1p-1i-1b-1[-1T-1M-1F-1?-18-11-1*-1#-1-1-1-1-1-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1{,1t,1m,1f,1_,1X,1Q,1J,1C,1<,15,1.,1',1 ,1,1,1 ,1,1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1x+1q+1j+1c+1\+1U+1N+1G+1@+19+12+1++1$+1+1+1+1+1+1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1|*1u*1n*1g*1`*1Y*1R*1K*1D*1=*16*1/*1(*1!*1*1*1 *1*1)1)1)1)1)1)1)1)1)1)1)1)1)1)1)1)1)1)1)1y)1r)1k)1d)1])1V)1O)1H)1A)1:)13)1,)1%)1)1)1)1 )1)1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1}(1v(1o(1h(1a(1Z(1S(1L(1E(1>(17(10(1)(1"(1(1(1 (1(1'1'1'1'1'1'1'1'1'1'1'1'1'1'1'1'1'1'1'1z'1s'1l'1e'1^'1W'1P'1I'1B'1;'14'1-'1&'1'1'1'1 '1'1&1&1&1&1&1&1&1&1&1&1&1&1&1&1&1&1&1&1~&1w&1p&1i&1b&1[&1T&1M&1F&1?&18&11&1*&1#&1&1&1&1&1&1%1%1%1%1%1%1%1%1%1%1%1%1%1%1%1%1%1%1{%1t%1m%1f%1_%1X%1Q%1J%1C%1<%15%1.%1'%1 %1%1%1 %1%1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1x$1q$1j$1c$1\$1U$1N$1G$1@$19$12$1+$1$$1$1$1$1$1$1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1|#1u#1n#1g#1`#1Y#1R#1K#1D#1=#16#1/#1(#1!#1#1#1 #1#1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1y"1r"1k"1d"1]"1V"1O"1H"1A"1:"13"1,"1%"1"1"1"1 "1"1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1}!1v!1o!1h!1a!1Z!1S!1L!1E!1>!17!10!1)!1"!1!1!1 !1!1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1z 1s 1l 1e 1^ 1W 1P 1I 1B 1; 14 1- 1& 1 1 1 1 1 1111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1y 1r 1k 1d 1] 1V 1O 1H 1A 1: 13 1, 1% 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1} 1v 1o 1h 1a 1Z 1S 1L 1E 1> 17 10 1) 1" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1z 1s 1l 1e 1^ 1W 1P 1I 1B 1; 14 1- 1& 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1~ 1w 1p 1i 1b 1[ 1T 1M 1F 1? 18 11 1* 1# 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1{ 1t 1m 1f 1_ 1X 1Q 1J 1C 1< 15 1. 1' 1 1 1 1 1 11111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 111111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 111111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 111111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000߿0ؿ0ѿ0ʿ0ÿ0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 0000000ܾ0վ0ξ0Ǿ00000000000z0s0l0e0^0W0P0I0B0;040-0&0000 0000000ٽ0ҽ0˽0Ľ0000000000~0w0p0i0b0[0T0M0F0?08010*0#0000000000ݼ0ּ0ϼ0ȼ00000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 0000000ڻ0ӻ0̻0Ż00000000000x0q0j0c0\0U0N0G0@09020+0$0000000000޺0׺0к0ɺ0º0000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 0000000۹0Թ0͹0ƹ00000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000߸0ظ0Ѹ0ʸ0ø0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 0000000ܷ0շ0η0Ƿ00000000000z0s0l0e0^0W0P0I0B0;040-0&0000 0000000ٶ0Ҷ0˶0Ķ0000000000~0w0p0i0b0[0T0M0F0?08010*0#0000000000ݵ0ֵ0ϵ0ȵ00000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 0000000ڴ0Ӵ0̴0Ŵ00000000000x0q0j0c0\0U0N0G0@09020+0$0000000000޳0׳0г0ɳ0³0000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 0000000۲0Բ0Ͳ0Ʋ00000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000߱0ر0ѱ0ʱ0ñ0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 0000000ܰ0հ0ΰ0ǰ00000000000z0s0l0e0^0W0P0I0B0;040-0&0000 0000000ٯ0ү0˯0į0000000000~0w0p0i0b0[0T0M0F0?08010*0#0000000000ݮ0֮0Ϯ0Ȯ00000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 0000000ڭ0ӭ0̭0ŭ00000000000x0q0j0c0\0U0N0G0@09020+0$0000000000ެ0׬0Ь0ɬ0¬0000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 0000000۫0ԫ0ͫ0ƫ00000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000ߪ0ت0Ѫ0ʪ0ê0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 0000000ܩ0թ0Ω0ǩ00000000000z0s0l0e0^0W0P0I0B0;040-0&0000 0000000٨0Ҩ0˨0Ĩ0000000000~0w0p0i0b0[0T0M0F0?08010*0#0000000000ݧ0֧0ϧ0ȧ00000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 0000000ڦ0Ӧ0̦0Ŧ00000000000x0q0j0c0\0U0N0G0@09020+0$0000000000ޥ0ץ0Х0ɥ0¥0000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 0000000ۤ0Ԥ0ͤ0Ƥ00000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000ߣ0أ0ѣ0ʣ0ã0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 0000000ܢ0բ0΢0Ǣ00000000000z0s0l0e0^0W0P0I0B0;040-0&0000 0000000١0ҡ0ˡ0ġ0000000000~0w0p0i0b0[0T0M0F0?08010*0#0000000000ݠ0֠0Ϡ0Ƞ00000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 0000000ڟ0ӟ0̟0ş00000000000x0q0j0c0\0U0N0G0@09020+0$0000000000ޞ0מ0О0ɞ0ž0000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 0000000۝0ԝ0͝0Ɲ00000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000ߜ0؜0ќ0ʜ0Ü0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 0000000ܛ0՛0Λ0Ǜ00000000000z0s0l0e0^0W0P0I0B0;040-0&0000 0000000ٚ0Қ0˚0Ě0000000000~0w0p0i0b0[0T0M0F0?08010*0#0000000000ݙ0֙0ϙ0ș00000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 0000000ژ0Ә0̘0Ř00000000000x0q0j0c0\0U0N0G0@09020+0$0000000000ޗ0ח0З0ɗ0—0000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 0000000ۖ0Ԗ0͖0Ɩ00000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000ߕ0ؕ0ѕ0ʕ0Õ0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 0000000ܔ0Ք0Δ0ǔ00000000000z0s0l0e0^0W0P0I0B0;040-0&0000 0000000ٓ0ғ0˓0ē0000000000~0w0p0i0b0[0T0M0F0?08010*0#0000000000ݒ0֒0ϒ0Ȓ00000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 0000000ڑ0ӑ0̑0ő00000000000x0q0j0c0\0U0N0G0@09020+0$0000000000ސ0א0А0ɐ00000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 0000000ۏ0ԏ0͏0Ə00000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000ߎ0؎0ю0ʎ0Î0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 0000000܍0Ս0΍0Ǎ00000000000z0s0l0e0^0W0P0I0B0;040-0&0000 0000000ٌ0Ҍ0ˌ0Č0000000000~0w0p0i0b0[0T0M0F0?08010*0#0000000000݋0֋0ϋ0ȋ00000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 0000000ڊ0ӊ0̊0Ŋ00000000000x0q0j0c0\0U0N0G0@09020+0$0000000000މ0׉0Љ0ɉ0‰0000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 0000000ۈ0Ԉ0͈0ƈ00000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000߇0؇0ч0ʇ0Ç0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 0000000܆0Ն0Ά0dž00000000000z0s0l0e0^0W0P0I0B0;040-0&0000 0000000م0҅0˅0ą0000000000~0w0p0i0b0[0T0M0F0?08010*0#0000000000݄0ք0τ0Ȅ00000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 0000000ڃ0Ӄ0̃0Ń00000000000x0q0j0c0\0U0N0G0@09020+0$0000000000ނ0ׂ0Ђ0ɂ0‚0000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 0000000ہ0ԁ0́0Ɓ00000000000y0r0k0d0]0V0O0H0A0:030,0%0000 000000߀0؀0р0ʀ0À0000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~~0w~0p~0i~0b~0[~0T~0M~0F~0?~08~01~0*~0#~0~0~0~0~0~0}0}0}0}0}0}0}0}0}0}0}0}0}0}0}0}0}0}0{}0t}0m}0f}0_}0X}0Q}0J}0C}0<}05}0.}0'}0 }0}0}0 }0}0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x|0q|0j|0c|0\|0U|0N|0G|0@|09|02|0+|0$|0|0|0|0|0|0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0|{0u{0n{0g{0`{0Y{0R{0K{0D{0={06{0/{0({0!{0{0{0 {0{0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0yz0rz0kz0dz0]z0Vz0Oz0Hz0Az0:z03z0,z0%z0z0z0z0 z0z0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0}y0vy0oy0hy0ay0Zy0Sy0Ly0Ey0>y07y00y0)y0"y0y0y0 y0y0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0zx0sx0lx0ex0^x0Wx0Px0Ix0Bx0;x04x0-x0&x0x0x0x0 x0x0w0w0w0w0w0w0w0w0w0w0w0w0w0w0w0w0w0w0~w0ww0pw0iw0bw0[w0Tw0Mw0Fw0?w08w01w0*w0#w0w0w0w0w0w0v0v0v0v0v0v0v0v0v0v0v0v0v0v0v0v0v0v0{v0tv0mv0fv0_v0Xv0Qv0Jv0Cv0r07r00r0)r0"r0r0r0 r0r0q0q0q0q0q0q0q0q0q0q0q0q0q0q0q0q0q0q0q0zq0sq0lq0eq0^q0Wq0Pq0Iq0Bq0;q04q0-q0&q0q0q0q0 q0q0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0~p0wp0pp0ip0bp0[p0Tp0Mp0Fp0?p08p01p0*p0#p0p0p0p0p0p0o0o0o0o0o0o0o0o0o0o0o0o0o0o0o0o0o0o0{o0to0mo0fo0_o0Xo0Qo0Jo0Co0k07k00k0)k0"k0k0k0 k0k0j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0zj0sj0lj0ej0^j0Wj0Pj0Ij0Bj0;j04j0-j0&j0j0j0j0 j0j0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0~i0wi0pi0ii0bi0[i0Ti0Mi0Fi0?i08i01i0*i0#i0i0i0i0i0i0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0{h0th0mh0fh0_h0Xh0Qh0Jh0Ch0d07d00d0)d0"d0d0d0 d0d0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0zc0sc0lc0ec0^c0Wc0Pc0Ic0Bc0;c04c0-c0&c0c0c0c0 c0c0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0~b0wb0pb0ib0bb0[b0Tb0Mb0Fb0?b08b01b0*b0#b0b0b0b0b0b0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0{a0ta0ma0fa0_a0Xa0Qa0Ja0Ca0]07]00]0)]0"]0]0]0 ]0]0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0z\0s\0l\0e\0^\0W\0P\0I\0B\0;\04\0-\0&\0\0\0\0 \0\0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0[0~[0w[0p[0i[0b[0[[0T[0M[0F[0?[08[01[0*[0#[0[0[0[0[0[0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0{Z0tZ0mZ0fZ0_Z0XZ0QZ0JZ0CZ0V07V00V0)V0"V0V0V0 V0V0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0U0zU0sU0lU0eU0^U0WU0PU0IU0BU0;U04U0-U0&U0U0U0U0 U0U0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0~T0wT0pT0iT0bT0[T0TT0MT0FT0?T08T01T0*T0#T0T0T0T0T0T0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0{S0tS0mS0fS0_S0XS0QS0JS0CS0O07O00O0)O0"O0O0O0 O0O0N0N0N0N0N0N0N0N0N0N0N0N0N0N0N0N0N0N0N0zN0sN0lN0eN0^N0WN0PN0IN0BN0;N04N0-N0&N0N0N0N0 N0N0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0~M0wM0pM0iM0bM0[M0TM0MM0FM0?M08M01M0*M0#M0M0M0M0M0M0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L0{L0tL0mL0fL0_L0XL0QL0JL0CL0H07H00H0)H0"H0H0H0 H0H0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0G0zG0sG0lG0eG0^G0WG0PG0IG0BG0;G04G0-G0&G0G0G0G0 G0G0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0~F0wF0pF0iF0bF0[F0TF0MF0FF0?F08F01F0*F0#F0F0F0F0F0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0{E0tE0mE0fE0_E0XE0QE0JE0CE0A07A00A0)A0"A0A0A0 A0A0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0z@0s@0l@0e@0^@0W@0P@0I@0B@0;@04@0-@0&@0@0@0@0 @0@0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0~?0w?0p?0i?0b?0[?0T?0M?0F?0??08?01?0*?0#?0?0?0?0?0?0>0>0>0>0>0>0>0>0>0>0>0>0>0>0>0>0>0>0{>0t>0m>0f>0_>0X>0Q>0J>0C>0<>05>0.>0'>0 >0>0>0 >0>0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0x=0q=0j=0c=0\=0U=0N=0G=0@=09=02=0+=0$=0=0=0=0=0=0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0|<0u<0n<0g<0`<0Y<0R<0K<0D<0=<06<0/<0(<0!<0<0<0 <0<0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0y;0r;0k;0d;0];0V;0O;0H;0A;0:;03;0,;0%;0;0;0;0 ;0;0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0}:0v:0o:0h:0a:0Z:0S:0L:0E:0>:07:00:0):0":0:0:0 :0:090909090909090909090909090909090909090z90s90l90e90^90W90P90I90B90;90490-90&90909090 9090808080808080808080808080808080808080~80w80p80i80b80[80T80M80F80?80880180*80#808080808080707070707070707070707070707070707070{70t70m70f70_70X70Q70J70C70<70570.70'70 707070 707060606060606060606060606060606060606060x60q60j60c60\60U60N60G60@60960260+60$606060606060505050505050505050505050505050505050|50u50n50g50`50Y50R50K50D50=50650/50(50!505050 505040404040404040404040404040404040404040y40r40k40d40]40V40O40H40A40:40340,40%40404040 4040303030303030303030303030303030303030}30v30o30h30a30Z30S30L30E30>30730030)30"303030 303020202020202020202020202020202020202020z20s20l20e20^20W20P20I20B20;20420-20&20202020 2020101010101010101010101010101010101010~10w10p10i10b10[10T10M10F10?10810110*10#101010101010000000000000000000000000000000000000{00t00m00f00_00X00Q00J00C00<00500.00'00 000000 0000/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0x/0q/0j/0c/0\/0U/0N/0G/0@/09/02/0+/0$/0/0/0/0/0/0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0|.0u.0n.0g.0`.0Y.0R.0K.0D.0=.06.0/.0(.0!.0.0.0 .0.0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0y-0r-0k-0d-0]-0V-0O-0H-0A-0:-03-0,-0%-0-0-0-0 -0-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0v,0o,0h,0a,0Z,0S,0L,0E,0>,07,00,0),0",0,0,0 ,0,0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0z+0s+0l+0e+0^+0W+0P+0I+0B+0;+04+0-+0&+0+0+0+0 +0+0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0~*0w*0p*0i*0b*0[*0T*0M*0F*0?*08*01*0**0#*0*0*0*0*0*0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0{)0t)0m)0f)0_)0X)0Q)0J)0C)0<)05)0.)0')0 )0)0)0 )0)0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0x(0q(0j(0c(0\(0U(0N(0G(0@(09(02(0+(0$(0(0(0(0(0(0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0|'0u'0n'0g'0`'0Y'0R'0K'0D'0='06'0/'0('0!'0'0'0 '0'0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0y&0r&0k&0d&0]&0V&0O&0H&0A&0:&03&0,&0%&0&0&0&0 &0&0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0}%0v%0o%0h%0a%0Z%0S%0L%0E%0>%07%00%0)%0"%0%0%0 %0%0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0z$0s$0l$0e$0^$0W$0P$0I$0B$0;$04$0-$0&$0$0$0$0 $0$0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0~#0w#0p#0i#0b#0[#0T#0M#0F#0?#08#01#0*#0##0#0#0#0#0#0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0{"0t"0m"0f"0_"0X"0Q"0J"0C"0<"05"0."0'"0 "0"0"0 "0"0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0x!0q!0j!0c!0\!0U!0N!0G!0@!09!02!0+!0$!0!0!0!0!0!0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0u 0n 0g 0` 0Y 0R 0K 0D 0= 06 0/ 0( 0! 0 0 0 0 00000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0{ 0t 0m 0f 0_ 0X 0Q 0J 0C 0< 05 0. 0' 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x 0q 0j 0c 0\ 0U 0N 0G 0@ 09 02 0+ 0$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0u 0n 0g 0` 0Y 0R 0K 0D 0= 06 0/ 0( 0! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0y 0r 0k 0d 0] 0V 0O 0H 0A 0: 03 0, 0% 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 0v 0o 0h 0a 0Z 0S 0L 0E 0> 07 00 0) 0" 0 0 0 0 00000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 000000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 000000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 000000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// ///////ܻ/ջ/λ/ǻ///////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ///////ٺ/Һ/˺/ĺ//////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////////ݹ/ֹ/Ϲ/ȹ///////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// ///////ܴ/մ/δ/Ǵ///////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ///////ٳ/ҳ/˳/ij//////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////////ݲ/ֲ/ϲ/Ȳ///////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// ///////ܭ/խ/έ/ǭ///////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ///////٬/Ҭ/ˬ/Ĭ//////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////////ݫ/֫/ϫ/ȫ///////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// ///////ܦ/զ/Φ/Ǧ///////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ///////٥/ҥ/˥/ĥ//////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////////ݤ/֤/Ϥ/Ȥ///////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// ///////ܟ/՟/Ο/ǟ///////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ///////ٞ/Ҟ/˞/Ğ//////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////////ݝ/֝/ϝ/ȝ///////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// ///////ܘ/՘/Θ/ǘ///////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ///////ٗ/җ/˗/ė//////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////////ݖ/֖/ϖ/Ȗ///////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// ///////ܑ/Ց/Α/Ǒ///////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ///////ِ/Ґ/ː/Đ//////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////////ݏ/֏/Ϗ/ȏ///////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// ///////܊/Պ/Ί/NJ///////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ///////ى/҉/ˉ/ĉ//////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////////݈/ֈ/ψ/Ȉ///////////{/t/m/f/_/X/Q/J/C//7/0/)/"/// ///////܃/Ճ/΃/ǃ///////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ///////ق/҂/˂/Ă//////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////////݁/ց/ρ/ȁ///////////{/t/m/f/_/X/Q/J/C/}/7}/0}/)}/"}/}/}/ }/}/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/|/z|/s|/l|/e|/^|/W|/P|/I|/B|/;|/4|/-|/&|/|/|/|/ |/|/{/{/{/{/{/{/{/{/{/{/{/{/{/{/{/{/{/{/~{/w{/p{/i{/b{/[{/T{/M{/F{/?{/8{/1{/*{/#{/{/{/{/{/{/z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/{z/tz/mz/fz/_z/Xz/Qz/Jz/Cz/v/7v/0v/)v/"v/v/v/ v/v/u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/u/zu/su/lu/eu/^u/Wu/Pu/Iu/Bu/;u/4u/-u/&u/u/u/u/ u/u/t/t/t/t/t/t/t/t/t/t/t/t/t/t/t/t/t/t/~t/wt/pt/it/bt/[t/Tt/Mt/Ft/?t/8t/1t/*t/#t/t/t/t/t/t/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/{s/ts/ms/fs/_s/Xs/Qs/Js/Cs/o/7o/0o/)o/"o/o/o/ o/o/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/zn/sn/ln/en/^n/Wn/Pn/In/Bn/;n/4n/-n/&n/n/n/n/ n/n/m/m/m/m/m/m/m/m/m/m/m/m/m/m/m/m/m/m/~m/wm/pm/im/bm/[m/Tm/Mm/Fm/?m/8m/1m/*m/#m/m/m/m/m/m/l/l/l/l/l/l/l/l/l/l/l/l/l/l/l/l/l/l/{l/tl/ml/fl/_l/Xl/Ql/Jl/Cl/h/7h/0h/)h/"h/h/h/ h/h/g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/g/zg/sg/lg/eg/^g/Wg/Pg/Ig/Bg/;g/4g/-g/&g/g/g/g/ g/g/f/f/f/f/f/f/f/f/f/f/f/f/f/f/f/f/f/f/~f/wf/pf/if/bf/[f/Tf/Mf/Ff/?f/8f/1f/*f/#f/f/f/f/f/f/e/e/e/e/e/e/e/e/e/e/e/e/e/e/e/e/e/e/{e/te/me/fe/_e/Xe/Qe/Je/Ce/a/7a/0a/)a/"a/a/a/ a/a/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/`/z`/s`/l`/e`/^`/W`/P`/I`/B`/;`/4`/-`/&`/`/`/`/ `/`/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/~_/w_/p_/i_/b_/[_/T_/M_/F_/?_/8_/1_/*_/#_/_/_/_/_/_/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/{^/t^/m^/f^/_^/X^/Q^/J^/C^/<^/5^/.^/'^/ ^/^/^/ ^/^/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/]/x]/q]/j]/c]/\]/U]/N]/G]/@]/9]/2]/+]/$]/]/]/]/]/]/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|\/u\/n\/g\/`\/Y\/R\/K\/D\/=\/6\//\/(\/!\/\/\/ \/\/[/[/[/[/[/[/[/[/[/[/[/[/[/[/[/[/[/[/[/y[/r[/k[/d[/][/V[/O[/H[/A[/:[/3[/,[/%[/[/[/[/ [/[/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/Z/}Z/vZ/oZ/hZ/aZ/ZZ/SZ/LZ/EZ/>Z/7Z/0Z/)Z/"Z/Z/Z/ Z/Z/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/zY/sY/lY/eY/^Y/WY/PY/IY/BY/;Y/4Y/-Y/&Y/Y/Y/Y/ Y/Y/X/X/X/X/X/X/X/X/X/X/X/X/X/X/X/X/X/X/~X/wX/pX/iX/bX/[X/TX/MX/FX/?X/8X/1X/*X/#X/X/X/X/X/X/W/W/W/W/W/W/W/W/W/W/W/W/W/W/W/W/W/W/{W/tW/mW/fW/_W/XW/QW/JW/CW/S/7S/0S/)S/"S/S/S/ S/S/R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/R/zR/sR/lR/eR/^R/WR/PR/IR/BR/;R/4R/-R/&R/R/R/R/ R/R/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/Q/~Q/wQ/pQ/iQ/bQ/[Q/TQ/MQ/FQ/?Q/8Q/1Q/*Q/#Q/Q/Q/Q/Q/Q/P/P/P/P/P/P/P/P/P/P/P/P/P/P/P/P/P/P/{P/tP/mP/fP/_P/XP/QP/JP/CP/

    L/7L/0L/)L/"L/L/L/ L/L/K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/K/zK/sK/lK/eK/^K/WK/PK/IK/BK/;K/4K/-K/&K/K/K/K/ K/K/J/J/J/J/J/J/J/J/J/J/J/J/J/J/J/J/J/J/~J/wJ/pJ/iJ/bJ/[J/TJ/MJ/FJ/?J/8J/1J/*J/#J/J/J/J/J/J/I/I/I/I/I/I/I/I/I/I/I/I/I/I/I/I/I/I/{I/tI/mI/fI/_I/XI/QI/JI/CI/E/7E/0E/)E/"E/E/E/ E/E/D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/D/zD/sD/lD/eD/^D/WD/PD/ID/BD/;D/4D/-D/&D/D/D/D/ D/D/C/C/C/C/C/C/C/C/C/C/C/C/C/C/C/C/C/C/~C/wC/pC/iC/bC/[C/TC/MC/FC/?C/8C/1C/*C/#C/C/C/C/C/C/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/{B/tB/mB/fB/_B/XB/QB/JB/CB//>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/}>/v>/o>/h>/a>/Z>/S>/L>/E>/>>/7>/0>/)>/">/>/>/ >/>/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/z=/s=/l=/e=/^=/W=/P=/I=/B=/;=/4=/-=/&=/=/=/=/ =/=/7/77/07/)7/"7/7/7/ 7/7/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6/6/z6/s6/l6/e6/^6/W6/P6/I6/B6/;6/46/-6/&6/6/6/6/ 6/6/5/5/5/5/5/5/5/5/5/5/5/5/5/5/5/5/5/5/~5/w5/p5/i5/b5/[5/T5/M5/F5/?5/85/15/*5/#5/5/5/5/5/5/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/{4/t4/m4/f4/_4/X4/Q4/J4/C4/<4/54/.4/'4/ 4/4/4/ 4/4/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/x3/q3/j3/c3/\3/U3/N3/G3/@3/93/23/+3/$3/3/3/3/3/3/2/2/2/2/2/2/2/2/2/2/2/2/2/2/2/2/2/2/|2/u2/n2/g2/`2/Y2/R2/K2/D2/=2/62//2/(2/!2/2/2/ 2/2/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/y1/r1/k1/d1/]1/V1/O1/H1/A1/:1/31/,1/%1/1/1/1/ 1/1/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/}0/v0/o0/h0/a0/Z0/S0/L0/E0/>0/70/00/)0/"0/0/0/ 0/0///////////////////////////////////////z//s//l//e//^//W//P//I//B//;//4//-//&//////// ////././././././././././././././././././~./w./p./i./b./[./T./M./F./?./8./1./*./#././././././-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/{-/t-/m-/f-/_-/X-/Q-/J-/C-/<-/5-/.-/'-/ -/-/-/ -/-/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/x,/q,/j,/c,/\,/U,/N,/G,/@,/9,/2,/+,/$,/,/,/,/,/,/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/|+/u+/n+/g+/`+/Y+/R+/K+/D+/=+/6+//+/(+/!+/+/+/ +/+/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/y*/r*/k*/d*/]*/V*/O*/H*/A*/:*/3*/,*/%*/*/*/*/ */*/)/)/)/)/)/)/)/)/)/)/)/)/)/)/)/)/)/)/})/v)/o)/h)/a)/Z)/S)/L)/E)/>)/7)/0)/))/")/)/)/ )/)/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/z(/s(/l(/e(/^(/W(/P(/I(/B(/;(/4(/-(/&(/(/(/(/ (/(/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/~'/w'/p'/i'/b'/['/T'/M'/F'/?'/8'/1'/*'/#'/'/'/'/'/'/&/&/&/&/&/&/&/&/&/&/&/&/&/&/&/&/&/&/{&/t&/m&/f&/_&/X&/Q&/J&/C&/<&/5&/.&/'&/ &/&/&/ &/&/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/x%/q%/j%/c%/\%/U%/N%/G%/@%/9%/2%/+%/$%/%/%/%/%/%/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/|$/u$/n$/g$/`$/Y$/R$/K$/D$/=$/6$//$/($/!$/$/$/ $/$/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/y#/r#/k#/d#/]#/V#/O#/H#/A#/:#/3#/,#/%#/#/#/#/ #/#/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/}"/v"/o"/h"/a"/Z"/S"/L"/E"/>"/7"/0"/)"/""/"/"/ "/"/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/z!/s!/l!/e!/^!/W!/P!/I!/B!/;!/4!/-!/&!/!/!/!/ !/!/ / / / / / / / / / / / / / / / / / /~ /w /p /i /b /[ /T /M /F /? /8 /1 /* /# / / / / / ///////////////////{/t/m/f/_/X/Q/J/C/</5/./'/ /// /////////////////////x/q/j/c/\/U/N/G/@/9/2/+/$////////////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// /////////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// ////////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C/</5/./'/ /// /////////////////////x/q/j/c/\/U/N/G/@/9/2/+/$////////////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// /////////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// ////////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C/</5/./'/ /// /////////////////////x/q/j/c/\/U/N/G/@/9/2/+/$////////////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// /////////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// // / / / / / / / / / / / / / / / / / /} /v /o /h /a /Z /S /L /E /> /7 /0 /) /" / / / / / / / / / / / / / / / / / / / / / / / /z /s /l /e /^ /W /P /I /B /; /4 /- /& / / / / / / / / / / / / / / / / / / / / / / / /~ /w /p /i /b /[ /T /M /F /? /8 /1 /* /# / / / / / / / / / / / / / / / / / / / / / / / /{ /t /m /f /_ /X /Q /J /C /< /5 /. /' / / / / / / / / / / / / / / / / / / / / / / / / /x /q /j /c /\ /U /N /G /@ /9 /2 /+ /$ / / / / / ///////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// /////////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// ////////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// /////////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// ////////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#////////////////////////{/t/m/f/_/X/Q/J/C/</5/./'/ /// /////////////////////x/q/j/c/\/U/N/G/@/9/2/+/$////////////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// /////////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......ܿ.տ.ο.ǿ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... .......پ.Ҿ.˾.ľ..........~.w.p.i.b.[.T.M.F.?.8.1.*.#..........ݽ.ֽ.Ͻ.Ƚ...........{.t.m.f._.X.Q.J.C.<.5...'. ... .......ڼ.Ӽ.̼.ż...........x.q.j.c.\.U.N.G.@.9.2.+.$..........޻.׻.л.ɻ.»..........|.u.n.g.`.Y.R.K.D.=.6./.(.!... .......ۺ.Ժ.ͺ.ƺ...........y.r.k.d.].V.O.H.A.:.3.,.%.... ......߹.ع.ѹ.ʹ.ù..........}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......ܸ.ո.θ.Ǹ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... .......ٷ.ҷ.˷.ķ..........~.w.p.i.b.[.T.M.F.?.8.1.*.#..........ݶ.ֶ.϶.ȶ...........{.t.m.f._.X.Q.J.C.<.5...'. ... .......ڵ.ӵ.̵.ŵ...........x.q.j.c.\.U.N.G.@.9.2.+.$..........޴.״.д.ɴ.´..........|.u.n.g.`.Y.R.K.D.=.6./.(.!... .......۳.Գ.ͳ.Ƴ...........y.r.k.d.].V.O.H.A.:.3.,.%.... ......߲.ز.Ѳ.ʲ.ò..........}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......ܱ.ձ.α.DZ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... .......ٰ.Ұ.˰.İ..........~.w.p.i.b.[.T.M.F.?.8.1.*.#..........ݯ.֯.ϯ.ȯ...........{.t.m.f._.X.Q.J.C.<.5...'. ... .......ڮ.Ӯ.̮.Ů...........x.q.j.c.\.U.N.G.@.9.2.+.$..........ޭ.׭.Э.ɭ.­..........|.u.n.g.`.Y.R.K.D.=.6./.(.!... .......۬.Ԭ.ͬ.Ƭ...........y.r.k.d.].V.O.H.A.:.3.,.%.... ......߫.ث.ѫ.ʫ.ë..........}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......ܪ.ժ.Ϊ.Ǫ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... .......٩.ҩ.˩.ĩ..........~.w.p.i.b.[.T.M.F.?.8.1.*.#..........ݨ.֨.Ϩ.Ȩ...........{.t.m.f._.X.Q.J.C.<.5...'. ... .......ڧ.ӧ.̧.ŧ...........x.q.j.c.\.U.N.G.@.9.2.+.$..........ަ.צ.Ц.ɦ.¦..........|.u.n.g.`.Y.R.K.D.=.6./.(.!... .......ۥ.ԥ.ͥ.ƥ...........y.r.k.d.].V.O.H.A.:.3.,.%.... ......ߤ.ؤ.Ѥ.ʤ.ä..........}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......ܣ.գ.Σ.ǣ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... .......٢.Ң.ˢ.Ģ..........~.w.p.i.b.[.T.M.F.?.8.1.*.#..........ݡ.֡.ϡ.ȡ...........{.t.m.f._.X.Q.J.C.<.5...'. ... .......ڠ.Ӡ.̠.Š...........x.q.j.c.\.U.N.G.@.9.2.+.$..........ޟ.ן.П.ɟ.Ÿ..........|.u.n.g.`.Y.R.K.D.=.6./.(.!... .......۞.Ԟ.͞.ƞ...........y.r.k.d.].V.O.H.A.:.3.,.%.... ......ߝ.؝.ѝ.ʝ.Ý..........}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......ܜ.՜.Μ.ǜ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... .......ٛ.қ.˛.ě..........~.w.p.i.b.[.T.M.F.?.8.1.*.#..........ݚ.֚.Ϛ.Ț...........{.t.m.f._.X.Q.J.C.<.5...'. ... .......ڙ.ә.̙.ř...........x.q.j.c.\.U.N.G.@.9.2.+.$..........ޘ.ט.И.ɘ.˜..........|.u.n.g.`.Y.R.K.D.=.6./.(.!... .......ۗ.ԗ.͗.Ɨ...........y.r.k.d.].V.O.H.A.:.3.,.%.... ......ߖ.ؖ.і.ʖ.Ö..........}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......ܕ.Օ.Ε.Ǖ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... .......ٔ.Ҕ.˔.Ĕ..........~.w.p.i.b.[.T.M.F.?.8.1.*.#..........ݓ.֓.ϓ.ȓ...........{.t.m.f._.X.Q.J.C.<.5...'. ... .......ڒ.Ӓ.̒.Œ...........x.q.j.c.\.U.N.G.@.9.2.+.$..........ޑ.ב.Б.ɑ.‘..........|.u.n.g.`.Y.R.K.D.=.6./.(.!... .......ې.Ԑ.͐.Ɛ...........y.r.k.d.].V.O.H.A.:.3.,.%.... ......ߏ.؏.я.ʏ.Ï..........}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......܎.Վ.Ύ.ǎ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... .......ٍ.ҍ.ˍ.č..........~.w.p.i.b.[.T.M.F.?.8.1.*.#..........݌.֌.ό.Ȍ...........{.t.m.f._.X.Q.J.C.<.5...'. ... .......ڋ.Ӌ.̋.ŋ...........x.q.j.c.\.U.N.G.@.9.2.+.$..........ފ.׊.Њ.Ɋ.Š..........|.u.n.g.`.Y.R.K.D.=.6./.(.!... .......ۉ.ԉ.͉.Ɖ...........y.r.k.d.].V.O.H.A.:.3.,.%.... ......߈.؈.ш.ʈ.È..........}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......܇.Շ.·.LJ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... .......ن.҆.ˆ.Ć..........~.w.p.i.b.[.T.M.F.?.8.1.*.#..........݅.օ.υ.ȅ...........{.t.m.f._.X.Q.J.C.<.5...'. ... .......ڄ.ӄ.̄.ń...........x.q.j.c.\.U.N.G.@.9.2.+.$..........ރ.׃.Ѓ.Ƀ.ƒ..........|.u.n.g.`.Y.R.K.D.=.6./.(.!... .......ۂ.Ԃ.͂.Ƃ...........y.r.k.d.].V.O.H.A.:.3.,.%.... ......߁.؁.с.ʁ.Á..........}.v.o.h.a.Z.S.L.E.>.7.0.)."... .......܀.Հ.΀.ǀ...........z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#......~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{~.t~.m~.f~._~.X~.Q~.J~.C~.<~.5~..~.'~. ~.~.~. ~.~.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.x}.q}.j}.c}.\}.U}.N}.G}.@}.9}.2}.+}.$}.}.}.}.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.||.u|.n|.g|.`|.Y|.R|.K|.D|.=|.6|./|.(|.!|.|.|. |.|.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.y{.r{.k{.d{.]{.V{.O{.H{.A{.:{.3{.,{.%{.{.{.{. {.{.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.}z.vz.oz.hz.az.Zz.Sz.Lz.Ez.>z.7z.0z.)z."z.z.z. z.z.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.zy.sy.ly.ey.^y.Wy.Py.Iy.By.;y.4y.-y.&y.y.y.y. y.y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.~x.wx.px.ix.bx.[x.Tx.Mx.Fx.?x.8x.1x.*x.#x.x.x.x.x.x.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.{w.tw.mw.fw._w.Xw.Qw.Jw.Cw.s.7s.0s.)s."s.s.s. s.s.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.zr.sr.lr.er.^r.Wr.Pr.Ir.Br.;r.4r.-r.&r.r.r.r. r.r.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.~q.wq.pq.iq.bq.[q.Tq.Mq.Fq.?q.8q.1q.*q.#q.q.q.q.q.q.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.{p.tp.mp.fp._p.Xp.Qp.Jp.Cp.l.7l.0l.)l."l.l.l. l.l.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.zk.sk.lk.ek.^k.Wk.Pk.Ik.Bk.;k.4k.-k.&k.k.k.k. k.k.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.~j.wj.pj.ij.bj.[j.Tj.Mj.Fj.?j.8j.1j.*j.#j.j.j.j.j.j.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.{i.ti.mi.fi._i.Xi.Qi.Ji.Ci.e.7e.0e.)e."e.e.e. e.e.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.zd.sd.ld.ed.^d.Wd.Pd.Id.Bd.;d.4d.-d.&d.d.d.d. d.d.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.~c.wc.pc.ic.bc.[c.Tc.Mc.Fc.?c.8c.1c.*c.#c.c.c.c.c.c.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.{b.tb.mb.fb._b.Xb.Qb.Jb.Cb.^.7^.0^.)^."^.^.^. ^.^.].].].].].].].].].].].].].].].].].].].z].s].l].e].^].W].P].I].B].;].4].-].&].].].]. ].].\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.~\.w\.p\.i\.b\.[\.T\.M\.F\.?\.8\.1\.*\.#\.\.\.\.\.\.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.{[.t[.m[.f[._[.X[.Q[.J[.C[.<[.5[..[.'[. [.[.[. [.[.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.xZ.qZ.jZ.cZ.\Z.UZ.NZ.GZ.@Z.9Z.2Z.+Z.$Z.Z.Z.Z.Z.Z.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.|Y.uY.nY.gY.`Y.YY.RY.KY.DY.=Y.6Y./Y.(Y.!Y.Y.Y. Y.Y.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.yX.rX.kX.dX.]X.VX.OX.HX.AX.:X.3X.,X.%X.X.X.X. X.X.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.}W.vW.oW.hW.aW.ZW.SW.LW.EW.>W.7W.0W.)W."W.W.W. W.W.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.zV.sV.lV.eV.^V.WV.PV.IV.BV.;V.4V.-V.&V.V.V.V. V.V.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.~U.wU.pU.iU.bU.[U.TU.MU.FU.?U.8U.1U.*U.#U.U.U.U.U.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.{T.tT.mT.fT._T.XT.QT.JT.CT.P.7P.0P.)P."P.P.P. P.P.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.zO.sO.lO.eO.^O.WO.PO.IO.BO.;O.4O.-O.&O.O.O.O. O.O.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.~N.wN.pN.iN.bN.[N.TN.MN.FN.?N.8N.1N.*N.#N.N.N.N.N.N.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.{M.tM.mM.fM._M.XM.QM.JM.CM.I.7I.0I.)I."I.I.I. I.I.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.zH.sH.lH.eH.^H.WH.PH.IH.BH.;H.4H.-H.&H.H.H.H. H.H.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.~G.wG.pG.iG.bG.[G.TG.MG.FG.?G.8G.1G.*G.#G.G.G.G.G.G.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.{F.tF.mF.fF._F.XF.QF.JF.CF.B.7B.0B.)B."B.B.B. B.B.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.zA.sA.lA.eA.^A.WA.PA.IA.BA.;A.4A.-A.&A.A.A.A. A.A.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.~@.w@.p@.i@.b@.[@.T@.M@.F@.?@.8@.1@.*@.#@.@.@.@.@.@.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.{?.t?.m?.f?._?.X?.Q?.J?.C?..>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.x>.q>.j>.c>.\>.U>.N>.G>.@>.9>.2>.+>.$>.>.>.>.>.>.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.|=.u=.n=.g=.`=.Y=.R=.K=.D=.==.6=./=.(=.!=.=.=. =.=.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.y<.r<.k<.d<.]<.V<.O<.H<.A<.:<.3<.,<.%<.<.<.<. <.<.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.};.v;.o;.h;.a;.Z;.S;.L;.E;.>;.7;.0;.);.";.;.;. ;.;.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.z:.s:.l:.e:.^:.W:.P:.I:.B:.;:.4:.-:.&:.:.:.:. :.:.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.~9.w9.p9.i9.b9.[9.T9.M9.F9.?9.89.19.*9.#9.9.9.9.9.9.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.{8.t8.m8.f8._8.X8.Q8.J8.C8.<8.58..8.'8. 8.8.8. 8.8.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.x7.q7.j7.c7.\7.U7.N7.G7.@7.97.27.+7.$7.7.7.7.7.7.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.|6.u6.n6.g6.`6.Y6.R6.K6.D6.=6.66./6.(6.!6.6.6. 6.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.y5.r5.k5.d5.]5.V5.O5.H5.A5.:5.35.,5.%5.5.5.5. 5.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.}4.v4.o4.h4.a4.Z4.S4.L4.E4.>4.74.04.)4."4.4.4. 4.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.z3.s3.l3.e3.^3.W3.P3.I3.B3.;3.43.-3.&3.3.3.3. 3.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.~2.w2.p2.i2.b2.[2.T2.M2.F2.?2.82.12.*2.#2.2.2.2.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.{1.t1.m1.f1._1.X1.Q1.J1.C1.<1.51..1.'1. 1.1.1. 1.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.x0.q0.j0.c0.\0.U0.N0.G0.@0.90.20.+0.$0.0.0.0.0.0././././././././././././././././././.|/.u/.n/.g/.`/.Y/.R/.K/.D/.=/.6/.//.(/.!/././. /./.......................................y..r..k..d..]..V..O..H..A..:..3..,..%........ ....-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.}-.v-.o-.h-.a-.Z-.S-.L-.E-.>-.7-.0-.)-."-.-.-. -.-.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.z,.s,.l,.e,.^,.W,.P,.I,.B,.;,.4,.-,.&,.,.,.,. ,.,.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.~+.w+.p+.i+.b+.[+.T+.M+.F+.?+.8+.1+.*+.#+.+.+.+.+.+.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.{*.t*.m*.f*._*.X*.Q*.J*.C*.<*.5*..*.'*. *.*.*. *.*.).).).).).).).).).).).).).).).).).).).x).q).j).c).\).U).N).G).@).9).2).+).$).).).).).).(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.|(.u(.n(.g(.`(.Y(.R(.K(.D(.=(.6(./(.((.!(.(.(. (.(.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.y'.r'.k'.d'.]'.V'.O'.H'.A'.:'.3'.,'.%'.'.'.'. '.'.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.}&.v&.o&.h&.a&.Z&.S&.L&.E&.>&.7&.0&.)&."&.&.&. &.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.z%.s%.l%.e%.^%.W%.P%.I%.B%.;%.4%.-%.&%.%.%.%. %.%.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.~$.w$.p$.i$.b$.[$.T$.M$.F$.?$.8$.1$.*$.#$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.{#.t#.m#.f#._#.X#.Q#.J#.C#.<#.5#..#.'#. #.#.#. #.#.".".".".".".".".".".".".".".".".".".".x".q".j".c".\".U".N".G".@".9".2".+".$".".".".".".!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.|!.u!.n!.g!.`!.Y!.R!.K!.D!.=!.6!./!.(!.!!.!.!. !.!. . . . . . . . . . . . . . . . . . . .y .r .k .d .] .V .O .H .A .: .3 ., .% . . . . . ...................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .. . . . . . . . . . . . . . . . . . . .x .q .j .c .\ .U .N .G .@ .9 .2 .+ .$ . . . . . . . . . . . . . . . . . . . . . . . .| .u .n .g .` .Y .R .K .D .= .6 ./ .( .! . . . . . . . . . . . . . . . . . . . . . . . .y .r .k .d .] .V .O .H .A .: .3 ., .% . . . . . . . . . . . . . . . . . . . . . . . .} .v .o .h .a .Z .S .L .E .> .7 .0 .) ." . . . . . . . . . . . . . . . . . . . . . . . .z .s .l .e .^ .W .P .I .B .; .4 .- .& . . . . . ...................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... .....................x.q.j.c.\.U.N.G.@.9.2.+.$........................|.u.n.g.`.Y.R.K.D.=.6./.(.!... .....................y.r.k.d.].V.O.H.A.:.3.,.%.... ....................}.v.o.h.a.Z.S.L.E.>.7.0.)."... .....................z.s.l.e.^.W.P.I.B.;.4.-.&.... ....................~.w.p.i.b.[.T.M.F.?.8.1.*.#........................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$----------޿-׿-п-ɿ-¿----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- -------۾-Ծ-;-ƾ-----------y-r-k-d-]-V-O-H-A-:-3-,-%---- ------߽-ؽ-ѽ-ʽ-ý----------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -------ܼ-ռ-μ-Ǽ-----------z-s-l-e-^-W-P-I-B-;-4---&---- -------ٻ-һ-˻-Ļ----------~-w-p-i-b-[-T-M-F-?-8-1-*-#----------ݺ-ֺ-Ϻ-Ⱥ-----------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- -------ڹ-ӹ-̹-Ź-----------x-q-j-c-\-U-N-G-@-9-2-+-$----------޸-׸-и-ɸ-¸----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- -------۷-Է-ͷ-Ʒ-----------y-r-k-d-]-V-O-H-A-:-3-,-%---- ------߶-ض-Ѷ-ʶ-ö----------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -------ܵ-յ-ε-ǵ-----------z-s-l-e-^-W-P-I-B-;-4---&---- -------ٴ-Ҵ-˴-Ĵ----------~-w-p-i-b-[-T-M-F-?-8-1-*-#----------ݳ-ֳ-ϳ-ȳ-----------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- -------ڲ-Ӳ-̲-Ų-----------x-q-j-c-\-U-N-G-@-9-2-+-$----------ޱ-ױ-б-ɱ-±----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- -------۰-԰-Ͱ-ư-----------y-r-k-d-]-V-O-H-A-:-3-,-%---- ------߯-د-ѯ-ʯ-ï----------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -------ܮ-ծ-ή-Ǯ-----------z-s-l-e-^-W-P-I-B-;-4---&---- -------٭-ҭ-˭-ĭ----------~-w-p-i-b-[-T-M-F-?-8-1-*-#----------ݬ-֬-Ϭ-Ȭ-----------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- -------ګ-ӫ-̫-ū-----------x-q-j-c-\-U-N-G-@-9-2-+-$----------ު-ת-Ъ-ɪ-ª----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- -------۩-ԩ-ͩ-Ʃ-----------y-r-k-d-]-V-O-H-A-:-3-,-%---- ------ߨ-ب-Ѩ-ʨ-è----------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -------ܧ-է-Χ-ǧ-----------z-s-l-e-^-W-P-I-B-;-4---&---- -------٦-Ҧ-˦-Ħ----------~-w-p-i-b-[-T-M-F-?-8-1-*-#----------ݥ-֥-ϥ-ȥ-----------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- -------ڤ-Ӥ-̤-Ť-----------x-q-j-c-\-U-N-G-@-9-2-+-$----------ޣ-ף-У-ɣ-£----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- -------ۢ-Ԣ-͢-Ƣ-----------y-r-k-d-]-V-O-H-A-:-3-,-%---- ------ߡ-ء-ѡ-ʡ-á----------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -------ܠ-ՠ-Π-Ǡ-----------z-s-l-e-^-W-P-I-B-;-4---&---- -------ٟ-ҟ-˟-ğ----------~-w-p-i-b-[-T-M-F-?-8-1-*-#----------ݞ-֞-Ϟ-Ȟ-----------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- -------ڝ-ӝ-̝-ŝ-----------x-q-j-c-\-U-N-G-@-9-2-+-$----------ޜ-ל-М-ɜ-œ----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- -------ۛ-ԛ-͛-ƛ-----------y-r-k-d-]-V-O-H-A-:-3-,-%---- ------ߚ-ؚ-њ-ʚ-Ú----------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -------ܙ-ՙ-Ι-Ǚ-----------z-s-l-e-^-W-P-I-B-;-4---&---- -------٘-Ҙ-˘-Ę----------~-w-p-i-b-[-T-M-F-?-8-1-*-#----------ݗ-֗-ϗ-ȗ-----------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- -------ږ-Ӗ-̖-Ŗ-----------x-q-j-c-\-U-N-G-@-9-2-+-$----------ޕ-ו-Е-ɕ-•----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- -------۔-Ԕ-͔-Ɣ-----------y-r-k-d-]-V-O-H-A-:-3-,-%---- ------ߓ-ؓ-ѓ-ʓ-Ó----------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -------ܒ-Ւ-Β-ǒ-----------z-s-l-e-^-W-P-I-B-;-4---&---- -------ّ-ґ-ˑ-đ----------~-w-p-i-b-[-T-M-F-?-8-1-*-#----------ݐ-֐-ϐ-Ȑ-----------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- -------ڏ-ӏ-̏-ŏ-----------x-q-j-c-\-U-N-G-@-9-2-+-$----------ގ-׎-Ў-Ɏ-Ž----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- -------ۍ-ԍ-͍-ƍ-----------y-r-k-d-]-V-O-H-A-:-3-,-%---- ------ߌ-،-ь-ʌ-Ì----------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -------܋-Ջ-΋-Nj-----------z-s-l-e-^-W-P-I-B-;-4---&---- -------ي-Ҋ-ˊ-Ċ----------~-w-p-i-b-[-T-M-F-?-8-1-*-#----------݉-։-ω-ȉ-----------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- -------ڈ-ӈ-̈-ň-----------x-q-j-c-\-U-N-G-@-9-2-+-$----------އ-ׇ-Ї-ɇ-‡----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- -------ۆ-Ԇ-͆-Ɔ-----------y-r-k-d-]-V-O-H-A-:-3-,-%---- ------߅-؅-х-ʅ-Å----------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -------܄-Մ-΄-DŽ-----------z-s-l-e-^-W-P-I-B-;-4---&---- -------ك-҃-˃-ă----------~-w-p-i-b-[-T-M-F-?-8-1-*-#----------݂-ւ-ς-Ȃ-----------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- -------ځ-Ӂ-́-Ł-----------x-q-j-c-\-U-N-G-@-9-2-+-$----------ހ-׀-Ѐ-ɀ-€----------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-}~-v~-o~-h~-a~-Z~-S~-L~-E~->~-7~-0~-)~-"~-~-~- ~-~-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-}-z}-s}-l}-e}-^}-W}-P}-I}-B}-;}-4}--}-&}-}-}-}- }-}-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-~|-w|-p|-i|-b|-[|-T|-M|-F|-?|-8|-1|-*|-#|-|-|-|-|-|-{-{-{-{-{-{-{-{-{-{-{-{-{-{-{-{-{-{-{{-t{-m{-f{-_{-X{-Q{-J{-C{-<{-5{-.{-'{- {-{-{- {-{-z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-z-xz-qz-jz-cz-\z-Uz-Nz-Gz-@z-9z-2z-+z-$z-z-z-z-z-z-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-|y-uy-ny-gy-`y-Yy-Ry-Ky-Dy-=y-6y-/y-(y-!y-y-y- y-y-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-yx-rx-kx-dx-]x-Vx-Ox-Hx-Ax-:x-3x-,x-%x-x-x-x- x-x-w-w-w-w-w-w-w-w-w-w-w-w-w-w-w-w-w-w-}w-vw-ow-hw-aw-Zw-Sw-Lw-Ew->w-7w-0w-)w-"w-w-w- w-w-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-zv-sv-lv-ev-^v-Wv-Pv-Iv-Bv-;v-4v--v-&v-v-v-v- v-v-u-u-u-u-u-u-u-u-u-u-u-u-u-u-u-u-u-u-~u-wu-pu-iu-bu-[u-Tu-Mu-Fu-?u-8u-1u-*u-#u-u-u-u-u-u-t-t-t-t-t-t-t-t-t-t-t-t-t-t-t-t-t-t-{t-tt-mt-ft-_t-Xt-Qt-Jt-Ct-p-7p-0p-)p-"p-p-p- p-p-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-zo-so-lo-eo-^o-Wo-Po-Io-Bo-;o-4o--o-&o-o-o-o- o-o-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-~n-wn-pn-in-bn-[n-Tn-Mn-Fn-?n-8n-1n-*n-#n-n-n-n-n-n-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-{m-tm-mm-fm-_m-Xm-Qm-Jm-Cm-i-7i-0i-)i-"i-i-i- i-i-h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-h-zh-sh-lh-eh-^h-Wh-Ph-Ih-Bh-;h-4h--h-&h-h-h-h- h-h-g-g-g-g-g-g-g-g-g-g-g-g-g-g-g-g-g-g-~g-wg-pg-ig-bg-[g-Tg-Mg-Fg-?g-8g-1g-*g-#g-g-g-g-g-g-f-f-f-f-f-f-f-f-f-f-f-f-f-f-f-f-f-f-{f-tf-mf-ff-_f-Xf-Qf-Jf-Cf-b-7b-0b-)b-"b-b-b- b-b-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-za-sa-la-ea-^a-Wa-Pa-Ia-Ba-;a-4a--a-&a-a-a-a- a-a-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-~`-w`-p`-i`-b`-[`-T`-M`-F`-?`-8`-1`-*`-#`-`-`-`-`-`-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-{_-t_-m_-f_-__-X_-Q_-J_-C_-<_-5_-._-'_- _-_-_- _-_-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-x^-q^-j^-c^-\^-U^-N^-G^-@^-9^-2^-+^-$^-^-^-^-^-^-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-|]-u]-n]-g]-`]-Y]-R]-K]-D]-=]-6]-/]-(]-!]-]-]- ]-]-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-y\-r\-k\-d\-]\-V\-O\-H\-A\-:\-3\-,\-%\-\-\-\- \-\-[-[-[-[-[-[-[-[-[-[-[-[-[-[-[-[-[-[-}[-v[-o[-h[-a[-Z[-S[-L[-E[->[-7[-0[-)[-"[-[-[- [-[-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-zZ-sZ-lZ-eZ-^Z-WZ-PZ-IZ-BZ-;Z-4Z--Z-&Z-Z-Z-Z- Z-Z-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-Y-~Y-wY-pY-iY-bY-[Y-TY-MY-FY-?Y-8Y-1Y-*Y-#Y-Y-Y-Y-Y-Y-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-{X-tX-mX-fX-_X-XX-QX-JX-CX-T-7T-0T-)T-"T-T-T- T-T-S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-S-zS-sS-lS-eS-^S-WS-PS-IS-BS-;S-4S--S-&S-S-S-S- S-S-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-~R-wR-pR-iR-bR-[R-TR-MR-FR-?R-8R-1R-*R-#R-R-R-R-R-R-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-{Q-tQ-mQ-fQ-_Q-XQ-QQ-JQ-CQ-M-7M-0M-)M-"M-M-M- M-M-L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-L-zL-sL-lL-eL-^L-WL-PL-IL-BL-;L-4L--L-&L-L-L-L- L-L-K-K-K-K-K-K-K-K-K-K-K-K-K-K-K-K-K-K-~K-wK-pK-iK-bK-[K-TK-MK-FK-?K-8K-1K-*K-#K-K-K-K-K-K-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-{J-tJ-mJ-fJ-_J-XJ-QJ-JJ-CJ-F-7F-0F-)F-"F-F-F- F-F-E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-E-zE-sE-lE-eE-^E-WE-PE-IE-BE-;E-4E--E-&E-E-E-E- E-E-D-D-D-D-D-D-D-D-D-D-D-D-D-D-D-D-D-D-~D-wD-pD-iD-bD-[D-TD-MD-FD-?D-8D-1D-*D-#D-D-D-D-D-D-C-C-C-C-C-C-C-C-C-C-C-C-C-C-C-C-C-C-{C-tC-mC-fC-_C-XC-QC-JC-CC-?-7?-0?-)?-"?-?-?- ?-?->->->->->->->->->->->->->->->->->->->-z>-s>-l>-e>-^>-W>-P>-I>-B>-;>-4>-->-&>->->->- >->-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-~=-w=-p=-i=-b=-[=-T=-M=-F=-?=-8=-1=-*=-#=-=-=-=-=-=-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-{<-t<-m<-f<-_<-X<-Q<-J<-C<-<<-5<-.<-'<- <-<-<- <-<-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-x;-q;-j;-c;-\;-U;-N;-G;-@;-9;-2;-+;-$;-;-;-;-;-;-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-|:-u:-n:-g:-`:-Y:-R:-K:-D:-=:-6:-/:-(:-!:-:-:- :-:-9-9-9-9-9-9-9-9-9-9-9-9-9-9-9-9-9-9-9-y9-r9-k9-d9-]9-V9-O9-H9-A9-:9-39-,9-%9-9-9-9- 9-9-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-}8-v8-o8-h8-a8-Z8-S8-L8-E8->8-78-08-)8-"8-8-8- 8-8-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-z7-s7-l7-e7-^7-W7-P7-I7-B7-;7-47--7-&7-7-7-7- 7-7-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-~6-w6-p6-i6-b6-[6-T6-M6-F6-?6-86-16-*6-#6-6-6-6-6-6-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-5-{5-t5-m5-f5-_5-X5-Q5-J5-C5-<5-55-.5-'5- 5-5-5- 5-5-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-4-x4-q4-j4-c4-\4-U4-N4-G4-@4-94-24-+4-$4-4-4-4-4-4-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-|3-u3-n3-g3-`3-Y3-R3-K3-D3-=3-63-/3-(3-!3-3-3- 3-3-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-y2-r2-k2-d2-]2-V2-O2-H2-A2-:2-32-,2-%2-2-2-2- 2-2-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-}1-v1-o1-h1-a1-Z1-S1-L1-E1->1-71-01-)1-"1-1-1- 1-1-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-z0-s0-l0-e0-^0-W0-P0-I0-B0-;0-40--0-&0-0-0-0- 0-0-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-~/-w/-p/-i/-b/-[/-T/-M/-F/-?/-8/-1/-*/-#/-/-/-/-/-/-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-{.-t.-m.-f.-_.-X.-Q.-J.-C.-<.-5.-..-'.- .-.-.- .-.---------------------------------------x--q--j--c--\--U--N--G--@--9--2--+--$------------,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-|,-u,-n,-g,-`,-Y,-R,-K,-D,-=,-6,-/,-(,-!,-,-,- ,-,-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-y+-r+-k+-d+-]+-V+-O+-H+-A+-:+-3+-,+-%+-+-+-+- +-+-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-}*-v*-o*-h*-a*-Z*-S*-L*-E*->*-7*-0*-)*-"*-*-*- *-*-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-z)-s)-l)-e)-^)-W)-P)-I)-B)-;)-4)--)-&)-)-)-)- )-)-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-~(-w(-p(-i(-b(-[(-T(-M(-F(-?(-8(-1(-*(-#(-(-(-(-(-(-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-{'-t'-m'-f'-_'-X'-Q'-J'-C'-<'-5'-.'-''- '-'-'- '-'-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-x&-q&-j&-c&-\&-U&-N&-G&-@&-9&-2&-+&-$&-&-&-&-&-&-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-|%-u%-n%-g%-`%-Y%-R%-K%-D%-=%-6%-/%-(%-!%-%-%- %-%-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-y$-r$-k$-d$-]$-V$-O$-H$-A$-:$-3$-,$-%$-$-$-$- $-$-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-}#-v#-o#-h#-a#-Z#-S#-L#-E#->#-7#-0#-)#-"#-#-#- #-#-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-z"-s"-l"-e"-^"-W"-P"-I"-B"-;"-4"--"-&"-"-"-"- "-"-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-~!-w!-p!-i!-b!-[!-T!-M!-F!-?!-8!-1!-*!-#!-!-!-!-!-!- - - - - - - - - - - - - - - - - - -{ -t -m -f -_ -X -Q -J -C -< -5 -. -' - - - - - --------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- -- - - - - - - - - - - - - - - - - - - -z -s -l -e -^ -W -P -I -B -; -4 -- -& - - - - - - - - - - - - - - - - - - - - - - - -~ -w -p -i -b -[ -T -M -F -? -8 -1 -* -# - - - - - - - - - - - - - - - - - - - - - - - -{ -t -m -f -_ -X -Q -J -C -< -5 -. -' - - - - - - - - - - - - - - - - - - - - - - - - -x -q -j -c -\ -U -N -G -@ -9 -2 -+ -$ - - - - - - - - - - - - - - - - - - - - - - - -| -u -n -g -` -Y -R -K -D -= -6 -/ -( -! - - - - --------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- ---------------------z-s-l-e-^-W-P-I-B-;-4---&---- --------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- ---------------------x-q-j-c-\-U-N-G-@-9-2-+-$------------------------|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- ---------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,ٿ,ҿ,˿,Ŀ,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,ݾ,־,Ͼ,Ⱦ,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,ڽ,ӽ,̽,Ž,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,޼,׼,м,ɼ,¼,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,ۻ,Ի,ͻ,ƻ,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,ߺ,غ,Ѻ,ʺ,ú,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,ܹ,չ,ι,ǹ,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,ٸ,Ҹ,˸,ĸ,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,ݷ,ַ,Ϸ,ȷ,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,ڶ,Ӷ,̶,Ŷ,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,޵,׵,е,ɵ,µ,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,۴,Դ,ʹ,ƴ,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,߳,س,ѳ,ʳ,ó,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,ܲ,ղ,β,Dz,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,ٱ,ұ,˱,ı,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,ݰ,ְ,ϰ,Ȱ,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,گ,ӯ,̯,ů,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,ޮ,׮,Ю,ɮ,®,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,ۭ,ԭ,ͭ,ƭ,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,߬,ج,Ѭ,ʬ,ì,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,ܫ,ի,Ϋ,ǫ,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,٪,Ҫ,˪,Ī,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,ݩ,֩,ϩ,ȩ,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,ڨ,Ө,̨,Ũ,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,ާ,ק,Ч,ɧ,§,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,ۦ,Ԧ,ͦ,Ʀ,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,ߥ,إ,ѥ,ʥ,å,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,ܤ,դ,Τ,Ǥ,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,٣,ң,ˣ,ģ,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,ݢ,֢,Ϣ,Ȣ,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,ڡ,ӡ,̡,š,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,ޠ,נ,Р,ɠ, ,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,۟,ԟ,͟,Ɵ,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,ߞ,؞,ў,ʞ,Þ,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,ܝ,՝,Ν,ǝ,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,ٜ,Ҝ,˜,Ĝ,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,ݛ,֛,ϛ,ț,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,ښ,Ӛ,̚,Ś,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,ޙ,י,Й,ə,™,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,ۘ,Ԙ,͘,Ƙ,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,ߗ,ؗ,ї,ʗ,×,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,ܖ,Ֆ,Ζ,ǖ,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,ٕ,ҕ,˕,ĕ,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,ݔ,֔,ϔ,Ȕ,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,ړ,ӓ,̓,œ,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,ޒ,ג,В,ɒ,’,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,ۑ,ԑ,͑,Ƒ,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,ߐ,ؐ,ѐ,ʐ,Ð,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,܏,Տ,Ώ,Ǐ,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,َ,Ҏ,ˎ,Ď,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,ݍ,֍,ύ,ȍ,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,ڌ,ӌ,̌,Ō,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,ދ,׋,Ћ,ɋ,‹,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,ۊ,Ԋ,͊,Ɗ,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,߉,؉,щ,ʉ,É,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,܈,Ո,Έ,Lj,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,ه,҇,ˇ,ć,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,݆,ֆ,φ,Ȇ,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,څ,Ӆ,̅,Ņ,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,ބ,ׄ,Є,Ʉ,„,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,ۃ,ԃ,̓,ƃ,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,߂,؂,т,ʂ,Â,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,܁,Ձ,΁,ǁ,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,ـ,Ҁ,ˀ,Ā,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,x~,q~,j~,c~,\~,U~,N~,G~,@~,9~,2~,+~,$~,~,~,~,~,~,},},},},},},},},},},},},},},},},},},|},u},n},g},`},Y},R},K},D},=},6},/},(},!},},}, },},|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,|,y|,r|,k|,d|,]|,V|,O|,H|,A|,:|,3|,,|,%|,|,|,|, |,|,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,}{,v{,o{,h{,a{,Z{,S{,L{,E{,>{,7{,0{,){,"{,{,{, {,{,z,z,z,z,z,z,z,z,z,z,z,z,z,z,z,z,z,z,z,zz,sz,lz,ez,^z,Wz,Pz,Iz,Bz,;z,4z,-z,&z,z,z,z, z,z,y,y,y,y,y,y,y,y,y,y,y,y,y,y,y,y,y,y,~y,wy,py,iy,by,[y,Ty,My,Fy,?y,8y,1y,*y,#y,y,y,y,y,y,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,{x,tx,mx,fx,_x,Xx,Qx,Jx,Cx,t,7t,0t,)t,"t,t,t, t,t,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,zs,ss,ls,es,^s,Ws,Ps,Is,Bs,;s,4s,-s,&s,s,s,s, s,s,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,~r,wr,pr,ir,br,[r,Tr,Mr,Fr,?r,8r,1r,*r,#r,r,r,r,r,r,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,{q,tq,mq,fq,_q,Xq,Qq,Jq,Cq,m,7m,0m,)m,"m,m,m, m,m,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,zl,sl,ll,el,^l,Wl,Pl,Il,Bl,;l,4l,-l,&l,l,l,l, l,l,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,k,~k,wk,pk,ik,bk,[k,Tk,Mk,Fk,?k,8k,1k,*k,#k,k,k,k,k,k,j,j,j,j,j,j,j,j,j,j,j,j,j,j,j,j,j,j,{j,tj,mj,fj,_j,Xj,Qj,Jj,Cj,f,7f,0f,)f,"f,f,f, f,f,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,ze,se,le,ee,^e,We,Pe,Ie,Be,;e,4e,-e,&e,e,e,e, e,e,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,~d,wd,pd,id,bd,[d,Td,Md,Fd,?d,8d,1d,*d,#d,d,d,d,d,d,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,{c,tc,mc,fc,_c,Xc,Qc,Jc,Cc,_,7_,0_,)_,"_,_,_, _,_,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,z^,s^,l^,e^,^^,W^,P^,I^,B^,;^,4^,-^,&^,^,^,^, ^,^,],],],],],],],],],],],],],],],],],],~],w],p],i],b],[],T],M],F],?],8],1],*],#],],],],],],\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,{\,t\,m\,f\,_\,X\,Q\,J\,C\,<\,5\,.\,'\, \,\,\, \,\,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,x[,q[,j[,c[,\[,U[,N[,G[,@[,9[,2[,+[,$[,[,[,[,[,[,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,|Z,uZ,nZ,gZ,`Z,YZ,RZ,KZ,DZ,=Z,6Z,/Z,(Z,!Z,Z,Z, Z,Z,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,yY,rY,kY,dY,]Y,VY,OY,HY,AY,:Y,3Y,,Y,%Y,Y,Y,Y, Y,Y,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,}X,vX,oX,hX,aX,ZX,SX,LX,EX,>X,7X,0X,)X,"X,X,X, X,X,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,zW,sW,lW,eW,^W,WW,PW,IW,BW,;W,4W,-W,&W,W,W,W, W,W,V,V,V,V,V,V,V,V,V,V,V,V,V,V,V,V,V,V,~V,wV,pV,iV,bV,[V,TV,MV,FV,?V,8V,1V,*V,#V,V,V,V,V,V,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,{U,tU,mU,fU,_U,XU,QU,JU,CU,Q,7Q,0Q,)Q,"Q,Q,Q, Q,Q,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,zP,sP,lP,eP,^P,WP,PP,IP,BP,;P,4P,-P,&P,P,P,P, P,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,~O,wO,pO,iO,bO,[O,TO,MO,FO,?O,8O,1O,*O,#O,O,O,O,O,O,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,{N,tN,mN,fN,_N,XN,QN,JN,CN,J,7J,0J,)J,"J,J,J, J,J,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,zI,sI,lI,eI,^I,WI,PI,II,BI,;I,4I,-I,&I,I,I,I, I,I,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,~H,wH,pH,iH,bH,[H,TH,MH,FH,?H,8H,1H,*H,#H,H,H,H,H,H,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,{G,tG,mG,fG,_G,XG,QG,JG,CG,C,7C,0C,)C,"C,C,C, C,C,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,zB,sB,lB,eB,^B,WB,PB,IB,BB,;B,4B,-B,&B,B,B,B, B,B,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,~A,wA,pA,iA,bA,[A,TA,MA,FA,?A,8A,1A,*A,#A,A,A,A,A,A,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,{@,t@,m@,f@,_@,X@,Q@,J@,C@,<@,5@,.@,'@, @,@,@, @,@,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,x?,q?,j?,c?,\?,U?,N?,G?,@?,9?,2?,+?,$?,?,?,?,?,?,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,|>,u>,n>,g>,`>,Y>,R>,K>,D>,=>,6>,/>,(>,!>,>,>, >,>,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,y=,r=,k=,d=,]=,V=,O=,H=,A=,:=,3=,,=,%=,=,=,=, =,=,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,}<,v<,o<,h<,a<,Z<,S<,L<,E<,><,7<,0<,)<,"<,<,<, <,<,;,;,;,;,;,;,;,;,;,;,;,;,;,;,;,;,;,;,;,z;,s;,l;,e;,^;,W;,P;,I;,B;,;;,4;,-;,&;,;,;,;, ;,;,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,~:,w:,p:,i:,b:,[:,T:,M:,F:,?:,8:,1:,*:,#:,:,:,:,:,:,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,{9,t9,m9,f9,_9,X9,Q9,J9,C9,<9,59,.9,'9, 9,9,9, 9,9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,x8,q8,j8,c8,\8,U8,N8,G8,@8,98,28,+8,$8,8,8,8,8,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,|7,u7,n7,g7,`7,Y7,R7,K7,D7,=7,67,/7,(7,!7,7,7, 7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,y6,r6,k6,d6,]6,V6,O6,H6,A6,:6,36,,6,%6,6,6,6, 6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,}5,v5,o5,h5,a5,Z5,S5,L5,E5,>5,75,05,)5,"5,5,5, 5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,z4,s4,l4,e4,^4,W4,P4,I4,B4,;4,44,-4,&4,4,4,4, 4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,~3,w3,p3,i3,b3,[3,T3,M3,F3,?3,83,13,*3,#3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,{2,t2,m2,f2,_2,X2,Q2,J2,C2,<2,52,.2,'2, 2,2,2, 2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,x1,q1,j1,c1,\1,U1,N1,G1,@1,91,21,+1,$1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,|0,u0,n0,g0,`0,Y0,R0,K0,D0,=0,60,/0,(0,!0,0,0, 0,0,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,/,y/,r/,k/,d/,]/,V/,O/,H/,A/,:/,3/,,/,%/,/,/,/, /,/,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,}.,v.,o.,h.,a.,Z.,S.,L.,E.,>.,7.,0.,).,".,.,., .,.,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,z-,s-,l-,e-,^-,W-,P-,I-,B-,;-,4-,--,&-,-,-,-, -,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,w,,p,,i,,b,,[,,T,,M,,F,,?,,8,,1,,*,,#,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,{+,t+,m+,f+,_+,X+,Q+,J+,C+,<+,5+,.+,'+, +,+,+, +,+,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,x*,q*,j*,c*,\*,U*,N*,G*,@*,9*,2*,+*,$*,*,*,*,*,*,),),),),),),),),),),),),),),),),),),|),u),n),g),`),Y),R),K),D),=),6),/),(),!),),), ),),(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,y(,r(,k(,d(,](,V(,O(,H(,A(,:(,3(,,(,%(,(,(,(, (,(,',',',',',',',',',',',',',',',',',',}',v',o',h',a',Z',S',L',E',>',7',0',)',"',',', ',',&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,z&,s&,l&,e&,^&,W&,P&,I&,B&,;&,4&,-&,&&,&,&,&, &,&,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,~%,w%,p%,i%,b%,[%,T%,M%,F%,?%,8%,1%,*%,#%,%,%,%,%,%,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,{$,t$,m$,f$,_$,X$,Q$,J$,C$,<$,5$,.$,'$, $,$,$, $,$,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,x#,q#,j#,c#,\#,U#,N#,G#,@#,9#,2#,+#,$#,#,#,#,#,#,",",",",",",",",",",",",",",",",",",|",u",n",g",`",Y",R",K",D",=",6",/",(",!",",", ",",!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,y!,r!,k!,d!,]!,V!,O!,H!,A!,:!,3!,,!,%!,!,!,!, !,!, , , , , , , , , , , , , , , , , , ,} ,v ,o ,h ,a ,Z ,S ,L ,E ,> ,7 ,0 ,) ," , , , , ,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,, , , , , , , , , , , , , , , , , , ,| ,u ,n ,g ,` ,Y ,R ,K ,D ,= ,6 ,/ ,( ,! , , , , , , , , , , , , , , , , , , , , , , , ,y ,r ,k ,d ,] ,V ,O ,H ,A ,: ,3 ,, ,% , , , , , , , , , , , , , , , , , , , , , , , ,} ,v ,o ,h ,a ,Z ,S ,L ,E ,> ,7 ,0 ,) ," , , , , , , , , , , , , , , , , , , , , , , , ,z ,s ,l ,e ,^ ,W ,P ,I ,B ,; ,4 ,- ,& , , , , , , , , , , , , , , , , , , , , , , , ,~ ,w ,p ,i ,b ,[ ,T ,M ,F ,? ,8 ,1 ,* ,# , , , , , ,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,,,,,,,,,,,,,,,,,,,,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++ۿ+Կ+Ϳ+ƿ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++߾+ؾ+Ѿ+ʾ+þ++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++ܽ+ս+ν+ǽ+++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ +++++++ټ+Ҽ+˼+ļ++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++ݻ+ֻ+ϻ+Ȼ+++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++ں+Ӻ+̺+ź+++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++޹+׹+й+ɹ+¹++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++۸+Ը+͸+Ƹ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++߷+ط+ѷ+ʷ+÷++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++ܶ+ն+ζ+Ƕ+++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ +++++++ٵ+ҵ+˵+ĵ++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++ݴ+ִ+ϴ+ȴ+++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++ڳ+ӳ+̳+ų+++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++޲+ײ+в+ɲ+²++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++۱+Ա+ͱ+Ʊ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++߰+ذ+Ѱ+ʰ+ð++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++ܯ+կ+ί+ǯ+++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ +++++++ٮ+Ү+ˮ+Į++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++ݭ+֭+ϭ+ȭ+++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++ڬ+Ӭ+̬+Ŭ+++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++ޫ+׫+Ы+ɫ+«++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++۪+Ԫ+ͪ+ƪ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++ߩ+ة+ѩ+ʩ+é++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++ܨ+ը+Ψ+Ǩ+++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ +++++++٧+ҧ+˧+ħ++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++ݦ+֦+Ϧ+Ȧ+++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++ڥ+ӥ+̥+ť+++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++ޤ+פ+Ф+ɤ+¤++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++ۣ+ԣ+ͣ+ƣ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++ߢ+آ+Ѣ+ʢ+â++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++ܡ+ա+Ρ+ǡ+++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ +++++++٠+Ҡ+ˠ+Ġ++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++ݟ+֟+ϟ+ȟ+++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++ڞ+Ӟ+̞+Ş+++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++ޝ+ם+Н+ɝ+++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++ۜ+Ԝ+͜+Ɯ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++ߛ+؛+ћ+ʛ+Û++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++ܚ+՚+Κ+ǚ+++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ +++++++ٙ+ҙ+˙+ę++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++ݘ+֘+Ϙ+Ș+++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++ڗ+ӗ+̗+ŗ+++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++ޖ+ז+Ж+ɖ+–++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++ە+ԕ+͕+ƕ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++ߔ+ؔ+є+ʔ+Ô++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++ܓ+Փ+Γ+Ǔ+++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ +++++++ْ+Ғ+˒+Ē++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++ݑ+֑+ϑ+ȑ+++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++ڐ+Ӑ+̐+Ő+++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++ޏ+׏+Џ+ɏ+++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++ێ+Ԏ+͎+Ǝ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++ߍ+؍+э+ʍ+Í++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++܌+Ռ+Ό+nj+++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ +++++++ً+ҋ+ˋ+ċ++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++݊+֊+ϊ+Ȋ+++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++ډ+Ӊ+̉+ʼn+++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++ވ+׈+Ј+Ɉ+ˆ++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++ۇ+ԇ+͇+Ƈ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++߆+؆+ц+ʆ+Æ++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++܅+Յ+΅+Dž+++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ +++++++ل+҄+˄+Ą++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++݃+փ+σ+ȃ+++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++ڂ+ӂ+̂+ł+++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++ށ+ׁ+Ё+Ɂ+++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++ۀ+Ԁ+̀+ƀ+++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ ++~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+z~+s~+l~+e~+^~+W~+P~+I~+B~+;~+4~+-~+&~+~+~+~+ ~+~+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+~}+w}+p}+i}+b}+[}+T}+M}+F}+?}+8}+1}+*}+#}+}+}+}+}+}+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+{|+t|+m|+f|+_|+X|+Q|+J|+C|+<|+5|+.|+'|+ |+|+|+ |+|+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+x{+q{+j{+c{+\{+U{+N{+G{+@{+9{+2{++{+${+{+{+{+{+{+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+|z+uz+nz+gz+`z+Yz+Rz+Kz+Dz+=z+6z+/z+(z+!z+z+z+ z+z+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+yy+ry+ky+dy+]y+Vy+Oy+Hy+Ay+:y+3y+,y+%y+y+y+y+ y+y+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+}x+vx+ox+hx+ax+Zx+Sx+Lx+Ex+>x+7x+0x+)x+"x+x+x+ x+x+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+zw+sw+lw+ew+^w+Ww+Pw+Iw+Bw+;w+4w+-w+&w+w+w+w+ w+w+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+v+~v+wv+pv+iv+bv+[v+Tv+Mv+Fv+?v+8v+1v+*v+#v+v+v+v+v+v+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+{u+tu+mu+fu+_u+Xu+Qu+Ju+Cu+q+7q+0q+)q+"q+q+q+ q+q+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+zp+sp+lp+ep+^p+Wp+Pp+Ip+Bp+;p+4p+-p+&p+p+p+p+ p+p+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+~o+wo+po+io+bo+[o+To+Mo+Fo+?o+8o+1o+*o+#o+o+o+o+o+o+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+{n+tn+mn+fn+_n+Xn+Qn+Jn+Cn+j+7j+0j+)j+"j+j+j+ j+j+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+zi+si+li+ei+^i+Wi+Pi+Ii+Bi+;i+4i+-i+&i+i+i+i+ i+i+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+~h+wh+ph+ih+bh+[h+Th+Mh+Fh+?h+8h+1h+*h+#h+h+h+h+h+h+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+{g+tg+mg+fg+_g+Xg+Qg+Jg+Cg+c+7c+0c+)c+"c+c+c+ c+c+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+zb+sb+lb+eb+^b+Wb+Pb+Ib+Bb+;b+4b+-b+&b+b+b+b+ b+b+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+~a+wa+pa+ia+ba+[a+Ta+Ma+Fa+?a+8a+1a+*a+#a+a+a+a+a+a+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+{`+t`+m`+f`+_`+X`+Q`+J`+C`+<`+5`+.`+'`+ `+`+`+ `+`+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+x_+q_+j_+c_+\_+U_+N_+G_+@_+9_+2_++_+$_+_+_+_+_+_+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|^+u^+n^+g^+`^+Y^+R^+K^+D^+=^+6^+/^+(^+!^+^+^+ ^+^+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+y]+r]+k]+d]+]]+V]+O]+H]+A]+:]+3]+,]+%]+]+]+]+ ]+]+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+}\+v\+o\+h\+a\+Z\+S\+L\+E\+>\+7\+0\+)\+"\+\+\+ \+\+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+z[+s[+l[+e[+^[+W[+P[+I[+B[+;[+4[+-[+&[+[+[+[+ [+[+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+~Z+wZ+pZ+iZ+bZ+[Z+TZ+MZ+FZ+?Z+8Z+1Z+*Z+#Z+Z+Z+Z+Z+Z+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+{Y+tY+mY+fY+_Y+XY+QY+JY+CY+U+7U+0U+)U+"U+U+U+ U+U+T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+T+zT+sT+lT+eT+^T+WT+PT+IT+BT+;T+4T+-T+&T+T+T+T+ T+T+S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+~S+wS+pS+iS+bS+[S+TS+MS+FS+?S+8S+1S+*S+#S+S+S+S+S+S+R+R+R+R+R+R+R+R+R+R+R+R+R+R+R+R+R+R+{R+tR+mR+fR+_R+XR+QR+JR+CR+N+7N+0N+)N+"N+N+N+ N+N+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+zM+sM+lM+eM+^M+WM+PM+IM+BM+;M+4M+-M+&M+M+M+M+ M+M+L+L+L+L+L+L+L+L+L+L+L+L+L+L+L+L+L+L+~L+wL+pL+iL+bL+[L+TL+ML+FL+?L+8L+1L+*L+#L+L+L+L+L+L+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+{K+tK+mK+fK+_K+XK+QK+JK+CK+G+7G+0G+)G+"G+G+G+ G+G+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+zF+sF+lF+eF+^F+WF+PF+IF+BF+;F+4F+-F+&F+F+F+F+ F+F+E+E+E+E+E+E+E+E+E+E+E+E+E+E+E+E+E+E+~E+wE+pE+iE+bE+[E+TE+ME+FE+?E+8E+1E+*E+#E+E+E+E+E+E+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+{D+tD+mD+fD+_D+XD+QD+JD+CD+@+7@+0@+)@+"@+@+@+ @+@+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+?+z?+s?+l?+e?+^?+W?+P?+I?+B?+;?+4?+-?+&?+?+?+?+ ?+?+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+~>+w>+p>+i>+b>+[>+T>+M>+F>+?>+8>+1>+*>+#>+>+>+>+>+>+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+{=+t=+m=+f=+_=+X=+Q=+J=+C=+<=+5=+.=+'=+ =+=+=+ =+=+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+x<+q<+j<+c<+\<+U<+N<+G<+@<+9<+2<++<+$<+<+<+<+<+<+;+;+;+;+;+;+;+;+;+;+;+;+;+;+;+;+;+;+|;+u;+n;+g;+`;+Y;+R;+K;+D;+=;+6;+/;+(;+!;+;+;+ ;+;+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+y:+r:+k:+d:+]:+V:+O:+H:+A:+::+3:+,:+%:+:+:+:+ :+:+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+}9+v9+o9+h9+a9+Z9+S9+L9+E9+>9+79+09+)9+"9+9+9+ 9+9+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+z8+s8+l8+e8+^8+W8+P8+I8+B8+;8+48+-8+&8+8+8+8+ 8+8+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+~7+w7+p7+i7+b7+[7+T7+M7+F7+?7+87+17+*7+#7+7+7+7+7+7+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+{6+t6+m6+f6+_6+X6+Q6+J6+C6+<6+56+.6+'6+ 6+6+6+ 6+6+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+x5+q5+j5+c5+\5+U5+N5+G5+@5+95+25++5+$5+5+5+5+5+5+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+|4+u4+n4+g4+`4+Y4+R4+K4+D4+=4+64+/4+(4+!4+4+4+ 4+4+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+y3+r3+k3+d3+]3+V3+O3+H3+A3+:3+33+,3+%3+3+3+3+ 3+3+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+}2+v2+o2+h2+a2+Z2+S2+L2+E2+>2+72+02+)2+"2+2+2+ 2+2+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+z1+s1+l1+e1+^1+W1+P1+I1+B1+;1+41+-1+&1+1+1+1+ 1+1+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+~0+w0+p0+i0+b0+[0+T0+M0+F0+?0+80+10+*0+#0+0+0+0+0+0+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+{/+t/+m/+f/+_/+X/+Q/+J/+C/+++7++0++)++"++++++ ++++*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+z*+s*+l*+e*+^*+W*+P*+I*+B*+;*+4*+-*+&*+*+*+*+ *+*+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+~)+w)+p)+i)+b)+[)+T)+M)+F)+?)+8)+1)+*)+#)+)+)+)+)+)+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+{(+t(+m(+f(+_(+X(+Q(+J(+C(+<(+5(+.(+'(+ (+(+(+ (+(+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+x'+q'+j'+c'+\'+U'+N'+G'+@'+9'+2'++'+$'+'+'+'+'+'+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+|&+u&+n&+g&+`&+Y&+R&+K&+D&+=&+6&+/&+(&+!&+&+&+ &+&+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+y%+r%+k%+d%+]%+V%+O%+H%+A%+:%+3%+,%+%%+%+%+%+ %+%+$+$+$+$+$+$+$+$+$+$+$+$+$+$+$+$+$+$+}$+v$+o$+h$+a$+Z$+S$+L$+E$+>$+7$+0$+)$+"$+$+$+ $+$+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+z#+s#+l#+e#+^#+W#+P#+I#+B#+;#+4#+-#+&#+#+#+#+ #+#+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+~"+w"+p"+i"+b"+["+T"+M"+F"+?"+8"+1"+*"+#"+"+"+"+"+"+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+{!+t!+m!+f!+_!+X!+Q!+J!+C!++7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++ + + + + + + + + + + + + + + + + + +~ +w +p +i +b +[ +T +M +F +? +8 +1 +* +# + + + + + + + + + + + + + + + + + + + + + + + +{ +t +m +f +_ +X +Q +J +C +< +5 +. +' + + + + + + + + + + + + + + + + + + + + + + + + +x +q +j +c +\ +U +N +G +@ +9 +2 ++ +$ + + + + + + + + + + + + + + + + + + + + + + + +| +u +n +g +` +Y +R +K +D += +6 +/ +( +! + + + + + + + + + + + + + + + + + + + + + + + +y +r +k +d +] +V +O +H +A +: +3 +, +% + + + + + +++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ +++++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ +++++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++++++++++++++++++++}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ +++++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#**********ݿ*ֿ*Ͽ*ȿ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *******ھ*Ӿ*̾*ž***********x*q*j*c*\*U*N*G*@*9*2*+*$**********޽*׽*н*ɽ*½**********|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *******ۼ*Լ*ͼ*Ƽ***********y*r*k*d*]*V*O*H*A*:*3*,*%**** ******߻*ػ*ѻ*ʻ*û**********}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *******ܺ*պ*κ*Ǻ***********z*s*l*e*^*W*P*I*B*;*4*-*&**** *******ٹ*ҹ*˹*Ĺ**********~*w*p*i*b*[*T*M*F*?*8*1***#**********ݸ*ָ*ϸ*ȸ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *******ڷ*ӷ*̷*ŷ***********x*q*j*c*\*U*N*G*@*9*2*+*$**********޶*׶*ж*ɶ*¶**********|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *******۵*Ե*͵*Ƶ***********y*r*k*d*]*V*O*H*A*:*3*,*%**** ******ߴ*ش*Ѵ*ʴ*ô**********}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *******ܳ*ճ*γ*dz***********z*s*l*e*^*W*P*I*B*;*4*-*&**** *******ٲ*Ҳ*˲*IJ**********~*w*p*i*b*[*T*M*F*?*8*1***#**********ݱ*ֱ*ϱ*ȱ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *******ڰ*Ӱ*̰*Ű***********x*q*j*c*\*U*N*G*@*9*2*+*$**********ޯ*ׯ*Я*ɯ*¯**********|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *******ۮ*Ԯ*ͮ*Ʈ***********y*r*k*d*]*V*O*H*A*:*3*,*%**** ******߭*ح*ѭ*ʭ*í**********}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *******ܬ*լ*ά*Ǭ***********z*s*l*e*^*W*P*I*B*;*4*-*&**** *******٫*ҫ*˫*ī**********~*w*p*i*b*[*T*M*F*?*8*1***#**********ݪ*֪*Ϫ*Ȫ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *******ک*ө*̩*ũ***********x*q*j*c*\*U*N*G*@*9*2*+*$**********ި*ר*Ш*ɨ*¨**********|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *******ۧ*ԧ*ͧ*Ƨ***********y*r*k*d*]*V*O*H*A*:*3*,*%**** ******ߦ*ئ*Ѧ*ʦ*æ**********}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *******ܥ*ե*Υ*ǥ***********z*s*l*e*^*W*P*I*B*;*4*-*&**** *******٤*Ҥ*ˤ*Ĥ**********~*w*p*i*b*[*T*M*F*?*8*1***#**********ݣ*֣*ϣ*ȣ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *******ڢ*Ӣ*̢*Ţ***********x*q*j*c*\*U*N*G*@*9*2*+*$**********ޡ*ס*С*ɡ*¡**********|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *******۠*Ԡ*͠*Ơ***********y*r*k*d*]*V*O*H*A*:*3*,*%**** ******ߟ*؟*џ*ʟ*ß**********}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *******ܞ*՞*Ξ*Ǟ***********z*s*l*e*^*W*P*I*B*;*4*-*&**** *******ٝ*ҝ*˝*ĝ**********~*w*p*i*b*[*T*M*F*?*8*1***#**********ݜ*֜*Ϝ*Ȝ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *******ڛ*ӛ*̛*ś***********x*q*j*c*\*U*N*G*@*9*2*+*$**********ޚ*ך*К*ɚ*š**********|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *******ۙ*ԙ*͙*ƙ***********y*r*k*d*]*V*O*H*A*:*3*,*%**** ******ߘ*ؘ*ј*ʘ*Ø**********}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *******ܗ*՗*Η*Ǘ***********z*s*l*e*^*W*P*I*B*;*4*-*&**** *******ٖ*Җ*˖*Ė**********~*w*p*i*b*[*T*M*F*?*8*1***#**********ݕ*֕*ϕ*ȕ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *******ڔ*Ӕ*̔*Ŕ***********x*q*j*c*\*U*N*G*@*9*2*+*$**********ޓ*ד*Г*ɓ*“**********|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *******ے*Ԓ*͒*ƒ***********y*r*k*d*]*V*O*H*A*:*3*,*%**** ******ߑ*ؑ*ё*ʑ*Ñ**********}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *******ܐ*Ր*ΐ*ǐ***********z*s*l*e*^*W*P*I*B*;*4*-*&**** *******ُ*ҏ*ˏ*ď**********~*w*p*i*b*[*T*M*F*?*8*1***#**********ݎ*֎*ώ*Ȏ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *******ڍ*Ӎ*̍*ō***********x*q*j*c*\*U*N*G*@*9*2*+*$**********ތ*׌*Ќ*Ɍ*Œ**********|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *******ۋ*ԋ*͋*Ƌ***********y*r*k*d*]*V*O*H*A*:*3*,*%**** ******ߊ*؊*ъ*ʊ*Ê**********}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *******܉*Չ*Ή*lj***********z*s*l*e*^*W*P*I*B*;*4*-*&**** *******و*҈*ˈ*Ĉ**********~*w*p*i*b*[*T*M*F*?*8*1***#**********݇*և*χ*ȇ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *******چ*ӆ*̆*ņ***********x*q*j*c*\*U*N*G*@*9*2*+*$**********ޅ*ׅ*Ѕ*Ʌ*…**********|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *******ۄ*Ԅ*̈́*Ƅ***********y*r*k*d*]*V*O*H*A*:*3*,*%**** ******߃*؃*у*ʃ*Ã**********}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *******܂*Ղ*΂*ǂ***********z*s*l*e*^*W*P*I*B*;*4*-*&**** *******ف*ҁ*ˁ*ā**********~*w*p*i*b*[*T*M*F*?*8*1***#**********݀*ր*π*Ȁ***********{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$******~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*|~*u~*n~*g~*`~*Y~*R~*K~*D~*=~*6~*/~*(~*!~*~*~* ~*~*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*y}*r}*k}*d}*]}*V}*O}*H}*A}*:}*3}*,}*%}*}*}*}* }*}*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*}|*v|*o|*h|*a|*Z|*S|*L|*E|*>|*7|*0|*)|*"|*|*|* |*|*{*{*{*{*{*{*{*{*{*{*{*{*{*{*{*{*{*{*{*z{*s{*l{*e{*^{*W{*P{*I{*B{*;{*4{*-{*&{*{*{*{* {*{*z*z*z*z*z*z*z*z*z*z*z*z*z*z*z*z*z*z*~z*wz*pz*iz*bz*[z*Tz*Mz*Fz*?z*8z*1z**z*#z*z*z*z*z*z*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*{y*ty*my*fy*_y*Xy*Qy*Jy*Cy*u*7u*0u*)u*"u*u*u* u*u*t*t*t*t*t*t*t*t*t*t*t*t*t*t*t*t*t*t*t*zt*st*lt*et*^t*Wt*Pt*It*Bt*;t*4t*-t*&t*t*t*t* t*t*s*s*s*s*s*s*s*s*s*s*s*s*s*s*s*s*s*s*~s*ws*ps*is*bs*[s*Ts*Ms*Fs*?s*8s*1s**s*#s*s*s*s*s*s*r*r*r*r*r*r*r*r*r*r*r*r*r*r*r*r*r*r*{r*tr*mr*fr*_r*Xr*Qr*Jr*Cr*n*7n*0n*)n*"n*n*n* n*n*m*m*m*m*m*m*m*m*m*m*m*m*m*m*m*m*m*m*m*zm*sm*lm*em*^m*Wm*Pm*Im*Bm*;m*4m*-m*&m*m*m*m* m*m*l*l*l*l*l*l*l*l*l*l*l*l*l*l*l*l*l*l*~l*wl*pl*il*bl*[l*Tl*Ml*Fl*?l*8l*1l**l*#l*l*l*l*l*l*k*k*k*k*k*k*k*k*k*k*k*k*k*k*k*k*k*k*{k*tk*mk*fk*_k*Xk*Qk*Jk*Ck*g*7g*0g*)g*"g*g*g* g*g*f*f*f*f*f*f*f*f*f*f*f*f*f*f*f*f*f*f*f*zf*sf*lf*ef*^f*Wf*Pf*If*Bf*;f*4f*-f*&f*f*f*f* f*f*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*~e*we*pe*ie*be*[e*Te*Me*Fe*?e*8e*1e**e*#e*e*e*e*e*e*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*{d*td*md*fd*_d*Xd*Qd*Jd*Cd*`*7`*0`*)`*"`*`*`* `*`*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*z_*s_*l_*e_*^_*W_*P_*I_*B_*;_*4_*-_*&_*_*_*_* _*_*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*~^*w^*p^*i^*b^*[^*T^*M^*F^*?^*8^*1^**^*#^*^*^*^*^*^*]*]*]*]*]*]*]*]*]*]*]*]*]*]*]*]*]*]*{]*t]*m]*f]*_]*X]*Q]*J]*C]*<]*5]*.]*']* ]*]*]* ]*]*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*x\*q\*j\*c\*\\*U\*N\*G\*@\*9\*2\*+\*$\*\*\*\*\*\*[*[*[*[*[*[*[*[*[*[*[*[*[*[*[*[*[*[*|[*u[*n[*g[*`[*Y[*R[*K[*D[*=[*6[*/[*([*![*[*[* [*[*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*Z*yZ*rZ*kZ*dZ*]Z*VZ*OZ*HZ*AZ*:Z*3Z*,Z*%Z*Z*Z*Z* Z*Z*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*}Y*vY*oY*hY*aY*ZY*SY*LY*EY*>Y*7Y*0Y*)Y*"Y*Y*Y* Y*Y*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*zX*sX*lX*eX*^X*WX*PX*IX*BX*;X*4X*-X*&X*X*X*X* X*X*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*~W*wW*pW*iW*bW*[W*TW*MW*FW*?W*8W*1W**W*#W*W*W*W*W*W*V*V*V*V*V*V*V*V*V*V*V*V*V*V*V*V*V*V*{V*tV*mV*fV*_V*XV*QV*JV*CV*R*7R*0R*)R*"R*R*R* R*R*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*zQ*sQ*lQ*eQ*^Q*WQ*PQ*IQ*BQ*;Q*4Q*-Q*&Q*Q*Q*Q* Q*Q*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*~P*wP*pP*iP*bP*[P*TP*MP*FP*?P*8P*1P**P*#P*P*P*P*P*P*O*O*O*O*O*O*O*O*O*O*O*O*O*O*O*O*O*O*{O*tO*mO*fO*_O*XO*QO*JO*CO*K*7K*0K*)K*"K*K*K* K*K*J*J*J*J*J*J*J*J*J*J*J*J*J*J*J*J*J*J*J*zJ*sJ*lJ*eJ*^J*WJ*PJ*IJ*BJ*;J*4J*-J*&J*J*J*J* J*J*I*I*I*I*I*I*I*I*I*I*I*I*I*I*I*I*I*I*~I*wI*pI*iI*bI*[I*TI*MI*FI*?I*8I*1I**I*#I*I*I*I*I*I*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*{H*tH*mH*fH*_H*XH*QH*JH*CH*D*7D*0D*)D*"D*D*D* D*D*C*C*C*C*C*C*C*C*C*C*C*C*C*C*C*C*C*C*C*zC*sC*lC*eC*^C*WC*PC*IC*BC*;C*4C*-C*&C*C*C*C* C*C*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*~B*wB*pB*iB*bB*[B*TB*MB*FB*?B*8B*1B**B*#B*B*B*B*B*B*A*A*A*A*A*A*A*A*A*A*A*A*A*A*A*A*A*A*{A*tA*mA*fA*_A*XA*QA*JA*CA**>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*y>*r>*k>*d>*]>*V>*O>*H>*A>*:>*3>*,>*%>*>*>*>* >*>*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*}=*v=*o=*h=*a=*Z=*S=*L=*E=*>=*7=*0=*)=*"=*=*=* =*=*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*z<*s<*l<*e<*^<*W<*P<*I<*B<*;<*4<*-<*&<*<*<*<* <*<*;*;*;*;*;*;*;*;*;*;*;*;*;*;*;*;*;*;*~;*w;*p;*i;*b;*[;*T;*M;*F;*?;*8;*1;**;*#;*;*;*;*;*;*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*:*{:*t:*m:*f:*_:*X:*Q:*J:*C:*<:*5:*.:*':* :*:*:* :*:*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*x9*q9*j9*c9*\9*U9*N9*G9*@9*99*29*+9*$9*9*9*9*9*9*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*|8*u8*n8*g8*`8*Y8*R8*K8*D8*=8*68*/8*(8*!8*8*8* 8*8*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*y7*r7*k7*d7*]7*V7*O7*H7*A7*:7*37*,7*%7*7*7*7* 7*7*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*}6*v6*o6*h6*a6*Z6*S6*L6*E6*>6*76*06*)6*"6*6*6* 6*6*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*z5*s5*l5*e5*^5*W5*P5*I5*B5*;5*45*-5*&5*5*5*5* 5*5*4*4*4*4*4*4*4*4*4*4*4*4*4*4*4*4*4*4*~4*w4*p4*i4*b4*[4*T4*M4*F4*?4*84*14**4*#4*4*4*4*4*4*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*{3*t3*m3*f3*_3*X3*Q3*J3*C3*<3*53*.3*'3* 3*3*3* 3*3*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*x2*q2*j2*c2*\2*U2*N2*G2*@2*92*22*+2*$2*2*2*2*2*2*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*|1*u1*n1*g1*`1*Y1*R1*K1*D1*=1*61*/1*(1*!1*1*1* 1*1*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*y0*r0*k0*d0*]0*V0*O0*H0*A0*:0*30*,0*%0*0*0*0* 0*0*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*}/*v/*o/*h/*a/*Z/*S/*L/*E/*>/*7/*0/*)/*"/*/*/* /*/*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*z.*s.*l.*e.*^.*W.*P.*I.*B.*;.*4.*-.*&.*.*.*.* .*.*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*~-*w-*p-*i-*b-*[-*T-*M-*F-*?-*8-*1-**-*#-*-*-*-*-*-*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*{,*t,*m,*f,*_,*X,*Q,*J,*C,*<,*5,*.,*',* ,*,*,* ,*,*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*x+*q+*j+*c+*\+*U+*N+*G+*@+*9+*2+*++*$+*+*+*+*+*+*************************************|**u**n**g**`**Y**R**K**D**=**6**/**(**!****** ****)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*y)*r)*k)*d)*])*V)*O)*H)*A)*:)*3)*,)*%)*)*)*)* )*)*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*}(*v(*o(*h(*a(*Z(*S(*L(*E(*>(*7(*0(*)(*"(*(*(* (*(*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*z'*s'*l'*e'*^'*W'*P'*I'*B'*;'*4'*-'*&'*'*'*'* '*'*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*~&*w&*p&*i&*b&*[&*T&*M&*F&*?&*8&*1&**&*#&*&*&*&*&*&*%*%*%*%*%*%*%*%*%*%*%*%*%*%*%*%*%*%*{%*t%*m%*f%*_%*X%*Q%*J%*C%*<%*5%*.%*'%* %*%*%* %*%*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*x$*q$*j$*c$*\$*U$*N$*G$*@$*9$*2$*+$*$$*$*$*$*$*$*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*|#*u#*n#*g#*`#*Y#*R#*K#*D#*=#*6#*/#*(#*!#*#*#* #*#*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*y"*r"*k"*d"*]"*V"*O"*H"*A"*:"*3"*,"*%"*"*"*"* "*"*!*!*!*!*!*!*!*!*!*!*!*!*!*!*!*!*!*!*}!*v!*o!*h!*a!*Z!*S!*L!*E!*>!*7!*0!*)!*"!*!*!* !*!* * * * * * * * * * * * * * * * * * * *z *s *l *e *^ *W *P *I *B *; *4 *- *& * * * * * *******************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** ** * * * * * * * * * * * * * * * * * * *y *r *k *d *] *V *O *H *A *: *3 *, *% * * * * * * * * * * * * * * * * * * * * * * * *} *v *o *h *a *Z *S *L *E *> *7 *0 *) *" * * * * * * * * * * * * * * * * * * * * * * * *z *s *l *e *^ *W *P *I *B *; *4 *- *& * * * * * * * * * * * * * * * * * * * * * * * *~ *w *p *i *b *[ *T *M *F *? *8 *1 ** *# * * * * * * * * * * * * * * * * * * * * * * * *{ *t *m *f *_ *X *Q *J *C *< *5 *. *' * * * * * ********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** *********************y*r*k*d*]*V*O*H*A*:*3*,*%**** ********************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** *********************z*s*l*e*^*W*P*I*B*;*4*-*&**** ********************~*w*p*i*b*[*T*M*F*?*8*1***#************************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** *********************x*q*j*c*\*U*N*G*@*9*2*+*$************************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))߿)ؿ)ѿ)ʿ)ÿ))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))ܾ)վ)ξ)Ǿ)))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) )))))))ٽ)ҽ)˽)Ľ))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))))))ݼ)ּ)ϼ)ȼ))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))ڻ)ӻ)̻)Ż)))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))޺)׺)к)ɺ)º))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))۹)Թ)͹)ƹ)))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))߸)ظ)Ѹ)ʸ)ø))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))ܷ)շ)η)Ƿ)))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) )))))))ٶ)Ҷ)˶)Ķ))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))))))ݵ)ֵ)ϵ)ȵ))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))ڴ)Ӵ)̴)Ŵ)))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))޳)׳)г)ɳ)³))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))۲)Բ)Ͳ)Ʋ)))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))߱)ر)ѱ)ʱ)ñ))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))ܰ)հ)ΰ)ǰ)))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) )))))))ٯ)ү)˯)į))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))))))ݮ)֮)Ϯ)Ȯ))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))ڭ)ӭ)̭)ŭ)))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))ެ)׬)Ь)ɬ)¬))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))۫)ԫ)ͫ)ƫ)))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))ߪ)ت)Ѫ)ʪ)ê))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))ܩ)թ)Ω)ǩ)))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) )))))))٨)Ҩ)˨)Ĩ))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))))))ݧ)֧)ϧ)ȧ))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))ڦ)Ӧ)̦)Ŧ)))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))ޥ)ץ)Х)ɥ)¥))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))ۤ)Ԥ)ͤ)Ƥ)))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))ߣ)أ)ѣ)ʣ)ã))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))ܢ)բ)΢)Ǣ)))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) )))))))١)ҡ)ˡ)ġ))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))))))ݠ)֠)Ϡ)Ƞ))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))ڟ)ӟ)̟)ş)))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))ޞ)מ)О)ɞ)ž))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))۝)ԝ)͝)Ɲ)))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))ߜ)؜)ќ)ʜ)Ü))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))ܛ)՛)Λ)Ǜ)))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) )))))))ٚ)Қ)˚)Ě))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))))))ݙ)֙)ϙ)ș))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))ژ)Ә)̘)Ř)))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))ޗ)ח)З)ɗ)—))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))ۖ)Ԗ)͖)Ɩ)))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))ߕ)ؕ)ѕ)ʕ)Õ))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))ܔ)Ք)Δ)ǔ)))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) )))))))ٓ)ғ)˓)ē))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))))))ݒ)֒)ϒ)Ȓ))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))ڑ)ӑ)̑)ő)))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))ސ)א)А)ɐ)))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))ۏ)ԏ)͏)Ə)))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))ߎ)؎)ю)ʎ)Î))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))܍)Ս)΍)Ǎ)))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) )))))))ٌ)Ҍ)ˌ)Č))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))))))݋)֋)ϋ)ȋ))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))ڊ)ӊ)̊)Ŋ)))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))މ)׉)Љ)ɉ)‰))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))ۈ)Ԉ)͈)ƈ)))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))߇)؇)ч)ʇ)Ç))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))܆)Ն)Ά)dž)))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) )))))))م)҅)˅)ą))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))))))݄)ք)τ)Ȅ))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))ڃ)Ӄ)̃)Ń)))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))ނ)ׂ)Ђ)ɂ)‚))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))ہ)ԁ)́)Ɓ)))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))߀)؀)р)ʀ)À))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))~)~)~)~)~)~)~)~)~)~)~)~)~)~)~)~)~)~)~~)w~)p~)i~)b~)[~)T~)M~)F~)?~)8~)1~)*~)#~)~)~)~)~)~)})})})})})})})})})})})})})})})})})}){})t})m})f})_})X})Q})J})C})<})5}).})'}) })})}) })})|)|)|)|)|)|)|)|)|)|)|)|)|)|)|)|)|)|)|)x|)q|)j|)c|)\|)U|)N|)G|)@|)9|)2|)+|)$|)|)|)|)|)|){){){){){){){){){){){){){){){){){){)|{)u{)n{)g{)`{)Y{)R{)K{)D{)={)6{)/{)({)!{){){) {){)z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)z)yz)rz)kz)dz)]z)Vz)Oz)Hz)Az):z)3z),z)%z)z)z)z) z)z)y)y)y)y)y)y)y)y)y)y)y)y)y)y)y)y)y)y)}y)vy)oy)hy)ay)Zy)Sy)Ly)Ey)>y)7y)0y))y)"y)y)y) y)y)x)x)x)x)x)x)x)x)x)x)x)x)x)x)x)x)x)x)x)zx)sx)lx)ex)^x)Wx)Px)Ix)Bx);x)4x)-x)&x)x)x)x) x)x)w)w)w)w)w)w)w)w)w)w)w)w)w)w)w)w)w)w)~w)ww)pw)iw)bw)[w)Tw)Mw)Fw)?w)8w)1w)*w)#w)w)w)w)w)w)v)v)v)v)v)v)v)v)v)v)v)v)v)v)v)v)v)v){v)tv)mv)fv)_v)Xv)Qv)Jv)Cv)r)7r)0r))r)"r)r)r) r)r)q)q)q)q)q)q)q)q)q)q)q)q)q)q)q)q)q)q)q)zq)sq)lq)eq)^q)Wq)Pq)Iq)Bq);q)4q)-q)&q)q)q)q) q)q)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)~p)wp)pp)ip)bp)[p)Tp)Mp)Fp)?p)8p)1p)*p)#p)p)p)p)p)p)o)o)o)o)o)o)o)o)o)o)o)o)o)o)o)o)o)o){o)to)mo)fo)_o)Xo)Qo)Jo)Co)k)7k)0k))k)"k)k)k) k)k)j)j)j)j)j)j)j)j)j)j)j)j)j)j)j)j)j)j)j)zj)sj)lj)ej)^j)Wj)Pj)Ij)Bj);j)4j)-j)&j)j)j)j) j)j)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)~i)wi)pi)ii)bi)[i)Ti)Mi)Fi)?i)8i)1i)*i)#i)i)i)i)i)i)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h){h)th)mh)fh)_h)Xh)Qh)Jh)Ch)d)7d)0d))d)"d)d)d) d)d)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)zc)sc)lc)ec)^c)Wc)Pc)Ic)Bc);c)4c)-c)&c)c)c)c) c)c)b)b)b)b)b)b)b)b)b)b)b)b)b)b)b)b)b)b)~b)wb)pb)ib)bb)[b)Tb)Mb)Fb)?b)8b)1b)*b)#b)b)b)b)b)b)a)a)a)a)a)a)a)a)a)a)a)a)a)a)a)a)a)a){a)ta)ma)fa)_a)Xa)Qa)Ja)Ca)])7])0]))])"])])]) ])])\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)\)z\)s\)l\)e\)^\)W\)P\)I\)B\);\)4\)-\)&\)\)\)\) \)\)[)[)[)[)[)[)[)[)[)[)[)[)[)[)[)[)[)[)~[)w[)p[)i[)b[)[[)T[)M[)F[)?[)8[)1[)*[)#[)[)[)[)[)[)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z){Z)tZ)mZ)fZ)_Z)XZ)QZ)JZ)CZ)V)7V)0V))V)"V)V)V) V)V)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)zU)sU)lU)eU)^U)WU)PU)IU)BU);U)4U)-U)&U)U)U)U) U)U)T)T)T)T)T)T)T)T)T)T)T)T)T)T)T)T)T)T)~T)wT)pT)iT)bT)[T)TT)MT)FT)?T)8T)1T)*T)#T)T)T)T)T)T)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S){S)tS)mS)fS)_S)XS)QS)JS)CS)O)7O)0O))O)"O)O)O) O)O)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)zN)sN)lN)eN)^N)WN)PN)IN)BN);N)4N)-N)&N)N)N)N) N)N)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)~M)wM)pM)iM)bM)[M)TM)MM)FM)?M)8M)1M)*M)#M)M)M)M)M)M)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L){L)tL)mL)fL)_L)XL)QL)JL)CL)H)7H)0H))H)"H)H)H) H)H)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)G)zG)sG)lG)eG)^G)WG)PG)IG)BG);G)4G)-G)&G)G)G)G) G)G)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)~F)wF)pF)iF)bF)[F)TF)MF)FF)?F)8F)1F)*F)#F)F)F)F)F)F)E)E)E)E)E)E)E)E)E)E)E)E)E)E)E)E)E)E){E)tE)mE)fE)_E)XE)QE)JE)CE)A)7A)0A))A)"A)A)A) A)A)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)z@)s@)l@)e@)^@)W@)P@)I@)B@);@)4@)-@)&@)@)@)@) @)@)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)~?)w?)p?)i?)b?)[?)T?)M?)F?)??)8?)1?)*?)#?)?)?)?)?)?)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>){>)t>)m>)f>)_>)X>)Q>)J>)C>)<>)5>).>)'>) >)>)>) >)>)=)=)=)=)=)=)=)=)=)=)=)=)=)=)=)=)=)=)=)x=)q=)j=)c=)\=)U=)N=)G=)@=)9=)2=)+=)$=)=)=)=)=)=)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)|<)u<)n<)g<)`<)Y<)R<)K<)D<)=<)6<)/<)(<)!<)<)<) <)<);););););););););););););););););););)y;)r;)k;)d;)];)V;)O;)H;)A;):;)3;),;)%;);););) ;);):):):):):):):):):):):):):):):):):):)}:)v:)o:)h:)a:)Z:)S:)L:)E:)>:)7:)0:)):)":):):) :):)9)9)9)9)9)9)9)9)9)9)9)9)9)9)9)9)9)9)9)z9)s9)l9)e9)^9)W9)P9)I9)B9);9)49)-9)&9)9)9)9) 9)9)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)~8)w8)p8)i8)b8)[8)T8)M8)F8)?8)88)18)*8)#8)8)8)8)8)8)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7){7)t7)m7)f7)_7)X7)Q7)J7)C7)<7)57).7)'7) 7)7)7) 7)7)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)x6)q6)j6)c6)\6)U6)N6)G6)@6)96)26)+6)$6)6)6)6)6)6)5)5)5)5)5)5)5)5)5)5)5)5)5)5)5)5)5)5)|5)u5)n5)g5)`5)Y5)R5)K5)D5)=5)65)/5)(5)!5)5)5) 5)5)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)4)y4)r4)k4)d4)]4)V4)O4)H4)A4):4)34),4)%4)4)4)4) 4)4)3)3)3)3)3)3)3)3)3)3)3)3)3)3)3)3)3)3)}3)v3)o3)h3)a3)Z3)S3)L3)E3)>3)73)03))3)"3)3)3) 3)3)2)2)2)2)2)2)2)2)2)2)2)2)2)2)2)2)2)2)2)z2)s2)l2)e2)^2)W2)P2)I2)B2);2)42)-2)&2)2)2)2) 2)2)1)1)1)1)1)1)1)1)1)1)1)1)1)1)1)1)1)1)~1)w1)p1)i1)b1)[1)T1)M1)F1)?1)81)11)*1)#1)1)1)1)1)1)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0){0)t0)m0)f0)_0)X0)Q0)J0)C0)<0)50).0)'0) 0)0)0) 0)0)/)/)/)/)/)/)/)/)/)/)/)/)/)/)/)/)/)/)/)x/)q/)j/)c/)\/)U/)N/)G/)@/)9/)2/)+/)$/)/)/)/)/)/).).).).).).).).).).).).).).).).).).)|.)u.)n.)g.)`.)Y.)R.)K.)D.)=.)6.)/.)(.)!.).).) .).)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)y-)r-)k-)d-)]-)V-)O-)H-)A-):-)3-),-)%-)-)-)-) -)-),),),),),),),),),),),),),),),),),),)},)v,)o,)h,)a,)Z,)S,)L,)E,)>,)7,)0,)),)",),),) ,),)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)z+)s+)l+)e+)^+)W+)P+)I+)B+);+)4+)-+)&+)+)+)+) +)+)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)~*)w*)p*)i*)b*)[*)T*)M*)F*)?*)8*)1*)**)#*)*)*)*)*)*))))))))))))))))))))))))))))))))))))){))t))m))f))_))X))Q))J))C))<))5)).))')) )))))) ))))()()()()()()()()()()()()()()()()()()()x()q()j()c()\()U()N()G()@()9()2()+()$()()()()()()')')')')')')')')')')')')')')')')')')|')u')n')g')`')Y')R')K')D')=')6')/')(')!')')') ')')&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)y&)r&)k&)d&)]&)V&)O&)H&)A&):&)3&),&)%&)&)&)&) &)&)%)%)%)%)%)%)%)%)%)%)%)%)%)%)%)%)%)%)}%)v%)o%)h%)a%)Z%)S%)L%)E%)>%)7%)0%))%)"%)%)%) %)%)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)z$)s$)l$)e$)^$)W$)P$)I$)B$);$)4$)-$)&$)$)$)$) $)$)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)~#)w#)p#)i#)b#)[#)T#)M#)F#)?#)8#)1#)*#)##)#)#)#)#)#)")")")")")")")")")")")")")")")")")"){")t")m")f")_")X")Q")J")C")<")5").")'") ")")") ")")!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)x!)q!)j!)c!)\!)U!)N!)G!)@!)9!)2!)+!)$!)!)!)!)!)!) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )| )u )n )g )` )Y )R )K )D )= )6 )/ )( )! ) ) ) ) ))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ){ )t )m )f )_ )X )Q )J )C )< )5 ). )' ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )x )q )j )c )\ )U )N )G )@ )9 )2 )+ )$ ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )| )u )n )g )` )Y )R )K )D )= )6 )/ )( )! ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )y )r )k )d )] )V )O )H )A ): )3 ), )% ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )} )v )o )h )a )Z )S )L )E )> )7 )0 )) )" ) ) ) ) ))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#)))))))))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) )))))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) )))))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) )))))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڿ(ӿ(̿(ſ(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((޾(׾(о(ɾ(¾((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((۽(Խ(ͽ(ƽ(((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((߼(ؼ(Ѽ(ʼ(ü((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((ܻ(ջ(λ(ǻ(((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( (((((((ٺ(Һ(˺(ĺ((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((((((ݹ(ֹ(Ϲ(ȹ((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڸ(Ӹ(̸(Ÿ(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((޷(׷(з(ɷ(·((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((۶(Զ(Ͷ(ƶ(((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((ߵ(ص(ѵ(ʵ(õ((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((ܴ(մ(δ(Ǵ(((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( (((((((ٳ(ҳ(˳(ij((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((((((ݲ(ֲ(ϲ(Ȳ((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڱ(ӱ(̱(ű(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((ް(װ(а(ɰ(°((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((ۯ(ԯ(ͯ(Ư(((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((߮(خ(Ѯ(ʮ(î((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((ܭ(խ(έ(ǭ(((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( (((((((٬(Ҭ(ˬ(Ĭ((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((((((ݫ(֫(ϫ(ȫ((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڪ(Ӫ(̪(Ū(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((ީ(ש(Щ(ɩ(©((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((ۨ(Ԩ(ͨ(ƨ(((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((ߧ(ا(ѧ(ʧ(ç((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((ܦ(զ(Φ(Ǧ(((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( (((((((٥(ҥ(˥(ĥ((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((((((ݤ(֤(Ϥ(Ȥ((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڣ(ӣ(̣(ţ(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((ޢ(ע(Т(ɢ(¢((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((ۡ(ԡ(͡(ơ(((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((ߠ(ؠ(Ѡ(ʠ(à((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((ܟ(՟(Ο(ǟ(((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( (((((((ٞ(Ҟ(˞(Ğ((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((((((ݝ(֝(ϝ(ȝ((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڜ(Ӝ(̜(Ŝ(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((ޛ(כ(Л(ɛ(›((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((ۚ(Ԛ(͚(ƚ(((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((ߙ(ؙ(љ(ʙ(Ù((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((ܘ(՘(Θ(ǘ(((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( (((((((ٗ(җ(˗(ė((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((((((ݖ(֖(ϖ(Ȗ((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڕ(ӕ(̕(ŕ(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((ޔ(ה(Д(ɔ(”((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((ۓ(ԓ(͓(Ɠ(((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((ߒ(ؒ(ђ(ʒ(Ò((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((ܑ(Ց(Α(Ǒ(((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( (((((((ِ(Ґ(ː(Đ((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((((((ݏ(֏(Ϗ(ȏ((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڎ(ӎ(̎(Ŏ(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((ލ(׍(Ѝ(ɍ(((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((ی(Ԍ(͌(ƌ(((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((ߋ(؋(ы(ʋ(Ë((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((܊(Պ(Ί(NJ(((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( (((((((ى(҉(ˉ(ĉ((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((((((݈(ֈ(ψ(Ȉ((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڇ(Ӈ(̇(Ň(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((ކ(׆(І(Ɇ(†((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((ۅ(ԅ(ͅ(ƅ(((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((߄(؄(ф(ʄ(Ä((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((܃(Ճ(΃(ǃ(((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( (((((((ق(҂(˂(Ă((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((((((݁(ց(ρ(ȁ((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((ڀ(Ӏ(̀(ŀ(((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((~(~(~(~(~(~(~(~(~(~(~(~(~(~(~(~(~(~(~(y~(r~(k~(d~(]~(V~(O~(H~(A~(:~(3~(,~(%~(~(~(~( ~(~(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}}(v}(o}(h}(a}(Z}(S}(L}(E}(>}(7}(0}()}("}(}(}( }(}(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(|(z|(s|(l|(e|(^|(W|(P|(I|(B|(;|(4|(-|(&|(|(|(|( |(|({({({({({({({({({({({({({({({({({({(~{(w{(p{(i{(b{([{(T{(M{(F{(?{(8{(1{(*{(#{({({({({({(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z({z(tz(mz(fz(_z(Xz(Qz(Jz(Cz(v(7v(0v()v("v(v(v( v(v(u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(u(zu(su(lu(eu(^u(Wu(Pu(Iu(Bu(;u(4u(-u(&u(u(u(u( u(u(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(~t(wt(pt(it(bt([t(Tt(Mt(Ft(?t(8t(1t(*t(#t(t(t(t(t(t(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s({s(ts(ms(fs(_s(Xs(Qs(Js(Cs(o(7o(0o()o("o(o(o( o(o(n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(n(zn(sn(ln(en(^n(Wn(Pn(In(Bn(;n(4n(-n(&n(n(n(n( n(n(m(m(m(m(m(m(m(m(m(m(m(m(m(m(m(m(m(m(~m(wm(pm(im(bm([m(Tm(Mm(Fm(?m(8m(1m(*m(#m(m(m(m(m(m(l(l(l(l(l(l(l(l(l(l(l(l(l(l(l(l(l(l({l(tl(ml(fl(_l(Xl(Ql(Jl(Cl(h(7h(0h()h("h(h(h( h(h(g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(g(zg(sg(lg(eg(^g(Wg(Pg(Ig(Bg(;g(4g(-g(&g(g(g(g( g(g(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(~f(wf(pf(if(bf([f(Tf(Mf(Ff(?f(8f(1f(*f(#f(f(f(f(f(f(e(e(e(e(e(e(e(e(e(e(e(e(e(e(e(e(e(e({e(te(me(fe(_e(Xe(Qe(Je(Ce(a(7a(0a()a("a(a(a( a(a(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(`(z`(s`(l`(e`(^`(W`(P`(I`(B`(;`(4`(-`(&`(`(`(`( `(`(_(_(_(_(_(_(_(_(_(_(_(_(_(_(_(_(_(_(~_(w_(p_(i_(b_([_(T_(M_(F_(?_(8_(1_(*_(#_(_(_(_(_(_(^(^(^(^(^(^(^(^(^(^(^(^(^(^(^(^(^(^({^(t^(m^(f^(_^(X^(Q^(J^(C^(<^(5^(.^('^( ^(^(^( ^(^(](](](](](](](](](](](](](](](](](](](x](q](j](c](\](U](N](G](@](9](2](+]($](](](](](](\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(|\(u\(n\(g\(`\(Y\(R\(K\(D\(=\(6\(/\((\(!\(\(\( \(\([([([([([([([([([([([([([([([([([([([(y[(r[(k[(d[(][(V[(O[(H[(A[(:[(3[(,[(%[([([([( [([(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(}Z(vZ(oZ(hZ(aZ(ZZ(SZ(LZ(EZ(>Z(7Z(0Z()Z("Z(Z(Z( Z(Z(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(Y(zY(sY(lY(eY(^Y(WY(PY(IY(BY(;Y(4Y(-Y(&Y(Y(Y(Y( Y(Y(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(~X(wX(pX(iX(bX([X(TX(MX(FX(?X(8X(1X(*X(#X(X(X(X(X(X(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W({W(tW(mW(fW(_W(XW(QW(JW(CW(S(7S(0S()S("S(S(S( S(S(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(zR(sR(lR(eR(^R(WR(PR(IR(BR(;R(4R(-R(&R(R(R(R( R(R(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(Q(~Q(wQ(pQ(iQ(bQ([Q(TQ(MQ(FQ(?Q(8Q(1Q(*Q(#Q(Q(Q(Q(Q(Q(P(P(P(P(P(P(P(P(P(P(P(P(P(P(P(P(P(P({P(tP(mP(fP(_P(XP(QP(JP(CP(L(7L(0L()L("L(L(L( L(L(K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(K(zK(sK(lK(eK(^K(WK(PK(IK(BK(;K(4K(-K(&K(K(K(K( K(K(J(J(J(J(J(J(J(J(J(J(J(J(J(J(J(J(J(J(~J(wJ(pJ(iJ(bJ([J(TJ(MJ(FJ(?J(8J(1J(*J(#J(J(J(J(J(J(I(I(I(I(I(I(I(I(I(I(I(I(I(I(I(I(I(I({I(tI(mI(fI(_I(XI(QI(JI(CI(E(7E(0E()E("E(E(E( E(E(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(zD(sD(lD(eD(^D(WD(PD(ID(BD(;D(4D(-D(&D(D(D(D( D(D(C(C(C(C(C(C(C(C(C(C(C(C(C(C(C(C(C(C(~C(wC(pC(iC(bC([C(TC(MC(FC(?C(8C(1C(*C(#C(C(C(C(C(C(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B({B(tB(mB(fB(_B(XB(QB(JB(CB((>(>(>(>(>(>(>(>(>(>(>(>(>(>(>(>(>(}>(v>(o>(h>(a>(Z>(S>(L>(E>(>>(7>(0>()>(">(>(>( >(>(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(=(z=(s=(l=(e=(^=(W=(P=(I=(B=(;=(4=(-=(&=(=(=(=( =(=(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(~<(w<(p<(i<(b<([<(T<(M<(F<(?<(8<(1<(*<(#<(<(<(<(<(<(;(;(;(;(;(;(;(;(;(;(;(;(;(;(;(;(;(;({;(t;(m;(f;(_;(X;(Q;(J;(C;(<;(5;(.;(';( ;(;(;( ;(;(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(x:(q:(j:(c:(\:(U:(N:(G:(@:(9:(2:(+:($:(:(:(:(:(:(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(|9(u9(n9(g9(`9(Y9(R9(K9(D9(=9(69(/9((9(!9(9(9( 9(9(8(8(8(8(8(8(8(8(8(8(8(8(8(8(8(8(8(8(8(y8(r8(k8(d8(]8(V8(O8(H8(A8(:8(38(,8(%8(8(8(8( 8(8(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(}7(v7(o7(h7(a7(Z7(S7(L7(E7(>7(77(07()7("7(7(7( 7(7(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(z6(s6(l6(e6(^6(W6(P6(I6(B6(;6(46(-6(&6(6(6(6( 6(6(5(5(5(5(5(5(5(5(5(5(5(5(5(5(5(5(5(5(~5(w5(p5(i5(b5([5(T5(M5(F5(?5(85(15(*5(#5(5(5(5(5(5(4(4(4(4(4(4(4(4(4(4(4(4(4(4(4(4(4(4({4(t4(m4(f4(_4(X4(Q4(J4(C4(<4(54(.4('4( 4(4(4( 4(4(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(3(x3(q3(j3(c3(\3(U3(N3(G3(@3(93(23(+3($3(3(3(3(3(3(2(2(2(2(2(2(2(2(2(2(2(2(2(2(2(2(2(2(|2(u2(n2(g2(`2(Y2(R2(K2(D2(=2(62(/2((2(!2(2(2( 2(2(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(y1(r1(k1(d1(]1(V1(O1(H1(A1(:1(31(,1(%1(1(1(1( 1(1(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(}0(v0(o0(h0(a0(Z0(S0(L0(E0(>0(70(00()0("0(0(0( 0(0(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(z/(s/(l/(e/(^/(W/(P/(I/(B/(;/(4/(-/(&/(/(/(/( /(/(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(~.(w.(p.(i.(b.([.(T.(M.(F.(?.(8.(1.(*.(#.(.(.(.(.(.(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-({-(t-(m-(f-(_-(X-(Q-(J-(C-(<-(5-(.-('-( -(-(-( -(-(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(x,(q,(j,(c,(\,(U,(N,(G,(@,(9,(2,(+,($,(,(,(,(,(,(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(|+(u+(n+(g+(`+(Y+(R+(K+(D+(=+(6+(/+((+(!+(+(+( +(+(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(y*(r*(k*(d*(]*(V*(O*(H*(A*(:*(3*(,*(%*(*(*(*( *(*()()()()()()()()()()()()()()()()()()(})(v)(o)(h)(a)(Z)(S)(L)(E)(>)(7)(0)())(")()()( )()(((((((((((((((((((((((((((((((((((((((z((s((l((e((^((W((P((I((B((;((4((-((&(((((((( (((('('('('('('('('('('('('('('('('('('(~'(w'(p'(i'(b'(['(T'(M'(F'(?'(8'(1'(*'(#'('('('('('(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&({&(t&(m&(f&(_&(X&(Q&(J&(C&(<&(5&(.&('&( &(&(&( &(&(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(x%(q%(j%(c%(\%(U%(N%(G%(@%(9%(2%(+%($%(%(%(%(%(%($($($($($($($($($($($($($($($($($($(|$(u$(n$(g$(`$(Y$(R$(K$(D$(=$(6$(/$(($(!$($($( $($(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(y#(r#(k#(d#(]#(V#(O#(H#(A#(:#(3#(,#(%#(#(#(#( #(#("("("("("("("("("("("("("("("("("("(}"(v"(o"(h"(a"(Z"(S"(L"(E"(>"(7"(0"()"(""("("( "("(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(z!(s!(l!(e!(^!(W!(P!(I!(B!(;!(4!(-!(&!(!(!(!( !(!( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (~ (w (p (i (b ([ (T (M (F (? (8 (1 (* (# ( ( ( ( ( ((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( (( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (} (v (o (h (a (Z (S (L (E (> (7 (0 () (" ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (z (s (l (e (^ (W (P (I (B (; (4 (- (& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (~ (w (p (i (b ([ (T (M (F (? (8 (1 (* (# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ({ (t (m (f (_ (X (Q (J (C (< (5 (. (' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (x (q (j (c (\ (U (N (G (@ (9 (2 (+ ($ ( ( ( ( ( (((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (((((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#(((((((((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (((((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (((((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''ܿ'տ'ο'ǿ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' '''''''پ'Ҿ'˾'ľ''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''ݽ'ֽ'Ͻ'Ƚ'''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''ڼ'Ӽ'̼'ż'''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''޻'׻'л'ɻ'»''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''ۺ'Ժ'ͺ'ƺ'''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''߹'ع'ѹ'ʹ'ù''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''ܸ'ո'θ'Ǹ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' '''''''ٷ'ҷ'˷'ķ''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''ݶ'ֶ'϶'ȶ'''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''ڵ'ӵ'̵'ŵ'''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''޴'״'д'ɴ'´''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''۳'Գ'ͳ'Ƴ'''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''߲'ز'Ѳ'ʲ'ò''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''ܱ'ձ'α'DZ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' '''''''ٰ'Ұ'˰'İ''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''ݯ'֯'ϯ'ȯ'''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''ڮ'Ӯ'̮'Ů'''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''ޭ'׭'Э'ɭ'­''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''۬'Ԭ'ͬ'Ƭ'''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''߫'ث'ѫ'ʫ'ë''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''ܪ'ժ'Ϊ'Ǫ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' '''''''٩'ҩ'˩'ĩ''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''ݨ'֨'Ϩ'Ȩ'''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''ڧ'ӧ'̧'ŧ'''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''ަ'צ'Ц'ɦ'¦''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''ۥ'ԥ'ͥ'ƥ'''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''ߤ'ؤ'Ѥ'ʤ'ä''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''ܣ'գ'Σ'ǣ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' '''''''٢'Ң'ˢ'Ģ''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''ݡ'֡'ϡ'ȡ'''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''ڠ'Ӡ'̠'Š'''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''ޟ'ן'П'ɟ'Ÿ''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''۞'Ԟ'͞'ƞ'''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''ߝ'؝'ѝ'ʝ'Ý''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''ܜ'՜'Μ'ǜ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' '''''''ٛ'қ'˛'ě''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''ݚ'֚'Ϛ'Ț'''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''ڙ'ә'̙'ř'''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''ޘ'ט'И'ɘ'˜''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''ۗ'ԗ'͗'Ɨ'''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''ߖ'ؖ'і'ʖ'Ö''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''ܕ'Օ'Ε'Ǖ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' '''''''ٔ'Ҕ'˔'Ĕ''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''ݓ'֓'ϓ'ȓ'''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''ڒ'Ӓ'̒'Œ'''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''ޑ'ב'Б'ɑ'‘''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''ې'Ԑ'͐'Ɛ'''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''ߏ'؏'я'ʏ'Ï''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''܎'Վ'Ύ'ǎ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' '''''''ٍ'ҍ'ˍ'č''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''݌'֌'ό'Ȍ'''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''ڋ'Ӌ'̋'ŋ'''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''ފ'׊'Њ'Ɋ'Š''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''ۉ'ԉ'͉'Ɖ'''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''߈'؈'ш'ʈ'È''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''܇'Շ'·'LJ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' '''''''ن'҆'ˆ'Ć''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''݅'օ'υ'ȅ'''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''ڄ'ӄ'̄'ń'''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''ރ'׃'Ѓ'Ƀ'ƒ''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''ۂ'Ԃ'͂'Ƃ'''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''߁'؁'с'ʁ'Á''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''܀'Հ'΀'ǀ'''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''~'~'~'~'~'~'~'~'~'~'~'~'~'~'~'~'~'~'{~'t~'m~'f~'_~'X~'Q~'J~'C~'<~'5~'.~''~' ~'~'~' ~'~'}'}'}'}'}'}'}'}'}'}'}'}'}'}'}'}'}'}'}'x}'q}'j}'c}'\}'U}'N}'G}'@}'9}'2}'+}'$}'}'}'}'}'}'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'||'u|'n|'g|'`|'Y|'R|'K|'D|'=|'6|'/|'(|'!|'|'|' |'|'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{'{'y{'r{'k{'d{']{'V{'O{'H{'A{':{'3{',{'%{'{'{'{' {'{'z'z'z'z'z'z'z'z'z'z'z'z'z'z'z'z'z'z'}z'vz'oz'hz'az'Zz'Sz'Lz'Ez'>z'7z'0z')z'"z'z'z' z'z'y'y'y'y'y'y'y'y'y'y'y'y'y'y'y'y'y'y'y'zy'sy'ly'ey'^y'Wy'Py'Iy'By';y'4y'-y'&y'y'y'y' y'y'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'~x'wx'px'ix'bx'[x'Tx'Mx'Fx'?x'8x'1x'*x'#x'x'x'x'x'x'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'{w'tw'mw'fw'_w'Xw'Qw'Jw'Cw's'7s'0s')s'"s's's' s's'r'r'r'r'r'r'r'r'r'r'r'r'r'r'r'r'r'r'r'zr'sr'lr'er'^r'Wr'Pr'Ir'Br';r'4r'-r'&r'r'r'r' r'r'q'q'q'q'q'q'q'q'q'q'q'q'q'q'q'q'q'q'~q'wq'pq'iq'bq'[q'Tq'Mq'Fq'?q'8q'1q'*q'#q'q'q'q'q'q'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'{p'tp'mp'fp'_p'Xp'Qp'Jp'Cp'l'7l'0l')l'"l'l'l' l'l'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'zk'sk'lk'ek'^k'Wk'Pk'Ik'Bk';k'4k'-k'&k'k'k'k' k'k'j'j'j'j'j'j'j'j'j'j'j'j'j'j'j'j'j'j'~j'wj'pj'ij'bj'[j'Tj'Mj'Fj'?j'8j'1j'*j'#j'j'j'j'j'j'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'{i'ti'mi'fi'_i'Xi'Qi'Ji'Ci'e'7e'0e')e'"e'e'e' e'e'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'zd'sd'ld'ed'^d'Wd'Pd'Id'Bd';d'4d'-d'&d'd'd'd' d'd'c'c'c'c'c'c'c'c'c'c'c'c'c'c'c'c'c'c'~c'wc'pc'ic'bc'[c'Tc'Mc'Fc'?c'8c'1c'*c'#c'c'c'c'c'c'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'{b'tb'mb'fb'_b'Xb'Qb'Jb'Cb'^'7^'0^')^'"^'^'^' ^'^']']']']']']']']']']']']']']']']']']']'z]'s]'l]'e]'^]'W]'P]'I]'B]';]'4]'-]'&]']']']' ]']'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'~\'w\'p\'i\'b\'[\'T\'M\'F\'?\'8\'1\'*\'#\'\'\'\'\'\'['['['['['['['['['['['['['['['['['['{['t['m['f['_['X['Q['J['C['<['5['.[''[' ['['[' ['['Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'Z'xZ'qZ'jZ'cZ'\Z'UZ'NZ'GZ'@Z'9Z'2Z'+Z'$Z'Z'Z'Z'Z'Z'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'Y'|Y'uY'nY'gY'`Y'YY'RY'KY'DY'=Y'6Y'/Y'(Y'!Y'Y'Y' Y'Y'X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'X'yX'rX'kX'dX']X'VX'OX'HX'AX':X'3X',X'%X'X'X'X' X'X'W'W'W'W'W'W'W'W'W'W'W'W'W'W'W'W'W'W'}W'vW'oW'hW'aW'ZW'SW'LW'EW'>W'7W'0W')W'"W'W'W' W'W'V'V'V'V'V'V'V'V'V'V'V'V'V'V'V'V'V'V'V'zV'sV'lV'eV'^V'WV'PV'IV'BV';V'4V'-V'&V'V'V'V' V'V'U'U'U'U'U'U'U'U'U'U'U'U'U'U'U'U'U'U'~U'wU'pU'iU'bU'[U'TU'MU'FU'?U'8U'1U'*U'#U'U'U'U'U'U'T'T'T'T'T'T'T'T'T'T'T'T'T'T'T'T'T'T'{T'tT'mT'fT'_T'XT'QT'JT'CT'P'7P'0P')P'"P'P'P' P'P'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'zO'sO'lO'eO'^O'WO'PO'IO'BO';O'4O'-O'&O'O'O'O' O'O'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'~N'wN'pN'iN'bN'[N'TN'MN'FN'?N'8N'1N'*N'#N'N'N'N'N'N'M'M'M'M'M'M'M'M'M'M'M'M'M'M'M'M'M'M'{M'tM'mM'fM'_M'XM'QM'JM'CM'I'7I'0I')I'"I'I'I' I'I'H'H'H'H'H'H'H'H'H'H'H'H'H'H'H'H'H'H'H'zH'sH'lH'eH'^H'WH'PH'IH'BH';H'4H'-H'&H'H'H'H' H'H'G'G'G'G'G'G'G'G'G'G'G'G'G'G'G'G'G'G'~G'wG'pG'iG'bG'[G'TG'MG'FG'?G'8G'1G'*G'#G'G'G'G'G'G'F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'{F'tF'mF'fF'_F'XF'QF'JF'CF'B'7B'0B')B'"B'B'B' B'B'A'A'A'A'A'A'A'A'A'A'A'A'A'A'A'A'A'A'A'zA'sA'lA'eA'^A'WA'PA'IA'BA';A'4A'-A'&A'A'A'A' A'A'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'~@'w@'p@'i@'b@'[@'T@'M@'F@'?@'8@'1@'*@'#@'@'@'@'@'@'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'{?'t?'m?'f?'_?'X?'Q?'J?'C?''>'>'>'>'>'>'>'>'>'>'>'>'>'>'>'>'>'>'x>'q>'j>'c>'\>'U>'N>'G>'@>'9>'2>'+>'$>'>'>'>'>'>'='='='='='='='='='='='='='='='='='='|='u='n='g='`='Y='R='K='D='=='6='/='(='!='='=' ='='<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'y<'r<'k<'d<']<'V<'O<'H<'A<':<'3<',<'%<'<'<'<' <'<';';';';';';';';';';';';';';';';';';'};'v;'o;'h;'a;'Z;'S;'L;'E;'>;'7;'0;');'";';';' ;';':':':':':':':':':':':':':':':':':':':'z:'s:'l:'e:'^:'W:'P:'I:'B:';:'4:'-:'&:':':':' :':'9'9'9'9'9'9'9'9'9'9'9'9'9'9'9'9'9'9'~9'w9'p9'i9'b9'[9'T9'M9'F9'?9'89'19'*9'#9'9'9'9'9'9'8'8'8'8'8'8'8'8'8'8'8'8'8'8'8'8'8'8'{8't8'm8'f8'_8'X8'Q8'J8'C8'<8'58'.8''8' 8'8'8' 8'8'7'7'7'7'7'7'7'7'7'7'7'7'7'7'7'7'7'7'7'x7'q7'j7'c7'\7'U7'N7'G7'@7'97'27'+7'$7'7'7'7'7'7'6'6'6'6'6'6'6'6'6'6'6'6'6'6'6'6'6'6'|6'u6'n6'g6'`6'Y6'R6'K6'D6'=6'66'/6'(6'!6'6'6' 6'6'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'y5'r5'k5'd5']5'V5'O5'H5'A5':5'35',5'%5'5'5'5' 5'5'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'}4'v4'o4'h4'a4'Z4'S4'L4'E4'>4'74'04')4'"4'4'4' 4'4'3'3'3'3'3'3'3'3'3'3'3'3'3'3'3'3'3'3'3'z3's3'l3'e3'^3'W3'P3'I3'B3';3'43'-3'&3'3'3'3' 3'3'2'2'2'2'2'2'2'2'2'2'2'2'2'2'2'2'2'2'~2'w2'p2'i2'b2'[2'T2'M2'F2'?2'82'12'*2'#2'2'2'2'2'2'1'1'1'1'1'1'1'1'1'1'1'1'1'1'1'1'1'1'{1't1'm1'f1'_1'X1'Q1'J1'C1'<1'51'.1''1' 1'1'1' 1'1'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'x0'q0'j0'c0'\0'U0'N0'G0'@0'90'20'+0'$0'0'0'0'0'0'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'|/'u/'n/'g/'`/'Y/'R/'K/'D/'=/'6/'//'(/'!/'/'/' /'/'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'y.'r.'k.'d.'].'V.'O.'H.'A.':.'3.',.'%.'.'.'.' .'.'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'}-'v-'o-'h-'a-'Z-'S-'L-'E-'>-'7-'0-')-'"-'-'-' -'-',',',',',',',',',',',',',',',',',',','z,'s,'l,'e,'^,'W,'P,'I,'B,';,'4,'-,'&,',',',' ,','+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'~+'w+'p+'i+'b+'[+'T+'M+'F+'?+'8+'1+'*+'#+'+'+'+'+'+'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'{*'t*'m*'f*'_*'X*'Q*'J*'C*'<*'5*'.*''*' *'*'*' *'*')')')')')')')')')')')')')')')')')')')'x)'q)'j)'c)'\)'U)'N)'G)'@)'9)'2)'+)'$)')')')')')'('('('('('('('('('('('('('('('('('('|('u('n('g('`('Y('R('K('D('=('6('/('(('!('('(' ('('''''''''''''''''''''''''''''''''''''''y''r''k''d'']''V''O''H''A'':''3'',''%'''''''' ''''&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'}&'v&'o&'h&'a&'Z&'S&'L&'E&'>&'7&'0&')&'"&'&'&' &'&'%'%'%'%'%'%'%'%'%'%'%'%'%'%'%'%'%'%'%'z%'s%'l%'e%'^%'W%'P%'I%'B%';%'4%'-%'&%'%'%'%' %'%'$'$'$'$'$'$'$'$'$'$'$'$'$'$'$'$'$'$'~$'w$'p$'i$'b$'[$'T$'M$'F$'?$'8$'1$'*$'#$'$'$'$'$'$'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'{#'t#'m#'f#'_#'X#'Q#'J#'C#'<#'5#'.#''#' #'#'#' #'#'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'x"'q"'j"'c"'\"'U"'N"'G"'@"'9"'2"'+"'$"'"'"'"'"'"'!'!'!'!'!'!'!'!'!'!'!'!'!'!'!'!'!'!'|!'u!'n!'g!'`!'Y!'R!'K!'D!'=!'6!'/!'(!'!!'!'!' !'!' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'y 'r 'k 'd '] 'V 'O 'H 'A ': '3 ', '% ' ' ' ' ' '''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'x 'q 'j 'c '\ 'U 'N 'G '@ '9 '2 '+ '$ ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '| 'u 'n 'g '` 'Y 'R 'K 'D '= '6 '/ '( '! ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'y 'r 'k 'd '] 'V 'O 'H 'A ': '3 ', '% ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '} 'v 'o 'h 'a 'Z 'S 'L 'E '> '7 '0 ') '" ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'z 's 'l 'e '^ 'W 'P 'I 'B '; '4 '- '& ' ' ' ' ' '''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' '''''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' '''''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' '''''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&޿&׿&п&ɿ&¿&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&۾&Ծ&;&ƾ&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&߽&ؽ&ѽ&ʽ&ý&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&ܼ&ռ&μ&Ǽ&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&ٻ&һ&˻&Ļ&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&ݺ&ֺ&Ϻ&Ⱥ&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&ڹ&ӹ&̹&Ź&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&޸&׸&и&ɸ&¸&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&۷&Է&ͷ&Ʒ&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&߶&ض&Ѷ&ʶ&ö&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&ܵ&յ&ε&ǵ&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&ٴ&Ҵ&˴&Ĵ&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&ݳ&ֳ&ϳ&ȳ&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&ڲ&Ӳ&̲&Ų&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&ޱ&ױ&б&ɱ&±&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&۰&԰&Ͱ&ư&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&߯&د&ѯ&ʯ&ï&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&ܮ&ծ&ή&Ǯ&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&٭&ҭ&˭&ĭ&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&ݬ&֬&Ϭ&Ȭ&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&ګ&ӫ&̫&ū&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&ު&ת&Ъ&ɪ&ª&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&۩&ԩ&ͩ&Ʃ&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&ߨ&ب&Ѩ&ʨ&è&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&ܧ&է&Χ&ǧ&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&٦&Ҧ&˦&Ħ&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&ݥ&֥&ϥ&ȥ&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&ڤ&Ӥ&̤&Ť&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&ޣ&ף&У&ɣ&£&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&ۢ&Ԣ&͢&Ƣ&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&ߡ&ء&ѡ&ʡ&á&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&ܠ&ՠ&Π&Ǡ&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&ٟ&ҟ&˟&ğ&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&ݞ&֞&Ϟ&Ȟ&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&ڝ&ӝ&̝&ŝ&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&ޜ&ל&М&ɜ&œ&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&ۛ&ԛ&͛&ƛ&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&ߚ&ؚ&њ&ʚ&Ú&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&ܙ&ՙ&Ι&Ǚ&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&٘&Ҙ&˘&Ę&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&ݗ&֗&ϗ&ȗ&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&ږ&Ӗ&̖&Ŗ&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&ޕ&ו&Е&ɕ&•&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&۔&Ԕ&͔&Ɣ&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&ߓ&ؓ&ѓ&ʓ&Ó&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&ܒ&Ւ&Β&ǒ&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&ّ&ґ&ˑ&đ&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&ݐ&֐&ϐ&Ȑ&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&ڏ&ӏ&̏&ŏ&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&ގ&׎&Ў&Ɏ&Ž&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&ۍ&ԍ&͍&ƍ&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&ߌ&،&ь&ʌ&Ì&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&܋&Ջ&΋&Nj&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&ي&Ҋ&ˊ&Ċ&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&݉&։&ω&ȉ&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&ڈ&ӈ&̈&ň&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&އ&ׇ&Ї&ɇ&‡&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&ۆ&Ԇ&͆&Ɔ&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&߅&؅&х&ʅ&Å&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&܄&Մ&΄&DŽ&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&ك&҃&˃&ă&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&݂&ւ&ς&Ȃ&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&ځ&Ӂ&́&Ł&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&ހ&׀&Ѐ&ɀ&€&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&~&~&~&~&~&~&~&~&~&~&~&~&~&~&~&~&~&~&}~&v~&o~&h~&a~&Z~&S~&L~&E~&>~&7~&0~&)~&"~&~&~& ~&~&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&}&z}&s}&l}&e}&^}&W}&P}&I}&B}&;}&4}&-}&&}&}&}&}& }&}&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&|&~|&w|&p|&i|&b|&[|&T|&M|&F|&?|&8|&1|&*|&#|&|&|&|&|&|&{&{&{&{&{&{&{&{&{&{&{&{&{&{&{&{&{&{&{{&t{&m{&f{&_{&X{&Q{&J{&C{&<{&5{&.{&'{& {&{&{& {&{&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&xz&qz&jz&cz&\z&Uz&Nz&Gz&@z&9z&2z&+z&$z&z&z&z&z&z&y&y&y&y&y&y&y&y&y&y&y&y&y&y&y&y&y&y&|y&uy&ny&gy&`y&Yy&Ry&Ky&Dy&=y&6y&/y&(y&!y&y&y& y&y&x&x&x&x&x&x&x&x&x&x&x&x&x&x&x&x&x&x&x&yx&rx&kx&dx&]x&Vx&Ox&Hx&Ax&:x&3x&,x&%x&x&x&x& x&x&w&w&w&w&w&w&w&w&w&w&w&w&w&w&w&w&w&w&}w&vw&ow&hw&aw&Zw&Sw&Lw&Ew&>w&7w&0w&)w&"w&w&w& w&w&v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&v&zv&sv&lv&ev&^v&Wv&Pv&Iv&Bv&;v&4v&-v&&v&v&v&v& v&v&u&u&u&u&u&u&u&u&u&u&u&u&u&u&u&u&u&u&~u&wu&pu&iu&bu&[u&Tu&Mu&Fu&?u&8u&1u&*u&#u&u&u&u&u&u&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&{t&tt&mt&ft&_t&Xt&Qt&Jt&Ct&p&7p&0p&)p&"p&p&p& p&p&o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&o&zo&so&lo&eo&^o&Wo&Po&Io&Bo&;o&4o&-o&&o&o&o&o& o&o&n&n&n&n&n&n&n&n&n&n&n&n&n&n&n&n&n&n&~n&wn&pn&in&bn&[n&Tn&Mn&Fn&?n&8n&1n&*n&#n&n&n&n&n&n&m&m&m&m&m&m&m&m&m&m&m&m&m&m&m&m&m&m&{m&tm&mm&fm&_m&Xm&Qm&Jm&Cm&i&7i&0i&)i&"i&i&i& i&i&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h&zh&sh&lh&eh&^h&Wh&Ph&Ih&Bh&;h&4h&-h&&h&h&h&h& h&h&g&g&g&g&g&g&g&g&g&g&g&g&g&g&g&g&g&g&~g&wg&pg&ig&bg&[g&Tg&Mg&Fg&?g&8g&1g&*g&#g&g&g&g&g&g&f&f&f&f&f&f&f&f&f&f&f&f&f&f&f&f&f&f&{f&tf&mf&ff&_f&Xf&Qf&Jf&Cf&b&7b&0b&)b&"b&b&b& b&b&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&za&sa&la&ea&^a&Wa&Pa&Ia&Ba&;a&4a&-a&&a&a&a&a& a&a&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&~`&w`&p`&i`&b`&[`&T`&M`&F`&?`&8`&1`&*`&#`&`&`&`&`&`&_&_&_&_&_&_&_&_&_&_&_&_&_&_&_&_&_&_&{_&t_&m_&f_&__&X_&Q_&J_&C_&<_&5_&._&'_& _&_&_& _&_&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&^&x^&q^&j^&c^&\^&U^&N^&G^&@^&9^&2^&+^&$^&^&^&^&^&^&]&]&]&]&]&]&]&]&]&]&]&]&]&]&]&]&]&]&|]&u]&n]&g]&`]&Y]&R]&K]&D]&=]&6]&/]&(]&!]&]&]& ]&]&\&\&\&\&\&\&\&\&\&\&\&\&\&\&\&\&\&\&\&y\&r\&k\&d\&]\&V\&O\&H\&A\&:\&3\&,\&%\&\&\&\& \&\&[&[&[&[&[&[&[&[&[&[&[&[&[&[&[&[&[&[&}[&v[&o[&h[&a[&Z[&S[&L[&E[&>[&7[&0[&)[&"[&[&[& [&[&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&Z&zZ&sZ&lZ&eZ&^Z&WZ&PZ&IZ&BZ&;Z&4Z&-Z&&Z&Z&Z&Z& Z&Z&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&Y&~Y&wY&pY&iY&bY&[Y&TY&MY&FY&?Y&8Y&1Y&*Y&#Y&Y&Y&Y&Y&Y&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&{X&tX&mX&fX&_X&XX&QX&JX&CX&T&7T&0T&)T&"T&T&T& T&T&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&zS&sS&lS&eS&^S&WS&PS&IS&BS&;S&4S&-S&&S&S&S&S& S&S&R&R&R&R&R&R&R&R&R&R&R&R&R&R&R&R&R&R&~R&wR&pR&iR&bR&[R&TR&MR&FR&?R&8R&1R&*R&#R&R&R&R&R&R&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&{Q&tQ&mQ&fQ&_Q&XQ&QQ&JQ&CQ&M&7M&0M&)M&"M&M&M& M&M&L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&L&zL&sL&lL&eL&^L&WL&PL&IL&BL&;L&4L&-L&&L&L&L&L& L&L&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&~K&wK&pK&iK&bK&[K&TK&MK&FK&?K&8K&1K&*K&#K&K&K&K&K&K&J&J&J&J&J&J&J&J&J&J&J&J&J&J&J&J&J&J&{J&tJ&mJ&fJ&_J&XJ&QJ&JJ&CJ&F&7F&0F&)F&"F&F&F& F&F&E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&E&zE&sE&lE&eE&^E&WE&PE&IE&BE&;E&4E&-E&&E&E&E&E& E&E&D&D&D&D&D&D&D&D&D&D&D&D&D&D&D&D&D&D&~D&wD&pD&iD&bD&[D&TD&MD&FD&?D&8D&1D&*D&#D&D&D&D&D&D&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&{C&tC&mC&fC&_C&XC&QC&JC&CC&?&7?&0?&)?&"?&?&?& ?&?&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&>&z>&s>&l>&e>&^>&W>&P>&I>&B>&;>&4>&->&&>&>&>&>& >&>&=&=&=&=&=&=&=&=&=&=&=&=&=&=&=&=&=&=&~=&w=&p=&i=&b=&[=&T=&M=&F=&?=&8=&1=&*=&#=&=&=&=&=&=&<&<&<&<&<&<&<&<&<&<&<&<&<&<&<&<&<&<&{<&t<&m<&f<&_<&X<&Q<&J<&C<&<<&5<&.<&'<& <&<&<& <&<&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&x;&q;&j;&c;&\;&U;&N;&G;&@;&9;&2;&+;&$;&;&;&;&;&;&:&:&:&:&:&:&:&:&:&:&:&:&:&:&:&:&:&:&|:&u:&n:&g:&`:&Y:&R:&K:&D:&=:&6:&/:&(:&!:&:&:& :&:&9&9&9&9&9&9&9&9&9&9&9&9&9&9&9&9&9&9&9&y9&r9&k9&d9&]9&V9&O9&H9&A9&:9&39&,9&%9&9&9&9& 9&9&8&8&8&8&8&8&8&8&8&8&8&8&8&8&8&8&8&8&}8&v8&o8&h8&a8&Z8&S8&L8&E8&>8&78&08&)8&"8&8&8& 8&8&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&z7&s7&l7&e7&^7&W7&P7&I7&B7&;7&47&-7&&7&7&7&7& 7&7&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&~6&w6&p6&i6&b6&[6&T6&M6&F6&?6&86&16&*6&#6&6&6&6&6&6&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&{5&t5&m5&f5&_5&X5&Q5&J5&C5&<5&55&.5&'5& 5&5&5& 5&5&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&x4&q4&j4&c4&\4&U4&N4&G4&@4&94&24&+4&$4&4&4&4&4&4&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&|3&u3&n3&g3&`3&Y3&R3&K3&D3&=3&63&/3&(3&!3&3&3& 3&3&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&y2&r2&k2&d2&]2&V2&O2&H2&A2&:2&32&,2&%2&2&2&2& 2&2&1&1&1&1&1&1&1&1&1&1&1&1&1&1&1&1&1&1&}1&v1&o1&h1&a1&Z1&S1&L1&E1&>1&71&01&)1&"1&1&1& 1&1&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&z0&s0&l0&e0&^0&W0&P0&I0&B0&;0&40&-0&&0&0&0&0& 0&0&/&/&/&/&/&/&/&/&/&/&/&/&/&/&/&/&/&/&~/&w/&p/&i/&b/&[/&T/&M/&F/&?/&8/&1/&*/&#/&/&/&/&/&/&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&{.&t.&m.&f.&_.&X.&Q.&J.&C.&<.&5.&..&'.& .&.&.& .&.&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&-&x-&q-&j-&c-&\-&U-&N-&G-&@-&9-&2-&+-&$-&-&-&-&-&-&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&|,&u,&n,&g,&`,&Y,&R,&K,&D,&=,&6,&/,&(,&!,&,&,& ,&,&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&y+&r+&k+&d+&]+&V+&O+&H+&A+&:+&3+&,+&%+&+&+&+& +&+&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&}*&v*&o*&h*&a*&Z*&S*&L*&E*&>*&7*&0*&)*&"*&*&*& *&*&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)&)&z)&s)&l)&e)&^)&W)&P)&I)&B)&;)&4)&-)&&)&)&)&)& )&)&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&~(&w(&p(&i(&b(&[(&T(&M(&F(&?(&8(&1(&*(&#(&(&(&(&(&(&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&{'&t'&m'&f'&_'&X'&Q'&J'&C'&<'&5'&.'&''& '&'&'& '&'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&x&&q&&j&&c&&\&&U&&N&&G&&@&&9&&2&&+&&$&&&&&&&&&&&&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&|%&u%&n%&g%&`%&Y%&R%&K%&D%&=%&6%&/%&(%&!%&%&%& %&%&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&y$&r$&k$&d$&]$&V$&O$&H$&A$&:$&3$&,$&%$&$&$&$& $&$&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&}#&v#&o#&h#&a#&Z#&S#&L#&E#&>#&7#&0#&)#&"#&#&#& #&#&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&z"&s"&l"&e"&^"&W"&P"&I"&B"&;"&4"&-"&&"&"&"&"& "&"&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&~!&w!&p!&i!&b!&[!&T!&M!&F!&?!&8!&1!&*!&#!&!&!&!&!&!& & & & & & & & & & & & & & & & & & &{ &t &m &f &_ &X &Q &J &C &< &5 &. &' & & & & & &&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& && & & & & & & & & & & & & & & & & & & &z &s &l &e &^ &W &P &I &B &; &4 &- && & & & & & & & & & & & & & & & & & & & & & & & &~ &w &p &i &b &[ &T &M &F &? &8 &1 &* &# & & & & & & & & & & & & & & & & & & & & & & & &{ &t &m &f &_ &X &Q &J &C &< &5 &. &' & & & & & & & & & & & & & & & & & & & & & & & & &x &q &j &c &\ &U &N &G &@ &9 &2 &+ &$ & & & & & & & & & & & & & & & & & & & & & & & &| &u &n &g &` &Y &R &K &D &= &6 &/ &( &! & & & & &&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%ٿ%ҿ%˿%Ŀ%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%ݾ%־%Ͼ%Ⱦ%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%ڽ%ӽ%̽%Ž%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%޼%׼%м%ɼ%¼%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%ۻ%Ի%ͻ%ƻ%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%ߺ%غ%Ѻ%ʺ%ú%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%ܹ%չ%ι%ǹ%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%ٸ%Ҹ%˸%ĸ%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%ݷ%ַ%Ϸ%ȷ%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%ڶ%Ӷ%̶%Ŷ%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%޵%׵%е%ɵ%µ%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%۴%Դ%ʹ%ƴ%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%߳%س%ѳ%ʳ%ó%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%ܲ%ղ%β%Dz%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%ٱ%ұ%˱%ı%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%ݰ%ְ%ϰ%Ȱ%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%گ%ӯ%̯%ů%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%ޮ%׮%Ю%ɮ%®%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%ۭ%ԭ%ͭ%ƭ%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%߬%ج%Ѭ%ʬ%ì%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%ܫ%ի%Ϋ%ǫ%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%٪%Ҫ%˪%Ī%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%ݩ%֩%ϩ%ȩ%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%ڨ%Ө%̨%Ũ%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%ާ%ק%Ч%ɧ%§%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%ۦ%Ԧ%ͦ%Ʀ%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%ߥ%إ%ѥ%ʥ%å%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%ܤ%դ%Τ%Ǥ%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%٣%ң%ˣ%ģ%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%ݢ%֢%Ϣ%Ȣ%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%ڡ%ӡ%̡%š%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%ޠ%נ%Р%ɠ% %%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%۟%ԟ%͟%Ɵ%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%ߞ%؞%ў%ʞ%Þ%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%ܝ%՝%Ν%ǝ%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%ٜ%Ҝ%˜%Ĝ%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%ݛ%֛%ϛ%ț%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%ښ%Ӛ%̚%Ś%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%ޙ%י%Й%ə%™%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%ۘ%Ԙ%͘%Ƙ%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%ߗ%ؗ%ї%ʗ%×%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%ܖ%Ֆ%Ζ%ǖ%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%ٕ%ҕ%˕%ĕ%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%ݔ%֔%ϔ%Ȕ%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%ړ%ӓ%̓%œ%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%ޒ%ג%В%ɒ%’%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%ۑ%ԑ%͑%Ƒ%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%ߐ%ؐ%ѐ%ʐ%Ð%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%܏%Տ%Ώ%Ǐ%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%َ%Ҏ%ˎ%Ď%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%ݍ%֍%ύ%ȍ%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%ڌ%ӌ%̌%Ō%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%ދ%׋%Ћ%ɋ%‹%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%ۊ%Ԋ%͊%Ɗ%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%߉%؉%щ%ʉ%É%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%܈%Ո%Έ%Lj%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%ه%҇%ˇ%ć%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%݆%ֆ%φ%Ȇ%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%څ%Ӆ%̅%Ņ%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%ބ%ׄ%Є%Ʉ%„%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%ۃ%ԃ%̓%ƃ%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%߂%؂%т%ʂ%Â%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%܁%Ձ%΁%ǁ%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%ـ%Ҁ%ˀ%Ā%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%x~%q~%j~%c~%\~%U~%N~%G~%@~%9~%2~%+~%$~%~%~%~%~%~%}%}%}%}%}%}%}%}%}%}%}%}%}%}%}%}%}%}%|}%u}%n}%g}%`}%Y}%R}%K}%D}%=}%6}%/}%(}%!}%}%}% }%}%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%y|%r|%k|%d|%]|%V|%O|%H|%A|%:|%3|%,|%%|%|%|%|% |%|%{%{%{%{%{%{%{%{%{%{%{%{%{%{%{%{%{%{%}{%v{%o{%h{%a{%Z{%S{%L{%E{%>{%7{%0{%){%"{%{%{% {%{%z%z%z%z%z%z%z%z%z%z%z%z%z%z%z%z%z%z%z%zz%sz%lz%ez%^z%Wz%Pz%Iz%Bz%;z%4z%-z%&z%z%z%z% z%z%y%y%y%y%y%y%y%y%y%y%y%y%y%y%y%y%y%y%~y%wy%py%iy%by%[y%Ty%My%Fy%?y%8y%1y%*y%#y%y%y%y%y%y%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%{x%tx%mx%fx%_x%Xx%Qx%Jx%Cx%t%7t%0t%)t%"t%t%t% t%t%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%zs%ss%ls%es%^s%Ws%Ps%Is%Bs%;s%4s%-s%&s%s%s%s% s%s%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%~r%wr%pr%ir%br%[r%Tr%Mr%Fr%?r%8r%1r%*r%#r%r%r%r%r%r%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%{q%tq%mq%fq%_q%Xq%Qq%Jq%Cq%m%7m%0m%)m%"m%m%m% m%m%l%l%l%l%l%l%l%l%l%l%l%l%l%l%l%l%l%l%l%zl%sl%ll%el%^l%Wl%Pl%Il%Bl%;l%4l%-l%&l%l%l%l% l%l%k%k%k%k%k%k%k%k%k%k%k%k%k%k%k%k%k%k%~k%wk%pk%ik%bk%[k%Tk%Mk%Fk%?k%8k%1k%*k%#k%k%k%k%k%k%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%{j%tj%mj%fj%_j%Xj%Qj%Jj%Cj%f%7f%0f%)f%"f%f%f% f%f%e%e%e%e%e%e%e%e%e%e%e%e%e%e%e%e%e%e%e%ze%se%le%ee%^e%We%Pe%Ie%Be%;e%4e%-e%&e%e%e%e% e%e%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%~d%wd%pd%id%bd%[d%Td%Md%Fd%?d%8d%1d%*d%#d%d%d%d%d%d%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%{c%tc%mc%fc%_c%Xc%Qc%Jc%Cc%_%7_%0_%)_%"_%_%_% _%_%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%z^%s^%l^%e^%^^%W^%P^%I^%B^%;^%4^%-^%&^%^%^%^% ^%^%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%~]%w]%p]%i]%b]%[]%T]%M]%F]%?]%8]%1]%*]%#]%]%]%]%]%]%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%{\%t\%m\%f\%_\%X\%Q\%J\%C\%<\%5\%.\%'\% \%\%\% \%\%[%[%[%[%[%[%[%[%[%[%[%[%[%[%[%[%[%[%[%x[%q[%j[%c[%\[%U[%N[%G[%@[%9[%2[%+[%$[%[%[%[%[%[%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%|Z%uZ%nZ%gZ%`Z%YZ%RZ%KZ%DZ%=Z%6Z%/Z%(Z%!Z%Z%Z% Z%Z%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%Y%yY%rY%kY%dY%]Y%VY%OY%HY%AY%:Y%3Y%,Y%%Y%Y%Y%Y% Y%Y%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%}X%vX%oX%hX%aX%ZX%SX%LX%EX%>X%7X%0X%)X%"X%X%X% X%X%W%W%W%W%W%W%W%W%W%W%W%W%W%W%W%W%W%W%W%zW%sW%lW%eW%^W%WW%PW%IW%BW%;W%4W%-W%&W%W%W%W% W%W%V%V%V%V%V%V%V%V%V%V%V%V%V%V%V%V%V%V%~V%wV%pV%iV%bV%[V%TV%MV%FV%?V%8V%1V%*V%#V%V%V%V%V%V%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%{U%tU%mU%fU%_U%XU%QU%JU%CU%Q%7Q%0Q%)Q%"Q%Q%Q% Q%Q%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%zP%sP%lP%eP%^P%WP%PP%IP%BP%;P%4P%-P%&P%P%P%P% P%P%O%O%O%O%O%O%O%O%O%O%O%O%O%O%O%O%O%O%~O%wO%pO%iO%bO%[O%TO%MO%FO%?O%8O%1O%*O%#O%O%O%O%O%O%N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%{N%tN%mN%fN%_N%XN%QN%JN%CN%J%7J%0J%)J%"J%J%J% J%J%I%I%I%I%I%I%I%I%I%I%I%I%I%I%I%I%I%I%I%zI%sI%lI%eI%^I%WI%PI%II%BI%;I%4I%-I%&I%I%I%I% I%I%H%H%H%H%H%H%H%H%H%H%H%H%H%H%H%H%H%H%~H%wH%pH%iH%bH%[H%TH%MH%FH%?H%8H%1H%*H%#H%H%H%H%H%H%G%G%G%G%G%G%G%G%G%G%G%G%G%G%G%G%G%G%{G%tG%mG%fG%_G%XG%QG%JG%CG%C%7C%0C%)C%"C%C%C% C%C%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%zB%sB%lB%eB%^B%WB%PB%IB%BB%;B%4B%-B%&B%B%B%B% B%B%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%~A%wA%pA%iA%bA%[A%TA%MA%FA%?A%8A%1A%*A%#A%A%A%A%A%A%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%{@%t@%m@%f@%_@%X@%Q@%J@%C@%<@%5@%.@%'@% @%@%@% @%@%?%?%?%?%?%?%?%?%?%?%?%?%?%?%?%?%?%?%?%x?%q?%j?%c?%\?%U?%N?%G?%@?%9?%2?%+?%$?%?%?%?%?%?%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%|>%u>%n>%g>%`>%Y>%R>%K>%D>%=>%6>%/>%(>%!>%>%>% >%>%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%=%y=%r=%k=%d=%]=%V=%O=%H=%A=%:=%3=%,=%%=%=%=%=% =%=%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%}<%v<%o<%h<%a<%Z<%S<%L<%E<%><%7<%0<%)<%"<%<%<% <%<%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%z;%s;%l;%e;%^;%W;%P;%I;%B;%;;%4;%-;%&;%;%;%;% ;%;%:%:%:%:%:%:%:%:%:%:%:%:%:%:%:%:%:%:%~:%w:%p:%i:%b:%[:%T:%M:%F:%?:%8:%1:%*:%#:%:%:%:%:%:%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%{9%t9%m9%f9%_9%X9%Q9%J9%C9%<9%59%.9%'9% 9%9%9% 9%9%8%8%8%8%8%8%8%8%8%8%8%8%8%8%8%8%8%8%8%x8%q8%j8%c8%\8%U8%N8%G8%@8%98%28%+8%$8%8%8%8%8%8%7%7%7%7%7%7%7%7%7%7%7%7%7%7%7%7%7%7%|7%u7%n7%g7%`7%Y7%R7%K7%D7%=7%67%/7%(7%!7%7%7% 7%7%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%6%y6%r6%k6%d6%]6%V6%O6%H6%A6%:6%36%,6%%6%6%6%6% 6%6%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%}5%v5%o5%h5%a5%Z5%S5%L5%E5%>5%75%05%)5%"5%5%5% 5%5%4%4%4%4%4%4%4%4%4%4%4%4%4%4%4%4%4%4%4%z4%s4%l4%e4%^4%W4%P4%I4%B4%;4%44%-4%&4%4%4%4% 4%4%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%~3%w3%p3%i3%b3%[3%T3%M3%F3%?3%83%13%*3%#3%3%3%3%3%3%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%{2%t2%m2%f2%_2%X2%Q2%J2%C2%<2%52%.2%'2% 2%2%2% 2%2%1%1%1%1%1%1%1%1%1%1%1%1%1%1%1%1%1%1%1%x1%q1%j1%c1%\1%U1%N1%G1%@1%91%21%+1%$1%1%1%1%1%1%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%|0%u0%n0%g0%`0%Y0%R0%K0%D0%=0%60%/0%(0%!0%0%0% 0%0%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%/%y/%r/%k/%d/%]/%V/%O/%H/%A/%:/%3/%,/%%/%/%/%/% /%/%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%}.%v.%o.%h.%a.%Z.%S.%L.%E.%>.%7.%0.%).%".%.%.% .%.%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%z-%s-%l-%e-%^-%W-%P-%I-%B-%;-%4-%--%&-%-%-%-% -%-%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%~,%w,%p,%i,%b,%[,%T,%M,%F,%?,%8,%1,%*,%#,%,%,%,%,%,%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%{+%t+%m+%f+%_+%X+%Q+%J+%C+%<+%5+%.+%'+% +%+%+% +%+%*%*%*%*%*%*%*%*%*%*%*%*%*%*%*%*%*%*%*%x*%q*%j*%c*%\*%U*%N*%G*%@*%9*%2*%+*%$*%*%*%*%*%*%)%)%)%)%)%)%)%)%)%)%)%)%)%)%)%)%)%)%|)%u)%n)%g)%`)%Y)%R)%K)%D)%=)%6)%/)%()%!)%)%)% )%)%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%(%y(%r(%k(%d(%](%V(%O(%H(%A(%:(%3(%,(%%(%(%(%(% (%(%'%'%'%'%'%'%'%'%'%'%'%'%'%'%'%'%'%'%}'%v'%o'%h'%a'%Z'%S'%L'%E'%>'%7'%0'%)'%"'%'%'% '%'%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%z&%s&%l&%e&%^&%W&%P&%I&%B&%;&%4&%-&%&&%&%&%&% &%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%~%%w%%p%%i%%b%%[%%T%%M%%F%%?%%8%%1%%*%%#%%%%%%%%%%%%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%{$%t$%m$%f$%_$%X$%Q$%J$%C$%<$%5$%.$%'$% $%$%$% $%$%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%x#%q#%j#%c#%\#%U#%N#%G#%@#%9#%2#%+#%$#%#%#%#%#%#%"%"%"%"%"%"%"%"%"%"%"%"%"%"%"%"%"%"%|"%u"%n"%g"%`"%Y"%R"%K"%D"%="%6"%/"%("%!"%"%"% "%"%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%y!%r!%k!%d!%]!%V!%O!%H!%A!%:!%3!%,!%%!%!%!%!% !%!% % % % % % % % % % % % % % % % % % %} %v %o %h %a %Z %S %L %E %> %7 %0 %) %" % % % % %%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%% % % % % % % % % % % % % % % % % % %| %u %n %g %` %Y %R %K %D %= %6 %/ %( %! % % % % % % % % % % % % % % % % % % % % % % % %y %r %k %d %] %V %O %H %A %: %3 %, %% % % % % % % % % % % % % % % % % % % % % % % % %} %v %o %h %a %Z %S %L %E %> %7 %0 %) %" % % % % % % % % % % % % % % % % % % % % % % % %z %s %l %e %^ %W %P %I %B %; %4 %- %& % % % % % % % % % % % % % % % % % % % % % % % %~ %w %p %i %b %[ %T %M %F %? %8 %1 %* %# % % % % % %%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$ۿ$Կ$Ϳ$ƿ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$߾$ؾ$Ѿ$ʾ$þ$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$ܽ$ս$ν$ǽ$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$ټ$Ҽ$˼$ļ$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$ݻ$ֻ$ϻ$Ȼ$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$ں$Ӻ$̺$ź$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$޹$׹$й$ɹ$¹$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$۸$Ը$͸$Ƹ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$߷$ط$ѷ$ʷ$÷$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$ܶ$ն$ζ$Ƕ$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$ٵ$ҵ$˵$ĵ$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$ݴ$ִ$ϴ$ȴ$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$ڳ$ӳ$̳$ų$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$޲$ײ$в$ɲ$²$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$۱$Ա$ͱ$Ʊ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$߰$ذ$Ѱ$ʰ$ð$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$ܯ$կ$ί$ǯ$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$ٮ$Ү$ˮ$Į$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$ݭ$֭$ϭ$ȭ$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$ڬ$Ӭ$̬$Ŭ$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$ޫ$׫$Ы$ɫ$«$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$۪$Ԫ$ͪ$ƪ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$ߩ$ة$ѩ$ʩ$é$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$ܨ$ը$Ψ$Ǩ$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$٧$ҧ$˧$ħ$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$ݦ$֦$Ϧ$Ȧ$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$ڥ$ӥ$̥$ť$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$ޤ$פ$Ф$ɤ$¤$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$ۣ$ԣ$ͣ$ƣ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$ߢ$آ$Ѣ$ʢ$â$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$ܡ$ա$Ρ$ǡ$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$٠$Ҡ$ˠ$Ġ$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$ݟ$֟$ϟ$ȟ$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$ڞ$Ӟ$̞$Ş$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$ޝ$ם$Н$ɝ$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$ۜ$Ԝ$͜$Ɯ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$ߛ$؛$ћ$ʛ$Û$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$ܚ$՚$Κ$ǚ$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$ٙ$ҙ$˙$ę$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$ݘ$֘$Ϙ$Ș$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$ڗ$ӗ$̗$ŗ$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$ޖ$ז$Ж$ɖ$–$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$ە$ԕ$͕$ƕ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$ߔ$ؔ$є$ʔ$Ô$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$ܓ$Փ$Γ$Ǔ$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$ْ$Ғ$˒$Ē$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$ݑ$֑$ϑ$ȑ$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$ڐ$Ӑ$̐$Ő$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$ޏ$׏$Џ$ɏ$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$ێ$Ԏ$͎$Ǝ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$ߍ$؍$э$ʍ$Í$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$܌$Ռ$Ό$nj$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$ً$ҋ$ˋ$ċ$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$݊$֊$ϊ$Ȋ$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$ډ$Ӊ$̉$ʼn$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$ވ$׈$Ј$Ɉ$ˆ$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$ۇ$ԇ$͇$Ƈ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$߆$؆$ц$ʆ$Æ$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$܅$Յ$΅$Dž$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$ل$҄$˄$Ą$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$݃$փ$σ$ȃ$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$ڂ$ӂ$̂$ł$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$ށ$ׁ$Ё$Ɂ$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$ۀ$Ԁ$̀$ƀ$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$~$z~$s~$l~$e~$^~$W~$P~$I~$B~$;~$4~$-~$&~$~$~$~$ ~$~$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$~}$w}$p}$i}$b}$[}$T}$M}$F}$?}$8}$1}$*}$#}$}$}$}$}$}$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|${|$t|$m|$f|$_|$X|$Q|$J|$C|$<|$5|$.|$'|$ |$|$|$ |$|${${${${${${${${${${${${${${${${${${${$x{$q{$j{$c{$\{$U{$N{$G{$@{$9{$2{$+{$${${${${${${$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$|z$uz$nz$gz$`z$Yz$Rz$Kz$Dz$=z$6z$/z$(z$!z$z$z$ z$z$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$yy$ry$ky$dy$]y$Vy$Oy$Hy$Ay$:y$3y$,y$%y$y$y$y$ y$y$x$x$x$x$x$x$x$x$x$x$x$x$x$x$x$x$x$x$}x$vx$ox$hx$ax$Zx$Sx$Lx$Ex$>x$7x$0x$)x$"x$x$x$ x$x$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$w$zw$sw$lw$ew$^w$Ww$Pw$Iw$Bw$;w$4w$-w$&w$w$w$w$ w$w$v$v$v$v$v$v$v$v$v$v$v$v$v$v$v$v$v$v$~v$wv$pv$iv$bv$[v$Tv$Mv$Fv$?v$8v$1v$*v$#v$v$v$v$v$v$u$u$u$u$u$u$u$u$u$u$u$u$u$u$u$u$u$u${u$tu$mu$fu$_u$Xu$Qu$Ju$Cu$q$7q$0q$)q$"q$q$q$ q$q$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$zp$sp$lp$ep$^p$Wp$Pp$Ip$Bp$;p$4p$-p$&p$p$p$p$ p$p$o$o$o$o$o$o$o$o$o$o$o$o$o$o$o$o$o$o$~o$wo$po$io$bo$[o$To$Mo$Fo$?o$8o$1o$*o$#o$o$o$o$o$o$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n${n$tn$mn$fn$_n$Xn$Qn$Jn$Cn$j$7j$0j$)j$"j$j$j$ j$j$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$zi$si$li$ei$^i$Wi$Pi$Ii$Bi$;i$4i$-i$&i$i$i$i$ i$i$h$h$h$h$h$h$h$h$h$h$h$h$h$h$h$h$h$h$~h$wh$ph$ih$bh$[h$Th$Mh$Fh$?h$8h$1h$*h$#h$h$h$h$h$h$g$g$g$g$g$g$g$g$g$g$g$g$g$g$g$g$g$g${g$tg$mg$fg$_g$Xg$Qg$Jg$Cg$c$7c$0c$)c$"c$c$c$ c$c$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$zb$sb$lb$eb$^b$Wb$Pb$Ib$Bb$;b$4b$-b$&b$b$b$b$ b$b$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$~a$wa$pa$ia$ba$[a$Ta$Ma$Fa$?a$8a$1a$*a$#a$a$a$a$a$a$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`${`$t`$m`$f`$_`$X`$Q`$J`$C`$<`$5`$.`$'`$ `$`$`$ `$`$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$x_$q_$j_$c_$\_$U_$N_$G_$@_$9_$2_$+_$$_$_$_$_$_$_$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$|^$u^$n^$g^$`^$Y^$R^$K^$D^$=^$6^$/^$(^$!^$^$^$ ^$^$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$]$y]$r]$k]$d]$]]$V]$O]$H]$A]$:]$3]$,]$%]$]$]$]$ ]$]$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$}\$v\$o\$h\$a\$Z\$S\$L\$E\$>\$7\$0\$)\$"\$\$\$ \$\$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$z[$s[$l[$e[$^[$W[$P[$I[$B[$;[$4[$-[$&[$[$[$[$ [$[$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$Z$~Z$wZ$pZ$iZ$bZ$[Z$TZ$MZ$FZ$?Z$8Z$1Z$*Z$#Z$Z$Z$Z$Z$Z$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y$Y${Y$tY$mY$fY$_Y$XY$QY$JY$CY$U$7U$0U$)U$"U$U$U$ U$U$T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$T$zT$sT$lT$eT$^T$WT$PT$IT$BT$;T$4T$-T$&T$T$T$T$ T$T$S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$S$~S$wS$pS$iS$bS$[S$TS$MS$FS$?S$8S$1S$*S$#S$S$S$S$S$S$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R${R$tR$mR$fR$_R$XR$QR$JR$CR$N$7N$0N$)N$"N$N$N$ N$N$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$zM$sM$lM$eM$^M$WM$PM$IM$BM$;M$4M$-M$&M$M$M$M$ M$M$L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$~L$wL$pL$iL$bL$[L$TL$ML$FL$?L$8L$1L$*L$#L$L$L$L$L$L$K$K$K$K$K$K$K$K$K$K$K$K$K$K$K$K$K$K${K$tK$mK$fK$_K$XK$QK$JK$CK$G$7G$0G$)G$"G$G$G$ G$G$F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$F$zF$sF$lF$eF$^F$WF$PF$IF$BF$;F$4F$-F$&F$F$F$F$ F$F$E$E$E$E$E$E$E$E$E$E$E$E$E$E$E$E$E$E$~E$wE$pE$iE$bE$[E$TE$ME$FE$?E$8E$1E$*E$#E$E$E$E$E$E$D$D$D$D$D$D$D$D$D$D$D$D$D$D$D$D$D$D${D$tD$mD$fD$_D$XD$QD$JD$CD$@$7@$0@$)@$"@$@$@$ @$@$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$?$z?$s?$l?$e?$^?$W?$P?$I?$B?$;?$4?$-?$&?$?$?$?$ ?$?$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$>$~>$w>$p>$i>$b>$[>$T>$M>$F>$?>$8>$1>$*>$#>$>$>$>$>$>$=$=$=$=$=$=$=$=$=$=$=$=$=$=$=$=$=$=${=$t=$m=$f=$_=$X=$Q=$J=$C=$<=$5=$.=$'=$ =$=$=$ =$=$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$x<$q<$j<$c<$\<$U<$N<$G<$@<$9<$2<$+<$$<$<$<$<$<$<$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$;$|;$u;$n;$g;$`;$Y;$R;$K;$D;$=;$6;$/;$(;$!;$;$;$ ;$;$:$:$:$:$:$:$:$:$:$:$:$:$:$:$:$:$:$:$:$y:$r:$k:$d:$]:$V:$O:$H:$A:$::$3:$,:$%:$:$:$:$ :$:$9$9$9$9$9$9$9$9$9$9$9$9$9$9$9$9$9$9$}9$v9$o9$h9$a9$Z9$S9$L9$E9$>9$79$09$)9$"9$9$9$ 9$9$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$8$z8$s8$l8$e8$^8$W8$P8$I8$B8$;8$48$-8$&8$8$8$8$ 8$8$7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$~7$w7$p7$i7$b7$[7$T7$M7$F7$?7$87$17$*7$#7$7$7$7$7$7$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6${6$t6$m6$f6$_6$X6$Q6$J6$C6$<6$56$.6$'6$ 6$6$6$ 6$6$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$x5$q5$j5$c5$\5$U5$N5$G5$@5$95$25$+5$$5$5$5$5$5$5$4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$4$|4$u4$n4$g4$`4$Y4$R4$K4$D4$=4$64$/4$(4$!4$4$4$ 4$4$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$y3$r3$k3$d3$]3$V3$O3$H3$A3$:3$33$,3$%3$3$3$3$ 3$3$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$}2$v2$o2$h2$a2$Z2$S2$L2$E2$>2$72$02$)2$"2$2$2$ 2$2$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$z1$s1$l1$e1$^1$W1$P1$I1$B1$;1$41$-1$&1$1$1$1$ 1$1$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$~0$w0$p0$i0$b0$[0$T0$M0$F0$?0$80$10$*0$#0$0$0$0$0$0$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/${/$t/$m/$f/$_/$X/$Q/$J/$C/$+$7+$0+$)+$"+$+$+$ +$+$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$z*$s*$l*$e*$^*$W*$P*$I*$B*$;*$4*$-*$&*$*$*$*$ *$*$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$~)$w)$p)$i)$b)$[)$T)$M)$F)$?)$8)$1)$*)$#)$)$)$)$)$)$($($($($($($($($($($($($($($($($($(${($t($m($f($_($X($Q($J($C($<($5($.($'($ ($($($ ($($'$'$'$'$'$'$'$'$'$'$'$'$'$'$'$'$'$'$'$x'$q'$j'$c'$\'$U'$N'$G'$@'$9'$2'$+'$$'$'$'$'$'$'$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$|&$u&$n&$g&$`&$Y&$R&$K&$D&$=&$6&$/&$(&$!&$&$&$ &$&$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$y%$r%$k%$d%$]%$V%$O%$H%$A%$:%$3%$,%$%%$%$%$%$ %$%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}$$v$$o$$h$$a$$Z$$S$$L$$E$$>$$7$$0$$)$$"$$$$$$ $$$$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$z#$s#$l#$e#$^#$W#$P#$I#$B#$;#$4#$-#$&#$#$#$#$ #$#$"$"$"$"$"$"$"$"$"$"$"$"$"$"$"$"$"$"$~"$w"$p"$i"$b"$["$T"$M"$F"$?"$8"$1"$*"$#"$"$"$"$"$"$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!${!$t!$m!$f!$_!$X!$Q!$J!$C!$$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $~ $w $p $i $b $[ $T $M $F $? $8 $1 $* $# $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ${ $t $m $f $_ $X $Q $J $C $< $5 $. $' $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $x $q $j $c $\ $U $N $G $@ $9 $2 $+ $$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $| $u $n $g $` $Y $R $K $D $= $6 $/ $( $! $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $y $r $k $d $] $V $O $H $A $: $3 $, $% $ $ $ $ $ $$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*############ݿ#ֿ#Ͽ#ȿ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #######ھ#Ӿ#̾#ž###########x#q#j#c#\#U#N#G#@#9#2#+#$##########޽#׽#н#ɽ#½##########|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #######ۼ#Լ#ͼ#Ƽ###########y#r#k#d#]#V#O#H#A#:#3#,#%#### ######߻#ػ#ѻ#ʻ#û##########}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #######ܺ#պ#κ#Ǻ###########z#s#l#e#^#W#P#I#B#;#4#-#&#### #######ٹ#ҹ#˹#Ĺ##########~#w#p#i#b#[#T#M#F#?#8#1#*############ݸ#ָ#ϸ#ȸ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #######ڷ#ӷ#̷#ŷ###########x#q#j#c#\#U#N#G#@#9#2#+#$##########޶#׶#ж#ɶ#¶##########|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #######۵#Ե#͵#Ƶ###########y#r#k#d#]#V#O#H#A#:#3#,#%#### ######ߴ#ش#Ѵ#ʴ#ô##########}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #######ܳ#ճ#γ#dz###########z#s#l#e#^#W#P#I#B#;#4#-#&#### #######ٲ#Ҳ#˲#IJ##########~#w#p#i#b#[#T#M#F#?#8#1#*############ݱ#ֱ#ϱ#ȱ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #######ڰ#Ӱ#̰#Ű###########x#q#j#c#\#U#N#G#@#9#2#+#$##########ޯ#ׯ#Я#ɯ#¯##########|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #######ۮ#Ԯ#ͮ#Ʈ###########y#r#k#d#]#V#O#H#A#:#3#,#%#### ######߭#ح#ѭ#ʭ#í##########}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #######ܬ#լ#ά#Ǭ###########z#s#l#e#^#W#P#I#B#;#4#-#&#### #######٫#ҫ#˫#ī##########~#w#p#i#b#[#T#M#F#?#8#1#*############ݪ#֪#Ϫ#Ȫ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #######ک#ө#̩#ũ###########x#q#j#c#\#U#N#G#@#9#2#+#$##########ި#ר#Ш#ɨ#¨##########|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #######ۧ#ԧ#ͧ#Ƨ###########y#r#k#d#]#V#O#H#A#:#3#,#%#### ######ߦ#ئ#Ѧ#ʦ#æ##########}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #######ܥ#ե#Υ#ǥ###########z#s#l#e#^#W#P#I#B#;#4#-#&#### #######٤#Ҥ#ˤ#Ĥ##########~#w#p#i#b#[#T#M#F#?#8#1#*############ݣ#֣#ϣ#ȣ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #######ڢ#Ӣ#̢#Ţ###########x#q#j#c#\#U#N#G#@#9#2#+#$##########ޡ#ס#С#ɡ#¡##########|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #######۠#Ԡ#͠#Ơ###########y#r#k#d#]#V#O#H#A#:#3#,#%#### ######ߟ#؟#џ#ʟ#ß##########}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #######ܞ#՞#Ξ#Ǟ###########z#s#l#e#^#W#P#I#B#;#4#-#&#### #######ٝ#ҝ#˝#ĝ##########~#w#p#i#b#[#T#M#F#?#8#1#*############ݜ#֜#Ϝ#Ȝ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #######ڛ#ӛ#̛#ś###########x#q#j#c#\#U#N#G#@#9#2#+#$##########ޚ#ך#К#ɚ#š##########|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #######ۙ#ԙ#͙#ƙ###########y#r#k#d#]#V#O#H#A#:#3#,#%#### ######ߘ#ؘ#ј#ʘ#Ø##########}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #######ܗ#՗#Η#Ǘ###########z#s#l#e#^#W#P#I#B#;#4#-#&#### #######ٖ#Җ#˖#Ė##########~#w#p#i#b#[#T#M#F#?#8#1#*############ݕ#֕#ϕ#ȕ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #######ڔ#Ӕ#̔#Ŕ###########x#q#j#c#\#U#N#G#@#9#2#+#$##########ޓ#ד#Г#ɓ#“##########|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #######ے#Ԓ#͒#ƒ###########y#r#k#d#]#V#O#H#A#:#3#,#%#### ######ߑ#ؑ#ё#ʑ#Ñ##########}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #######ܐ#Ր#ΐ#ǐ###########z#s#l#e#^#W#P#I#B#;#4#-#&#### #######ُ#ҏ#ˏ#ď##########~#w#p#i#b#[#T#M#F#?#8#1#*############ݎ#֎#ώ#Ȏ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #######ڍ#Ӎ#̍#ō###########x#q#j#c#\#U#N#G#@#9#2#+#$##########ތ#׌#Ќ#Ɍ#Œ##########|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #######ۋ#ԋ#͋#Ƌ###########y#r#k#d#]#V#O#H#A#:#3#,#%#### ######ߊ#؊#ъ#ʊ#Ê##########}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #######܉#Չ#Ή#lj###########z#s#l#e#^#W#P#I#B#;#4#-#&#### #######و#҈#ˈ#Ĉ##########~#w#p#i#b#[#T#M#F#?#8#1#*############݇#և#χ#ȇ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #######چ#ӆ#̆#ņ###########x#q#j#c#\#U#N#G#@#9#2#+#$##########ޅ#ׅ#Ѕ#Ʌ#…##########|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #######ۄ#Ԅ#̈́#Ƅ###########y#r#k#d#]#V#O#H#A#:#3#,#%#### ######߃#؃#у#ʃ#Ã##########}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #######܂#Ղ#΂#ǂ###########z#s#l#e#^#W#P#I#B#;#4#-#&#### #######ف#ҁ#ˁ#ā##########~#w#p#i#b#[#T#M#F#?#8#1#*############݀#ր#π#Ȁ###########{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$######~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#|~#u~#n~#g~#`~#Y~#R~#K~#D~#=~#6~#/~#(~#!~#~#~# ~#~#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#y}#r}#k}#d}#]}#V}#O}#H}#A}#:}#3}#,}#%}#}#}#}# }#}#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#}|#v|#o|#h|#a|#Z|#S|#L|#E|#>|#7|#0|#)|#"|#|#|# |#|#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#z{#s{#l{#e{#^{#W{#P{#I{#B{#;{#4{#-{#&{#{#{#{# {#{#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#~z#wz#pz#iz#bz#[z#Tz#Mz#Fz#?z#8z#1z#*z##z#z#z#z#z#z#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#{y#ty#my#fy#_y#Xy#Qy#Jy#Cy#u#7u#0u#)u#"u#u#u# u#u#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#zt#st#lt#et#^t#Wt#Pt#It#Bt#;t#4t#-t#&t#t#t#t# t#t#s#s#s#s#s#s#s#s#s#s#s#s#s#s#s#s#s#s#~s#ws#ps#is#bs#[s#Ts#Ms#Fs#?s#8s#1s#*s##s#s#s#s#s#s#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#r#{r#tr#mr#fr#_r#Xr#Qr#Jr#Cr#n#7n#0n#)n#"n#n#n# n#n#m#m#m#m#m#m#m#m#m#m#m#m#m#m#m#m#m#m#m#zm#sm#lm#em#^m#Wm#Pm#Im#Bm#;m#4m#-m#&m#m#m#m# m#m#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#~l#wl#pl#il#bl#[l#Tl#Ml#Fl#?l#8l#1l#*l##l#l#l#l#l#l#k#k#k#k#k#k#k#k#k#k#k#k#k#k#k#k#k#k#{k#tk#mk#fk#_k#Xk#Qk#Jk#Ck#g#7g#0g#)g#"g#g#g# g#g#f#f#f#f#f#f#f#f#f#f#f#f#f#f#f#f#f#f#f#zf#sf#lf#ef#^f#Wf#Pf#If#Bf#;f#4f#-f#&f#f#f#f# f#f#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#~e#we#pe#ie#be#[e#Te#Me#Fe#?e#8e#1e#*e##e#e#e#e#e#e#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#{d#td#md#fd#_d#Xd#Qd#Jd#Cd#`#7`#0`#)`#"`#`#`# `#`#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#z_#s_#l_#e_#^_#W_#P_#I_#B_#;_#4_#-_#&_#_#_#_# _#_#^#^#^#^#^#^#^#^#^#^#^#^#^#^#^#^#^#^#~^#w^#p^#i^#b^#[^#T^#M^#F^#?^#8^#1^#*^##^#^#^#^#^#^#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#{]#t]#m]#f]#_]#X]#Q]#J]#C]#<]#5]#.]#']# ]#]#]# ]#]#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#x\#q\#j\#c\#\\#U\#N\#G\#@\#9\#2\#+\#$\#\#\#\#\#\#[#[#[#[#[#[#[#[#[#[#[#[#[#[#[#[#[#[#|[#u[#n[#g[#`[#Y[#R[#K[#D[#=[#6[#/[#([#![#[#[# [#[#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#yZ#rZ#kZ#dZ#]Z#VZ#OZ#HZ#AZ#:Z#3Z#,Z#%Z#Z#Z#Z# Z#Z#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#Y#}Y#vY#oY#hY#aY#ZY#SY#LY#EY#>Y#7Y#0Y#)Y#"Y#Y#Y# Y#Y#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#zX#sX#lX#eX#^X#WX#PX#IX#BX#;X#4X#-X#&X#X#X#X# X#X#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#~W#wW#pW#iW#bW#[W#TW#MW#FW#?W#8W#1W#*W##W#W#W#W#W#W#V#V#V#V#V#V#V#V#V#V#V#V#V#V#V#V#V#V#{V#tV#mV#fV#_V#XV#QV#JV#CV#R#7R#0R#)R#"R#R#R# R#R#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#zQ#sQ#lQ#eQ#^Q#WQ#PQ#IQ#BQ#;Q#4Q#-Q#&Q#Q#Q#Q# Q#Q#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#~P#wP#pP#iP#bP#[P#TP#MP#FP#?P#8P#1P#*P##P#P#P#P#P#P#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#{O#tO#mO#fO#_O#XO#QO#JO#CO#K#7K#0K#)K#"K#K#K# K#K#J#J#J#J#J#J#J#J#J#J#J#J#J#J#J#J#J#J#J#zJ#sJ#lJ#eJ#^J#WJ#PJ#IJ#BJ#;J#4J#-J#&J#J#J#J# J#J#I#I#I#I#I#I#I#I#I#I#I#I#I#I#I#I#I#I#~I#wI#pI#iI#bI#[I#TI#MI#FI#?I#8I#1I#*I##I#I#I#I#I#I#H#H#H#H#H#H#H#H#H#H#H#H#H#H#H#H#H#H#{H#tH#mH#fH#_H#XH#QH#JH#CH#D#7D#0D#)D#"D#D#D# D#D#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#zC#sC#lC#eC#^C#WC#PC#IC#BC#;C#4C#-C#&C#C#C#C# C#C#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#~B#wB#pB#iB#bB#[B#TB#MB#FB#?B#8B#1B#*B##B#B#B#B#B#B#A#A#A#A#A#A#A#A#A#A#A#A#A#A#A#A#A#A#{A#tA#mA#fA#_A#XA#QA#JA#CA##>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#y>#r>#k>#d>#]>#V>#O>#H>#A>#:>#3>#,>#%>#>#>#># >#>#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#}=#v=#o=#h=#a=#Z=#S=#L=#E=#>=#7=#0=#)=#"=#=#=# =#=#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#z<#s<#l<#e<#^<#W<#P<#I<#B<#;<#4<#-<#&<#<#<#<# <#<#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#~;#w;#p;#i;#b;#[;#T;#M;#F;#?;#8;#1;#*;##;#;#;#;#;#;#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#{:#t:#m:#f:#_:#X:#Q:#J:#C:#<:#5:#.:#':# :#:#:# :#:#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#x9#q9#j9#c9#\9#U9#N9#G9#@9#99#29#+9#$9#9#9#9#9#9#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#|8#u8#n8#g8#`8#Y8#R8#K8#D8#=8#68#/8#(8#!8#8#8# 8#8#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#y7#r7#k7#d7#]7#V7#O7#H7#A7#:7#37#,7#%7#7#7#7# 7#7#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#}6#v6#o6#h6#a6#Z6#S6#L6#E6#>6#76#06#)6#"6#6#6# 6#6#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#z5#s5#l5#e5#^5#W5#P5#I5#B5#;5#45#-5#&5#5#5#5# 5#5#4#4#4#4#4#4#4#4#4#4#4#4#4#4#4#4#4#4#~4#w4#p4#i4#b4#[4#T4#M4#F4#?4#84#14#*4##4#4#4#4#4#4#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#{3#t3#m3#f3#_3#X3#Q3#J3#C3#<3#53#.3#'3# 3#3#3# 3#3#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#x2#q2#j2#c2#\2#U2#N2#G2#@2#92#22#+2#$2#2#2#2#2#2#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#|1#u1#n1#g1#`1#Y1#R1#K1#D1#=1#61#/1#(1#!1#1#1# 1#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#y0#r0#k0#d0#]0#V0#O0#H0#A0#:0#30#,0#%0#0#0#0# 0#0#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#}/#v/#o/#h/#a/#Z/#S/#L/#E/#>/#7/#0/#)/#"/#/#/# /#/#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#z.#s.#l.#e.#^.#W.#P.#I.#B.#;.#4.#-.#&.#.#.#.# .#.#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#~-#w-#p-#i-#b-#[-#T-#M-#F-#?-#8-#1-#*-##-#-#-#-#-#-#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#{,#t,#m,#f,#_,#X,#Q,#J,#C,#<,#5,#.,#',# ,#,#,# ,#,#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#x+#q+#j+#c+#\+#U+#N+#G+#@+#9+#2+#++#$+#+#+#+#+#+#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#|*#u*#n*#g*#`*#Y*#R*#K*#D*#=*#6*#/*#(*#!*#*#*# *#*#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#y)#r)#k)#d)#])#V)#O)#H)#A)#:)#3)#,)#%)#)#)#)# )#)#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#}(#v(#o(#h(#a(#Z(#S(#L(#E(#>(#7(#0(#)(#"(#(#(# (#(#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#z'#s'#l'#e'#^'#W'#P'#I'#B'#;'#4'#-'#&'#'#'#'# '#'#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#~&#w&#p&#i&#b&#[&#T&#M&#F&#?&#8&#1&#*&##&#&#&#&#&#&#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#{%#t%#m%#f%#_%#X%#Q%#J%#C%#<%#5%#.%#'%# %#%#%# %#%#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#x$#q$#j$#c$#\$#U$#N$#G$#@$#9$#2$#+$#$$#$#$#$#$#$#####################################|##u##n##g##`##Y##R##K##D##=##6##/##(##!###### ####"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#y"#r"#k"#d"#]"#V"#O"#H"#A"#:"#3"#,"#%"#"#"#"# "#"#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#}!#v!#o!#h!#a!#Z!#S!#L!#E!#>!#7!#0!#)!#"!#!#!# !#!# # # # # # # # # # # # # # # # # # # #z #s #l #e #^ #W #P #I #B #; #4 #- #& # # # # # ###################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ## # # # # # # # # # # # # # # # # # # #y #r #k #d #] #V #O #H #A #: #3 #, #% # # # # # # # # # # # # # # # # # # # # # # # #} #v #o #h #a #Z #S #L #E #> #7 #0 #) #" # # # # # # # # # # # # # # # # # # # # # # # #z #s #l #e #^ #W #P #I #B #; #4 #- #& # # # # # # # # # # # # # # # # # # # # # # # #~ #w #p #i #b #[ #T #M #F #? #8 #1 #* ## # # # # # # # # # # # # # # # # # # # # # # # #{ #t #m #f #_ #X #Q #J #C #< #5 #. #' # # # # # ####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### #####################y#r#k#d#]#V#O#H#A#:#3#,#%#### ####################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### #####################z#s#l#e#^#W#P#I#B#;#4#-#&#### ####################~#w#p#i#b#[#T#M#F#?#8#1#*##########################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### #####################x#q#j#c#\#U#N#G#@#9#2#+#$########################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""߿"ؿ"ѿ"ʿ"ÿ""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""ܾ"վ"ξ"Ǿ"""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """""""ٽ"ҽ"˽"Ľ""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""ݼ"ּ"ϼ"ȼ"""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""ڻ"ӻ"̻"Ż"""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""޺"׺"к"ɺ"º""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""۹"Թ"͹"ƹ"""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""߸"ظ"Ѹ"ʸ"ø""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""ܷ"շ"η"Ƿ"""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """""""ٶ"Ҷ"˶"Ķ""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""ݵ"ֵ"ϵ"ȵ"""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""ڴ"Ӵ"̴"Ŵ"""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""޳"׳"г"ɳ"³""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""۲"Բ"Ͳ"Ʋ"""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""߱"ر"ѱ"ʱ"ñ""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""ܰ"հ"ΰ"ǰ"""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """""""ٯ"ү"˯"į""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""ݮ"֮"Ϯ"Ȯ"""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""ڭ"ӭ"̭"ŭ"""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""ެ"׬"Ь"ɬ"¬""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""۫"ԫ"ͫ"ƫ"""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""ߪ"ت"Ѫ"ʪ"ê""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""ܩ"թ"Ω"ǩ"""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """""""٨"Ҩ"˨"Ĩ""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""ݧ"֧"ϧ"ȧ"""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""ڦ"Ӧ"̦"Ŧ"""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""ޥ"ץ"Х"ɥ"¥""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""ۤ"Ԥ"ͤ"Ƥ"""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""ߣ"أ"ѣ"ʣ"ã""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""ܢ"բ"΢"Ǣ"""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """""""١"ҡ"ˡ"ġ""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""ݠ"֠"Ϡ"Ƞ"""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""ڟ"ӟ"̟"ş"""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""ޞ"מ"О"ɞ"ž""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""۝"ԝ"͝"Ɲ"""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""ߜ"؜"ќ"ʜ"Ü""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""ܛ"՛"Λ"Ǜ"""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """""""ٚ"Қ"˚"Ě""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""ݙ"֙"ϙ"ș"""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""ژ"Ә"̘"Ř"""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""ޗ"ח"З"ɗ"—""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""ۖ"Ԗ"͖"Ɩ"""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""ߕ"ؕ"ѕ"ʕ"Õ""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""ܔ"Ք"Δ"ǔ"""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """""""ٓ"ғ"˓"ē""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""ݒ"֒"ϒ"Ȓ"""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""ڑ"ӑ"̑"ő"""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""ސ"א"А"ɐ"""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""ۏ"ԏ"͏"Ə"""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""ߎ"؎"ю"ʎ"Î""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""܍"Ս"΍"Ǎ"""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """""""ٌ"Ҍ"ˌ"Č""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""݋"֋"ϋ"ȋ"""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""ڊ"ӊ"̊"Ŋ"""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""މ"׉"Љ"ɉ"‰""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""ۈ"Ԉ"͈"ƈ"""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""߇"؇"ч"ʇ"Ç""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""܆"Ն"Ά"dž"""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """""""م"҅"˅"ą""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""݄"ք"τ"Ȅ"""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""ڃ"Ӄ"̃"Ń"""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""ނ"ׂ"Ђ"ɂ"‚""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""ہ"ԁ"́"Ɓ"""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""߀"؀"р"ʀ"À""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""~"~"~"~"~"~"~"~"~"~"~"~"~"~"~"~"~"~"~~"w~"p~"i~"b~"[~"T~"M~"F~"?~"8~"1~"*~"#~"~"~"~"~"~"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"{}"t}"m}"f}"_}"X}"Q}"J}"C}"<}"5}".}"'}" }"}"}" }"}"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"x|"q|"j|"c|"\|"U|"N|"G|"@|"9|"2|"+|"$|"|"|"|"|"|"{"{"{"{"{"{"{"{"{"{"{"{"{"{"{"{"{"{"|{"u{"n{"g{"`{"Y{"R{"K{"D{"={"6{"/{"({"!{"{"{" {"{"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"z"yz"rz"kz"dz"]z"Vz"Oz"Hz"Az":z"3z",z"%z"z"z"z" z"z"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"}y"vy"oy"hy"ay"Zy"Sy"Ly"Ey">y"7y"0y")y""y"y"y" y"y"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"zx"sx"lx"ex"^x"Wx"Px"Ix"Bx";x"4x"-x"&x"x"x"x" x"x"w"w"w"w"w"w"w"w"w"w"w"w"w"w"w"w"w"w"~w"ww"pw"iw"bw"[w"Tw"Mw"Fw"?w"8w"1w"*w"#w"w"w"w"w"w"v"v"v"v"v"v"v"v"v"v"v"v"v"v"v"v"v"v"{v"tv"mv"fv"_v"Xv"Qv"Jv"Cv"r"7r"0r")r""r"r"r" r"r"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"zq"sq"lq"eq"^q"Wq"Pq"Iq"Bq";q"4q"-q"&q"q"q"q" q"q"p"p"p"p"p"p"p"p"p"p"p"p"p"p"p"p"p"p"~p"wp"pp"ip"bp"[p"Tp"Mp"Fp"?p"8p"1p"*p"#p"p"p"p"p"p"o"o"o"o"o"o"o"o"o"o"o"o"o"o"o"o"o"o"{o"to"mo"fo"_o"Xo"Qo"Jo"Co"k"7k"0k")k""k"k"k" k"k"j"j"j"j"j"j"j"j"j"j"j"j"j"j"j"j"j"j"j"zj"sj"lj"ej"^j"Wj"Pj"Ij"Bj";j"4j"-j"&j"j"j"j" j"j"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"~i"wi"pi"ii"bi"[i"Ti"Mi"Fi"?i"8i"1i"*i"#i"i"i"i"i"i"h"h"h"h"h"h"h"h"h"h"h"h"h"h"h"h"h"h"{h"th"mh"fh"_h"Xh"Qh"Jh"Ch"d"7d"0d")d""d"d"d" d"d"c"c"c"c"c"c"c"c"c"c"c"c"c"c"c"c"c"c"c"zc"sc"lc"ec"^c"Wc"Pc"Ic"Bc";c"4c"-c"&c"c"c"c" c"c"b"b"b"b"b"b"b"b"b"b"b"b"b"b"b"b"b"b"~b"wb"pb"ib"bb"[b"Tb"Mb"Fb"?b"8b"1b"*b"#b"b"b"b"b"b"a"a"a"a"a"a"a"a"a"a"a"a"a"a"a"a"a"a"{a"ta"ma"fa"_a"Xa"Qa"Ja"Ca"]"7]"0]")]""]"]"]" ]"]"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"z\"s\"l\"e\"^\"W\"P\"I\"B\";\"4\"-\"&\"\"\"\" \"\"["["["["["["["["["["["["["["["["["["~["w["p["i["b["[["T["M["F["?["8["1["*["#["["["["["["Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"{Z"tZ"mZ"fZ"_Z"XZ"QZ"JZ"CZ"V"7V"0V")V""V"V"V" V"V"U"U"U"U"U"U"U"U"U"U"U"U"U"U"U"U"U"U"U"zU"sU"lU"eU"^U"WU"PU"IU"BU";U"4U"-U"&U"U"U"U" U"U"T"T"T"T"T"T"T"T"T"T"T"T"T"T"T"T"T"T"~T"wT"pT"iT"bT"[T"TT"MT"FT"?T"8T"1T"*T"#T"T"T"T"T"T"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"S"{S"tS"mS"fS"_S"XS"QS"JS"CS"O"7O"0O")O""O"O"O" O"O"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"zN"sN"lN"eN"^N"WN"PN"IN"BN";N"4N"-N"&N"N"N"N" N"N"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"~M"wM"pM"iM"bM"[M"TM"MM"FM"?M"8M"1M"*M"#M"M"M"M"M"M"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"{L"tL"mL"fL"_L"XL"QL"JL"CL"H"7H"0H")H""H"H"H" H"H"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"zG"sG"lG"eG"^G"WG"PG"IG"BG";G"4G"-G"&G"G"G"G" G"G"F"F"F"F"F"F"F"F"F"F"F"F"F"F"F"F"F"F"~F"wF"pF"iF"bF"[F"TF"MF"FF"?F"8F"1F"*F"#F"F"F"F"F"F"E"E"E"E"E"E"E"E"E"E"E"E"E"E"E"E"E"E"{E"tE"mE"fE"_E"XE"QE"JE"CE"A"7A"0A")A""A"A"A" A"A"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"z@"s@"l@"e@"^@"W@"P@"I@"B@";@"4@"-@"&@"@"@"@" @"@"?"?"?"?"?"?"?"?"?"?"?"?"?"?"?"?"?"?"~?"w?"p?"i?"b?"[?"T?"M?"F?"??"8?"1?"*?"#?"?"?"?"?"?">">">">">">">">">">">">">">">">">">"{>"t>"m>"f>"_>"X>"Q>"J>"C>"<>"5>".>"'>" >">">" >">"="="="="="="="="="="="="="="="="="="="x="q="j="c="\="U="N="G="@="9="2="+="$="="="="="="<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"|<"u<"n<"g<"`<"Y<"R<"K<"D<"=<"6<"/<"(<"!<"<"<" <"<";";";";";";";";";";";";";";";";";";";"y;"r;"k;"d;"];"V;"O;"H;"A;":;"3;",;"%;";";";" ;";":":":":":":":":":":":":":":":":":":"}:"v:"o:"h:"a:"Z:"S:"L:"E:">:"7:"0:"):"":":":" :":"9"9"9"9"9"9"9"9"9"9"9"9"9"9"9"9"9"9"9"z9"s9"l9"e9"^9"W9"P9"I9"B9";9"49"-9"&9"9"9"9" 9"9"8"8"8"8"8"8"8"8"8"8"8"8"8"8"8"8"8"8"~8"w8"p8"i8"b8"[8"T8"M8"F8"?8"88"18"*8"#8"8"8"8"8"8"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"{7"t7"m7"f7"_7"X7"Q7"J7"C7"<7"57".7"'7" 7"7"7" 7"7"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"x6"q6"j6"c6"\6"U6"N6"G6"@6"96"26"+6"$6"6"6"6"6"6"5"5"5"5"5"5"5"5"5"5"5"5"5"5"5"5"5"5"|5"u5"n5"g5"`5"Y5"R5"K5"D5"=5"65"/5"(5"!5"5"5" 5"5"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"4"y4"r4"k4"d4"]4"V4"O4"H4"A4":4"34",4"%4"4"4"4" 4"4"3"3"3"3"3"3"3"3"3"3"3"3"3"3"3"3"3"3"}3"v3"o3"h3"a3"Z3"S3"L3"E3">3"73"03")3""3"3"3" 3"3"2"2"2"2"2"2"2"2"2"2"2"2"2"2"2"2"2"2"2"z2"s2"l2"e2"^2"W2"P2"I2"B2";2"42"-2"&2"2"2"2" 2"2"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"~1"w1"p1"i1"b1"[1"T1"M1"F1"?1"81"11"*1"#1"1"1"1"1"1"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"{0"t0"m0"f0"_0"X0"Q0"J0"C0"<0"50".0"'0" 0"0"0" 0"0"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"x/"q/"j/"c/"\/"U/"N/"G/"@/"9/"2/"+/"$/"/"/"/"/"/"."."."."."."."."."."."."."."."."."."|."u."n."g."`."Y."R."K."D."=."6."/."(."!."."." ."."-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"y-"r-"k-"d-"]-"V-"O-"H-"A-":-"3-",-"%-"-"-"-" -"-",",",",",",",",",",",",",",",",",","},"v,"o,"h,"a,"Z,"S,"L,"E,">,"7,"0,"),"",","," ,","+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"z+"s+"l+"e+"^+"W+"P+"I+"B+";+"4+"-+"&+"+"+"+" +"+"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"~*"w*"p*"i*"b*"[*"T*"M*"F*"?*"8*"1*"**"#*"*"*"*"*"*")")")")")")")")")")")")")")")")")")"{)"t)"m)"f)"_)"X)"Q)"J)"C)"<)"5)".)"')" )")")" )")"("("("("("("("("("("("("("("("("("("("x("q("j("c("\("U("N("G("@("9("2("+("$("("("("("("'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"|'"u'"n'"g'"`'"Y'"R'"K'"D'"='"6'"/'"('"!'"'"'" '"'"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"&"y&"r&"k&"d&"]&"V&"O&"H&"A&":&"3&",&"%&"&"&"&" &"&"%"%"%"%"%"%"%"%"%"%"%"%"%"%"%"%"%"%"}%"v%"o%"h%"a%"Z%"S%"L%"E%">%"7%"0%")%""%"%"%" %"%"$"$"$"$"$"$"$"$"$"$"$"$"$"$"$"$"$"$"$"z$"s$"l$"e$"^$"W$"P$"I$"B$";$"4$"-$"&$"$"$"$" $"$"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"~#"w#"p#"i#"b#"[#"T#"M#"F#"?#"8#"1#"*#"##"#"#"#"#"#"""""""""""""""""""""""""""""""""""""{""t""m""f""_""X""Q""J""C""<""5"".""'"" """""" """"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"x!"q!"j!"c!"\!"U!"N!"G!"@!"9!"2!"+!"$!"!"!"!"!"!" " " " " " " " " " " " " " " " " " "| "u "n "g "` "Y "R "K "D "= "6 "/ "( "! " " " " """"""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#"""""" " " " " " " " " " " " " " " " " " "{ "t "m "f "_ "X "Q "J "C "< "5 ". "' " " " " " " " " " " " " " " " " " " " " " " " " "x "q "j "c "\ "U "N "G "@ "9 "2 "+ "$ " " " " " " " " " " " " " " " " " " " " " " " "| "u "n "g "` "Y "R "K "D "= "6 "/ "( "! " " " " " " " " " " " " " " " " " " " " " " " "y "r "k "d "] "V "O "H "A ": "3 ", "% " " " " " " " " " " " " " " " " " " " " " " " "} "v "o "h "a "Z "S "L "E "> "7 "0 ") "" " " " " """"""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ """""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" """""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" """"""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" """""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" """"""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!ܻ!ջ!λ!ǻ!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!ٺ!Һ!˺!ĺ!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!ݹ!ֹ!Ϲ!ȹ!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!ܴ!մ!δ!Ǵ!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!ٳ!ҳ!˳!ij!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!ݲ!ֲ!ϲ!Ȳ!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!ܭ!խ!έ!ǭ!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!٬!Ҭ!ˬ!Ĭ!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!ݫ!֫!ϫ!ȫ!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!ܦ!զ!Φ!Ǧ!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!٥!ҥ!˥!ĥ!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!ݤ!֤!Ϥ!Ȥ!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!ܟ!՟!Ο!ǟ!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!ٞ!Ҟ!˞!Ğ!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!ݝ!֝!ϝ!ȝ!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!ܘ!՘!Θ!ǘ!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!ٗ!җ!˗!ė!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!ݖ!֖!ϖ!Ȗ!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!ܑ!Ց!Α!Ǒ!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!ِ!Ґ!ː!Đ!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!ݏ!֏!Ϗ!ȏ!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!܊!Պ!Ί!NJ!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!ى!҉!ˉ!ĉ!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!݈!ֈ!ψ!Ȉ!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!!7!0!)!"!!! !!!!!!!܃!Ճ!΃!ǃ!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!ق!҂!˂!Ă!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!݁!ց!ρ!ȁ!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!}!7}!0}!)}!"}!}!}! }!}!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!|!z|!s|!l|!e|!^|!W|!P|!I|!B|!;|!4|!-|!&|!|!|!|! |!|!{!{!{!{!{!{!{!{!{!{!{!{!{!{!{!{!{!{!~{!w{!p{!i{!b{![{!T{!M{!F{!?{!8{!1{!*{!#{!{!{!{!{!{!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!{z!tz!mz!fz!_z!Xz!Qz!Jz!Cz!v!7v!0v!)v!"v!v!v! v!v!u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!u!zu!su!lu!eu!^u!Wu!Pu!Iu!Bu!;u!4u!-u!&u!u!u!u! u!u!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!~t!wt!pt!it!bt![t!Tt!Mt!Ft!?t!8t!1t!*t!#t!t!t!t!t!t!s!s!s!s!s!s!s!s!s!s!s!s!s!s!s!s!s!s!{s!ts!ms!fs!_s!Xs!Qs!Js!Cs!o!7o!0o!)o!"o!o!o! o!o!n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!n!zn!sn!ln!en!^n!Wn!Pn!In!Bn!;n!4n!-n!&n!n!n!n! n!n!m!m!m!m!m!m!m!m!m!m!m!m!m!m!m!m!m!m!~m!wm!pm!im!bm![m!Tm!Mm!Fm!?m!8m!1m!*m!#m!m!m!m!m!m!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!{l!tl!ml!fl!_l!Xl!Ql!Jl!Cl!h!7h!0h!)h!"h!h!h! h!h!g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!g!zg!sg!lg!eg!^g!Wg!Pg!Ig!Bg!;g!4g!-g!&g!g!g!g! g!g!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!~f!wf!pf!if!bf![f!Tf!Mf!Ff!?f!8f!1f!*f!#f!f!f!f!f!f!e!e!e!e!e!e!e!e!e!e!e!e!e!e!e!e!e!e!{e!te!me!fe!_e!Xe!Qe!Je!Ce!a!7a!0a!)a!"a!a!a! a!a!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!`!z`!s`!l`!e`!^`!W`!P`!I`!B`!;`!4`!-`!&`!`!`!`! `!`!_!_!_!_!_!_!_!_!_!_!_!_!_!_!_!_!_!_!~_!w_!p_!i_!b_![_!T_!M_!F_!?_!8_!1_!*_!#_!_!_!_!_!_!^!^!^!^!^!^!^!^!^!^!^!^!^!^!^!^!^!^!{^!t^!m^!f^!_^!X^!Q^!J^!C^!<^!5^!.^!'^! ^!^!^! ^!^!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!]!x]!q]!j]!c]!\]!U]!N]!G]!@]!9]!2]!+]!$]!]!]!]!]!]!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!|\!u\!n\!g\!`\!Y\!R\!K\!D\!=\!6\!/\!(\!!\!\!\! \!\![![![![![![![![![![![![![![![![![![![!y[!r[!k[!d[!][!V[!O[!H[!A[!:[!3[!,[!%[![![![! [![!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!Z!}Z!vZ!oZ!hZ!aZ!ZZ!SZ!LZ!EZ!>Z!7Z!0Z!)Z!"Z!Z!Z! Z!Z!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!Y!zY!sY!lY!eY!^Y!WY!PY!IY!BY!;Y!4Y!-Y!&Y!Y!Y!Y! Y!Y!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!~X!wX!pX!iX!bX![X!TX!MX!FX!?X!8X!1X!*X!#X!X!X!X!X!X!W!W!W!W!W!W!W!W!W!W!W!W!W!W!W!W!W!W!{W!tW!mW!fW!_W!XW!QW!JW!CW!S!7S!0S!)S!"S!S!S! S!S!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!zR!sR!lR!eR!^R!WR!PR!IR!BR!;R!4R!-R!&R!R!R!R! R!R!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!Q!~Q!wQ!pQ!iQ!bQ![Q!TQ!MQ!FQ!?Q!8Q!1Q!*Q!#Q!Q!Q!Q!Q!Q!P!P!P!P!P!P!P!P!P!P!P!P!P!P!P!P!P!P!{P!tP!mP!fP!_P!XP!QP!JP!CP!L!7L!0L!)L!"L!L!L! L!L!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!zK!sK!lK!eK!^K!WK!PK!IK!BK!;K!4K!-K!&K!K!K!K! K!K!J!J!J!J!J!J!J!J!J!J!J!J!J!J!J!J!J!J!~J!wJ!pJ!iJ!bJ![J!TJ!MJ!FJ!?J!8J!1J!*J!#J!J!J!J!J!J!I!I!I!I!I!I!I!I!I!I!I!I!I!I!I!I!I!I!{I!tI!mI!fI!_I!XI!QI!JI!CI!E!7E!0E!)E!"E!E!E! E!E!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!zD!sD!lD!eD!^D!WD!PD!ID!BD!;D!4D!-D!&D!D!D!D! D!D!C!C!C!C!C!C!C!C!C!C!C!C!C!C!C!C!C!C!~C!wC!pC!iC!bC![C!TC!MC!FC!?C!8C!1C!*C!#C!C!C!C!C!C!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!{B!tB!mB!fB!_B!XB!QB!JB!CB!!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!}>!v>!o>!h>!a>!Z>!S>!L>!E>!>>!7>!0>!)>!">!>!>! >!>!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!z=!s=!l=!e=!^=!W=!P=!I=!B=!;=!4=!-=!&=!=!=!=! =!=!7!77!07!)7!"7!7!7! 7!7!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!6!z6!s6!l6!e6!^6!W6!P6!I6!B6!;6!46!-6!&6!6!6!6! 6!6!5!5!5!5!5!5!5!5!5!5!5!5!5!5!5!5!5!5!~5!w5!p5!i5!b5![5!T5!M5!F5!?5!85!15!*5!#5!5!5!5!5!5!4!4!4!4!4!4!4!4!4!4!4!4!4!4!4!4!4!4!{4!t4!m4!f4!_4!X4!Q4!J4!C4!<4!54!.4!'4! 4!4!4! 4!4!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!3!x3!q3!j3!c3!\3!U3!N3!G3!@3!93!23!+3!$3!3!3!3!3!3!2!2!2!2!2!2!2!2!2!2!2!2!2!2!2!2!2!2!|2!u2!n2!g2!`2!Y2!R2!K2!D2!=2!62!/2!(2!!2!2!2! 2!2!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!1!y1!r1!k1!d1!]1!V1!O1!H1!A1!:1!31!,1!%1!1!1!1! 1!1!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!}0!v0!o0!h0!a0!Z0!S0!L0!E0!>0!70!00!)0!"0!0!0! 0!0!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!z/!s/!l/!e/!^/!W/!P/!I/!B/!;/!4/!-/!&/!/!/!/! /!/!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!~.!w.!p.!i.!b.![.!T.!M.!F.!?.!8.!1.!*.!#.!.!.!.!.!.!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!{-!t-!m-!f-!_-!X-!Q-!J-!C-!<-!5-!.-!'-! -!-!-! -!-!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!x,!q,!j,!c,!\,!U,!N,!G,!@,!9,!2,!+,!$,!,!,!,!,!,!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!|+!u+!n+!g+!`+!Y+!R+!K+!D+!=+!6+!/+!(+!!+!+!+! +!+!*!*!*!*!*!*!*!*!*!*!*!*!*!*!*!*!*!*!*!y*!r*!k*!d*!]*!V*!O*!H*!A*!:*!3*!,*!%*!*!*!*! *!*!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!})!v)!o)!h)!a)!Z)!S)!L)!E)!>)!7)!0)!))!")!)!)! )!)!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!z(!s(!l(!e(!^(!W(!P(!I(!B(!;(!4(!-(!&(!(!(!(! (!(!'!'!'!'!'!'!'!'!'!'!'!'!'!'!'!'!'!'!~'!w'!p'!i'!b'!['!T'!M'!F'!?'!8'!1'!*'!#'!'!'!'!'!'!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!{&!t&!m&!f&!_&!X&!Q&!J&!C&!<&!5&!.&!'&! &!&!&! &!&!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!x%!q%!j%!c%!\%!U%!N%!G%!@%!9%!2%!+%!$%!%!%!%!%!%!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!|$!u$!n$!g$!`$!Y$!R$!K$!D$!=$!6$!/$!($!!$!$!$! $!$!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!y#!r#!k#!d#!]#!V#!O#!H#!A#!:#!3#!,#!%#!#!#!#! #!#!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!}"!v"!o"!h"!a"!Z"!S"!L"!E"!>"!7"!0"!)"!""!"!"! "!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!z!!s!!l!!e!!^!!W!!P!!I!!B!!;!!4!!-!!&!!!!!!!! !!!! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !~ !w !p !i !b ![ !T !M !F !? !8 !1 !* !# ! ! ! ! ! !!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!<!5!.!'! !!! !!!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!<!5!.!'! !!! !!!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!<!5!.!'! !!! !!!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !} !v !o !h !a !Z !S !L !E !> !7 !0 !) !" ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !z !s !l !e !^ !W !P !I !B !; !4 !- !& ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !~ !w !p !i !b ![ !T !M !F !? !8 !1 !* !# ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !{ !t !m !f !_ !X !Q !J !C !< !5 !. !' ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !x !q !j !c !\ !U !N !G !@ !9 !2 !+ !$ ! ! ! ! ! !!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!<!5!.!'! !!! !!!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "          ܿ տ ο ǿ           z s l e ^ W P I B ; 4 - &           پ Ҿ ˾ ľ          ~ w p i b [ T M F ? 8 1 * #          ݽ ֽ Ͻ Ƚ           { t m f _ X Q J C < 5 . '           ڼ Ӽ ̼ ż           x q j c \ U N G @ 9 2 + $          ޻ ׻ л ɻ »          | u n g ` Y R K D = 6 / ( !          ۺ Ժ ͺ ƺ           y r k d ] V O H A : 3 , %          ߹ ع ѹ ʹ ù          } v o h a Z S L E > 7 0 ) "          ܸ ո θ Ǹ           z s l e ^ W P I B ; 4 - &           ٷ ҷ ˷ ķ          ~ w p i b [ T M F ? 8 1 * #          ݶ ֶ ϶ ȶ           { t m f _ X Q J C < 5 . '           ڵ ӵ ̵ ŵ           x q j c \ U N G @ 9 2 + $          ޴ ״ д ɴ ´          | u n g ` Y R K D = 6 / ( !          ۳ Գ ͳ Ƴ           y r k d ] V O H A : 3 , %          ߲ ز Ѳ ʲ ò          } v o h a Z S L E > 7 0 ) "          ܱ ձ α DZ           z s l e ^ W P I B ; 4 - &           ٰ Ұ ˰ İ          ~ w p i b [ T M F ? 8 1 * #          ݯ ֯ ϯ ȯ           { t m f _ X Q J C < 5 . '           ڮ Ӯ ̮ Ů           x q j c \ U N G @ 9 2 + $          ޭ ׭ Э ɭ ­          | u n g ` Y R K D = 6 / ( !          ۬ Ԭ ͬ Ƭ           y r k d ] V O H A : 3 , %          ߫ ث ѫ ʫ ë          } v o h a Z S L E > 7 0 ) "          ܪ ժ Ϊ Ǫ           z s l e ^ W P I B ; 4 - &           ٩ ҩ ˩ ĩ          ~ w p i b [ T M F ? 8 1 * #          ݨ ֨ Ϩ Ȩ           { t m f _ X Q J C < 5 . '           ڧ ӧ ̧ ŧ           x q j c \ U N G @ 9 2 + $          ަ צ Ц ɦ ¦          | u n g ` Y R K D = 6 / ( !          ۥ ԥ ͥ ƥ           y r k d ] V O H A : 3 , %          ߤ ؤ Ѥ ʤ ä          } v o h a Z S L E > 7 0 ) "          ܣ գ Σ ǣ           z s l e ^ W P I B ; 4 - &           ٢ Ң ˢ Ģ          ~ w p i b [ T M F ? 8 1 * #          ݡ ֡ ϡ ȡ           { t m f _ X Q J C < 5 . '           ڠ Ӡ ̠ Š           x q j c \ U N G @ 9 2 + $          ޟ ן П ɟ Ÿ          | u n g ` Y R K D = 6 / ( !          ۞ Ԟ ͞ ƞ           y r k d ] V O H A : 3 , %          ߝ ؝ ѝ ʝ Ý          } v o h a Z S L E > 7 0 ) "          ܜ ՜ Μ ǜ           z s l e ^ W P I B ; 4 - &           ٛ қ ˛ ě          ~ w p i b [ T M F ? 8 1 * #          ݚ ֚ Ϛ Ț           { t m f _ X Q J C < 5 . '           ڙ ә ̙ ř           x q j c \ U N G @ 9 2 + $          ޘ ט И ɘ ˜          | u n g ` Y R K D = 6 / ( !          ۗ ԗ ͗ Ɨ           y r k d ] V O H A : 3 , %          ߖ ؖ і ʖ Ö          } v o h a Z S L E > 7 0 ) "          ܕ Օ Ε Ǖ           z s l e ^ W P I B ; 4 - &           ٔ Ҕ ˔ Ĕ          ~ w p i b [ T M F ? 8 1 * #          ݓ ֓ ϓ ȓ           { t m f _ X Q J C < 5 . '           ڒ Ӓ ̒ Œ           x q j c \ U N G @ 9 2 + $          ޑ ב Б ɑ ‘          | u n g ` Y R K D = 6 / ( !          ې Ԑ ͐ Ɛ           y r k d ] V O H A : 3 , %          ߏ ؏ я ʏ Ï          } v o h a Z S L E > 7 0 ) "          ܎ Վ Ύ ǎ           z s l e ^ W P I B ; 4 - &           ٍ ҍ ˍ č          ~ w p i b [ T M F ? 8 1 * #          ݌ ֌ ό Ȍ           { t m f _ X Q J C < 5 . '           ڋ Ӌ ̋ ŋ           x q j c \ U N G @ 9 2 + $          ފ ׊ Њ Ɋ Š          | u n g ` Y R K D = 6 / ( !          ۉ ԉ ͉ Ɖ           y r k d ] V O H A : 3 , %          ߈ ؈ ш ʈ È          } v o h a Z S L E > 7 0 ) "          ܇ Շ · LJ           z s l e ^ W P I B ; 4 - &           ن ҆ ˆ Ć          ~ w p i b [ T M F ? 8 1 * #          ݅ օ υ ȅ           { t m f _ X Q J C < 5 . '           ڄ ӄ ̄ ń           x q j c \ U N G @ 9 2 + $          ރ ׃ Ѓ Ƀ ƒ          | u n g ` Y R K D = 6 / ( !          ۂ Ԃ ͂ Ƃ           y r k d ] V O H A : 3 , %          ߁ ؁ с ʁ Á          } v o h a Z S L E > 7 0 ) "          ܀ Հ ΀ ǀ           z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ {~ t~ m~ f~ _~ X~ Q~ J~ C~ <~ 5~ .~ '~  ~ ~ ~  ~ ~ } } } } } } } } } } } } } } } } } } } x} q} j} c} \} U} N} G} @} 9} 2} +} $} } } } } } | | | | | | | | | | | | | | | | | | || u| n| g| `| Y| R| K| D| =| 6| /| (| !| | |  | | { { { { { { { { { { { { { { { { { { { y{ r{ k{ d{ ]{ V{ O{ H{ A{ :{ 3{ ,{ %{ { { {  { { z z z z z z z z z z z z z z z z z z }z vz oz hz az Zz Sz Lz Ez >z 7z 0z )z "z z z  z z y y y y y y y y y y y y y y y y y y y zy sy ly ey ^y Wy Py Iy By ;y 4y -y &y y y y  y y x x x x x x x x x x x x x x x x x x ~x wx px ix bx [x Tx Mx Fx ?x 8x 1x *x #x x x x x x w w w w w w w w w w w w w w w w w w {w tw mw fw _w Xw Qw Jw Cw s 7s 0s )s "s s s  s s r r r r r r r r r r r r r r r r r r r zr sr lr er ^r Wr Pr Ir Br ;r 4r -r &r r r r  r r q q q q q q q q q q q q q q q q q q ~q wq pq iq bq [q Tq Mq Fq ?q 8q 1q *q #q q q q q q p p p p p p p p p p p p p p p p p p {p tp mp fp _p Xp Qp Jp Cp 

    L 7L 0L )L "L L L  L L K K K K K K K K K K K K K K K K K K K zK sK lK eK ^K WK PK IK BK ;K 4K -K &K K K K  K K J J J J J J J J J J J J J J J J J J ~J wJ pJ iJ bJ [J TJ MJ FJ ?J 8J 1J *J #J J J J J J I I I I I I I I I I I I I I I I I I {I tI mI fI _I XI QI JI CI E 7E 0E )E "E E E  E E D D D D D D D D D D D D D D D D D D D zD sD lD eD ^D WD PD ID BD ;D 4D -D &D D D D  D D C C C C C C C C C C C C C C C C C C ~C wC pC iC bC [C TC MC FC ?C 8C 1C *C #C C C C C C B B B B B B B B B B B B B B B B B B {B tB mB fB _B XB QB JB CB  > > > > > > > > > > > > > > > > > }> v> o> h> a> Z> S> L> E> >> 7> 0> )> "> > >  > > = = = = = = = = = = = = = = = = = = = z= s= l= e= ^= W= P= I= B= ;= 4= -= &= = = =  = = < < < < < < < < < < < < < < < < < < ~< w< p< i< b< [< T< M< F< ?< 8< 1< *< #< < < < < < ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; {; t; m; f; _; X; Q; J; C; <; 5; .; ';  ; ; ;  ; ; : : : : : : : : : : : : : : : : : : : x: q: j: c: \: U: N: G: @: 9: 2: +: $: : : : : : 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 |9 u9 n9 g9 `9 Y9 R9 K9 D9 =9 69 /9 (9 !9 9 9  9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 y8 r8 k8 d8 ]8 V8 O8 H8 A8 :8 38 ,8 %8 8 8 8  8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 }7 v7 o7 h7 a7 Z7 S7 L7 E7 >7 77 07 )7 "7 7 7  7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 z6 s6 l6 e6 ^6 W6 P6 I6 B6 ;6 46 -6 &6 6 6 6  6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ~5 w5 p5 i5 b5 [5 T5 M5 F5 ?5 85 15 *5 #5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 {4 t4 m4 f4 _4 X4 Q4 J4 C4 <4 54 .4 '4  4 4 4  4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 x3 q3 j3 c3 \3 U3 N3 G3 @3 93 23 +3 $3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 |2 u2 n2 g2 `2 Y2 R2 K2 D2 =2 62 /2 (2 !2 2 2  2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 y1 r1 k1 d1 ]1 V1 O1 H1 A1 :1 31 ,1 %1 1 1 1  1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 v0 o0 h0 a0 Z0 S0 L0 E0 >0 70 00 )0 "0 0 0  0 0 / / / / / / / / / / / / / / / / / / / z/ s/ l/ e/ ^/ W/ P/ I/ B/ ;/ 4/ -/ &/ / / /  / / . . . . . . . . . . . . . . . . . . ~. w. p. i. b. [. T. M. F. ?. 8. 1. *. #. . . . . . - - - - - - - - - - - - - - - - - - {- t- m- f- _- X- Q- J- C- <- 5- .- '-  - - -  - - , , , , , , , , , , , , , , , , , , , x, q, j, c, \, U, N, G, @, 9, 2, +, $, , , , , , + + + + + + + + + + + + + + + + + + |+ u+ n+ g+ `+ Y+ R+ K+ D+ =+ 6+ /+ (+ !+ + +  + + * * * * * * * * * * * * * * * * * * * y* r* k* d* ]* V* O* H* A* :* 3* ,* %* * * *  * * ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) }) v) o) h) a) Z) S) L) E) >) 7) 0) )) ") ) )  ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( z( s( l( e( ^( W( P( I( B( ;( 4( -( &( ( ( (  ( ( ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ~' w' p' i' b' [' T' M' F' ?' 8' 1' *' #' ' ' ' ' ' & & & & & & & & & & & & & & & & & & {& t& m& f& _& X& Q& J& C& <& 5& .& '&  & & &  & & % % % % % % % % % % % % % % % % % % % x% q% j% c% \% U% N% G% @% 9% 2% +% $% % % % % % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ |$ u$ n$ g$ `$ Y$ R$ K$ D$ =$ 6$ /$ ($ !$ $ $  $ $ # # # # # # # # # # # # # # # # # # # y# r# k# d# ]# V# O# H# A# :# 3# ,# %# # # #  # # " " " " " " " " " " " " " " " " " " }" v" o" h" a" Z" S" L" E" >" 7" 0" )" "" " "  " " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! z! s! l! e! ^! W! P! I! B! ;! 4! -! &! ! ! !  ! !                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "          ܿ տ ο ǿ           z s l e ^ W P I B ; 4 - &           پ Ҿ ˾ ľ          ~ w p i b [ T M F ? 8 1 * #          ݽ ֽ Ͻ Ƚ           { t m f _ X Q J C < 5 . '           ڼ Ӽ ̼ ż           x q j c \ U N G @ 9 2 + $          ޻ ׻ л ɻ »          | u n g ` Y R K D = 6 / ( !          ۺ Ժ ͺ ƺ           y r k d ] V O H A : 3 , %          ߹ ع ѹ ʹ ù          } v o h a Z S L E > 7 0 ) "          ܸ ո θ Ǹ           z s l e ^ W P I B ; 4 - &           ٷ ҷ ˷ ķ          ~ w p i b [ T M F ? 8 1 * #          ݶ ֶ ϶ ȶ           { t m f _ X Q J C < 5 . '           ڵ ӵ ̵ ŵ           x q j c \ U N G @ 9 2 + $          ޴ ״ д ɴ ´          | u n g ` Y R K D = 6 / ( !          ۳ Գ ͳ Ƴ           y r k d ] V O H A : 3 , %          ߲ ز Ѳ ʲ ò          } v o h a Z S L E > 7 0 ) "          ܱ ձ α DZ           z s l e ^ W P I B ; 4 - &           ٰ Ұ ˰ İ          ~ w p i b [ T M F ? 8 1 * #          ݯ ֯ ϯ ȯ           { t m f _ X Q J C < 5 . '           ڮ Ӯ ̮ Ů           x q j c \ U N G @ 9 2 + $          ޭ ׭ Э ɭ ­          | u n g ` Y R K D = 6 / ( !          ۬ Ԭ ͬ Ƭ           y r k d ] V O H A : 3 , %          ߫ ث ѫ ʫ ë          } v o h a Z S L E > 7 0 ) "          ܪ ժ Ϊ Ǫ           z s l e ^ W P I B ; 4 - &           ٩ ҩ ˩ ĩ          ~ w p i b [ T M F ? 8 1 * #          ݨ ֨ Ϩ Ȩ           { t m f _ X Q J C < 5 . '           ڧ ӧ ̧ ŧ           x q j c \ U N G @ 9 2 + $          ަ צ Ц ɦ ¦          | u n g ` Y R K D = 6 / ( !          ۥ ԥ ͥ ƥ           y r k d ] V O H A : 3 , %          ߤ ؤ Ѥ ʤ ä          } v o h a Z S L E > 7 0 ) "          ܣ գ Σ ǣ           z s l e ^ W P I B ; 4 - &           ٢ Ң ˢ Ģ          ~ w p i b [ T M F ? 8 1 * #          ݡ ֡ ϡ ȡ           { t m f _ X Q J C < 5 . '           ڠ Ӡ ̠ Š           x q j c \ U N G @ 9 2 + $          ޟ ן П ɟ Ÿ          | u n g ` Y R K D = 6 / ( !          ۞ Ԟ ͞ ƞ           y r k d ] V O H A : 3 , %          ߝ ؝ ѝ ʝ Ý          } v o h a Z S L E > 7 0 ) "          ܜ ՜ Μ ǜ           z s l e ^ W P I B ; 4 - &           ٛ қ ˛ ě          ~ w p i b [ T M F ? 8 1 * #          ݚ ֚ Ϛ Ț           { t m f _ X Q J C < 5 . '           ڙ ә ̙ ř           x q j c \ U N G @ 9 2 + $          ޘ ט И ɘ ˜          | u n g ` Y R K D = 6 / ( !          ۗ ԗ ͗ Ɨ           y r k d ] V O H A : 3 , %          ߖ ؖ і ʖ Ö          } v o h a Z S L E > 7 0 ) "          ܕ Օ Ε Ǖ           z s l e ^ W P I B ; 4 - &           ٔ Ҕ ˔ Ĕ          ~ w p i b [ T M F ? 8 1 * #          ݓ ֓ ϓ ȓ           { t m f _ X Q J C < 5 . '           ڒ Ӓ ̒ Œ           x q j c \ U N G @ 9 2 + $          ޑ ב Б ɑ ‘          | u n g ` Y R K D = 6 / ( !          ې Ԑ ͐ Ɛ           y r k d ] V O H A : 3 , %          ߏ ؏ я ʏ Ï          } v o h a Z S L E > 7 0 ) "          ܎ Վ Ύ ǎ           z s l e ^ W P I B ; 4 - &           ٍ ҍ ˍ č          ~ w p i b [ T M F ? 8 1 * #          ݌ ֌ ό Ȍ           { t m f _ X Q J C < 5 . '           ڋ Ӌ ̋ ŋ           x q j c \ U N G @ 9 2 + $          ފ ׊ Њ Ɋ Š          | u n g ` Y R K D = 6 / ( !          ۉ ԉ ͉ Ɖ           y r k d ] V O H A : 3 , %          ߈ ؈ ш ʈ È          } v o h a Z S L E > 7 0 ) "          ܇ Շ · LJ           z s l e ^ W P I B ; 4 - &           ن ҆ ˆ Ć          ~ w p i b [ T M F ? 8 1 * #          ݅ օ υ ȅ           { t m f _ X Q J C < 5 . '           ڄ ӄ ̄ ń           x q j c \ U N G @ 9 2 + $          ރ ׃ Ѓ Ƀ ƒ          | u n g ` Y R K D = 6 / ( !          ۂ Ԃ ͂ Ƃ           y r k d ] V O H A : 3 , %          ߁ ؁ с ʁ Á          } v o h a Z S L E > 7 0 ) "          ܀ Հ ΀ ǀ           z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ {~ t~ m~ f~ _~ X~ Q~ J~ C~ <~ 5~ .~ '~  ~ ~ ~  ~ ~ } } } } } } } } } } } } } } } } } } } x} q} j} c} \} U} N} G} @} 9} 2} +} $} } } } } } | | | | | | | | | | | | | | | | | | || u| n| g| `| Y| R| K| D| =| 6| /| (| !| | |  | | { { { { { { { { { { { { { { { { { { { y{ r{ k{ d{ ]{ V{ O{ H{ A{ :{ 3{ ,{ %{ { { {  { { z z z z z z z z z z z z z z z z z z }z vz oz hz az Zz Sz Lz Ez >z 7z 0z )z "z z z  z z y y y y y y y y y y y y y y y y y y y zy sy ly ey ^y Wy Py Iy By ;y 4y -y &y y y y  y y x x x x x x x x x x x x x x x x x x ~x wx px ix bx [x Tx Mx Fx ?x 8x 1x *x #x x x x x x w w w w w w w w w w w w w w w w w w {w tw mw fw _w Xw Qw Jw Cw s 7s 0s )s "s s s  s s r r r r r r r r r r r r r r r r r r r zr sr lr er ^r Wr Pr Ir Br ;r 4r -r &r r r r  r r q q q q q q q q q q q q q q q q q q ~q wq pq iq bq [q Tq Mq Fq ?q 8q 1q *q #q q q q q q p p p p p p p p p p p p p p p p p p {p tp mp fp _p Xp Qp Jp Cp l 7l 0l )l "l l l  l l k k k k k k k k k k k k k k k k k k k zk sk lk ek ^k Wk Pk Ik Bk ;k 4k -k &k k k k  k k j j j j j j j j j j j j j j j j j j ~j wj pj ij bj [j Tj Mj Fj ?j 8j 1j *j #j j j j j j i i i i i i i i i i i i i i i i i i {i ti mi fi _i Xi Qi Ji Ci e 7e 0e )e "e e e  e e d d d d d d d d d d d d d d d d d d d zd sd ld ed ^d Wd Pd Id Bd ;d 4d -d &d d d d  d d c c c c c c c c c c c c c c c c c c ~c wc pc ic bc [c Tc Mc Fc ?c 8c 1c *c #c c c c c c b b b b b b b b b b b b b b b b b b {b tb mb fb _b Xb Qb Jb Cb ^ 7^ 0^ )^ "^ ^ ^  ^ ^ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] z] s] l] e] ^] W] P] I] B] ;] 4] -] &] ] ] ]  ] ] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ~\ w\ p\ i\ b\ [\ T\ M\ F\ ?\ 8\ 1\ *\ #\ \ \ \ \ \ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ {[ t[ m[ f[ _[ X[ Q[ J[ C[ <[ 5[ .[ '[  [ [ [  [ [ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z xZ qZ jZ cZ \Z UZ NZ GZ @Z 9Z 2Z +Z $Z Z Z Z Z Z Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y |Y uY nY gY `Y YY RY KY DY =Y 6Y /Y (Y !Y Y Y  Y Y X X X X X X X X X X X X X X X X X X X yX rX kX dX ]X VX OX HX AX :X 3X ,X %X X X X  X X W W W W W W W W W W W W W W W W W W }W vW oW hW aW ZW SW LW EW >W 7W 0W )W "W W W  W W V V V V V V V V V V V V V V V V V V V zV sV lV eV ^V WV PV IV BV ;V 4V -V &V V V V  V V U U U U U U U U U U U U U U U U U U ~U wU pU iU bU [U TU MU FU ?U 8U 1U *U #U U U U U U T T T T T T T T T T T T T T T T T T {T tT mT fT _T XT QT JT CT P 7P 0P )P "P P P  P P O O O O O O O O O O O O O O O O O O O zO sO lO eO ^O WO PO IO BO ;O 4O -O &O O O O  O O N N N N N N N N N N N N N N N N N N ~N wN pN iN bN [N TN MN FN ?N 8N 1N *N #N N N N N N M M M M M M M M M M M M M M M M M M {M tM mM fM _M XM QM JM CM I 7I 0I )I "I I I  I I H H H H H H H H H H H H H H H H H H H zH sH lH eH ^H WH PH IH BH ;H 4H -H &H H H H  H H G G G G G G G G G G G G G G G G G G ~G wG pG iG bG [G TG MG FG ?G 8G 1G *G #G G G G G G F F F F F F F F F F F F F F F F F F {F tF mF fF _F XF QF JF CF B 7B 0B )B "B B B  B B A A A A A A A A A A A A A A A A A A A zA sA lA eA ^A WA PA IA BA ;A 4A -A &A A A A  A A @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ~@ w@ p@ i@ b@ [@ T@ M@ F@ ?@ 8@ 1@ *@ #@ @ @ @ @ @ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {? t? m? f? _? X? Q? J? C?  > > > > > > > > > > > > > > > > > > x> q> j> c> \> U> N> G> @> 9> 2> +> $> > > > > > = = = = = = = = = = = = = = = = = = |= u= n= g= `= Y= R= K= D= == 6= /= (= != = =  = = < < < < < < < < < < < < < < < < < < < y< r< k< d< ]< V< O< H< A< :< 3< ,< %< < < <  < < ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; }; v; o; h; a; Z; S; L; E; >; 7; 0; ); "; ; ;  ; ; : : : : : : : : : : : : : : : : : : : z: s: l: e: ^: W: P: I: B: ;: 4: -: &: : : :  : : 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ~9 w9 p9 i9 b9 [9 T9 M9 F9 ?9 89 19 *9 #9 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 {8 t8 m8 f8 _8 X8 Q8 J8 C8 <8 58 .8 '8  8 8 8  8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 x7 q7 j7 c7 \7 U7 N7 G7 @7 97 27 +7 $7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 |6 u6 n6 g6 `6 Y6 R6 K6 D6 =6 66 /6 (6 !6 6 6  6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 y5 r5 k5 d5 ]5 V5 O5 H5 A5 :5 35 ,5 %5 5 5 5  5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 }4 v4 o4 h4 a4 Z4 S4 L4 E4 >4 74 04 )4 "4 4 4  4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 z3 s3 l3 e3 ^3 W3 P3 I3 B3 ;3 43 -3 &3 3 3 3  3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ~2 w2 p2 i2 b2 [2 T2 M2 F2 ?2 82 12 *2 #2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 {1 t1 m1 f1 _1 X1 Q1 J1 C1 <1 51 .1 '1  1 1 1  1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x0 q0 j0 c0 \0 U0 N0 G0 @0 90 20 +0 $0 0 0 0 0 0 / / / / / / / / / / / / / / / / / / |/ u/ n/ g/ `/ Y/ R/ K/ D/ =/ 6/ // (/ !/ / /  / / . . . . . . . . . . . . . . . . . . . y. r. k. d. ]. V. O. H. A. :. 3. ,. %. . . .  . . - - - - - - - - - - - - - - - - - - }- v- o- h- a- Z- S- L- E- >- 7- 0- )- "- - -  - - , , , , , , , , , , , , , , , , , , , z, s, l, e, ^, W, P, I, B, ;, 4, -, &, , , ,  , , + + + + + + + + + + + + + + + + + + ~+ w+ p+ i+ b+ [+ T+ M+ F+ ?+ 8+ 1+ *+ #+ + + + + + * * * * * * * * * * * * * * * * * * {* t* m* f* _* X* Q* J* C* <* 5* .* '*  * * *  * * ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) x) q) j) c) \) U) N) G) @) 9) 2) +) $) ) ) ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( |( u( n( g( `( Y( R( K( D( =( 6( /( (( !( ( (  ( ( ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' y' r' k' d' ]' V' O' H' A' :' 3' ,' %' ' ' '  ' ' & & & & & & & & & & & & & & & & & & }& v& o& h& a& Z& S& L& E& >& 7& 0& )& "& & &  & & % % % % % % % % % % % % % % % % % % % z% s% l% e% ^% W% P% I% B% ;% 4% -% &% % % %  % % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ~$ w$ p$ i$ b$ [$ T$ M$ F$ ?$ 8$ 1$ *$ #$ $ $ $ $ $ # # # # # # # # # # # # # # # # # # {# t# m# f# _# X# Q# J# C# <# 5# .# '#  # # #  # # " " " " " " " " " " " " " " " " " " " x" q" j" c" \" U" N" G" @" 9" 2" +" $" " " " " " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! |! u! n! g! `! Y! R! K! D! =! 6! /! (! !! ! !  ! !                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $          ޿ ׿ п ɿ ¿          | u n g ` Y R K D = 6 / ( !          ۾ Ծ ; ƾ           y r k d ] V O H A : 3 , %          ߽ ؽ ѽ ʽ ý          } v o h a Z S L E > 7 0 ) "          ܼ ռ μ Ǽ           z s l e ^ W P I B ; 4 - &           ٻ һ ˻ Ļ          ~ w p i b [ T M F ? 8 1 * #          ݺ ֺ Ϻ Ⱥ           { t m f _ X Q J C < 5 . '           ڹ ӹ ̹ Ź           x q j c \ U N G @ 9 2 + $          ޸ ׸ и ɸ ¸          | u n g ` Y R K D = 6 / ( !          ۷ Է ͷ Ʒ           y r k d ] V O H A : 3 , %          ߶ ض Ѷ ʶ ö          } v o h a Z S L E > 7 0 ) "          ܵ յ ε ǵ           z s l e ^ W P I B ; 4 - &           ٴ Ҵ ˴ Ĵ          ~ w p i b [ T M F ? 8 1 * #          ݳ ֳ ϳ ȳ           { t m f _ X Q J C < 5 . '           ڲ Ӳ ̲ Ų           x q j c \ U N G @ 9 2 + $          ޱ ױ б ɱ ±          | u n g ` Y R K D = 6 / ( !          ۰ ԰ Ͱ ư           y r k d ] V O H A : 3 , %          ߯ د ѯ ʯ ï          } v o h a Z S L E > 7 0 ) "          ܮ ծ ή Ǯ           z s l e ^ W P I B ; 4 - &           ٭ ҭ ˭ ĭ          ~ w p i b [ T M F ? 8 1 * #          ݬ ֬ Ϭ Ȭ           { t m f _ X Q J C < 5 . '           ګ ӫ ̫ ū           x q j c \ U N G @ 9 2 + $          ު ת Ъ ɪ ª          | u n g ` Y R K D = 6 / ( !          ۩ ԩ ͩ Ʃ           y r k d ] V O H A : 3 , %          ߨ ب Ѩ ʨ è          } v o h a Z S L E > 7 0 ) "          ܧ է Χ ǧ           z s l e ^ W P I B ; 4 - &           ٦ Ҧ ˦ Ħ          ~ w p i b [ T M F ? 8 1 * #          ݥ ֥ ϥ ȥ           { t m f _ X Q J C < 5 . '           ڤ Ӥ ̤ Ť           x q j c \ U N G @ 9 2 + $          ޣ ף У ɣ £          | u n g ` Y R K D = 6 / ( !          ۢ Ԣ ͢ Ƣ           y r k d ] V O H A : 3 , %          ߡ ء ѡ ʡ á          } v o h a Z S L E > 7 0 ) "          ܠ ՠ Π Ǡ           z s l e ^ W P I B ; 4 - &           ٟ ҟ ˟ ğ          ~ w p i b [ T M F ? 8 1 * #          ݞ ֞ Ϟ Ȟ           { t m f _ X Q J C < 5 . '           ڝ ӝ ̝ ŝ           x q j c \ U N G @ 9 2 + $          ޜ ל М ɜ œ          | u n g ` Y R K D = 6 / ( !          ۛ ԛ ͛ ƛ           y r k d ] V O H A : 3 , %          ߚ ؚ њ ʚ Ú          } v o h a Z S L E > 7 0 ) "          ܙ ՙ Ι Ǚ           z s l e ^ W P I B ; 4 - &           ٘ Ҙ ˘ Ę          ~ w p i b [ T M F ? 8 1 * #          ݗ ֗ ϗ ȗ           { t m f _ X Q J C < 5 . '           ږ Ӗ ̖ Ŗ           x q j c \ U N G @ 9 2 + $          ޕ ו Е ɕ •          | u n g ` Y R K D = 6 / ( !          ۔ Ԕ ͔ Ɣ           y r k d ] V O H A : 3 , %          ߓ ؓ ѓ ʓ Ó          } v o h a Z S L E > 7 0 ) "          ܒ Ւ Β ǒ           z s l e ^ W P I B ; 4 - &           ّ ґ ˑ đ          ~ w p i b [ T M F ? 8 1 * #          ݐ ֐ ϐ Ȑ           { t m f _ X Q J C < 5 . '           ڏ ӏ ̏ ŏ           x q j c \ U N G @ 9 2 + $          ގ ׎ Ў Ɏ Ž          | u n g ` Y R K D = 6 / ( !          ۍ ԍ ͍ ƍ           y r k d ] V O H A : 3 , %          ߌ ، ь ʌ Ì          } v o h a Z S L E > 7 0 ) "          ܋ Ջ ΋ Nj           z s l e ^ W P I B ; 4 - &           ي Ҋ ˊ Ċ          ~ w p i b [ T M F ? 8 1 * #          ݉ ։ ω ȉ           { t m f _ X Q J C < 5 . '           ڈ ӈ ̈ ň           x q j c \ U N G @ 9 2 + $          އ ׇ Ї ɇ ‡          | u n g ` Y R K D = 6 / ( !          ۆ Ԇ ͆ Ɔ           y r k d ] V O H A : 3 , %          ߅ ؅ х ʅ Å          } v o h a Z S L E > 7 0 ) "          ܄ Մ ΄ DŽ           z s l e ^ W P I B ; 4 - &           ك ҃ ˃ ă          ~ w p i b [ T M F ? 8 1 * #          ݂ ւ ς Ȃ           { t m f _ X Q J C < 5 . '           ځ Ӂ ́ Ł           x q j c \ U N G @ 9 2 + $          ހ ׀ Ѐ ɀ €          | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %       ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ }~ v~ o~ h~ a~ Z~ S~ L~ E~ >~ 7~ 0~ )~ "~ ~ ~  ~ ~ } } } } } } } } } } } } } } } } } } } z} s} l} e} ^} W} P} I} B} ;} 4} -} &} } } }  } } | | | | | | | | | | | | | | | | | | ~| w| p| i| b| [| T| M| F| ?| 8| 1| *| #| | | | | | { { { { { { { { { { { { { { { { { { {{ t{ m{ f{ _{ X{ Q{ J{ C{ <{ 5{ .{ '{  { { {  { { z z z z z z z z z z z z z z z z z z z xz qz jz cz \z Uz Nz Gz @z 9z 2z +z $z z z z z z y y y y y y y y y y y y y y y y y y |y uy ny gy `y Yy Ry Ky Dy =y 6y /y (y !y y y  y y x x x x x x x x x x x x x x x x x x x yx rx kx dx ]x Vx Ox Hx Ax :x 3x ,x %x x x x  x x w w w w w w w w w w w w w w w w w w }w vw ow hw aw Zw Sw Lw Ew >w 7w 0w )w "w w w  w w v v v v v v v v v v v v v v v v v v v zv sv lv ev ^v Wv Pv Iv Bv ;v 4v -v &v v v v  v v u u u u u u u u u u u u u u u u u u ~u wu pu iu bu [u Tu Mu Fu ?u 8u 1u *u #u u u u u u t t t t t t t t t t t t t t t t t t {t tt mt ft _t Xt Qt Jt Ct p 7p 0p )p "p p p  p p o o o o o o o o o o o o o o o o o o o zo so lo eo ^o Wo Po Io Bo ;o 4o -o &o o o o  o o n n n n n n n n n n n n n n n n n n ~n wn pn in bn [n Tn Mn Fn ?n 8n 1n *n #n n n n n n m m m m m m m m m m m m m m m m m m {m tm mm fm _m Xm Qm Jm Cm i 7i 0i )i "i i i  i i h h h h h h h h h h h h h h h h h h h zh sh lh eh ^h Wh Ph Ih Bh ;h 4h -h &h h h h  h h g g g g g g g g g g g g g g g g g g ~g wg pg ig bg [g Tg Mg Fg ?g 8g 1g *g #g g g g g g f f f f f f f f f f f f f f f f f f {f tf mf ff _f Xf Qf Jf Cf b 7b 0b )b "b b b  b b a a a a a a a a a a a a a a a a a a a za sa la ea ^a Wa Pa Ia Ba ;a 4a -a &a a a a  a a ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ~` w` p` i` b` [` T` M` F` ?` 8` 1` *` #` ` ` ` ` ` _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ {_ t_ m_ f_ __ X_ Q_ J_ C_ <_ 5_ ._ '_  _ _ _  _ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ x^ q^ j^ c^ \^ U^ N^ G^ @^ 9^ 2^ +^ $^ ^ ^ ^ ^ ^ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] |] u] n] g] `] Y] R] K] D] =] 6] /] (] !] ] ]  ] ] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ y\ r\ k\ d\ ]\ V\ O\ H\ A\ :\ 3\ ,\ %\ \ \ \  \ \ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ }[ v[ o[ h[ a[ Z[ S[ L[ E[ >[ 7[ 0[ )[ "[ [ [  [ [ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z zZ sZ lZ eZ ^Z WZ PZ IZ BZ ;Z 4Z -Z &Z Z Z Z  Z Z Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y ~Y wY pY iY bY [Y TY MY FY ?Y 8Y 1Y *Y #Y Y Y Y Y Y X X X X X X X X X X X X X X X X X X {X tX mX fX _X XX QX JX CX T 7T 0T )T "T T T  T T S S S S S S S S S S S S S S S S S S S zS sS lS eS ^S WS PS IS BS ;S 4S -S &S S S S  S S R R R R R R R R R R R R R R R R R R ~R wR pR iR bR [R TR MR FR ?R 8R 1R *R #R R R R R R Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q {Q tQ mQ fQ _Q XQ QQ JQ CQ M 7M 0M )M "M M M  M M L L L L L L L L L L L L L L L L L L L zL sL lL eL ^L WL PL IL BL ;L 4L -L &L L L L  L L K K K K K K K K K K K K K K K K K K ~K wK pK iK bK [K TK MK FK ?K 8K 1K *K #K K K K K K J J J J J J J J J J J J J J J J J J {J tJ mJ fJ _J XJ QJ JJ CJ F 7F 0F )F "F F F  F F E E E E E E E E E E E E E E E E E E E zE sE lE eE ^E WE PE IE BE ;E 4E -E &E E E E  E E D D D D D D D D D D D D D D D D D D ~D wD pD iD bD [D TD MD FD ?D 8D 1D *D #D D D D D D C C C C C C C C C C C C C C C C C C {C tC mC fC _C XC QC JC CC ? 7? 0? )? "? ? ?  ? ? > > > > > > > > > > > > > > > > > > > z> s> l> e> ^> W> P> I> B> ;> 4> -> &> > > >  > > = = = = = = = = = = = = = = = = = = ~= w= p= i= b= [= T= M= F= ?= 8= 1= *= #= = = = = = < < < < < < < < < < < < < < < < < < {< t< m< f< _< X< Q< J< C< << 5< .< '<  < < <  < < ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; x; q; j; c; \; U; N; G; @; 9; 2; +; $; ; ; ; ; ; : : : : : : : : : : : : : : : : : : |: u: n: g: `: Y: R: K: D: =: 6: /: (: !: : :  : : 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 y9 r9 k9 d9 ]9 V9 O9 H9 A9 :9 39 ,9 %9 9 9 9  9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 }8 v8 o8 h8 a8 Z8 S8 L8 E8 >8 78 08 )8 "8 8 8  8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 z7 s7 l7 e7 ^7 W7 P7 I7 B7 ;7 47 -7 &7 7 7 7  7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ~6 w6 p6 i6 b6 [6 T6 M6 F6 ?6 86 16 *6 #6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 {5 t5 m5 f5 _5 X5 Q5 J5 C5 <5 55 .5 '5  5 5 5  5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 x4 q4 j4 c4 \4 U4 N4 G4 @4 94 24 +4 $4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 |3 u3 n3 g3 `3 Y3 R3 K3 D3 =3 63 /3 (3 !3 3 3  3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 y2 r2 k2 d2 ]2 V2 O2 H2 A2 :2 32 ,2 %2 2 2 2  2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 }1 v1 o1 h1 a1 Z1 S1 L1 E1 >1 71 01 )1 "1 1 1  1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 z0 s0 l0 e0 ^0 W0 P0 I0 B0 ;0 40 -0 &0 0 0 0  0 0 / / / / / / / / / / / / / / / / / / ~/ w/ p/ i/ b/ [/ T/ M/ F/ ?/ 8/ 1/ */ #/ / / / / / . . . . . . . . . . . . . . . . . . {. t. m. f. _. X. Q. J. C. <. 5. .. '.  . . .  . . - - - - - - - - - - - - - - - - - - - x- q- j- c- \- U- N- G- @- 9- 2- +- $- - - - - - , , , , , , , , , , , , , , , , , , |, u, n, g, `, Y, R, K, D, =, 6, /, (, !, , ,  , , + + + + + + + + + + + + + + + + + + + y+ r+ k+ d+ ]+ V+ O+ H+ A+ :+ 3+ ,+ %+ + + +  + + * * * * * * * * * * * * * * * * * * }* v* o* h* a* Z* S* L* E* >* 7* 0* )* "* * *  * * ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) z) s) l) e) ^) W) P) I) B) ;) 4) -) &) ) ) )  ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ~( w( p( i( b( [( T( M( F( ?( 8( 1( *( #( ( ( ( ( ( ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' {' t' m' f' _' X' Q' J' C' <' 5' .' ''  ' ' '  ' ' & & & & & & & & & & & & & & & & & & & x& q& j& c& \& U& N& G& @& 9& 2& +& $& & & & & & % % % % % % % % % % % % % % % % % % |% u% n% g% `% Y% R% K% D% =% 6% /% (% !% % %  % % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ y$ r$ k$ d$ ]$ V$ O$ H$ A$ :$ 3$ ,$ %$ $ $ $  $ $ # # # # # # # # # # # # # # # # # # }# v# o# h# a# Z# S# L# E# ># 7# 0# )# "# # #  # # " " " " " " " " " " " " " " " " " " " z" s" l" e" ^" W" P" I" B" ;" 4" -" &" " " "  " " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~! w! p! i! b! [! T! M! F! ?! 8! 1! *! #! ! ! ! ! !                   { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &           ٿ ҿ ˿ Ŀ          ~ w p i b [ T M F ? 8 1 * #          ݾ ־ Ͼ Ⱦ           { t m f _ X Q J C < 5 . '           ڽ ӽ ̽ Ž           x q j c \ U N G @ 9 2 + $          ޼ ׼ м ɼ ¼          | u n g ` Y R K D = 6 / ( !          ۻ Ի ͻ ƻ           y r k d ] V O H A : 3 , %          ߺ غ Ѻ ʺ ú          } v o h a Z S L E > 7 0 ) "          ܹ չ ι ǹ           z s l e ^ W P I B ; 4 - &           ٸ Ҹ ˸ ĸ          ~ w p i b [ T M F ? 8 1 * #          ݷ ַ Ϸ ȷ           { t m f _ X Q J C < 5 . '           ڶ Ӷ ̶ Ŷ           x q j c \ U N G @ 9 2 + $          ޵ ׵ е ɵ µ          | u n g ` Y R K D = 6 / ( !          ۴ Դ ʹ ƴ           y r k d ] V O H A : 3 , %          ߳ س ѳ ʳ ó          } v o h a Z S L E > 7 0 ) "          ܲ ղ β Dz           z s l e ^ W P I B ; 4 - &           ٱ ұ ˱ ı          ~ w p i b [ T M F ? 8 1 * #          ݰ ְ ϰ Ȱ           { t m f _ X Q J C < 5 . '           گ ӯ ̯ ů           x q j c \ U N G @ 9 2 + $          ޮ ׮ Ю ɮ ®          | u n g ` Y R K D = 6 / ( !          ۭ ԭ ͭ ƭ           y r k d ] V O H A : 3 , %          ߬ ج Ѭ ʬ ì          } v o h a Z S L E > 7 0 ) "          ܫ ի Ϋ ǫ           z s l e ^ W P I B ; 4 - &           ٪ Ҫ ˪ Ī          ~ w p i b [ T M F ? 8 1 * #          ݩ ֩ ϩ ȩ           { t m f _ X Q J C < 5 . '           ڨ Ө ̨ Ũ           x q j c \ U N G @ 9 2 + $          ާ ק Ч ɧ §          | u n g ` Y R K D = 6 / ( !          ۦ Ԧ ͦ Ʀ           y r k d ] V O H A : 3 , %          ߥ إ ѥ ʥ å          } v o h a Z S L E > 7 0 ) "          ܤ դ Τ Ǥ           z s l e ^ W P I B ; 4 - &           ٣ ң ˣ ģ          ~ w p i b [ T M F ? 8 1 * #          ݢ ֢ Ϣ Ȣ           { t m f _ X Q J C < 5 . '           ڡ ӡ ̡ š           x q j c \ U N G @ 9 2 + $          ޠ נ Р ɠ            | u n g ` Y R K D = 6 / ( !          ۟ ԟ ͟ Ɵ           y r k d ] V O H A : 3 , %          ߞ ؞ ў ʞ Þ          } v o h a Z S L E > 7 0 ) "          ܝ ՝ Ν ǝ           z s l e ^ W P I B ; 4 - &           ٜ Ҝ ˜ Ĝ          ~ w p i b [ T M F ? 8 1 * #          ݛ ֛ ϛ ț           { t m f _ X Q J C < 5 . '           ښ Ӛ ̚ Ś           x q j c \ U N G @ 9 2 + $          ޙ י Й ə ™          | u n g ` Y R K D = 6 / ( !          ۘ Ԙ ͘ Ƙ           y r k d ] V O H A : 3 , %          ߗ ؗ ї ʗ ×          } v o h a Z S L E > 7 0 ) "          ܖ Ֆ Ζ ǖ           z s l e ^ W P I B ; 4 - &           ٕ ҕ ˕ ĕ          ~ w p i b [ T M F ? 8 1 * #          ݔ ֔ ϔ Ȕ           { t m f _ X Q J C < 5 . '           ړ ӓ ̓ œ           x q j c \ U N G @ 9 2 + $          ޒ ג В ɒ ’          | u n g ` Y R K D = 6 / ( !          ۑ ԑ ͑ Ƒ           y r k d ] V O H A : 3 , %          ߐ ؐ ѐ ʐ Ð          } v o h a Z S L E > 7 0 ) "          ܏ Տ Ώ Ǐ           z s l e ^ W P I B ; 4 - &           َ Ҏ ˎ Ď          ~ w p i b [ T M F ? 8 1 * #          ݍ ֍ ύ ȍ           { t m f _ X Q J C < 5 . '           ڌ ӌ ̌ Ō           x q j c \ U N G @ 9 2 + $          ދ ׋ Ћ ɋ ‹          | u n g ` Y R K D = 6 / ( !          ۊ Ԋ ͊ Ɗ           y r k d ] V O H A : 3 , %          ߉ ؉ щ ʉ É          } v o h a Z S L E > 7 0 ) "          ܈ Ո Έ Lj           z s l e ^ W P I B ; 4 - &           ه ҇ ˇ ć          ~ w p i b [ T M F ? 8 1 * #          ݆ ֆ φ Ȇ           { t m f _ X Q J C < 5 . '           څ Ӆ ̅ Ņ           x q j c \ U N G @ 9 2 + $          ބ ׄ Є Ʉ „          | u n g ` Y R K D = 6 / ( !          ۃ ԃ ̓ ƃ           y r k d ] V O H A : 3 , %          ߂ ؂ т ʂ           } v o h a Z S L E > 7 0 ) "          ܁ Ձ ΁ ǁ           z s l e ^ W P I B ; 4 - &           ـ Ҁ ˀ Ā          ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '        ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ x~ q~ j~ c~ \~ U~ N~ G~ @~ 9~ 2~ +~ $~ ~ ~ ~ ~ ~ } } } } } } } } } } } } } } } } } } |} u} n} g} `} Y} R} K} D} =} 6} /} (} !} } }  } } | | | | | | | | | | | | | | | | | | | y| r| k| d| ]| V| O| H| A| :| 3| ,| %| | | |  | | { { { { { { { { { { { { { { { { { { }{ v{ o{ h{ a{ Z{ S{ L{ E{ >{ 7{ 0{ ){ "{ { {  { { z z z z z z z z z z z z z z z z z z z zz sz lz ez ^z Wz Pz Iz Bz ;z 4z -z &z z z z  z z y y y y y y y y y y y y y y y y y y ~y wy py iy by [y Ty My Fy ?y 8y 1y *y #y y y y y y x x x x x x x x x x x x x x x x x x {x tx mx fx _x Xx Qx Jx Cx t 7t 0t )t "t t t  t t s s s s s s s s s s s s s s s s s s s zs ss ls es ^s Ws Ps Is Bs ;s 4s -s &s s s s  s s r r r r r r r r r r r r r r r r r r ~r wr pr ir br [r Tr Mr Fr ?r 8r 1r *r #r r r r r r q q q q q q q q q q q q q q q q q q {q tq mq fq _q Xq Qq Jq Cq m 7m 0m )m "m m m  m m l l l l l l l l l l l l l l l l l l l zl sl ll el ^l Wl Pl Il Bl ;l 4l -l &l l l l  l l k k k k k k k k k k k k k k k k k k ~k wk pk ik bk [k Tk Mk Fk ?k 8k 1k *k #k k k k k k j j j j j j j j j j j j j j j j j j {j tj mj fj _j Xj Qj Jj Cj f 7f 0f )f "f f f  f f e e e e e e e e e e e e e e e e e e e ze se le ee ^e We Pe Ie Be ;e 4e -e &e e e e  e e d d d d d d d d d d d d d d d d d d ~d wd pd id bd [d Td Md Fd ?d 8d 1d *d #d d d d d d c c c c c c c c c c c c c c c c c c {c tc mc fc _c Xc Qc Jc Cc _ 7_ 0_ )_ "_ _ _  _ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ z^ s^ l^ e^ ^^ W^ P^ I^ B^ ;^ 4^ -^ &^ ^ ^ ^  ^ ^ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ~] w] p] i] b] [] T] M] F] ?] 8] 1] *] #] ] ] ] ] ] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\ t\ m\ f\ _\ X\ Q\ J\ C\ <\ 5\ .\ '\  \ \ \  \ \ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ x[ q[ j[ c[ \[ U[ N[ G[ @[ 9[ 2[ +[ $[ [ [ [ [ [ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z |Z uZ nZ gZ `Z YZ RZ KZ DZ =Z 6Z /Z (Z !Z Z Z  Z Z Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y yY rY kY dY ]Y VY OY HY AY :Y 3Y ,Y %Y Y Y Y  Y Y X X X X X X X X X X X X X X X X X X }X vX oX hX aX ZX SX LX EX >X 7X 0X )X "X X X  X X W W W W W W W W W W W W W W W W W W W zW sW lW eW ^W WW PW IW BW ;W 4W -W &W W W W  W W V V V V V V V V V V V V V V V V V V ~V wV pV iV bV [V TV MV FV ?V 8V 1V *V #V V V V V V U U U U U U U U U U U U U U U U U U {U tU mU fU _U XU QU JU CU Q 7Q 0Q )Q "Q Q Q  Q Q P P P P P P P P P P P P P P P P P P P zP sP lP eP ^P WP PP IP BP ;P 4P -P &P P P P  P P O O O O O O O O O O O O O O O O O O ~O wO pO iO bO [O TO MO FO ?O 8O 1O *O #O O O O O O N N N N N N N N N N N N N N N N N N {N tN mN fN _N XN QN JN CN J 7J 0J )J "J J J  J J I I I I I I I I I I I I I I I I I I I zI sI lI eI ^I WI PI II BI ;I 4I -I &I I I I  I I H H H H H H H H H H H H H H H H H H ~H wH pH iH bH [H TH MH FH ?H 8H 1H *H #H H H H H H G G G G G G G G G G G G G G G G G G {G tG mG fG _G XG QG JG CG C 7C 0C )C "C C C  C C B B B B B B B B B B B B B B B B B B B zB sB lB eB ^B WB PB IB BB ;B 4B -B &B B B B  B B A A A A A A A A A A A A A A A A A A ~A wA pA iA bA [A TA MA FA ?A 8A 1A *A #A A A A A A @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ {@ t@ m@ f@ _@ X@ Q@ J@ C@ <@ 5@ .@ '@  @ @ @  @ @ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? x? q? j? c? \? U? N? G? @? 9? 2? +? $? ? ? ? ? ? > > > > > > > > > > > > > > > > > > |> u> n> g> `> Y> R> K> D> => 6> /> (> !> > >  > > = = = = = = = = = = = = = = = = = = = y= r= k= d= ]= V= O= H= A= := 3= ,= %= = = =  = = < < < < < < < < < < < < < < < < < < }< v< o< h< a< Z< S< L< E< >< 7< 0< )< "< < <  < < ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; z; s; l; e; ^; W; P; I; B; ;; 4; -; &; ; ; ;  ; ; : : : : : : : : : : : : : : : : : : ~: w: p: i: b: [: T: M: F: ?: 8: 1: *: #: : : : : : 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 {9 t9 m9 f9 _9 X9 Q9 J9 C9 <9 59 .9 '9  9 9 9  9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 x8 q8 j8 c8 \8 U8 N8 G8 @8 98 28 +8 $8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 |7 u7 n7 g7 `7 Y7 R7 K7 D7 =7 67 /7 (7 !7 7 7  7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 y6 r6 k6 d6 ]6 V6 O6 H6 A6 :6 36 ,6 %6 6 6 6  6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 }5 v5 o5 h5 a5 Z5 S5 L5 E5 >5 75 05 )5 "5 5 5  5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 z4 s4 l4 e4 ^4 W4 P4 I4 B4 ;4 44 -4 &4 4 4 4  4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 ~3 w3 p3 i3 b3 [3 T3 M3 F3 ?3 83 13 *3 #3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 {2 t2 m2 f2 _2 X2 Q2 J2 C2 <2 52 .2 '2  2 2 2  2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 x1 q1 j1 c1 \1 U1 N1 G1 @1 91 21 +1 $1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |0 u0 n0 g0 `0 Y0 R0 K0 D0 =0 60 /0 (0 !0 0 0  0 0 / / / / / / / / / / / / / / / / / / / y/ r/ k/ d/ ]/ V/ O/ H/ A/ :/ 3/ ,/ %/ / / /  / / . . . . . . . . . . . . . . . . . . }. v. o. h. a. Z. S. L. E. >. 7. 0. ). ". . .  . . - - - - - - - - - - - - - - - - - - - z- s- l- e- ^- W- P- I- B- ;- 4- -- &- - - -  - - , , , , , , , , , , , , , , , , , , ~, w, p, i, b, [, T, M, F, ?, 8, 1, *, #, , , , , , + + + + + + + + + + + + + + + + + + {+ t+ m+ f+ _+ X+ Q+ J+ C+ <+ 5+ .+ '+  + + +  + + * * * * * * * * * * * * * * * * * * * x* q* j* c* \* U* N* G* @* 9* 2* +* $* * * * * * ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) |) u) n) g) `) Y) R) K) D) =) 6) /) () !) ) )  ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( y( r( k( d( ]( V( O( H( A( :( 3( ,( %( ( ( (  ( ( ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' }' v' o' h' a' Z' S' L' E' >' 7' 0' )' "' ' '  ' ' & & & & & & & & & & & & & & & & & & & z& s& l& e& ^& W& P& I& B& ;& 4& -& && & & &  & & % % % % % % % % % % % % % % % % % % ~% w% p% i% b% [% T% M% F% ?% 8% 1% *% #% % % % % % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ {$ t$ m$ f$ _$ X$ Q$ J$ C$ <$ 5$ .$ '$  $ $ $  $ $ # # # # # # # # # # # # # # # # # # # x# q# j# c# \# U# N# G# @# 9# 2# +# $# # # # # # " " " " " " " " " " " " " " " " " " |" u" n" g" `" Y" R" K" D" =" 6" /" (" !" " "  " " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! y! r! k! d! ]! V! O! H! A! :! 3! ,! %! ! ! !  ! !                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! mongo-c-driver-1.26.0/src/libbson/tests/binary/stream.bson000066400000000000000000000116101456567454500234770ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/tests/binary/stream_corrupt.bson000066400000000000000000000116111456567454500252560ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/tests/binary/test1.bson000066400000000000000000000000161456567454500232420ustar00rootroot00000000000000intmongo-c-driver-1.26.0/src/libbson/tests/binary/test10.bson000066400000000000000000000000231456567454500233200ustar00rootroot00000000000000 regex1234imongo-c-driver-1.26.0/src/libbson/tests/binary/test11.bson000066400000000000000000000000261456567454500233240ustar00rootroot00000000000000helloworldmongo-c-driver-1.26.0/src/libbson/tests/binary/test12.bson000066400000000000000000000000611456567454500233240ustar00rootroot000000000000001BSON&0awesome1333333@2mongo-c-driver-1.26.0/src/libbson/tests/binary/test13.bson000066400000000000000000000000431456567454500233250ustar00rootroot00000000000000#array[bool]012mongo-c-driver-1.26.0/src/libbson/tests/binary/test14.bson000066400000000000000000000000631456567454500233300ustar00rootroot000000000000003array[string]0hello1worldmongo-c-driver-1.26.0/src/libbson/tests/binary/test15.bson000066400000000000000000000000611456567454500233270ustar00rootroot000000000000001array[datetime] 0 1 +3mongo-c-driver-1.26.0/src/libbson/tests/binary/test16.bson000066400000000000000000000000401456567454500233250ustar00rootroot00000000000000 array[null] 0 1 2mongo-c-driver-1.26.0/src/libbson/tests/binary/test17.bson000066400000000000000000000003271456567454500233360ustar00rootroot00000000000000_id#Edocumentw_id#Etags)01122334text asdfanothersourcenameblahtype0sourcemissing0server_created_atmongo-c-driver-1.26.0/src/libbson/tests/binary/test18.bson000066400000000000000000000000141456567454500233300ustar00rootroot00000000000000 hellomongo-c-driver-1.26.0/src/libbson/tests/binary/test19.bson000066400000000000000000000000141456567454500233310ustar00rootroot00000000000000 boolmongo-c-driver-1.26.0/src/libbson/tests/binary/test2.bson000066400000000000000000000000241456567454500232420ustar00rootroot00000000000000int64mongo-c-driver-1.26.0/src/libbson/tests/binary/test20.bson000066400000000000000000000000251456567454500233230ustar00rootroot00000000000000doubleS:^@mongo-c-driver-1.26.0/src/libbson/tests/binary/test21.bson000066400000000000000000000000241456567454500233230ustar00rootroot00000000000000documentmongo-c-driver-1.26.0/src/libbson/tests/binary/test22.bson000066400000000000000000000000261456567454500233260ustar00rootroot00000000000000oid4Vx4mongo-c-driver-1.26.0/src/libbson/tests/binary/test23.bson000066400000000000000000000000531456567454500233270ustar00rootroot00000000000000+array0hello1worldmongo-c-driver-1.26.0/src/libbson/tests/binary/test24.bson000066400000000000000000000000261456567454500233300ustar00rootroot00000000000000binary1234mongo-c-driver-1.26.0/src/libbson/tests/binary/test25.bson000066400000000000000000000000201456567454500233230ustar00rootroot00000000000000undefinedmongo-c-driver-1.26.0/src/libbson/tests/binary/test26.bson000066400000000000000000000000251456567454500233310ustar00rootroot00000000000000 time_tPqmongo-c-driver-1.26.0/src/libbson/tests/binary/test27.bson000066400000000000000000000000261456567454500233330ustar00rootroot00000000000000 regex^abcdilxmongo-c-driver-1.26.0/src/libbson/tests/binary/test28.bson000066400000000000000000000000441456567454500233340ustar00rootroot00000000000000$ dbpointerfoo###mongo-c-driver-1.26.0/src/libbson/tests/binary/test29.bson000066400000000000000000000000331456567454500233330ustar00rootroot00000000000000 code var a = {};mongo-c-driver-1.26.0/src/libbson/tests/binary/test3.bson000066400000000000000000000000251456567454500232440ustar00rootroot00000000000000double+?mongo-c-driver-1.26.0/src/libbson/tests/binary/test30.bson000066400000000000000000000000331456567454500233230ustar00rootroot00000000000000 code var a = {};mongo-c-driver-1.26.0/src/libbson/tests/binary/test31.bson000066400000000000000000000000611456567454500233250ustar00rootroot000000000000001code& var a = {};foobarmongo-c-driver-1.26.0/src/libbson/tests/binary/test32.bson000066400000000000000000000000261456567454500233270ustar00rootroot00000000000000helloworldmongo-c-driver-1.26.0/src/libbson/tests/binary/test33.bson000066400000000000000000000000321456567454500233250ustar00rootroot00000000000000acb{mongo-c-driver-1.26.0/src/libbson/tests/binary/test34.bson000066400000000000000000000000201456567454500233230ustar00rootroot00000000000000a@zZmongo-c-driver-1.26.0/src/libbson/tests/binary/test35.bson000066400000000000000000000000301456567454500233250ustar00rootroot00000000000000timestamp&mongo-c-driver-1.26.0/src/libbson/tests/binary/test36.bson000066400000000000000000000000151456567454500233310ustar00rootroot00000000000000 minkeymongo-c-driver-1.26.0/src/libbson/tests/binary/test37.bson000066400000000000000000000000151456567454500233320ustar00rootroot00000000000000 maxkeymongo-c-driver-1.26.0/src/libbson/tests/binary/test38.bson000066400000000000000000000014451456567454500233430ustar00rootroot00000000000000%aaa aaaaaaaaaaaaaaaaaa}auamaea]aUaMaEa=a5a-a%aaa aaaaaaaaaaaaaaaaaa}auamaea]aUaMaEa=a5a-a%aaa aaaaaaaaaaaaaaaaaa}auamaea]aUaMaEa=a5a-a%aaa amongo-c-driver-1.26.0/src/libbson/tests/binary/test39.bson000066400000000000000000000014541456567454500233440ustar00rootroot00000000000000,b$bbb bbbbbbbbbbbbbbbbbb|btblbdb\bTbLbDb<b4b,b$bbb bbbbbbbbbbbbbbbbbb|btblbdb\bTbLbDb<b4b,b$bbb bbbbbbbbbbbbbbbbbb|btblbdb\bTbLbDb<b4b,b$bbb bmongo-c-driver-1.26.0/src/libbson/tests/binary/test4.bson000066400000000000000000000000221456567454500232420ustar00rootroot00000000000000 utc +3mongo-c-driver-1.26.0/src/libbson/tests/binary/test40.bson000066400000000000000000000000141456567454500233230ustar00rootroot00000000000000 mongo-c-driver-1.26.0/src/libbson/tests/binary/test41.bson000066400000000000000000000000221456567454500233230ustar00rootroot00000000000000foobarmongo-c-driver-1.26.0/src/libbson/tests/binary/test42.bson000066400000000000000000000000141456567454500233250ustar00rootroot00000000000000 mongo-c-driver-1.26.0/src/libbson/tests/binary/test43.bson000066400000000000000000000000221456567454500233250ustar00rootroot00000000000000foobarmongo-c-driver-1.26.0/src/libbson/tests/binary/test44.bson000066400000000000000000000000301456567454500233250ustar00rootroot00000000000000 RYj[AX]mongo-c-driver-1.26.0/src/libbson/tests/binary/test45.bson000066400000000000000000000000361456567454500233340ustar00rootroot00000000000000 foobarRYj[AX]mongo-c-driver-1.26.0/src/libbson/tests/binary/test46.bson000066400000000000000000000000141456567454500233310ustar00rootroot00000000000000 mongo-c-driver-1.26.0/src/libbson/tests/binary/test47.bson000066400000000000000000000000141456567454500233320ustar00rootroot00000000000000 mongo-c-driver-1.26.0/src/libbson/tests/binary/test48.bson000066400000000000000000000000341456567454500233350ustar00rootroot00000000000000 mongo-c-driver-1.26.0/src/libbson/tests/binary/test49.bson000066400000000000000000000000341456567454500233360ustar00rootroot00000000000000 mongo-c-driver-1.26.0/src/libbson/tests/binary/test5.bson000066400000000000000000000000351456567454500232470ustar00rootroot00000000000000string some stringmongo-c-driver-1.26.0/src/libbson/tests/binary/test50.bson000066400000000000000000000000341456567454500233260ustar00rootroot00000000000000 mongo-c-driver-1.26.0/src/libbson/tests/binary/test51.bson000066400000000000000000000000341456567454500233270ustar00rootroot00000000000000 mongo-c-driver-1.26.0/src/libbson/tests/binary/test52.bson000066400000000000000000000000301456567454500233240ustar00rootroot00000000000000foobar!mongo-c-driver-1.26.0/src/libbson/tests/binary/test53.bson000066400000000000000000000000361456567454500233330ustar00rootroot00000000000000 foobarRYj[AX]mongo-c-driver-1.26.0/src/libbson/tests/binary/test54.bson000066400000000000000000000000261456567454500233330ustar00rootroot00000000000000binary1234mongo-c-driver-1.26.0/src/libbson/tests/binary/test55.bson000066400000000000000000000000301456567454500233270ustar00rootroot00000000000000barmongo-c-driver-1.26.0/src/libbson/tests/binary/test56.bson000066400000000000000000000000521456567454500233340ustar00rootroot00000000000000*€€€€€"€€€€mongo-c-driver-1.26.0/src/libbson/tests/binary/test57.bson000066400000000000000000000000321456567454500233330ustar00rootroot00000000000000binary1234mongo-c-driver-1.26.0/src/libbson/tests/binary/test58.bson000066400000000000000000000000301456567454500233320ustar00rootroot00000000000000amongo-c-driver-1.26.0/src/libbson/tests/binary/test59.bson000066400000000000000000000000211456567454500233330ustar00rootroot00000000000000.mongo-c-driver-1.26.0/src/libbson/tests/binary/test6.bson000066400000000000000000000001001456567454500232410ustar00rootroot00000000000000@array[int]/012345mongo-c-driver-1.26.0/src/libbson/tests/binary/test7.bson000066400000000000000000000000571456567454500232550ustar00rootroot00000000000000/array[double]0+?1Cl@mongo-c-driver-1.26.0/src/libbson/tests/binary/test8.bson000066400000000000000000000000351456567454500232520ustar00rootroot00000000000000documentintmongo-c-driver-1.26.0/src/libbson/tests/binary/test9.bson000066400000000000000000000000131456567454500232470ustar00rootroot00000000000000 nullmongo-c-driver-1.26.0/src/libbson/tests/binary/trailingnull.bson000066400000000000000000000000201456567454500247010ustar00rootroot00000000000000aabcmongo-c-driver-1.26.0/src/libbson/tests/corpus-test.c000066400000000000000000000130741456567454500224770ustar00rootroot00000000000000/* * Copyright 2016 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "corpus-test.h" #ifdef _MSC_VER #define SSCANF sscanf_s #else #define SSCANF sscanf #endif void corpus_test_print_description (const char *description) { if (test_suite_debug_output ()) { printf (" - %s\n", description); fflush (stdout); } } uint8_t * corpus_test_unhexlify (bson_iter_t *iter, uint32_t *bson_str_len) { const char *hex_str; uint8_t *data = NULL; unsigned int byte; uint32_t tmp; int x = 0; int i = 0; ASSERT (BSON_ITER_HOLDS_UTF8 (iter)); hex_str = bson_iter_utf8 (iter, &tmp); *bson_str_len = tmp / 2; data = bson_malloc (*bson_str_len); while (SSCANF (&hex_str[i], "%2x", &byte) == 1) { data[x++] = (uint8_t) byte; i += 2; } return data; } void corpus_test (bson_t *scenario, test_bson_valid_cb valid, test_bson_decode_error_cb decode_error, test_bson_parse_error_cb parse_error) { bson_iter_t iter; bson_iter_t inner_iter; const char *scenario_description = NULL; bson_type_t bson_type; BSON_ASSERT (scenario); BSON_ASSERT (bson_iter_init_find (&iter, scenario, "description")); scenario_description = bson_iter_utf8 (&iter, NULL); BSON_ASSERT (bson_iter_init_find (&iter, scenario, "bson_type")); /* like "0x0C */ if (sscanf (bson_iter_utf8 (&iter, NULL), "%i", (int *) &bson_type) != 1) { fprintf ( stderr, "Couldn't parse bson_type %s\n", bson_iter_utf8 (&iter, NULL)); abort (); } /* test valid BSON and Extended JSON */ if (bson_iter_init_find (&iter, scenario, "valid")) { BSON_ASSERT (bson_iter_recurse (&iter, &inner_iter)); while (bson_iter_next (&inner_iter)) { bson_iter_t test_iter; test_bson_valid_type_t test = {scenario_description, bson_type, NULL}; BSON_ASSERT (bson_iter_recurse (&inner_iter, &test_iter)); while (bson_iter_next (&test_iter)) { const char *key = bson_iter_key (&test_iter); if (!strcmp (key, "description")) { test.test_description = bson_iter_utf8 (&test_iter, NULL); corpus_test_print_description (test.test_description); } if (!strcmp (key, "canonical_bson")) { test.cB = corpus_test_unhexlify (&test_iter, &test.cB_len); } if (!strcmp (key, "degenerate_bson")) { test.dB = corpus_test_unhexlify (&test_iter, &test.dB_len); } if (!strcmp (key, "canonical_extjson")) { test.cE = bson_iter_utf8 (&test_iter, NULL); } if (!strcmp (key, "degenerate_extjson")) { test.dE = bson_iter_utf8 (&test_iter, NULL); } if (!strcmp (key, "relaxed_extjson")) { test.rE = bson_iter_utf8 (&test_iter, NULL); } if (!strcmp (key, "lossy")) { test.lossy = bson_iter_bool (&test_iter); } } /* execute the test callback */ valid (&test); bson_free (test.cB); bson_free (test.dB); } } /* test decoding errors (i.e. invalid BSON) */ if (bson_iter_init_find (&iter, scenario, "decodeErrors")) { BSON_ASSERT (bson_iter_recurse (&iter, &inner_iter)); while (bson_iter_next (&inner_iter)) { bson_iter_t test_iter; test_bson_decode_error_type_t test = { scenario_description, bson_type, NULL}; BSON_ASSERT (bson_iter_recurse (&inner_iter, &test_iter)); while (bson_iter_next (&test_iter)) { if (!strcmp (bson_iter_key (&test_iter), "description")) { test.test_description = bson_iter_utf8 (&test_iter, NULL); corpus_test_print_description (test.test_description); } if (!strcmp (bson_iter_key (&test_iter), "bson")) { test.bson = corpus_test_unhexlify (&test_iter, &test.bson_len); } } /* execute the test callback */ decode_error (&test); bson_free (test.bson); } } /* test parsing errors (e.g. invalid JSON or Decimal128 strings) */ if (bson_iter_init_find (&iter, scenario, "parseErrors")) { BSON_ASSERT (bson_iter_recurse (&iter, &inner_iter)); while (bson_iter_next (&inner_iter)) { bson_iter_t test_iter; test_bson_parse_error_type_t test = { scenario_description, bson_type, NULL}; BSON_ASSERT (bson_iter_recurse (&inner_iter, &test_iter)); while (bson_iter_next (&test_iter)) { if (!strcmp (bson_iter_key (&test_iter), "description")) { test.test_description = bson_iter_utf8 (&test_iter, NULL); corpus_test_print_description (test.test_description); } if (!strcmp (bson_iter_key (&test_iter), "string")) { test.str = bson_iter_utf8 (&test_iter, &test.str_len); } } /* execute the test callback */ parse_error (&test); } } } mongo-c-driver-1.26.0/src/libbson/tests/corpus-test.h000066400000000000000000000046651456567454500225120ustar00rootroot00000000000000/* * Copyright 2017 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef CORPUS_TEST_H #define CORPUS_TEST_H #include "TestSuite.h" #include /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-validity */ typedef struct _test_bson_valid_type_t { const char *scenario_description; bson_type_t bson_type; const char *test_description; uint8_t *cB; /* "canonical_bson" */ uint32_t cB_len; uint8_t *dB; /* "degenerate_bson" */ uint32_t dB_len; const char *cE; /* "canonical_extjson" */ const char *rE; /* "relaxed_extjson" */ const char *dE; /* "degenerate_extjson" */ bool lossy; } test_bson_valid_type_t; /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-decode-errors */ typedef struct _test_bson_decode_error_type_t { const char *scenario_description; bson_type_t bson_type; const char *test_description; uint8_t *bson; uint32_t bson_len; } test_bson_decode_error_type_t; /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-parsing-errors */ typedef struct _test_bson_parse_error_type_t { const char *scenario_description; bson_type_t bson_type; const char *test_description; const char *str; uint32_t str_len; } test_bson_parse_error_type_t; typedef void (*test_bson_valid_cb) (test_bson_valid_type_t *test); typedef void (*test_bson_decode_error_cb) (test_bson_decode_error_type_t *test); typedef void (*test_bson_parse_error_cb) (test_bson_parse_error_type_t *test); void corpus_test_print_description (const char *description); uint8_t * corpus_test_unhexlify (bson_iter_t *iter, uint32_t *bson_str_len); void corpus_test (bson_t *scenario, test_bson_valid_cb valid, test_bson_decode_error_cb decode_error, test_bson_parse_error_cb parse_error); #endif mongo-c-driver-1.26.0/src/libbson/tests/json/000077500000000000000000000000001456567454500210075ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/000077500000000000000000000000001456567454500233435ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/array.json000066400000000000000000000037461456567454500253660ustar00rootroot00000000000000{ "description": "Array", "bson_type": "0x04", "test_key": "a", "valid": [ { "description": "Empty", "canonical_bson": "0D000000046100050000000000", "canonical_extjson": "{\"a\" : []}" }, { "description": "Single Element Array", "canonical_bson": "140000000461000C0000001030000A0000000000", "canonical_extjson": "{\"a\" : [{\"$numberInt\": \"10\"}]}" }, { "description": "Single Element Array with index set incorrectly to empty string", "degenerate_bson": "130000000461000B00000010000A0000000000", "canonical_bson": "140000000461000C0000001030000A0000000000", "canonical_extjson": "{\"a\" : [{\"$numberInt\": \"10\"}]}" }, { "description": "Single Element Array with index set incorrectly to ab", "degenerate_bson": "150000000461000D000000106162000A0000000000", "canonical_bson": "140000000461000C0000001030000A0000000000", "canonical_extjson": "{\"a\" : [{\"$numberInt\": \"10\"}]}" }, { "description": "Multi Element Array with duplicate indexes", "degenerate_bson": "1b000000046100130000001030000a000000103000140000000000", "canonical_bson": "1b000000046100130000001030000a000000103100140000000000", "canonical_extjson": "{\"a\" : [{\"$numberInt\": \"10\"}, {\"$numberInt\": \"20\"}]}" } ], "decodeErrors": [ { "description": "Array length too long: eats outer terminator", "bson": "140000000461000D0000001030000A0000000000" }, { "description": "Array length too short: leaks terminator", "bson": "140000000461000B0000001030000A0000000000" }, { "description": "Invalid Array: bad string length in field", "bson": "1A00000004666F6F00100000000230000500000062617A000000" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/binary.json000066400000000000000000000130751456567454500255300ustar00rootroot00000000000000{ "description": "Binary type", "bson_type": "0x05", "test_key": "x", "valid": [ { "description": "subtype 0x00 (Zero-length)", "canonical_bson": "0D000000057800000000000000", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"\", \"subType\" : \"00\"}}}" }, { "description": "subtype 0x00 (Zero-length, keys reversed)", "canonical_bson": "0D000000057800000000000000", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"\", \"subType\" : \"00\"}}}", "degenerate_extjson": "{\"x\" : { \"$binary\" : {\"subType\" : \"00\", \"base64\" : \"\"}}}" }, { "description": "subtype 0x00", "canonical_bson": "0F0000000578000200000000FFFF00", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"//8=\", \"subType\" : \"00\"}}}" }, { "description": "subtype 0x01", "canonical_bson": "0F0000000578000200000001FFFF00", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"//8=\", \"subType\" : \"01\"}}}" }, { "description": "subtype 0x02", "canonical_bson": "13000000057800060000000202000000FFFF00", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"//8=\", \"subType\" : \"02\"}}}" }, { "description": "subtype 0x03", "canonical_bson": "1D000000057800100000000373FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"03\"}}}" }, { "description": "subtype 0x04", "canonical_bson": "1D000000057800100000000473FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"04\"}}}" }, { "description": "subtype 0x04 UUID", "canonical_bson": "1D000000057800100000000473FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"04\"}}}", "degenerate_extjson": "{\"x\" : { \"$uuid\" : \"73ffd264-44b3-4c69-90e8-e7d1dfc035d4\"}}" }, { "description": "subtype 0x05", "canonical_bson": "1D000000057800100000000573FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"05\"}}}" }, { "description": "subtype 0x07", "canonical_bson": "1D000000057800100000000773FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"07\"}}}" }, { "description": "subtype 0x08", "canonical_bson": "1D000000057800100000000873FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"08\"}}}" }, { "description": "subtype 0x80", "canonical_bson": "0F0000000578000200000080FFFF00", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"//8=\", \"subType\" : \"80\"}}}" }, { "description": "$type query operator (conflicts with legacy $binary form with $type field)", "canonical_bson": "1F000000037800170000000224747970650007000000737472696E67000000", "canonical_extjson": "{\"x\" : { \"$type\" : \"string\"}}" }, { "description": "$type query operator (conflicts with legacy $binary form with $type field)", "canonical_bson": "180000000378001000000010247479706500020000000000", "canonical_extjson": "{\"x\" : { \"$type\" : {\"$numberInt\": \"2\"}}}" } ], "decodeErrors": [ { "description": "Length longer than document", "bson": "1D000000057800FF0000000573FFD26444B34C6990E8E7D1DFC035D400" }, { "description": "Negative length", "bson": "0D000000057800FFFFFFFF0000" }, { "description": "subtype 0x02 length too long ", "bson": "13000000057800060000000203000000FFFF00" }, { "description": "subtype 0x02 length too short", "bson": "13000000057800060000000201000000FFFF00" }, { "description": "subtype 0x02 length negative one", "bson": "130000000578000600000002FFFFFFFFFFFF00" } ], "parseErrors": [ { "description": "$uuid wrong type", "string": "{\"x\" : { \"$uuid\" : { \"data\" : \"73ffd264-44b3-4c69-90e8-e7d1dfc035d4\"}}}" }, { "description": "$uuid invalid value--too short", "string": "{\"x\" : { \"$uuid\" : \"73ffd264-44b3-90e8-e7d1dfc035d4\"}}" }, { "description": "$uuid invalid value--too long", "string": "{\"x\" : { \"$uuid\" : \"73ffd264-44b3-4c69-90e8-e7d1dfc035d4-789e4\"}}" }, { "description": "$uuid invalid value--misplaced hyphens", "string": "{\"x\" : { \"$uuid\" : \"73ff-d26444b-34c6-990e8e-7d1dfc035d4\"}}" }, { "description": "$uuid invalid value--too many hyphens", "string": "{\"x\" : { \"$uuid\" : \"----d264-44b3-4--9-90e8-e7d1dfc0----\"}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/boolean.json000066400000000000000000000012551456567454500256600ustar00rootroot00000000000000{ "description": "Boolean", "bson_type": "0x08", "test_key": "b", "valid": [ { "description": "True", "canonical_bson": "090000000862000100", "canonical_extjson": "{\"b\" : true}" }, { "description": "False", "canonical_bson": "090000000862000000", "canonical_extjson": "{\"b\" : false}" } ], "decodeErrors": [ { "description": "Invalid boolean value of 2", "bson": "090000000862000200" }, { "description": "Invalid boolean value of -1", "bson": "09000000086200FF00" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/code.json000066400000000000000000000046521456567454500251570ustar00rootroot00000000000000{ "description": "Javascript Code", "bson_type": "0x0D", "test_key": "a", "valid": [ { "description": "Empty string", "canonical_bson": "0D0000000D6100010000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\"}}" }, { "description": "Single character", "canonical_bson": "0E0000000D610002000000620000", "canonical_extjson": "{\"a\" : {\"$code\" : \"b\"}}" }, { "description": "Multi-character", "canonical_bson": "190000000D61000D0000006162616261626162616261620000", "canonical_extjson": "{\"a\" : {\"$code\" : \"abababababab\"}}" }, { "description": "two-byte UTF-8 (\u00e9)", "canonical_bson": "190000000D61000D000000C3A9C3A9C3A9C3A9C3A9C3A90000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\"}}" }, { "description": "three-byte UTF-8 (\u2606)", "canonical_bson": "190000000D61000D000000E29886E29886E29886E298860000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\\u2606\\u2606\\u2606\\u2606\"}}" }, { "description": "Embedded nulls", "canonical_bson": "190000000D61000D0000006162006261620062616261620000", "canonical_extjson": "{\"a\" : {\"$code\" : \"ab\\u0000bab\\u0000babab\"}}" } ], "decodeErrors": [ { "description": "bad code string length: 0 (but no 0x00 either)", "bson": "0C0000000D61000000000000" }, { "description": "bad code string length: -1", "bson": "0C0000000D6100FFFFFFFF00" }, { "description": "bad code string length: eats terminator", "bson": "100000000D6100050000006200620000" }, { "description": "bad code string length: longer than rest of document", "bson": "120000000D00FFFFFF00666F6F6261720000" }, { "description": "code string is not null-terminated", "bson": "100000000D610004000000616263FF00" }, { "description": "empty code string, but extra null", "bson": "0E0000000D610001000000000000" }, { "description": "invalid UTF-8", "bson": "0E0000000D610002000000E90000" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/code_w_scope.json000066400000000000000000000067741456567454500267050ustar00rootroot00000000000000{ "description": "Javascript Code with Scope", "bson_type": "0x0F", "test_key": "a", "valid": [ { "description": "Empty code string, empty scope", "canonical_bson": "160000000F61000E0000000100000000050000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\", \"$scope\" : {}}}" }, { "description": "Non-empty code string, empty scope", "canonical_bson": "1A0000000F610012000000050000006162636400050000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"abcd\", \"$scope\" : {}}}" }, { "description": "Empty code string, non-empty scope", "canonical_bson": "1D0000000F61001500000001000000000C000000107800010000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\", \"$scope\" : {\"x\" : {\"$numberInt\": \"1\"}}}}" }, { "description": "Non-empty code string and non-empty scope", "canonical_bson": "210000000F6100190000000500000061626364000C000000107800010000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"abcd\", \"$scope\" : {\"x\" : {\"$numberInt\": \"1\"}}}}" }, { "description": "Unicode and embedded null in code string, empty scope", "canonical_bson": "1A0000000F61001200000005000000C3A9006400050000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\\u00e9\\u0000d\", \"$scope\" : {}}}" } ], "decodeErrors": [ { "description": "field length zero", "bson": "280000000F6100000000000500000061626364001300000010780001000000107900010000000000" }, { "description": "field length negative", "bson": "280000000F6100FFFFFFFF0500000061626364001300000010780001000000107900010000000000" }, { "description": "field length too short (less than minimum size)", "bson": "160000000F61000D0000000100000000050000000000" }, { "description": "field length too short (truncates scope)", "bson": "280000000F61001F0000000500000061626364001300000010780001000000107900010000000000" }, { "description": "field length too long (clips outer doc)", "bson": "280000000F6100210000000500000061626364001300000010780001000000107900010000000000" }, { "description": "field length too long (longer than outer doc)", "bson": "280000000F6100FF0000000500000061626364001300000010780001000000107900010000000000" }, { "description": "bad code string: length too short", "bson": "280000000F6100200000000400000061626364001300000010780001000000107900010000000000" }, { "description": "bad code string: length too long (clips scope)", "bson": "280000000F6100200000000600000061626364001300000010780001000000107900010000000000" }, { "description": "bad code string: negative length", "bson": "280000000F610020000000FFFFFFFF61626364001300000010780001000000107900010000000000" }, { "description": "bad code string: length longer than field", "bson": "280000000F610020000000FF00000061626364001300000010780001000000107900010000000000" }, { "description": "bad scope doc (field has bad string length)", "bson": "1C0000000F001500000001000000000C000000020000000000000000" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/datetime.json000066400000000000000000000032561456567454500260400ustar00rootroot00000000000000{ "description": "DateTime", "bson_type": "0x09", "test_key": "a", "valid": [ { "description": "epoch", "canonical_bson": "10000000096100000000000000000000", "relaxed_extjson": "{\"a\" : {\"$date\" : \"1970-01-01T00:00:00Z\"}}", "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"0\"}}}" }, { "description": "positive ms", "canonical_bson": "10000000096100C5D8D6CC3B01000000", "relaxed_extjson": "{\"a\" : {\"$date\" : \"2012-12-24T12:15:30.501Z\"}}", "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"1356351330501\"}}}" }, { "description": "negative", "canonical_bson": "10000000096100C33CE7B9BDFFFFFF00", "relaxed_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"-284643869501\"}}}", "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"-284643869501\"}}}" }, { "description" : "Y10K", "canonical_bson" : "1000000009610000DC1FD277E6000000", "canonical_extjson" : "{\"a\":{\"$date\":{\"$numberLong\":\"253402300800000\"}}}" }, { "description": "leading zero ms", "canonical_bson": "10000000096100D1D6D6CC3B01000000", "relaxed_extjson": "{\"a\" : {\"$date\" : \"2012-12-24T12:15:30.001Z\"}}", "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"1356351330001\"}}}" } ], "decodeErrors": [ { "description": "datetime field truncated", "bson": "0C0000000961001234567800" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/dbpointer.json000066400000000000000000000054031456567454500262260ustar00rootroot00000000000000{ "description": "DBPointer type (deprecated)", "bson_type": "0x0C", "deprecated": true, "test_key": "a", "valid": [ { "description": "DBpointer", "canonical_bson": "1A0000000C610002000000620056E1FC72E0C917E9C471416100", "canonical_extjson": "{\"a\": {\"$dbPointer\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}}", "converted_bson": "2a00000003610022000000022472656600020000006200072469640056e1fc72e0c917e9c47141610000", "converted_extjson": "{\"a\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}" }, { "description": "DBpointer with opposite key order", "canonical_bson": "1A0000000C610002000000620056E1FC72E0C917E9C471416100", "canonical_extjson": "{\"a\": {\"$dbPointer\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}}", "degenerate_extjson": "{\"a\": {\"$dbPointer\": {\"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}, \"$ref\": \"b\"}}}", "converted_bson": "2a00000003610022000000022472656600020000006200072469640056e1fc72e0c917e9c47141610000", "converted_extjson": "{\"a\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}" }, { "description": "With two-byte UTF-8", "canonical_bson": "1B0000000C610003000000C3A90056E1FC72E0C917E9C471416100", "canonical_extjson": "{\"a\": {\"$dbPointer\": {\"$ref\": \"é\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}}", "converted_bson": "2B0000000361002300000002247265660003000000C3A900072469640056E1FC72E0C917E9C47141610000", "converted_extjson": "{\"a\": {\"$ref\": \"é\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}" } ], "decodeErrors": [ { "description": "String with negative length", "bson": "1A0000000C6100FFFFFFFF620056E1FC72E0C917E9C471416100" }, { "description": "String with zero length", "bson": "1A0000000C610000000000620056E1FC72E0C917E9C471416100" }, { "description": "String not null terminated", "bson": "1A0000000C610002000000626256E1FC72E0C917E9C471416100" }, { "description": "short OID (less than minimum length for field)", "bson": "160000000C61000300000061620056E1FC72E0C91700" }, { "description": "short OID (greater than minimum, but truncated)", "bson": "1A0000000C61000300000061620056E1FC72E0C917E9C4716100" }, { "description": "String with bad UTF-8", "bson": "1A0000000C610002000000E90056E1FC72E0C917E9C471416100" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/dbref.json000066400000000000000000000067661456567454500253370ustar00rootroot00000000000000{ "description": "Document type (DBRef sub-documents)", "bson_type": "0x03", "valid": [ { "description": "DBRef", "canonical_bson": "37000000036462726566002b0000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e0000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}}}" }, { "description": "DBRef with database", "canonical_bson": "4300000003646272656600370000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e0224646200030000006462000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$db\": \"db\"}}" }, { "description": "DBRef with database and additional fields", "canonical_bson": "48000000036462726566003c0000000224726566000b000000636f6c6c656374696f6e0010246964002a00000002246462000300000064620002666f6f0004000000626172000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$numberInt\": \"42\"}, \"$db\": \"db\", \"foo\": \"bar\"}}" }, { "description": "DBRef with additional fields", "canonical_bson": "4400000003646272656600380000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e02666f6f0004000000626172000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"foo\": \"bar\"}}" }, { "description": "Document with key names similar to those of a DBRef", "canonical_bson": "3e0000000224726566000c0000006e6f742d612d646272656600072469640058921b3e6e32ab156a22b59e022462616e616e6100050000007065656c0000", "canonical_extjson": "{\"$ref\": \"not-a-dbref\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$banana\": \"peel\"}" }, { "description": "DBRef with additional dollar-prefixed and dotted fields", "canonical_bson": "48000000036462726566003c0000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e10612e62000100000010246300010000000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"a.b\": {\"$numberInt\": \"1\"}, \"$c\": {\"$numberInt\": \"1\"}}}" }, { "description": "Sub-document resembles DBRef but $id is missing", "canonical_bson": "26000000036462726566001a0000000224726566000b000000636f6c6c656374696f6e000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\"}}" }, { "description": "Sub-document resembles DBRef but $ref is not a string", "canonical_bson": "2c000000036462726566002000000010247265660001000000072469640058921b3e6e32ab156a22b59e0000", "canonical_extjson": "{\"dbref\": {\"$ref\": {\"$numberInt\": \"1\"}, \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}}}" }, { "description": "Sub-document resembles DBRef but $db is not a string", "canonical_bson": "4000000003646272656600340000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e1024646200010000000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$db\": {\"$numberInt\": \"1\"}}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/decimal128-1.json000066400000000000000000000457031456567454500262360ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "Special - Canonical NaN", "canonical_bson": "180000001364000000000000000000000000000000007C00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}" }, { "description": "Special - Negative NaN", "canonical_bson": "18000000136400000000000000000000000000000000FC00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "lossy": true }, { "description": "Special - Negative NaN", "canonical_bson": "18000000136400000000000000000000000000000000FC00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-NaN\"}}", "lossy": true }, { "description": "Special - Canonical SNaN", "canonical_bson": "180000001364000000000000000000000000000000007E00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "lossy": true }, { "description": "Special - Negative SNaN", "canonical_bson": "18000000136400000000000000000000000000000000FE00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "lossy": true }, { "description": "Special - NaN with a payload", "canonical_bson": "180000001364001200000000000000000000000000007E00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "lossy": true }, { "description": "Special - Canonical Positive Infinity", "canonical_bson": "180000001364000000000000000000000000000000007800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Special - Canonical Negative Infinity", "canonical_bson": "18000000136400000000000000000000000000000000F800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Special - Invalid representation treated as 0", "canonical_bson": "180000001364000000000000000000000000000000106C00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}", "lossy": true }, { "description": "Special - Invalid representation treated as -0", "canonical_bson": "18000000136400DCBA9876543210DEADBEEF00000010EC00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}", "lossy": true }, { "description": "Special - Invalid representation treated as 0E3", "canonical_bson": "18000000136400FFFFFFFFFFFFFFFFFFFFFFFFFFFF116C00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}", "lossy": true }, { "description": "Regular - Adjusted Exponent Limit", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CF22F00", "canonical_extjson": "{\"d\": { \"$numberDecimal\": \"0.000001234567890123456789012345678901234\" }}" }, { "description": "Regular - Smallest", "canonical_bson": "18000000136400D204000000000000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.001234\"}}" }, { "description": "Regular - Smallest with Trailing Zeros", "canonical_bson": "1800000013640040EF5A07000000000000000000002A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00123400000\"}}" }, { "description": "Regular - 0.1", "canonical_bson": "1800000013640001000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1\"}}" }, { "description": "Regular - 0.1234567890123456789012345678901234", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CFC2F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1234567890123456789012345678901234\"}}" }, { "description": "Regular - 0", "canonical_bson": "180000001364000000000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "Regular - -0", "canonical_bson": "18000000136400000000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "Regular - -0.0", "canonical_bson": "1800000013640000000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0\"}}" }, { "description": "Regular - 2", "canonical_bson": "180000001364000200000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2\"}}" }, { "description": "Regular - 2.000", "canonical_bson": "18000000136400D0070000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2.000\"}}" }, { "description": "Regular - Largest", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234567890123456789012345678901234\"}}" }, { "description": "Scientific - Tiniest", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09ED010000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.999999999999999999999999999999999E-6143\"}}" }, { "description": "Scientific - Tiny", "canonical_bson": "180000001364000100000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "Scientific - Negative Tiny", "canonical_bson": "180000001364000100000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6176\"}}" }, { "description": "Scientific - Adjusted Exponent Limit", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CF02F00", "canonical_extjson": "{\"d\": { \"$numberDecimal\": \"1.234567890123456789012345678901234E-7\" }}" }, { "description": "Scientific - Fractional", "canonical_bson": "1800000013640064000000000000000000000000002CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00E-8\"}}" }, { "description": "Scientific - 0 with Exponent", "canonical_bson": "180000001364000000000000000000000000000000205F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6000\"}}" }, { "description": "Scientific - 0 with Negative Exponent", "canonical_bson": "1800000013640000000000000000000000000000007A2B00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-611\"}}" }, { "description": "Scientific - No Decimal with Signed Exponent", "canonical_bson": "180000001364000100000000000000000000000000463000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+3\"}}" }, { "description": "Scientific - Trailing Zero", "canonical_bson": "180000001364001A04000000000000000000000000423000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.050E+4\"}}" }, { "description": "Scientific - With Decimal", "canonical_bson": "180000001364006900000000000000000000000000423000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.05E+3\"}}" }, { "description": "Scientific - Full", "canonical_bson": "18000000136400FFFFFFFFFFFFFFFFFFFFFFFFFFFF403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"5192296858534827628530496329220095\"}}" }, { "description": "Scientific - Large", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+6144\"}}" }, { "description": "Scientific - Largest", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09EDFF5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.999999999999999999999999999999999E+6144\"}}" }, { "description": "Non-Canonical Parsing - Exponent Normalization", "canonical_bson": "1800000013640064000000000000000000000000002CB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-100E-10\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00E-8\"}}" }, { "description": "Non-Canonical Parsing - Unsigned Positive Exponent", "canonical_bson": "180000001364000100000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+3\"}}" }, { "description": "Non-Canonical Parsing - Lowercase Exponent Identifier", "canonical_bson": "180000001364000100000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+3\"}}" }, { "description": "Non-Canonical Parsing - Long Significand with Exponent", "canonical_bson": "1800000013640079D9E0F9763ADA429D0200000000583000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12345689012345789012345E+12\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.2345689012345789012345E+34\"}}" }, { "description": "Non-Canonical Parsing - Positive Sign", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+1234567890123456789012345678901234\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234567890123456789012345678901234\"}}" }, { "description": "Non-Canonical Parsing - Long Decimal String", "canonical_bson": "180000001364000100000000000000000000000000722800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \".000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-999\"}}" }, { "description": "Non-Canonical Parsing - nan", "canonical_bson": "180000001364000000000000000000000000000000007C00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"nan\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}" }, { "description": "Non-Canonical Parsing - nAn", "canonical_bson": "180000001364000000000000000000000000000000007C00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"nAn\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}" }, { "description": "Non-Canonical Parsing - +infinity", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+infinity\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - infinity", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"infinity\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - infiniTY", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"infiniTY\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - inf", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"inf\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - inF", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"inF\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - -infinity", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-infinity\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Non-Canonical Parsing - -infiniTy", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-infiniTy\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Non-Canonical Parsing - -Inf", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Non-Canonical Parsing - -inf", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-inf\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Non-Canonical Parsing - -inF", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-inF\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Rounded Subnormal number", "canonical_bson": "180000001364000100000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10E-6177\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "Clamped", "canonical_bson": "180000001364000a00000000000000000000000000fe5f00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E6112\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+6112\"}}" }, { "description": "Exact rounding", "canonical_bson": "18000000136400000000000a5bc138938d44c64d31cc3700", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+999\"}}" }, { "description": "Clamped zeros with a large positive exponent", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+2147483647\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "Clamped zeros with a large negative exponent", "canonical_bson": "180000001364000000000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-2147483647\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "Clamped negative zeros with a large positive exponent", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+2147483647\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "Clamped negative zeros with a large negative exponent", "canonical_bson": "180000001364000000000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-2147483647\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/decimal128-2.json000066400000000000000000001136001456567454500262270ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "[decq021] Normality", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C40B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1234567890123456789012345678901234\"}}" }, { "description": "[decq823] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400010000800000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-2147483649\"}}" }, { "description": "[decq822] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400000000800000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-2147483648\"}}" }, { "description": "[decq821] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FFFFFF7F0000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-2147483647\"}}" }, { "description": "[decq820] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FEFFFF7F0000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-2147483646\"}}" }, { "description": "[decq152] fold-downs (more below)", "canonical_bson": "18000000136400393000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-12345\"}}" }, { "description": "[decq154] fold-downs (more below)", "canonical_bson": "18000000136400D20400000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1234\"}}" }, { "description": "[decq006] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-750\"}}" }, { "description": "[decq164] fold-downs (more below)", "canonical_bson": "1800000013640039300000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-123.45\"}}" }, { "description": "[decq156] fold-downs (more below)", "canonical_bson": "180000001364007B0000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-123\"}}" }, { "description": "[decq008] derivative canonical plain strings", "canonical_bson": "18000000136400EE020000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-75.0\"}}" }, { "description": "[decq158] fold-downs (more below)", "canonical_bson": "180000001364000C0000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-12\"}}" }, { "description": "[decq122] Nmax and similar", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09EDFFDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.999999999999999999999999999999999E+6144\"}}" }, { "description": "[decq002] (mostly derived from the Strawman 4 document and examples)", "canonical_bson": "18000000136400EE020000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-7.50\"}}" }, { "description": "[decq004] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000042B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-7.50E+3\"}}" }, { "description": "[decq018] derivative canonical plain strings", "canonical_bson": "18000000136400EE020000000000000000000000002EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-7.50E-7\"}}" }, { "description": "[decq125] Nmax and similar", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CFEDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.234567890123456789012345678901234E+6144\"}}" }, { "description": "[decq131] fold-downs (more below)", "canonical_bson": "18000000136400000000807F1BCF85B27059C8A43CFEDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.230000000000000000000000000000000E+6144\"}}" }, { "description": "[decq162] fold-downs (more below)", "canonical_bson": "180000001364007B000000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.23\"}}" }, { "description": "[decq176] Nmin and below", "canonical_bson": "18000000136400010000000A5BC138938D44C64D31008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.000000000000000000000000000000001E-6143\"}}" }, { "description": "[decq174] Nmin and below", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.000000000000000000000000000000000E-6143\"}}" }, { "description": "[decq133] fold-downs (more below)", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FEDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq160] fold-downs (more below)", "canonical_bson": "18000000136400010000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1\"}}" }, { "description": "[decq172] Nmin and below", "canonical_bson": "180000001364000100000000000000000000000000428000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6143\"}}" }, { "description": "[decq010] derivative canonical plain strings", "canonical_bson": "18000000136400EE020000000000000000000000003AB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.750\"}}" }, { "description": "[decq012] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000038B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0750\"}}" }, { "description": "[decq014] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000034B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000750\"}}" }, { "description": "[decq016] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000030B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000750\"}}" }, { "description": "[decq404] zeros", "canonical_bson": "180000001364000000000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "[decq424] negative zeros", "canonical_bson": "180000001364000000000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" }, { "description": "[decq407] zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[decq427] negative zeros", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[decq409] zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[decq428] negative zeros", "canonical_bson": "18000000136400000000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[decq700] Selected DPD codes", "canonical_bson": "180000001364000000000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[decq406] zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[decq426] negative zeros", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[decq410] zeros", "canonical_bson": "180000001364000000000000000000000000000000463000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}" }, { "description": "[decq431] negative zeros", "canonical_bson": "18000000136400000000000000000000000000000046B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+3\"}}" }, { "description": "[decq419] clamped zeros...", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "[decq432] negative zeros", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "[decq405] zeros", "canonical_bson": "180000001364000000000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "[decq425] negative zeros", "canonical_bson": "180000001364000000000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" }, { "description": "[decq508] Specials", "canonical_bson": "180000001364000000000000000000000000000000007800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "[decq528] Specials", "canonical_bson": "18000000136400000000000000000000000000000000F800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "[decq541] Specials", "canonical_bson": "180000001364000000000000000000000000000000007C00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}" }, { "description": "[decq074] Nmin and below", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E-6143\"}}" }, { "description": "[decq602] fold-down full sequence", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq604] fold-down full sequence", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000000E+6143\"}}" }, { "description": "[decq606] fold-down full sequence", "canonical_bson": "1800000013640000000080264B91C02220BE377E00FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000000000E+6142\"}}" }, { "description": "[decq608] fold-down full sequence", "canonical_bson": "1800000013640000000040EAED7446D09C2C9F0C00FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000E+6141\"}}" }, { "description": "[decq610] fold-down full sequence", "canonical_bson": "18000000136400000000A0CA17726DAE0F1E430100FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000E+6140\"}}" }, { "description": "[decq612] fold-down full sequence", "canonical_bson": "18000000136400000000106102253E5ECE4F200000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000000E+6139\"}}" }, { "description": "[decq614] fold-down full sequence", "canonical_bson": "18000000136400000000E83C80D09F3C2E3B030000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000E+6138\"}}" }, { "description": "[decq616] fold-down full sequence", "canonical_bson": "18000000136400000000E4D20CC8DCD2B752000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000E+6137\"}}" }, { "description": "[decq618] fold-down full sequence", "canonical_bson": "180000001364000000004A48011416954508000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000E+6136\"}}" }, { "description": "[decq620] fold-down full sequence", "canonical_bson": "18000000136400000000A1EDCCCE1BC2D300000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000E+6135\"}}" }, { "description": "[decq622] fold-down full sequence", "canonical_bson": "18000000136400000080F64AE1C7022D1500000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000E+6134\"}}" }, { "description": "[decq624] fold-down full sequence", "canonical_bson": "18000000136400000040B2BAC9E0191E0200000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000E+6133\"}}" }, { "description": "[decq626] fold-down full sequence", "canonical_bson": "180000001364000000A0DEC5ADC935360000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000E+6132\"}}" }, { "description": "[decq628] fold-down full sequence", "canonical_bson": "18000000136400000010632D5EC76B050000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000E+6131\"}}" }, { "description": "[decq630] fold-down full sequence", "canonical_bson": "180000001364000000E8890423C78A000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000E+6130\"}}" }, { "description": "[decq632] fold-down full sequence", "canonical_bson": "18000000136400000064A7B3B6E00D000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000E+6129\"}}" }, { "description": "[decq634] fold-down full sequence", "canonical_bson": "1800000013640000008A5D78456301000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000E+6128\"}}" }, { "description": "[decq636] fold-down full sequence", "canonical_bson": "180000001364000000C16FF2862300000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000E+6127\"}}" }, { "description": "[decq638] fold-down full sequence", "canonical_bson": "180000001364000080C6A47E8D0300000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000E+6126\"}}" }, { "description": "[decq640] fold-down full sequence", "canonical_bson": "1800000013640000407A10F35A0000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000E+6125\"}}" }, { "description": "[decq642] fold-down full sequence", "canonical_bson": "1800000013640000A0724E18090000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000E+6124\"}}" }, { "description": "[decq644] fold-down full sequence", "canonical_bson": "180000001364000010A5D4E8000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000E+6123\"}}" }, { "description": "[decq646] fold-down full sequence", "canonical_bson": "1800000013640000E8764817000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000E+6122\"}}" }, { "description": "[decq648] fold-down full sequence", "canonical_bson": "1800000013640000E40B5402000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000E+6121\"}}" }, { "description": "[decq650] fold-down full sequence", "canonical_bson": "1800000013640000CA9A3B00000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000E+6120\"}}" }, { "description": "[decq652] fold-down full sequence", "canonical_bson": "1800000013640000E1F50500000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000E+6119\"}}" }, { "description": "[decq654] fold-down full sequence", "canonical_bson": "180000001364008096980000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000E+6118\"}}" }, { "description": "[decq656] fold-down full sequence", "canonical_bson": "1800000013640040420F0000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000E+6117\"}}" }, { "description": "[decq658] fold-down full sequence", "canonical_bson": "18000000136400A086010000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000E+6116\"}}" }, { "description": "[decq660] fold-down full sequence", "canonical_bson": "180000001364001027000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000E+6115\"}}" }, { "description": "[decq662] fold-down full sequence", "canonical_bson": "18000000136400E803000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000E+6114\"}}" }, { "description": "[decq664] fold-down full sequence", "canonical_bson": "180000001364006400000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+6113\"}}" }, { "description": "[decq666] fold-down full sequence", "canonical_bson": "180000001364000A00000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+6112\"}}" }, { "description": "[decq060] fold-downs (more below)", "canonical_bson": "180000001364000100000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1\"}}" }, { "description": "[decq670] fold-down full sequence", "canonical_bson": "180000001364000100000000000000000000000000FC5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6110\"}}" }, { "description": "[decq668] fold-down full sequence", "canonical_bson": "180000001364000100000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6111\"}}" }, { "description": "[decq072] Nmin and below", "canonical_bson": "180000001364000100000000000000000000000000420000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6143\"}}" }, { "description": "[decq076] Nmin and below", "canonical_bson": "18000000136400010000000A5BC138938D44C64D31000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000001E-6143\"}}" }, { "description": "[decq036] fold-downs (more below)", "canonical_bson": "18000000136400000000807F1BCF85B27059C8A43CFE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.230000000000000000000000000000000E+6144\"}}" }, { "description": "[decq062] fold-downs (more below)", "canonical_bson": "180000001364007B000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.23\"}}" }, { "description": "[decq034] Nmax and similar", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CFE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.234567890123456789012345678901234E+6144\"}}" }, { "description": "[decq441] exponent lengths", "canonical_bson": "180000001364000700000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7\"}}" }, { "description": "[decq449] exponent lengths", "canonical_bson": "1800000013640007000000000000000000000000001E5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+5999\"}}" }, { "description": "[decq447] exponent lengths", "canonical_bson": "1800000013640007000000000000000000000000000E3800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+999\"}}" }, { "description": "[decq445] exponent lengths", "canonical_bson": "180000001364000700000000000000000000000000063100", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+99\"}}" }, { "description": "[decq443] exponent lengths", "canonical_bson": "180000001364000700000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+9\"}}" }, { "description": "[decq842] VG testcase", "canonical_bson": "180000001364000000FED83F4E7C9FE4E269E38A5BCD1700", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7.049000000000010795488000000000000E-3097\"}}" }, { "description": "[decq841] VG testcase", "canonical_bson": "180000001364000000203B9DB5056F000000000000002400", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"8.000000000000000000E-1550\"}}" }, { "description": "[decq840] VG testcase", "canonical_bson": "180000001364003C17258419D710C42F0000000000002400", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"8.81125000000001349436E-1548\"}}" }, { "description": "[decq701] Selected DPD codes", "canonical_bson": "180000001364000900000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9\"}}" }, { "description": "[decq032] Nmax and similar", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09EDFF5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.999999999999999999999999999999999E+6144\"}}" }, { "description": "[decq702] Selected DPD codes", "canonical_bson": "180000001364000A00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10\"}}" }, { "description": "[decq057] fold-downs (more below)", "canonical_bson": "180000001364000C00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12\"}}" }, { "description": "[decq703] Selected DPD codes", "canonical_bson": "180000001364001300000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"19\"}}" }, { "description": "[decq704] Selected DPD codes", "canonical_bson": "180000001364001400000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"20\"}}" }, { "description": "[decq705] Selected DPD codes", "canonical_bson": "180000001364001D00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"29\"}}" }, { "description": "[decq706] Selected DPD codes", "canonical_bson": "180000001364001E00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"30\"}}" }, { "description": "[decq707] Selected DPD codes", "canonical_bson": "180000001364002700000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"39\"}}" }, { "description": "[decq708] Selected DPD codes", "canonical_bson": "180000001364002800000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"40\"}}" }, { "description": "[decq709] Selected DPD codes", "canonical_bson": "180000001364003100000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"49\"}}" }, { "description": "[decq710] Selected DPD codes", "canonical_bson": "180000001364003200000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"50\"}}" }, { "description": "[decq711] Selected DPD codes", "canonical_bson": "180000001364003B00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"59\"}}" }, { "description": "[decq712] Selected DPD codes", "canonical_bson": "180000001364003C00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"60\"}}" }, { "description": "[decq713] Selected DPD codes", "canonical_bson": "180000001364004500000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"69\"}}" }, { "description": "[decq714] Selected DPD codes", "canonical_bson": "180000001364004600000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"70\"}}" }, { "description": "[decq715] Selected DPD codes", "canonical_bson": "180000001364004700000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"71\"}}" }, { "description": "[decq716] Selected DPD codes", "canonical_bson": "180000001364004800000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"72\"}}" }, { "description": "[decq717] Selected DPD codes", "canonical_bson": "180000001364004900000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"73\"}}" }, { "description": "[decq718] Selected DPD codes", "canonical_bson": "180000001364004A00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"74\"}}" }, { "description": "[decq719] Selected DPD codes", "canonical_bson": "180000001364004B00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"75\"}}" }, { "description": "[decq720] Selected DPD codes", "canonical_bson": "180000001364004C00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"76\"}}" }, { "description": "[decq721] Selected DPD codes", "canonical_bson": "180000001364004D00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"77\"}}" }, { "description": "[decq722] Selected DPD codes", "canonical_bson": "180000001364004E00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"78\"}}" }, { "description": "[decq723] Selected DPD codes", "canonical_bson": "180000001364004F00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"79\"}}" }, { "description": "[decq056] fold-downs (more below)", "canonical_bson": "180000001364007B00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123\"}}" }, { "description": "[decq064] fold-downs (more below)", "canonical_bson": "1800000013640039300000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123.45\"}}" }, { "description": "[decq732] Selected DPD codes", "canonical_bson": "180000001364000802000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"520\"}}" }, { "description": "[decq733] Selected DPD codes", "canonical_bson": "180000001364000902000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"521\"}}" }, { "description": "[decq740] DPD: one of each of the huffman groups", "canonical_bson": "180000001364000903000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"777\"}}" }, { "description": "[decq741] DPD: one of each of the huffman groups", "canonical_bson": "180000001364000A03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"778\"}}" }, { "description": "[decq742] DPD: one of each of the huffman groups", "canonical_bson": "180000001364001303000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"787\"}}" }, { "description": "[decq746] DPD: one of each of the huffman groups", "canonical_bson": "180000001364001F03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"799\"}}" }, { "description": "[decq743] DPD: one of each of the huffman groups", "canonical_bson": "180000001364006D03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"877\"}}" }, { "description": "[decq753] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "180000001364007803000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"888\"}}" }, { "description": "[decq754] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "180000001364007903000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"889\"}}" }, { "description": "[decq760] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "180000001364008203000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"898\"}}" }, { "description": "[decq764] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "180000001364008303000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"899\"}}" }, { "description": "[decq745] DPD: one of each of the huffman groups", "canonical_bson": "18000000136400D303000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"979\"}}" }, { "description": "[decq770] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "18000000136400DC03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"988\"}}" }, { "description": "[decq774] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "18000000136400DD03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"989\"}}" }, { "description": "[decq730] Selected DPD codes", "canonical_bson": "18000000136400E203000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"994\"}}" }, { "description": "[decq731] Selected DPD codes", "canonical_bson": "18000000136400E303000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"995\"}}" }, { "description": "[decq744] DPD: one of each of the huffman groups", "canonical_bson": "18000000136400E503000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"997\"}}" }, { "description": "[decq780] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "18000000136400E603000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"998\"}}" }, { "description": "[decq787] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "18000000136400E703000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"999\"}}" }, { "description": "[decq053] fold-downs (more below)", "canonical_bson": "18000000136400D204000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234\"}}" }, { "description": "[decq052] fold-downs (more below)", "canonical_bson": "180000001364003930000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12345\"}}" }, { "description": "[decq792] Miscellaneous (testers' queries, etc.)", "canonical_bson": "180000001364003075000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"30000\"}}" }, { "description": "[decq793] Miscellaneous (testers' queries, etc.)", "canonical_bson": "1800000013640090940D0000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"890000\"}}" }, { "description": "[decq824] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FEFFFF7F00000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2147483646\"}}" }, { "description": "[decq825] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FFFFFF7F00000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2147483647\"}}" }, { "description": "[decq826] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "180000001364000000008000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2147483648\"}}" }, { "description": "[decq827] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "180000001364000100008000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2147483649\"}}" }, { "description": "[decq828] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FEFFFFFF00000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4294967294\"}}" }, { "description": "[decq829] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FFFFFFFF00000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4294967295\"}}" }, { "description": "[decq830] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "180000001364000000000001000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4294967296\"}}" }, { "description": "[decq831] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "180000001364000100000001000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4294967297\"}}" }, { "description": "[decq022] Normality", "canonical_bson": "18000000136400C7711CC7B548F377DC80A131C836403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1111111111111111111111111111111111\"}}" }, { "description": "[decq020] Normality", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234567890123456789012345678901234\"}}" }, { "description": "[decq550] Specials", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09ED413000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9999999999999999999999999999999999\"}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/decimal128-3.json000066400000000000000000002613321456567454500262360ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "[basx066] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE0000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-00345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-345678.5432\"}}" }, { "description": "[basx065] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE0000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-345678.5432\"}}" }, { "description": "[basx064] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE0000000000000000000038B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-345678.5432\"}}" }, { "description": "[basx041] strings without E cannot generate E in result", "canonical_bson": "180000001364004C0000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-76\"}}" }, { "description": "[basx027] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000F270000000000000000000000003AB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.999\"}}" }, { "description": "[basx026] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364009F230000000000000000000000003AB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.119\"}}" }, { "description": "[basx025] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364008F030000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.11\"}}" }, { "description": "[basx024] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364005B000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.1\"}}" }, { "description": "[dqbsr531] negatives (Rounded)", "canonical_bson": "1800000013640099761CC7B548F377DC80A131C836FEAF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.1111111111111111111111111111123450\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.111111111111111111111111111112345\"}}" }, { "description": "[basx022] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000A000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.0\"}}" }, { "description": "[basx021] conform to rules and exponent will be in permitted range).", "canonical_bson": "18000000136400010000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1\"}}" }, { "description": "[basx601] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-9\"}}" }, { "description": "[basx622] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002EB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-9\"}}" }, { "description": "[basx602] Zeros", "canonical_bson": "180000001364000000000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-8\"}}" }, { "description": "[basx621] Zeros", "canonical_bson": "18000000136400000000000000000000000000000030B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-8\"}}" }, { "description": "[basx603] Zeros", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx620] Zeros", "canonical_bson": "18000000136400000000000000000000000000000032B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-7\"}}" }, { "description": "[basx604] Zeros", "canonical_bson": "180000001364000000000000000000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx619] Zeros", "canonical_bson": "18000000136400000000000000000000000000000034B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000\"}}" }, { "description": "[basx605] Zeros", "canonical_bson": "180000001364000000000000000000000000000000363000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx618] Zeros", "canonical_bson": "18000000136400000000000000000000000000000036B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000\"}}" }, { "description": "[basx680] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"000000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx606] Zeros", "canonical_bson": "180000001364000000000000000000000000000000383000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx617] Zeros", "canonical_bson": "18000000136400000000000000000000000000000038B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000\"}}" }, { "description": "[basx681] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx686] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+00000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx687] Zeros", "canonical_bson": "18000000136400000000000000000000000000000040B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-00000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[basx019] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-00.00\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[basx607] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000\"}}" }, { "description": "[basx616] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003AB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000\"}}" }, { "description": "[basx682] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx155] Numbers with E", "canonical_bson": "1800000013640000000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000e+0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000\"}}" }, { "description": "[basx130] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx290] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000\"}}" }, { "description": "[basx131] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx291] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000036B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000\"}}" }, { "description": "[basx132] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx292] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000034B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000\"}}" }, { "description": "[basx133] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx293] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000032B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-7\"}}" }, { "description": "[basx608] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[basx615] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[basx683] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx630] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[basx670] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[basx631] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx671] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000\"}}" }, { "description": "[basx134] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx294] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000\"}}" }, { "description": "[basx632] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx672] Zeros", "canonical_bson": "180000001364000000000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx135] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx295] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000036B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000\"}}" }, { "description": "[basx633] Zeros", "canonical_bson": "180000001364000000000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+1\"}}" }, { "description": "[basx673] Zeros", "canonical_bson": "180000001364000000000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx136] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx674] Zeros", "canonical_bson": "180000001364000000000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx634] Zeros", "canonical_bson": "180000001364000000000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+2\"}}" }, { "description": "[basx137] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx635] Zeros", "canonical_bson": "180000001364000000000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}" }, { "description": "[basx675] Zeros", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx636] Zeros", "canonical_bson": "180000001364000000000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+4\"}}" }, { "description": "[basx676] Zeros", "canonical_bson": "180000001364000000000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-8\"}}" }, { "description": "[basx637] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+5\"}}" }, { "description": "[basx677] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-9\"}}" }, { "description": "[basx638] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6\"}}" }, { "description": "[basx678] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-10\"}}" }, { "description": "[basx149] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"000E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx639] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+7\"}}" }, { "description": "[basx679] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-11\"}}" }, { "description": "[basx063] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE00000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+00345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.5432\"}}" }, { "description": "[basx018] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640000000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0\"}}" }, { "description": "[basx609] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx614] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0\"}}" }, { "description": "[basx684] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx640] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx660] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx641] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx661] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[basx296] some more negative zeros [systematic tests below]", "canonical_bson": "1800000013640000000000000000000000000000003AB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000\"}}" }, { "description": "[basx642] Zeros", "canonical_bson": "180000001364000000000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+1\"}}" }, { "description": "[basx662] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000\"}}" }, { "description": "[basx297] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000\"}}" }, { "description": "[basx643] Zeros", "canonical_bson": "180000001364000000000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+2\"}}" }, { "description": "[basx663] Zeros", "canonical_bson": "180000001364000000000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx644] Zeros", "canonical_bson": "180000001364000000000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}" }, { "description": "[basx664] Zeros", "canonical_bson": "180000001364000000000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx645] Zeros", "canonical_bson": "180000001364000000000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+4\"}}" }, { "description": "[basx665] Zeros", "canonical_bson": "180000001364000000000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx646] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+5\"}}" }, { "description": "[basx666] Zeros", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx647] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6\"}}" }, { "description": "[basx667] Zeros", "canonical_bson": "180000001364000000000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-8\"}}" }, { "description": "[basx648] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+7\"}}" }, { "description": "[basx668] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-9\"}}" }, { "description": "[basx160] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx161] Numbers with E", "canonical_bson": "1800000013640000000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00E-9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-9\"}}" }, { "description": "[basx649] Zeros", "canonical_bson": "180000001364000000000000000000000000000000503000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+8\"}}" }, { "description": "[basx669] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-10\"}}" }, { "description": "[basx062] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE00000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+0345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.5432\"}}" }, { "description": "[basx001] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000000000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx017] conform to rules and exponent will be in permitted range).", "canonical_bson": "18000000136400000000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[basx611] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx613] Zeros", "canonical_bson": "18000000136400000000000000000000000000000040B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[basx685] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx688] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx689] Zeros", "canonical_bson": "18000000136400000000000000000000000000000040B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[basx650] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx651] Zeros", "canonical_bson": "180000001364000000000000000000000000000000423000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+1\"}}" }, { "description": "[basx298] some more negative zeros [systematic tests below]", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[basx652] Zeros", "canonical_bson": "180000001364000000000000000000000000000000443000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+2\"}}" }, { "description": "[basx299] some more negative zeros [systematic tests below]", "canonical_bson": "1800000013640000000000000000000000000000003AB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000\"}}" }, { "description": "[basx653] Zeros", "canonical_bson": "180000001364000000000000000000000000000000463000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}" }, { "description": "[basx654] Zeros", "canonical_bson": "180000001364000000000000000000000000000000483000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+4\"}}" }, { "description": "[basx655] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+5\"}}" }, { "description": "[basx656] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6\"}}" }, { "description": "[basx657] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+7\"}}" }, { "description": "[basx658] Zeros", "canonical_bson": "180000001364000000000000000000000000000000503000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+8\"}}" }, { "description": "[basx138] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+0E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx139] Numbers with E", "canonical_bson": "18000000136400000000000000000000000000000052B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+9\"}}" }, { "description": "[basx144] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx154] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx659] Zeros", "canonical_bson": "180000001364000000000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx042] strings without E cannot generate E in result", "canonical_bson": "18000000136400FC040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+12.76\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.76\"}}" }, { "description": "[basx143] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+1E+009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx061] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE00000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.5432\"}}" }, { "description": "[basx036] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640015CD5B0700000000000000000000203000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000000123456789\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.23456789E-8\"}}" }, { "description": "[basx035] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640015CD5B0700000000000000000000223000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000123456789\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.23456789E-7\"}}" }, { "description": "[basx034] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640015CD5B0700000000000000000000243000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000123456789\"}}" }, { "description": "[basx053] strings without E cannot generate E in result", "canonical_bson": "180000001364003200000000000000000000000000323000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000050\"}}" }, { "description": "[basx033] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640015CD5B0700000000000000000000263000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000123456789\"}}" }, { "description": "[basx016] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000C000000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.012\"}}" }, { "description": "[basx015] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364007B000000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.123\"}}" }, { "description": "[basx037] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640078DF0D8648700000000000000000223000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.123456789012344\"}}" }, { "description": "[basx038] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640079DF0D8648700000000000000000223000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.123456789012345\"}}" }, { "description": "[basx250] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx257] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx256] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.01265\"}}" }, { "description": "[basx258] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx251] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000103000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-21\"}}" }, { "description": "[basx263] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000603000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+19\"}}" }, { "description": "[basx255] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.001265\"}}" }, { "description": "[basx259] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx254] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0001265\"}}" }, { "description": "[basx260] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx253] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00001265\"}}" }, { "description": "[basx261] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx252] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000283000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-9\"}}" }, { "description": "[basx262] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+7\"}}" }, { "description": "[basx159] Numbers with E", "canonical_bson": "1800000013640049000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.73e-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7.3E-8\"}}" }, { "description": "[basx004] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640064000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00\"}}" }, { "description": "[basx003] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000A000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0\"}}" }, { "description": "[basx002] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000100000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1\"}}" }, { "description": "[basx148] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx153] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx141] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e+09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx146] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx151] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx142] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000F43000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+90\"}}" }, { "description": "[basx147] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000F43000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e+90\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+90\"}}" }, { "description": "[basx152] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000F43000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E90\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+90\"}}" }, { "description": "[basx140] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx150] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx014] conform to rules and exponent will be in permitted range).", "canonical_bson": "18000000136400D2040000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.234\"}}" }, { "description": "[basx170] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx177] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx176] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx178] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx171] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000123000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-20\"}}" }, { "description": "[basx183] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000623000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+20\"}}" }, { "description": "[basx175] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.01265\"}}" }, { "description": "[basx179] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx174] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.001265\"}}" }, { "description": "[basx180] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx173] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0001265\"}}" }, { "description": "[basx181] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000423000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+4\"}}" }, { "description": "[basx172] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000002A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-8\"}}" }, { "description": "[basx182] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000004A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+8\"}}" }, { "description": "[basx157] Numbers with E", "canonical_bson": "180000001364000400000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4E+9\"}}" }, { "description": "[basx067] examples", "canonical_bson": "180000001364000500000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"5E-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000005\"}}" }, { "description": "[basx069] examples", "canonical_bson": "180000001364000500000000000000000000000000323000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"5E-7\"}}" }, { "description": "[basx385] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7\"}}" }, { "description": "[basx365] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000543000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E10\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+10\"}}" }, { "description": "[basx405] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000002C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-10\"}}" }, { "description": "[basx363] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000563000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E11\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+11\"}}" }, { "description": "[basx407] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000002A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-11\"}}" }, { "description": "[basx361] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000583000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E12\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+12\"}}" }, { "description": "[basx409] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000283000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-12\"}}" }, { "description": "[basx411] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000263000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-13\"}}" }, { "description": "[basx383] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+1\"}}" }, { "description": "[basx387] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.7\"}}" }, { "description": "[basx381] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+2\"}}" }, { "description": "[basx389] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.07\"}}" }, { "description": "[basx379] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+3\"}}" }, { "description": "[basx391] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.007\"}}" }, { "description": "[basx377] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+4\"}}" }, { "description": "[basx393] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0007\"}}" }, { "description": "[basx375] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000004A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+5\"}}" }, { "description": "[basx395] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00007\"}}" }, { "description": "[basx373] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+6\"}}" }, { "description": "[basx397] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000007\"}}" }, { "description": "[basx371] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+7\"}}" }, { "description": "[basx399] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000323000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-7\"}}" }, { "description": "[basx369] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000503000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+8\"}}" }, { "description": "[basx401] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000303000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-8\"}}" }, { "description": "[basx367] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+9\"}}" }, { "description": "[basx403] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000002E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-9\"}}" }, { "description": "[basx007] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640064000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.0\"}}" }, { "description": "[basx005] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000A00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10\"}}" }, { "description": "[basx165] Numbers with E", "canonical_bson": "180000001364000A00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10E+009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+10\"}}" }, { "description": "[basx163] Numbers with E", "canonical_bson": "180000001364000A00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10E+09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+10\"}}" }, { "description": "[basx325] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10\"}}" }, { "description": "[basx305] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000543000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e10\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+11\"}}" }, { "description": "[basx345] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000002C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-10\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-9\"}}" }, { "description": "[basx303] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000563000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e11\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+12\"}}" }, { "description": "[basx347] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000002A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-11\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-10\"}}" }, { "description": "[basx301] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000583000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e12\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+13\"}}" }, { "description": "[basx349] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000283000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-12\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-11\"}}" }, { "description": "[basx351] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000263000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-13\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-12\"}}" }, { "description": "[basx323] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+2\"}}" }, { "description": "[basx327] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0\"}}" }, { "description": "[basx321] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+3\"}}" }, { "description": "[basx329] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.10\"}}" }, { "description": "[basx319] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+4\"}}" }, { "description": "[basx331] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.010\"}}" }, { "description": "[basx317] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+5\"}}" }, { "description": "[basx333] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0010\"}}" }, { "description": "[basx315] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000004A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+6\"}}" }, { "description": "[basx335] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00010\"}}" }, { "description": "[basx313] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+7\"}}" }, { "description": "[basx337] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000010\"}}" }, { "description": "[basx311] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+8\"}}" }, { "description": "[basx339] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000010\"}}" }, { "description": "[basx309] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000503000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+9\"}}" }, { "description": "[basx341] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-7\"}}" }, { "description": "[basx164] Numbers with E", "canonical_bson": "180000001364000A00000000000000000000000000F43000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e+90\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+91\"}}" }, { "description": "[basx162] Numbers with E", "canonical_bson": "180000001364000A00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+10\"}}" }, { "description": "[basx307] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+10\"}}" }, { "description": "[basx343] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-8\"}}" }, { "description": "[basx008] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640065000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.1\"}}" }, { "description": "[basx009] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640068000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.4\"}}" }, { "description": "[basx010] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640069000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.5\"}}" }, { "description": "[basx011] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364006A000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.6\"}}" }, { "description": "[basx012] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364006D000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.9\"}}" }, { "description": "[basx013] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364006E000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"11.0\"}}" }, { "description": "[basx040] strings without E cannot generate E in result", "canonical_bson": "180000001364000C00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12\"}}" }, { "description": "[basx190] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx197] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx196] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx198] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx191] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000143000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-19\"}}" }, { "description": "[basx203] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000643000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+21\"}}" }, { "description": "[basx195] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx199] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx194] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.01265\"}}" }, { "description": "[basx200] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+4\"}}" }, { "description": "[basx193] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.001265\"}}" }, { "description": "[basx201] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+5\"}}" }, { "description": "[basx192] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000002C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-7\"}}" }, { "description": "[basx202] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+9\"}}" }, { "description": "[basx044] strings without E cannot generate E in result", "canonical_bson": "18000000136400FC040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"012.76\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.76\"}}" }, { "description": "[basx042] strings without E cannot generate E in result", "canonical_bson": "18000000136400FC040000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.76\"}}" }, { "description": "[basx046] strings without E cannot generate E in result", "canonical_bson": "180000001364001100000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"17.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"17\"}}" }, { "description": "[basx049] strings without E cannot generate E in result", "canonical_bson": "180000001364002C00000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0044\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"44\"}}" }, { "description": "[basx048] strings without E cannot generate E in result", "canonical_bson": "180000001364002C00000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"044\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"44\"}}" }, { "description": "[basx158] Numbers with E", "canonical_bson": "180000001364002C00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"44E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4.4E+10\"}}" }, { "description": "[basx068] examples", "canonical_bson": "180000001364003200000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"50E-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000050\"}}" }, { "description": "[basx169] Numbers with E", "canonical_bson": "180000001364006400000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"100e+009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+11\"}}" }, { "description": "[basx167] Numbers with E", "canonical_bson": "180000001364006400000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"100e+09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+11\"}}" }, { "description": "[basx168] Numbers with E", "canonical_bson": "180000001364006400000000000000000000000000F43000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"100E+90\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+92\"}}" }, { "description": "[basx166] Numbers with E", "canonical_bson": "180000001364006400000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"100e+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+11\"}}" }, { "description": "[basx210] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx217] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx216] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx218] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx211] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000163000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-18\"}}" }, { "description": "[basx223] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000663000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+22\"}}" }, { "description": "[basx215] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx219] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+4\"}}" }, { "description": "[basx214] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx220] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+5\"}}" }, { "description": "[basx213] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.01265\"}}" }, { "description": "[basx221] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+6\"}}" }, { "description": "[basx212] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000001265\"}}" }, { "description": "[basx222] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+10\"}}" }, { "description": "[basx006] conform to rules and exponent will be in permitted range).", "canonical_bson": "18000000136400E803000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1000\"}}" }, { "description": "[basx230] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx237] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx236] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx238] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+4\"}}" }, { "description": "[basx231] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000183000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-17\"}}" }, { "description": "[basx243] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000683000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+23\"}}" }, { "description": "[basx235] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx239] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+5\"}}" }, { "description": "[basx234] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx240] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+6\"}}" }, { "description": "[basx233] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx241] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+7\"}}" }, { "description": "[basx232] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00001265\"}}" }, { "description": "[basx242] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000503000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+11\"}}" }, { "description": "[basx060] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE00000000000000000000383000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.5432\"}}" }, { "description": "[basx059] strings without E cannot generate E in result", "canonical_bson": "18000000136400F198670C08000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0345678.54321\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.54321\"}}" }, { "description": "[basx058] strings without E cannot generate E in result", "canonical_bson": "180000001364006AF90B7C50000000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.543210\"}}" }, { "description": "[basx057] strings without E cannot generate E in result", "canonical_bson": "180000001364006A19562522020000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2345678.543210\"}}" }, { "description": "[basx056] strings without E cannot generate E in result", "canonical_bson": "180000001364006AB9C8733A0B0000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12345678.543210\"}}" }, { "description": "[basx031] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640040AF0D8648700000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123456789.000000\"}}" }, { "description": "[basx030] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640080910F8648700000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123456789.123456\"}}" }, { "description": "[basx032] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640080910F8648700000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123456789123456\"}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/decimal128-4.json000066400000000000000000000157371456567454500262450ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "[basx023] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640001000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.1\"}}" }, { "description": "[basx045] strings without E cannot generate E in result", "canonical_bson": "1800000013640003000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+0.003\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.003\"}}" }, { "description": "[basx610] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \".0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx612] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003EB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-.0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0\"}}" }, { "description": "[basx043] strings without E cannot generate E in result", "canonical_bson": "18000000136400FC040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+12.76\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.76\"}}" }, { "description": "[basx055] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000005\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"5E-8\"}}" }, { "description": "[basx054] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000005\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"5E-7\"}}" }, { "description": "[basx052] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000005\"}}" }, { "description": "[basx051] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00.00005\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00005\"}}" }, { "description": "[basx050] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000383000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0005\"}}" }, { "description": "[basx047] strings without E cannot generate E in result", "canonical_bson": "1800000013640005000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \".5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.5\"}}" }, { "description": "[dqbsr431] check rounding modes heeded (Rounded)", "canonical_bson": "1800000013640099761CC7B548F377DC80A131C836FE2F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.1111111111111111111111111111123450\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.111111111111111111111111111112345\"}}" }, { "description": "OK2", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FC2F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \".100000000000000000000000000000000000000000000000000000000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1000000000000000000000000000000000\"}}" } ], "parseErrors": [ { "description": "[basx564] Near-specials (Conversion_syntax)", "string": "Infi" }, { "description": "[basx565] Near-specials (Conversion_syntax)", "string": "Infin" }, { "description": "[basx566] Near-specials (Conversion_syntax)", "string": "Infini" }, { "description": "[basx567] Near-specials (Conversion_syntax)", "string": "Infinit" }, { "description": "[basx568] Near-specials (Conversion_syntax)", "string": "-Infinit" }, { "description": "[basx590] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": ".Infinity" }, { "description": "[basx562] Near-specials (Conversion_syntax)", "string": "NaNq" }, { "description": "[basx563] Near-specials (Conversion_syntax)", "string": "NaNs" }, { "description": "[dqbas939] overflow results at different rounding modes (Overflow & Inexact & Rounded)", "string": "-7e10000" }, { "description": "[dqbsr534] negatives (Rounded & Inexact)", "string": "-1.11111111111111111111111111111234650" }, { "description": "[dqbsr535] negatives (Rounded & Inexact)", "string": "-1.11111111111111111111111111111234551" }, { "description": "[dqbsr533] negatives (Rounded & Inexact)", "string": "-1.11111111111111111111111111111234550" }, { "description": "[dqbsr532] negatives (Rounded & Inexact)", "string": "-1.11111111111111111111111111111234549" }, { "description": "[dqbsr432] check rounding modes heeded (Rounded & Inexact)", "string": "1.11111111111111111111111111111234549" }, { "description": "[dqbsr433] check rounding modes heeded (Rounded & Inexact)", "string": "1.11111111111111111111111111111234550" }, { "description": "[dqbsr435] check rounding modes heeded (Rounded & Inexact)", "string": "1.11111111111111111111111111111234551" }, { "description": "[dqbsr434] check rounding modes heeded (Rounded & Inexact)", "string": "1.11111111111111111111111111111234650" }, { "description": "[dqbas938] overflow results at different rounding modes (Overflow & Inexact & Rounded)", "string": "7e10000" }, { "description": "Inexact rounding#1", "string": "100000000000000000000000000000000000000000000000000000000001" }, { "description": "Inexact rounding#2", "string": "1E-6177" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/decimal128-5.json000066400000000000000000000554551456567454500262470ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "[decq035] fold-downs (more below) (Clamped)", "canonical_bson": "18000000136400000000807F1BCF85B27059C8A43CFE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.23E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.230000000000000000000000000000000E+6144\"}}" }, { "description": "[decq037] fold-downs (more below) (Clamped)", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq077] Nmin and below (Subnormal)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.100000000000000000000000000000000E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000000E-6144\"}}" }, { "description": "[decq078] Nmin and below (Subnormal)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000000E-6144\"}}" }, { "description": "[decq079] Nmin and below (Subnormal)", "canonical_bson": "180000001364000A00000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000000000000000000000000000010E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-6175\"}}" }, { "description": "[decq080] Nmin and below (Subnormal)", "canonical_bson": "180000001364000A00000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-6175\"}}" }, { "description": "[decq081] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000020000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000000000000000000000000000001E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6175\"}}" }, { "description": "[decq082] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000020000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6175\"}}" }, { "description": "[decq083] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000000000000000000000000000001E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "[decq084] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "[decq090] underflows cannot be tested for simple copies, check edge cases (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e-6176\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "[decq100] underflows cannot be tested for simple copies, check edge cases (Subnormal)", "canonical_bson": "18000000136400FFFFFFFF095BC138938D44C64D31000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"999999999999999999999999999999999e-6176\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.99999999999999999999999999999999E-6144\"}}" }, { "description": "[decq130] fold-downs (more below) (Clamped)", "canonical_bson": "18000000136400000000807F1BCF85B27059C8A43CFEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.23E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.230000000000000000000000000000000E+6144\"}}" }, { "description": "[decq132] fold-downs (more below) (Clamped)", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq177] Nmin and below (Subnormal)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.100000000000000000000000000000000E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00000000000000000000000000000000E-6144\"}}" }, { "description": "[decq178] Nmin and below (Subnormal)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00000000000000000000000000000000E-6144\"}}" }, { "description": "[decq179] Nmin and below (Subnormal)", "canonical_bson": "180000001364000A00000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000000000000000000000000000010E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.0E-6175\"}}" }, { "description": "[decq180] Nmin and below (Subnormal)", "canonical_bson": "180000001364000A00000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.0E-6175\"}}" }, { "description": "[decq181] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000028000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000000000000000000000000000001E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6175\"}}" }, { "description": "[decq182] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000028000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6175\"}}" }, { "description": "[decq183] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000000000000000000000000000001E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6176\"}}" }, { "description": "[decq184] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6176\"}}" }, { "description": "[decq190] underflow edge cases (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1e-6176\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6176\"}}" }, { "description": "[decq200] underflow edge cases (Subnormal)", "canonical_bson": "18000000136400FFFFFFFF095BC138938D44C64D31008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-999999999999999999999999999999999e-6176\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.99999999999999999999999999999999E-6144\"}}" }, { "description": "[decq400] zeros (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-8000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "[decq401] zeros (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6177\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "[decq414] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6112\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "[decq416] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "[decq418] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+8000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "[decq420] negative zeros (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-8000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" }, { "description": "[decq421] negative zeros (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6177\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" }, { "description": "[decq434] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6112\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "[decq436] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "[decq438] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+8000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "[decq601] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq603] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000000E+6143\"}}" }, { "description": "[decq605] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000000080264B91C02220BE377E00FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6142\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000000000E+6142\"}}" }, { "description": "[decq607] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000000040EAED7446D09C2C9F0C00FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6141\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000E+6141\"}}" }, { "description": "[decq609] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000A0CA17726DAE0F1E430100FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6140\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000E+6140\"}}" }, { "description": "[decq611] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000106102253E5ECE4F200000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6139\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000000E+6139\"}}" }, { "description": "[decq613] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000E83C80D09F3C2E3B030000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6138\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000E+6138\"}}" }, { "description": "[decq615] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000E4D20CC8DCD2B752000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6137\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000E+6137\"}}" }, { "description": "[decq617] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000004A48011416954508000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6136\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000E+6136\"}}" }, { "description": "[decq619] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000A1EDCCCE1BC2D300000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6135\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000E+6135\"}}" }, { "description": "[decq621] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000080F64AE1C7022D1500000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6134\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000E+6134\"}}" }, { "description": "[decq623] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000040B2BAC9E0191E0200000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6133\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000E+6133\"}}" }, { "description": "[decq625] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000A0DEC5ADC935360000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6132\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000E+6132\"}}" }, { "description": "[decq627] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000010632D5EC76B050000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6131\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000E+6131\"}}" }, { "description": "[decq629] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000E8890423C78A000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6130\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000E+6130\"}}" }, { "description": "[decq631] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000064A7B3B6E00D000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6129\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000E+6129\"}}" }, { "description": "[decq633] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000008A5D78456301000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6128\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000E+6128\"}}" }, { "description": "[decq635] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000C16FF2862300000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6127\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000E+6127\"}}" }, { "description": "[decq637] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000080C6A47E8D0300000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6126\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000E+6126\"}}" }, { "description": "[decq639] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000407A10F35A0000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6125\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000E+6125\"}}" }, { "description": "[decq641] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000A0724E18090000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6124\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000E+6124\"}}" }, { "description": "[decq643] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000010A5D4E8000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6123\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000E+6123\"}}" }, { "description": "[decq645] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000E8764817000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6122\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000E+6122\"}}" }, { "description": "[decq647] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000E40B5402000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6121\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000E+6121\"}}" }, { "description": "[decq649] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000CA9A3B00000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6120\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000E+6120\"}}" }, { "description": "[decq651] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000E1F50500000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6119\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000E+6119\"}}" }, { "description": "[decq653] fold-down full sequence (Clamped)", "canonical_bson": "180000001364008096980000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6118\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000E+6118\"}}" }, { "description": "[decq655] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640040420F0000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6117\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000E+6117\"}}" }, { "description": "[decq657] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400A086010000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6116\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000E+6116\"}}" }, { "description": "[decq659] fold-down full sequence (Clamped)", "canonical_bson": "180000001364001027000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6115\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000E+6115\"}}" }, { "description": "[decq661] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400E803000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6114\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000E+6114\"}}" }, { "description": "[decq663] fold-down full sequence (Clamped)", "canonical_bson": "180000001364006400000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6113\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+6113\"}}" }, { "description": "[decq665] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000A00000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6112\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+6112\"}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/decimal128-6.json000066400000000000000000000060111456567454500262300ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "parseErrors": [ { "description": "Incomplete Exponent", "string": "1e" }, { "description": "Exponent at the beginning", "string": "E01" }, { "description": "Just a decimal place", "string": "." }, { "description": "2 decimal places", "string": "..3" }, { "description": "2 decimal places", "string": ".13.3" }, { "description": "2 decimal places", "string": "1..3" }, { "description": "2 decimal places", "string": "1.3.4" }, { "description": "2 decimal places", "string": "1.34." }, { "description": "Decimal with no digits", "string": ".e" }, { "description": "2 signs", "string": "+-32.4" }, { "description": "2 signs", "string": "-+32.4" }, { "description": "2 negative signs", "string": "--32.4" }, { "description": "2 negative signs", "string": "-32.-4" }, { "description": "End in negative sign", "string": "32.0-" }, { "description": "2 negative signs", "string": "32.4E--21" }, { "description": "2 negative signs", "string": "32.4E-2-1" }, { "description": "2 signs", "string": "32.4E+-21" }, { "description": "Empty string", "string": "" }, { "description": "leading white space positive number", "string": " 1" }, { "description": "leading white space negative number", "string": " -1" }, { "description": "trailing white space", "string": "1 " }, { "description": "Invalid", "string": "E" }, { "description": "Invalid", "string": "invalid" }, { "description": "Invalid", "string": "i" }, { "description": "Invalid", "string": "in" }, { "description": "Invalid", "string": "-in" }, { "description": "Invalid", "string": "Na" }, { "description": "Invalid", "string": "-Na" }, { "description": "Invalid", "string": "1.23abc" }, { "description": "Invalid", "string": "1.23abcE+02" }, { "description": "Invalid", "string": "1.23E+0aabs2" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/decimal128-7.json000066400000000000000000000310171456567454500262350ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "parseErrors": [ { "description": "[basx572] Near-specials (Conversion_syntax)", "string": "-9Inf" }, { "description": "[basx516] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "-1-" }, { "description": "[basx533] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "0000.." }, { "description": "[basx534] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": ".0000." }, { "description": "[basx535] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "00..00" }, { "description": "[basx569] Near-specials (Conversion_syntax)", "string": "0Inf" }, { "description": "[basx571] Near-specials (Conversion_syntax)", "string": "-0Inf" }, { "description": "[basx575] Near-specials (Conversion_syntax)", "string": "0sNaN" }, { "description": "[basx503] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "++1" }, { "description": "[basx504] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "--1" }, { "description": "[basx505] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "-+1" }, { "description": "[basx506] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "+-1" }, { "description": "[basx510] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": " +1" }, { "description": "[basx513] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": " + 1" }, { "description": "[basx514] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": " - 1" }, { "description": "[basx501] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "." }, { "description": "[basx502] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": ".." }, { "description": "[basx519] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "" }, { "description": "[basx525] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "e100" }, { "description": "[basx549] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "e+1" }, { "description": "[basx577] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": ".e+1" }, { "description": "[basx578] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "+.e+1" }, { "description": "[basx581] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "E+1" }, { "description": "[basx582] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": ".E+1" }, { "description": "[basx583] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "+.E+1" }, { "description": "[basx579] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.e+" }, { "description": "[basx580] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.e" }, { "description": "[basx584] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.E+" }, { "description": "[basx585] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.E" }, { "description": "[basx589] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "+.Inf" }, { "description": "[basx586] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": ".NaN" }, { "description": "[basx587] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.NaN" }, { "description": "[basx545] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "ONE" }, { "description": "[basx561] Near-specials (Conversion_syntax)", "string": "qNaN" }, { "description": "[basx573] Near-specials (Conversion_syntax)", "string": "-sNa" }, { "description": "[basx588] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "+.sNaN" }, { "description": "[basx544] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "ten" }, { "description": "[basx527] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "u0b65" }, { "description": "[basx526] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "u0e5a" }, { "description": "[basx515] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "x" }, { "description": "[basx574] Near-specials (Conversion_syntax)", "string": "xNaN" }, { "description": "[basx530] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": ".123.5" }, { "description": "[basx500] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1..2" }, { "description": "[basx542] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e1.0" }, { "description": "[basx553] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E+1.2.3" }, { "description": "[basx543] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e123e" }, { "description": "[basx552] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E+1.2" }, { "description": "[basx546] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e.1" }, { "description": "[basx547] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e1." }, { "description": "[basx554] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E++1" }, { "description": "[basx555] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E--1" }, { "description": "[basx556] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E+-1" }, { "description": "[basx557] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E-+1" }, { "description": "[basx558] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E'1" }, { "description": "[basx559] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E\"1" }, { "description": "[basx520] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e-" }, { "description": "[basx560] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E" }, { "description": "[basx548] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1ee" }, { "description": "[basx551] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1.2.1" }, { "description": "[basx550] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1.23.4" }, { "description": "[basx529] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1.34.5" }, { "description": "[basx531] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "01.35." }, { "description": "[basx532] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "01.35-" }, { "description": "[basx518] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "3+" }, { "description": "[basx521] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "7e99999a" }, { "description": "[basx570] Near-specials (Conversion_syntax)", "string": "9Inf" }, { "description": "[basx512] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12 " }, { "description": "[basx517] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12-" }, { "description": "[basx507] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12e" }, { "description": "[basx508] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12e++" }, { "description": "[basx509] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12f4" }, { "description": "[basx536] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e*123" }, { "description": "[basx537] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e123-" }, { "description": "[basx540] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e1*23" }, { "description": "[basx538] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e+12+" }, { "description": "[basx539] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e1-3-" }, { "description": "[basx541] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111E1e+3" }, { "description": "[basx528] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "123,65" }, { "description": "[basx523] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "7e12356789012x" }, { "description": "[basx522] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "7e123567890x" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/decimal128-mongoc.json000066400000000000000000000007421456567454500273520ustar00rootroot00000000000000{ "description": "Decimal128 - libmongoc-specific tests", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "Scientific - Longest", "degenerate_bson": "1800000013640030303030303030303030303030FFFF8000", "canonical_bson": "18000000136400386B9ED104386B9ED104386B1E33008100", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.036812917280316154812861194857272E-6015\"}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/document.json000066400000000000000000000043741456567454500260640ustar00rootroot00000000000000{ "description": "Document type (sub-documents)", "bson_type": "0x03", "test_key": "x", "valid": [ { "description": "Empty subdoc", "canonical_bson": "0D000000037800050000000000", "canonical_extjson": "{\"x\" : {}}" }, { "description": "Empty-string key subdoc", "canonical_bson": "150000000378000D00000002000200000062000000", "canonical_extjson": "{\"x\" : {\"\" : \"b\"}}" }, { "description": "Single-character key subdoc", "canonical_bson": "160000000378000E0000000261000200000062000000", "canonical_extjson": "{\"x\" : {\"a\" : \"b\"}}" }, { "description": "Dollar-prefixed key in sub-document", "canonical_bson": "170000000378000F000000022461000200000062000000", "canonical_extjson": "{\"x\" : {\"$a\" : \"b\"}}" }, { "description": "Dollar as key in sub-document", "canonical_bson": "160000000378000E0000000224000200000061000000", "canonical_extjson": "{\"x\" : {\"$\" : \"a\"}}" }, { "description": "Dotted key in sub-document", "canonical_bson": "180000000378001000000002612E62000200000063000000", "canonical_extjson": "{\"x\" : {\"a.b\" : \"c\"}}" }, { "description": "Dot as key in sub-document", "canonical_bson": "160000000378000E000000022E000200000061000000", "canonical_extjson": "{\"x\" : {\".\" : \"a\"}}" } ], "decodeErrors": [ { "description": "Subdocument length too long: eats outer terminator", "bson": "1800000003666F6F000F0000001062617200FFFFFF7F0000" }, { "description": "Subdocument length too short: leaks terminator", "bson": "1500000003666F6F000A0000000862617200010000" }, { "description": "Invalid subdocument: bad string length in field", "bson": "1C00000003666F6F001200000002626172000500000062617A000000" }, { "description": "Null byte in sub-document key", "bson": "150000000378000D00000010610000010000000000" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/double.json000066400000000000000000000067071456567454500255220ustar00rootroot00000000000000{ "description": "Double type", "bson_type": "0x01", "test_key": "d", "valid": [ { "description": "+1.0", "canonical_bson": "10000000016400000000000000F03F00", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"1.0\"}}", "relaxed_extjson": "{\"d\" : 1.0}" }, { "description": "-1.0", "canonical_bson": "10000000016400000000000000F0BF00", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-1.0\"}}", "relaxed_extjson": "{\"d\" : -1.0}" }, { "description": "+1.0001220703125", "canonical_bson": "10000000016400000000008000F03F00", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"1.0001220703125\"}}", "relaxed_extjson": "{\"d\" : 1.0001220703125}" }, { "description": "-1.0001220703125", "canonical_bson": "10000000016400000000008000F0BF00", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-1.0001220703125\"}}", "relaxed_extjson": "{\"d\" : -1.0001220703125}" }, { "description": "1.2345678921232E+18", "canonical_bson": "100000000164002a1bf5f41022b14300", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"1.2345678921232E+18\"}}", "relaxed_extjson": "{\"d\" : 1.2345678921232E+18}" }, { "description": "-1.2345678921232E+18", "canonical_bson": "100000000164002a1bf5f41022b1c300", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-1.2345678921232E+18\"}}", "relaxed_extjson": "{\"d\" : -1.2345678921232E+18}" }, { "description": "0.0", "canonical_bson": "10000000016400000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"0.0\"}}", "relaxed_extjson": "{\"d\" : 0.0}" }, { "description": "-0.0", "canonical_bson": "10000000016400000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-0.0\"}}", "relaxed_extjson": "{\"d\" : -0.0}" }, { "description": "NaN", "canonical_bson": "10000000016400000000000000F87F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "lossy": true }, { "description": "NaN with payload", "canonical_bson": "10000000016400120000000000F87F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "lossy": true }, { "description": "Inf", "canonical_bson": "10000000016400000000000000F07F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"Infinity\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"Infinity\"}}" }, { "description": "-Inf", "canonical_bson": "10000000016400000000000000F0FF00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"-Infinity\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"-Infinity\"}}" } ], "decodeErrors": [ { "description": "double truncated", "bson": "0B0000000164000000F03F00" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/double2.json000066400000000000000000000031571456567454500256000ustar00rootroot00000000000000{ "description": "Double type", "bson_type": "0x01", "test_key": "d", "valid": [ { "description": "-0.0", "canonical_bson": "10000000016400000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-0.0\"}}", "relaxed_extjson": "{\"d\" : -0.0}" }, { "description": "NaN", "canonical_bson": "10000000016400000000000000F87F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "lossy": true }, { "description": "NaN with payload", "canonical_bson": "10000000016400120000000000F87F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "lossy": true }, { "description": "Inf", "canonical_bson": "10000000016400000000000000F07F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"Infinity\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"Infinity\"}}" }, { "description": "-Inf", "canonical_bson": "10000000016400000000000000F0FF00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"-Infinity\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"-Infinity\"}}" } ], "decodeErrors": [ { "description": "double truncated", "bson": "0B0000000164000000F03F00" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/int32.json000066400000000000000000000026271456567454500252040ustar00rootroot00000000000000{ "description": "Int32 type", "bson_type": "0x10", "test_key": "i", "valid": [ { "description": "MinValue", "canonical_bson": "0C0000001069000000008000", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"-2147483648\"}}", "relaxed_extjson": "{\"i\" : -2147483648}" }, { "description": "MaxValue", "canonical_bson": "0C000000106900FFFFFF7F00", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"2147483647\"}}", "relaxed_extjson": "{\"i\" : 2147483647}" }, { "description": "-1", "canonical_bson": "0C000000106900FFFFFFFF00", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"-1\"}}", "relaxed_extjson": "{\"i\" : -1}" }, { "description": "0", "canonical_bson": "0C0000001069000000000000", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"0\"}}", "relaxed_extjson": "{\"i\" : 0}" }, { "description": "1", "canonical_bson": "0C0000001069000100000000", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"1\"}}", "relaxed_extjson": "{\"i\" : 1}" } ], "decodeErrors": [ { "description": "Bad int32 field length", "bson": "090000001061000500" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/int64.json000066400000000000000000000027621456567454500252110ustar00rootroot00000000000000{ "description": "Int64 type", "bson_type": "0x12", "test_key": "a", "valid": [ { "description": "MinValue", "canonical_bson": "10000000126100000000000000008000", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"-9223372036854775808\"}}", "relaxed_extjson": "{\"a\" : -9223372036854775808}" }, { "description": "MaxValue", "canonical_bson": "10000000126100FFFFFFFFFFFFFF7F00", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"9223372036854775807\"}}", "relaxed_extjson": "{\"a\" : 9223372036854775807}" }, { "description": "-1", "canonical_bson": "10000000126100FFFFFFFFFFFFFFFF00", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"-1\"}}", "relaxed_extjson": "{\"a\" : -1}" }, { "description": "0", "canonical_bson": "10000000126100000000000000000000", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"0\"}}", "relaxed_extjson": "{\"a\" : 0}" }, { "description": "1", "canonical_bson": "10000000126100010000000000000000", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"1\"}}", "relaxed_extjson": "{\"a\" : 1}" } ], "decodeErrors": [ { "description": "int64 field truncated", "bson": "0C0000001261001234567800" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/maxkey.json000066400000000000000000000004231456567454500255330ustar00rootroot00000000000000{ "description": "Maxkey type", "bson_type": "0x7F", "test_key": "a", "valid": [ { "description": "Maxkey", "canonical_bson": "080000007F610000", "canonical_extjson": "{\"a\" : {\"$maxKey\" : 1}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/minkey.json000066400000000000000000000004231456567454500255310ustar00rootroot00000000000000{ "description": "Minkey type", "bson_type": "0xFF", "test_key": "a", "valid": [ { "description": "Minkey", "canonical_bson": "08000000FF610000", "canonical_extjson": "{\"a\" : {\"$minKey\" : 1}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/multi-type-deprecated.json000066400000000000000000000124541456567454500304530ustar00rootroot00000000000000{ "description": "Multiple types within the same document", "bson_type": "0x00", "deprecated": true, "valid": [ { "description": "All BSON types", "canonical_bson": "38020000075F69640057E193D7A9CC81B4027498B50E53796D626F6C000700000073796D626F6C0002537472696E670007000000737472696E670010496E743332002A00000012496E743634002A0000000000000001446F75626C6500000000000000F0BF0542696E617279001000000003A34C38F7C3ABEDC8A37814A992AB8DB60542696E61727955736572446566696E656400050000008001020304050D436F6465000E00000066756E6374696F6E2829207B7D000F436F64655769746853636F7065001B0000000E00000066756E6374696F6E2829207B7D00050000000003537562646F63756D656E74001200000002666F6F0004000000626172000004417272617900280000001030000100000010310002000000103200030000001033000400000010340005000000001154696D657374616D7000010000002A0000000B5265676578007061747465726E0000094461746574696D6545706F6368000000000000000000094461746574696D65506F73697469766500FFFFFF7F00000000094461746574696D654E656761746976650000000080FFFFFFFF085472756500010846616C736500000C4442506F696E746572000B000000636F6C6C656374696F6E0057E193D7A9CC81B4027498B1034442526566003D0000000224726566000B000000636F6C6C656374696F6E00072469640057FD71E96E32AB4225B723FB02246462000900000064617461626173650000FF4D696E6B6579007F4D61786B6579000A4E756C6C0006556E646566696E65640000", "converted_bson": "48020000075f69640057e193d7a9cc81b4027498b50253796d626f6c000700000073796d626f6c0002537472696e670007000000737472696e670010496e743332002a00000012496e743634002a0000000000000001446f75626c6500000000000000f0bf0542696e617279001000000003a34c38f7c3abedc8a37814a992ab8db60542696e61727955736572446566696e656400050000008001020304050d436f6465000e00000066756e6374696f6e2829207b7d000f436f64655769746853636f7065001b0000000e00000066756e6374696f6e2829207b7d00050000000003537562646f63756d656e74001200000002666f6f0004000000626172000004417272617900280000001030000100000010310002000000103200030000001033000400000010340005000000001154696d657374616d7000010000002a0000000b5265676578007061747465726e0000094461746574696d6545706f6368000000000000000000094461746574696d65506f73697469766500ffffff7f00000000094461746574696d654e656761746976650000000080ffffffff085472756500010846616c73650000034442506f696e746572002b0000000224726566000b000000636f6c6c656374696f6e00072469640057e193d7a9cc81b4027498b100034442526566003d0000000224726566000b000000636f6c6c656374696f6e00072469640057fd71e96e32ab4225b723fb02246462000900000064617461626173650000ff4d696e6b6579007f4d61786b6579000a4e756c6c000a556e646566696e65640000", "canonical_extjson": "{\"_id\": {\"$oid\": \"57e193d7a9cc81b4027498b5\"}, \"Symbol\": {\"$symbol\": \"symbol\"}, \"String\": \"string\", \"Int32\": {\"$numberInt\": \"42\"}, \"Int64\": {\"$numberLong\": \"42\"}, \"Double\": {\"$numberDouble\": \"-1.0\"}, \"Binary\": { \"$binary\" : {\"base64\": \"o0w498Or7cijeBSpkquNtg==\", \"subType\": \"03\"}}, \"BinaryUserDefined\": { \"$binary\" : {\"base64\": \"AQIDBAU=\", \"subType\": \"80\"}}, \"Code\": {\"$code\": \"function() {}\"}, \"CodeWithScope\": {\"$code\": \"function() {}\", \"$scope\": {}}, \"Subdocument\": {\"foo\": \"bar\"}, \"Array\": [{\"$numberInt\": \"1\"}, {\"$numberInt\": \"2\"}, {\"$numberInt\": \"3\"}, {\"$numberInt\": \"4\"}, {\"$numberInt\": \"5\"}], \"Timestamp\": {\"$timestamp\": {\"t\": 42, \"i\": 1}}, \"Regex\": {\"$regularExpression\": {\"pattern\": \"pattern\", \"options\": \"\"}}, \"DatetimeEpoch\": {\"$date\": {\"$numberLong\": \"0\"}}, \"DatetimePositive\": {\"$date\": {\"$numberLong\": \"2147483647\"}}, \"DatetimeNegative\": {\"$date\": {\"$numberLong\": \"-2147483648\"}}, \"True\": true, \"False\": false, \"DBPointer\": {\"$dbPointer\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57e193d7a9cc81b4027498b1\"}}}, \"DBRef\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57fd71e96e32ab4225b723fb\"}, \"$db\": \"database\"}, \"Minkey\": {\"$minKey\": 1}, \"Maxkey\": {\"$maxKey\": 1}, \"Null\": null, \"Undefined\": {\"$undefined\": true}}", "converted_extjson": "{\"_id\": {\"$oid\": \"57e193d7a9cc81b4027498b5\"}, \"Symbol\": \"symbol\", \"String\": \"string\", \"Int32\": {\"$numberInt\": \"42\"}, \"Int64\": {\"$numberLong\": \"42\"}, \"Double\": {\"$numberDouble\": \"-1.0\"}, \"Binary\": { \"$binary\" : {\"base64\": \"o0w498Or7cijeBSpkquNtg==\", \"subType\": \"03\"}}, \"BinaryUserDefined\": { \"$binary\" : {\"base64\": \"AQIDBAU=\", \"subType\": \"80\"}}, \"Code\": {\"$code\": \"function() {}\"}, \"CodeWithScope\": {\"$code\": \"function() {}\", \"$scope\": {}}, \"Subdocument\": {\"foo\": \"bar\"}, \"Array\": [{\"$numberInt\": \"1\"}, {\"$numberInt\": \"2\"}, {\"$numberInt\": \"3\"}, {\"$numberInt\": \"4\"}, {\"$numberInt\": \"5\"}], \"Timestamp\": {\"$timestamp\": {\"t\": 42, \"i\": 1}}, \"Regex\": {\"$regularExpression\": {\"pattern\": \"pattern\", \"options\": \"\"}}, \"DatetimeEpoch\": {\"$date\": {\"$numberLong\": \"0\"}}, \"DatetimePositive\": {\"$date\": {\"$numberLong\": \"2147483647\"}}, \"DatetimeNegative\": {\"$date\": {\"$numberLong\": \"-2147483648\"}}, \"True\": true, \"False\": false, \"DBPointer\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57e193d7a9cc81b4027498b1\"}}, \"DBRef\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57fd71e96e32ab4225b723fb\"}, \"$db\": \"database\"}, \"Minkey\": {\"$minKey\": 1}, \"Maxkey\": {\"$maxKey\": 1}, \"Null\": null, \"Undefined\": null}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/multi-type.json000066400000000000000000000046451456567454500263600ustar00rootroot00000000000000{ "description": "Multiple types within the same document", "bson_type": "0x00", "valid": [ { "description": "All BSON types", "canonical_bson": "F4010000075F69640057E193D7A9CC81B4027498B502537472696E670007000000737472696E670010496E743332002A00000012496E743634002A0000000000000001446F75626C6500000000000000F0BF0542696E617279001000000003A34C38F7C3ABEDC8A37814A992AB8DB60542696E61727955736572446566696E656400050000008001020304050D436F6465000E00000066756E6374696F6E2829207B7D000F436F64655769746853636F7065001B0000000E00000066756E6374696F6E2829207B7D00050000000003537562646F63756D656E74001200000002666F6F0004000000626172000004417272617900280000001030000100000010310002000000103200030000001033000400000010340005000000001154696D657374616D7000010000002A0000000B5265676578007061747465726E0000094461746574696D6545706F6368000000000000000000094461746574696D65506F73697469766500FFFFFF7F00000000094461746574696D654E656761746976650000000080FFFFFFFF085472756500010846616C73650000034442526566003D0000000224726566000B000000636F6C6C656374696F6E00072469640057FD71E96E32AB4225B723FB02246462000900000064617461626173650000FF4D696E6B6579007F4D61786B6579000A4E756C6C0000", "canonical_extjson": "{\"_id\": {\"$oid\": \"57e193d7a9cc81b4027498b5\"}, \"String\": \"string\", \"Int32\": {\"$numberInt\": \"42\"}, \"Int64\": {\"$numberLong\": \"42\"}, \"Double\": {\"$numberDouble\": \"-1.0\"}, \"Binary\": { \"$binary\" : {\"base64\": \"o0w498Or7cijeBSpkquNtg==\", \"subType\": \"03\"}}, \"BinaryUserDefined\": { \"$binary\" : {\"base64\": \"AQIDBAU=\", \"subType\": \"80\"}}, \"Code\": {\"$code\": \"function() {}\"}, \"CodeWithScope\": {\"$code\": \"function() {}\", \"$scope\": {}}, \"Subdocument\": {\"foo\": \"bar\"}, \"Array\": [{\"$numberInt\": \"1\"}, {\"$numberInt\": \"2\"}, {\"$numberInt\": \"3\"}, {\"$numberInt\": \"4\"}, {\"$numberInt\": \"5\"}], \"Timestamp\": {\"$timestamp\": {\"t\": 42, \"i\": 1}}, \"Regex\": {\"$regularExpression\": {\"pattern\": \"pattern\", \"options\": \"\"}}, \"DatetimeEpoch\": {\"$date\": {\"$numberLong\": \"0\"}}, \"DatetimePositive\": {\"$date\": {\"$numberLong\": \"2147483647\"}}, \"DatetimeNegative\": {\"$date\": {\"$numberLong\": \"-2147483648\"}}, \"True\": true, \"False\": false, \"DBRef\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57fd71e96e32ab4225b723fb\"}, \"$db\": \"database\"}, \"Minkey\": {\"$minKey\": 1}, \"Maxkey\": {\"$maxKey\": 1}, \"Null\": null}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/null.json000066400000000000000000000004021456567454500252040ustar00rootroot00000000000000{ "description": "Null type", "bson_type": "0x0A", "test_key": "a", "valid": [ { "description": "Null", "canonical_bson": "080000000A610000", "canonical_extjson": "{\"a\" : null}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/oid.json000066400000000000000000000016221456567454500250120ustar00rootroot00000000000000{ "description": "ObjectId", "bson_type": "0x07", "test_key": "a", "valid": [ { "description": "All zeroes", "canonical_bson": "1400000007610000000000000000000000000000", "canonical_extjson": "{\"a\" : {\"$oid\" : \"000000000000000000000000\"}}" }, { "description": "All ones", "canonical_bson": "14000000076100FFFFFFFFFFFFFFFFFFFFFFFF00", "canonical_extjson": "{\"a\" : {\"$oid\" : \"ffffffffffffffffffffffff\"}}" }, { "description": "Random", "canonical_bson": "1400000007610056E1FC72E0C917E9C471416100", "canonical_extjson": "{\"a\" : {\"$oid\" : \"56e1fc72e0c917e9c4714161\"}}" } ], "decodeErrors": [ { "description": "OID truncated", "bson": "1200000007610056E1FC72E0C917E9C471" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/regex.json000066400000000000000000000062011456567454500253470ustar00rootroot00000000000000{ "description": "Regular Expression type", "bson_type": "0x0B", "test_key": "a", "valid": [ { "description": "empty regex with no options", "canonical_bson": "0A0000000B6100000000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"\", \"options\" : \"\"}}}" }, { "description": "regex without options", "canonical_bson": "0D0000000B6100616263000000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"\"}}}" }, { "description": "regex with options", "canonical_bson": "0F0000000B610061626300696D0000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"im\"}}}" }, { "description": "regex with options (keys reversed)", "canonical_bson": "0F0000000B610061626300696D0000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"im\"}}}", "degenerate_extjson": "{\"a\" : {\"$regularExpression\" : {\"options\" : \"im\", \"pattern\": \"abc\"}}}" }, { "description": "regex with slash", "canonical_bson": "110000000B610061622F636400696D0000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"ab/cd\", \"options\" : \"im\"}}}" }, { "description": "flags not alphabetized", "degenerate_bson": "100000000B6100616263006D69780000", "canonical_bson": "100000000B610061626300696D780000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"imx\"}}}", "degenerate_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"mix\"}}}" }, { "description" : "Required escapes", "canonical_bson" : "100000000B610061625C226162000000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"ab\\\\\\\"ab\", \"options\" : \"\"}}}" }, { "description" : "Regular expression as value of $regex query operator", "canonical_bson" : "180000000B247265676578007061747465726E0069780000", "canonical_extjson": "{\"$regex\" : {\"$regularExpression\" : { \"pattern\": \"pattern\", \"options\" : \"ix\"}}}" }, { "description" : "Regular expression as value of $regex query operator with $options", "canonical_bson" : "270000000B247265676578007061747465726E000002246F7074696F6E73000300000069780000", "canonical_extjson": "{\"$regex\" : {\"$regularExpression\" : { \"pattern\": \"pattern\", \"options\" : \"\"}}, \"$options\" : \"ix\"}" } ], "decodeErrors": [ { "description": "Null byte in pattern string", "bson": "0F0000000B610061006300696D0000" }, { "description": "Null byte in flags string", "bson": "100000000B61006162630069006D0000" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/string.json000066400000000000000000000053741456567454500255550ustar00rootroot00000000000000{ "description": "String", "bson_type": "0x02", "test_key": "a", "valid": [ { "description": "Empty string", "canonical_bson": "0D000000026100010000000000", "canonical_extjson": "{\"a\" : \"\"}" }, { "description": "Single character", "canonical_bson": "0E00000002610002000000620000", "canonical_extjson": "{\"a\" : \"b\"}" }, { "description": "Multi-character", "canonical_bson": "190000000261000D0000006162616261626162616261620000", "canonical_extjson": "{\"a\" : \"abababababab\"}" }, { "description": "two-byte UTF-8 (\u00e9)", "canonical_bson": "190000000261000D000000C3A9C3A9C3A9C3A9C3A9C3A90000", "canonical_extjson": "{\"a\" : \"\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\"}" }, { "description": "three-byte UTF-8 (\u2606)", "canonical_bson": "190000000261000D000000E29886E29886E29886E298860000", "canonical_extjson": "{\"a\" : \"\\u2606\\u2606\\u2606\\u2606\"}" }, { "description": "Embedded nulls", "canonical_bson": "190000000261000D0000006162006261620062616261620000", "canonical_extjson": "{\"a\" : \"ab\\u0000bab\\u0000babab\"}" }, { "description": "Required escapes", "canonical_bson" : "320000000261002600000061625C220102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F61620000", "canonical_extjson" : "{\"a\":\"ab\\\\\\\"\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001fab\"}" } ], "decodeErrors": [ { "description": "bad string length: 0 (but no 0x00 either)", "bson": "0C0000000261000000000000" }, { "description": "bad string length: -1", "bson": "0C000000026100FFFFFFFF00" }, { "description": "bad string length: eats terminator", "bson": "10000000026100050000006200620000" }, { "description": "bad string length: longer than rest of document", "bson": "120000000200FFFFFF00666F6F6261720000" }, { "description": "string is not null-terminated", "bson": "1000000002610004000000616263FF00" }, { "description": "empty string, but extra null", "bson": "0E00000002610001000000000000" }, { "description": "invalid UTF-8", "bson": "0E00000002610002000000E90000" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/symbol.json000066400000000000000000000062401456567454500255450ustar00rootroot00000000000000{ "description": "Symbol", "bson_type": "0x0E", "deprecated": true, "test_key": "a", "valid": [ { "description": "Empty string", "canonical_bson": "0D0000000E6100010000000000", "canonical_extjson": "{\"a\": {\"$symbol\": \"\"}}", "converted_bson": "0D000000026100010000000000", "converted_extjson": "{\"a\": \"\"}" }, { "description": "Single character", "canonical_bson": "0E0000000E610002000000620000", "canonical_extjson": "{\"a\": {\"$symbol\": \"b\"}}", "converted_bson": "0E00000002610002000000620000", "converted_extjson": "{\"a\": \"b\"}" }, { "description": "Multi-character", "canonical_bson": "190000000E61000D0000006162616261626162616261620000", "canonical_extjson": "{\"a\": {\"$symbol\": \"abababababab\"}}", "converted_bson": "190000000261000D0000006162616261626162616261620000", "converted_extjson": "{\"a\": \"abababababab\"}" }, { "description": "two-byte UTF-8 (\u00e9)", "canonical_bson": "190000000E61000D000000C3A9C3A9C3A9C3A9C3A9C3A90000", "canonical_extjson": "{\"a\": {\"$symbol\": \"éééééé\"}}", "converted_bson": "190000000261000D000000C3A9C3A9C3A9C3A9C3A9C3A90000", "converted_extjson": "{\"a\": \"éééééé\"}" }, { "description": "three-byte UTF-8 (\u2606)", "canonical_bson": "190000000E61000D000000E29886E29886E29886E298860000", "canonical_extjson": "{\"a\": {\"$symbol\": \"☆☆☆☆\"}}", "converted_bson": "190000000261000D000000E29886E29886E29886E298860000", "converted_extjson": "{\"a\": \"☆☆☆☆\"}" }, { "description": "Embedded nulls", "canonical_bson": "190000000E61000D0000006162006261620062616261620000", "canonical_extjson": "{\"a\": {\"$symbol\": \"ab\\u0000bab\\u0000babab\"}}", "converted_bson": "190000000261000D0000006162006261620062616261620000", "converted_extjson": "{\"a\": \"ab\\u0000bab\\u0000babab\"}" } ], "decodeErrors": [ { "description": "bad symbol length: 0 (but no 0x00 either)", "bson": "0C0000000E61000000000000" }, { "description": "bad symbol length: -1", "bson": "0C0000000E6100FFFFFFFF00" }, { "description": "bad symbol length: eats terminator", "bson": "100000000E6100050000006200620000" }, { "description": "bad symbol length: longer than rest of document", "bson": "120000000E00FFFFFF00666F6F6261720000" }, { "description": "symbol is not null-terminated", "bson": "100000000E610004000000616263FF00" }, { "description": "empty symbol, but extra null", "bson": "0E0000000E610001000000000000" }, { "description": "invalid UTF-8", "bson": "0E0000000E610002000000E90000" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/timestamp.json000066400000000000000000000026651456567454500262520ustar00rootroot00000000000000{ "description": "Timestamp type", "bson_type": "0x11", "test_key": "a", "valid": [ { "description": "Timestamp: (123456789, 42)", "canonical_bson": "100000001161002A00000015CD5B0700", "canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 123456789, \"i\" : 42} } }" }, { "description": "Timestamp: (123456789, 42) (keys reversed)", "canonical_bson": "100000001161002A00000015CD5B0700", "canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 123456789, \"i\" : 42} } }", "degenerate_extjson": "{\"a\" : {\"$timestamp\" : {\"i\" : 42, \"t\" : 123456789} } }" }, { "description": "Timestamp with high-order bit set on both seconds and increment", "canonical_bson": "10000000116100FFFFFFFFFFFFFFFF00", "canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 4294967295, \"i\" : 4294967295} } }" }, { "description": "Timestamp with high-order bit set on both seconds and increment (not UINT32_MAX)", "canonical_bson": "1000000011610000286BEE00286BEE00", "canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 4000000000, \"i\" : 4000000000} } }" } ], "decodeErrors": [ { "description": "Truncated timestamp field", "bson": "0f0000001161002A00000015CD5B00" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/top-mongoc.json000066400000000000000000000010461456567454500263210ustar00rootroot00000000000000{ "description": "Top-level document validity - libmongoc-specific tests. TODO (CDRIVER-4016) move this file.", "bson_type": "0x00", "valid": [], "decodeErrors": [], "parseErrors": [ { "description": "Null byte in legacy $regex string", "string": "{\"a\" : {\"$regex\" : \"b\\u0000\", \"$options\" : \"i\"}}" }, { "description": "Null byte in legacy $options string", "string": "{\"a\" : {\"$regex\" : \"b\", \"$options\" : \"i\\u0000\"}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/top.json000066400000000000000000000246421456567454500250500ustar00rootroot00000000000000{ "description": "Top-level document validity", "bson_type": "0x00", "valid": [ { "description": "Dollar-prefixed key in top-level document", "canonical_bson": "0F00000010246B6579002A00000000", "canonical_extjson": "{\"$key\": {\"$numberInt\": \"42\"}}" }, { "description": "Dollar as key in top-level document", "canonical_bson": "0E00000002240002000000610000", "canonical_extjson": "{\"$\": \"a\"}" }, { "description": "Dotted key in top-level document", "canonical_bson": "1000000002612E620002000000630000", "canonical_extjson": "{\"a.b\": \"c\"}" }, { "description": "Dot as key in top-level document", "canonical_bson": "0E000000022E0002000000610000", "canonical_extjson": "{\".\": \"a\"}" } ], "decodeErrors": [ { "description": "An object size that's too small to even include the object size, but is a well-formed, empty object", "bson": "0100000000" }, { "description": "An object size that's only enough for the object size, but is a well-formed, empty object", "bson": "0400000000" }, { "description": "One object, with length shorter than size (missing EOO)", "bson": "05000000" }, { "description": "One object, sized correctly, with a spot for an EOO, but the EOO is 0x01", "bson": "0500000001" }, { "description": "One object, sized correctly, with a spot for an EOO, but the EOO is 0xff", "bson": "05000000FF" }, { "description": "One object, sized correctly, with a spot for an EOO, but the EOO is 0x70", "bson": "0500000070" }, { "description": "Byte count is zero (with non-zero input length)", "bson": "00000000000000000000" }, { "description": "Stated length exceeds byte count, with truncated document", "bson": "1200000002666F6F0004000000626172" }, { "description": "Stated length less than byte count, with garbage after envelope", "bson": "1200000002666F6F00040000006261720000DEADBEEF" }, { "description": "Stated length exceeds byte count, with valid envelope", "bson": "1300000002666F6F00040000006261720000" }, { "description": "Stated length less than byte count, with valid envelope", "bson": "1100000002666F6F00040000006261720000" }, { "description": "Invalid BSON type low range", "bson": "07000000000000" }, { "description": "Invalid BSON type high range", "bson": "07000000800000" }, { "description": "Document truncated mid-key", "bson": "1200000002666F" }, { "description": "Null byte in document key", "bson": "0D000000107800000100000000" } ], "parseErrors": [ { "description" : "Bad $regularExpression (extra field)", "string" : "{\"a\" : {\"$regularExpression\": {\"pattern\": \"abc\", \"options\": \"\", \"unrelated\": true}}}" }, { "description" : "Bad $regularExpression (missing options field)", "string" : "{\"a\" : {\"$regularExpression\": {\"pattern\": \"abc\"}}}" }, { "description": "Bad $regularExpression (pattern is number, not string)", "string": "{\"x\" : {\"$regularExpression\" : { \"pattern\": 42, \"$options\" : \"\"}}}" }, { "description": "Bad $regularExpression (options are number, not string)", "string": "{\"x\" : {\"$regularExpression\" : { \"pattern\": \"a\", \"$options\" : 0}}}" }, { "description" : "Bad $regularExpression (missing pattern field)", "string" : "{\"a\" : {\"$regularExpression\": {\"options\":\"ix\"}}}" }, { "description": "Bad $oid (number, not string)", "string": "{\"a\" : {\"$oid\" : 42}}" }, { "description": "Bad $oid (extra field)", "string": "{\"a\" : {\"$oid\" : \"56e1fc72e0c917e9c4714161\", \"unrelated\": true}}" }, { "description": "Bad $numberInt (number, not string)", "string": "{\"a\" : {\"$numberInt\" : 42}}" }, { "description": "Bad $numberInt (extra field)", "string": "{\"a\" : {\"$numberInt\" : \"42\", \"unrelated\": true}}" }, { "description": "Bad $numberLong (number, not string)", "string": "{\"a\" : {\"$numberLong\" : 42}}" }, { "description": "Bad $numberLong (extra field)", "string": "{\"a\" : {\"$numberLong\" : \"42\", \"unrelated\": true}}" }, { "description": "Bad $numberDouble (number, not string)", "string": "{\"a\" : {\"$numberDouble\" : 42}}" }, { "description": "Bad $numberDouble (extra field)", "string": "{\"a\" : {\"$numberDouble\" : \".1\", \"unrelated\": true}}" }, { "description": "Bad $numberDecimal (number, not string)", "string": "{\"a\" : {\"$numberDecimal\" : 42}}" }, { "description": "Bad $numberDecimal (extra field)", "string": "{\"a\" : {\"$numberDecimal\" : \".1\", \"unrelated\": true}}" }, { "description": "Bad $binary (binary is number, not string)", "string": "{\"x\" : {\"$binary\" : {\"base64\" : 0, \"subType\" : \"00\"}}}" }, { "description": "Bad $binary (type is number, not string)", "string": "{\"x\" : {\"$binary\" : {\"base64\" : \"\", \"subType\" : 0}}}" }, { "description": "Bad $binary (missing $type)", "string": "{\"x\" : {\"$binary\" : {\"base64\" : \"//8=\"}}}" }, { "description": "Bad $binary (missing $binary)", "string": "{\"x\" : {\"$binary\" : {\"subType\" : \"00\"}}}" }, { "description": "Bad $binary (extra field)", "string": "{\"x\" : {\"$binary\" : {\"base64\" : \"//8=\", \"subType\" : 0, \"unrelated\": true}}}" }, { "description": "Bad $code (type is number, not string)", "string": "{\"a\" : {\"$code\" : 42}}" }, { "description": "Bad $code (type is number, not string) when $scope is also present", "string": "{\"a\" : {\"$code\" : 42, \"$scope\" : {}}}" }, { "description": "Bad $code (extra field)", "string": "{\"a\" : {\"$code\" : \"\", \"unrelated\": true}}" }, { "description": "Bad $code with $scope (scope is number, not doc)", "string": "{\"x\" : {\"$code\" : \"\", \"$scope\" : 42}}" }, { "description": "Bad $timestamp (type is number, not doc)", "string": "{\"a\" : {\"$timestamp\" : 42} }" }, { "description": "Bad $timestamp ('t' type is string, not number)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : \"123456789\", \"i\" : 42} } }" }, { "description": "Bad $timestamp ('i' type is string, not number)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : 123456789, \"i\" : \"42\"} } }" }, { "description": "Bad $timestamp (extra field at same level as $timestamp)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : \"123456789\", \"i\" : \"42\"}, \"unrelated\": true } }" }, { "description": "Bad $timestamp (extra field at same level as t and i)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : \"123456789\", \"i\" : \"42\", \"unrelated\": true} } }" }, { "description": "Bad $timestamp (missing t)", "string": "{\"a\" : {\"$timestamp\" : {\"i\" : \"42\"} } }" }, { "description": "Bad $timestamp (missing i)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : \"123456789\"} } }" }, { "description": "Bad $date (number, not string or hash)", "string": "{\"a\" : {\"$date\" : 42}}" }, { "description": "Bad $date (extra field)", "string": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"1356351330501\"}, \"unrelated\": true}}" }, { "description": "Bad $minKey (boolean, not integer)", "string": "{\"a\" : {\"$minKey\" : true}}" }, { "description": "Bad $minKey (wrong integer)", "string": "{\"a\" : {\"$minKey\" : 0}}" }, { "description": "Bad $minKey (extra field)", "string": "{\"a\" : {\"$minKey\" : 1, \"unrelated\": true}}" }, { "description": "Bad $maxKey (boolean, not integer)", "string": "{\"a\" : {\"$maxKey\" : true}}" }, { "description": "Bad $maxKey (wrong integer)", "string": "{\"a\" : {\"$maxKey\" : 0}}" }, { "description": "Bad $maxKey (extra field)", "string": "{\"a\" : {\"$maxKey\" : 1, \"unrelated\": true}}" }, { "description": "Bad DBpointer (extra field)", "string": "{\"a\": {\"$dbPointer\": {\"a\": {\"$numberInt\": \"1\"}, \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}, \"c\": {\"$numberInt\": \"2\"}, \"$ref\": \"b\"}}}" }, { "description" : "Null byte in document key", "string" : "{\"a\\u0000\": 1 }" }, { "description" : "Null byte in sub-document key", "string" : "{\"a\" : {\"b\\u0000\": 1 }}" }, { "description": "Null byte in $regularExpression pattern", "string": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"b\\u0000\", \"options\" : \"i\"}}}" }, { "description": "Null byte in $regularExpression options", "string": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"b\", \"options\" : \"i\\u0000\"}}}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/bson_corpus/undefined.json000066400000000000000000000006511456567454500262010ustar00rootroot00000000000000{ "description": "Undefined type (deprecated)", "bson_type": "0x06", "deprecated": true, "test_key": "a", "valid": [ { "description": "Undefined", "canonical_bson": "0800000006610000", "canonical_extjson": "{\"a\" : {\"$undefined\" : true}}", "converted_bson": "080000000A610000", "converted_extjson": "{\"a\" : null}" } ] } mongo-c-driver-1.26.0/src/libbson/tests/json/test.json000066400000000000000000000001051456567454500226550ustar00rootroot00000000000000{"foo": "bar", "a": 1} {"_id": {"$oid": "aabbccddeeff001122334455"}} mongo-c-driver-1.26.0/src/libbson/tests/test-atomic.c000066400000000000000000000136651456567454500224460ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "TestSuite.h" #define ATOMIC(Kind, Operation) BSON_CONCAT4 (bson_atomic_, Kind, _, Operation) #define TEST_KIND_WITH_MEMORDER(Kind, TypeName, MemOrder, Assert) \ do { \ int i; \ TypeName got; \ TypeName value = 0; \ got = ATOMIC (Kind, fetch) (&value, MemOrder); \ Assert (got, ==, 0); \ got = ATOMIC (Kind, fetch_add) (&value, 42, MemOrder); \ Assert (got, ==, 0); \ Assert (value, ==, 42); \ got = ATOMIC (Kind, fetch_sub) (&value, 7, MemOrder); \ Assert (got, ==, 42); \ Assert (value, ==, 35); \ got = ATOMIC (Kind, exchange) (&value, 77, MemOrder); \ Assert (got, ==, 35); \ Assert (value, ==, 77); \ /* Compare-exchange fail: */ \ got = ATOMIC (Kind, compare_exchange_strong) (&value, 4, 9, MemOrder); \ Assert (got, ==, 77); \ Assert (value, ==, 77); \ /* Compare-exchange succeed: */ \ got = ATOMIC (Kind, compare_exchange_strong) (&value, 77, 9, MemOrder); \ Assert (got, ==, 77); \ Assert (value, ==, 9); \ /* Compare-exchange fail: */ \ got = ATOMIC (Kind, compare_exchange_weak) (&value, 8, 12, MemOrder); \ Assert (got, ==, 9); \ Assert (value, ==, 9); \ /* Compare-exchange-weak succeed: */ \ /* 'weak' may fail spuriously, so it must *eventually* succeed */ \ for (i = 0; i < 10000 && value != 53; ++i) { \ got = ATOMIC (Kind, compare_exchange_weak) (&value, 9, 53, MemOrder); \ Assert (got, ==, 9); \ } \ /* Check that it evenutally succeeded */ \ Assert (value, ==, 53); \ } while (0) #define TEST_INTEGER_KIND(Kind, TypeName, Assert) \ do { \ TEST_KIND_WITH_MEMORDER ( \ Kind, TypeName, bson_memory_order_relaxed, Assert); \ TEST_KIND_WITH_MEMORDER ( \ Kind, TypeName, bson_memory_order_acq_rel, Assert); \ TEST_KIND_WITH_MEMORDER ( \ Kind, TypeName, bson_memory_order_acquire, Assert); \ TEST_KIND_WITH_MEMORDER ( \ Kind, TypeName, bson_memory_order_release, Assert); \ TEST_KIND_WITH_MEMORDER ( \ Kind, TypeName, bson_memory_order_consume, Assert); \ TEST_KIND_WITH_MEMORDER ( \ Kind, TypeName, bson_memory_order_seq_cst, Assert); \ } while (0) static void test_integers (void) { TEST_INTEGER_KIND (int64, int64_t, ASSERT_CMPINT64); TEST_INTEGER_KIND (int32, int32_t, ASSERT_CMPINT32); TEST_INTEGER_KIND (int16, int16_t, ASSERT_CMPINT); TEST_INTEGER_KIND (int8, int8_t, ASSERT_CMPINT); TEST_INTEGER_KIND (int, int, ASSERT_CMPINT); } static void test_pointers (void) { int u = 12; int v = 9; int w = 91; int *ptr = &v; int *other; int *prev; other = bson_atomic_ptr_fetch ((void *) &ptr, bson_memory_order_relaxed); ASSERT_CMPVOID (other, ==, ptr); prev = bson_atomic_ptr_exchange ((void *) &other, &u, bson_memory_order_relaxed); ASSERT_CMPVOID (prev, ==, &v); ASSERT_CMPVOID (other, ==, &u); prev = bson_atomic_ptr_compare_exchange_strong ( (void *) &other, &v, &w, bson_memory_order_relaxed); ASSERT_CMPVOID (prev, ==, &u); ASSERT_CMPVOID (other, ==, &u); prev = bson_atomic_ptr_compare_exchange_strong ( (void *) &other, &u, &w, bson_memory_order_relaxed); ASSERT_CMPVOID (prev, ==, &u); ASSERT_CMPVOID (other, ==, &w); } static void test_thread_fence (void) { bson_atomic_thread_fence (); } static void test_thrd_yield (void) { bson_thrd_yield (); } void test_atomic_install (TestSuite *suite) { TestSuite_Add (suite, "/atomic/integers", test_integers); TestSuite_Add (suite, "/atomic/pointers", test_pointers); TestSuite_Add (suite, "/atomic/thread_fence", test_thread_fence); TestSuite_Add (suite, "/atomic/thread_yield", test_thrd_yield); } mongo-c-driver-1.26.0/src/libbson/tests/test-b64.c000066400000000000000000000107311456567454500215540ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "TestSuite.h" #include "common-b64-private.h" static void _test_encode_helper (char *input, size_t input_len, char *expected_output, int expected_output_len) { char *output; size_t target_size; int ret; target_size = mcommon_b64_ntop_calculate_target_size (input_len); output = bson_malloc (target_size); /* bson_ntop_calculate_target_size includes trailing NULL. */ ASSERT_CMPSIZE_T (target_size, ==, (size_t) expected_output_len + 1); /* returned value does not count trailing NULL. */ ret = mcommon_b64_ntop ((uint8_t *) input, input_len, output, target_size); ASSERT (bson_cmp_equal_us (target_size - 1u, ret)); ASSERT_CMPSTR (output, expected_output); bson_free (output); } static void test_bson_b64_encode (void) { char output[32]; int ret; _test_encode_helper ("", 0, "", 0); _test_encode_helper ("f", 1, "Zg==", 4); _test_encode_helper ("fo", 2, "Zm8=", 4); _test_encode_helper ("foo", 3, "Zm9v", 4); _test_encode_helper ("foob", 4, "Zm9vYg==", 8); _test_encode_helper ("fooba", 5, "Zm9vYmE=", 8); _test_encode_helper ("foobar", 6, "Zm9vYmFy", 8); /* Even on empty input, the output is still NULL terminated. */ output[0] = 'a'; ret = mcommon_b64_ntop ((uint8_t *) "", 0, output, 1); ASSERT_CMPINT (ret, ==, 0); BSON_ASSERT (output[0] == '\0'); /* Test NULL input. */ ret = mcommon_b64_ntop (NULL, 0, output, 32); ASSERT_CMPINT (0, ==, ret); BSON_ASSERT (output[0] == '\0'); /* Test NULL output */ ret = mcommon_b64_ntop (NULL, 0, NULL, 0); ASSERT_CMPINT (-1, ==, ret); /* Test output not large enough. */ ret = mcommon_b64_ntop ((uint8_t *) "test", 4, output, 1); ASSERT_CMPINT (-1, ==, ret); } static void _test_decode_helper (char *input, char *expected_output, int expected_calculated_target_size, int expected_output_len) { uint8_t *output; size_t target_size; int exact_target_size; int ret; target_size = mcommon_b64_pton_calculate_target_size (strlen (input)); output = bson_malloc (target_size); /* bson_malloc returns NULL if requesting 0 bytes, memcmp expects non-NULL. */ if (target_size == 0) { output = bson_malloc (1); } /* Calling mcommon_b64_pton with a NULL output is valid, and * returns the exact target size. */ exact_target_size = mcommon_b64_pton (input, NULL, 0); ASSERT_CMPINT (exact_target_size, ==, expected_output_len); ASSERT_CMPSIZE_T (target_size, ==, (size_t) expected_calculated_target_size); ret = mcommon_b64_pton (input, output, target_size); ASSERT_CMPINT (expected_output_len, ==, ret); BSON_ASSERT (0 == memcmp (output, expected_output, ret)); bson_free (output); } static void test_bson_b64_decode (void) { uint8_t output[32]; int ret; _test_decode_helper ("", "", 0, 0); _test_decode_helper ("Zg==", "f", 3, 1); _test_decode_helper ("Zm8=", "fo", 3, 2); _test_decode_helper ("Zm9v", "foo", 3, 3); _test_decode_helper ("Zm9vYg==", "foob", 6, 4); _test_decode_helper ("Zm9vYmE=", "fooba", 6, 5); _test_decode_helper ("Zm9vYmFy", "foobar", 6, 6); /* Test NULL input. */ ret = mcommon_b64_pton (NULL, output, 32); ASSERT_CMPINT (ret, ==, -1); /* Test NULL output. */ ret = mcommon_b64_pton ("Zm8=", NULL, 0); /* The return value is actually the number of bytes for output. */ ASSERT_CMPINT (ret, ==, 2); /* Test output not large enough. */ ret = mcommon_b64_pton ("Zm9vYmFy", output, 1); ASSERT_CMPINT (ret, ==, -1); /* Test malformed base64 */ ret = mcommon_b64_pton ("bad!", output, 32); ASSERT_CMPINT (ret, ==, -1); } void test_b64_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/b64/encode", test_bson_b64_encode); TestSuite_Add (suite, "/bson/b64/decode", test_bson_b64_decode); } mongo-c-driver-1.26.0/src/libbson/tests/test-bcon-basic.c000066400000000000000000000325101456567454500231600ustar00rootroot00000000000000#include "TestSuite.h" #include static void test_utf8 (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_utf8 (&expected, "hello", -1, "world", -1); BCON_APPEND (&bcon, "hello", "world"); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_double (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_double (&expected, "foo", -1, 1.1); BCON_APPEND (&bcon, "foo", BCON_DOUBLE (1.1)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_decimal128 (void) { bson_t bcon, expected; bson_decimal128_t dec; bson_decimal128_from_string ("120E20", &dec); bson_init (&bcon); bson_init (&expected); bson_append_decimal128 (&expected, "foo", -1, &dec); BCON_APPEND (&bcon, "foo", BCON_DECIMAL128 (&dec)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_binary (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_binary ( &expected, "foo", -1, BSON_SUBTYPE_BINARY, (uint8_t *) "deadbeef", 8); BCON_APPEND (&bcon, "foo", BCON_BIN (BSON_SUBTYPE_BINARY, (const uint8_t *) "deadbeef", 8), NULL); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_undefined (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_undefined (&expected, "foo", -1); BCON_APPEND (&bcon, "foo", BCON_UNDEFINED); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_oid (void) { bson_t bcon, expected; bson_oid_t oid; bson_init (&bcon); bson_init (&expected); bson_oid_init (&oid, NULL); bson_append_oid (&expected, "foo", -1, &oid); BCON_APPEND (&bcon, "foo", BCON_OID (&oid)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_bool (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_bool (&expected, "foo", -1, 1); BCON_APPEND (&bcon, "foo", BCON_BOOL (1)); bson_eq_bson (&bcon, &expected); bson_reinit (&bcon); bson_reinit (&expected); bson_append_bool (&expected, "foo", -1, 0); BCON_APPEND (&bcon, "foo", BCON_BOOL (0)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_date_time (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_date_time (&expected, "foo", -1, 10000); BCON_APPEND (&bcon, "foo", BCON_DATE_TIME (10000)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_null (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_null (&expected, "foo", -1); BCON_APPEND (&bcon, "foo", BCON_NULL); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_regex (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); /* option flags are sorted */ bson_append_regex (&expected, "foo", -1, "^foo|bar$", "mis"); BCON_APPEND (&bcon, "foo", BCON_REGEX ("^foo|bar$", "msi")); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_dbpointer (void) { bson_t bcon, expected; bson_oid_t oid; bson_init (&bcon); bson_init (&expected); bson_oid_init (&oid, NULL); bson_append_dbpointer (&expected, "foo", -1, "collection", &oid); BCON_APPEND (&bcon, "foo", BCON_DBPOINTER ("collection", &oid)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_code (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_code (&expected, "foo", -1, "var a = {};"); BCON_APPEND (&bcon, "foo", BCON_CODE ("var a = {};")); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_symbol (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_symbol (&expected, "foo", -1, "deadbeef", -1); BCON_APPEND (&bcon, "foo", BCON_SYMBOL ("deadbeef")); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_codewscope (void) { bson_t bcon, expected, scope; bson_init (&bcon); bson_init (&expected); bson_init (&scope); bson_append_int32 (&scope, "b", -1, 10); bson_append_code_with_scope (&expected, "foo", -1, "var a = b;", &scope); BCON_APPEND (&bcon, "foo", BCON_CODEWSCOPE ("var a = b;", &scope)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); bson_destroy (&scope); } static void test_int32 (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_int32 (&expected, "foo", -1, 100); BCON_APPEND (&bcon, "foo", BCON_INT32 (100)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_timestamp (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_timestamp (&expected, "foo", -1, 100, 1000); BCON_APPEND (&bcon, "foo", BCON_TIMESTAMP (100, 1000)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_int64 (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_int64 (&expected, "foo", -1, 100); BCON_APPEND (&bcon, "foo", BCON_INT64 (100)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_maxkey (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_maxkey (&expected, "foo", -1); BCON_APPEND (&bcon, "foo", BCON_MAXKEY); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_minkey (void) { bson_t bcon, expected; bson_init (&bcon); bson_init (&expected); bson_append_minkey (&expected, "foo", -1); BCON_APPEND (&bcon, "foo", BCON_MINKEY); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_bson_document (void) { bson_t bcon, expected, child; bson_init (&bcon); bson_init (&expected); bson_init (&child); bson_append_utf8 (&child, "bar", -1, "baz", -1); bson_append_document (&expected, "foo", -1, &child); BCON_APPEND (&bcon, "foo", BCON_DOCUMENT (&child)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); bson_destroy (&child); } static void test_bson_array (void) { bson_t bcon, expected, child; bson_init (&bcon); bson_init (&expected); bson_init (&child); bson_append_utf8 (&child, "0", -1, "baz", -1); bson_append_array (&expected, "foo", -1, &child); BCON_APPEND (&bcon, "foo", BCON_ARRAY (&child)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); bson_destroy (&child); } static void test_inline_array (void) { bson_t bcon, expected, child; bson_init (&bcon); bson_init (&expected); bson_init (&child); bson_append_utf8 (&child, "0", -1, "baz", -1); bson_append_array (&expected, "foo", -1, &child); BCON_APPEND (&bcon, "foo", "[", "baz", "]"); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&child); bson_destroy (&expected); } static void test_inline_doc (void) { bson_t bcon, expected, child; bson_init (&bcon); bson_init (&expected); bson_init (&child); bson_append_utf8 (&child, "bar", -1, "baz", -1); bson_append_document (&expected, "foo", -1, &child); BCON_APPEND (&bcon, "foo", "{", "bar", "baz", "}"); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); bson_destroy (&child); } static void test_inline_nested (void) { bson_t bcon, expected, foo, bar, third; bson_init (&bcon); bson_init (&expected); bson_init (&foo); bson_init (&bar); bson_init (&third); bson_append_utf8 (&third, "hello", -1, "world", -1); bson_append_int32 (&bar, "0", -1, 1); bson_append_int32 (&bar, "1", -1, 2); bson_append_document (&bar, "2", -1, &third); bson_append_array (&foo, "bar", -1, &bar); bson_append_document (&expected, "foo", -1, &foo); BCON_APPEND (&bcon, "foo", "{", "bar", "[", BCON_INT32 (1), BCON_INT32 (2), "{", "hello", "world", "}", "]", "}"); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); bson_destroy (&foo); bson_destroy (&bar); bson_destroy (&third); } static void test_concat (void) { bson_t bcon, expected, child, child2; bson_init (&bcon); bson_init (&expected); bson_init (&child); bson_init (&child2); bson_append_utf8 (&child, "hello", -1, "world", -1); bson_append_document (&expected, "foo", -1, &child); BCON_APPEND (&bcon, "foo", "{", BCON (&child), "}"); bson_eq_bson (&bcon, &expected); bson_reinit (&bcon); bson_reinit (&expected); bson_reinit (&child); bson_append_utf8 (&child, "0", -1, "bar", -1); bson_append_utf8 (&child, "1", -1, "baz", -1); bson_append_array (&expected, "foo", -1, &child); bson_append_utf8 (&child2, "0", -1, "baz", -1); BCON_APPEND (&bcon, "foo", "[", "bar", BCON (&child2), "]"); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&child); bson_destroy (&child2); bson_destroy (&expected); } static void test_iter (void) { bson_t bcon, expected; bson_iter_t iter; bson_init (&bcon); bson_init (&expected); bson_append_int32 (&expected, "foo", -1, 100); bson_iter_init_find (&iter, &expected, "foo"); BCON_APPEND (&bcon, "foo", BCON_ITER (&iter)); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); } static void test_bcon_new (void) { bson_t expected; bson_t *bcon; bson_init (&expected); bson_append_utf8 (&expected, "hello", -1, "world", -1); bcon = BCON_NEW ("hello", "world"); bson_eq_bson (bcon, &expected); bson_destroy (bcon); bson_destroy (&expected); } static void test_append_ctx_helper (bson_t *bson, ...) { va_list ap; bcon_append_ctx_t ctx; bcon_append_ctx_init (&ctx); va_start (ap, bson); bcon_append_ctx_va (bson, &ctx, &ap); va_arg (ap, char *); BCON_APPEND_CTX (bson, &ctx, "c", "d"); bcon_append_ctx_va (bson, &ctx, &ap); va_end (ap); } static void test_append_ctx (void) { bson_t bcon, expected, child; bson_init (&bcon); bson_init (&expected); bson_init (&child); bson_append_utf8 (&child, "c", -1, "d", -1); bson_append_utf8 (&child, "e", -1, "f", -1); bson_append_document (&expected, "a", -1, &child); test_append_ctx_helper ( &bcon, "a", "{", NULL, "add magic", "e", "f", "}", NULL); bson_eq_bson (&bcon, &expected); bson_destroy (&bcon); bson_destroy (&expected); bson_destroy (&child); } void test_bcon_basic_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/bcon/test_utf8", test_utf8); TestSuite_Add (suite, "/bson/bcon/test_double", test_double); TestSuite_Add (suite, "/bson/bcon/test_binary", test_binary); TestSuite_Add (suite, "/bson/bcon/test_undefined", test_undefined); TestSuite_Add (suite, "/bson/bcon/test_oid", test_oid); TestSuite_Add (suite, "/bson/bcon/test_bool", test_bool); TestSuite_Add (suite, "/bson/bcon/test_date_time", test_date_time); TestSuite_Add (suite, "/bson/bcon/test_null", test_null); TestSuite_Add (suite, "/bson/bcon/test_regex", test_regex); TestSuite_Add (suite, "/bson/bcon/test_dbpointer", test_dbpointer); TestSuite_Add (suite, "/bson/bcon/test_code", test_code); TestSuite_Add (suite, "/bson/bcon/test_symbol", test_symbol); TestSuite_Add (suite, "/bson/bcon/test_codewscope", test_codewscope); TestSuite_Add (suite, "/bson/bcon/test_int32", test_int32); TestSuite_Add (suite, "/bson/bcon/test_timestamp", test_timestamp); TestSuite_Add (suite, "/bson/bcon/test_int64", test_int64); TestSuite_Add (suite, "/bson/bcon/test_decimal128", test_decimal128); TestSuite_Add (suite, "/bson/bcon/test_maxkey", test_maxkey); TestSuite_Add (suite, "/bson/bcon/test_minkey", test_minkey); TestSuite_Add (suite, "/bson/bcon/test_bson_document", test_bson_document); TestSuite_Add (suite, "/bson/bcon/test_bson_array", test_bson_array); TestSuite_Add (suite, "/bson/bcon/test_inline_array", test_inline_array); TestSuite_Add (suite, "/bson/bcon/test_inline_doc", test_inline_doc); TestSuite_Add (suite, "/bson/bcon/test_inline_nested", test_inline_nested); TestSuite_Add (suite, "/bson/bcon/test_concat", test_concat); TestSuite_Add (suite, "/bson/bcon/test_iter", test_iter); TestSuite_Add (suite, "/bson/bcon/test_bcon_new", test_bcon_new); TestSuite_Add (suite, "/bson/bcon/test_append_ctx", test_append_ctx); } mongo-c-driver-1.26.0/src/libbson/tests/test-bcon-extract.c000066400000000000000000000263701456567454500235600ustar00rootroot00000000000000#include #include "TestSuite.h" static void test_utf8 (void) { const char *val; bson_t *bcon = BCON_NEW ("hello", "world"); BSON_ASSERT (BCON_EXTRACT (bcon, "hello", BCONE_UTF8 (val))); BSON_ASSERT (strcmp (val, "world") == 0); bson_destroy (bcon); } static void test_double (void) { double val; bson_t *bcon = BCON_NEW ("foo", BCON_DOUBLE (1.1)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_DOUBLE (val))); BSON_ASSERT (val == 1.1); bson_destroy (bcon); } static void test_decimal128 (void) { bson_decimal128_t val; bson_decimal128_t dec; bson_t *bcon; bson_decimal128_from_string ("12", &dec); bcon = BCON_NEW ("foo", BCON_DECIMAL128 (&dec)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_DECIMAL128 (val))); BSON_ASSERT (val.low == 0xCULL); BSON_ASSERT (val.high == 0x3040000000000000ULL); bson_destroy (bcon); } static void test_binary (void) { bson_subtype_t subtype; uint32_t len; const uint8_t *binary; bson_t *bcon = BCON_NEW ( "foo", BCON_BIN (BSON_SUBTYPE_BINARY, (uint8_t *) "deadbeef", 8)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_BIN (subtype, binary, len))); BSON_ASSERT (subtype == BSON_SUBTYPE_BINARY); BSON_ASSERT (len == 8); BSON_ASSERT (memcmp (binary, "deadbeef", 8) == 0); bson_destroy (bcon); } static void test_undefined (void) { bson_t *bcon = BCON_NEW ("foo", BCON_UNDEFINED); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_UNDEFINED)); bson_destroy (bcon); } static void test_oid (void) { bson_oid_t oid; bson_t *bcon; const bson_oid_t *ooid; bson_oid_init (&oid, NULL); bcon = BCON_NEW ("foo", BCON_OID (&oid)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_OID (ooid))); BSON_ASSERT (bson_oid_equal (&oid, ooid)); bson_destroy (bcon); } static void test_bool (void) { bool b; bson_t *bcon = BCON_NEW ("foo", BCON_BOOL (true)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_BOOL (b))); BSON_ASSERT (b == true); bson_destroy (bcon); } static void test_date_time (void) { int64_t out; bson_t *bcon = BCON_NEW ("foo", BCON_DATE_TIME (10000)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_DATE_TIME (out))); BSON_ASSERT (out == 10000); bson_destroy (bcon); } static void test_null (void) { bson_t *bcon = BCON_NEW ("foo", BCON_NULL); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_NULL)); bson_destroy (bcon); } static void test_regex (void) { const char *regex; const char *flags; bson_t *bcon = BCON_NEW ("foo", BCON_REGEX ("^foo|bar$", "i")); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_REGEX (regex, flags))); BSON_ASSERT (strcmp (regex, "^foo|bar$") == 0); BSON_ASSERT (strcmp (flags, "i") == 0); bson_destroy (bcon); } static void test_dbpointer (void) { const char *collection; bson_oid_t oid; const bson_oid_t *ooid; bson_t *bcon; bson_oid_init (&oid, NULL); bcon = BCON_NEW ("foo", BCON_DBPOINTER ("collection", &oid)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_DBPOINTER (collection, ooid))); BSON_ASSERT (strcmp (collection, "collection") == 0); BSON_ASSERT (bson_oid_equal (ooid, &oid)); bson_destroy (bcon); } static void test_code (void) { const char *val; bson_t *bcon = BCON_NEW ("foo", BCON_CODE ("var a = {};")); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_CODE (val))); BSON_ASSERT (strcmp (val, "var a = {};") == 0); bson_destroy (bcon); } static void test_symbol (void) { const char *val; bson_t *bcon = BCON_NEW ("foo", BCON_SYMBOL ("symbol")); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_SYMBOL (val))); BSON_ASSERT (strcmp (val, "symbol") == 0); bson_destroy (bcon); } static void test_codewscope (void) { const char *code; bson_t oscope; bson_t *scope = BCON_NEW ("b", BCON_INT32 (10)); bson_t *bcon = BCON_NEW ("foo", BCON_CODEWSCOPE ("var a = b;", scope)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_CODEWSCOPE (code, oscope))); BSON_ASSERT (strcmp (code, "var a = b;") == 0); bson_eq_bson (&oscope, scope); bson_destroy (&oscope); bson_destroy (scope); bson_destroy (bcon); } static void test_int32 (void) { int32_t i32; bson_t *bcon = BCON_NEW ("foo", BCON_INT32 (10)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_INT32 (i32))); BSON_ASSERT (i32 == 10); bson_destroy (bcon); } static void test_timestamp (void) { int32_t timestamp; int32_t increment; bson_t *bcon = BCON_NEW ("foo", BCON_TIMESTAMP (100, 1000)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_TIMESTAMP (timestamp, increment))); BSON_ASSERT (timestamp == 100); BSON_ASSERT (increment == 1000); bson_destroy (bcon); } static void test_int64 (void) { int64_t i64; bson_t *bcon = BCON_NEW ("foo", BCON_INT64 (10)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_INT64 (i64))); BSON_ASSERT (i64 == 10); bson_destroy (bcon); } static void test_maxkey (void) { bson_t *bcon = BCON_NEW ("foo", BCON_MAXKEY); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_MAXKEY)); bson_destroy (bcon); } static void test_minkey (void) { bson_t *bcon = BCON_NEW ("foo", BCON_MINKEY); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_MINKEY)); bson_destroy (bcon); } static void test_bson_document (void) { bson_t ochild; bson_t *child = BCON_NEW ("bar", "baz"); bson_t *bcon = BCON_NEW ("foo", BCON_DOCUMENT (child)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_DOCUMENT (ochild))); bson_eq_bson (&ochild, child); bson_destroy (&ochild); bson_destroy (child); bson_destroy (bcon); } static void test_bson_array (void) { bson_t ochild; bson_t *child = BCON_NEW ("0", "baz"); bson_t *bcon = BCON_NEW ("foo", BCON_ARRAY (child)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_ARRAY (ochild))); bson_eq_bson (&ochild, child); bson_destroy (&ochild); bson_destroy (child); bson_destroy (bcon); } static void test_inline_array (void) { int32_t a, b; bson_t *bcon = BCON_NEW ("foo", "[", BCON_INT32 (1), BCON_INT32 (2), "]"); BSON_ASSERT ( BCON_EXTRACT (bcon, "foo", "[", BCONE_INT32 (a), BCONE_INT32 (b), "]")); BSON_ASSERT (a == 1); BSON_ASSERT (b == 2); bson_destroy (bcon); } static void test_inline_doc (void) { int32_t a, b; bson_t *bcon = BCON_NEW ("foo", "{", "b", BCON_INT32 (2), "a", BCON_INT32 (1), "}"); BSON_ASSERT (BCON_EXTRACT ( bcon, "foo", "{", "a", BCONE_INT32 (a), "b", BCONE_INT32 (b), "}")); BSON_ASSERT (a == 1); BSON_ASSERT (b == 2); bson_destroy (bcon); } static void test_extract_ctx_helper (bson_t *bson, ...) { va_list ap; bcon_extract_ctx_t ctx; int i; int n; bcon_extract_ctx_init (&ctx); va_start (ap, bson); n = va_arg (ap, int); for (i = 0; i < n; i++) { BSON_ASSERT (bcon_extract_ctx_va (bson, &ctx, &ap)); } va_end (ap); } static void test_extract_ctx (void) { int32_t a, b, c; bson_t *bson = BCON_NEW ("a", BCON_INT32 (1), "b", BCON_INT32 (2), "c", BCON_INT32 (3)); test_extract_ctx_helper (bson, 3, "a", BCONE_INT32 (a), NULL, "b", BCONE_INT32 (b), NULL, "c", BCONE_INT32 (c), NULL); BSON_ASSERT (a == 1); BSON_ASSERT (b == 2); BSON_ASSERT (c == 3); bson_destroy (bson); } static void test_nested (void) { const char *utf8; int i32; bson_t *bcon = BCON_NEW ("hello", "world", "foo", "{", "bar", BCON_INT32 (10), "}"); BSON_ASSERT (BCON_EXTRACT (bcon, "hello", BCONE_UTF8 (utf8), "foo", "{", "bar", BCONE_INT32 (i32), "}")); BSON_ASSERT (strcmp ("world", utf8) == 0); BSON_ASSERT (i32 == 10); bson_destroy (bcon); } static void test_skip (void) { bson_t *bcon = BCON_NEW ("hello", "world", "foo", "{", "bar", BCON_INT32 (10), "}"); BSON_ASSERT (BCON_EXTRACT (bcon, "hello", BCONE_SKIP (BSON_TYPE_UTF8), "foo", "{", "bar", BCONE_SKIP (BSON_TYPE_INT32), "}")); BSON_ASSERT (!BCON_EXTRACT (bcon, "hello", BCONE_SKIP (BSON_TYPE_UTF8), "foo", "{", "bar", BCONE_SKIP (BSON_TYPE_INT64), "}")); bson_destroy (bcon); } static void test_iter (void) { bson_iter_t iter; bson_t *other; bson_t *bcon = BCON_NEW ("foo", BCON_INT32 (10)); BSON_ASSERT (BCON_EXTRACT (bcon, "foo", BCONE_ITER (iter))); BSON_ASSERT (bson_iter_type (&iter) == BSON_TYPE_INT32); BSON_ASSERT (bson_iter_int32 (&iter) == 10); other = BCON_NEW ("foo", BCON_ITER (&iter)); bson_eq_bson (other, bcon); bson_destroy (bcon); bson_destroy (other); } void test_bcon_extract_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/bcon/extract/test_utf8", test_utf8); TestSuite_Add (suite, "/bson/bcon/extract/test_double", test_double); TestSuite_Add (suite, "/bson/bcon/extract/test_decimal128", test_decimal128); TestSuite_Add (suite, "/bson/bcon/extract/test_binary", test_binary); TestSuite_Add (suite, "/bson/bcon/extract/test_undefined", test_undefined); TestSuite_Add (suite, "/bson/bcon/extract/test_oid", test_oid); TestSuite_Add (suite, "/bson/bcon/extract/test_bool", test_bool); TestSuite_Add (suite, "/bson/bcon/extract/test_date_time", test_date_time); TestSuite_Add (suite, "/bson/bcon/extract/test_null", test_null); TestSuite_Add (suite, "/bson/bcon/extract/test_regex", test_regex); TestSuite_Add (suite, "/bson/bcon/extract/test_dbpointer", test_dbpointer); TestSuite_Add (suite, "/bson/bcon/extract/test_code", test_code); TestSuite_Add (suite, "/bson/bcon/extract/test_symbol", test_symbol); TestSuite_Add (suite, "/bson/bcon/extract/test_codewscope", test_codewscope); TestSuite_Add (suite, "/bson/bcon/extract/test_int32", test_int32); TestSuite_Add (suite, "/bson/bcon/extract/test_timestamp", test_timestamp); TestSuite_Add (suite, "/bson/bcon/extract/test_int64", test_int64); TestSuite_Add (suite, "/bson/bcon/extract/test_maxkey", test_maxkey); TestSuite_Add (suite, "/bson/bcon/extract/test_minkey", test_minkey); TestSuite_Add ( suite, "/bson/bcon/extract/test_bson_document", test_bson_document); TestSuite_Add (suite, "/bson/bcon/extract/test_bson_array", test_bson_array); TestSuite_Add ( suite, "/bson/bcon/extract/test_inline_array", test_inline_array); TestSuite_Add (suite, "/bson/bcon/extract/test_inline_doc", test_inline_doc); TestSuite_Add ( suite, "/bson/bcon/extract/test_extract_ctx", test_extract_ctx); TestSuite_Add (suite, "/bson/bcon/extract/test_nested", test_nested); TestSuite_Add (suite, "/bson/bcon/extract/test_skip", test_skip); TestSuite_Add (suite, "/bson/bcon/extract/test_iter", test_iter); } mongo-c-driver-1.26.0/src/libbson/tests/test-bson-cmp.c000066400000000000000000000300011456567454500226670ustar00rootroot00000000000000/* * Copyright 2022 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "TestSuite.h" #include static void test_bson_cmp_equal (void) { BSON_ASSERT (bson_cmp_equal_ss (0, 0)); BSON_ASSERT (!bson_cmp_equal_ss (0, -1)); BSON_ASSERT (!bson_cmp_equal_ss (0, 1)); BSON_ASSERT (!bson_cmp_equal_ss (-1, 0)); BSON_ASSERT (bson_cmp_equal_ss (-1, -1)); BSON_ASSERT (!bson_cmp_equal_ss (-1, 1)); BSON_ASSERT (!bson_cmp_equal_ss (1, 0)); BSON_ASSERT (!bson_cmp_equal_ss (1, -1)); BSON_ASSERT (bson_cmp_equal_ss (1, 1)); BSON_ASSERT (bson_cmp_equal_uu (0u, 0u)); BSON_ASSERT (!bson_cmp_equal_uu (0u, 1u)); BSON_ASSERT (!bson_cmp_equal_uu (1u, 0u)); BSON_ASSERT (bson_cmp_equal_uu (1u, 1u)); BSON_ASSERT (bson_cmp_equal_su (0, 0u)); BSON_ASSERT (!bson_cmp_equal_su (0, 1u)); BSON_ASSERT (!bson_cmp_equal_su (-1, 0u)); BSON_ASSERT (!bson_cmp_equal_su (-1, 1u)); BSON_ASSERT (!bson_cmp_equal_su (1, 0u)); BSON_ASSERT (bson_cmp_equal_su (1, 1u)); BSON_ASSERT (bson_cmp_equal_us (0u, 0)); BSON_ASSERT (!bson_cmp_equal_us (0u, -1)); BSON_ASSERT (!bson_cmp_equal_us (0u, 1)); BSON_ASSERT (!bson_cmp_equal_us (1u, 0)); BSON_ASSERT (!bson_cmp_equal_us (1u, -1)); BSON_ASSERT (bson_cmp_equal_us (1u, 1)); } static void test_bson_cmp_not_equal (void) { BSON_ASSERT (!bson_cmp_not_equal_ss (0, 0)); BSON_ASSERT (bson_cmp_not_equal_ss (0, -1)); BSON_ASSERT (bson_cmp_not_equal_ss (0, 1)); BSON_ASSERT (bson_cmp_not_equal_ss (-1, 0)); BSON_ASSERT (!bson_cmp_not_equal_ss (-1, -1)); BSON_ASSERT (bson_cmp_not_equal_ss (-1, 1)); BSON_ASSERT (bson_cmp_not_equal_ss (1, 0)); BSON_ASSERT (bson_cmp_not_equal_ss (1, -1)); BSON_ASSERT (!bson_cmp_not_equal_ss (1, 1)); BSON_ASSERT (!bson_cmp_not_equal_uu (0u, 0u)); BSON_ASSERT (bson_cmp_not_equal_uu (0u, 1u)); BSON_ASSERT (bson_cmp_not_equal_uu (1u, 0u)); BSON_ASSERT (!bson_cmp_not_equal_uu (1u, 1u)); BSON_ASSERT (!bson_cmp_not_equal_su (0, 0u)); BSON_ASSERT (bson_cmp_not_equal_su (0, 1u)); BSON_ASSERT (bson_cmp_not_equal_su (-1, 0u)); BSON_ASSERT (bson_cmp_not_equal_su (-1, 1u)); BSON_ASSERT (bson_cmp_not_equal_su (1, 0u)); BSON_ASSERT (!bson_cmp_not_equal_su (1, 1u)); BSON_ASSERT (!bson_cmp_not_equal_us (0u, 0)); BSON_ASSERT (bson_cmp_not_equal_us (0u, -1)); BSON_ASSERT (bson_cmp_not_equal_us (0u, 1)); BSON_ASSERT (bson_cmp_not_equal_us (1u, 0)); BSON_ASSERT (bson_cmp_not_equal_us (1u, -1)); BSON_ASSERT (!bson_cmp_not_equal_us (1u, 1)); } static void test_bson_cmp_less (void) { BSON_ASSERT (!bson_cmp_less_ss (0, 0)); BSON_ASSERT (!bson_cmp_less_ss (0, -1)); BSON_ASSERT (bson_cmp_less_ss (0, 1)); BSON_ASSERT (bson_cmp_less_ss (-1, 0)); BSON_ASSERT (!bson_cmp_less_ss (-1, -1)); BSON_ASSERT (bson_cmp_less_ss (-1, 1)); BSON_ASSERT (!bson_cmp_less_ss (1, 0)); BSON_ASSERT (!bson_cmp_less_ss (1, -1)); BSON_ASSERT (!bson_cmp_less_ss (1, 1)); BSON_ASSERT (!bson_cmp_less_uu (0u, 0u)); BSON_ASSERT (bson_cmp_less_uu (0u, 1u)); BSON_ASSERT (!bson_cmp_less_uu (1u, 0u)); BSON_ASSERT (!bson_cmp_less_uu (1u, 1u)); BSON_ASSERT (!bson_cmp_less_su (0, 0u)); BSON_ASSERT (bson_cmp_less_su (0, 1u)); BSON_ASSERT (bson_cmp_less_su (-1, 0u)); BSON_ASSERT (bson_cmp_less_su (-1, 1u)); BSON_ASSERT (!bson_cmp_less_su (1, 0u)); BSON_ASSERT (!bson_cmp_less_su (1, 1u)); BSON_ASSERT (!bson_cmp_less_us (0u, 0)); BSON_ASSERT (!bson_cmp_less_us (0u, -1)); BSON_ASSERT (bson_cmp_less_us (0u, 1)); BSON_ASSERT (!bson_cmp_less_us (1u, 0)); BSON_ASSERT (!bson_cmp_less_us (1u, -1)); BSON_ASSERT (!bson_cmp_less_us (1u, 1)); } static void test_bson_cmp_greater (void) { BSON_ASSERT (!bson_cmp_greater_ss (0, 0)); BSON_ASSERT (bson_cmp_greater_ss (0, -1)); BSON_ASSERT (!bson_cmp_greater_ss (0, 1)); BSON_ASSERT (!bson_cmp_greater_ss (-1, 0)); BSON_ASSERT (!bson_cmp_greater_ss (-1, -1)); BSON_ASSERT (!bson_cmp_greater_ss (-1, 1)); BSON_ASSERT (bson_cmp_greater_ss (1, 0)); BSON_ASSERT (bson_cmp_greater_ss (1, -1)); BSON_ASSERT (!bson_cmp_greater_ss (1, 1)); BSON_ASSERT (!bson_cmp_greater_uu (0u, 0u)); BSON_ASSERT (!bson_cmp_greater_uu (0u, 1u)); BSON_ASSERT (bson_cmp_greater_uu (1u, 0u)); BSON_ASSERT (!bson_cmp_greater_uu (1u, 1u)); BSON_ASSERT (!bson_cmp_greater_su (0, 0u)); BSON_ASSERT (!bson_cmp_greater_su (0, 1u)); BSON_ASSERT (!bson_cmp_greater_su (-1, 0u)); BSON_ASSERT (!bson_cmp_greater_su (-1, 1u)); BSON_ASSERT (bson_cmp_greater_su (1, 0u)); BSON_ASSERT (!bson_cmp_greater_su (1, 1u)); BSON_ASSERT (!bson_cmp_greater_us (0u, 0)); BSON_ASSERT (bson_cmp_greater_us (0u, -1)); BSON_ASSERT (!bson_cmp_greater_us (0u, 1)); BSON_ASSERT (bson_cmp_greater_us (1u, 0)); BSON_ASSERT (bson_cmp_greater_us (1u, -1)); BSON_ASSERT (!bson_cmp_greater_us (1u, 1)); } static void test_bson_cmp_less_equal (void) { BSON_ASSERT (bson_cmp_less_equal_ss (0, 0)); BSON_ASSERT (!bson_cmp_less_equal_ss (0, -1)); BSON_ASSERT (bson_cmp_less_equal_ss (0, 1)); BSON_ASSERT (bson_cmp_less_equal_ss (-1, 0)); BSON_ASSERT (bson_cmp_less_equal_ss (-1, -1)); BSON_ASSERT (bson_cmp_less_equal_ss (-1, 1)); BSON_ASSERT (!bson_cmp_less_equal_ss (1, 0)); BSON_ASSERT (!bson_cmp_less_equal_ss (1, -1)); BSON_ASSERT (bson_cmp_less_equal_ss (1, 1)); BSON_ASSERT (bson_cmp_less_equal_uu (0u, 0u)); BSON_ASSERT (bson_cmp_less_equal_uu (0u, 1u)); BSON_ASSERT (!bson_cmp_less_equal_uu (1u, 0u)); BSON_ASSERT (bson_cmp_less_equal_uu (1u, 1u)); BSON_ASSERT (bson_cmp_less_equal_su (0, 0u)); BSON_ASSERT (bson_cmp_less_equal_su (0, 1u)); BSON_ASSERT (bson_cmp_less_equal_su (-1, 0u)); BSON_ASSERT (bson_cmp_less_equal_su (-1, 1u)); BSON_ASSERT (!bson_cmp_less_equal_su (1, 0u)); BSON_ASSERT (bson_cmp_less_equal_su (1, 1u)); BSON_ASSERT (bson_cmp_less_equal_us (0u, 0)); BSON_ASSERT (!bson_cmp_less_equal_us (0u, -1)); BSON_ASSERT (bson_cmp_less_equal_us (0u, 1)); BSON_ASSERT (!bson_cmp_less_equal_us (1u, 0)); BSON_ASSERT (!bson_cmp_less_equal_us (1u, -1)); BSON_ASSERT (bson_cmp_less_equal_us (1u, 1)); } static void test_bson_cmp_greater_equal (void) { BSON_ASSERT (bson_cmp_greater_equal_ss (0, 0)); BSON_ASSERT (bson_cmp_greater_equal_ss (0, -1)); BSON_ASSERT (!bson_cmp_greater_equal_ss (0, 1)); BSON_ASSERT (!bson_cmp_greater_equal_ss (-1, 0)); BSON_ASSERT (bson_cmp_greater_equal_ss (-1, -1)); BSON_ASSERT (!bson_cmp_greater_equal_ss (-1, 1)); BSON_ASSERT (bson_cmp_greater_equal_ss (1, 0)); BSON_ASSERT (bson_cmp_greater_equal_ss (1, -1)); BSON_ASSERT (bson_cmp_greater_equal_ss (1, 1)); BSON_ASSERT (bson_cmp_greater_equal_uu (0u, 0u)); BSON_ASSERT (!bson_cmp_greater_equal_uu (0u, 1u)); BSON_ASSERT (bson_cmp_greater_equal_uu (1u, 0u)); BSON_ASSERT (bson_cmp_greater_equal_uu (1u, 1u)); BSON_ASSERT (bson_cmp_greater_equal_su (0, 0u)); BSON_ASSERT (!bson_cmp_greater_equal_su (0, 1u)); BSON_ASSERT (!bson_cmp_greater_equal_su (-1, 0u)); BSON_ASSERT (!bson_cmp_greater_equal_su (-1, 1u)); BSON_ASSERT (bson_cmp_greater_equal_su (1, 0u)); BSON_ASSERT (bson_cmp_greater_equal_su (1, 1u)); BSON_ASSERT (bson_cmp_greater_equal_us (0u, 0)); BSON_ASSERT (bson_cmp_greater_equal_us (0u, -1)); BSON_ASSERT (!bson_cmp_greater_equal_us (0u, 1)); BSON_ASSERT (bson_cmp_greater_equal_us (1u, 0)); BSON_ASSERT (bson_cmp_greater_equal_us (1u, -1)); BSON_ASSERT (bson_cmp_greater_equal_us (1u, 1)); } /* Sanity check: ensure ssize_t limits are as expected relative to size_t. */ BSON_STATIC_ASSERT2 (ssize_t_size_min_check, SSIZE_MIN + 1 == -SSIZE_MAX); BSON_STATIC_ASSERT2 (ssize_t_size_max_check, (size_t) SSIZE_MAX <= SIZE_MAX); static void test_bson_in_range (void) { const int64_t int8_min = INT8_MIN; const int64_t int8_max = INT8_MAX; const int64_t int32_min = INT32_MIN; const int64_t int32_max = INT32_MAX; const uint64_t uint8_max = UINT8_MAX; const uint64_t uint32_max = UINT32_MAX; const ssize_t ssize_min = SSIZE_MIN; const ssize_t ssize_max = SSIZE_MAX; BSON_ASSERT (!bson_in_range_signed (int8_t, int8_min - 1)); BSON_ASSERT (bson_in_range_signed (int8_t, int8_min)); BSON_ASSERT (bson_in_range_signed (int8_t, 0)); BSON_ASSERT (bson_in_range_signed (int8_t, int8_max)); BSON_ASSERT (!bson_in_range_signed (int8_t, int8_max + 1)); BSON_ASSERT (bson_in_range_unsigned (int8_t, 0u)); BSON_ASSERT (bson_in_range_unsigned (int8_t, (uint64_t) int8_max)); BSON_ASSERT (!bson_in_range_unsigned (int8_t, (uint64_t) (int8_max + 1))); BSON_ASSERT (!bson_in_range_signed (uint8_t, int8_min - 1)); BSON_ASSERT (!bson_in_range_signed (uint8_t, int8_min)); BSON_ASSERT (bson_in_range_signed (uint8_t, 0)); BSON_ASSERT (bson_in_range_signed (uint8_t, int8_max)); BSON_ASSERT (bson_in_range_signed (uint8_t, int8_max + 1)); BSON_ASSERT (bson_in_range_signed (uint8_t, (int64_t) uint8_max)); BSON_ASSERT (!bson_in_range_signed (uint8_t, (int64_t) uint8_max + 1)); BSON_ASSERT (bson_in_range_unsigned (uint8_t, 0u)); BSON_ASSERT (bson_in_range_unsigned (uint8_t, uint8_max)); BSON_ASSERT (!bson_in_range_unsigned (uint8_t, uint8_max + 1u)); BSON_ASSERT (!bson_in_range_signed (int32_t, int32_min - 1)); BSON_ASSERT (bson_in_range_signed (int32_t, int32_min)); BSON_ASSERT (bson_in_range_signed (int32_t, 0)); BSON_ASSERT (bson_in_range_signed (int32_t, int32_max)); BSON_ASSERT (!bson_in_range_signed (int32_t, int32_max + 1)); BSON_ASSERT (bson_in_range_unsigned (int32_t, 0u)); BSON_ASSERT (bson_in_range_unsigned (int32_t, (uint64_t) int32_max)); BSON_ASSERT (!bson_in_range_unsigned (int32_t, (uint64_t) (int32_max + 1))); BSON_ASSERT (!bson_in_range_signed (uint32_t, int32_min - 1)); BSON_ASSERT (!bson_in_range_signed (uint32_t, int32_min)); BSON_ASSERT (bson_in_range_signed (uint32_t, 0)); BSON_ASSERT (bson_in_range_signed (uint32_t, int32_max)); BSON_ASSERT (bson_in_range_signed (uint32_t, int32_max + 1)); BSON_ASSERT (bson_in_range_signed (uint32_t, (int64_t) uint32_max)); BSON_ASSERT (!bson_in_range_signed (uint32_t, (int64_t) uint32_max + 1)); BSON_ASSERT (bson_in_range_unsigned (uint32_t, 0u)); BSON_ASSERT (bson_in_range_unsigned (uint32_t, uint32_max)); BSON_ASSERT (!bson_in_range_unsigned (uint32_t, uint32_max + 1u)); BSON_ASSERT (bson_in_range_signed (ssize_t, ssize_min)); BSON_ASSERT (bson_in_range_signed (ssize_t, 0)); BSON_ASSERT (bson_in_range_signed (ssize_t, ssize_max)); BSON_ASSERT (bson_in_range_unsigned (ssize_t, 0u)); BSON_ASSERT (bson_in_range_unsigned (ssize_t, (size_t) ssize_max)); BSON_ASSERT (!bson_in_range_unsigned (ssize_t, (size_t) ssize_max + 1u)); BSON_ASSERT (!bson_in_range_signed (size_t, ssize_min)); BSON_ASSERT (bson_in_range_signed (size_t, 0)); BSON_ASSERT (bson_in_range_signed (size_t, ssize_max)); BSON_ASSERT (bson_in_range_unsigned (size_t, 0u)); BSON_ASSERT (bson_in_range_unsigned (size_t, (size_t) ssize_max)); BSON_ASSERT (bson_in_range_unsigned (size_t, (size_t) ssize_max + 1u)); } void test_bson_cmp_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/cmp/equal", test_bson_cmp_equal); TestSuite_Add (suite, "/bson/cmp/not_equal", test_bson_cmp_not_equal); TestSuite_Add (suite, "/bson/cmp/less", test_bson_cmp_less); TestSuite_Add (suite, "/bson/cmp/greater", test_bson_cmp_greater); TestSuite_Add (suite, "/bson/cmp/less_equal", test_bson_cmp_less_equal); TestSuite_Add ( suite, "/bson/cmp/greater_equal", test_bson_cmp_greater_equal); TestSuite_Add (suite, "/bson/cmp/in_range", test_bson_in_range); } mongo-c-driver-1.26.0/src/libbson/tests/test-bson-corpus.c000066400000000000000000000210461456567454500234340ustar00rootroot00000000000000#include #include "TestSuite.h" #include "json-test.h" #include "corpus-test.h" #define IS_NAN(dec) (dec).high == 0x7c00000000000000ull typedef struct { const char *scenario; const char *test; } skipped_corpus_test_t; skipped_corpus_test_t SKIPPED_CORPUS_TESTS[] = { /* CDRIVER-1879, can't make Code with embedded NIL */ {"Javascript Code", "Embedded nulls"}, {"Javascript Code with Scope", "Unicode and embedded null in code string, empty scope"}, /* CDRIVER-2223, legacy extended JSON $date syntax uses numbers */ {"Top-level document validity", "Bad $date (number, not string or hash)"}, /* CDRIVER-3500, floating point output differs */ {"Double type", "1.2345678921232E+18"}, {"Double type", "-1.2345678921232E+18"}, /* CDRIVER-4017, libbson does not emit escape sequences */ {"Javascript Code", "two-byte UTF-8 (\xc3\xa9)"}, /* \u00e9 */ {"Javascript Code", "three-byte UTF-8 (\xe2\x98\x86)"}, /* \u2606 */ {"String", "two-byte UTF-8 (\xc3\xa9)"}, /* \u00e9 */ {"String", "three-byte UTF-8 (\xe2\x98\x86)"}, /* \u2606 */ {0}}; skipped_corpus_test_t VS2013_SKIPPED_CORPUS_TESTS[] = { /* VS 2013 and older is imprecise stackoverflow.com/questions/32232331 */ {"Double type", "1.23456789012345677E+18"}, {"Double type", "-1.23456789012345677E+18"}, {0}}; static void compare_data (const uint8_t *a, uint32_t a_len, const uint8_t *b, uint32_t b_len) { bson_string_t *a_str; bson_string_t *b_str; uint32_t i; if (a_len != b_len || memcmp (a, b, (size_t) a_len)) { a_str = bson_string_new (NULL); for (i = 0; i < a_len; i++) { bson_string_append_printf (a_str, "%02X", (int) a[i]); } b_str = bson_string_new (NULL); for (i = 0; i < b_len; i++) { bson_string_append_printf (b_str, "%02X", (int) b[i]); } fprintf (stderr, "unequal data of length %d and %d:\n%s\n%s\n", a_len, b_len, a_str->str, b_str->str); abort (); } } static bool is_test_skipped (const char *scenario, const char *description) { skipped_corpus_test_t *skip; for (skip = SKIPPED_CORPUS_TESTS; skip->scenario != NULL; skip++) { if (!strcmp (skip->scenario, scenario) && !strcmp (skip->test, description)) { return true; } } /* _MSC_VER 1900 is Visual Studio 2015 */ #if (defined(_MSC_VER) && _MSC_VER < 1900) for (skip = VS2013_SKIPPED_CORPUS_TESTS; skip->scenario != NULL; skip++) { if (!strcmp (skip->scenario, scenario) && !strcmp (skip->test, description)) { return true; } } #endif return false; } /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-validity * for cB input: * bson_to_canonical_extended_json(cB) = cE * bson_to_relaxed_extended_json(cB) = rE (if rE exists) * for cE input: * json_to_bson(cE) = cB (unless lossy) * for dB input (if it exists): * bson_to_canonical_extended_json(dB) = cE * bson_to_relaxed_extended_json(dB) = rE (if rE exists) * for dE input (if it exists): * json_to_bson(dE) = cB (unless lossy) * for rE input (if it exists): bson_to_relaxed_extended_json(json_to_bson(rE)) = rE */ static void test_bson_corpus_valid (test_bson_valid_type_t *test) { bson_t cB; bson_t dB; bson_t *decode_cE; bson_t *decode_dE; bson_t *decode_rE; bson_error_t error; BSON_ASSERT (test->cB); BSON_ASSERT (test->cE); if (is_test_skipped (test->scenario_description, test->test_description)) { if (test_suite_debug_output ()) { printf (" SKIP\n"); fflush (stdout); } return; } BSON_ASSERT (bson_init_static (&cB, test->cB, test->cB_len)); ASSERT_CMPJSON (bson_as_canonical_extended_json (&cB, NULL), test->cE); if (test->rE) { ASSERT_CMPJSON (bson_as_relaxed_extended_json (&cB, NULL), test->rE); } decode_cE = bson_new_from_json ((const uint8_t *) test->cE, -1, &error); ASSERT_OR_PRINT (decode_cE, error); if (!test->lossy) { compare_data ( bson_get_data (decode_cE), decode_cE->len, test->cB, test->cB_len); } if (test->dB) { BSON_ASSERT (bson_init_static (&dB, test->dB, test->dB_len)); ASSERT_CMPJSON (bson_as_canonical_extended_json (&dB, NULL), test->cE); if (test->rE) { ASSERT_CMPJSON (bson_as_relaxed_extended_json (&dB, NULL), test->rE); } bson_destroy (&dB); } if (test->dE) { decode_dE = bson_new_from_json ((const uint8_t *) test->dE, -1, &error); ASSERT_OR_PRINT (decode_dE, error); ASSERT_CMPJSON (bson_as_canonical_extended_json (decode_dE, NULL), test->cE); if (!test->lossy) { compare_data ( bson_get_data (decode_dE), decode_dE->len, test->cB, test->cB_len); } bson_destroy (decode_dE); } if (test->rE) { decode_rE = bson_new_from_json ((const uint8_t *) test->rE, -1, &error); ASSERT_OR_PRINT (decode_rE, error); ASSERT_CMPJSON (bson_as_relaxed_extended_json (decode_rE, NULL), test->rE); bson_destroy (decode_rE); } bson_destroy (decode_cE); bson_destroy (&cB); } /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-decode-errors */ static void test_bson_corpus_decode_error (test_bson_decode_error_type_t *test) { bson_t invalid_bson; BSON_ASSERT (test->bson); if (is_test_skipped (test->scenario_description, test->test_description)) { if (test_suite_debug_output ()) { printf (" SKIP\n"); fflush (stdout); } return; } ASSERT (test->bson); ASSERT (!bson_init_static (&invalid_bson, test->bson, test->bson_len) || bson_empty (&invalid_bson) || !bson_as_canonical_extended_json (&invalid_bson, NULL)); } /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-parsing-errors */ static void test_bson_corpus_parse_error (test_bson_parse_error_type_t *test) { BSON_ASSERT (test->str); if (is_test_skipped (test->scenario_description, test->test_description)) { if (test_suite_debug_output ()) { printf (" SKIP\n"); fflush (stdout); } return; } switch (test->bson_type) { case BSON_TYPE_EOD: /* top-level document to be parsed as JSON */ case BSON_TYPE_BINARY: ASSERT (!bson_new_from_json ((uint8_t *) test->str, test->str_len, NULL)); break; case BSON_TYPE_DECIMAL128: { bson_decimal128_t dec; ASSERT (!bson_decimal128_from_string (test->str, &dec)); ASSERT (IS_NAN (dec)); break; } case BSON_TYPE_DOUBLE: case BSON_TYPE_UTF8: case BSON_TYPE_DOCUMENT: case BSON_TYPE_ARRAY: case BSON_TYPE_UNDEFINED: case BSON_TYPE_OID: case BSON_TYPE_BOOL: case BSON_TYPE_DATE_TIME: case BSON_TYPE_NULL: case BSON_TYPE_REGEX: case BSON_TYPE_DBPOINTER: case BSON_TYPE_CODE: case BSON_TYPE_SYMBOL: case BSON_TYPE_CODEWSCOPE: case BSON_TYPE_INT32: case BSON_TYPE_TIMESTAMP: case BSON_TYPE_INT64: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: default: fprintf (stderr, "Unsupported parseError type: %#x\n", test->bson_type); abort (); } } static void test_bson_corpus_cb (bson_t *scenario) { corpus_test (scenario, test_bson_corpus_valid, test_bson_corpus_decode_error, test_bson_corpus_parse_error); } static void test_bson_corpus_prose_1 (void) { bson_t *bson; bool ok; bson_t subdoc; /* Field name within a root document */ bson = bson_new (); ok = bson_append_int32 (bson, "a\0b", 3, 123); BSON_ASSERT (!ok); bson_destroy (bson); /* Field name within a sub-document */ bson = bson_new(); bson_append_document_begin (bson, "subdoc", -1, &subdoc); ok = bson_append_int32 (&subdoc, "a\0b", 3, 123); BSON_ASSERT (!ok); bson_destroy (&subdoc); bson_destroy (bson); /* Pattern for a regular expression */ bson = bson_new (); ok = bson_append_regex_w_len (bson, "key", 3, "a\0b", 3, ""); BSON_ASSERT (!ok); bson_destroy (bson); /* Testing options for a regular expression is not possible, since * bson_append_regex_w_len does not accept a length for options. */ } void test_bson_corpus_install (TestSuite *suite) { install_json_test_suite_with_check ( suite, BSON_JSON_DIR, "bson_corpus", test_bson_corpus_cb); TestSuite_Add (suite, "/bson_corpus/prose_1", test_bson_corpus_prose_1); } mongo-c-driver-1.26.0/src/libbson/tests/test-bson-error.c000066400000000000000000000020301456567454500232420ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "TestSuite.h" static void test_bson_error_basic (void) { bson_error_t error; bson_set_error (&error, 123, 456, "%s %u", "localhost", 27017); BSON_ASSERT (!strcmp (error.message, "localhost 27017")); ASSERT_CMPINT (error.domain, ==, 123); ASSERT_CMPINT (error.code, ==, 456); } void test_bson_error_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/error/basic", test_bson_error_basic); } mongo-c-driver-1.26.0/src/libbson/tests/test-bson-version.c000066400000000000000000000012471456567454500236070ustar00rootroot00000000000000#include #include "TestSuite.h" static void test_bson_version (void) { ASSERT_CMPINT (bson_get_major_version (), ==, BSON_MAJOR_VERSION); ASSERT_CMPINT (bson_get_minor_version (), ==, BSON_MINOR_VERSION); ASSERT_CMPINT (bson_get_micro_version (), ==, BSON_MICRO_VERSION); ASSERT_CMPSTR (bson_get_version (), BSON_VERSION_S); ASSERT (bson_check_version ( BSON_MAJOR_VERSION, BSON_MINOR_VERSION, BSON_MICRO_VERSION)); ASSERT (!bson_check_version ( BSON_MAJOR_VERSION, BSON_MINOR_VERSION + 1, BSON_MICRO_VERSION)); } void test_bson_version_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/version", test_bson_version); } mongo-c-driver-1.26.0/src/libbson/tests/test-bson.c000066400000000000000000003115241456567454500221260ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include "TestSuite.h" #include "test-conveniences.h" /* CDRIVER-2460 ensure the unused old BSON_ASSERT_STATIC macro still compiles */ BSON_STATIC_ASSERT (1 == 1); static bson_t * get_bson (const char *filename) { ssize_t len; uint8_t buf[4096]; bson_t *b; char real_filename[256]; int fd; bson_snprintf ( real_filename, sizeof real_filename, BSON_BINARY_DIR "/%s", filename); real_filename[sizeof real_filename - 1] = '\0'; if (-1 == (fd = bson_open (real_filename, O_RDONLY))) { fprintf (stderr, "Failed to bson_open: %s\n", real_filename); abort (); } len = bson_read (fd, buf, sizeof buf); BSON_ASSERT (len > 0); b = bson_new_from_data (buf, (uint32_t) len); bson_close (fd); return b; } static void test_bson_new (void) { bson_t *b; b = bson_new (); ASSERT_CMPUINT32 (b->len, ==, (uint32_t) 5); bson_destroy (b); b = bson_sized_new (32); ASSERT_CMPUINT32 (b->len, ==, (uint32_t) 5); bson_destroy (b); } static void test_bson_alloc (void) { static const uint8_t empty_bson[] = {5, 0, 0, 0, 0}; bson_t *b; b = bson_new (); ASSERT_CMPUINT32 (b->len, ==, (uint32_t) 5); BSON_ASSERT ((b->flags & BSON_FLAG_INLINE)); BSON_ASSERT (!(b->flags & BSON_FLAG_CHILD)); BSON_ASSERT (!(b->flags & BSON_FLAG_STATIC)); BSON_ASSERT (!(b->flags & BSON_FLAG_NO_FREE)); bson_destroy (b); /* * This checks that we fit in the inline buffer size. */ b = bson_sized_new (44); ASSERT_CMPUINT32 (b->len, ==, (uint32_t) 5); BSON_ASSERT ((b->flags & BSON_FLAG_INLINE)); bson_destroy (b); /* * Make sure we grow to next power of 2. */ b = bson_sized_new (121); ASSERT_CMPUINT32 (b->len, ==, (uint32_t) 5); BSON_ASSERT (!(b->flags & BSON_FLAG_INLINE)); bson_destroy (b); /* * Make sure we grow to next power of 2. */ b = bson_sized_new (129); ASSERT_CMPUINT32 (b->len, ==, (uint32_t) 5); BSON_ASSERT (!(b->flags & BSON_FLAG_INLINE)); bson_destroy (b); b = bson_new_from_data (empty_bson, sizeof empty_bson); ASSERT_CMPUINT32 (b->len, ==, (uint32_t) sizeof empty_bson); BSON_ASSERT ((b->flags & BSON_FLAG_INLINE)); BSON_ASSERT (!memcmp (bson_get_data (b), empty_bson, sizeof empty_bson)); bson_destroy (b); } static void BSON_ASSERT_BSON_EQUAL (const bson_t *a, const bson_t *b) { const uint8_t *data1 = bson_get_data (a); const uint8_t *data2 = bson_get_data (b); uint32_t i; if (!bson_equal (a, b)) { for (i = 0; i < BSON_MAX (a->len, b->len); i++) { if (i >= a->len) { printf ("a is too short len=%u\n", a->len); abort (); } else if (i >= b->len) { printf ("b is too short len=%u\n", b->len); abort (); } if (data1[i] != data2[i]) { printf ("a[%u](0x%02x,%u) != b[%u](0x%02x,%u)\n", i, data1[i], data1[i], i, data2[i], data2[i]); abort (); } } } } static void BSON_ASSERT_BSON_EQUAL_FILE (const bson_t *b, const char *filename) { bson_t *b2 = get_bson (filename); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b2); } static void test_bson_append_utf8 (void) { bson_t *b; bson_t *b2; b = bson_new (); b2 = get_bson ("test11.bson"); BSON_ASSERT (bson_append_utf8 (b, "hello", -1, "world", -1)); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_symbol (void) { bson_t *b; bson_t *b2; b = bson_new (); b2 = get_bson ("test32.bson"); BSON_ASSERT (bson_append_symbol (b, "hello", -1, "world", -1)); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_null (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_null (b, "hello", -1)); b2 = get_bson ("test18.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_bool (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_bool (b, "bool", -1, true)); b2 = get_bson ("test19.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_double (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_double (b, "double", -1, 123.4567)); b2 = get_bson ("test20.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_document (void) { bson_t *b; bson_t *b2; b = bson_new (); b2 = bson_new (); BSON_ASSERT (bson_append_document (b, "document", -1, b2)); bson_destroy (b2); b2 = get_bson ("test21.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_oid (void) { bson_oid_t oid; bson_t *b; bson_t *b2; bson_oid_init_from_string (&oid, "1234567890abcdef1234abcd"); b = bson_new (); BSON_ASSERT (bson_append_oid (b, "oid", -1, &oid)); b2 = get_bson ("test22.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_array (void) { bson_t *b; bson_t *b2; b = bson_new (); b2 = bson_new (); BSON_ASSERT (bson_append_utf8 (b2, "0", -1, "hello", -1)); BSON_ASSERT (bson_append_utf8 (b2, "1", -1, "world", -1)); BSON_ASSERT (bson_append_array (b, "array", -1, b2)); bson_destroy (b2); b2 = get_bson ("test23.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_binary (void) { const static uint8_t binary[] = {'1', '2', '3', '4'}; bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT ( bson_append_binary (b, "binary", -1, BSON_SUBTYPE_USER, binary, 4)); b2 = get_bson ("test24.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_binary_deprecated (void) { const static uint8_t binary[] = {'1', '2', '3', '4'}; bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_binary ( b, "binary", -1, BSON_SUBTYPE_BINARY_DEPRECATED, binary, 4)); b2 = get_bson ("binary_deprecated.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_time_t (void) { bson_t *b; bson_t *b2; time_t t; t = 1234567890; b = bson_new (); BSON_ASSERT (bson_append_time_t (b, "time_t", -1, t)); b2 = get_bson ("test26.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_timeval (void) { struct timeval tv = {0}; bson_t *b; bson_t *b2; tv.tv_sec = 1234567890; tv.tv_usec = 0; b = bson_new (); BSON_ASSERT (bson_append_timeval (b, "time_t", -1, &tv)); b2 = get_bson ("test26.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_undefined (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_undefined (b, "undefined", -1)); b2 = get_bson ("test25.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_regex (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_regex (b, "regex", -1, "^abcd", "ilx")); b2 = get_bson ("test27.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_regex_w_len (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_regex_w_len (b, "regex", -1, "^abcd", 5, "ilx")); b2 = get_bson ("test27.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); b = bson_new (); BSON_ASSERT (bson_append_regex_w_len (b, "regex", -1, "^abcd", -1, "ilx")); b2 = get_bson ("test27.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); b = bson_new (); BSON_ASSERT ( bson_append_regex_w_len (b, "regex", -1, "^abcd ", 5, "ilx")); b2 = get_bson ("test27.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_code (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_code (b, "code", -1, "var a = {};")); b2 = get_bson ("test29.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_code_with_scope (void) { const uint8_t *scope_buf = NULL; uint32_t scopelen = 0; uint32_t len = 0; bson_iter_t iter; bool r; const char *code = NULL; bson_t *b; bson_t *b2; bson_t *scope; bson_error_t err; bool eof; bson_reader_t *reader; const bson_t *ticket_bson; uint8_t malformed_data[] = { 0x00, 0x00, 0x00, 0x00, /* length of doc (set below) */ 0x0F, /* code_w_s type */ 0x00, /* empty key */ 0x10, 0x00, 0x00, 0x00, /* code_w_s length (needs to be > 14 for initial */ /* validation so give a non-empty scope doc) */ 0x00, 0x00, 0x00, 0x00, /* invalid string length (must have trailing \0) */ 0x08, 0x00, 0x00, 0x00, /* scope doc length */ 0x08, 0x00, 0x00, /* "" : false */ 0x00, /* end of scope doc */ 0x00 /* end of doc */ }; /* Test with NULL bson, which converts to just CODE type. */ b = bson_new (); BSON_ASSERT ( bson_append_code_with_scope (b, "code", -1, "var a = {};", NULL)); b2 = get_bson ("test30.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); r = bson_iter_init_find (&iter, b, "code"); BSON_ASSERT (r); BSON_ASSERT (BSON_ITER_HOLDS_CODE (&iter)); /* Not codewscope */ bson_destroy (b); bson_destroy (b2); /* Empty scope is still CODEWSCOPE. */ b = bson_new (); scope = bson_new (); BSON_ASSERT ( bson_append_code_with_scope (b, "code", -1, "var a = {};", scope)); b2 = get_bson ("code_w_empty_scope.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); r = bson_iter_init_find (&iter, b, "code"); BSON_ASSERT (r); BSON_ASSERT (BSON_ITER_HOLDS_CODEWSCOPE (&iter)); bson_destroy (b); bson_destroy (b2); bson_destroy (scope); /* Test with non-empty scope */ b = bson_new (); scope = bson_new (); BSON_ASSERT (bson_append_utf8 (scope, "foo", -1, "bar", -1)); BSON_ASSERT ( bson_append_code_with_scope (b, "code", -1, "var a = {};", scope)); b2 = get_bson ("test31.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); r = bson_iter_init_find (&iter, b, "code"); BSON_ASSERT (r); BSON_ASSERT (BSON_ITER_HOLDS_CODEWSCOPE (&iter)); code = bson_iter_codewscope (&iter, &len, &scopelen, &scope_buf); BSON_ASSERT (len == 11); BSON_ASSERT (scopelen == scope->len); BSON_ASSERT (!strcmp (code, "var a = {};")); bson_destroy (b); bson_destroy (b2); bson_destroy (scope); /* CDRIVER-2269 Test with a malformed zero length code string */ malformed_data[0] = (uint8_t) sizeof (malformed_data); b = bson_new_from_data (malformed_data, sizeof (malformed_data)); BSON_ASSERT (b); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (!bson_iter_next (&iter)); bson_destroy (b); /* CDRIVER-2269 Test with malformed BSON from ticket */ reader = bson_reader_new_from_file (BSON_BINARY_DIR "/cdriver2269.bson", &err); BSON_ASSERT (reader); ticket_bson = bson_reader_read (reader, &eof); BSON_ASSERT (ticket_bson); BSON_ASSERT (bson_iter_init (&iter, ticket_bson)); BSON_ASSERT (!bson_iter_next (&iter)); bson_reader_destroy (reader); } static void test_bson_append_dbpointer (void) { bson_oid_t oid; bson_t *b; bson_t *b2; uint8_t malformed_data[] = { 0x0C, 0x00, 0x00, 0x00, /* document length (12) */ 0x0C, /* dbpointer type */ 0x00, /* empty string key */ 0x04, 0x00, 0x00, 0x00, /* string length (4). This is OOB. */ 0x00, /* empty string */ 0x00 /* end of document */ }; size_t error_offset = 0; b = bson_new (); bson_oid_init_from_string (&oid, "0123abcd0123abcd0123abcd"); BSON_ASSERT (bson_append_dbpointer (b, "dbpointer", -1, "foo", &oid)); b2 = get_bson ("test28.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); b = bson_new_from_data (malformed_data, sizeof (malformed_data)); BSON_ASSERT (b); BSON_ASSERT (!bson_validate (b, BSON_VALIDATE_NONE, &error_offset)); BSON_ASSERT (error_offset == 6); bson_destroy (b); } static void test_bson_append_int32 (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_int32 (b, "a", -1, -123)); BSON_ASSERT (bson_append_int32 (b, "c", -1, 0)); BSON_ASSERT (bson_append_int32 (b, "b", -1, 123)); b2 = get_bson ("test33.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_int64 (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_int64 (b, "a", -1, 100000000000000ULL)); b2 = get_bson ("test34.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_decimal128 (void) { bson_t *b; bson_t *b2; bson_decimal128_t value; value.high = 0; value.low = 1; b = bson_new (); BSON_ASSERT (bson_append_decimal128 (b, "a", -1, &value)); b2 = get_bson ("test58.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_iter (void) { bson_iter_t iter; bool r; bson_t b; bson_t c; bson_init (&b); bson_append_int32 (&b, "a", 1, 1); bson_append_int32 (&b, "b", 1, 2); bson_append_int32 (&b, "c", 1, 3); bson_append_utf8 (&b, "d", 1, "hello", 5); bson_init (&c); r = bson_iter_init_find (&iter, &b, "a"); BSON_ASSERT (r); r = bson_append_iter (&c, NULL, 0, &iter); BSON_ASSERT (r); r = bson_iter_init_find (&iter, &b, "c"); BSON_ASSERT (r); r = bson_append_iter (&c, NULL, 0, &iter); BSON_ASSERT (r); r = bson_iter_init_find (&iter, &b, "d"); BSON_ASSERT (r); r = bson_append_iter (&c, "world", -1, &iter); BSON_ASSERT (r); bson_iter_init (&iter, &c); r = bson_iter_next (&iter); BSON_ASSERT (r); ASSERT_CMPSTR ("a", bson_iter_key (&iter)); ASSERT_CMPINT (BSON_TYPE_INT32, ==, bson_iter_type (&iter)); ASSERT_CMPINT (1, ==, bson_iter_int32 (&iter)); r = bson_iter_next (&iter); BSON_ASSERT (r); ASSERT_CMPSTR ("c", bson_iter_key (&iter)); ASSERT_CMPINT (BSON_TYPE_INT32, ==, bson_iter_type (&iter)); ASSERT_CMPINT (3, ==, bson_iter_int32 (&iter)); r = bson_iter_next (&iter); BSON_ASSERT (r); ASSERT_CMPINT (BSON_TYPE_UTF8, ==, bson_iter_type (&iter)); ASSERT_CMPSTR ("world", bson_iter_key (&iter)); ASSERT_CMPSTR ("hello", bson_iter_utf8 (&iter, NULL)); bson_destroy (&b); bson_destroy (&c); } static void test_bson_append_timestamp (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_timestamp (b, "timestamp", -1, 1234, 9876)); b2 = get_bson ("test35.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_maxkey (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_maxkey (b, "maxkey", -1)); b2 = get_bson ("test37.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_minkey (void) { bson_t *b; bson_t *b2; b = bson_new (); BSON_ASSERT (bson_append_minkey (b, "minkey", -1)); b2 = get_bson ("test36.bson"); BSON_ASSERT_BSON_EQUAL (b, b2); bson_destroy (b); bson_destroy (b2); } static void test_bson_append_general (void) { uint8_t bytes[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x23, 0x45}; bson_oid_t oid; bson_t *bson; bson_t *array; bson_t *subdoc; bson = bson_new (); BSON_ASSERT (bson_append_int32 (bson, "int", -1, 1)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test1.bson"); bson_destroy (bson); bson = bson_new (); BSON_ASSERT (bson_append_int64 (bson, "int64", -1, 1)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test2.bson"); bson_destroy (bson); bson = bson_new (); BSON_ASSERT (bson_append_double (bson, "double", -1, 1.123)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test3.bson"); bson_destroy (bson); bson = bson_new (); BSON_ASSERT (bson_append_utf8 (bson, "string", -1, "some string", -1)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test5.bson"); bson_destroy (bson); bson = bson_new (); array = bson_new (); BSON_ASSERT (bson_append_int32 (array, "0", -1, 1)); BSON_ASSERT (bson_append_int32 (array, "1", -1, 2)); BSON_ASSERT (bson_append_int32 (array, "2", -1, 3)); BSON_ASSERT (bson_append_int32 (array, "3", -1, 4)); BSON_ASSERT (bson_append_int32 (array, "4", -1, 5)); BSON_ASSERT (bson_append_int32 (array, "5", -1, 6)); BSON_ASSERT (bson_append_array (bson, "array[int]", -1, array)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test6.bson"); bson_destroy (array); bson_destroy (bson); bson = bson_new (); array = bson_new (); BSON_ASSERT (bson_append_double (array, "0", -1, 1.123)); BSON_ASSERT (bson_append_double (array, "1", -1, 2.123)); BSON_ASSERT (bson_append_array (bson, "array[double]", -1, array)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test7.bson"); bson_destroy (array); bson_destroy (bson); bson = bson_new (); subdoc = bson_new (); BSON_ASSERT (bson_append_int32 (subdoc, "int", -1, 1)); BSON_ASSERT (bson_append_document (bson, "document", -1, subdoc)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test8.bson"); bson_destroy (subdoc); bson_destroy (bson); bson = bson_new (); BSON_ASSERT (bson_append_null (bson, "null", -1)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test9.bson"); bson_destroy (bson); bson = bson_new (); BSON_ASSERT (bson_append_regex (bson, "regex", -1, "1234", "i")); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test10.bson"); bson_destroy (bson); bson = bson_new (); BSON_ASSERT (bson_append_utf8 (bson, "hello", -1, "world", -1)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test11.bson"); bson_destroy (bson); bson = bson_new (); array = bson_new (); BSON_ASSERT (bson_append_utf8 (array, "0", -1, "awesome", -1)); BSON_ASSERT (bson_append_double (array, "1", -1, 5.05)); BSON_ASSERT (bson_append_int32 (array, "2", -1, 1986)); BSON_ASSERT (bson_append_array (bson, "BSON", -1, array)); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test12.bson"); bson_destroy (bson); bson_destroy (array); bson = bson_new (); memcpy (&oid, bytes, sizeof oid); BSON_ASSERT (bson_append_oid (bson, "_id", -1, &oid)); subdoc = bson_new (); BSON_ASSERT (bson_append_oid (subdoc, "_id", -1, &oid)); array = bson_new (); BSON_ASSERT (bson_append_utf8 (array, "0", -1, "1", -1)); BSON_ASSERT (bson_append_utf8 (array, "1", -1, "2", -1)); BSON_ASSERT (bson_append_utf8 (array, "2", -1, "3", -1)); BSON_ASSERT (bson_append_utf8 (array, "3", -1, "4", -1)); BSON_ASSERT (bson_append_array (subdoc, "tags", -1, array)); bson_destroy (array); BSON_ASSERT (bson_append_utf8 (subdoc, "text", -1, "asdfanother", -1)); array = bson_new (); BSON_ASSERT (bson_append_utf8 (array, "name", -1, "blah", -1)); BSON_ASSERT (bson_append_document (subdoc, "source", -1, array)); bson_destroy (array); BSON_ASSERT (bson_append_document (bson, "document", -1, subdoc)); bson_destroy (subdoc); array = bson_new (); BSON_ASSERT (bson_append_utf8 (array, "0", -1, "source", -1)); BSON_ASSERT (bson_append_array (bson, "type", -1, array)); bson_destroy (array); array = bson_new (); BSON_ASSERT (bson_append_utf8 (array, "0", -1, "server_created_at", -1)); BSON_ASSERT (bson_append_array (bson, "missing", -1, array)); bson_destroy (array); BSON_ASSERT_BSON_EQUAL_FILE (bson, "test17.bson"); bson_destroy (bson); } static void test_bson_append_deep (void) { bson_t *a; bson_t *tmp; int i; a = bson_new (); for (i = 0; i < 100; i++) { tmp = a; a = bson_new (); BSON_ASSERT (bson_append_document (a, "a", -1, tmp)); bson_destroy (tmp); } BSON_ASSERT_BSON_EQUAL_FILE (a, "test38.bson"); bson_destroy (a); } static void test_bson_validate_dbref (void) { size_t offset; bson_t dbref, child, child2; /* should fail, $ref without an $id */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); bson_append_document_end (&dbref, &child); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should fail, $ref with non id field */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_UTF8 (&child, "extra", "field"); bson_append_document_end (&dbref, &child); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should fail, $ref with $id at the top */ { bson_init (&dbref); BSON_APPEND_UTF8 (&dbref, "$ref", "foo"); BSON_APPEND_UTF8 (&dbref, "$id", "bar"); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should fail, $ref with $id not first keys */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "extra", "field"); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_UTF8 (&child, "$id", "bar"); bson_append_document_end (&dbref, &child); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should fail, $ref with $db */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_UTF8 (&child, "$db", "bar"); bson_append_document_end (&dbref, &child); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should fail, non-string $ref with $id */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_INT32 (&child, "$ref", 1); BSON_APPEND_UTF8 (&child, "$id", "bar"); bson_append_document_end (&dbref, &child); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should fail, non-string $ref with nothing */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_INT32 (&child, "$ref", 1); bson_append_document_end (&dbref, &child); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should fail, $ref with $id with non-string $db */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_UTF8 (&child, "$id", "bar"); BSON_APPEND_INT32 (&child, "$db", 1); bson_append_document_end (&dbref, &child); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should fail, $ref with $id with non-string $db with stuff after */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_UTF8 (&child, "$id", "bar"); BSON_APPEND_INT32 (&child, "$db", 1); BSON_APPEND_UTF8 (&child, "extra", "field"); bson_append_document_end (&dbref, &child); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should fail, $ref with $id with stuff, then $db */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_UTF8 (&child, "$id", "bar"); BSON_APPEND_UTF8 (&child, "extra", "field"); BSON_APPEND_UTF8 (&child, "$db", "baz"); bson_append_document_end (&dbref, &child); BSON_ASSERT (!bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should succeed, $ref with $id */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_UTF8 (&child, "$id", "bar"); bson_append_document_end (&dbref, &child); BSON_ASSERT (bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should succeed, $ref with nested dbref $id */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_DOCUMENT_BEGIN (&child, "$id", &child2); BSON_APPEND_UTF8 (&child2, "$ref", "foo2"); BSON_APPEND_UTF8 (&child2, "$id", "bar2"); BSON_APPEND_UTF8 (&child2, "$db", "baz2"); bson_append_document_end (&child, &child2); BSON_APPEND_UTF8 (&child, "$db", "baz"); bson_append_document_end (&dbref, &child); BSON_ASSERT (bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should succeed, $ref with $id and $db */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_UTF8 (&child, "$id", "bar"); BSON_APPEND_UTF8 (&child, "$db", "baz"); bson_append_document_end (&dbref, &child); BSON_ASSERT (bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } /* should succeed, $ref with $id and $db and trailing */ { bson_init (&dbref); BSON_APPEND_DOCUMENT_BEGIN (&dbref, "dbref", &child); BSON_APPEND_UTF8 (&child, "$ref", "foo"); BSON_APPEND_UTF8 (&child, "$id", "bar"); BSON_APPEND_UTF8 (&child, "$db", "baz"); BSON_APPEND_UTF8 (&child, "extra", "field"); bson_append_document_end (&dbref, &child); BSON_ASSERT (bson_validate (&dbref, BSON_VALIDATE_DOLLAR_KEYS, &offset)); bson_destroy (&dbref); } } /* BSON spec requires bool value to be exactly 0 or 1 */ static void test_bson_validate_bool (void) { /* {"b": true}, with implicit NULL at end */ uint8_t data[] = "\x09\x00\x00\x00\x08\x62\x00\x01"; bson_t bson; bson_iter_t iter; size_t err_offset = 0; ASSERT (bson_init_static (&bson, data, sizeof data)); ASSERT (bson_validate (&bson, BSON_VALIDATE_NONE, &err_offset)); ASSERT (bson_iter_init (&iter, &bson)); ASSERT (bson_iter_next (&iter)); ASSERT (BSON_ITER_HOLDS_BOOL (&iter)); ASSERT (bson_iter_bool (&iter)); /* replace boolean value 1 with 255 */ ASSERT (data[7] == '\x01'); data[7] = (uint8_t) '\xff'; ASSERT (bson_init_static (&bson, data, 9)); ASSERT (!bson_validate (&bson, BSON_VALIDATE_NONE, &err_offset)); ASSERT_CMPSIZE_T (err_offset, ==, (size_t) 7); ASSERT (bson_iter_init (&iter, &bson)); ASSERT (!bson_iter_next (&iter)); } /* BSON spec requires the deprecated DBPointer's value to be NULL-termed */ static void test_bson_validate_dbpointer (void) { /* { "a": DBPointer(ObjectId(...), Collection="b") }, implicit NULL at end */ uint8_t data[] = "\x1A\x00\x00\x00\x0C\x61\x00\x02\x00\x00\x00\x62\x00" "\x56\xE1\xFC\x72\xE0\xC9\x17\xE9\xC4\x71\x41\x61"; bson_t bson; bson_iter_t iter; size_t err_offset = 0; uint32_t collection_len; const char *collection; const bson_oid_t *oid; ASSERT (bson_init_static (&bson, data, sizeof data)); ASSERT (bson_validate (&bson, BSON_VALIDATE_NONE, &err_offset)); ASSERT (bson_iter_init (&iter, &bson)); ASSERT (bson_iter_next (&iter)); ASSERT (BSON_ITER_HOLDS_DBPOINTER (&iter)); bson_iter_dbpointer (&iter, &collection_len, &collection, &oid); ASSERT_CMPSTR (collection, "b"); ASSERT_CMPINT (collection_len, ==, 1); /* replace the NULL terminator of "b" with 255 */ ASSERT (data[12] == '\0'); data[12] = (uint8_t) '\xff'; ASSERT (bson_init_static (&bson, data, sizeof data)); ASSERT (!bson_validate (&bson, BSON_VALIDATE_NONE, &err_offset)); ASSERT_CMPSIZE_T (err_offset, ==, (size_t) 12); ASSERT (bson_iter_init (&iter, &bson)); ASSERT (!bson_iter_next (&iter)); } static void test_bson_validate (void) { char filename[64]; size_t offset; bson_t *b; int i; bson_error_t error; for (i = 1; i <= 38; i++) { bson_snprintf (filename, sizeof filename, "test%u.bson", i); b = get_bson (filename); BSON_ASSERT (bson_validate (b, BSON_VALIDATE_NONE, &offset)); bson_destroy (b); } b = get_bson ("codewscope.bson"); BSON_ASSERT (bson_validate (b, BSON_VALIDATE_NONE, &offset)); bson_destroy (b); b = get_bson ("empty_key.bson"); BSON_ASSERT (bson_validate (b, BSON_VALIDATE_NONE | BSON_VALIDATE_UTF8 | BSON_VALIDATE_DOLLAR_KEYS | BSON_VALIDATE_DOT_KEYS, &offset)); bson_destroy (b); #define VALIDATE_TEST(_filename, _flags, _offset, _flag, _msg) \ b = get_bson (_filename); \ BSON_ASSERT (!bson_validate (b, _flags, &offset)); \ ASSERT_CMPSIZE_T (offset, ==, (size_t) _offset); \ BSON_ASSERT (!bson_validate_with_error (b, _flags, &error)); \ ASSERT_ERROR_CONTAINS (error, BSON_ERROR_INVALID, _flag, _msg); \ bson_destroy (b) VALIDATE_TEST ("overflow2.bson", BSON_VALIDATE_NONE, 9, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ("trailingnull.bson", BSON_VALIDATE_NONE, 14, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ("dollarquery.bson", BSON_VALIDATE_DOLLAR_KEYS | BSON_VALIDATE_DOT_KEYS, 4, BSON_VALIDATE_DOLLAR_KEYS, "keys cannot begin with \"$\": \"$query\""); VALIDATE_TEST ("dotquery.bson", BSON_VALIDATE_DOLLAR_KEYS | BSON_VALIDATE_DOT_KEYS, 4, BSON_VALIDATE_DOT_KEYS, "keys cannot contain \".\": \"abc.def\""); VALIDATE_TEST ("overflow3.bson", BSON_VALIDATE_NONE, 9, BSON_VALIDATE_NONE, "corrupt BSON"); /* same outcome as above, despite different flags */ VALIDATE_TEST ("overflow3.bson", BSON_VALIDATE_UTF8, 9, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ("overflow4.bson", BSON_VALIDATE_NONE, 9, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ("empty_key.bson", BSON_VALIDATE_EMPTY_KEYS, 4, BSON_VALIDATE_EMPTY_KEYS, "empty key"); VALIDATE_TEST ( "test40.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test41.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test42.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test43.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test44.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test45.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test46.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test47.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test48.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test49.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ("test50.bson", BSON_VALIDATE_NONE, 10, BSON_VALIDATE_NONE, "corrupt code-with-scope"); VALIDATE_TEST ("test51.bson", BSON_VALIDATE_NONE, 10, BSON_VALIDATE_NONE, "corrupt code-with-scope"); VALIDATE_TEST ( "test52.bson", BSON_VALIDATE_NONE, 9, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test53.bson", BSON_VALIDATE_NONE, 6, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ("test54.bson", BSON_VALIDATE_NONE, 12, BSON_VALIDATE_NONE, "corrupt BSON"); VALIDATE_TEST ( "test59.bson", BSON_VALIDATE_NONE, 9, BSON_VALIDATE_NONE, "corrupt BSON"); /* DBRef validation */ b = BCON_NEW ("my_dbref", "{", "$ref", BCON_UTF8 ("collection"), "$id", BCON_INT32 (1), "}"); BSON_ASSERT (bson_validate_with_error (b, BSON_VALIDATE_NONE, &error)); BSON_ASSERT ( bson_validate_with_error (b, BSON_VALIDATE_DOLLAR_KEYS, &error)); bson_destroy (b); /* needs "$ref" before "$id" */ b = BCON_NEW ("my_dbref", "{", "$id", BCON_INT32 (1), "}"); BSON_ASSERT (bson_validate_with_error (b, BSON_VALIDATE_NONE, &error)); BSON_ASSERT ( !bson_validate_with_error (b, BSON_VALIDATE_DOLLAR_KEYS, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_INVALID, BSON_VALIDATE_DOLLAR_KEYS, "keys cannot begin with \"$\": \"$id\""); bson_destroy (b); /* two $refs */ b = BCON_NEW ("my_dbref", "{", "$ref", BCON_UTF8 ("collection"), "$ref", BCON_UTF8 ("collection"), "}"); BSON_ASSERT (bson_validate_with_error (b, BSON_VALIDATE_NONE, &error)); BSON_ASSERT ( !bson_validate_with_error (b, BSON_VALIDATE_DOLLAR_KEYS, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_INVALID, BSON_VALIDATE_DOLLAR_KEYS, "keys cannot begin with \"$\": \"$ref\""); bson_destroy (b); /* must not contain invalid key like "extra" */ b = BCON_NEW ("my_dbref", "{", "$ref", BCON_UTF8 ("collection"), "extra", BCON_INT32 (2), "$id", BCON_INT32 (1), "}"); BSON_ASSERT (bson_validate_with_error (b, BSON_VALIDATE_NONE, &error)); BSON_ASSERT ( !bson_validate_with_error (b, BSON_VALIDATE_DOLLAR_KEYS, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_INVALID, BSON_VALIDATE_DOLLAR_KEYS, "invalid key within DBRef subdocument: \"extra\""); bson_destroy (b); #undef VALIDATE_TEST } static void test_bson_init (void) { bson_t b; char key[12]; int i; bson_init (&b); BSON_ASSERT ((b.flags & BSON_FLAG_INLINE)); BSON_ASSERT ((b.flags & BSON_FLAG_STATIC)); BSON_ASSERT (!(b.flags & BSON_FLAG_RDONLY)); for (i = 0; i < 100; i++) { bson_snprintf (key, sizeof key, "%d", i); BSON_ASSERT (bson_append_utf8 (&b, key, -1, "bar", -1)); } BSON_ASSERT (!(b.flags & BSON_FLAG_INLINE)); bson_destroy (&b); } static void test_bson_init_static (void) { static const uint8_t data[5] = {5}; bson_t b; ASSERT (bson_init_static (&b, data, sizeof data)); BSON_ASSERT ((b.flags & BSON_FLAG_RDONLY)); bson_destroy (&b); } static void test_bson_new_from_buffer (void) { bson_t *b; uint8_t *buf = bson_malloc0 (5); size_t len = 5; uint32_t len_le = BSON_UINT32_TO_LE (5); memcpy (buf, &len_le, sizeof (len_le)); b = bson_new_from_buffer (&buf, &len, bson_realloc_ctx, NULL); BSON_ASSERT (b->flags & BSON_FLAG_NO_FREE); BSON_ASSERT (len == 5); BSON_ASSERT (b->len == 5); bson_append_utf8 (b, "hello", -1, "world", -1); BSON_ASSERT (len == 32); BSON_ASSERT (b->len == 22); bson_destroy (b); bson_free (buf); buf = NULL; len = 0; b = bson_new_from_buffer (&buf, &len, bson_realloc_ctx, NULL); BSON_ASSERT (b->flags & BSON_FLAG_NO_FREE); BSON_ASSERT (len == 5); BSON_ASSERT (b->len == 5); bson_destroy (b); bson_free (buf); } static void test_bson_utf8_key (void) { /* euro currency symbol */ #define EU "\xe2\x82\xac" #define FIVE_EUROS EU EU EU EU EU uint32_t length; bson_iter_t iter; const char *str; bson_t *b; size_t offset; b = get_bson ("eurokey.bson"); BSON_ASSERT (bson_validate (b, BSON_VALIDATE_NONE, &offset)); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (!strcmp (bson_iter_key (&iter), FIVE_EUROS)); str = bson_iter_utf8 (&iter, &length); BSON_ASSERT (str); BSON_ASSERT (length == 15); /* 5 3-byte sequences. */ BSON_ASSERT (!strcmp (str, FIVE_EUROS)); bson_destroy (b); } static void test_bson_new_1mm (void) { bson_t *b; int i; for (i = 0; i < 1000000; i++) { b = bson_new (); bson_destroy (b); } } static void test_bson_init_1mm (void) { bson_t b; int i; for (i = 0; i < 1000000; i++) { bson_init (&b); bson_destroy (&b); } } static void test_bson_build_child (void) { bson_t b; bson_t child; bson_t *b2; bson_t *child2; bson_init (&b); BSON_ASSERT (bson_append_document_begin (&b, "foo", -1, &child)); BSON_ASSERT (bson_append_utf8 (&child, "bar", -1, "baz", -1)); BSON_ASSERT (bson_append_document_end (&b, &child)); b2 = bson_new (); child2 = bson_new (); BSON_ASSERT (bson_append_utf8 (child2, "bar", -1, "baz", -1)); BSON_ASSERT (bson_append_document (b2, "foo", -1, child2)); bson_destroy (child2); BSON_ASSERT (b.len == b2->len); BSON_ASSERT_BSON_EQUAL (&b, b2); bson_destroy (&b); bson_destroy (b2); } static void test_bson_build_child_array (void) { bson_t b; bson_t child; bson_t *b2; bson_t *child2; bson_init (&b); BSON_ASSERT (bson_append_array_begin (&b, "foo", -1, &child)); BSON_ASSERT (bson_append_utf8 (&child, "0", -1, "baz", -1)); BSON_ASSERT (bson_append_array_end (&b, &child)); b2 = bson_new (); child2 = bson_new (); BSON_ASSERT (bson_append_utf8 (child2, "0", -1, "baz", -1)); BSON_ASSERT (bson_append_array (b2, "foo", -1, child2)); bson_destroy (child2); BSON_ASSERT (b.len == b2->len); BSON_ASSERT_BSON_EQUAL (&b, b2); bson_destroy (&b); bson_destroy (b2); } static void test_bson_build_child_deep_1 (bson_t *b, int *count) { bson_t child; (*count)++; BSON_ASSERT (bson_append_document_begin (b, "b", -1, &child)); BSON_ASSERT (!(b->flags & BSON_FLAG_INLINE)); BSON_ASSERT ((b->flags & BSON_FLAG_IN_CHILD)); BSON_ASSERT (!(child.flags & BSON_FLAG_INLINE)); BSON_ASSERT ((child.flags & BSON_FLAG_STATIC)); BSON_ASSERT ((child.flags & BSON_FLAG_CHILD)); if (*count < 100) { test_bson_build_child_deep_1 (&child, count); } else { BSON_ASSERT (bson_append_int32 (&child, "b", -1, 1234)); } BSON_ASSERT (bson_append_document_end (b, &child)); BSON_ASSERT (!(b->flags & BSON_FLAG_IN_CHILD)); } static void test_bson_build_child_deep (void) { union { bson_t b; bson_impl_alloc_t a; } u; int count = 0; bson_init (&u.b); BSON_ASSERT ((u.b.flags & BSON_FLAG_INLINE)); test_bson_build_child_deep_1 (&u.b, &count); BSON_ASSERT (!(u.b.flags & BSON_FLAG_INLINE)); BSON_ASSERT ((u.b.flags & BSON_FLAG_STATIC)); BSON_ASSERT (!(u.b.flags & BSON_FLAG_NO_FREE)); BSON_ASSERT (!(u.b.flags & BSON_FLAG_RDONLY)); BSON_ASSERT (bson_validate (&u.b, BSON_VALIDATE_NONE, NULL)); BSON_ASSERT (((bson_impl_alloc_t *) &u.b)->alloclen == 1024); BSON_ASSERT_BSON_EQUAL_FILE (&u.b, "test39.bson"); bson_destroy (&u.b); } static void test_bson_build_child_deep_no_begin_end_1 (bson_t *b, int *count) { bson_t child; (*count)++; bson_init (&child); if (*count < 100) { test_bson_build_child_deep_1 (&child, count); } else { BSON_ASSERT (bson_append_int32 (&child, "b", -1, 1234)); } BSON_ASSERT (bson_append_document (b, "b", -1, &child)); bson_destroy (&child); } static void test_bson_build_child_deep_no_begin_end (void) { union { bson_t b; bson_impl_alloc_t a; } u; int count = 0; bson_init (&u.b); test_bson_build_child_deep_no_begin_end_1 (&u.b, &count); BSON_ASSERT (bson_validate (&u.b, BSON_VALIDATE_NONE, NULL)); BSON_ASSERT (u.a.alloclen == 1024); BSON_ASSERT_BSON_EQUAL_FILE (&u.b, "test39.bson"); bson_destroy (&u.b); } static void test_bson_count_keys (void) { bson_t b; bson_init (&b); BSON_ASSERT (bson_append_int32 (&b, "0", -1, 0)); BSON_ASSERT (bson_append_int32 (&b, "1", -1, 1)); BSON_ASSERT (bson_append_int32 (&b, "2", -1, 2)); ASSERT_CMPINT (bson_count_keys (&b), ==, 3); bson_destroy (&b); } static void test_bson_copy (void) { bson_t b; bson_t *c; bson_init (&b); BSON_ASSERT (bson_append_int32 (&b, "foobar", -1, 1234)); c = bson_copy (&b); BSON_ASSERT_BSON_EQUAL (&b, c); bson_destroy (c); bson_destroy (&b); } static void test_bson_copy_to (void) { bson_t b; bson_t c; int i; /* * Test inline structure copy. */ bson_init (&b); BSON_ASSERT (bson_append_int32 (&b, "foobar", -1, 1234)); bson_copy_to (&b, &c); BSON_ASSERT_BSON_EQUAL (&b, &c); bson_destroy (&c); bson_destroy (&b); /* * Test malloced copy. */ bson_init (&b); for (i = 0; i < 1000; i++) { BSON_ASSERT (bson_append_int32 (&b, "foobar", -1, 1234)); } bson_copy_to (&b, &c); BSON_ASSERT_BSON_EQUAL (&b, &c); bson_destroy (&c); bson_destroy (&b); } static void test_bson_copy_to_excluding_noinit (void) { bson_iter_t iter; bool r; bson_t b; bson_t c; int i; bson_init (&b); bson_append_int32 (&b, "a", 1, 1); bson_append_int32 (&b, "b", 1, 2); bson_init (&c); bson_copy_to_excluding_noinit (&b, &c, "b", NULL); r = bson_iter_init_find (&iter, &c, "a"); BSON_ASSERT (r); r = bson_iter_init_find (&iter, &c, "b"); BSON_ASSERT (!r); i = bson_count_keys (&b); ASSERT_CMPINT (i, ==, 2); i = bson_count_keys (&c); ASSERT_CMPINT (i, ==, 1); bson_destroy (&b); bson_destroy (&c); } static void test_bson_append_overflow (void) { const char *key = "a"; uint32_t len; bson_t b; len = BSON_MAX_SIZE; len -= 4; /* len */ len -= 1; /* type */ len -= 1; /* value */ len -= 1; /* end byte */ bson_init (&b); BSON_ASSERT (!bson_append_bool (&b, key, len, true)); bson_destroy (&b); } static void test_bson_initializer (void) { bson_t b = BSON_INITIALIZER; BSON_ASSERT (bson_empty (&b)); bson_append_bool (&b, "foo", -1, true); BSON_ASSERT (!bson_empty (&b)); bson_destroy (&b); } static void test_bson_concat (void) { bson_t a = BSON_INITIALIZER; bson_t b = BSON_INITIALIZER; bson_t c = BSON_INITIALIZER; bson_append_int32 (&a, "abc", 3, 1); bson_append_int32 (&b, "def", 3, 1); bson_concat (&a, &b); bson_append_int32 (&c, "abc", 3, 1); bson_append_int32 (&c, "def", 3, 1); BSON_ASSERT (0 == bson_compare (&c, &a)); bson_destroy (&a); bson_destroy (&b); bson_destroy (&c); } static void test_bson_reinit (void) { bson_t b = BSON_INITIALIZER; int i; for (i = 0; i < 1000; i++) { bson_append_int32 (&b, "", 0, i); } bson_reinit (&b); for (i = 0; i < 1000; i++) { bson_append_int32 (&b, "", 0, i); } bson_destroy (&b); } static void test_bson_macros (void) { const uint8_t data[] = {1, 2, 3, 4}; bson_t b = BSON_INITIALIZER; bson_t ar = BSON_INITIALIZER; bson_decimal128_t dec; bson_oid_t oid; struct timeval tv; time_t t; dec.high = 0x3040000000000000ULL; dec.low = 0x0ULL; t = time (NULL); #ifdef BSON_OS_WIN32 tv.tv_sec = (long) t; #else tv.tv_sec = t; #endif tv.tv_usec = 0; bson_oid_init (&oid, NULL); BSON_APPEND_ARRAY (&b, "0", &ar); BSON_APPEND_BINARY (&b, "1", 0, data, sizeof data); BSON_APPEND_BOOL (&b, "2", true); BSON_APPEND_CODE (&b, "3", "function(){}"); BSON_APPEND_CODE_WITH_SCOPE (&b, "4", "function(){}", &ar); BSON_APPEND_DOUBLE (&b, "6", 123.45); BSON_APPEND_DOCUMENT (&b, "7", &ar); BSON_APPEND_INT32 (&b, "8", 123); BSON_APPEND_INT64 (&b, "9", 456); BSON_APPEND_MINKEY (&b, "10"); BSON_APPEND_MAXKEY (&b, "11"); BSON_APPEND_NULL (&b, "12"); BSON_APPEND_OID (&b, "13", &oid); BSON_APPEND_REGEX (&b, "14", "^abc", "i"); BSON_APPEND_UTF8 (&b, "15", "utf8"); BSON_APPEND_SYMBOL (&b, "16", "symbol"); BSON_APPEND_TIME_T (&b, "17", t); BSON_APPEND_TIMEVAL (&b, "18", &tv); BSON_APPEND_DATE_TIME (&b, "19", 123); BSON_APPEND_TIMESTAMP (&b, "20", 123, 0); BSON_APPEND_UNDEFINED (&b, "21"); BSON_APPEND_DECIMAL128 (&b, "22", &dec); bson_destroy (&b); bson_destroy (&ar); } static void test_bson_clear (void) { bson_t *doc = NULL; bson_clear (&doc); BSON_ASSERT (doc == NULL); doc = bson_new (); BSON_ASSERT (doc != NULL); bson_clear (&doc); BSON_ASSERT (doc == NULL); } static void bloat (bson_t *b) { uint32_t i; char buf[16]; const char *key; for (i = 0; i < 100; i++) { bson_uint32_to_string (i, &key, buf, sizeof buf); BSON_APPEND_UTF8 (b, key, "long useless value foo bar baz quux quizzle"); } /* spilled over */ ASSERT (!(b->flags & BSON_FLAG_INLINE)); } static void test_bson_steal (void) { bson_t stack_alloced; bson_t *heap_alloced; bson_t dst; uint8_t *alloc; uint8_t *buf; size_t len; uint32_t len_le; /* inline, stack-allocated */ bson_init (&stack_alloced); BSON_APPEND_INT32 (&stack_alloced, "a", 1); ASSERT (bson_steal (&dst, &stack_alloced)); ASSERT (bson_has_field (&dst, "a")); ASSERT (dst.flags & BSON_FLAG_INLINE); /* src was invalidated */ ASSERT (!bson_validate (&stack_alloced, BSON_VALIDATE_NONE, 0)); bson_destroy (&dst); /* spilled over, stack-allocated */ bson_init (&stack_alloced); bloat (&stack_alloced); alloc = ((bson_impl_alloc_t *) &stack_alloced)->alloc; ASSERT (bson_steal (&dst, &stack_alloced)); /* data was transferred */ ASSERT (alloc == ((bson_impl_alloc_t *) &dst)->alloc); ASSERT (bson_has_field (&dst, "99")); ASSERT (!(dst.flags & BSON_FLAG_INLINE)); ASSERT (!bson_validate (&stack_alloced, BSON_VALIDATE_NONE, 0)); bson_destroy (&dst); /* inline, heap-allocated */ heap_alloced = bson_new (); BSON_APPEND_INT32 (heap_alloced, "a", 1); ASSERT (bson_steal (&dst, heap_alloced)); ASSERT (bson_has_field (&dst, "a")); ASSERT (dst.flags & BSON_FLAG_INLINE); bson_destroy (&dst); /* spilled over, heap-allocated */ heap_alloced = bson_new (); bloat (heap_alloced); alloc = ((bson_impl_alloc_t *) heap_alloced)->alloc; ASSERT (bson_steal (&dst, heap_alloced)); /* data was transferred */ ASSERT (alloc == ((bson_impl_alloc_t *) &dst)->alloc); ASSERT (bson_has_field (&dst, "99")); ASSERT (!(dst.flags & BSON_FLAG_INLINE)); bson_destroy (&dst); /* test stealing from a bson created with bson_new_from_buffer */ buf = bson_malloc0 (5); len = 5; len_le = BSON_UINT32_TO_LE (5); memcpy (buf, &len_le, sizeof (len_le)); heap_alloced = bson_new_from_buffer (&buf, &len, bson_realloc_ctx, NULL); ASSERT (bson_steal (&dst, heap_alloced)); ASSERT (dst.flags & BSON_FLAG_NO_FREE); ASSERT (dst.flags & BSON_FLAG_STATIC); ASSERT (((bson_impl_alloc_t *) &dst)->realloc == bson_realloc_ctx); ASSERT (((bson_impl_alloc_t *) &dst)->realloc_func_ctx == NULL); bson_destroy (&dst); bson_free (buf); } static void BSON_ASSERT_KEY_AND_VALUE (const bson_t *bson) { bson_iter_t iter; ASSERT (bson_iter_init_find (&iter, bson, "key")); ASSERT (BSON_ITER_HOLDS_UTF8 (&iter)); ASSERT_CMPSTR ("value", bson_iter_utf8 (&iter, NULL)); } static void test_bson_reserve_buffer (void) { bson_t src = BSON_INITIALIZER; bson_t stack_alloced; bson_t *heap_alloced; uint8_t *buf; /* inline, stack-allocated */ bson_init (&stack_alloced); BSON_APPEND_UTF8 (&src, "key", "value"); ASSERT ((buf = bson_reserve_buffer (&stack_alloced, src.len))); ASSERT_CMPUINT32 (src.len, ==, stack_alloced.len); ASSERT (stack_alloced.flags & BSON_FLAG_INLINE); memcpy (buf, ((bson_impl_inline_t *) &src)->data, src.len); /* data was transferred */ BSON_ASSERT_KEY_AND_VALUE (&stack_alloced); bson_destroy (&stack_alloced); /* spilled over, stack-allocated */ bloat (&src); bson_init (&stack_alloced); ASSERT ((buf = bson_reserve_buffer (&stack_alloced, src.len))); ASSERT_CMPUINT32 (src.len, ==, stack_alloced.len); ASSERT (!(stack_alloced.flags & BSON_FLAG_INLINE)); memcpy (buf, ((bson_impl_alloc_t *) &src)->alloc, src.len); BSON_ASSERT_KEY_AND_VALUE (&stack_alloced); ASSERT (bson_has_field (&stack_alloced, "99")); bson_destroy (&src); bson_destroy (&stack_alloced); /* inline, heap-allocated */ heap_alloced = bson_new (); bson_init (&src); BSON_APPEND_UTF8 (&src, "key", "value"); ASSERT ((buf = bson_reserve_buffer (heap_alloced, src.len))); ASSERT_CMPUINT32 (src.len, ==, heap_alloced->len); ASSERT (heap_alloced->flags & BSON_FLAG_INLINE); memcpy (buf, ((bson_impl_inline_t *) &src)->data, src.len); BSON_ASSERT_KEY_AND_VALUE (heap_alloced); bson_destroy (heap_alloced); /* spilled over, heap-allocated */ heap_alloced = bson_new (); bloat (&src); ASSERT ((buf = bson_reserve_buffer (heap_alloced, src.len))); ASSERT_CMPUINT32 (src.len, ==, heap_alloced->len); ASSERT (!(heap_alloced->flags & BSON_FLAG_INLINE)); memcpy (buf, ((bson_impl_alloc_t *) &src)->alloc, src.len); BSON_ASSERT_KEY_AND_VALUE (heap_alloced); ASSERT (bson_has_field (heap_alloced, "99")); bson_destroy (&src); bson_destroy (heap_alloced); } static void test_bson_reserve_buffer_errors (void) { bson_t bson = BSON_INITIALIZER; bson_t child; uint8_t data[5] = {0}; uint32_t len_le; /* too big */ ASSERT (!bson_reserve_buffer (&bson, (uint32_t) (INT32_MAX - bson.len - 1))); /* make a static bson, it refuses bson_reserve_buffer since it's read-only */ bson_destroy (&bson); len_le = BSON_UINT32_TO_LE (5); memcpy (data, &len_le, sizeof (len_le)); ASSERT (bson_init_static (&bson, data, sizeof data)); ASSERT (!bson_reserve_buffer (&bson, 10)); /* parent's and child's buffers are locked */ bson_init (&bson); BSON_APPEND_DOCUMENT_BEGIN (&bson, "child", &child); ASSERT (!bson_reserve_buffer (&bson, 10)); ASSERT (!bson_reserve_buffer (&child, 10)); /* unlock parent's buffer */ bson_append_document_end (&bson, &child); ASSERT (bson_reserve_buffer (&bson, 10)); bson_destroy (&bson); } static void test_bson_destroy_with_steal (void) { bson_t *b1; bson_t b2; uint32_t len = 0; uint8_t *data; int i; b1 = bson_new (); for (i = 0; i < 100; i++) { BSON_APPEND_INT32 (b1, "some-key", i); } data = bson_destroy_with_steal (b1, true, &len); BSON_ASSERT (data); BSON_ASSERT (len == 1405); bson_free (data); data = NULL; bson_init (&b2); len = 0; for (i = 0; i < 100; i++) { BSON_APPEND_INT32 (&b2, "some-key", i); } BSON_ASSERT (!bson_destroy_with_steal (&b2, false, &len)); BSON_ASSERT (len == 1405); bson_init (&b2); BSON_ASSERT (!bson_destroy_with_steal (&b2, false, NULL)); bson_init (&b2); data = bson_destroy_with_steal (&b2, true, &len); BSON_ASSERT (data); BSON_ASSERT (len == 5); bson_free (data); data = NULL; } static void test_bson_has_field (void) { bson_t *b; bool r; b = BCON_NEW ("foo", "[", "{", "bar", BCON_INT32 (1), "}", "]"); r = bson_has_field (b, "foo"); BSON_ASSERT (r); r = bson_has_field (b, "foo.0"); BSON_ASSERT (r); r = bson_has_field (b, "foo.0.bar"); BSON_ASSERT (r); r = bson_has_field (b, "0"); BSON_ASSERT (!r); r = bson_has_field (b, "bar"); BSON_ASSERT (!r); r = bson_has_field (b, "0.bar"); BSON_ASSERT (!r); bson_destroy (b); } static void test_next_power_of_two (void) { size_t s; s = 3; s = bson_next_power_of_two (s); BSON_ASSERT (s == 4); s = 4; s = bson_next_power_of_two (s); BSON_ASSERT (s == 4); s = 33; s = bson_next_power_of_two (s); BSON_ASSERT (s == 64); s = 91; s = bson_next_power_of_two (s); BSON_ASSERT (s == 128); s = 939524096UL; s = bson_next_power_of_two (s); BSON_ASSERT (s == 1073741824); s = 1073741824UL; s = bson_next_power_of_two (s); BSON_ASSERT (s == 1073741824UL); #if BSON_WORD_SIZE == 64 s = 4294967296LL; s = bson_next_power_of_two (s); BSON_ASSERT (s == 4294967296LL); s = 4294967297LL; s = bson_next_power_of_two (s); BSON_ASSERT (s == 8589934592LL); s = 17179901952LL; s = bson_next_power_of_two (s); BSON_ASSERT (s == 34359738368LL); s = 9223372036854775807ULL; s = bson_next_power_of_two (s); BSON_ASSERT (s == 9223372036854775808ULL); s = 36028795806651656ULL; s = bson_next_power_of_two (s); BSON_ASSERT (s == 36028797018963968ULL); #endif } void visit_corrupt (const bson_iter_t *iter, void *data) { BSON_UNUSED (iter); *((bool *) data) = true; } static void test_bson_visit_invalid_field (void) { /* key is invalid utf-8 char: {"\x80": 1} */ const char data[] = "\x0c\x00\x00\x00\x10\x80\x00\x01\x00\x00\x00\x00"; bson_t b; bson_iter_t iter; bson_visitor_t visitor = {0}; bool visited = false; visitor.visit_corrupt = visit_corrupt; BSON_ASSERT (bson_init_static (&b, (const uint8_t *) data, sizeof data - 1)); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (!bson_iter_visit_all (&iter, &visitor, (void *) &visited)); BSON_ASSERT (visited); } typedef struct { bool visited; const char *key; uint32_t type_code; } unsupported_type_test_data_t; void visit_unsupported_type (const bson_iter_t *iter, const char *key, uint32_t type_code, void *data) { unsupported_type_test_data_t *context; BSON_UNUSED (iter); context = (unsupported_type_test_data_t *) data; context->visited = true; context->key = key; context->type_code = type_code; } static void test_bson_visit_unsupported_type (void) { /* {k: 1}, but instead of BSON type 0x10 (int32), use unknown type 0x33 */ const char data[] = "\x0c\x00\x00\x00\x33k\x00\x01\x00\x00\x00\x00"; bson_t b; bson_iter_t iter; unsupported_type_test_data_t context = {0}; bson_visitor_t visitor = {0}; visitor.visit_unsupported_type = visit_unsupported_type; BSON_ASSERT (bson_init_static (&b, (const uint8_t *) data, sizeof data - 1)); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (!bson_iter_visit_all (&iter, &visitor, (void *) &context)); BSON_ASSERT (!bson_iter_next (&iter)); BSON_ASSERT (context.visited); BSON_ASSERT (!strcmp (context.key, "k")); BSON_ASSERT (context.type_code == '\x33'); } static void test_bson_visit_unsupported_type_bad_key (void) { /* key is invalid utf-8 char, '\x80' */ const char data[] = "\x0c\x00\x00\x00\x33\x80\x00\x01\x00\x00\x00\x00"; bson_t b; bson_iter_t iter; unsupported_type_test_data_t context = {0}; bson_visitor_t visitor = {0}; visitor.visit_unsupported_type = visit_unsupported_type; BSON_ASSERT (bson_init_static (&b, (const uint8_t *) data, sizeof data - 1)); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (!bson_iter_visit_all (&iter, &visitor, (void *) &context)); BSON_ASSERT (!bson_iter_next (&iter)); /* unsupported type error wasn't reported, because the bson is corrupt */ BSON_ASSERT (!context.visited); } static void test_bson_visit_unsupported_type_empty_key (void) { /* {"": 1}, but instead of BSON type 0x10 (int32), use unknown type 0x33 */ const char data[] = "\x0b\x00\x00\x00\x33\x00\x01\x00\x00\x00\x00"; bson_t b; bson_iter_t iter; unsupported_type_test_data_t context = {0}; bson_visitor_t visitor = {0}; visitor.visit_unsupported_type = visit_unsupported_type; BSON_ASSERT (bson_init_static (&b, (const uint8_t *) data, sizeof data - 1)); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (!bson_iter_visit_all (&iter, &visitor, (void *) &context)); BSON_ASSERT (!bson_iter_next (&iter)); BSON_ASSERT (context.visited); BSON_ASSERT (!strcmp (context.key, "")); BSON_ASSERT (context.type_code == '\x33'); } static void test_bson_subtype_2 (void) { bson_t b; /* taken from BSON Corpus Tests */ const char ok[] = "\x13\x00\x00\x00\x05\x78\x00\x06\x00\x00\x00\x02\x02\x00" "\x00\x00\xff\xff\x00"; /* Deprecated subtype 0x02 includes a redundant length inside the binary * payload. Check that we validate this length. */ const char len_too_long[] = "\x13\x00\x00\x00\x05\x78\x00\x06\x00\x00\x00" "\x02\x03\x00\x00\x00\xFF\xFF\x00"; const char len_too_short[] = "\x13\x00\x00\x00\x05\x78\x00\x06\x00\x00\x00" "\x02\x01\x00\x00\x00\xFF\xFF\x00"; const char len_negative[] = "\x13\x00\x00\x00\x05\x78\x00\x06\x00\x00\x00" "\x02\xFF\xFF\xFF\xFF\xFF\xFF\x00"; bson_t *bson_ok = BCON_NEW ("x", BCON_BIN (2, (uint8_t *) "\xff\xff", 2)); BSON_ASSERT (bson_init_static (&b, (uint8_t *) ok, sizeof (ok) - 1)); BSON_ASSERT (bson_validate (&b, BSON_VALIDATE_NONE, 0)); BSON_ASSERT (0 == bson_compare (&b, bson_ok)); BSON_ASSERT (bson_init_static ( &b, (uint8_t *) len_too_long, sizeof (len_too_long) - 1)); BSON_ASSERT (!bson_validate (&b, BSON_VALIDATE_NONE, 0)); BSON_ASSERT (bson_init_static ( &b, (uint8_t *) len_too_short, sizeof (len_too_short) - 1)); BSON_ASSERT (!bson_validate (&b, BSON_VALIDATE_NONE, 0)); BSON_ASSERT (bson_init_static ( &b, (uint8_t *) len_negative, sizeof (len_negative) - 1)); BSON_ASSERT (!bson_validate (&b, BSON_VALIDATE_NONE, 0)); bson_destroy (bson_ok); } /* CDRIVER-2455 Off-by-one error while appending regex */ void test_bson_regex_lengths (void) { bson_t new = BSON_INITIALIZER; bson_oid_t oid; bson_oid_init_from_string (&oid, "1234567890abcdef12345678"); bson_append_oid (&new, "0123456", -1, &oid); bson_append_regex (&new, "0_________1_________2_________3___4", -1, "0_________1_________2_________3_________4_________5___4", "i"); ASSERT (new.len == 121); ASSERT (new.flags &BSON_FLAG_STATIC); ASSERT (!(new.flags &BSON_FLAG_INLINE)); bson_destroy (&new); } void test_bson_empty_binary (void) { uint8_t data = 0xAB; bson_t test; const bson_value_t *value; bson_value_t copy; bson_iter_t iter; bson_init (&test); bson_append_binary (&test, "test", 4, BSON_SUBTYPE_BINARY, &data, 0); BSON_ASSERT (bson_iter_init_find (&iter, &test, "test")); value = bson_iter_value (&iter); /* CDRIVER-2569, this would memcpy (0 bytes) to a NULL destination. */ bson_value_copy (value, ©); bson_value_destroy (©); bson_destroy (&test); } void test_bson_iter_key_len (void) { bson_t *bson = bson_with_all_types (); bson_iter_t iter; BSON_ASSERT (bson_iter_init (&iter, bson)); while (bson_iter_next (&iter)) { ASSERT_WITH_MSG (strlen (bson_iter_key (&iter)) == bson_iter_key_len (&iter), "iter_key_len differs from real key length. got %d but " "expected %d for key %s\n", bson_iter_key_len (&iter), (int) strlen (bson_iter_key (&iter)), bson_iter_key (&iter)); } } void test_bson_iter_init_from_data_at_offset (void) { bson_t *bson = bson_with_all_types (); /* zero out iter, since bson_iter_init doesn't zero out iter->value. */ bson_iter_t iter = {0}; BSON_ASSERT (bson_iter_init (&iter, bson)); ASSERT_CMPINT (bson_iter_offset (&iter), ==, 0); while (bson_iter_next (&iter)) { const uint8_t *data = bson_get_data (bson); int keylen = bson_iter_key_len (&iter); uint32_t offset = bson_iter_offset (&iter); bson_iter_t recreated = {0}; BSON_ASSERT (bson_iter_init_from_data_at_offset ( &recreated, data, bson->len, offset, keylen)); if (memcmp ((void *) &iter, (void *) &recreated, sizeof (bson_iter_t)) != 0) { int i; bson_iter_t *iters[] = {&iter, &recreated}; fprintf (stderr, "recreated iterator does not match initial iterator:\n"); for (i = 0; i < 2; i++) { fprintf (stderr, "iter %d: ", i); fprintf (stderr, "len=%d, off=%d, type=%d, key=%d, d1=%d, d2=%d, " "d3=%d, d4=%d, next_off=%d, err_off=%d\n", iters[i]->len, iters[i]->off, iters[i]->type, iters[i]->key, iters[i]->d1, iters[i]->d2, iters[i]->d3, iters[i]->d4, iters[i]->next_off, iters[i]->err_off); } ASSERT (false); } } } static void _check_null_binary (bson_t *bson, bool is_legacy) { const bson_value_t *original; bson_value_t copy; bson_iter_t iter; BSON_UNUSED (is_legacy); BSON_ASSERT (bson_iter_init_find (&iter, bson, "binary")); BSON_ASSERT (BSON_ITER_HOLDS_BINARY (&iter)); original = bson_iter_value (&iter); ASSERT_CMPINT (original->value.v_binary.data_len, ==, 0); /* Because v_binary.data points to the BSON buffer, data is not NULL */ BSON_ASSERT (original->value.v_binary.data != NULL); /* But copying it results in a NULL value because it is empty, even if is * legacy binary, (which appends the length in the data payload when * appending). */ bson_value_copy (original, ©); BSON_ASSERT (copy.value.v_binary.data_len == 0); BSON_ASSERT (copy.value.v_binary.data == NULL); bson_value_destroy (©); } /* Check the behavior of what happens when that bson binary value is NULL. */ static void _binary_null_handling (bool is_legacy) { bson_value_t val; bson_t *bson; bson_error_t error; bson_subtype_t subtype = BSON_SUBTYPE_BINARY; if (is_legacy) { subtype = BSON_SUBTYPE_BINARY_DEPRECATED; } bson = bson_new (); BSON_ASSERT (bson_append_binary (bson, "binary", -1, subtype, NULL, 0)); _check_null_binary (bson, is_legacy); bson_destroy (bson); /* Appending NULL with non-zero length is an error */ bson = bson_new (); BSON_ASSERT (!bson_append_binary (bson, "binary", -1, subtype, NULL, 1)); bson_destroy (bson); bson = bson_new (); val.value_type = BSON_TYPE_BINARY; val.value.v_binary.subtype = subtype; val.value.v_binary.data = NULL; val.value.v_binary.data_len = 0; BSON_ASSERT (bson_append_value (bson, "binary", -1, &val)); _check_null_binary (bson, is_legacy); bson_destroy (bson); bson = BCON_NEW ("binary", BCON_BIN (subtype, NULL, 0)); _check_null_binary (bson, is_legacy); bson_destroy (bson); bson = bson_new_from_json ( (uint8_t *) "{\"binary\": { \"$binary\": { \"subType\": \"00\", " "\"base64\": \"\" } } }", -1, &error); ASSERT_OR_PRINT (bson, error); _check_null_binary (bson, is_legacy); bson_destroy (bson); } static void test_bson_binary_null_handling (void) { _binary_null_handling (false /* is legacy */); _binary_null_handling (true /* is legacy */); } static void test_bson_append_null_from_utf8_or_symbol (void) { bson_t bson; bson_iter_t iter; bson_init (&bson); bson_append_utf8 (&bson, "from_utf8", -1, NULL, 0); bson_append_symbol (&bson, "from_symbol", -1, NULL, 0); bson_iter_init (&iter, &bson); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_NULL (&iter)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_NULL (&iter)); bson_destroy (&bson); } static void test_bson_as_json_string (void) { bson_t *all_types; char *actual; const char *expected = "{ \"double\" : { \"$numberDouble\" : \"1.0\" }, \"string\" : " "\"string_example\", \"document\" : { \"x\" : \"y\" }, \"document\" : [ " "\"x\" ], \"binary\" : { \"$binary\" : { \"base64\" : \"ZGF0YQ==\", " "\"subType\" : \"00\" } }, \"undefined\" : { \"$undefined\" : true }, " "\"oid\" : { \"$oid\" : \"000000000000000000000000\" }, \"bool\" : true, " "\"datetime\" : { \"$date\" : { \"$numberLong\" : \"123\" } }, \"null\" " ": null, \"regex\" : { \"$regularExpression\" : { \"pattern\" : \"a+\", " "\"options\" : \"\" } }, \"dbpointer\" : { \"$dbPointer\" : { \"$ref\" : " "\"collection\", \"$id\" : { \"$oid\" : \"000000000000000000000000\" } } " "}, \"code\" : { \"$code\" : \"var x = 1;\" }, \"symbol\" : { " "\"$symbol\" : \"symbol_example\" }, \"code\" : { \"$code\" : \"var x = " "1;\" }, \"code_w_scope\" : { \"$code\" : \"var x = 1;\", \"$scope\" : { " "} }, \"int32\" : { \"$numberInt\" : \"1\" }, \"timestamp\" : { " "\"$timestamp\" : { \"t\" : 2, \"i\" : 3 } }, \"int64\" : { " "\"$numberLong\" : \"4\" }, \"decimal128\" : { \"$numberDecimal\" : " "\"1.23456789\" }, \"minkey\" : { \"$minKey\" : 1 }, \"maxkey\" : { " "\"$maxKey\" : 1 }, \"\" : { \"$numberInt\" : \"-1\" } }"; all_types = bson_with_all_types (); actual = bson_as_canonical_extended_json (all_types, NULL); for (size_t i = 0u; i < strlen (expected); i++) { if (expected[i] != actual[i]) { test_error ("character mismatch at %zu. Expected: %s, got %s", i, expected, actual); } } bson_free (actual); } #define JSON_STRING(...) #__VA_ARGS__ #define TMP_BSON_FROM_JSON(...) tmp_bson (JSON_STRING (__VA_ARGS__)) /** * @brief Test the parsing component of the BSON EDSL */ static void test_bson_dsl_parse (void) { // Do nothing: bsonParse (*TMP_BSON_FROM_JSON ({}), do ()); BSON_ASSERT (!bsonParseError); // Generate an error bsonParse (*TMP_BSON_FROM_JSON ({}), error ("failed 1")); ASSERT_CMPSTR (bsonParseError, "failed 1"); // Error is reset on each entry bsonParse (*TMP_BSON_FROM_JSON ({}), do ()); BSON_ASSERT (!bsonParseError); // Find an element bson_t *simple_foo_bar = TMP_BSON_FROM_JSON ({"foo" : "bar"}); bool found = false; bsonParse (*simple_foo_bar, find (key ("foo"), do (found = true))); BSON_ASSERT (found); // Store a reference to the string const char *found_string = NULL; bsonParse (*simple_foo_bar, find (key ("foo"), storeStrRef (found_string))); ASSERT_CMPSTR (found_string, "bar"); // We can fail to find too found = false; bool not_found = false; bsonParse (*simple_foo_bar, find (key ("bad"), do (found = true)), else (do (not_found = true))); BSON_ASSERT (!found); BSON_ASSERT (not_found); // We can find two items int32_t a = 0, b = 0; bsonParse (*TMP_BSON_FROM_JSON ({"foo" : 1729, "bar" : 42}), find (key ("foo"), do (a = bsonAs (int32))), find (key ("bar"), do (b = bsonAs (int32)))); ASSERT_CMPINT (a, ==, 1729); ASSERT_CMPINT (b, ==, 42); // Wrong types are zeroed a = 91; found = false; bsonParse (*TMP_BSON_FROM_JSON ({"foo" : "string"}), find (key ("foo"), do (found = true; a = bsonAs (int32)))); BSON_ASSERT (found); ASSERT_CMPINT (a, ==, 0); // Nested errors do not continue found = false; bsonParse (*TMP_BSON_FROM_JSON ({"foo" : null, "bar" : null}), find (key ("foo"), error ("got foo")), find (key ("bar"), do (found = true))); ASSERT_CMPSTR (bsonParseError, "got foo"); BSON_ASSERT (!found); // Halting does not continue found = false; bsonParse (*TMP_BSON_FROM_JSON ({"foo" : null, "bar" : null}), find (key ("foo"), halt), find (key ("bar"), do (found = true))); BSON_ASSERT (!bsonParseError); BSON_ASSERT (!found); // "if" will branch a = 812; b = 0; bsonParse (*TMP_BSON_FROM_JSON ({"foo" : 1, "bar" : 2}), if (a == 812, then (find (key ("foo"), do (b = bsonAs (int32)))), else (find (key ("bar"), do (b = bsonAs (int32)))))); ASSERT_CMPINT (b, ==, 1); a = 4; bsonParse (*TMP_BSON_FROM_JSON ({"foo" : 1, "bar" : 2}), if (a == 812, then (find (key ("foo"), do (b = bsonAs (int32)))), else (find (key ("bar"), do (b = bsonAs (int32)))))); ASSERT_CMPINT (b, ==, 2); bson_t tmp = BSON_INITIALIZER; for (int i = 0; i < 1024; ++i) { BSON_APPEND_BOOL (&tmp, ".", true); } BSON_APPEND_BOOL (&tmp, "final", true); int unvisited = 0; bsonParse (tmp, find (key ("final"), nop), visitOthers (do (++unvisited))); ASSERT_CMPINT (unvisited, ==, 1024); bson_destroy (&tmp); } static void test_bson_dsl_visit (void) { // Count elements int count = 0; bsonVisitEach (*TMP_BSON_FROM_JSON ({"foo" : 1, "bar" : 1}), do (++count)); ASSERT_CMPINT (count, ==, 2); // Branch on keys int foo_val = 0; int bar_val = 0; bsonVisitEach (*TMP_BSON_FROM_JSON ({"foo" : 61, "bar" : 951}), if (key ("foo"), then (do (foo_val = bsonAs (int32)))), if (key ("bar"), then (do (bar_val = bsonAs (int32))))); ASSERT_CMPINT (foo_val, ==, 61); ASSERT_CMPINT (bar_val, ==, 951); // Store reference to subdocs bson_t subdoc; bsonVisitEach (*TMP_BSON_FROM_JSON ({"foo" : {"bar" : 42}}), storeDocRef (subdoc)); bar_val = 0; bsonVisitEach (subdoc, do (bar_val = bsonAs (int32))); ASSERT_CMPINT (bar_val, ==, 42); // Visit subdocs directly const char *baz_str = NULL; char *path = NULL; bsonVisitEach ( *TMP_BSON_FROM_JSON ({"foo" : {"bar" : {"baz" : "baz_string"}}}), visitEach (visitEach (storeStrRef (baz_str), dupPath (path)))); ASSERT_CMPSTR (baz_str, "baz_string"); ASSERT_CMPSTR (path, "$.foo.bar.baz"); bson_free (path); } static void test_bson_dsl_predicate (void) { bson_t *document = TMP_BSON_FROM_JSON ({ "number1" : 1, "number2" : 2.1, "zero" : 0, "string" : "hello", "doc" : {"hello" : null}, "null" : null, "empty_string" : "", "empty_array" : [], "empty_doc" : {}, "with_last" : {"a" : null, "b" : "lastElement"}, "unhandled" : 12 }); bool saw_other = false; bsonParse ( // *document, require (key ("number1"), // require (type (int32)), require (isNumeric), require (isTrue)), require (key ("number2"), // require (isNumeric), require (type (double)), require (isTrue)), require (key ("zero"), // require (isFalse)), require (key ("string"), // require (type (utf8)), require (strEqual ("hello")), require (not(strEqual ("goodbye"))), require (iStrEqual ("HELLO")), require (not(iStrEqual ("GOODBYE")))), require (key ("doc"), require (type (doc)), require (not(empty)), visitEach (require (key ("hello")), require (type (null)))), require (key ("null"), require (type (null))), require (key ("empty_string"), require (type (utf8))), require (key ("empty_array"), require (type (array)), require (empty)), require (key ("empty_doc"), require (type (doc)), require (empty)), require ( key ("with_last"), require (type (doc)), visitEach (if (lastElement, then (require (key ("b")), require (type (utf8))), else (require (key ("a")), require (type (null)))))), require ( key ("with_last"), visitEach (case (when (key ("a"), require (type (null))), when (key ("b"), require (strEqual ("lastElement"))), else (do (abort ()))))), require (key ("string"), case (when (strEqual ("goodbye"), do (abort ())), when (strEqual ("hello"), nop), // Not eached since the prior case matched: when (strEqual ("hello"), do (abort ())), else (do (abort ())))), visitOthers (if (key ("unhandled"), then (do (saw_other = true)), else (do (abort ()))))); BSON_ASSERT (saw_other); } static void do_assert_bson_equal (const bson_t *actual, const bson_t *expected, const char *file, int line) { char *actual_str = bson_as_canonical_extended_json (actual, NULL); ASSERT (actual_str); char *expected_str = bson_as_canonical_extended_json (expected, NULL); ASSERT (expected_str); if (strcmp (actual_str, expected_str) != 0) { test_error ("%s:%d: BSON documents are not equal:\n Expected: %s\n " "Actual: %s\n", file, line, expected_str, actual_str); } bson_free (actual_str); bson_free (expected_str); } #define ASSERT_BSON_EQUAL(Actual, ...) \ do_assert_bson_equal ( \ &(Actual), TMP_BSON_FROM_JSON (__VA_ARGS__), __FILE__, __LINE__) #define ASSERT_BSON_EQUAL_BSON(Actual, Expected) \ do_assert_bson_equal (&(Actual), &(Expected), __FILE__, __LINE__) static void test_bson_dsl_build (void) { // Create a very simple empty document bsonBuildDecl (doc, do ()); BSON_ASSERT (!bsonBuildError); ASSERT_BSON_EQUAL (doc, {}); bson_destroy (&doc); bsonBuild (doc, kv ("foo", cstr ("bar"))); ASSERT_BSON_EQUAL (doc, {"foo" : "bar"}); bson_destroy (&doc); bsonBuild (doc, kv ("foo", int32 (92))); ASSERT_BSON_EQUAL (doc, {"foo" : 92}); bson_destroy (&doc); bsonBuild (doc, kvl ("hello", 1, int32 (9))); ASSERT_BSON_EQUAL (doc, {"h" : 9}); bson_destroy (&doc); // Conditional insert bsonBuild ( doc, if (0, then (kv ("never", null)), else (kv ("truth", int32 (1))))); ASSERT_BSON_EQUAL (doc, {"truth" : 1}); bson_destroy (&doc); // Insert a subdoc bson_t *subdoc = TMP_BSON_FROM_JSON ({"child" : [ 1, 2, 3 ], "other" : null}); bsonBuild (doc, kv ("subdoc", doc (insert (*subdoc, true)))); ASSERT_BSON_EQUAL (doc, {"subdoc" : {"child" : [ 1, 2, 3 ], "other" : null}}); bson_destroy (&doc); // Conditional insert bsonBuild (doc, kv ("subdoc", doc (insert (*subdoc, key ("other"))))); ASSERT_BSON_EQUAL (doc, {"subdoc" : {"other" : null}}); bson_destroy (&doc); // Nested DSL docs bsonBuild (doc, kv ("top", doc (kv ("inner1", array ()), kv ("inner2", null), kv ("inner3", array (int32 (1), int32 (2), int32 (3))), insert (*subdoc, true), kv ("inner4", doc (kv ("innermost", int32 (42))))))); ASSERT_BSON_EQUAL (doc, { "top" : { "inner1" : [], "inner2" : null, "inner3" : [ 1, 2, 3 ], "child" : [ 1, 2, 3 ], "other" : null, "inner4" : {"innermost" : 42} } }); // Do not destroy doc, but append to it bsonBuildAppend (doc, kv ("anotherTop", null)); ASSERT_BSON_EQUAL (doc, { "top" : { "inner1" : [], "inner2" : null, "inner3" : [ 1, 2, 3 ], "child" : [ 1, 2, 3 ], "other" : null, "inner4" : {"innermost" : 42} }, "anotherTop" : null }); bson_destroy (&doc); } static void test_bson_with_duplicate_keys (void) { bson_t with_dups = BSON_INITIALIZER; // Assert bson_t can be constructed with duplicate keys. { BSON_ASSERT (BSON_APPEND_INT32 (&with_dups, "duplicate", 1)); BSON_ASSERT (BSON_APPEND_INT32 (&with_dups, "duplicate", 2)); } // Assert bson_iter_find locates the first duplicate. { bson_iter_t iter; BSON_ASSERT (bson_iter_init (&iter, &with_dups)); BSON_ASSERT (bson_iter_find (&iter, "duplicate")); ASSERT_CMPINT32 (bson_iter_int32 (&iter), ==, 1); } // Assert bson_iter_find_case locates the first duplicate. { bson_iter_t iter; BSON_ASSERT (bson_iter_init (&iter, &with_dups)); BSON_ASSERT (bson_iter_find_case (&iter, "dUpLiCaTe")); ASSERT_CMPINT32 (bson_iter_int32 (&iter), ==, 1); } // Assert bson_iter_find_w_len locates the first duplicate. { bson_iter_t iter; BSON_ASSERT (bson_iter_init (&iter, &with_dups)); BSON_ASSERT (bson_iter_find_w_len (&iter, "duplicate", 9)); ASSERT_CMPINT32 (bson_iter_int32 (&iter), ==, 1); } // Assert bson_iter_find_descendant locates the first duplicate. { bson_iter_t iter; BSON_ASSERT (bson_iter_init (&iter, &with_dups)); BSON_ASSERT (bson_iter_find_descendant (&iter, "duplicate", &iter)); ASSERT_CMPINT32 (bson_iter_int32 (&iter), ==, 1); } // Assert that bson_as_relaxed_extended_json preserves duplicate keys. { char *json_str = bson_as_relaxed_extended_json (&with_dups, NULL /* length */); ASSERT_CMPSTR (json_str, "{ \"duplicate\" : 1, \"duplicate\" : 2 }"); bson_free (json_str); } // Assert that bson_init_from_json preserves duplicate keys. { bson_t from_json; bson_error_t error; ASSERT_OR_PRINT ( bson_init_from_json ( &from_json, "{ \"duplicate\" : 1, \"duplicate\" : 2 }", -1, &error), error); BSON_ASSERT_BSON_EQUAL (&with_dups, &from_json); } bson_destroy (&with_dups); } static void test_bson_uint32_to_string (void) { // Test a value < 1000. { char buf[16] = {0}; const char *strptr; size_t got = bson_uint32_to_string (123, &strptr, buf, sizeof buf); ASSERT_CMPSIZE_T (got, ==, 3); ASSERT_CMPSTR (strptr, "123"); // Values < 1000 return a static string. Expect the input buffer is not // used. ASSERT_CMPSTR (buf, ""); } // Test a value >= 1000. { char buf[16] = {0}; const char *strptr; size_t got = bson_uint32_to_string (1000, &strptr, buf, sizeof buf); ASSERT_CMPSIZE_T (got, ==, 4); ASSERT_CMPSTR (strptr, "1000"); // Expect the input buffer is used. ASSERT_CMPSTR (buf, "1000"); } // Test when input buffer is too small. { char buf[4] = {0}; const char *strptr; size_t got = bson_uint32_to_string (1000, &strptr, buf, sizeof buf); // Expect the returned value is the number of required bytes excluding the // NULL terminator. ASSERT_CMPSIZE_T (got, ==, 4); // Expect only three characters are written. ASSERT_CMPSTR (strptr, "100"); // Expect the input buffer is used. ASSERT_CMPSTR (buf, "100"); } } static void test_bson_array_builder (void) { // Build a top-level array. { bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_int32 (bab, 1)); ASSERT (bson_array_builder_append_int32 (bab, 2)); bson_t b; ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ 1, 2 ]); bson_array_builder_destroy (bab); bson_destroy (&b); } // Build a top-level, heap allocated array. { char *large_str = bson_malloc0 (64); for (size_t i = 0; i < 64 - 1; i++) { large_str[i] = '.'; } bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_utf8 (bab, large_str, -1)); ASSERT (bson_array_builder_append_utf8 ( bab, large_str, -1)); // heap allocates. ASSERT (bson_array_builder_append_utf8 (bab, large_str, -1)); bson_t *expect = BCON_NEW ("0", BCON_UTF8 (large_str), "1", BCON_UTF8 (large_str), "2", BCON_UTF8 (large_str)); bson_t b; ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL_BSON (b, *expect); bson_destroy (expect); bson_array_builder_destroy (bab); bson_destroy (&b); bson_free (large_str); } // Build a nested array. { bson_t *b = bson_new (); bson_array_builder_t *child; ASSERT (BSON_APPEND_ARRAY_BUILDER_BEGIN (b, "array", &child)); ASSERT (bson_array_builder_append_int32 (child, 1)); ASSERT (bson_array_builder_append_int32 (child, 2)); ASSERT (bson_append_array_builder_end (b, child)); ASSERT_BSON_EQUAL (*b, {"array" : [ 1, 2 ]}); bson_destroy (b); } // Reuse a `bson_array_builder`. { bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_int32 (bab, 1)); ASSERT (bson_array_builder_append_int32 (bab, 2)); bson_t b; ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ 1, 2 ]); bson_destroy (&b); // Reuse to build another array. ASSERT (bson_array_builder_append_int32 (bab, 3)); ASSERT (bson_array_builder_append_int32 (bab, 4)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ 3, 4 ]); bson_destroy (&b); bson_array_builder_destroy (bab); } // Test each bson_array_builder_append_* function. { { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); bson_value_t v = {.value_type = BSON_TYPE_INT32, .value = {.v_int32 = 1}}; ASSERT (bson_array_builder_append_value (bab, &v)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [1]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_array ( bab, TMP_BSON_FROM_JSON ([ 1, 2 ]))); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [[ 1, 2 ]]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_binary ( bab, BSON_SUBTYPE_BINARY, (const uint8_t *) "A", 1)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL ( b, [ {"$binary" : {"base64" : "QQ==", "subType" : "00"}} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_bool (bab, true)); ASSERT (bson_array_builder_build (bab, &b)); // Use string literal for expectation instead of `ASSERT_BSON_EQUAL` // macro, since `true` may be replaced by `1` in preprocessing. ASSERT_BSON_EQUAL_BSON (b, *tmp_bson ("[true]")); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_code (bab, "A")); ASSERT (bson_array_builder_build (bab, &b)); // Use document string: `{ "0": ... , "1": ... }` instead of array // string: `[ ... , ... ]` for expectation. Parsing the array string // `[{ "$code": ... }]` results in incorrect BSON. See CDRIVER-4678. ASSERT_BSON_EQUAL (b, {"0" : {"$code" : "A"}}); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_code_with_scope ( bab, "A", TMP_BSON_FROM_JSON ({"B" : 1}))); ASSERT (bson_array_builder_build (bab, &b)); // Use document string: `{ "0": ... , "1": ... }` instead of array // string: `[ ... , ... ]` for expectation. Parsing the array string // `[{ "$code": ... }]` results in incorrect BSON. See CDRIVER-4678. ASSERT_BSON_EQUAL (b, {"0" : {"$code" : "A", "$scope" : {"B" : 1}}}); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); bson_oid_t oid; bson_oid_init_from_string (&oid, "FFFFFFFFFFFFFFFFFFFFFFFF"); ASSERT (bson_array_builder_append_dbpointer (bab, "E", &oid)); ASSERT (bson_array_builder_build (bab, &b)); // Use document string: `{ "0": ... , "1": ... }` instead of array // string: `[ ... , ... ]` for expectation. Parsing the array string // `[{ "$dbPointer": ... }]` results in incorrect BSON. See // CDRIVER-4678. ASSERT_BSON_EQUAL (b, { "0" : { "$dbPointer" : {"$ref" : "E", "$id" : {"$oid" : "ffffffffffffffffffffffff"}} } }); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_double (bab, 1.0)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$numberDouble" : "1.0"} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_document ( bab, TMP_BSON_FROM_JSON ({"A" : 1}))); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"A" : {"$numberInt" : "1"}} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); bson_t child; ASSERT (bson_array_builder_append_document_begin (bab, &child)); ASSERT (BSON_APPEND_INT32 (&child, "A", 1)); ASSERT (bson_array_builder_append_document_end (bab, &child)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"A" : {"$numberInt" : "1"}} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_int32 (bab, 1)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [1]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_int64 (bab, 1)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$numberLong" : "1"} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); bson_decimal128_t d128; ASSERT (bson_decimal128_from_string ("1.0", &d128)); ASSERT (bson_array_builder_append_decimal128 (bab, &d128)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$numberDecimal" : "1.0"} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); { bson_t *b = TMP_BSON_FROM_JSON ({"A" : 1}); bson_iter_t iter; ASSERT (bson_iter_init_find (&iter, b, "A")); ASSERT (bson_array_builder_append_iter (bab, &iter)); } ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [1]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_minkey (bab)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$minKey" : 1} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_maxkey (bab)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$maxKey" : 1} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_null (bab)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [null]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); bson_oid_t oid; bson_oid_init_from_string (&oid, "FFFFFFFFFFFFFFFFFFFFFFFF"); ASSERT (bson_array_builder_append_oid (bab, &oid)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$oid" : "ffffffffffffffffffffffff"} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_regex (bab, "A", "i")); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL ( b, [ {"$regularExpression" : {"pattern" : "A", "options" : "i"}} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_regex_w_len (bab, "A", 1, "i")); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL ( b, [ {"$regularExpression" : {"pattern" : "A", "options" : "i"}} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_utf8 (bab, "A", 1)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, ["A"]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_symbol (bab, "A", 1)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$symbol" : "A"} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); time_t t = {0}; ASSERT (bson_array_builder_append_time_t (bab, t)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$date" : {"$numberLong" : "0"}} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); struct timeval t = {0}; ASSERT (bson_array_builder_append_timeval (bab, &t)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$date" : {"$numberLong" : "0"}} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_date_time (bab, 1)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$date" : {"$numberLong" : "1"}} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_now_utc (bab)); ASSERT (bson_array_builder_build (bab, &b)); // Check that one element exists of the expected type. Do not check // exact value. ASSERT_CMPUINT32 (bson_count_keys (&b), ==, 1); bson_iter_t iter; ASSERT (bson_iter_init_find (&iter, &b, "0")); ASSERT_CMPINT ( (int) bson_iter_type (&iter), ==, (int) BSON_TYPE_DATE_TIME); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_timestamp (bab, 1, 2)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [ {"$timestamp" : {"t" : 1, "i" : 2}} ]); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); ASSERT (bson_array_builder_append_undefined (bab)); ASSERT (bson_array_builder_build (bab, &b)); // Use string literal for expectation instead of `ASSERT_BSON_EQUAL` // macro, since `true` may be replaced by `1` in preprocessing. ASSERT_BSON_EQUAL_BSON (b, *tmp_bson ("[{'$undefined' : true}]")); bson_destroy (&b); bson_array_builder_destroy (bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new (); bson_array_builder_t *child; ASSERT (bson_array_builder_append_array_builder_begin (bab, &child)); ASSERT (bson_array_builder_append_int32 (child, 1)); ASSERT (bson_array_builder_append_int32 (child, 2)); ASSERT (bson_array_builder_append_array_builder_end (bab, child)); ASSERT (bson_array_builder_build (bab, &b)); ASSERT_BSON_EQUAL (b, [[ 1, 2 ]]); bson_destroy (&b); bson_array_builder_destroy (bab); } } } void test_bson_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/new", test_bson_new); TestSuite_Add (suite, "/bson/new_from_buffer", test_bson_new_from_buffer); TestSuite_Add (suite, "/bson/init", test_bson_init); TestSuite_Add (suite, "/bson/init_static", test_bson_init_static); TestSuite_Add (suite, "/bson/basic", test_bson_alloc); TestSuite_Add (suite, "/bson/append_overflow", test_bson_append_overflow); TestSuite_Add (suite, "/bson/append_array", test_bson_append_array); TestSuite_Add (suite, "/bson/append_binary", test_bson_append_binary); TestSuite_Add (suite, "/bson/append_binary_deprecated", test_bson_append_binary_deprecated); TestSuite_Add (suite, "/bson/append_bool", test_bson_append_bool); TestSuite_Add (suite, "/bson/append_code", test_bson_append_code); TestSuite_Add ( suite, "/bson/append_code_with_scope", test_bson_append_code_with_scope); TestSuite_Add (suite, "/bson/append_dbpointer", test_bson_append_dbpointer); TestSuite_Add (suite, "/bson/append_document", test_bson_append_document); TestSuite_Add (suite, "/bson/append_double", test_bson_append_double); TestSuite_Add (suite, "/bson/append_int32", test_bson_append_int32); TestSuite_Add (suite, "/bson/append_int64", test_bson_append_int64); TestSuite_Add ( suite, "/bson/append_decimal128", test_bson_append_decimal128); TestSuite_Add (suite, "/bson/append_iter", test_bson_append_iter); TestSuite_Add (suite, "/bson/append_maxkey", test_bson_append_maxkey); TestSuite_Add (suite, "/bson/append_minkey", test_bson_append_minkey); TestSuite_Add (suite, "/bson/append_null", test_bson_append_null); TestSuite_Add (suite, "/bson/append_oid", test_bson_append_oid); TestSuite_Add (suite, "/bson/append_regex", test_bson_append_regex); TestSuite_Add ( suite, "/bson/append_regex_w_len", test_bson_append_regex_w_len); TestSuite_Add (suite, "/bson/append_utf8", test_bson_append_utf8); TestSuite_Add (suite, "/bson/append_symbol", test_bson_append_symbol); TestSuite_Add (suite, "/bson/append_time_t", test_bson_append_time_t); TestSuite_Add (suite, "/bson/append_timestamp", test_bson_append_timestamp); TestSuite_Add (suite, "/bson/append_timeval", test_bson_append_timeval); TestSuite_Add (suite, "/bson/append_undefined", test_bson_append_undefined); TestSuite_Add (suite, "/bson/append_general", test_bson_append_general); TestSuite_Add (suite, "/bson/append_deep", test_bson_append_deep); TestSuite_Add (suite, "/bson/utf8_key", test_bson_utf8_key); TestSuite_Add (suite, "/bson/validate", test_bson_validate); TestSuite_Add (suite, "/bson/validate/dbref", test_bson_validate_dbref); TestSuite_Add (suite, "/bson/validate/bool", test_bson_validate_bool); TestSuite_Add ( suite, "/bson/validate/dbpointer", test_bson_validate_dbpointer); TestSuite_Add (suite, "/bson/new_1mm", test_bson_new_1mm); TestSuite_Add (suite, "/bson/init_1mm", test_bson_init_1mm); TestSuite_Add (suite, "/bson/build_child", test_bson_build_child); TestSuite_Add (suite, "/bson/build_child_deep", test_bson_build_child_deep); TestSuite_Add (suite, "/bson/build_child_deep_no_begin_end", test_bson_build_child_deep_no_begin_end); TestSuite_Add ( suite, "/bson/build_child_array", test_bson_build_child_array); TestSuite_Add (suite, "/bson/count", test_bson_count_keys); TestSuite_Add (suite, "/bson/copy", test_bson_copy); TestSuite_Add (suite, "/bson/copy_to", test_bson_copy_to); TestSuite_Add (suite, "/bson/copy_to_excluding_noinit", test_bson_copy_to_excluding_noinit); TestSuite_Add (suite, "/bson/initializer", test_bson_initializer); TestSuite_Add (suite, "/bson/concat", test_bson_concat); TestSuite_Add (suite, "/bson/reinit", test_bson_reinit); TestSuite_Add (suite, "/bson/macros", test_bson_macros); TestSuite_Add (suite, "/bson/clear", test_bson_clear); TestSuite_Add (suite, "/bson/steal", test_bson_steal); TestSuite_Add (suite, "/bson/reserve_buffer", test_bson_reserve_buffer); TestSuite_Add ( suite, "/bson/reserve_buffer/errors", test_bson_reserve_buffer_errors); TestSuite_Add ( suite, "/bson/destroy_with_steal", test_bson_destroy_with_steal); TestSuite_Add (suite, "/bson/has_field", test_bson_has_field); TestSuite_Add ( suite, "/bson/visit_invalid_field", test_bson_visit_invalid_field); TestSuite_Add ( suite, "/bson/unsupported_type", test_bson_visit_unsupported_type); TestSuite_Add (suite, "/bson/unsupported_type/bad_key", test_bson_visit_unsupported_type_bad_key); TestSuite_Add (suite, "/bson/unsupported_type/empty_key", test_bson_visit_unsupported_type_empty_key); TestSuite_Add (suite, "/bson/binary_subtype_2", test_bson_subtype_2); TestSuite_Add (suite, "/bson/regex_length", test_bson_regex_lengths); TestSuite_Add (suite, "/util/next_power_of_two", test_next_power_of_two); TestSuite_Add (suite, "/bson/empty_binary", test_bson_empty_binary); TestSuite_Add (suite, "/bson/iter/key_len", test_bson_iter_key_len); TestSuite_Add (suite, "/bson/iter/init_from_data_at_offset", test_bson_iter_init_from_data_at_offset); TestSuite_Add ( suite, "/bson/value/null_handling", test_bson_binary_null_handling); TestSuite_Add (suite, "/bson/append_null_from_utf8_or_symbol", test_bson_append_null_from_utf8_or_symbol); TestSuite_Add (suite, "/bson/as_json_string", test_bson_as_json_string); TestSuite_Add (suite, "/bson/dsl/predicate", test_bson_dsl_predicate); TestSuite_Add (suite, "/bson/dsl/parse", test_bson_dsl_parse); TestSuite_Add (suite, "/bson/dsl/visit", test_bson_dsl_visit); TestSuite_Add (suite, "/bson/dsl/build", test_bson_dsl_build); TestSuite_Add ( suite, "/bson/with_duplicate_keys", test_bson_with_duplicate_keys); TestSuite_Add (suite, "/bson/uint32_to_string", test_bson_uint32_to_string); TestSuite_Add (suite, "/bson/array_builder", test_bson_array_builder); } mongo-c-driver-1.26.0/src/libbson/tests/test-clock.c000066400000000000000000000006331456567454500222540ustar00rootroot00000000000000#include #include "TestSuite.h" static void test_get_monotonic_time (void) { int64_t t; int64_t t2; t = bson_get_monotonic_time (); t2 = bson_get_monotonic_time (); BSON_ASSERT (t); BSON_ASSERT (t2); ASSERT_CMPINT64 (t, <=, t2); } void test_clock_install (TestSuite *suite) { TestSuite_Add ( suite, "/bson/clock/get_monotonic_time", test_get_monotonic_time); } mongo-c-driver-1.26.0/src/libbson/tests/test-decimal128.c000066400000000000000000000760321456567454500230200ustar00rootroot00000000000000/* * Copyright 2015 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "TestSuite.h" /* *---------------------------------------------------------------------------- * decimal128_to_string tests * * The following tests confirm functionality of the decimal128_to_string *function. * * All decimal test data is generated using the Intel Decimal Floating-Point * Math Library's bid128_from_string routine. * *---------------------------------------------------------------------------- */ #define DECIMAL128_FROM_ULLS(dec, h, l) \ do { \ (dec).high = (h); \ (dec).low = (l); \ } while (0); static void test_decimal128_to_string__infinity (void) { bson_decimal128_t positive_infinity; bson_decimal128_t negative_infinity; char bid_string[BSON_DECIMAL128_STRING]; DECIMAL128_FROM_ULLS (positive_infinity, 0x7800000000000000, 0); DECIMAL128_FROM_ULLS (negative_infinity, 0xf800000000000000, 0); bson_decimal128_to_string (&positive_infinity, bid_string); BSON_ASSERT (!strcmp (bid_string, "Infinity")); bson_decimal128_to_string (&negative_infinity, bid_string); BSON_ASSERT (!strcmp (bid_string, "-Infinity")); } static void test_decimal128_to_string__nan (void) { bson_decimal128_t dec_pnan; bson_decimal128_t dec_nnan; bson_decimal128_t dec_psnan; bson_decimal128_t dec_nsnan; bson_decimal128_t dec_payload_nan; /* All the above should just be NaN. */ char bid_string[BSON_DECIMAL128_STRING]; DECIMAL128_FROM_ULLS (dec_pnan, 0x7c00000000000000, 0); DECIMAL128_FROM_ULLS (dec_nnan, 0xfc00000000000000, 0); DECIMAL128_FROM_ULLS (dec_psnan, 0x7e00000000000000, 0); DECIMAL128_FROM_ULLS (dec_nsnan, 0xfe00000000000000, 0); DECIMAL128_FROM_ULLS (dec_payload_nan, 0x7e00000000000000, 12); bson_decimal128_to_string (&dec_pnan, bid_string); BSON_ASSERT (!strcmp (bid_string, "NaN")); bson_decimal128_to_string (&dec_nnan, bid_string); BSON_ASSERT (!strcmp (bid_string, "NaN")); bson_decimal128_to_string (&dec_psnan, bid_string); BSON_ASSERT (!strcmp (bid_string, "NaN")); bson_decimal128_to_string (&dec_nsnan, bid_string); BSON_ASSERT (!strcmp (bid_string, "NaN")); bson_decimal128_to_string (&dec_payload_nan, bid_string); BSON_ASSERT (!strcmp (bid_string, "NaN")); } static void test_decimal128_to_string__regular (void) { char bid_string[BSON_DECIMAL128_STRING]; bson_decimal128_t one; bson_decimal128_t zero; bson_decimal128_t two; bson_decimal128_t negative_one; bson_decimal128_t negative_zero; bson_decimal128_t tenth; bson_decimal128_t smallest_regular; bson_decimal128_t largest_regular; bson_decimal128_t trailing_zeros; bson_decimal128_t all_digits; bson_decimal128_t full_house; DECIMAL128_FROM_ULLS (one, 0x3040000000000000, 0x0000000000000001); DECIMAL128_FROM_ULLS (zero, 0x3040000000000000, 0x0000000000000000); DECIMAL128_FROM_ULLS (two, 0x3040000000000000, 0x0000000000000002); DECIMAL128_FROM_ULLS (negative_one, 0xb040000000000000, 0x0000000000000001); DECIMAL128_FROM_ULLS (negative_zero, 0xb040000000000000, 0x0000000000000000); DECIMAL128_FROM_ULLS ( tenth, 0x303e000000000000, 0x0000000000000001); /* 0.1 */ /* 0.001234 */ DECIMAL128_FROM_ULLS ( smallest_regular, 0x3034000000000000, 0x00000000000004d2); /* 12345789012 */ DECIMAL128_FROM_ULLS ( largest_regular, 0x3040000000000000, 0x0000001cbe991a14); /* 0.00123400000 */ DECIMAL128_FROM_ULLS ( trailing_zeros, 0x302a000000000000, 0x00000000075aef40); /* 0.1234567890123456789012345678901234 */ DECIMAL128_FROM_ULLS (all_digits, 0x2ffc3cde6fff9732, 0xde825cd07e96aff2); /* 5192296858534827628530496329220095 */ DECIMAL128_FROM_ULLS (full_house, 0x3040ffffffffffff, 0xffffffffffffffff); bson_decimal128_to_string (&one, bid_string); BSON_ASSERT (!strcmp ("1", bid_string)); bson_decimal128_to_string (&zero, bid_string); BSON_ASSERT (!strcmp ("0", bid_string)); bson_decimal128_to_string (&two, bid_string); BSON_ASSERT (!strcmp ("2", bid_string)); bson_decimal128_to_string (&negative_one, bid_string); BSON_ASSERT (!strcmp ("-1", bid_string)); bson_decimal128_to_string (&negative_zero, bid_string); BSON_ASSERT (!strcmp ("-0", bid_string)); bson_decimal128_to_string (&tenth, bid_string); BSON_ASSERT (!strcmp ("0.1", bid_string)); bson_decimal128_to_string (&smallest_regular, bid_string); BSON_ASSERT (!strcmp ("0.001234", bid_string)); bson_decimal128_to_string (&largest_regular, bid_string); BSON_ASSERT (!strcmp ("123456789012", bid_string)); bson_decimal128_to_string (&trailing_zeros, bid_string); BSON_ASSERT (!strcmp ("0.00123400000", bid_string)); bson_decimal128_to_string (&all_digits, bid_string); BSON_ASSERT (!strcmp ("0.1234567890123456789012345678901234", bid_string)); bson_decimal128_to_string (&full_house, bid_string); BSON_ASSERT (!strcmp ("5192296858534827628530496329220095", bid_string)); } static void test_decimal128_to_string__scientific (void) { char bid_string[BSON_DECIMAL128_STRING]; bson_decimal128_t huge; /* 1.000000000000000000000000000000000E+6144 */ bson_decimal128_t tiny; /* 1E-6176 */ bson_decimal128_t neg_tiny; /* -1E-6176 */ bson_decimal128_t large; /* 9.999987654321E+112 */ bson_decimal128_t largest; /* 9.999999999999999999999999999999999E+6144 */ bson_decimal128_t tiniest; /* 9.999999999999999999999999999999999E-6143 */ bson_decimal128_t trailing_zero; /* 1.050E9 */ bson_decimal128_t one_trailing_zero; /* 1.050E4 */ bson_decimal128_t move_decimal; /* 105 */ bson_decimal128_t move_decimal_after; /* 1.05E3 */ bson_decimal128_t trailing_zero_no_decimal; /* 1E3 */ DECIMAL128_FROM_ULLS (huge, 0x5ffe314dc6448d93, 0x38c15b0a00000000); DECIMAL128_FROM_ULLS (tiny, 0x0000000000000000, 0x0000000000000001); DECIMAL128_FROM_ULLS (neg_tiny, 0x8000000000000000, 0x0000000000000001); DECIMAL128_FROM_ULLS (large, 0x3108000000000000, 0x000009184db63eb1); DECIMAL128_FROM_ULLS (largest, 0x5fffed09bead87c0, 0x378d8e63ffffffff); DECIMAL128_FROM_ULLS (tiniest, 0x0001ed09bead87c0, 0x378d8e63ffffffff); DECIMAL128_FROM_ULLS (trailing_zero, 0x304c000000000000, 0x000000000000041a); DECIMAL128_FROM_ULLS ( one_trailing_zero, 0x3042000000000000, 0x000000000000041a); DECIMAL128_FROM_ULLS (move_decimal, 0x3040000000000000, 0x0000000000000069); DECIMAL128_FROM_ULLS ( move_decimal_after, 0x3042000000000000, 0x0000000000000069); DECIMAL128_FROM_ULLS ( trailing_zero_no_decimal, 0x3046000000000000, 0x0000000000000001); bson_decimal128_to_string (&huge, bid_string); BSON_ASSERT ( !strcmp ("1.000000000000000000000000000000000E+6144", bid_string)); bson_decimal128_to_string (&tiny, bid_string); BSON_ASSERT (!strcmp ("1E-6176", bid_string)); bson_decimal128_to_string (&neg_tiny, bid_string); BSON_ASSERT (!strcmp ("-1E-6176", bid_string)); bson_decimal128_to_string (&neg_tiny, bid_string); BSON_ASSERT (!strcmp ("-1E-6176", bid_string)); bson_decimal128_to_string (&large, bid_string); BSON_ASSERT (!strcmp ("9.999987654321E+112", bid_string)); bson_decimal128_to_string (&largest, bid_string); BSON_ASSERT ( !strcmp ("9.999999999999999999999999999999999E+6144", bid_string)); bson_decimal128_to_string (&tiniest, bid_string); BSON_ASSERT ( !strcmp ("9.999999999999999999999999999999999E-6143", bid_string)); bson_decimal128_to_string (&trailing_zero, bid_string); BSON_ASSERT (!strcmp ("1.050E+9", bid_string)); bson_decimal128_to_string (&one_trailing_zero, bid_string); BSON_ASSERT (!strcmp ("1.050E+4", bid_string)); bson_decimal128_to_string (&move_decimal, bid_string); BSON_ASSERT (!strcmp ("105", bid_string)); bson_decimal128_to_string (&move_decimal_after, bid_string); BSON_ASSERT (!strcmp ("1.05E+3", bid_string)); bson_decimal128_to_string (&trailing_zero_no_decimal, bid_string); BSON_ASSERT (!strcmp ("1E+3", bid_string)); } static void test_decimal128_to_string__zeros (void) { char bid_string[BSON_DECIMAL128_STRING]; bson_decimal128_t zero; /* 0 */ bson_decimal128_t pos_exp_zero; /* 0E+300 */ bson_decimal128_t neg_exp_zero; /* 0E-600 */ DECIMAL128_FROM_ULLS (zero, 0x3040000000000000, 0x0000000000000000); DECIMAL128_FROM_ULLS (pos_exp_zero, 0x3298000000000000, 0x0000000000000000); DECIMAL128_FROM_ULLS (neg_exp_zero, 0x2b90000000000000, 0x0000000000000000); bson_decimal128_to_string (&zero, bid_string); BSON_ASSERT (!strcmp ("0", bid_string)); bson_decimal128_to_string (&pos_exp_zero, bid_string); BSON_ASSERT (!strcmp ("0E+300", bid_string)); bson_decimal128_to_string (&neg_exp_zero, bid_string); BSON_ASSERT (!strcmp ("0E-600", bid_string)); } #define IS_NAN(dec) (dec).high == 0x7c00000000000000ull static void test_decimal128_from_string__invalid_inputs (void) { bson_decimal128_t dec; bson_decimal128_from_string (".", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string (".e", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("invalid", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("in", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("i", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("E02", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("..1", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("1abcede", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("1.24abc", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("1.24abcE+02", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("1.24E+02abc2d", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("E+02", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("e+02", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len (".", 1, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len (".e", 2, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("", 0, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("invalid", 7, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("in", 2, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("i", 1, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("E02", 3, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("..1", 3, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("1abcede", 7, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("1.24abc", 7, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("1.24abcE+02", 11, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("1.24E+02abc2d", 13, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("E+02", 4, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("e+02", 4, &dec); BSON_ASSERT (IS_NAN (dec)); } static void test_decimal128_from_string__nan (void) { bson_decimal128_t dec; bson_decimal128_from_string ("NaN", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("+NaN", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("-NaN", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("-nan", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("1e", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("+nan", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("nan", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("Nan", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("+Nan", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string ("-Nan", &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("NaN", 3, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("+NaN", 4, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("-NaN", 4, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("-nan", 4, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("1e", 2, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("+nan", 4, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("nan", 3, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("Nan", 3, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("+Nan", 4, &dec); BSON_ASSERT (IS_NAN (dec)); bson_decimal128_from_string_w_len ("-Nan", 4, &dec); BSON_ASSERT (IS_NAN (dec)); } #define IS_PINFINITY(dec) (dec).high == 0x7800000000000000 #define IS_NINFINITY(dec) (dec).high == 0xf800000000000000 static void test_decimal128_from_string__infinity (void) { bson_decimal128_t dec; bson_decimal128_from_string ("Infinity", &dec); BSON_ASSERT (IS_PINFINITY (dec)); bson_decimal128_from_string ("+Infinity", &dec); BSON_ASSERT (IS_PINFINITY (dec)); bson_decimal128_from_string ("+Inf", &dec); BSON_ASSERT (IS_PINFINITY (dec)); bson_decimal128_from_string ("-Inf", &dec); BSON_ASSERT (IS_NINFINITY (dec)); bson_decimal128_from_string ("-Infinity", &dec); BSON_ASSERT (IS_NINFINITY (dec)); bson_decimal128_from_string_w_len ("Infinity", 8, &dec); BSON_ASSERT (IS_PINFINITY (dec)); bson_decimal128_from_string_w_len ("+Infinity", 9, &dec); BSON_ASSERT (IS_PINFINITY (dec)); bson_decimal128_from_string_w_len ("+Inf", 4, &dec); BSON_ASSERT (IS_PINFINITY (dec)); bson_decimal128_from_string_w_len ("-Inf", 4, &dec); BSON_ASSERT (IS_NINFINITY (dec)); bson_decimal128_from_string_w_len ("-Infinity", 9, &dec); BSON_ASSERT (IS_NINFINITY (dec)); } static bool decimal128_equal (bson_decimal128_t *dec, uint64_t high, uint64_t low) { bson_decimal128_t test; DECIMAL128_FROM_ULLS (test, high, low); return memcmp (dec, &test, sizeof (*dec)) == 0; } static void test_decimal128_from_string__simple (void) { bson_decimal128_t one; bson_decimal128_t negative_one; bson_decimal128_t zero; bson_decimal128_t negative_zero; bson_decimal128_t number; bson_decimal128_t number_two; bson_decimal128_t negative_number; bson_decimal128_t fractional_number; bson_decimal128_t leading_zeros; bson_decimal128_t leading_insignificant_zeros; bson_decimal128_from_string ("1", &one); bson_decimal128_from_string ("-1", &negative_one); bson_decimal128_from_string ("0", &zero); bson_decimal128_from_string ("-0", &negative_zero); bson_decimal128_from_string ("12345678901234567", &number); bson_decimal128_from_string ("989898983458", &number_two); bson_decimal128_from_string ("-12345678901234567", &negative_number); bson_decimal128_from_string ("0.12345", &fractional_number); bson_decimal128_from_string ("0.0012345", &leading_zeros); bson_decimal128_from_string ("00012345678901234567", &leading_insignificant_zeros); BSON_ASSERT ( decimal128_equal (&one, 0x3040000000000000, 0x0000000000000001)); BSON_ASSERT ( decimal128_equal (&negative_one, 0xb040000000000000, 0x0000000000000001)); BSON_ASSERT ( decimal128_equal (&zero, 0x3040000000000000, 0x0000000000000000)); BSON_ASSERT (decimal128_equal ( &negative_zero, 0xb040000000000000, 0x0000000000000000)); BSON_ASSERT ( decimal128_equal (&number, 0x3040000000000000, 0x002bdc545d6b4b87)); BSON_ASSERT ( decimal128_equal (&number_two, 0x3040000000000000, 0x000000e67a93c822)); BSON_ASSERT (decimal128_equal ( &negative_number, 0xb040000000000000, 0x002bdc545d6b4b87)); BSON_ASSERT (decimal128_equal ( &fractional_number, 0x3036000000000000, 0x0000000000003039)); BSON_ASSERT (decimal128_equal ( &leading_zeros, 0x3032000000000000, 0x0000000000003039)); BSON_ASSERT (decimal128_equal ( &leading_insignificant_zeros, 0x3040000000000000, 0x002bdc545d6b4b87)); bson_decimal128_from_string_w_len ("1", 1, &one); bson_decimal128_from_string_w_len ("-1", 2, &negative_one); bson_decimal128_from_string_w_len ("0", 1, &zero); bson_decimal128_from_string_w_len ("-0", 2, &negative_zero); bson_decimal128_from_string_w_len ("12345678901234567", 17, &number); bson_decimal128_from_string_w_len ("989898983458", 12, &number_two); bson_decimal128_from_string_w_len ( "-12345678901234567", 18, &negative_number); bson_decimal128_from_string_w_len ("0.12345", 7, &fractional_number); bson_decimal128_from_string_w_len ("0.0012345", 9, &leading_zeros); bson_decimal128_from_string_w_len ( "00012345678901234567", 20, &leading_insignificant_zeros); BSON_ASSERT ( decimal128_equal (&one, 0x3040000000000000, 0x0000000000000001)); BSON_ASSERT ( decimal128_equal (&negative_one, 0xb040000000000000, 0x0000000000000001)); BSON_ASSERT ( decimal128_equal (&zero, 0x3040000000000000, 0x0000000000000000)); BSON_ASSERT (decimal128_equal ( &negative_zero, 0xb040000000000000, 0x0000000000000000)); BSON_ASSERT ( decimal128_equal (&number, 0x3040000000000000, 0x002bdc545d6b4b87)); BSON_ASSERT ( decimal128_equal (&number_two, 0x3040000000000000, 0x000000e67a93c822)); BSON_ASSERT (decimal128_equal ( &negative_number, 0xb040000000000000, 0x002bdc545d6b4b87)); BSON_ASSERT (decimal128_equal ( &fractional_number, 0x3036000000000000, 0x0000000000003039)); BSON_ASSERT (decimal128_equal ( &leading_zeros, 0x3032000000000000, 0x0000000000003039)); BSON_ASSERT (decimal128_equal ( &leading_insignificant_zeros, 0x3040000000000000, 0x002bdc545d6b4b87)); } static void test_decimal128_from_string__scientific (void) { bson_decimal128_t ten; bson_decimal128_t ten_again; bson_decimal128_t one; bson_decimal128_t huge_exp; bson_decimal128_t tiny_exp; bson_decimal128_t fractional; bson_decimal128_t trailing_zeros; bson_decimal128_from_string ("10e0", &ten); bson_decimal128_from_string ("1e1", &ten_again); bson_decimal128_from_string ("10e-1", &one); BSON_ASSERT ( decimal128_equal (&ten, 0x3040000000000000, 0x000000000000000a)); BSON_ASSERT ( decimal128_equal (&ten_again, 0x3042000000000000, 0x0000000000000001)); BSON_ASSERT ( decimal128_equal (&one, 0x303e000000000000, 0x000000000000000a)); bson_decimal128_from_string ("12345678901234567e6111", &huge_exp); bson_decimal128_from_string ("1e-6176", &tiny_exp); BSON_ASSERT ( decimal128_equal (&huge_exp, 0x5ffe000000000000, 0x002bdc545d6b4b87)); BSON_ASSERT ( decimal128_equal (&tiny_exp, 0x0000000000000000, 0x0000000000000001)); bson_decimal128_from_string ("-100E-10", &fractional); bson_decimal128_from_string ("10.50E8", &trailing_zeros); BSON_ASSERT ( decimal128_equal (&fractional, 0xb02c000000000000, 0x0000000000000064)); BSON_ASSERT (decimal128_equal ( &trailing_zeros, 0x304c000000000000, 0x000000000000041a)); bson_decimal128_from_string_w_len ("10e0", 4, &ten); bson_decimal128_from_string_w_len ("1e1", 3, &ten_again); bson_decimal128_from_string_w_len ("10e-1", 5, &one); BSON_ASSERT ( decimal128_equal (&ten, 0x3040000000000000, 0x000000000000000a)); BSON_ASSERT ( decimal128_equal (&ten_again, 0x3042000000000000, 0x0000000000000001)); BSON_ASSERT ( decimal128_equal (&one, 0x303e000000000000, 0x000000000000000a)); bson_decimal128_from_string_w_len ("12345678901234567e6111", 22, &huge_exp); bson_decimal128_from_string_w_len ("1e-6176", 7, &tiny_exp); BSON_ASSERT ( decimal128_equal (&huge_exp, 0x5ffe000000000000, 0x002bdc545d6b4b87)); BSON_ASSERT ( decimal128_equal (&tiny_exp, 0x0000000000000000, 0x0000000000000001)); bson_decimal128_from_string_w_len ("-100E-10", 8, &fractional); bson_decimal128_from_string_w_len ("10.50E8", 7, &trailing_zeros); BSON_ASSERT ( decimal128_equal (&fractional, 0xb02c000000000000, 0x0000000000000064)); BSON_ASSERT (decimal128_equal ( &trailing_zeros, 0x304c000000000000, 0x000000000000041a)); } static void test_decimal128_from_string__large (void) { bson_decimal128_t large; bson_decimal128_t all_digits; bson_decimal128_t largest; bson_decimal128_t tiniest; bson_decimal128_t full_house; bson_decimal128_from_string ("12345689012345789012345", &large); bson_decimal128_from_string ("1234567890123456789012345678901234", &all_digits); bson_decimal128_from_string ("9.999999999999999999999999999999999E+6144", &largest); bson_decimal128_from_string ("9.999999999999999999999999999999999E-6143", &tiniest); bson_decimal128_from_string ("5.192296858534827628530496329220095E+33", &full_house); BSON_ASSERT ( decimal128_equal (&large, 0x304000000000029d, 0x42da3a76f9e0d979)); BSON_ASSERT ( decimal128_equal (&all_digits, 0x30403cde6fff9732, 0xde825cd07e96aff2)); BSON_ASSERT ( decimal128_equal (&largest, 0x5fffed09bead87c0, 0x378d8e63ffffffff)); BSON_ASSERT ( decimal128_equal (&tiniest, 0x0001ed09bead87c0, 0x378d8e63ffffffff)); BSON_ASSERT ( decimal128_equal (&full_house, 0x3040ffffffffffff, 0xffffffffffffffff)); bson_decimal128_from_string_w_len ("12345689012345789012345", -1, &large); bson_decimal128_from_string_w_len ( "1234567890123456789012345678901234", -1, &all_digits); bson_decimal128_from_string_w_len ( "9.999999999999999999999999999999999E+6144", -1, &largest); bson_decimal128_from_string_w_len ( "9.999999999999999999999999999999999E-6143", -1, &tiniest); bson_decimal128_from_string_w_len ( "5.192296858534827628530496329220095E+33", -1, &full_house); BSON_ASSERT ( decimal128_equal (&large, 0x304000000000029d, 0x42da3a76f9e0d979)); BSON_ASSERT ( decimal128_equal (&all_digits, 0x30403cde6fff9732, 0xde825cd07e96aff2)); BSON_ASSERT ( decimal128_equal (&largest, 0x5fffed09bead87c0, 0x378d8e63ffffffff)); BSON_ASSERT ( decimal128_equal (&tiniest, 0x0001ed09bead87c0, 0x378d8e63ffffffff)); BSON_ASSERT ( decimal128_equal (&full_house, 0x3040ffffffffffff, 0xffffffffffffffff)); } static void test_decimal128_from_string__exponent_normalization (void) { bson_decimal128_t trailing_zeros; bson_decimal128_t one_normalize; bson_decimal128_t no_normalize; bson_decimal128_t a_disaster; bson_decimal128_from_string ("1000000000000000000000000000000000000000", &trailing_zeros); bson_decimal128_from_string ("10000000000000000000000000000000000", &one_normalize); bson_decimal128_from_string ("1000000000000000000000000000000000", &no_normalize); bson_decimal128_from_string ( "100000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000", &a_disaster); BSON_ASSERT (decimal128_equal ( &trailing_zeros, 0x304c314dc6448d93, 0x38c15b0a00000000)); BSON_ASSERT (decimal128_equal ( &one_normalize, 0x3042314dc6448d93, 0x38c15b0a00000000)); BSON_ASSERT ( decimal128_equal (&no_normalize, 0x3040314dc6448d93, 0x38c15b0a00000000)); BSON_ASSERT ( decimal128_equal (&a_disaster, 0x37cc314dc6448d93, 0x38c15b0a00000000)); bson_decimal128_from_string_w_len ( "1000000000000000000000000000000000000000", -1, &trailing_zeros); bson_decimal128_from_string_w_len ( "10000000000000000000000000000000000", -1, &one_normalize); bson_decimal128_from_string_w_len ( "1000000000000000000000000000000000", -1, &no_normalize); bson_decimal128_from_string_w_len ( "100000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000", -1, &a_disaster); BSON_ASSERT (decimal128_equal ( &trailing_zeros, 0x304c314dc6448d93, 0x38c15b0a00000000)); BSON_ASSERT (decimal128_equal ( &one_normalize, 0x3042314dc6448d93, 0x38c15b0a00000000)); BSON_ASSERT ( decimal128_equal (&no_normalize, 0x3040314dc6448d93, 0x38c15b0a00000000)); BSON_ASSERT ( decimal128_equal (&a_disaster, 0x37cc314dc6448d93, 0x38c15b0a00000000)); } static void test_decimal128_from_string__zeros (void) { bson_decimal128_t zero; bson_decimal128_t exponent_zero; bson_decimal128_t large_exponent; bson_decimal128_t negative_zero; bson_decimal128_from_string ("0", &zero); bson_decimal128_from_string ("0e-611", &exponent_zero); bson_decimal128_from_string ("0e+6000", &large_exponent); bson_decimal128_from_string ("-0e-1", &negative_zero); BSON_ASSERT ( decimal128_equal (&zero, 0x3040000000000000, 0x0000000000000000)); BSON_ASSERT (decimal128_equal ( &exponent_zero, 0x2b7a000000000000, 0x0000000000000000)); BSON_ASSERT (decimal128_equal ( &large_exponent, 0x5f20000000000000, 0x0000000000000000)); BSON_ASSERT (decimal128_equal ( &negative_zero, 0xb03e000000000000, 0x0000000000000000)); bson_decimal128_from_string_w_len ("0", 1, &zero); bson_decimal128_from_string_w_len ("0e-611", -1, &exponent_zero); bson_decimal128_from_string_w_len ("0e+6000", 7, &large_exponent); bson_decimal128_from_string_w_len ("-0e-1", 5, &negative_zero); BSON_ASSERT ( decimal128_equal (&zero, 0x3040000000000000, 0x0000000000000000)); BSON_ASSERT (decimal128_equal ( &exponent_zero, 0x2b7a000000000000, 0x0000000000000000)); BSON_ASSERT (decimal128_equal ( &large_exponent, 0x5f20000000000000, 0x0000000000000000)); BSON_ASSERT (decimal128_equal ( &negative_zero, 0xb03e000000000000, 0x0000000000000000)); } static void test_decimal128_from_string_w_len__special (void) { bson_decimal128_t number; bson_decimal128_t number_two; bson_decimal128_t negative_number; /* These strings have more bytes than the length indicates. */ bson_decimal128_from_string_w_len ("12345678901234567abcd", 17, &number); bson_decimal128_from_string_w_len ("989898983458abcd", 12, &number_two); bson_decimal128_from_string_w_len ( "-12345678901234567abcd", 18, &negative_number); BSON_ASSERT ( decimal128_equal (&number, 0x3040000000000000, 0x002bdc545d6b4b87)); BSON_ASSERT ( decimal128_equal (&number_two, 0x3040000000000000, 0x000000e67a93c822)); BSON_ASSERT (decimal128_equal ( &negative_number, 0xb040000000000000, 0x002bdc545d6b4b87)); } void test_decimal128_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/decimal128/to_string/infinity", test_decimal128_to_string__infinity); TestSuite_Add ( suite, "/bson/decimal128/to_string/nan", test_decimal128_to_string__nan); TestSuite_Add (suite, "/bson/decimal128/to_string/regular", test_decimal128_to_string__regular); TestSuite_Add (suite, "/bson/decimal128/to_string/scientific", test_decimal128_to_string__scientific); TestSuite_Add (suite, "/bson/decimal128/to_string/zero", test_decimal128_to_string__zeros); TestSuite_Add (suite, "/bson/decimal128/from_string/invalid", test_decimal128_from_string__invalid_inputs); TestSuite_Add (suite, "/bson/decimal128/from_string/nan", test_decimal128_from_string__nan); TestSuite_Add (suite, "/bson/decimal128/from_string/infinity", test_decimal128_from_string__infinity); TestSuite_Add (suite, "/bson/decimal128/from_string/basic", test_decimal128_from_string__simple); TestSuite_Add (suite, "/bson/decimal128/from_string/scientific", test_decimal128_from_string__scientific); TestSuite_Add (suite, "/bson/decimal128/from_string/large", test_decimal128_from_string__large); TestSuite_Add (suite, "/bson/decimal128/from_string/exponent_normalization", test_decimal128_from_string__exponent_normalization); TestSuite_Add (suite, "/bson/decimal128/from_string/zero", test_decimal128_from_string__zeros); TestSuite_Add (suite, "/bson/decimal128/from_string/with_length", test_decimal128_from_string_w_len__special); } mongo-c-driver-1.26.0/src/libbson/tests/test-endian.c000066400000000000000000000026411456567454500224200ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "TestSuite.h" static void test_swap16 (void) { uint16_t v = 0xFCBA; BSON_ASSERT (BSON_UINT16_SWAP_LE_BE (v) == 0xBAFC); BSON_ASSERT (__bson_uint16_swap_slow (v) == 0xBAFC); } static void test_swap32 (void) { uint32_t v = 0x00112233; BSON_ASSERT (BSON_UINT32_SWAP_LE_BE (v) == 0x33221100); BSON_ASSERT (__bson_uint32_swap_slow (v) == 0x33221100); } static void test_swap64 (void) { uint64_t v = 0x0011223344556677ULL; BSON_ASSERT (BSON_UINT64_SWAP_LE_BE (v) == 0x7766554433221100ULL); BSON_ASSERT (__bson_uint64_swap_slow (v) == 0x7766554433221100ULL); } void test_endian_install (TestSuite *suite) { TestSuite_Add (suite, "/endian/swap16", test_swap16); TestSuite_Add (suite, "/endian/swap32", test_swap32); TestSuite_Add (suite, "/endian/swap64", test_swap64); } mongo-c-driver-1.26.0/src/libbson/tests/test-iso8601.c000066400000000000000000000407721456567454500223020ustar00rootroot00000000000000#include #include "bson/bson-iso8601-private.h" #include "TestSuite.h" #define IS_TIME_T_SMALL (sizeof (time_t) == sizeof (int32_t)) static void test_date (const char *str, int64_t millis) { int64_t v; bson_error_t error; const size_t len = strlen (str); BSON_ASSERT (bson_in_range_unsigned (int32_t, len)); if (!_bson_iso8601_date_parse (str, (int32_t) len, &v, &error)) { fprintf (stderr, "could not parse (%s)\n", str); abort (); } if (v != millis) { fprintf (stderr, "parsed value not correct: %" PRId64 " != %" PRId64 "\n", millis, v); fprintf (stderr, "parsing: [%s]\n", str); abort (); } } static void test_date_io (const char *str_in, const char *str_out, int64_t millis) { bson_string_t *bson_str; test_date (str_in, millis); bson_str = bson_string_new (NULL); _bson_iso8601_date_format (millis, bson_str); ASSERT_CMPSTR (bson_str->str, str_out); bson_string_free (bson_str, true); } /* round trip str -> millis -> str */ static void test_date_rt (const char *str, int64_t millis) { test_date_io (str, str, millis); } static void test_date_should_fail (const char *str) { int64_t v; bson_error_t error; const size_t len = strlen (str); BSON_ASSERT (bson_in_range_unsigned (int32_t, len)); if (_bson_iso8601_date_parse (str, (int32_t) len, &v, &error)) { fprintf (stderr, "should not be able to parse (%s)\n", str); abort (); } } static void test_bson_iso8601_utc (void) { /* Allowed date format: * YYYY-MM-DDTHH:MM[:SS[.m[m[m]]]]Z * Year, month, day, hour, and minute are required, while the seconds * component and one to * three milliseconds are optional. */ test_date_rt ("1971-02-03T04:05:06.789Z", 34401906789ULL); test_date_io ( "1971-02-03T04:05:06.78Z", "1971-02-03T04:05:06.780Z", 34401906780ULL); test_date_io ( "1971-02-03T04:05:06.7Z", "1971-02-03T04:05:06.700Z", 34401906700ULL); test_date_rt ("1971-02-03T04:05:06Z", 34401906000ULL); test_date_io ("1971-02-03T04:05Z", "1971-02-03T04:05:00Z", 34401900000ULL); test_date_io ("1970-01-01T00:00:00.000Z", "1970-01-01T00:00:00Z", 0ULL); test_date_rt ("1970-06-30T01:06:40.981Z", 15556000981ULL); test_date ("1970-01-01T00:00:00.000+0100", -3600LL * 1000); if (!IS_TIME_T_SMALL) { test_date_rt ("2058-02-20T18:29:11.100Z", 2781455351100ULL); test_date ("3001-01-01T08:00:00.000Z", 32535244800000ULL); } test_date_rt ("2013-02-20T18:29:11.100Z", 1361384951100ULL); /* from the BSON Corpus Tests */ test_date_io ("1970-01-01T00:00:00.000Z", "1970-01-01T00:00:00Z", 0); test_date_rt ("2012-12-24T12:15:30.500Z", 1356351330500); test_date ("1960-12-24T12:15:30.500Z", -284643869500LL); } static void test_bson_iso8601_local (void) { /* Allowed date format: * YYYY-MM-DDTHH:MM[:SS[.m[m[m]]]]+HHMM * Year, month, day, hour, and minute are required, while the seconds * component and one to * three milliseconds are optional. The time zone offset must be four * digits. */ test_date_io ("1971-02-03T09:16:06.789+0511", "1971-02-03T04:05:06.789Z", 34401906789ULL); test_date_io ("1971-02-03T09:16:06.78+0511", "1971-02-03T04:05:06.780Z", 34401906780ULL); test_date_io ( "1971-02-03T09:16:06.7+0511", "1971-02-03T04:05:06.700Z", 34401906700ULL); test_date_io ( "1971-02-03T09:16:06+0511", "1971-02-03T04:05:06Z", 34401906000ULL); test_date_io ( "1971-02-03T09:16+0511", "1971-02-03T04:05:00Z", 34401900000ULL); test_date_io ("1970-01-01T00:00:00.000Z", "1970-01-01T00:00:00Z", 0ULL); test_date_rt ("1970-06-30T01:06:40.981Z", 15556000981ULL); test_date_io ("1970-06-29T21:06:40.981-0400", "1970-06-30T01:06:40.981Z", 15556000981ULL); test_date_io ("1969-12-31T16:00:00.000-0800", "1970-01-01T00:00:00Z", 0ULL); if (!IS_TIME_T_SMALL) { test_date_io ("2058-02-20T13:29:11.100-0500", "2058-02-20T18:29:11.100Z", 2781455351100ULL); test_date_rt ("3000-12-31T23:59:59Z", 32535215999000ULL); } else { test_date_rt ("2038-01-19T03:14:07Z", 2147483647000ULL); } test_date_io ("2013-02-20T13:29:11.100-0500", "2013-02-20T18:29:11.100Z", 1361384951100ULL); test_date_io ("2013-02-20T13:29:11.100-0501", "2013-02-20T18:30:11.100Z", 1361385011100ULL); test_date ("0000-01-01T00:00:00.000Z", -62167219200000LL); test_date ("0000-01-01T00:00:00.000+2300", -62167302000000LL); test_date ("9999-01-01T00:00:00.000Z", 253370764800000ULL); } static void test_bson_iso8601_invalid (void) { /* Invalid decimal */ test_date_should_fail ("1970-01-01T00:00:00.0.0Z"); test_date_should_fail ("1970-01-01T00:00:.0.000Z"); test_date_should_fail ("1970-01-01T00:.0:00.000Z"); test_date_should_fail ("1970-01-01T.0:00:00.000Z"); test_date_should_fail ("1970-01-.1T00:00:00.000Z"); test_date_should_fail ("1970-.1-01T00:00:00.000Z"); test_date_should_fail (".970-01-01T00:00:00.000Z"); /* Extra sign characters */ test_date_should_fail ("1970-01-01T00:00:00.+00Z"); test_date_should_fail ("1970-01-01T00:00:+0.000Z"); test_date_should_fail ("1970-01-01T00:+0:00.000Z"); test_date_should_fail ("1970-01-01T+0:00:00.000Z"); test_date_should_fail ("1970-01-+1T00:00:00.000Z"); test_date_should_fail ("1970-+1-01T00:00:00.000Z"); test_date_should_fail ("+970-01-01T00:00:00.000Z"); test_date_should_fail ("1970-01-01T00:00:00.-00Z"); test_date_should_fail ("1970-01-01T00:00:-0.000Z"); test_date_should_fail ("1970-01-01T00:-0:00.000Z"); test_date_should_fail ("1970-01-01T-0:00:00.000Z"); test_date_should_fail ("1970-01--1T00:00:00.000Z"); test_date_should_fail ("1970--1-01T00:00:00.000Z"); test_date_should_fail ("-970-01-01T00:00:00.000Z"); /* Out of range */ test_date_should_fail ("1970-01-01T00:60:00.000Z"); test_date_should_fail ("1970-01-01T24:00:00.000Z"); test_date_should_fail ("1970-01-32T00:00:00.000Z"); test_date_should_fail ("1970-01-00T00:00:00.000Z"); test_date_should_fail ("1970-13-01T00:00:00.000Z"); test_date_should_fail ("1970-00-01T00:00:00.000Z"); test_date_should_fail ("10000-01-01T00:00:00.000Z"); test_date_should_fail ("-10000-01-01T00:00:00.000Z"); /* Invalid lengths */ test_date_should_fail ("01970-01-01T00:00:00.000Z"); test_date_should_fail ("1970-001-01T00:00:00.000Z"); test_date_should_fail ("1970-01-001T00:00:00.000Z"); test_date_should_fail ("1970-01-01T000:00:00.000Z"); test_date_should_fail ("1970-01-01T00:000:00.000Z"); test_date_should_fail ("1970-01-01T00:00:000.000Z"); test_date_should_fail ("1970-01-01T00:00:00.0000Z"); test_date_should_fail ("197-01-01T00:00:00.000Z"); test_date_should_fail ("1970-1-01T00:00:00.000Z"); test_date_should_fail ("1970-01-1T00:00:00.000Z"); test_date_should_fail ("1970-01-01T0:00:00.000Z"); test_date_should_fail ("1970-01-01T00:0:00.000Z"); test_date_should_fail ("1970-01-01T00:00:0.000Z"); /* Invalid delimiters */ test_date_should_fail ("1970+01-01T00:00:00.000Z"); test_date_should_fail ("1970-01+01T00:00:00.000Z"); test_date_should_fail ("1970-01-01Q00:00:00.000Z"); test_date_should_fail ("1970-01-01T00-00:00.000Z"); test_date_should_fail ("1970-01-01T00:00-00.000Z"); test_date_should_fail ("1970-01-01T00:00:00-000Z"); /* Missing numbers */ test_date_should_fail ("1970--01T00:00:00.000Z"); test_date_should_fail ("1970-01-T00:00:00.000Z"); test_date_should_fail ("1970-01-01T:00:00.000Z"); test_date_should_fail ("1970-01-01T00::00.000Z"); test_date_should_fail ("1970-01-01T00:00:.000Z"); test_date_should_fail ("1970-01-01T00:00:00.Z"); /* Bad time offset field */ test_date_should_fail ("1970-01-01T05:00:01ZZ"); test_date_should_fail ("1970-01-01T05:00:01+"); test_date_should_fail ("1970-01-01T05:00:01-"); test_date_should_fail ("1970-01-01T05:00:01-11111"); test_date_should_fail ("1970-01-01T05:00:01Z1111"); test_date_should_fail ("1970-01-01T05:00:01+111"); test_date_should_fail ("1970-01-01T05:00:01+1160"); test_date_should_fail ("1970-01-01T05:00:01+2400"); test_date_should_fail ("1970-01-01T05:00:01+00+0"); /* Bad prefixes */ test_date_should_fail ("1970-01-01T05:00:01."); test_date_should_fail ("1970-01-01T05:00:"); test_date_should_fail ("1970-01-01T05:"); test_date_should_fail ("1970-01-01T"); test_date_should_fail ("1970-01-"); test_date_should_fail ("1970-"); test_date_should_fail ("1970-01-01T05+0500"); test_date_should_fail ("1970-01-01+0500"); test_date_should_fail ("1970-01+0500"); test_date_should_fail ("1970+0500"); test_date_should_fail ("1970-01-01T01Z"); test_date_should_fail ("1970-01-01Z"); test_date_should_fail ("1970-01Z"); test_date_should_fail ("1970Z"); /* No local time */ test_date_should_fail ("1970-01-01T00:00:00.000"); test_date_should_fail ("1970-01-01T00:00:00"); test_date_should_fail ("1970-01-01T00:00"); test_date_should_fail ("1970-01-01T00"); test_date_should_fail ("1970-01-01"); test_date_should_fail ("1970-01"); test_date_should_fail ("1970"); /* Invalid hex base specifiers */ test_date_should_fail ("x970-01-01T00:00:00.000Z"); test_date_should_fail ("1970-x1-01T00:00:00.000Z"); test_date_should_fail ("1970-01-x1T00:00:00.000Z"); test_date_should_fail ("1970-01-01Tx0:00:00.000Z"); test_date_should_fail ("1970-01-01T00:x0:00.000Z"); test_date_should_fail ("1970-01-01T00:00:x0.000Z"); test_date_should_fail ("1970-01-01T00:00:00.x00Z"); } static void test_bson_iso8601_leap_year (void) { test_date_rt ("1972-02-29T00:00:00Z", 68169600000ULL); test_date_rt ("1976-02-29T00:00:00Z", 194400000000ULL); test_date_rt ("1980-02-29T00:00:00Z", 320630400000ULL); test_date_rt ("1984-02-29T00:00:00Z", 446860800000ULL); test_date_rt ("1988-02-29T00:00:00Z", 573091200000ULL); test_date_rt ("1992-02-29T00:00:00Z", 699321600000ULL); test_date_rt ("1996-02-29T00:00:00Z", 825552000000ULL); test_date_rt ("2000-02-29T00:00:00Z", 951782400000ULL); test_date_rt ("2004-02-29T00:00:00Z", 1078012800000ULL); test_date_rt ("2008-02-29T00:00:00Z", 1204243200000ULL); test_date_rt ("2012-02-29T00:00:00Z", 1330473600000ULL); test_date_rt ("2016-02-29T00:00:00Z", 1456704000000ULL); test_date_rt ("2020-02-29T00:00:00Z", 1582934400000ULL); test_date_rt ("2024-02-29T00:00:00Z", 1709164800000ULL); test_date_rt ("2028-02-29T00:00:00Z", 1835395200000ULL); test_date_rt ("2032-02-29T00:00:00Z", 1961625600000ULL); test_date_rt ("2036-02-29T00:00:00Z", 2087856000000ULL); if (!IS_TIME_T_SMALL) { test_date_rt ("2040-02-29T00:00:00Z", 2214086400000ULL); test_date_rt ("2044-02-29T00:00:00Z", 2340316800000ULL); test_date_rt ("2048-02-29T00:00:00Z", 2466547200000ULL); test_date_rt ("2052-02-29T00:00:00Z", 2592777600000ULL); test_date_rt ("2056-02-29T00:00:00Z", 2719008000000ULL); test_date_rt ("2060-02-29T00:00:00Z", 2845238400000ULL); test_date_rt ("2064-02-29T00:00:00Z", 2971468800000ULL); test_date_rt ("2068-02-29T00:00:00Z", 3097699200000ULL); test_date_rt ("2072-02-29T00:00:00Z", 3223929600000ULL); test_date_rt ("2076-02-29T00:00:00Z", 3350160000000ULL); test_date_rt ("2080-02-29T00:00:00Z", 3476390400000ULL); test_date_rt ("2084-02-29T00:00:00Z", 3602620800000ULL); test_date_rt ("2088-02-29T00:00:00Z", 3728851200000ULL); test_date_rt ("2092-02-29T00:00:00Z", 3855081600000ULL); test_date_rt ("2096-02-29T00:00:00Z", 3981312000000ULL); test_date_rt ("2104-02-29T00:00:00Z", 4233686400000ULL); test_date_rt ("2108-02-29T00:00:00Z", 4359916800000ULL); test_date_rt ("2112-02-29T00:00:00Z", 4486147200000ULL); test_date_rt ("2116-02-29T00:00:00Z", 4612377600000ULL); test_date_rt ("2120-02-29T00:00:00Z", 4738608000000ULL); test_date_rt ("2124-02-29T00:00:00Z", 4864838400000ULL); test_date_rt ("2128-02-29T00:00:00Z", 4991068800000ULL); test_date_rt ("2132-02-29T00:00:00Z", 5117299200000ULL); test_date_rt ("2136-02-29T00:00:00Z", 5243529600000ULL); test_date_rt ("2140-02-29T00:00:00Z", 5369760000000ULL); test_date_rt ("2144-02-29T00:00:00Z", 5495990400000ULL); test_date_rt ("2148-02-29T00:00:00Z", 5622220800000ULL); test_date_rt ("2152-02-29T00:00:00Z", 5748451200000ULL); test_date_rt ("2156-02-29T00:00:00Z", 5874681600000ULL); test_date_rt ("2160-02-29T00:00:00Z", 6000912000000ULL); test_date_rt ("2164-02-29T00:00:00Z", 6127142400000ULL); test_date_rt ("2168-02-29T00:00:00Z", 6253372800000ULL); test_date_rt ("2172-02-29T00:00:00Z", 6379603200000ULL); test_date_rt ("2176-02-29T00:00:00Z", 6505833600000ULL); test_date_rt ("2180-02-29T00:00:00Z", 6632064000000ULL); test_date_rt ("2184-02-29T00:00:00Z", 6758294400000ULL); test_date_rt ("2188-02-29T00:00:00Z", 6884524800000ULL); test_date_rt ("2192-02-29T00:00:00Z", 7010755200000ULL); test_date_rt ("2196-02-29T00:00:00Z", 7136985600000ULL); test_date_rt ("2204-02-29T00:00:00Z", 7389360000000ULL); test_date_rt ("2208-02-29T00:00:00Z", 7515590400000ULL); test_date_rt ("2212-02-29T00:00:00Z", 7641820800000ULL); test_date_rt ("2216-02-29T00:00:00Z", 7768051200000ULL); test_date_rt ("2220-02-29T00:00:00Z", 7894281600000ULL); test_date_rt ("2224-02-29T00:00:00Z", 8020512000000ULL); test_date_rt ("2228-02-29T00:00:00Z", 8146742400000ULL); test_date_rt ("2232-02-29T00:00:00Z", 8272972800000ULL); test_date_rt ("2236-02-29T00:00:00Z", 8399203200000ULL); test_date_rt ("2240-02-29T00:00:00Z", 8525433600000ULL); test_date_rt ("2244-02-29T00:00:00Z", 8651664000000ULL); test_date_rt ("2248-02-29T00:00:00Z", 8777894400000ULL); test_date_rt ("2252-02-29T00:00:00Z", 8904124800000ULL); test_date_rt ("2256-02-29T00:00:00Z", 9030355200000ULL); test_date_rt ("2260-02-29T00:00:00Z", 9156585600000ULL); test_date_rt ("2264-02-29T00:00:00Z", 9282816000000ULL); test_date_rt ("2268-02-29T00:00:00Z", 9409046400000ULL); test_date_rt ("2272-02-29T00:00:00Z", 9535276800000ULL); test_date_rt ("2276-02-29T00:00:00Z", 9661507200000ULL); test_date_rt ("2280-02-29T00:00:00Z", 9787737600000ULL); test_date_rt ("2284-02-29T00:00:00Z", 9913968000000ULL); test_date_rt ("2288-02-29T00:00:00Z", 10040198400000ULL); test_date_rt ("2292-02-29T00:00:00Z", 10166428800000ULL); test_date_rt ("2296-02-29T00:00:00Z", 10292659200000ULL); test_date_rt ("2304-02-29T00:00:00Z", 10545033600000ULL); test_date_rt ("2308-02-29T00:00:00Z", 10671264000000ULL); test_date_rt ("2312-02-29T00:00:00Z", 10797494400000ULL); test_date_rt ("2316-02-29T00:00:00Z", 10923724800000ULL); test_date_rt ("2320-02-29T00:00:00Z", 11049955200000ULL); test_date_rt ("2324-02-29T00:00:00Z", 11176185600000ULL); test_date_rt ("2328-02-29T00:00:00Z", 11302416000000ULL); test_date_rt ("2332-02-29T00:00:00Z", 11428646400000ULL); test_date_rt ("2336-02-29T00:00:00Z", 11554876800000ULL); test_date_rt ("2340-02-29T00:00:00Z", 11681107200000ULL); test_date_rt ("2344-02-29T00:00:00Z", 11807337600000ULL); test_date_rt ("2348-02-29T00:00:00Z", 11933568000000ULL); test_date_rt ("2352-02-29T00:00:00Z", 12059798400000ULL); test_date_rt ("2356-02-29T00:00:00Z", 12186028800000ULL); test_date_rt ("2360-02-29T00:00:00Z", 12312259200000ULL); test_date_rt ("2364-02-29T00:00:00Z", 12438489600000ULL); test_date_rt ("2368-02-29T00:00:00Z", 12564720000000ULL); test_date_rt ("2372-02-29T00:00:00Z", 12690950400000ULL); test_date_rt ("2376-02-29T00:00:00Z", 12817180800000ULL); test_date_rt ("2380-02-29T00:00:00Z", 12943411200000ULL); test_date_rt ("2384-02-29T00:00:00Z", 13069641600000ULL); test_date_rt ("2388-02-29T00:00:00Z", 13195872000000ULL); test_date_rt ("2392-02-29T00:00:00Z", 13322102400000ULL); test_date_rt ("2396-02-29T00:00:00Z", 13448332800000ULL); test_date_rt ("2400-02-29T00:00:00Z", 13574563200000ULL); } } void test_iso8601_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/iso8601/utc", test_bson_iso8601_utc); TestSuite_Add (suite, "/bson/iso8601/local", test_bson_iso8601_local); TestSuite_Add (suite, "/bson/iso8601/invalid", test_bson_iso8601_invalid); TestSuite_Add ( suite, "/bson/iso8601/leap_year", test_bson_iso8601_leap_year); } mongo-c-driver-1.26.0/src/libbson/tests/test-iter.c000066400000000000000000000547151456567454500221360ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "TestSuite.h" #define FUZZ_N_PASSES 100000 static bson_t * get_bson (const char *filename) { uint8_t buf[4096]; bson_t *b; ssize_t len; int fd; if (-1 == (fd = bson_open (filename, O_RDONLY))) { fprintf (stderr, "Failed to open: %s\n", filename); abort (); } if ((len = bson_read (fd, buf, sizeof buf)) < 0) { fprintf (stderr, "Failed to read: %s\n", filename); abort (); } BSON_ASSERT (len > 0); b = bson_new_from_data (buf, (uint32_t) len); bson_close (fd); return b; } static void test_bson_iter_utf8 (void) { uint32_t len = 0; bson_iter_t iter; bson_t *b; char *s; b = bson_new (); BSON_ASSERT (bson_append_utf8 (b, "foo", -1, "bar", -1)); BSON_ASSERT (bson_append_utf8 (b, "bar", -1, "baz", -1)); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_UTF8 (&iter)); BSON_ASSERT (!strcmp (bson_iter_key (&iter), "foo")); BSON_ASSERT (!strcmp (bson_iter_utf8 (&iter, NULL), "bar")); s = bson_iter_dup_utf8 (&iter, &len); ASSERT_CMPSTR ("bar", s); ASSERT_CMPINT (len, ==, 3); bson_free (s); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_UTF8 (&iter)); BSON_ASSERT (!strcmp (bson_iter_key (&iter), "bar")); BSON_ASSERT (!strcmp (bson_iter_utf8 (&iter, NULL), "baz")); BSON_ASSERT (!bson_iter_next (&iter)); bson_destroy (b); } static void test_bson_iter_mixed (void) { bson_iter_t iter; bson_decimal128_t iter_value; bson_decimal128_t value; bson_t *b; bson_t *b2; b = bson_new (); b2 = bson_new (); value.high = 0; value.low = 1; BSON_ASSERT (bson_append_utf8 (b2, "foo", -1, "bar", -1)); BSON_ASSERT (bson_append_code (b, "0", -1, "var a = {};")); BSON_ASSERT (bson_append_code_with_scope (b, "1", -1, "var b = {};", b2)); BSON_ASSERT (bson_append_int32 (b, "2", -1, 1234)); BSON_ASSERT (bson_append_int64 (b, "3", -1, 4567)); BSON_ASSERT (bson_append_time_t (b, "4", -1, 123456)); BSON_ASSERT (bson_append_decimal128 (b, "5", -1, &value)); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_CODE (&iter)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_CODEWSCOPE (&iter)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&iter)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_DATE_TIME (&iter)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_DECIMAL128 (&iter)); BSON_ASSERT (!bson_iter_next (&iter)); BSON_ASSERT (bson_iter_init_find (&iter, b, "3")); BSON_ASSERT (!strcmp (bson_iter_key (&iter), "3")); BSON_ASSERT (bson_iter_int64 (&iter) == 4567); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (BSON_ITER_HOLDS_DATE_TIME (&iter)); BSON_ASSERT (bson_iter_time_t (&iter) == 123456); BSON_ASSERT (bson_iter_date_time (&iter) == 123456000); BSON_ASSERT (bson_iter_next (&iter)); bson_iter_decimal128 (&iter, &iter_value); /* This test uses memcmp because libbson lacks decimal128 comparison. */ BSON_ASSERT (memcmp (&iter_value, &value, sizeof (value)) == 0); BSON_ASSERT (!bson_iter_next (&iter)); bson_destroy (b); bson_destroy (b2); } static void test_bson_iter_overflow (void) { bson_iter_t iter; bson_t *b; b = get_bson (BSON_BINARY_DIR "/overflow1.bson"); BSON_ASSERT (!b); b = get_bson (BSON_BINARY_DIR "/overflow2.bson"); BSON_ASSERT (b); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (!bson_iter_next (&iter)); bson_destroy (b); } static void test_bson_iter_binary_deprecated (void) { bson_subtype_t subtype; uint32_t binary_len; const uint8_t *binary; bson_iter_t iter; bson_t *b; b = get_bson (BSON_BINARY_DIR "/binary_deprecated.bson"); BSON_ASSERT (b); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_next (&iter)); bson_iter_binary (&iter, &subtype, &binary_len, &binary); BSON_ASSERT (binary_len == 4); BSON_ASSERT (memcmp (binary, "1234", 4) == 0); bson_destroy (b); } static void test_bson_iter_timeval (void) { bson_iter_t iter; bson_t *b; struct timeval tv; b = get_bson (BSON_BINARY_DIR "/test26.bson"); BSON_ASSERT (b); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_next (&iter)); bson_iter_timeval (&iter, &tv); BSON_ASSERT (tv.tv_sec == 1234567890); BSON_ASSERT (tv.tv_usec == 0); bson_destroy (b); } static void test_bson_iter_trailing_null (void) { bson_iter_t iter; bson_t *b; b = get_bson (BSON_BINARY_DIR "/trailingnull.bson"); BSON_ASSERT (b); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (!bson_iter_next (&iter)); bson_destroy (b); } static void test_bson_iter_fuzz (void) { uint8_t *data; uint32_t len = 512; uint32_t len_le; uint32_t r; bson_iter_t iter; bson_t *b; uint32_t i; int pass; len_le = BSON_UINT32_TO_LE (len); for (pass = 0; pass < FUZZ_N_PASSES; pass++) { data = bson_malloc0 (len); memcpy (data, &len_le, sizeof (len_le)); for (i = 4; i < len; i += 4) { r = rand (); memcpy (&data[i], &r, sizeof (r)); } if (!(b = bson_new_from_data (data, len))) { /* * It could fail on buffer length or missing trailing null byte. */ bson_free (data); continue; } BSON_ASSERT (b); /* * TODO: Most of the following ignores the key. That should be fixed * but has it's own perils too. */ BSON_ASSERT (bson_iter_init (&iter, b)); while (bson_iter_next (&iter)) { BSON_ASSERT (iter.next_off < len); switch (bson_iter_type (&iter)) { case BSON_TYPE_ARRAY: case BSON_TYPE_DOCUMENT: { const uint8_t *child = NULL; uint32_t child_len = 0; bson_iter_document (&iter, &child_len, &child); if (child_len) { BSON_ASSERT (child); BSON_ASSERT (child_len >= 5); BSON_ASSERT ((iter.off + child_len) < b->len); BSON_ASSERT (child_len < (uint32_t) -1); memcpy (&child_len, child, sizeof (child_len)); child_len = BSON_UINT32_FROM_LE (child_len); BSON_ASSERT (child_len >= 5); } } break; case BSON_TYPE_DOUBLE: case BSON_TYPE_UTF8: case BSON_TYPE_BINARY: case BSON_TYPE_UNDEFINED: break; case BSON_TYPE_OID: BSON_ASSERT (iter.off + 12 < iter.len); break; case BSON_TYPE_BOOL: case BSON_TYPE_DATE_TIME: case BSON_TYPE_NULL: case BSON_TYPE_REGEX: /* TODO: check for 2 valid cstring. */ case BSON_TYPE_DBPOINTER: case BSON_TYPE_CODE: case BSON_TYPE_SYMBOL: case BSON_TYPE_CODEWSCOPE: case BSON_TYPE_INT32: case BSON_TYPE_TIMESTAMP: case BSON_TYPE_INT64: case BSON_TYPE_DECIMAL128: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: break; case BSON_TYPE_EOD: default: /* Code should not be reached. */ BSON_ASSERT (false); break; } } bson_destroy (b); bson_free (data); } } static void test_bson_iter_regex (void) { bson_iter_t iter; bson_t *b; b = bson_new (); BSON_ASSERT (bson_append_regex (b, "foo", -1, "^abcd", "")); BSON_ASSERT (bson_append_regex (b, "foo", -1, "^abcd", NULL)); BSON_ASSERT (bson_append_regex (b, "foo", -1, "^abcd", "ix")); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (bson_iter_next (&iter)); BSON_ASSERT (bson_iter_next (&iter)); bson_destroy (b); } static void test_bson_iter_next_after_finish (void) { bson_iter_t iter; bson_t *b; int i; b = bson_new (); BSON_ASSERT (bson_append_int32 (b, "key", -1, 1234)); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_next (&iter)); for (i = 0; i < 1000; i++) { BSON_ASSERT (!bson_iter_next (&iter)); } bson_destroy (b); } static void test_bson_iter_find_case (void) { bson_t b; bson_iter_t iter; bson_init (&b); BSON_ASSERT (bson_append_utf8 (&b, "key", -1, "value", -1)); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (bson_iter_find_case (&iter, "KEY")); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (!bson_iter_find (&iter, "KEY")); bson_destroy (&b); } static void test_bson_iter_find_w_len (void) { bson_t b; bson_iter_t iter; bson_init (&b); BSON_ASSERT (bson_append_utf8 (&b, "key", -1, "value", -1)); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (bson_iter_find_w_len (&iter, "key", 3)); bson_destroy (&b); bson_init (&b); BSON_ASSERT (bson_append_utf8 (&b, "key", -1, "value", -1)); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (bson_iter_find_w_len (&iter, "keys", 3)); bson_destroy (&b); bson_init (&b); BSON_ASSERT (bson_append_utf8 (&b, "key", -1, "value", -1)); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (bson_iter_find_w_len (&iter, "key", -1)); bson_destroy (&b); } static void test_bson_iter_init_find_w_len (void) { bson_t b; bson_iter_t iter; bson_init (&b); BSON_ASSERT (bson_append_utf8 (&b, "key", -1, "value", -1)); BSON_ASSERT (bson_iter_init_find_w_len (&iter, &b, "key", 3)); BSON_ASSERT (bson_iter_init_find_w_len (&iter, &b, "keys", 3)); BSON_ASSERT (bson_iter_init_find_w_len (&iter, &b, "key", -1)); bson_destroy (&b); } static void test_bson_iter_empty_key (void) { /* create a bson document empty keys. */ bson_t *bson = BCON_NEW ( "", "{", "x", BCON_INT32 (1), "", "{", "y", BCON_INT32 (2), "}", "}"); bson_iter_t iter; bson_iter_t descendant; BSON_ASSERT (bson_iter_init_find (&iter, bson, "")); BSON_ASSERT (bson_iter_init_find_case (&iter, bson, "")); BSON_ASSERT (BSON_ITER_HOLDS_DOCUMENT (&iter)); /* tests fixes applied in CDRIVER-2755. */ /* a find_w_len and length 0 should also find the key. */ BSON_ASSERT (bson_iter_init_find_w_len (&iter, bson, "", 0)); BSON_ASSERT (BSON_ITER_HOLDS_DOCUMENT (&iter)); /* similarly, we should descend on an empty key. */ bson_iter_init (&iter, bson); BSON_ASSERT (bson_iter_find_descendant (&iter, ".x", &descendant)); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&descendant)); ASSERT_CMPINT (bson_iter_int32 (&descendant), ==, 1); bson_iter_init (&iter, bson); BSON_ASSERT (bson_iter_find_descendant (&iter, "..y", &descendant)); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&descendant)); ASSERT_CMPINT (bson_iter_int32 (&descendant), ==, 2); bson_destroy (bson); } static void test_bson_iter_as_double (void) { bson_iter_t iter; bson_t b; bson_init (&b); ASSERT (bson_append_double (&b, "key", -1, 1234.1234)); ASSERT (bson_iter_init_find (&iter, &b, "key")); ASSERT (BSON_ITER_HOLDS_DOUBLE (&iter)); ASSERT (bson_iter_as_double (&iter) == 1234.1234); bson_destroy (&b); bson_init (&b); ASSERT (bson_append_int32 (&b, "key", -1, 1234)); ASSERT (bson_iter_init_find (&iter, &b, "key")); ASSERT (BSON_ITER_HOLDS_INT32 (&iter)); ASSERT (bson_iter_as_double (&iter) == 1234.0); bson_destroy (&b); bson_init (&b); ASSERT (bson_append_int64 (&b, "key", -1, 4321)); ASSERT (bson_iter_init_find (&iter, &b, "key")); ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); ASSERT (bson_iter_as_double (&iter) == 4321.0); bson_destroy (&b); } static void test_bson_iter_overwrite_int32 (void) { bson_iter_t iter; bson_t b; bson_init (&b); BSON_ASSERT (bson_append_int32 (&b, "key", -1, 1234)); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&iter)); bson_iter_overwrite_int32 (&iter, 4321); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&iter)); ASSERT_CMPINT (bson_iter_int32 (&iter), ==, 4321); bson_destroy (&b); } static void test_bson_iter_overwrite_int64 (void) { bson_iter_t iter; bson_t b; bson_init (&b); BSON_ASSERT (bson_append_int64 (&b, "key", -1, 1234)); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); bson_iter_overwrite_int64 (&iter, 4641); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); ASSERT_CMPINT64 (bson_iter_int64 (&iter), ==, (int64_t) 4641); bson_destroy (&b); } static void test_bson_iter_overwrite_decimal128 (void) { bson_iter_t iter; bson_t b; bson_decimal128_t value; bson_decimal128_t new_value; bson_decimal128_t iter_value; value.high = 0; value.low = 1; new_value.high = 0; new_value.low = 2; bson_init (&b); BSON_ASSERT (bson_append_decimal128 (&b, "key", -1, &value)); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_DECIMAL128 (&iter)); bson_iter_overwrite_decimal128 (&iter, &new_value); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_DECIMAL128 (&iter)); BSON_ASSERT (bson_iter_decimal128 (&iter, &iter_value)); BSON_ASSERT (memcmp (&iter_value, &new_value, sizeof (new_value)) == 0); bson_destroy (&b); } static void test_bson_iter_overwrite_double (void) { bson_iter_t iter; bson_t b; bson_init (&b); BSON_ASSERT (bson_append_double (&b, "key", -1, 1234.1234)); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_DOUBLE (&iter)); bson_iter_overwrite_double (&iter, 4641.1234); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_DOUBLE (&iter)); ASSERT_CMPDOUBLE (bson_iter_double (&iter), ==, 4641.1234); bson_destroy (&b); } static void test_bson_iter_overwrite_bool (void) { bson_iter_t iter; bson_t b; bson_init (&b); BSON_ASSERT (bson_append_bool (&b, "key", -1, true)); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_BOOL (&iter)); bson_iter_overwrite_bool (&iter, false); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_BOOL (&iter)); ASSERT_CMPINT (bson_iter_bool (&iter), ==, false); bson_destroy (&b); } static void test_bson_iter_overwrite_oid (void) { bson_oid_t oid; bson_iter_t iter; bson_t b; bson_oid_init_from_string (&oid, "000000000000000000001234"); bson_init (&b); BSON_ASSERT (BSON_APPEND_OID (&b, "key", &oid)); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); bson_oid_init_from_string (&oid, "000000000000000000004321"); bson_iter_overwrite_oid (&iter, &oid); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); ASSERT_CMPOID (bson_iter_oid (&iter), &oid); bson_destroy (&b); } static void test_bson_iter_overwrite_timestamp (void) { bson_iter_t iter; bson_t b; uint32_t t, i; bson_init (&b); BSON_ASSERT (BSON_APPEND_TIMESTAMP (&b, "key", 1, 2)); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); bson_iter_overwrite_timestamp (&iter, 3, 4); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); bson_iter_timestamp (&iter, &t, &i); ASSERT_CMPUINT32 (t, ==, 3); ASSERT_CMPUINT32 (i, ==, 4); bson_destroy (&b); } static void test_bson_iter_overwrite_date_time (void) { bson_iter_t iter; bson_t b; bson_init (&b); BSON_ASSERT (BSON_APPEND_DATE_TIME (&b, "key", 1234567890)); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); bson_iter_overwrite_date_time (&iter, -1234567890); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); ASSERT_CMPINT64 (bson_iter_date_time (&iter), ==, -1234567890); bson_destroy (&b); } static void test_bson_iter_recurse (void) { bson_iter_t iter; bson_iter_t child; bson_t b; bson_t cb; bson_init (&b); bson_init (&cb); BSON_ASSERT (bson_append_int32 (&cb, "0", 1, 0)); BSON_ASSERT (bson_append_int32 (&cb, "1", 1, 1)); BSON_ASSERT (bson_append_int32 (&cb, "2", 1, 2)); BSON_ASSERT (bson_append_array (&b, "key", -1, &cb)); BSON_ASSERT (bson_iter_init_find (&iter, &b, "key")); BSON_ASSERT (BSON_ITER_HOLDS_ARRAY (&iter)); BSON_ASSERT (bson_iter_recurse (&iter, &child)); BSON_ASSERT (bson_iter_find (&child, "0")); BSON_ASSERT (bson_iter_find (&child, "1")); BSON_ASSERT (bson_iter_find (&child, "2")); BSON_ASSERT (!bson_iter_next (&child)); bson_destroy (&b); bson_destroy (&cb); } static void test_bson_iter_init_find_case (void) { bson_t b; bson_iter_t iter; bson_init (&b); BSON_ASSERT (bson_append_int32 (&b, "FOO", -1, 1234)); BSON_ASSERT (bson_iter_init_find_case (&iter, &b, "foo")); ASSERT_CMPINT (bson_iter_int32 (&iter), ==, 1234); bson_destroy (&b); } static void test_bson_iter_find_descendant (void) { bson_iter_t iter; bson_iter_t desc; bson_t *b; b = get_bson (BSON_BINARY_DIR "/dotkey.bson"); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_find_descendant (&iter, "a.b.c.0", &desc)); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&desc)); BSON_ASSERT (bson_iter_int32 (&desc) == 1); bson_destroy (b); b = BCON_NEW ( "foo", "{", "bar", "[", "{", "baz", BCON_INT32 (1), "}", "]", "}"); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_find_descendant (&iter, "foo.bar.0.baz", &desc)); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&desc)); BSON_ASSERT (bson_iter_int32 (&desc) == 1); bson_destroy (b); b = BCON_NEW ("nModified", BCON_INT32 (1), "n", BCON_INT32 (2)); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_find_descendant (&iter, "n", &desc)); BSON_ASSERT (!strcmp (bson_iter_key (&desc), "n")); bson_destroy (b); b = BCON_NEW ("", BCON_INT32 (1), "n", BCON_INT32 (2)); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (bson_iter_find_descendant (&iter, "n", &desc)); BSON_ASSERT (!strcmp (bson_iter_key (&desc), "n")); bson_destroy (b); } static void test_bson_iter_as_bool (void) { bson_iter_t iter; bson_t b; bson_init (&b); bson_append_int32 (&b, "int32[true]", -1, 1); bson_append_int32 (&b, "int32[false]", -1, 0); bson_append_int64 (&b, "int64[true]", -1, 1); bson_append_int64 (&b, "int64[false]", -1, 0); bson_append_double (&b, "int64[true]", -1, 1.0); bson_append_double (&b, "int64[false]", -1, 0.0); bson_iter_init (&iter, &b); bson_iter_next (&iter); ASSERT_CMPINT (true, ==, bson_iter_as_bool (&iter)); bson_iter_next (&iter); ASSERT_CMPINT (false, ==, bson_iter_as_bool (&iter)); bson_iter_next (&iter); ASSERT_CMPINT (true, ==, bson_iter_as_bool (&iter)); bson_iter_next (&iter); ASSERT_CMPINT (false, ==, bson_iter_as_bool (&iter)); bson_iter_next (&iter); ASSERT_CMPINT (true, ==, bson_iter_as_bool (&iter)); bson_iter_next (&iter); ASSERT_CMPINT (false, ==, bson_iter_as_bool (&iter)); bson_destroy (&b); } static void test_bson_iter_from_data (void) { /* {"b": true}, with implicit NULL at end */ uint8_t data[] = "\x09\x00\x00\x00\x08\x62\x00\x01"; bson_iter_t iter; ASSERT (bson_iter_init_from_data (&iter, data, sizeof data)); ASSERT (bson_iter_next (&iter)); ASSERT (BSON_ITER_HOLDS_BOOL (&iter)); ASSERT (bson_iter_bool (&iter)); } void test_iter_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/iter/test_string", test_bson_iter_utf8); TestSuite_Add (suite, "/bson/iter/test_mixed", test_bson_iter_mixed); TestSuite_Add (suite, "/bson/iter/test_overflow", test_bson_iter_overflow); TestSuite_Add (suite, "/bson/iter/test_timeval", test_bson_iter_timeval); TestSuite_Add ( suite, "/bson/iter/test_trailing_null", test_bson_iter_trailing_null); TestSuite_Add (suite, "/bson/iter/test_fuzz", test_bson_iter_fuzz); TestSuite_Add (suite, "/bson/iter/test_regex", test_bson_iter_regex); TestSuite_Add (suite, "/bson/iter/test_next_after_finish", test_bson_iter_next_after_finish); TestSuite_Add (suite, "/bson/iter/test_find_case", test_bson_iter_find_case); TestSuite_Add ( suite, "/bson/iter/test_find_w_len", test_bson_iter_find_w_len); TestSuite_Add ( suite, "/bson/iter/test_init_find_w_len", test_bson_iter_init_find_w_len); TestSuite_Add ( suite, "/bson/iter/test_bson_iter_as_double", test_bson_iter_as_double); TestSuite_Add ( suite, "/bson/iter/test_overwrite_int32", test_bson_iter_overwrite_int32); TestSuite_Add ( suite, "/bson/iter/test_overwrite_int64", test_bson_iter_overwrite_int64); TestSuite_Add (suite, "/bson/iter/test_overwrite_double", test_bson_iter_overwrite_double); TestSuite_Add ( suite, "/bson/iter/test_overwrite_bool", test_bson_iter_overwrite_bool); TestSuite_Add ( suite, "/bson/iter/test_overwrite_oid", test_bson_iter_overwrite_oid); TestSuite_Add (suite, "/bson/iter/test_overwrite_timestamp", test_bson_iter_overwrite_timestamp); TestSuite_Add (suite, "/bson/iter/test_overwrite_date_time", test_bson_iter_overwrite_date_time); TestSuite_Add (suite, "/bson/iter/test_bson_iter_overwrite_decimal128", test_bson_iter_overwrite_decimal128); TestSuite_Add (suite, "/bson/iter/recurse", test_bson_iter_recurse); TestSuite_Add ( suite, "/bson/iter/init_find_case", test_bson_iter_init_find_case); TestSuite_Add ( suite, "/bson/iter/find_descendant", test_bson_iter_find_descendant); TestSuite_Add (suite, "/bson/iter/as_bool", test_bson_iter_as_bool); TestSuite_Add ( suite, "/bson/iter/binary_deprecated", test_bson_iter_binary_deprecated); TestSuite_Add (suite, "/bson/iter/from_data", test_bson_iter_from_data); TestSuite_Add (suite, "/bson/iter/empty_key", test_bson_iter_empty_key); } mongo-c-driver-1.26.0/src/libbson/tests/test-json.c000066400000000000000000003471121456567454500221400ustar00rootroot00000000000000/* required on old Windows for rand_s to be defined */ #define _CRT_RAND_S #include #include #include "TestSuite.h" #include "test-conveniences.h" static ssize_t test_bson_json_read_cb_helper (void *string, uint8_t *buf, size_t len) { size_t str_size = strlen ((char *) string); if (str_size) { memcpy (buf, string, BSON_MIN (str_size, len)); return str_size; } else { return 0; } } static void test_bson_json_allow_multiple (void) { int32_t one; bson_error_t error; bson_json_reader_t *reader; bson_t bson; const char *collection; const bson_oid_t *oid; bson_oid_t oid_expected; int i; /* nested JSON tests code that reuses parser stack frames, CDRIVER-2524 */ char *multiple_json = "{\"a\": 1}" "{\"b\": {\"$dbPointer\": " " {\"$ref\": \"c\", \"$id\": {\"$oid\": \"12341234123412abcdababcd\"}}}}" "{\"c\": {\"x\": 1}}"; bson_oid_init_from_string (&oid_expected, "12341234123412abcdababcd"); for (i = 0; i < 2; i++) { reader = bson_json_reader_new (multiple_json, &test_bson_json_read_cb_helper, NULL, i == 1 /* allow_multiple */, 0); BSON_ASSERT (reader); /* read first json */ bson_init (&bson); ASSERT_CMPINT (1, ==, bson_json_reader_read (reader, &bson, &error)); BCON_EXTRACT (&bson, "a", BCONE_INT32 (one)); ASSERT_CMPINT (1, ==, one); /* read second json */ bson_reinit (&bson); ASSERT_CMPINT (1, ==, bson_json_reader_read (reader, &bson, &error)); BCON_EXTRACT (&bson, "b", BCONE_DBPOINTER (collection, oid)); ASSERT_CMPSTR (collection, "c"); BSON_ASSERT (0 == bson_oid_compare (oid, &oid_expected)); /* read third json */ bson_reinit (&bson); ASSERT_CMPINT (1, ==, bson_json_reader_read (reader, &bson, &error)); BCON_EXTRACT (&bson, "c", BCONE_INT32 (one)); ASSERT_CMPINT (1, ==, one); /* surprisingly, the reader begins at the start of the string again */ bson_reinit (&bson); ASSERT_CMPINT (1, ==, bson_json_reader_read (reader, &bson, &error)); BCON_EXTRACT (&bson, "a", BCONE_INT32 (one)); ASSERT_CMPINT (1, ==, one); bson_json_reader_destroy (reader); bson_destroy (&bson); } } static void test_bson_as_json_x1000 (void) { bson_oid_t oid; bson_decimal128_t decimal128; bson_t *b; bson_t *b2; char *str; size_t len; int i; decimal128.high = 0x3040000000000000ULL; decimal128.low = 0x000000000000000B; bson_oid_init_from_string (&oid, "123412341234abcdabcdabcd"); b = bson_new (); BSON_ASSERT (bson_append_utf8 (b, "utf8", -1, "bar", -1)); BSON_ASSERT (bson_append_int32 (b, "int32", -1, 1234)); BSON_ASSERT (bson_append_int64 (b, "int64", -1, 4321)); BSON_ASSERT (bson_append_double (b, "double", -1, 123.4)); BSON_ASSERT (bson_append_undefined (b, "undefined", -1)); BSON_ASSERT (bson_append_null (b, "null", -1)); BSON_ASSERT (bson_append_oid (b, "oid", -1, &oid)); BSON_ASSERT (bson_append_bool (b, "true", -1, true)); BSON_ASSERT (bson_append_bool (b, "false", -1, false)); BSON_ASSERT (bson_append_time_t (b, "date", -1, time (NULL))); BSON_ASSERT ( bson_append_timestamp (b, "timestamp", -1, (uint32_t) time (NULL), 1234)); BSON_ASSERT (bson_append_regex (b, "regex", -1, "^abcd", "xi")); BSON_ASSERT ( bson_append_dbpointer (b, "dbpointer", -1, "mycollection", &oid)); BSON_ASSERT (bson_append_minkey (b, "minkey", -1)); BSON_ASSERT (bson_append_maxkey (b, "maxkey", -1)); BSON_ASSERT (bson_append_symbol (b, "symbol", -1, "var a = {};", -1)); BSON_ASSERT (bson_append_decimal128 (b, "decimal128", -1, &decimal128)); b2 = bson_new (); BSON_ASSERT (bson_append_int32 (b2, "0", -1, 60)); BSON_ASSERT (bson_append_document (b, "document", -1, b2)); BSON_ASSERT (bson_append_array (b, "array", -1, b2)); { const uint8_t binary[] = {0, 1, 2, 3, 4}; BSON_ASSERT (bson_append_binary ( b, "binary", -1, BSON_SUBTYPE_BINARY, binary, sizeof binary)); } for (i = 0; i < 1000; i++) { str = bson_as_json (b, &len); bson_free (str); } bson_destroy (b); bson_destroy (b2); } static void test_bson_as_json_multi (void) { bson_t *b; char *str; size_t len; b = bson_new (); { bson_oid_t oid; bson_oid_init_from_string (&oid, "57e193d7a9cc81b4027498b5"); BSON_ASSERT (bson_append_oid (b, "_id", -1, &oid)); } BSON_ASSERT (bson_append_symbol (b, "Symbol", -1, "symbol", -1)); BSON_ASSERT (bson_append_utf8 (b, "String", -1, "string", -1)); BSON_ASSERT (bson_append_int32 (b, "Int32", -1, 42)); BSON_ASSERT (bson_append_int64 (b, "Int64", -1, 42)); BSON_ASSERT (bson_append_double (b, "Double", -1, -1.0)); { const uint8_t binary[] = {0xa3, 0x4c, 0x38, 0xf7, 0xc3, 0xab, 0xed, 0xc8, 0xa3, 0x78, 0x14, 0xa9, 0x92, 0xab, 0x8d, 0xb6}; BSON_ASSERT (bson_append_binary ( b, "Binary", -1, BSON_SUBTYPE_UUID_DEPRECATED, binary, sizeof binary)); } { const uint8_t binary[] = {1, 2, 3, 4, 5}; BSON_ASSERT (bson_append_binary ( b, "BinaryUserDefined", -1, BSON_SUBTYPE_USER, binary, sizeof binary)); } BSON_ASSERT (bson_append_code (b, "Code", -1, "function() {}")); { bson_t *scope = bson_new (); BSON_ASSERT (bson_append_code_with_scope ( b, "CodeWithScope", -1, "function() {}", scope)); bson_destroy (scope); } { bson_t *document = bson_new (); BSON_ASSERT (bson_append_utf8 (document, "foo", -1, "bar", -1)); BSON_ASSERT (bson_append_document (b, "Subdocument", -1, document)); bson_destroy (document); } { bson_t *array = bson_new (); BSON_ASSERT (bson_append_int32 (array, "0", -1, 1)); BSON_ASSERT (bson_append_int32 (array, "1", -1, 2)); BSON_ASSERT (bson_append_int32 (array, "2", -1, 3)); BSON_ASSERT (bson_append_int32 (array, "3", -1, 4)); BSON_ASSERT (bson_append_int32 (array, "4", -1, 5)); BSON_ASSERT (bson_append_array (b, "Array", -1, array)); bson_destroy (array); } BSON_ASSERT (bson_append_timestamp (b, "Timestamp", -1, 42, 1)); BSON_ASSERT (bson_append_regex (b, "Regex", -1, "pattern", "")); BSON_ASSERT (bson_append_date_time (b, "DatetimeEpoch", -1, 0)); BSON_ASSERT (bson_append_date_time ( b, "DatetimePositive", -1, (int64_t) 2147483647LL)); BSON_ASSERT (bson_append_date_time ( b, "DatetimeNegative", -1, (int64_t) -2147483648LL)); BSON_ASSERT (bson_append_bool (b, "True", -1, true)); BSON_ASSERT (bson_append_bool (b, "False", -1, false)); { bson_oid_t oid; bson_oid_init_from_string (&oid, "57e193d7a9cc81b4027498b1"); BSON_ASSERT ( bson_append_dbpointer (b, "DBPointer", -1, "collection", &oid)); } { bson_oid_t oid; bson_t *dbref = bson_new (); bson_oid_init_from_string (&oid, "57fd71e96e32ab4225b723fb"); BSON_ASSERT (bson_append_utf8 (dbref, "$ref", -1, "collection", -1)); BSON_ASSERT (bson_append_oid (dbref, "$id", -1, &oid)); BSON_ASSERT (bson_append_utf8 (dbref, "$db", -1, "database", -1)); BSON_ASSERT (bson_append_document (b, "DBRef", -1, dbref)); bson_destroy (dbref); } BSON_ASSERT (bson_append_minkey (b, "Minkey", -1)); BSON_ASSERT (bson_append_maxkey (b, "Maxkey", -1)); BSON_ASSERT (bson_append_null (b, "Null", -1)); BSON_ASSERT (bson_append_undefined (b, "Undefined", -1)); { bson_decimal128_t decimal128; decimal128.high = 0x3040000000000000ULL; decimal128.low = 0x000000000000000B; BSON_ASSERT (bson_append_decimal128 (b, "Decimal128", -1, &decimal128)); } str = bson_as_json (b, &len); /* Based on multi-type-deprecated.json from BSON Corpus Tests. */ ASSERT_CMPSTR ( str, "{" " \"_id\" : { \"$oid\" : \"57e193d7a9cc81b4027498b5\" }," " \"Symbol\" : \"symbol\"," " \"String\" : \"string\"," " \"Int32\" : 42," " \"Int64\" : 42," " \"Double\" : -1.0," " \"Binary\" : { \"$binary\" : \"o0w498Or7cijeBSpkquNtg==\", \"$type\" : " "\"03\" }," " \"BinaryUserDefined\" : { \"$binary\" : \"AQIDBAU=\", \"$type\" : " "\"80\" }," " \"Code\" : { \"$code\" : \"function() {}\" }," " \"CodeWithScope\" : { \"$code\" : \"function() {}\", \"$scope\" : { } " "}," " \"Subdocument\" : { \"foo\" : \"bar\" }," " \"Array\" : [ 1, 2, 3, 4, 5 ]," " \"Timestamp\" : { \"$timestamp\" : { \"t\" : 42, \"i\" : 1 } }," " \"Regex\" : { \"$regex\" : \"pattern\", \"$options\" : \"\" }," " \"DatetimeEpoch\" : { \"$date\" : 0 }," " \"DatetimePositive\" : { \"$date\" : 2147483647 }," " \"DatetimeNegative\" : { \"$date\" : -2147483648 }," " \"True\" : true," " \"False\" : false," " \"DBPointer\" : { \"$ref\" : \"collection\", \"$id\" : " "\"57e193d7a9cc81b4027498b1\" }," " \"DBRef\" : { \"$ref\" : \"collection\", \"$id\" : { \"$oid\" : " "\"57fd71e96e32ab4225b723fb\" }, \"$db\" : \"database\" }," " \"Minkey\" : { \"$minKey\" : 1 }," " \"Maxkey\" : { \"$maxKey\" : 1 }," " \"Null\" : null," " \"Undefined\" : { \"$undefined\" : true }," " \"Decimal128\" : { \"$numberDecimal\" : \"11\" } }"); bson_free (str); bson_destroy (b); } static void test_bson_as_json_string (void) { size_t len; bson_t *b; char *str; b = bson_new (); BSON_ASSERT (bson_append_utf8 (b, "foo", -1, "bar", -1)); str = bson_as_json (b, &len); BSON_ASSERT (len == 17); BSON_ASSERT (!strcmp ("{ \"foo\" : \"bar\" }", str)); bson_free (str); bson_destroy (b); } static void test_bson_as_json_int32 (void) { size_t len; bson_t *b; char *str; b = bson_new (); BSON_ASSERT (bson_append_int32 (b, "foo", -1, 1234)); str = bson_as_json (b, &len); BSON_ASSERT (len == 16); BSON_ASSERT (!strcmp ("{ \"foo\" : 1234 }", str)); bson_free (str); bson_destroy (b); } static void test_bson_as_json_int64 (void) { size_t len; bson_t *b; char *str; b = bson_new (); BSON_ASSERT (bson_append_int64 (b, "foo", -1, 341234123412341234ULL)); str = bson_as_json (b, &len); BSON_ASSERT (len == 30); BSON_ASSERT (!strcmp ("{ \"foo\" : 341234123412341234 }", str)); bson_free (str); bson_destroy (b); } static void test_bson_as_json_double (void) { size_t len; bson_t *b; char *str; char *expected; b = bson_new (); BSON_ASSERT (bson_append_double (b, "foo", -1, 123.5)); BSON_ASSERT (bson_append_double (b, "bar", -1, 3)); BSON_ASSERT (bson_append_double (b, "baz", -1, -1)); BSON_ASSERT (bson_append_double (b, "quux", -1, 0.03125)); BSON_ASSERT (bson_append_double (b, "huge", -1, 1e99)); str = bson_as_json (b, &len); expected = bson_strdup_printf ("{" " \"foo\" : 123.5," " \"bar\" : 3.0," " \"baz\" : -1.0," " \"quux\" : 0.03125," " \"huge\" : %.20g }", 1e99); ASSERT_CMPSTR (str, expected); bson_free (expected); bson_free (str); bson_destroy (b); } static void test_bson_as_json_double_nonfinite (void) { size_t len; bson_t *b; char *str; char *expected; const double pos_inf = INFINITY; const double neg_inf = -pos_inf; b = bson_new (); BSON_ASSERT (bson_append_double (b, "nan", -1, NAN)); BSON_ASSERT (bson_append_double (b, "pos_inf", -1, pos_inf)); BSON_ASSERT (bson_append_double (b, "neg_inf", -1, neg_inf)); str = bson_as_json (b, &len); expected = bson_strdup_printf ("{" " \"nan\" : %.20g," " \"pos_inf\" : %.20g," " \"neg_inf\" : %.20g }", NAN, pos_inf, neg_inf); ASSERT_CMPSTR (str, expected); bson_free (expected); bson_free (str); bson_destroy (b); } static void test_bson_as_json_decimal128 (void) { size_t len; bson_t *b; char *str; bson_decimal128_t decimal128; decimal128.high = 0x3040000000000000ULL; decimal128.low = 0x000000000000000B; b = bson_new (); BSON_ASSERT (bson_append_decimal128 (b, "decimal128", -1, &decimal128)); str = bson_as_json (b, &len); ASSERT_CMPSTR (str, "{ " "\"decimal128\" : { \"$numberDecimal\" : \"11\" }" " }"); bson_free (str); bson_destroy (b); } static void test_bson_as_json_code (void) { bson_t code = BSON_INITIALIZER; bson_t scope = BSON_INITIALIZER; char *str; BSON_ASSERT (bson_append_code (&code, "c", -1, "function () {}")); str = bson_as_json (&code, NULL); ASSERT_CMPSTR (str, "{ \"c\" : { \"$code\" : \"function () {}\" } }"); bson_free (str); bson_reinit (&code); /* empty scope */ BSON_ASSERT ( BSON_APPEND_CODE_WITH_SCOPE (&code, "c", "function () {}", &scope)); str = bson_as_json (&code, NULL); ASSERT_CMPSTR ( str, "{ \"c\" : { \"$code\" : \"function () {}\", \"$scope\" : { } } }"); bson_free (str); bson_reinit (&code); BSON_APPEND_INT32 (&scope, "x", 1); BSON_ASSERT ( BSON_APPEND_CODE_WITH_SCOPE (&code, "c", "function () {}", &scope)); str = bson_as_json (&code, NULL); ASSERT_CMPSTR (str, "{ \"c\" : { \"$code\" : \"function () {}\", \"$scope\" " ": { \"x\" : 1 } } }"); bson_free (str); bson_reinit (&code); /* test that embedded quotes are backslash-escaped */ BSON_ASSERT (BSON_APPEND_CODE (&code, "c", "return \"a\"")); str = bson_as_json (&code, NULL); /* hard to read, this is { "c" : { "$code" : "return \"a\"" } } */ ASSERT_CMPSTR (str, "{ \"c\" : { \"$code\" : \"return \\\"a\\\"\" } }"); bson_free (str); bson_destroy (&code); bson_destroy (&scope); } static void test_bson_as_json_date_time (void) { bson_t *b; char *str; size_t len; b = bson_new (); BSON_ASSERT (bson_append_date_time (b, "epoch", -1, 0)); BSON_ASSERT (bson_append_date_time (b, "negative", -1, -123456000)); BSON_ASSERT (bson_append_date_time (b, "positive", -1, 123456000)); str = bson_as_json (b, &len); ASSERT_CMPSTR (str, "{" " \"epoch\" : { \"$date\" : 0 }," " \"negative\" : { \"$date\" : -123456000 }," " \"positive\" : { \"$date\" : 123456000 } }"); bson_free (str); bson_destroy (b); } static void test_bson_as_json_regex (void) { bson_t *b; char *str; size_t len; b = bson_new (); BSON_ASSERT (bson_append_regex (b, "regex", -1, "^abcd", "xi")); BSON_ASSERT (bson_append_regex (b, "escaping", -1, "^\"", "")); BSON_ASSERT (bson_append_regex (b, "ordered", -1, "^abcd", "ilmsux")); BSON_ASSERT (bson_append_regex (b, "unordered", -1, "^abcd", "xusmli")); BSON_ASSERT (bson_append_regex (b, "duplicate", -1, "^abcd", "mmiii")); BSON_ASSERT (bson_append_regex (b, "unsupported", -1, "^abcd", "jkmlvz")); str = bson_as_json (b, &len); ASSERT_CMPSTR (str, "{" " \"regex\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"ix\" }," " \"escaping\" : { \"$regex\" : \"^\\\"\", \"$options\" " ": \"\" }," " \"ordered\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"ilmsux\" }," " \"unordered\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"ilmsux\" }," " \"duplicate\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"im\" }," " \"unsupported\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"lm\" } }"); bson_free (str); bson_destroy (b); } static void test_bson_as_json_symbol (void) { bson_t *b; char *str; size_t len; b = bson_new (); BSON_ASSERT (bson_append_symbol (b, "symbol", -1, "foo", -1)); BSON_ASSERT (bson_append_symbol (b, "escaping", -1, "\"bar\"", -1)); str = bson_as_json (b, &len); ASSERT_CMPSTR (str, "{" " \"symbol\" : \"foo\"," " \"escaping\" : \"\\\"bar\\\"\" }"); bson_free (str); bson_destroy (b); } static void test_bson_as_json_utf8 (void) { /* euro currency symbol */ #define EU "\xe2\x82\xac" #define FIVE_EUROS EU EU EU EU EU size_t len; bson_t *b; char *str; b = bson_new (); BSON_ASSERT (bson_append_utf8 (b, FIVE_EUROS, -1, FIVE_EUROS, -1)); str = bson_as_json (b, &len); BSON_ASSERT (!strcmp (str, "{ \"" FIVE_EUROS "\" : \"" FIVE_EUROS "\" }")); bson_free (str); bson_destroy (b); } static void test_bson_as_json_dbpointer (void) { bson_oid_t oid; bson_t *b; char *str; size_t len; bson_oid_init_from_string (&oid, "12341234123412abcdababcd"); b = bson_new (); BSON_ASSERT (bson_append_dbpointer (b, "dbpointer", -1, "collection", &oid)); BSON_ASSERT (bson_append_dbpointer (b, "escaping", -1, "\"coll\"", &oid)); str = bson_as_json (b, &len); ASSERT_CMPSTR (str, "{" " \"dbpointer\" : { \"$ref\" : \"collection\", \"$id\" " ": \"12341234123412abcdababcd\" }," " \"escaping\" : { \"$ref\" : \"\\\"coll\\\"\", \"$id\" " ": \"12341234123412abcdababcd\" } }"); bson_free (str); bson_destroy (b); } static void test_bson_as_canonical_extended_json_dbpointer (void) { bson_oid_t oid; bson_t *b; size_t len; char *str; bson_oid_init_from_string (&oid, "12341234123412abcdababcd"); b = bson_new (); BSON_ASSERT (BSON_APPEND_DBPOINTER (b, "p", "coll", &oid)); str = bson_as_canonical_extended_json (b, &len); ASSERT_CMPJSON (str, "{ \"p\" : { \"$dbPointer\" : { \"$ref\" : " "\"coll\", \"$id\" : { \"$oid\" : " "\"12341234123412abcdababcd\" } } } }"); bson_destroy (b); } static void test_bson_as_json_stack_overflow (void) { uint8_t *buf; bson_t b; size_t buflen = 1024 * 1024 * 17; char *str; int fd; ssize_t r; buf = bson_malloc0 (buflen); fd = bson_open (BSON_BINARY_DIR "/stackoverflow.bson", O_RDONLY); BSON_ASSERT (-1 != fd); r = bson_read (fd, buf, buflen); BSON_ASSERT (r == 16777220); r = bson_init_static (&b, buf, 16777220); BSON_ASSERT (r); str = bson_as_json (&b, NULL); BSON_ASSERT (str); r = !!strstr (str, "..."); BSON_ASSERT (r); bson_free (str); bson_destroy (&b); bson_free (buf); } static void test_bson_corrupt (void) { uint8_t *buf; bson_t b; size_t buflen = 1024; char *str; int fd; ssize_t r; buf = bson_malloc0 (buflen); fd = bson_open (BSON_BINARY_DIR "/test55.bson", O_RDONLY); BSON_ASSERT (-1 != fd); r = bson_read (fd, buf, buflen); BSON_ASSERT (r == 24); r = bson_init_static (&b, buf, (uint32_t) r); BSON_ASSERT (r); str = bson_as_json (&b, NULL); BSON_ASSERT (!str); bson_destroy (&b); bson_free (buf); } static void test_bson_corrupt_utf8 (void) { uint8_t *buf; bson_t b; size_t buflen = 1024; char *str; int fd; ssize_t r; buf = bson_malloc0 (buflen); fd = bson_open (BSON_BINARY_DIR "/test56.bson", O_RDONLY); BSON_ASSERT (-1 != fd); r = bson_read (fd, buf, buflen); BSON_ASSERT (r == 42); r = bson_init_static (&b, buf, (uint32_t) r); BSON_ASSERT (r); str = bson_as_json (&b, NULL); BSON_ASSERT (!str); bson_destroy (&b); bson_free (buf); } static void test_bson_corrupt_binary (void) { uint8_t *buf; bson_t b; size_t buflen = 1024; char *str; int fd; ssize_t r; buf = bson_malloc0 (buflen); fd = bson_open (BSON_BINARY_DIR "/test57.bson", O_RDONLY); BSON_ASSERT (-1 != fd); r = bson_read (fd, buf, buflen); BSON_ASSERT (r == 26); r = bson_init_static (&b, buf, (uint32_t) r); BSON_ASSERT (r); str = bson_as_json (&b, NULL); BSON_ASSERT (!str); bson_destroy (&b); bson_free (buf); } #if !defined(BSON_HAVE_RAND_R) && !defined(_WIN32) static int rand_r (unsigned int *seed) { srand (*seed); return rand (); } #endif #ifdef _WIN32 #define RAND_R rand_s #else #define RAND_R rand_r #endif static char * rand_str (size_t maxlen, unsigned int *seed /* IN / OUT */, char *buf /* IN / OUT */) { size_t len = RAND_R (seed) % (maxlen - 1); size_t i; for (i = 0; i < len; i++) { buf[i] = (char) ('a' + i % 26); } buf[len] = '\0'; return buf; } /* test with random buffer sizes to ensure we parse whole keys and values when * reads pause and resume in the middle of tokens */ static void test_bson_json_read_buffering (void) { bson_t **bsons; char *json_tmp; bson_string_t *json; bson_error_t error; bson_t bson_out = BSON_INITIALIZER; int i; unsigned int seed = 42; int n_docs, docs_idx; int n_elems, elem_idx; char key[25]; char val[25]; bson_json_reader_t *reader; int r; json = bson_string_new (NULL); /* parse between 1 and 10 JSON objects */ for (n_docs = 1; n_docs < 10; n_docs++) { /* do 50 trials */ for (i = 0; i < 50; i++) { bsons = bson_malloc (n_docs * sizeof (bson_t *)); for (docs_idx = 0; docs_idx < n_docs; docs_idx++) { /* a BSON document with up to 10 strings and numbers */ bsons[docs_idx] = bson_new (); n_elems = RAND_R (&seed) % 5; for (elem_idx = 0; elem_idx < n_elems; elem_idx++) { bson_append_utf8 (bsons[docs_idx], rand_str (sizeof key, &seed, key), -1, rand_str (sizeof val, &seed, val), -1); bson_append_int32 (bsons[docs_idx], rand_str (sizeof key, &seed, key), -1, RAND_R (&seed) % INT32_MAX); } /* append the BSON document's JSON representation to "json" */ json_tmp = bson_as_json (bsons[docs_idx], NULL); BSON_ASSERT (json_tmp); bson_string_append (json, json_tmp); bson_free (json_tmp); } reader = bson_json_data_reader_new ( true /* "allow_multiple" is unused */, (size_t) RAND_R (&seed) % 100 /* bufsize*/); bson_json_data_reader_ingest ( reader, (uint8_t *) json->str, json->len); for (docs_idx = 0; docs_idx < n_docs; docs_idx++) { bson_reinit (&bson_out); r = bson_json_reader_read (reader, &bson_out, &error); if (r == -1) { fprintf (stderr, "%s\n", error.message); abort (); } BSON_ASSERT (r); bson_eq_bson (&bson_out, bsons[docs_idx]); } /* finished parsing */ ASSERT_CMPINT ( 0, ==, bson_json_reader_read (reader, &bson_out, &error)); bson_json_reader_destroy (reader); bson_string_truncate (json, 0); for (docs_idx = 0; docs_idx < n_docs; docs_idx++) { bson_destroy (bsons[docs_idx]); } bson_free (bsons); } } bson_string_free (json, true); bson_destroy (&bson_out); } static void _test_bson_json_read_compare (const char *json, int size, ...) { bson_error_t error = {0}; bson_json_reader_t *reader; va_list ap; int r; bson_t *compare; bson_t bson = BSON_INITIALIZER; reader = bson_json_data_reader_new ((size == 1), size); bson_json_data_reader_ingest (reader, (uint8_t *) json, strlen (json)); va_start (ap, size); while ((r = bson_json_reader_read (reader, &bson, &error))) { if (r == -1) { fprintf (stderr, "%s\n", error.message); abort (); } compare = va_arg (ap, bson_t *); BSON_ASSERT (compare); bson_eq_bson (&bson, compare); bson_destroy (compare); bson_reinit (&bson); } va_end (ap); bson_json_reader_destroy (reader); bson_destroy (&bson); } static void test_bson_json_read (void) { char *json = bson_strdup_printf ( "%s { \"after\": \"b\" } { \"twice\" : true }", json_with_all_types ()); bson_oid_t oid; bson_t *first, *second, *third; bson_oid_init_from_string (&oid, "000000000000000000000000"); first = bson_copy (bson_with_all_types ()); second = BCON_NEW ("after", "b"); third = BCON_NEW ("twice", BCON_BOOL (true)); _test_bson_json_read_compare (json, 5, first, second, third, NULL); bson_free (json); } static void test_bson_json_read_invalid_base64 (void) { const char *bad_json = "{ \"x\": { \"$binary\": {\"subType\": \"00\", " "\"base64\": \"\x30\x30\x30\x30\xcd\x8d\x79\" }}}"; bson_error_t error = {0}; BSON_ASSERT (!bson_new_from_json ((uint8_t *) bad_json, -1, &error)); ASSERT_ERROR_CONTAINS ( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"\x30\x30\x30\x30\xcd\x8d\x79\", looking for " "base64-encoded binary"); } static void test_bson_json_read_raw_utf8 (void) { bson_t *bson; bson_iter_t iter; bson = bson_new_from_json ( (const uint8_t *) "{\"" EU "\": \"" EU "\"}", -1, NULL); ASSERT (bson); ASSERT (bson_iter_init_find (&iter, bson, EU)); ASSERT_CMPSTR (bson_iter_key (&iter), EU); ASSERT_CMPSTR (bson_iter_utf8 (&iter, NULL), EU); ASSERT (!bson_iter_next (&iter)); bson_destroy (bson); } static void test_bson_json_read_corrupt_utf8 (void) { const char *bad_key = "{ \"\x80\" : \"a\"}"; const char *bad_value = "{ \"a\" : \"\x80\"}"; bson_error_t error = {0}; BSON_ASSERT (!bson_new_from_json ((uint8_t *) bad_key, -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "invalid bytes in UTF8 string"); memset (&error, 0, sizeof error); BSON_ASSERT (!bson_new_from_json ((uint8_t *) bad_value, -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "invalid bytes in UTF8 string"); } /* exercise early exit from _bson_as_json_visit_document/array, CDRIVER-2541 */ static void test_bson_json_read_corrupt_document (void) { /* like {a: {a: "\x80"}}, the value is invalid UTF-8 */ const char bad_doc[] = "\x16\x00\x00\x00" /* length */ "\x03\x61\x00" /* subdoc field with key "a" */ "\x0e\x00\x00\x00" /* length of subdoc in bytes */ "\x02\x61\x00\x02\x00\x00\x00\x80\x00" /* a: "\x80" */ "\x00"; /* terminator */ /* like {a: ["\x80"]}, the inner value is invalid UTF-8 */ const char bad_array[] = "\x16\x00\x00\x00" /* length */ "\x04\x61\x00" /* array field with key "a" */ "\x0e\x00\x00\x00" /* length of array in bytes */ "\x02\x30\x00" /* key "0" */ "\x02\x00\x00\x00\x80\x00" /* string "\x80" */ "\x00"; /* terminator */ bson_t bson; BSON_ASSERT ( bson_init_static (&bson, (uint8_t *) bad_doc, sizeof (bad_doc))); BSON_ASSERT (!bson_as_json (&bson, NULL)); BSON_ASSERT ( bson_init_static (&bson, (uint8_t *) bad_array, sizeof (bad_array))); BSON_ASSERT (!bson_as_json (&bson, NULL)); } static void test_bson_json_read_decimal128 (void) { const char *json = "{ \"decimal\" : { \"$numberDecimal\" : \"123.5\" }}"; bson_decimal128_t dec; bson_t *doc; bson_decimal128_from_string ("123.5", &dec); doc = BCON_NEW ("decimal", BCON_DECIMAL128 (&dec)); _test_bson_json_read_compare (json, 5, doc, NULL); } static void test_bson_json_read_dbpointer (void) { bson_t b; bson_error_t error; bool r; /* must have both $ref and $id, $id must be ObjectId */ const char *invalid[] = { "{\"p\": {\"$dbPointer\": {\"$ref\": \"db.collection\"}}", "$dbPointer requires both $id and $ref", "{\"p\": {\"$dbPointer\": {\"$ref\": \"db.collection\", \"$id\": 1}}", "$dbPointer.$id must be like {\"$oid\": ...\"}", "{\"p\": {\"$dbPointer\": {\"$id\": {" "\"$oid\": \"57e193d7a9cc81b4027498b1\"}}}}", "$dbPointer requires both $id and $ref", "{\"p\": {\"$dbPointer\": {}}}", "Empty $dbPointer", NULL}; const char **p; for (p = invalid; *p; p += 2) { r = bson_init_from_json (&b, *p, -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS ( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, *(p + 1)); } } static void test_bson_json_read_legacy_regex (void) { bson_t b; bson_error_t error; bool r; const char *pattern; const char *flags; r = bson_init_from_json ( &b, "{\"a\": {\"$regex\": \"abc\", \"$options\": \"ix\"}}", -1, &error); ASSERT_OR_PRINT (r, error); BCON_EXTRACT (&b, "a", BCONE_REGEX (pattern, flags)); ASSERT_CMPSTR (pattern, "abc"); ASSERT_CMPSTR (flags, "ix"); bson_destroy (&b); r = bson_init_from_json (&b, "{\"a\": {\"$regex\": \"abc\"}}", -1, &error); ASSERT_OR_PRINT (r, error); BCON_EXTRACT (&b, "a", BCONE_REGEX (pattern, flags)); ASSERT_CMPSTR (pattern, "abc"); ASSERT_CMPSTR (flags, ""); bson_destroy (&b); r = bson_init_from_json (&b, "{\"a\": {\"$options\": \"ix\"}}", -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Missing \"$regex\" after \"$options\""); } static void test_bson_json_read_regex_options_order (void) { bson_t b; bson_error_t error; bool r; const char *pattern; const char *flags; r = bson_init_from_json ( &b, "{\"a\": {\"$regex\": \"\", \"$options\": \"ism\"}}", -1, &error); ASSERT_OR_PRINT (r, error); BCON_EXTRACT (&b, "a", BCONE_REGEX (pattern, flags)); ASSERT_CMPSTR (flags, "ims"); bson_destroy (&b); r = bson_init_from_json ( &b, "{\"a\": {\"$regex\": \"\", \"$options\": \"misl\"}}", -1, &error); ASSERT_OR_PRINT (r, error); BCON_EXTRACT (&b, "a", BCONE_REGEX (pattern, flags)); ASSERT_CMPSTR (flags, "ilms"); bson_destroy (&b); } static void test_bson_json_read_binary (void) { bson_error_t error; bson_t b; bool r; bson_subtype_t subtype; uint32_t len; const uint8_t *binary; r = bson_init_from_json ( &b, "{\"b\": {\"$binary\": {\"base64\": \"Zm9v\", \"subType\": \"05\"}}}", -1, &error); ASSERT_OR_PRINT (r, error); BCON_EXTRACT (&b, "b", BCONE_BIN (subtype, binary, len)); ASSERT_CMPINT ((int) subtype, ==, 5); ASSERT_CMPUINT32 (len, ==, (uint32_t) 3); ASSERT_CMPSTR ((const char *) binary, "foo"); bson_destroy (&b); r = bson_init_from_json ( &b, "{\"b\": {\"$binary\": {\"subType\": \"05\", \"base64\": \"Zm9v\"}}}", -1, &error); ASSERT_OR_PRINT (r, error); BCON_EXTRACT (&b, "b", BCONE_BIN (subtype, binary, len)); ASSERT_CMPINT ((int) subtype, ==, 5); ASSERT_CMPUINT32 (len, ==, (uint32_t) 3); ASSERT_CMPSTR ((const char *) binary, "foo"); bson_destroy (&b); /* no base64 */ r = bson_init_from_json ( &b, "{\"b\": {\"$binary\": {\"subType\": \"5\"}}}", -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Missing \"base64\" after \"subType\""); memset (&error, 0, sizeof error); /* no subType */ r = bson_init_from_json ( &b, "{\"b\": {\"$binary\": {\"base64\": \"Zm9v\"}}}", -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Missing \"subType\" after \"base64\""); } static void test_bson_json_read_legacy_binary (void) { const char *jsons[] = {"{\"x\": {\"$binary\": \"Zm9v\", \"$type\": \"05\"}}", "{\"x\": {\"$type\": \"05\", \"$binary\": \"Zm9v\"}}", NULL}; const char **json; bson_error_t error; bson_t b; bool r; bson_subtype_t subtype; uint32_t len; const uint8_t *binary; for (json = jsons; *json; json++) { r = bson_init_from_json (&b, *json, -1, &error); ASSERT_OR_PRINT (r, error); BCON_EXTRACT (&b, "x", BCONE_BIN (subtype, binary, len)); ASSERT_CMPINT ((int) subtype, ==, 5); ASSERT_CMPUINT32 (len, ==, (uint32_t) 3); ASSERT_CMPSTR ((const char *) binary, "foo"); bson_destroy (&b); } } static void test_json_reader_new_from_file (void) { const char *path = BSON_JSON_DIR "/test.json"; const char *bar; const bson_oid_t *oid; bson_oid_t oid_expected; int32_t one; bson_t bson = BSON_INITIALIZER; bson_json_reader_t *reader; bson_error_t error; reader = bson_json_reader_new_from_file (path, &error); BSON_ASSERT (reader); /* read two documents */ ASSERT_CMPINT (1, ==, bson_json_reader_read (reader, &bson, &error)); BCON_EXTRACT (&bson, "foo", BCONE_UTF8 (bar), "a", BCONE_INT32 (one)); ASSERT_CMPSTR ("bar", bar); ASSERT_CMPINT (1, ==, one); bson_reinit (&bson); ASSERT_CMPINT (1, ==, bson_json_reader_read (reader, &bson, &error)); BCON_EXTRACT (&bson, "_id", BCONE_OID (oid)); bson_oid_init_from_string (&oid_expected, "aabbccddeeff001122334455"); BSON_ASSERT (bson_oid_equal (&oid_expected, oid)); bson_destroy (&bson); bson_json_reader_destroy (reader); } static void test_json_reader_new_from_bad_path (void) { const char *bad_path = BSON_JSON_DIR "/does-not-exist"; bson_json_reader_t *reader; bson_error_t error; reader = bson_json_reader_new_from_file (bad_path, &error); BSON_ASSERT (!reader); ASSERT_CMPINT (BSON_ERROR_READER, ==, error.domain); ASSERT_CMPINT (BSON_ERROR_READER_BADFD, ==, error.code); } static void test_bson_json_error (const char *json, int domain, bson_json_error_code_t code) { bson_error_t error; bson_t *bson; bson = bson_new_from_json ((const uint8_t *) json, strlen (json), &error); BSON_ASSERT (!bson); BSON_ASSERT (error.domain == domain); BSON_ASSERT (error.code == code); } static void test_bson_json_read_empty (void) { bson_error_t error; bson_t *bson_ptr; bson_t bson; bson_ptr = bson_new_from_json ((uint8_t *) "", 0, &error); BSON_ASSERT (!bson_ptr); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Empty JSON string"); memset (&error, 0, sizeof error); bson_init_from_json (&bson, "", 0, &error); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Empty JSON string"); } static void test_bson_json_read_missing_complex (void) { const char *json = "{ \n\ \"foo\" : { \n\ \"$options\" : \"ism\"\n\ }\n\ }"; test_bson_json_error ( json, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM); } static void test_bson_json_read_invalid_binary (void) { bson_error_t error; const char *json = "{ " " \"bin\" : { \"$binary\" : \"invalid\", \"$type\" : \"80\" } }"; bson_t b; bool r; r = bson_init_from_json (&b, json, -1, &error); BSON_ASSERT (!r); } static void test_bson_json_read_invalid_json (void) { const char *json = "{ \n\ \"foo\" : { \n\ }"; bson_t *b; test_bson_json_error ( json, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS); b = bson_new_from_json ((uint8_t *) "1", 1, NULL); BSON_ASSERT (!b); b = bson_new_from_json ((uint8_t *) "*", 1, NULL); BSON_ASSERT (!b); b = bson_new_from_json ((uint8_t *) "", 0, NULL); BSON_ASSERT (!b); b = bson_new_from_json ((uint8_t *) "asdfasdf", -1, NULL); BSON_ASSERT (!b); b = bson_new_from_json ((uint8_t *) "{\"a\":*}", -1, NULL); BSON_ASSERT (!b); } static ssize_t test_bson_json_read_bad_cb_helper (void *_ctx, uint8_t *buf, size_t len) { BSON_UNUSED (_ctx); BSON_UNUSED (buf); BSON_UNUSED (len); return -1; } static void test_bson_json_read_bad_cb (void) { bson_error_t error; bson_json_reader_t *reader; int r; bson_t bson = BSON_INITIALIZER; reader = bson_json_reader_new ( NULL, &test_bson_json_read_bad_cb_helper, NULL, false, 0); r = bson_json_reader_read (reader, &bson, &error); BSON_ASSERT (r == -1); BSON_ASSERT (error.domain == BSON_ERROR_JSON); BSON_ASSERT (error.code == BSON_JSON_ERROR_READ_CB_FAILURE); bson_json_reader_destroy (reader); bson_destroy (&bson); } static ssize_t test_bson_json_read_invalid_helper (void *ctx, uint8_t *buf, size_t len) { BSON_UNUSED (ctx); BSON_ASSERT (len); *buf = 0x80; /* no UTF-8 sequence can start with 0x80 */ return 1; } static void test_bson_json_read_invalid (void) { bson_error_t error; bson_json_reader_t *reader; int r; bson_t bson = BSON_INITIALIZER; reader = bson_json_reader_new ( NULL, test_bson_json_read_invalid_helper, NULL, false, 0); r = bson_json_reader_read (reader, &bson, &error); BSON_ASSERT (r == -1); BSON_ASSERT (error.domain == BSON_ERROR_JSON); BSON_ASSERT (error.code == BSON_JSON_ERROR_READ_CORRUPT_JS); bson_json_reader_destroy (reader); bson_destroy (&bson); } static void test_bson_json_number_long (void) { bson_error_t error; bson_iter_t iter; bson_t b; bool r; r = bson_init_from_json ( &b, "{\"key\": {\"$numberLong\": \"4611686018427387904\"}}", -1, &error); if (!r) fprintf (stderr, "%s\n", error.message); BSON_ASSERT (r); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (bson_iter_find (&iter, "key")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); BSON_ASSERT (bson_iter_int64 (&iter) == 4611686018427387904LL); bson_destroy (&b); BSON_ASSERT (!bson_init_from_json ( &b, "{\"key\": {\"$numberLong\": \"461168601abcd\"}}", -1, &error)); BSON_ASSERT (!bson_init_from_json ( &b, "{\"key\": {\"$numberLong\": \"461168601abcd\"}}", -1, &error)); /* INT64_MAX */ r = bson_init_from_json ( &b, "{\"x\": {\"$numberLong\": \"9223372036854775807\"}}", -1, &error); ASSERT_OR_PRINT (r, error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); ASSERT_CMPINT64 (bson_iter_int64 (&iter), ==, (int64_t) INT64_MAX); bson_destroy (&b); /* INT64_MIN */ r = bson_init_from_json ( &b, "{\"x\": {\"$numberLong\": \"-9223372036854775808\"}}", -1, &error); ASSERT_OR_PRINT (r, error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); ASSERT_CMPINT64 (bson_iter_int64 (&iter), ==, (int64_t) INT64_MIN); bson_destroy (&b); /* INT64_MAX + 1 */ r = bson_init_from_json ( &b, "{\"x\": {\"$numberLong\": \"9223372036854775808\"}}", -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"9223372036854775808\" is out of range"); memset (&error, 0, sizeof error); /* INT64_MIN - 1 */ r = bson_init_from_json ( &b, "{\"x\": {\"$numberLong\": \"-9223372036854775809\"}}", -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"-9223372036854775809\" is out of range"); memset (&error, 0, sizeof error); r = bson_init_from_json ( &b, "{\"x\": {\"$numberLong\": \"10000000000000000000\"}}", -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"10000000000000000000\" is out of range"); memset (&error, 0, sizeof error); /* INT64_MIN - 2 */ r = bson_init_from_json (&b, "{\"x\": -10000000000000000000}", -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"-10000000000000000000\" is out of range"); } static void test_bson_json_number_long_zero (void) { bson_error_t error; bson_iter_t iter; const char *json = "{ \"key\": { \"$numberLong\": \"0\" }}"; bson_t b; bool r; r = bson_init_from_json (&b, json, -1, &error); if (!r) fprintf (stderr, "%s\n", error.message); BSON_ASSERT (r); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (bson_iter_find (&iter, "key")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); BSON_ASSERT (bson_iter_int64 (&iter) == 0); bson_destroy (&b); } static void test_bson_json_code (void) { const char *json_code = "{\"a\": {\"$code\": \"b\"}}"; bson_t *bson_code = BCON_NEW ("a", BCON_CODE ("b")); const char *json_code_w_nulls = "{\"a\": {\"$code\": \"b\\u0000c\\u0000\"}}"; bson_t *bson_code_w_nulls = BCON_NEW ("a", BCON_CODE ("b\0c\0")); const char *json_code_w_scope = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var\": 1}}}"; bson_t *scope1 = BCON_NEW ("var", BCON_INT32 (1)); bson_t *bson_code_w_scope = BCON_NEW ("a", BCON_CODEWSCOPE ("b", scope1)); const char *json_code_w_scope_special = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var2\": {\"$numberLong\": \"2\"}}}}"; bson_t *scope2 = BCON_NEW ("var2", BCON_INT64 (2)); bson_t *bson_code_w_scope_special = BCON_NEW ("a", BCON_CODEWSCOPE ("b", scope2)); const char *json_2_codes_w_scope = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var\": 1}}," " \"c\": {\"$code\": \"d\", " " \"$scope\": {\"var2\": {\"$numberLong\": \"2\"}}}}"; bson_t *bson_2_codes_w_scope = BCON_NEW ( "a", BCON_CODEWSCOPE ("b", scope1), "c", BCON_CODEWSCOPE ("d", scope2)); const char *json_code_then_regular = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var\": 1}}," " \"c\": {\"key1\": \"value\", " " \"subdoc\": {\"key2\": \"value2\"}}}"; bson_t *bson_code_then_regular = BCON_NEW ("a", BCON_CODEWSCOPE ("b", scope1), "c", "{", "key1", BCON_UTF8 ("value"), "subdoc", "{", "key2", BCON_UTF8 ("value2"), "}", "}"); const char *json_code_w_scope_reverse = "{\"a\": {\"$scope\": {\"var\": 1}, " " \"$code\": \"b\"}}"; bson_t *bson_code_w_scope_reverse = BCON_NEW ("a", BCON_CODEWSCOPE ("b", scope1)); const char *json_code_w_scope_nest = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var\": {}}}}"; bson_t *scope3 = BCON_NEW ("var", "{", "}"); bson_t *bson_code_w_scope_nest = BCON_NEW ("a", BCON_CODEWSCOPE ("b", scope3)); const char *json_code_w_scope_nest_deep = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"arr\": [1, 2], \"d\": {}," " \"n\": {\"$numberLong\": \"1\"}," " \"d2\": {\"x\": 1, \"d3\": {\"z\": 3}}}}}"; bson_t *scope_deep = BCON_NEW ("arr", "[", BCON_INT32 (1), BCON_INT32 (2), "]", "d", "{", "}", "n", BCON_INT64 (1), "d2", "{", "x", BCON_INT32 (1), "d3", "{", "z", BCON_INT32 (3), "}", "}"); bson_t *bson_code_w_scope_nest_deep = BCON_NEW ("a", BCON_CODEWSCOPE ("b", scope_deep)); const char *json_code_w_empty_scope = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {}}}"; bson_t *empty = bson_new (); bson_t *bson_code_w_empty_scope = BCON_NEW ("a", BCON_CODEWSCOPE ("b", empty)); const char *json_code_in_scope = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"x\": {\"$code\": \"c\"}}}}"; bson_t *code_in_scope = BCON_NEW ("x", "{", "$code", BCON_UTF8 ("c"), "}"); bson_t *bson_code_in_scope = BCON_NEW ("a", BCON_CODEWSCOPE ("b", code_in_scope)); typedef struct { const char *json; bson_t *expected_bson; } code_test_t; code_test_t tests[] = { {json_code, bson_code}, {json_code_w_nulls, bson_code_w_nulls}, {json_code_w_scope, bson_code_w_scope}, {json_code_w_scope_special, bson_code_w_scope_special}, {json_code_then_regular, bson_code_then_regular}, {json_2_codes_w_scope, bson_2_codes_w_scope}, {json_code_w_scope_reverse, bson_code_w_scope_reverse}, {json_code_w_scope_nest, bson_code_w_scope_nest}, {json_code_w_scope_nest_deep, bson_code_w_scope_nest_deep}, {json_code_w_empty_scope, bson_code_w_empty_scope}, {json_code_in_scope, bson_code_in_scope}, }; int n_tests = sizeof (tests) / sizeof (code_test_t); int i; bson_t b; bool r; bson_error_t error; for (i = 0; i < n_tests; i++) { r = bson_init_from_json (&b, tests[i].json, -1, &error); if (!r) { fprintf (stderr, "%s\n", error.message); } BSON_ASSERT (r); bson_eq_bson (&b, tests[i].expected_bson); bson_destroy (&b); } for (i = 0; i < n_tests; i++) { bson_destroy (tests[i].expected_bson); } bson_destroy (scope1); bson_destroy (scope2); bson_destroy (scope3); bson_destroy (scope_deep); bson_destroy (code_in_scope); bson_destroy (empty); } static void test_bson_json_code_errors (void) { bson_error_t error; bson_t b; bool r; size_t i; typedef struct { const char *json; const char *error_message; } code_error_test_t; code_error_test_t tests[] = { {"{\"a\": {\"$scope\": {}}", "Missing $code after $scope"}, {"{\"a\": {\"$scope\": {}, \"$x\": 1}", "Invalid key \"$x\""}, {"{\"a\": {\"$scope\": {\"a\": 1}}", "Missing $code after $scope"}, {"{\"a\": {\"$code\": \"\", \"$scope\": \"a\"}}", "Invalid read of \"a\""}, {"{\"a\": {\"$code\": \"\", \"$scope\": 1}}", "Unexpected integer 1 in state \"IN_BSON_TYPE_SCOPE_STARTMAP\""}, {"{\"a\": {\"$code\": \"\", \"$scope\": []}}", "Invalid read of \"[\""}, {"{\"a\": {\"$code\": \"\", \"x\": 1}}", "Invalid key \"x\". Looking for values for type \"code\""}, {"{\"a\": {\"$code\": \"\", \"$x\": 1}}", "Invalid key \"$x\""}, {"{\"a\": {\"$code\": \"\", \"$numberLong\": \"1\"}}", "Invalid key \"$numberLong\""}, }; for (i = 0; i < sizeof (tests) / (sizeof (code_error_test_t)); i++) { r = bson_init_from_json (&b, tests[i].json, -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, tests[i].error_message); } } static const bson_oid_t * oid_zero (void) { static bool initialized = false; static bson_oid_t oid; if (!initialized) { bson_oid_init_from_string (&oid, "000000000000000000000000"); initialized = true; } return &oid; } static void test_bson_json_dbref (void) { bson_error_t error; const char *json_with_objectid_id = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": {\"$oid\": \"000000000000000000000000\"}}}"; bson_t *bson_with_objectid_id = BCON_NEW ("key", "{", "$ref", BCON_UTF8 ("collection"), "$id", BCON_OID (oid_zero ()), "}"); const char *json_with_int_id = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": 1}}"; bson_t *bson_with_int_id = BCON_NEW ( "key", "{", "$ref", BCON_UTF8 ("collection"), "$id", BCON_INT32 (1), "}"); const char *json_with_subdoc_id = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": {\"a\": 1}}}"; bson_t *bson_with_subdoc_id = BCON_NEW ("key", "{", "$ref", BCON_UTF8 ("collection"), "$id", "{", "a", BCON_INT32 (1), "}", "}"); const char *json_with_metadata = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": 1," "\"meta\": true}}"; bson_t *bson_with_metadata = BCON_NEW ("key", "{", "$ref", BCON_UTF8 ("collection"), "$id", BCON_INT32 (1), "meta", BCON_BOOL (true), "}"); const char *json_with_db = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": 1," "\"$db\": \"database\"}}"; bson_t *bson_with_db = BCON_NEW ("key", "{", "$ref", BCON_UTF8 ("collection"), "$id", BCON_INT32 (1), "$db", BCON_UTF8 ("database"), "}"); /* Note: the following examples are not valid DBRefs but are intended to test * that the Extended JSON parser leaves such documents as-is. */ const char *json_with_missing_ref = "{\"key\": {\"$id\": 1}}"; bson_t *bson_with_missing_ref = BCON_NEW ("key", "{", "$id", BCON_INT32 (1), "}"); const char *json_with_missing_id = "{\"key\": {\"$ref\": \"collection\"}}"; bson_t *bson_with_missing_id = BCON_NEW ("key", "{", "$ref", BCON_UTF8 ("collection"), "}"); const char *json_with_int_ref = "{\"key\": {\"$ref\": 1, \"$id\": 1}}"; bson_t *bson_with_int_ref = BCON_NEW ("key", "{", "$ref", BCON_INT32 (1), "$id", BCON_INT32 (1), "}"); const char *json_with_int_db = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": 1," "\"$db\": 1}}"; bson_t *bson_with_int_db = BCON_NEW ("key", "{", "$ref", BCON_UTF8 ("collection"), "$id", BCON_INT32 (1), "$db", BCON_INT32 (1), "}"); bson_t b; bool r; typedef struct { const char *json; bson_t *expected_bson; } dbref_test_t; dbref_test_t tests[] = { {json_with_objectid_id, bson_with_objectid_id}, {json_with_int_id, bson_with_int_id}, {json_with_subdoc_id, bson_with_subdoc_id}, {json_with_metadata, bson_with_metadata}, {json_with_db, bson_with_db}, {json_with_missing_ref, bson_with_missing_ref}, {json_with_missing_id, bson_with_missing_id}, {json_with_int_ref, bson_with_int_ref}, {json_with_int_db, bson_with_int_db}, }; int n_tests = sizeof (tests) / sizeof (dbref_test_t); int i; for (i = 0; i < n_tests; i++) { r = bson_init_from_json (&b, tests[i].json, -1, &error); if (!r) { fprintf (stderr, "%s\n", error.message); } BSON_ASSERT (r); bson_eq_bson (&b, tests[i].expected_bson); bson_destroy (&b); } for (i = 0; i < n_tests; i++) { bson_destroy (tests[i].expected_bson); } } static void test_bson_json_uescape (void) { bson_error_t error; bson_t b; bool r; const char *euro = "{ \"euro\": \"\\u20AC\"}"; bson_t *bson_euro = BCON_NEW ("euro", BCON_UTF8 ("\xE2\x82\xAC")); const char *crlf = "{ \"crlf\": \"\\r\\n\"}"; bson_t *bson_crlf = BCON_NEW ("crlf", BCON_UTF8 ("\r\n")); const char *quote = "{ \"quote\": \"\\\"\"}"; bson_t *bson_quote = BCON_NEW ("quote", BCON_UTF8 ("\"")); const char *backslash = "{ \"backslash\": \"\\\\\"}"; bson_t *bson_backslash = BCON_NEW ("backslash", BCON_UTF8 ("\\")); const char *empty = "{ \"\": \"\"}"; bson_t *bson_empty = BCON_NEW ("", BCON_UTF8 ("")); const char *escapes = "{ \"escapes\": \"\\f\\b\\t\"}"; bson_t *bson_escapes = BCON_NEW ("escapes", BCON_UTF8 ("\f\b\t")); const char *nil_byte = "{ \"nil\": \"\\u0000\"}"; bson_t *bson_nil_byte = bson_new (); /* we'll append "\0" to it, below */ typedef struct { const char *json; bson_t *expected_bson; } uencode_test_t; uencode_test_t tests[] = { {euro, bson_euro}, {crlf, bson_crlf}, {quote, bson_quote}, {backslash, bson_backslash}, {empty, bson_empty}, {escapes, bson_escapes}, {nil_byte, bson_nil_byte}, }; int n_tests = sizeof (tests) / sizeof (uencode_test_t); int i; bson_append_utf8 (bson_nil_byte, "nil", -1, "\0", 1); for (i = 0; i < n_tests; i++) { r = bson_init_from_json (&b, tests[i].json, -1, &error); if (!r) { fprintf (stderr, "%s\n", error.message); } BSON_ASSERT (r); bson_eq_bson (&b, tests[i].expected_bson); bson_destroy (&b); } for (i = 0; i < n_tests; i++) { bson_destroy (tests[i].expected_bson); } } static void test_bson_json_uescape_key (void) { bson_error_t error; bson_t b; bool r; bson_t *bson_euro = BCON_NEW ("\xE2\x82\xAC", BCON_UTF8 ("euro")); r = bson_init_from_json (&b, "{ \"\\u20AC\": \"euro\"}", -1, &error); BSON_ASSERT (r); bson_eq_bson (&b, bson_euro); bson_destroy (&b); bson_destroy (bson_euro); } static void test_bson_json_uescape_bad (void) { bson_error_t error; bson_t b; bool r; r = bson_init_from_json (&b, "{ \"bad\": \"\\u1\"}", -1, &error); BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "UESCAPE_TOOSHORT"); } static void test_bson_json_int32 (void) { bson_t b; bson_iter_t iter; bson_error_t error; /* INT32_MAX */ ASSERT_OR_PRINT ( bson_init_from_json (&b, "{ \"x\": 2147483647 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&iter)); ASSERT_CMPINT32 (bson_iter_int32 (&iter), ==, (int32_t) 2147483647LL); bson_destroy (&b); /* INT32_MIN */ ASSERT_OR_PRINT ( bson_init_from_json (&b, "{ \"x\": -2147483648 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&iter)); ASSERT_CMPINT32 (bson_iter_int32 (&iter), ==, (int32_t) -2147483648LL); bson_destroy (&b); /* INT32_MAX + 1 */ ASSERT_OR_PRINT ( bson_init_from_json (&b, "{ \"x\": 2147483648 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); ASSERT_CMPINT64 (bson_iter_int64 (&iter), ==, (int64_t) 2147483648LL); bson_destroy (&b); /* INT32_MIN - 1 */ ASSERT_OR_PRINT ( bson_init_from_json (&b, "{ \"x\": -2147483649 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); ASSERT_CMPINT64 (bson_iter_int64 (&iter), ==, (int64_t) -2147483649LL); bson_destroy (&b); } static void test_bson_json_int64 (void) { bson_t b; bson_iter_t iter; bson_error_t error; /* INT64_MAX */ ASSERT_OR_PRINT ( bson_init_from_json (&b, "{ \"x\": 9223372036854775807 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); ASSERT_CMPINT64 ( bson_iter_int64 (&iter), ==, (int64_t) 9223372036854775807LL); bson_destroy (&b); /* INT64_MIN */ ASSERT_OR_PRINT ( bson_init_from_json (&b, "{ \"x\": -9223372036854775808 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); ASSERT_CMPINT64 (bson_iter_int64 (&iter), ==, (int64_t) INT64_MIN); bson_destroy (&b); /* INT64_MAX + 1 */ BSON_ASSERT ( !bson_init_from_json (&b, "{ \"x\": 9223372036854775808 }", -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"9223372036854775808\" is out of range"); memset (&error, 0, sizeof error); /* INT64_MIN - 1 */ BSON_ASSERT ( !bson_init_from_json (&b, "{ \"x\": -9223372036854775809 }", -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"-9223372036854775809\" is out of range"); memset (&error, 0, sizeof error); BSON_ASSERT ( !bson_init_from_json (&b, "{ \"x\": 10000000000000000000 }", -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"10000000000000000000\" is out of range"); memset (&error, 0, sizeof error); /* INT64_MIN - 2 */ BSON_ASSERT (!bson_init_from_json ( &b, "{ \"x\": -10000000000000000000 }", -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"-10000000000000000000\" is out of range"); } static void test_bson_json_double (void) { bson_t b; bson_error_t error; bson_iter_t iter; ASSERT_OR_PRINT (bson_init_from_json (&b, "{ \"x\": 1 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT32 (&iter)); ASSERT_CMPINT32 (bson_iter_int32 (&iter), ==, (int32_t) 1); bson_destroy (&b); ASSERT_OR_PRINT ( bson_init_from_json (&b, "{ \"x\": 4294967296 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_INT64 (&iter)); ASSERT_CMPINT64 (bson_iter_int64 (&iter), ==, (int64_t) 4294967296); bson_destroy (&b); ASSERT_OR_PRINT (bson_init_from_json (&b, "{ \"x\": 1.0 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_DOUBLE (&iter)); ASSERT_CMPDOUBLE (bson_iter_double (&iter), ==, 1.0); bson_destroy (&b); ASSERT_OR_PRINT (bson_init_from_json (&b, "{ \"x\": 0.0 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_DOUBLE (&iter)); ASSERT_CMPDOUBLE (bson_iter_double (&iter), ==, 0.0); bson_destroy (&b); ASSERT_OR_PRINT (bson_init_from_json (&b, "{ \"x\": -0.0 }", -1, &error), error); BSON_ASSERT (bson_iter_init_find (&iter, &b, "x")); BSON_ASSERT (BSON_ITER_HOLDS_DOUBLE (&iter)); ASSERT_CMPDOUBLE (bson_iter_double (&iter), ==, 0.0); /* check that "x" is -0.0. signbit not available on Solaris, FreeBSD, or VS 2010 */ #if !defined(__sun) && !defined(__FreeBSD__) && \ (!defined(_MSC_VER) || (_MSC_VER >= 1800)) BSON_ASSERT (signbit (bson_iter_double (&iter))); #endif bson_destroy (&b); } static void test_bson_json_double_overflow (void) { const char *nums[] = {"2e400", "-2e400", NULL}; const char **p; char *j; bson_error_t error; bson_t b; for (p = nums; *p; p++) { j = bson_strdup_printf ("{ \"d\" : %s }", *p); BSON_ASSERT (!bson_init_from_json (&b, j, -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "out of range"); bson_free (j); memset (&error, 0, sizeof error); /* same test with canonical Extended JSON */ j = bson_strdup_printf ("{ \"d\" : { \"$numberDouble\" : \"%s\" } }", *p); BSON_ASSERT (!bson_init_from_json (&b, j, -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "out of range"); bson_free (j); } } static void test_bson_json_nan (void) { bson_error_t error; bson_t b; double d; /* should parse any capitalization of NaN */ const char *jsons[] = {"{ \"d\": NaN }", "{ \"d\": nAn }", "{ \"d\": {\"$numberDouble\": \"NaN\" } }", "{ \"d\": {\"$numberDouble\": \"nAn\" } }", NULL}; /* test our patch to JSONSL that updates its state while parsing "n..." */ const char *bad[] = {"{ \"d\": NaNn }", "{ \"d\": nul }", "{ \"d\": nulll }", "{ \"d\": nulll }", "{ \"d\": foo }", "{ \"d\": NULL }", "{ \"d\": nall }", NULL}; const char *partial[] = {"{ \"d\": nu", "{ \"d\": na", "{ \"d\": n", NULL}; const char **j; for (j = jsons; *j; j++) { BSON_ASSERT (bson_init_from_json (&b, *j, -1, &error)); BSON_ASSERT (BCON_EXTRACT (&b, "d", BCONE_DOUBLE (d))); BSON_ASSERT (d != d); bson_destroy (&b); } for (j = bad; *j; j++) { BSON_ASSERT (!bson_init_from_json (&b, *j, -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error at"); memset (&error, 0, sizeof error); } for (j = partial; *j; j++) { BSON_ASSERT (!bson_init_from_json (&b, *j, -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Incomplete JSON"); memset (&error, 0, sizeof error); } } static void test_bson_json_infinity (void) { bson_error_t error; bson_t b; double d; /* should parse any capitalization of Infinity */ const char *infs[] = {"{ \"d\": Infinity }", "{ \"d\": infinity }", "{ \"d\": inFINIty }", NULL}; const char *negs[] = {"{ \"d\": -Infinity }", "{ \"d\": -infinity }", "{ \"d\": -inFINIty }", NULL}; const char *bad[] = {"{ \"d\": Infinityy }", "{ \"d\": Infinit }", "{ \"d\": -Infinityy }", "{ \"d\": -Infinit }", "{ \"d\": infinityy }", "{ \"d\": infinit }", "{ \"d\": -infinityy }", "{ \"d\": -infinit }", NULL}; const char *partial[] = {"{ \"d\": In", "{ \"d\": I", "{ \"d\": i", NULL}; const char **j; for (j = infs; *j; j++) { BSON_ASSERT (bson_init_from_json (&b, *j, -1, &error)); BSON_ASSERT (BCON_EXTRACT (&b, "d", BCONE_DOUBLE (d))); /* Infinite */ BSON_ASSERT (d == d && ((d - d) != (d - d))); bson_destroy (&b); } for (j = negs; *j; j++) { BSON_ASSERT (bson_init_from_json (&b, *j, -1, &error)); BSON_ASSERT (BCON_EXTRACT (&b, "d", BCONE_DOUBLE (d))); /* Infinite */ BSON_ASSERT (d == d && ((d - d) != (d - d))); BSON_ASSERT (d < 0); bson_destroy (&b); } for (j = bad; *j; j++) { BSON_ASSERT (!bson_init_from_json (&b, *j, -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error at"); memset (&error, 0, sizeof error); } for (j = partial; *j; j++) { BSON_ASSERT (!bson_init_from_json (&b, *j, -1, &error)); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Incomplete JSON"); memset (&error, 0, sizeof error); } } static void test_bson_json_null (void) { bson_error_t error; bson_t b; const char *json = "{ \"x\": null }"; BSON_ASSERT (bson_init_from_json (&b, json, -1, &error)); BSON_ASSERT (BCON_EXTRACT (&b, "x", BCONE_NULL)); bson_destroy (&b); } static void test_bson_json_empty_final_object (void) { const char *json = "{\"a\": {\"b\": {}}}"; bson_t *bson = BCON_NEW ("a", "{", "b", "{", "}", "}"); bson_t b; bool r; bson_error_t error; r = bson_init_from_json (&b, json, -1, &error); if (!r) { fprintf (stderr, "%s\n", error.message); } BSON_ASSERT (r); bson_eq_bson (&b, bson); bson_destroy (&b); bson_destroy (bson); } static void test_bson_json_number_decimal (void) { bson_error_t error; bson_iter_t iter; bson_decimal128_t decimal128; const char *json = "{ \"key\" : { \"$numberDecimal\": \"11\" }}"; bson_t b; bool r; r = bson_init_from_json (&b, json, -1, &error); if (!r) fprintf (stderr, "%s\n", error.message); BSON_ASSERT (r); BSON_ASSERT (bson_iter_init (&iter, &b)); BSON_ASSERT (bson_iter_find (&iter, "key")); BSON_ASSERT (BSON_ITER_HOLDS_DECIMAL128 (&iter)); bson_iter_decimal128 (&iter, &decimal128); BSON_ASSERT (decimal128.low == 11); BSON_ASSERT (decimal128.high == 0x3040000000000000ULL); bson_destroy (&b); } static void test_bson_json_inc (void) { /* test that reproduces a bug with special mode checking. Specifically, * mistaking '$inc' for '$id' * * From https://github.com/mongodb/mongo-c-driver/issues/62 */ bson_error_t error; const char *json = "{ \"$inc\" : { \"ref\" : 1 } }"; bson_t b; bool r; r = bson_init_from_json (&b, json, -1, &error); if (!r) fprintf (stderr, "%s\n", error.message); BSON_ASSERT (r); bson_destroy (&b); } static void test_bson_json_array (void) { bson_error_t error; const char *json = "[ 0, 1, 2, 3 ]"; bson_t b, compare; bool r; bson_init (&compare); bson_append_int32 (&compare, "0", 1, 0); bson_append_int32 (&compare, "1", 1, 1); bson_append_int32 (&compare, "2", 1, 2); bson_append_int32 (&compare, "3", 1, 3); r = bson_init_from_json (&b, json, -1, &error); if (!r) fprintf (stderr, "%s\n", error.message); BSON_ASSERT (r); bson_eq_bson (&b, &compare); bson_destroy (&compare); bson_destroy (&b); } static void test_bson_json_array_single (void) { bson_error_t error; const char *json = "[ 0 ]"; bson_t b, compare; bool r; bson_init (&compare); bson_append_int32 (&compare, "0", 1, 0); r = bson_init_from_json (&b, json, -1, &error); if (!r) fprintf (stderr, "%s\n", error.message); BSON_ASSERT (r); bson_eq_bson (&b, &compare); bson_destroy (&compare); bson_destroy (&b); } static void test_bson_json_array_int64 (void) { bson_error_t error; const char *json = "[ { \"$numberLong\" : \"123\" }," " { \"$numberLong\" : \"42\" } ]"; bson_t b, compare; bool r; bson_init (&compare); bson_append_int64 (&compare, "0", 1, 123); bson_append_int64 (&compare, "1", 1, 42); r = bson_init_from_json (&b, json, -1, &error); if (!r) fprintf (stderr, "%s\n", error.message); BSON_ASSERT (r); bson_eq_bson (&b, &compare); bson_destroy (&compare); bson_destroy (&b); } static void test_bson_json_array_subdoc (void) { bson_error_t error; const char *json = "[ { \"a\" : 123 } ]"; bson_t b, compare, subdoc; bool r; bson_init (&compare); bson_init (&subdoc); bson_append_int32 (&subdoc, "a", 1, 123); bson_append_document (&compare, "0", 1, &subdoc); r = bson_init_from_json (&b, json, -1, &error); if (!r) fprintf (stderr, "%s\n", error.message); BSON_ASSERT (r); bson_eq_bson (&b, &compare); bson_destroy (&subdoc); bson_destroy (&compare); bson_destroy (&b); } static void test_bson_json_merge_multiple (void) { bson_error_t error; bson_t *b = bson_new_from_json ( (const uint8_t *) "{\"a\" : 1}, {\"b\" : 2}", -1, &error); ASSERT_OR_PRINT (b, error); bson_t *compare = bson_new_from_json ( (const uint8_t *) BSON_STR ({"a" : 1, "b" : 2}), -1, &error); bson_eq_bson (b, compare); bson_destroy (b); bson_destroy (compare); } static void test_bson_json_extra_chars (void) { bson_error_t error; { bson_t *b = bson_new_from_json ((const uint8_t *) "{\"a\": 1}abc", -1, &error); ASSERT (b == NULL); ASSERT_ERROR_CONTAINS (error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error at \"a\""); } { bson_t *b = bson_new_from_json ( (const uint8_t *) "{\"a\" : 1}{abc,[],{},123", -1, &error); ASSERT_OR_PRINT (b, error); bson_t *compare = bson_new_from_json ((const uint8_t *) "{\"a\" : 1}", -1, &error); bson_eq_bson (b, compare); bson_destroy (b); bson_destroy (compare); } } static void test_bson_json_date_check (const char *json, int64_t value) { bson_error_t error = {0}; bson_t b, compare; bool r; bson_init (&compare); BSON_APPEND_DATE_TIME (&compare, "dt", value); r = bson_init_from_json (&b, json, -1, &error); if (!r) { fprintf (stderr, "%s\n", error.message); } BSON_ASSERT (r); bson_eq_bson (&b, &compare); bson_destroy (&compare); bson_destroy (&b); } static void test_bson_json_date_error (const char *json, const char *msg) { bson_error_t error = {0}; bson_t b; bool r; r = bson_init_from_json (&b, json, -1, &error); if (r) { fprintf (stderr, "parsing %s should fail\n", json); } BSON_ASSERT (!r); ASSERT_ERROR_CONTAINS ( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, msg); } static void test_bson_json_date (void) { /* to make a timestamp, "python3 -m pip install iso8601" and in Python 3: * iso8601.parse_date("2016-12-13T12:34:56.123Z").timestamp() * 1000 */ test_bson_json_date_check ( "{ \"dt\" : { \"$date\" : \"2016-12-13T12:34:56.123Z\" } }", 1481632496123); test_bson_json_date_check ( "{ \"dt\" : { \"$date\" : \"1970-01-01T00:00:00.000Z\" } }", 0); test_bson_json_date_check ( "{ \"dt\" : { \"$date\" : \"1969-12-31T16:00:00.000-0800\" } }", 0); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+01:00\" } }", "Could not parse"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:30:\" } }", "reached end of date while looking for seconds"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:+01:00\" } }", "seconds is required"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:30:00.\" } }", "reached end of date while looking for milliseconds"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.+01:00\" } }", "milliseconds is required"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"foo-01-01T00:00:00.000Z\" } }", "year must be an integer"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-foo-01T00:00:00.000Z\" } }", "month must be an integer"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-fooT00:00:00.000Z\" } }", "day must be an integer"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01Tfoo:00:00.000Z\" } }", "hour must be an integer"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T00:foo:00.000Z\" } }", "minute must be an integer"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T00:00:foo.000Z\" } }", "seconds must be an integer"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000\" } }", "timezone is required"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000X\" } }", "timezone is required"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+1\" } }", "could not parse timezone"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+xx00\" } }", "could not parse timezone"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+2400\" } }", "timezone hour must be at most 23"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000-2400\" } }", "timezone hour must be at most 23"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+0060\" } }", "timezone minute must be at most 59"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000-0060\" } }", "timezone minute must be at most 59"); } static void test_bson_json_date_legacy (void) { test_bson_json_date_check ("{ \"dt\" : { \"$date\" : 0 } }", 0); test_bson_json_date_check ("{ \"dt\" : { \"$date\" : 1356351330500 } }", 1356351330500); test_bson_json_date_check ("{ \"dt\" : { \"$date\" : -62135593139000 } }", -62135593139000); /* INT64_MAX */ test_bson_json_date_check ( "{ \"dt\" : { \"$date\" : 9223372036854775807 } }", INT64_MAX); /* INT64_MIN */ test_bson_json_date_check ( "{ \"dt\" : { \"$date\" : -9223372036854775808 } }", INT64_MIN); /* INT64_MAX + 1 */ test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : 9223372036854775808 } }", "Number \"9223372036854775808\" is out of range"); /* INT64_MIN - 1 */ test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : -9223372036854775809 } }", "Number \"-9223372036854775809\" is out of range"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : 10000000000000000000 } }", "Number \"10000000000000000000\" is out of range"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : -10000000000000000000 } }", "Number \"-10000000000000000000\" is out of range"); } static void test_bson_json_date_numberlong (void) { test_bson_json_date_check ( "{ \"dt\" : { \"$date\" : {\"$numberLong\": \"0\" } } }", 0); test_bson_json_date_check ( "{ \"dt\" : { \"$date\" : {\"$numberLong\": \"1356351330500\" } } }", 1356351330500); test_bson_json_date_check ( "{ \"dt\" : { \"$date\" : { \"$numberLong\" : \"-62135593139000\" } } }", -62135593139000); /* INT64_MAX */ test_bson_json_date_check ("{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"9223372036854775807\" } } }", INT64_MAX); /* INT64_MIN */ test_bson_json_date_check ("{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"-9223372036854775808\" } } }", INT64_MIN); /* INT64_MAX + 1 */ test_bson_json_date_error ("{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"9223372036854775808\" } } }", "Number \"9223372036854775808\" is out of range"); /* INT64_MIN - 1 */ test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"-9223372036854775809\" } } }", "Number \"-9223372036854775809\" is out of range"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"10000000000000000000\" } } }", "Number \"10000000000000000000\" is out of range"); test_bson_json_date_error ( "{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"-10000000000000000000\" } } }", "Number \"-10000000000000000000\" is out of range"); } static void test_bson_json_timestamp (void) { bson_error_t error = {0}; bson_t b, compare; bool r; bson_init (&compare); BSON_APPEND_TIMESTAMP ( &compare, "ts", (uint32_t) 1486785977, (uint32_t) 1234); r = bson_init_from_json ( &b, "{\"ts\": {\"$timestamp\": {\"t\": 1486785977, \"i\": 1234}}}", -1, &error); if (!r) { fprintf (stderr, "%s\n", error.message); } BSON_ASSERT (r); bson_eq_bson (&b, &compare); bson_destroy (&compare); bson_destroy (&b); } static void test_bson_array_as_legacy_json (void) { bson_t d = BSON_INITIALIZER; size_t len; char *str; str = bson_array_as_json (&d, &len); ASSERT_CMPSTR (str, "[ ]"); ASSERT_CMPSIZE_T (len, ==, 3u); bson_free (str); BSON_APPEND_INT32 (&d, "0", 1); str = bson_array_as_json (&d, &len); ASSERT_CMPSTR (str, "[ 1 ]"); ASSERT_CMPSIZE_T (len, ==, 5u); bson_free (str); /* test corrupted bson */ BSON_APPEND_UTF8 (&d, "1", "\x80"); /* bad UTF-8 */ str = bson_array_as_json (&d, &len); BSON_ASSERT (!str); BSON_ASSERT (!len); bson_destroy (&d); } static void test_bson_array_as_relaxed_json (void) { bson_t d = BSON_INITIALIZER; size_t len; char *str; str = bson_array_as_relaxed_extended_json (&d, &len); ASSERT_CMPSTR (str, "[ ]"); ASSERT_CMPSIZE_T (len, ==, 3u); bson_free (str); BSON_APPEND_INT32 (&d, "0", 1); str = bson_array_as_relaxed_extended_json (&d, &len); ASSERT_CMPSTR (str, "[ 1 ]"); ASSERT_CMPSIZE_T (len, ==, 5u); bson_free (str); /* test corrupted bson */ BSON_APPEND_UTF8 (&d, "1", "\x80"); /* bad UTF-8 */ str = bson_array_as_relaxed_extended_json (&d, &len); BSON_ASSERT (!str); BSON_ASSERT (!len); bson_destroy (&d); } static void test_bson_array_as_canonical_json (void) { bson_t d = BSON_INITIALIZER; size_t len; char *str; str = bson_array_as_canonical_extended_json (&d, &len); ASSERT_CMPSTR (str, "[ ]"); ASSERT_CMPSIZE_T (len, ==, 3u); bson_free (str); BSON_APPEND_INT32 (&d, "0", 1); str = bson_array_as_canonical_extended_json (&d, &len); ASSERT_CMPSTR (str, "[ { \"$numberInt\" : \"1\" } ]"); ASSERT_CMPSIZE_T (len, ==, 26u); bson_free (str); /* test corrupted bson */ BSON_APPEND_UTF8 (&d, "1", "\x80"); /* bad UTF-8 */ str = bson_array_as_canonical_extended_json (&d, &len); BSON_ASSERT (!str); BSON_ASSERT (!len); bson_destroy (&d); } static void test_bson_as_json_spacing (void) { bson_t d = BSON_INITIALIZER; size_t len; char *str; str = bson_as_json (&d, &len); BSON_ASSERT (0 == strcmp (str, "{ }")); BSON_ASSERT (len == 3); bson_free (str); BSON_APPEND_INT32 (&d, "a", 1); str = bson_as_json (&d, &len); BSON_ASSERT (0 == strcmp (str, "{ \"a\" : 1 }")); BSON_ASSERT (len == 11); bson_free (str); bson_destroy (&d); } static void test_bson_json_errors (void) { typedef const char *test_bson_json_error_t[2]; test_bson_json_error_t tests[] = { {"{\"x\": {\"$numberLong\": 1}}", "Invalid state for integer read: INT64"}, {"{\"x\": {\"$binary\": 1}}", "Unexpected integer 1 in type \"binary\""}, {"{\"x\": {\"$numberInt\": true}}", "Invalid read of boolean in state IN_BSON_TYPE"}, {"{\"x\": {\"$dbPointer\": true}}", "Invalid read of boolean in state IN_BSON_TYPE_DBPOINTER_STARTMAP"}, {"[{\"$code\": {}}]", "Unexpected nested object value for \"$code\" key"}, {"{\"x\": {\"$numberInt\": \"8589934592\"}}", "Invalid input string \"8589934592\", looking for INT32"}, {0}, }; bson_error_t error; test_bson_json_error_t *p; for (p = tests; *(p[0]); p++) { BSON_ASSERT (!bson_new_from_json ((const uint8_t *) (*p)[0], -1, &error)); ASSERT_ERROR_CONTAINS ( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, (*p)[1]); } } static void test_bson_integer_width (void) { const char *sd = "{\"v\":-1234567890123, \"x\":12345678901234}"; char *match; bson_error_t err; bson_t *bs = bson_new_from_json ((const uint8_t *) sd, strlen (sd), &err); match = bson_as_json (bs, 0); ASSERT_CMPSTR (match, "{ \"v\" : -1234567890123, \"x\" : 12345678901234 }"); bson_free (match); bson_destroy (bs); } static void test_bson_json_null_in_str (void) { const char bad_json[] = "{\"a\":\"\0\"}"; const char cdriver2305[] = "{\"\0"; bson_error_t err; ASSERT (!bson_new_from_json ( (const uint8_t *) bad_json, sizeof (bad_json) - 1, &err)); ASSERT_ERROR_CONTAINS ( err, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error"); memset (&err, 0, sizeof err); ASSERT (!bson_new_from_json ( (const uint8_t *) cdriver2305, sizeof (cdriver2305) - 1, &err)); ASSERT_ERROR_CONTAINS ( err, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error"); } static char * _single_to_double (const char *json) { char *copy; char *to_ret = copy = bson_malloc (strlen (json) + 1); strcpy (copy, json); while (*copy) { if (*copy == '\'') { *copy = '\"'; } else { copy++; } } return to_ret; } static void _test_json_produces_multiple (const char *json_in, int err_expected, ...) { bson_t bson_in = BSON_INITIALIZER; bson_t *bson_expected; bson_error_t err = {0}; int ret; va_list ap; char *json = _single_to_double (json_in); bson_json_reader_t *reader = bson_json_data_reader_new (false /* ignored */, 512 /* buffer size */); va_start (ap, err_expected); bson_json_data_reader_ingest (reader, (uint8_t *) json, strlen (json)); while ((ret = bson_json_reader_read (reader, &bson_in, &err)) == 1) { bson_expected = va_arg (ap, bson_t *); if (!bson_expected) { fprintf (stderr, "Extra bson documents returned for input %s\n", json); abort (); } if (bson_compare (&bson_in, bson_expected) != 0) { char *expect = bson_as_json (bson_expected, NULL); char *in = bson_as_json (&bson_in, NULL); fprintf ( stderr, "Got %s, but expected %s for input %s\n", expect, in, json); bson_free (expect); bson_free (in); abort (); } bson_destroy (bson_expected); bson_reinit (&bson_in); } if (ret == 0) { ASSERT (!err_expected); } else { ASSERT_OR_PRINT (err_expected, err); } if (va_arg (ap, bson_t *) != NULL) { fprintf (stderr, "Not all bson docs matched for input %s\n", json); abort (); } va_end (ap); bson_json_reader_destroy (reader); bson_destroy (&bson_in); bson_free (json); } #define TEST_JSON_PRODUCES_MULTIPLE(_json, _has_err, ...) \ _test_json_produces_multiple (_json, _has_err, __VA_ARGS__, NULL); static void test_bson_as_json_multi_object (void) { /* Test malformed documents that produce errors */ TEST_JSON_PRODUCES_MULTIPLE ("[],[{''", 1, NULL); TEST_JSON_PRODUCES_MULTIPLE ("{},[{''", 1, NULL); /* Test the desired multiple document behavior */ TEST_JSON_PRODUCES_MULTIPLE ("{'a': 1} {'b': 1}", 0, BCON_NEW ("a", BCON_INT32 (1)), BCON_NEW ("b", BCON_INT32 (1))); TEST_JSON_PRODUCES_MULTIPLE ( "{}{}{}", 0, bson_new (), bson_new (), bson_new ()); /* Test strange behavior we may consider changing */ /* Combines both documents into one? */ TEST_JSON_PRODUCES_MULTIPLE ( "{'a': 1}, {'b': 1}", 0, BCON_NEW ("a", BCON_INT32 (1), "b", BCON_INT32 (1))); TEST_JSON_PRODUCES_MULTIPLE ( "{},{'a': 1}", 0, BCON_NEW ("a", BCON_INT32 (1))); TEST_JSON_PRODUCES_MULTIPLE ( "{},{},{'a': 1}", 0, BCON_NEW ("a", BCON_INT32 (1))); TEST_JSON_PRODUCES_MULTIPLE ( "[],{'a': 1}", 0, BCON_NEW ("a", BCON_INT32 (1))); /* We support a root level array */ TEST_JSON_PRODUCES_MULTIPLE ("[]", 0, bson_new ()); TEST_JSON_PRODUCES_MULTIPLE ( "[{'x': 0}]", 0, BCON_NEW ("0", "{", "x", BCON_INT32 (0), "}")); /* Yet this fails */ TEST_JSON_PRODUCES_MULTIPLE ("[],[{'a': 1}]", 1, NULL); } static void test_bson_as_json_with_opts (bson_t *bson, bson_json_mode_t mode, int max_len, const char *expected) { bson_json_opts_t *opts = bson_json_opts_new (mode, max_len); size_t json_len; char *str = bson_as_json_with_opts (bson, &json_len, opts); ASSERT_CMPSTR (str, expected); ASSERT_CMPSIZE_T (json_len, ==, strlen (expected)); if (max_len != BSON_MAX_LEN_UNLIMITED) { ASSERT (bson_in_range_signed (size_t, max_len)); ASSERT_CMPSIZE_T (json_len, <=, (size_t) max_len); } bson_free (str); bson_json_opts_destroy (opts); } char * truncate_string (const char *str, size_t len) { char *truncated; truncated = (char *) bson_malloc0 (len + 1); strncpy (truncated, str, len); truncated[len] = '\0'; return truncated; } static void run_bson_as_json_with_opts_tests (bson_t *bson, bson_json_mode_t mode, const char *expected) { const size_t ulen = strlen (expected); char *truncated; BSON_ASSERT (bson_in_range_unsigned (int, ulen)); const int len = (int) ulen; /* Test with 0 length (empty string). */ test_bson_as_json_with_opts (bson, mode, 0, ""); BSON_ASSERT (INT_MAX - 2 >= len); /* Test with a limit that does not truncate the string. */ test_bson_as_json_with_opts (bson, mode, len + 2, expected); /* Test with unlimited length. */ test_bson_as_json_with_opts (bson, mode, BSON_MAX_LEN_UNLIMITED, expected); /* Test every possible limit from 0 to length. */ for (int i = 0; i < len; i++) { truncated = truncate_string (expected, (size_t) i); test_bson_as_json_with_opts (bson, mode, i, truncated); bson_free (truncated); } } static void test_bson_as_json_with_opts_double (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_DOUBLE (b, "v", 1.0)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$numberDouble\" : \"1.0\" } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : 1.0 }"); bson_destroy (b); } static void test_bson_as_json_with_opts_utf8 (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_UTF8 (b, "v", "abcdef")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : \"abcdef\" }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : \"abcdef\" }"); bson_destroy (b); } static void test_bson_as_json_with_opts_document (void) { bson_t *b; bson_t nested; b = bson_new (); BSON_ASSERT (BSON_APPEND_DOCUMENT_BEGIN (b, "v", &nested)); BSON_ASSERT (BSON_APPEND_UTF8 (&nested, "v", "abcdef")); BSON_ASSERT (bson_append_document_end (b, &nested)); BSON_ASSERT (BSON_APPEND_UTF8 (b, "w", "abcdef")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"v\" : \"abcdef\" }, \"w\" : \"abcdef\" }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"v\" : \"abcdef\" }, \"w\" : \"abcdef\" }"); bson_destroy (b); bson_destroy (&nested); } static void test_bson_as_json_with_opts_array (void) { bson_t *b; bson_t nested; b = bson_new (); BSON_ASSERT (BSON_APPEND_ARRAY_BEGIN (b, "v", &nested)); BSON_ASSERT (BSON_APPEND_UTF8 (&nested, "0", "abcdef")); BSON_ASSERT (bson_append_array_end (b, &nested)); BSON_ASSERT (BSON_APPEND_UTF8 (b, "w", "abcdef")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : [ \"abcdef\" ], \"w\" : \"abcdef\" }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : [ \"abcdef\" ], \"w\" : \"abcdef\" }"); bson_destroy (b); bson_destroy (&nested); } static void test_bson_as_json_with_opts_binary (void) { const uint8_t data[] = {1, 2, 3, 4}; bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_BINARY (b, "v", 0, data, sizeof data)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$binary\" : { \"base64\" : " "\"AQIDBA==\", \"subType\" : \"00\" } } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$binary\" : { \"base64\" : " "\"AQIDBA==\", \"subType\" : \"00\" } } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_undefined (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_UNDEFINED (b, "v")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$undefined\" : true } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$undefined\" : true } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_oid (void) { bson_oid_t oid; bson_t *b; bson_oid_init_from_string (&oid, "12341234123412abcdababcd"); b = bson_new (); BSON_ASSERT (BSON_APPEND_OID (b, "v", &oid)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$oid\" : \"12341234123412abcdababcd\" } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$oid\" : \"12341234123412abcdababcd\" } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_bool (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_BOOL (b, "v", false)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : false }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : false }"); bson_destroy (b); } static void test_bson_as_json_with_opts_date_time (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_DATE_TIME (b, "v", 1602572588123)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$date\" : \"2020-10-13T07:03:08.123Z\" } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$date\" : { \"$numberLong\" : \"1602572588123\" } } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_null (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_NULL (b, "v")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : null }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : null }"); bson_destroy (b); } static void test_bson_as_json_with_opts_regex (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_REGEX (b, "v", "^abc", "i")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$regularExpression\" : { \"pattern\" : \"^abc\", " "\"options\" : \"i\" } } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$regularExpression\" : { \"pattern\" : \"^abc\", " "\"options\" : \"i\" } } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_dbpointer (void) { bson_oid_t oid; bson_t *b; bson_oid_init_from_string (&oid, "12341234123412abcdababcd"); b = bson_new (); BSON_ASSERT (BSON_APPEND_DBPOINTER (b, "v", "coll", &oid)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$dbPointer\" : { \"$ref\" : \"coll\", \"$id\" : { " "\"$oid\" : \"12341234123412abcdababcd\" } } } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$dbPointer\" : { \"$ref\" : \"coll\", \"$id\" : { " "\"$oid\" : \"12341234123412abcdababcd\" } } } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_code (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_CODE (b, "v", "function(){}")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$code\" : \"function(){}\" } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$code\" : \"function(){}\" } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_symbol (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_SYMBOL (b, "v", "symbol")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$symbol\" : \"symbol\" } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$symbol\" : \"symbol\" } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_codewscope (void) { bson_t *b; bson_t *scope; scope = bson_new (); BSON_ASSERT (BSON_APPEND_UTF8 (scope, "v", "abcdef")); b = bson_new (); BSON_ASSERT (BSON_APPEND_CODE_WITH_SCOPE (b, "v", "function(){}", scope)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$code\" : \"function(){}\", " "\"$scope\" : { \"v\" : \"abcdef\" } } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$code\" : \"function(){}\", " "\"$scope\" : { \"v\" : \"abcdef\" } } }"); bson_destroy (b); bson_destroy (scope); } static void test_bson_as_json_with_opts_int32 (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_INT32 (b, "v", 461394000)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : 461394000 }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$numberInt\" : \"461394000\" } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_int64 (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_INT64 (b, "v", 461394000)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : 461394000 }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$numberLong\" : \"461394000\" } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_timestamp (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_TIMESTAMP (b, "v", 461394000, 2)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$timestamp\" : { \"t\" : 461394000, \"i\" : 2 } } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$timestamp\" : { \"t\" : 461394000, \"i\" : 2 } } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_minkey (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_MINKEY (b, "v")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$minKey\" : 1 } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$minKey\" : 1 } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_maxkey (void) { bson_t *b; b = bson_new (); BSON_ASSERT (BSON_APPEND_MAXKEY (b, "v")); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$maxKey\" : 1 } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$maxKey\" : 1 } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_decimal128 (void) { bson_t *b; bson_decimal128_t dec; dec.high = 0x3040ffffffffffffULL; dec.low = 0xffffffffffffffffULL; b = bson_new (); BSON_ASSERT (BSON_APPEND_DECIMAL128 (b, "v", &dec)); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$numberDecimal\" : " "\"5192296858534827628530496329220095\" } }"); run_bson_as_json_with_opts_tests ( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$numberDecimal\" : " "\"5192296858534827628530496329220095\" } }"); bson_destroy (b); } static void test_bson_as_json_with_opts_all_types (void) { char *full_canonical; char *full_relaxed; bson_oid_t oid; bson_decimal128_t decimal128; bson_t b; bson_t scope; decimal128.high = 0x3040000000000000ULL; decimal128.low = 0x000000000000000B; bson_oid_init_from_string (&oid, "123412341234abcdabcdabcd"); bson_init (&scope); BCON_APPEND (&scope, "x", BCON_INT32 (1)); bson_init (&b); BCON_APPEND (&b, "double", BCON_DOUBLE (123.0)); BCON_APPEND (&b, "utf8", "bar"); BCON_APPEND (&b, "document", "{", "x", BCON_INT32 (1), "}"); BCON_APPEND (&b, "array", "[", BCON_INT32 (1), "]"); BCON_APPEND ( &b, "binary", BCON_BIN (BSON_SUBTYPE_BINARY, (uint8_t *) "abc", 3)); BCON_APPEND (&b, "undefined", BCON_UNDEFINED); BCON_APPEND (&b, "oid", BCON_OID (&oid)); BCON_APPEND (&b, "false", BCON_BOOL (false)); BCON_APPEND (&b, "true", BCON_BOOL (true)); BCON_APPEND (&b, "date", BCON_DATE_TIME (time (NULL))); BCON_APPEND (&b, "null", BCON_NULL); BCON_APPEND (&b, "regex", BCON_REGEX ("^abcd", "xi")); BCON_APPEND (&b, "dbpointer", BCON_DBPOINTER ("mycollection", &oid)); BCON_APPEND (&b, "code", BCON_CODE ("code")); BCON_APPEND (&b, "symbol", BCON_SYMBOL ("symbol")); BCON_APPEND (&b, "codewscope", BCON_CODEWSCOPE ("code", &scope)); BCON_APPEND (&b, "int32", BCON_INT32 (1234)); BCON_APPEND (&b, "timestamp", BCON_TIMESTAMP ((uint32_t) time (NULL), 1234)); BCON_APPEND (&b, "int64", BCON_INT64 (4321)); BCON_APPEND (&b, "decimal128", BCON_DECIMAL128 (&decimal128)); BCON_APPEND (&b, "minkey", BCON_MINKEY); BCON_APPEND (&b, "maxkey", BCON_MAXKEY); full_canonical = bson_as_canonical_extended_json (&b, NULL); full_relaxed = bson_as_relaxed_extended_json (&b, NULL); run_bson_as_json_with_opts_tests (&b, BSON_JSON_MODE_RELAXED, full_relaxed); run_bson_as_json_with_opts_tests ( &b, BSON_JSON_MODE_CANONICAL, full_canonical); bson_free (full_canonical); bson_free (full_relaxed); bson_destroy (&b); bson_destroy (&scope); } static void test_decimal128_overflowing_exponent (void) { { bson_decimal128_t decimal128; BSON_ASSERT (!bson_decimal128_from_string ("0E+2147483648", &decimal128)); } { bson_decimal128_t decimal128; BSON_ASSERT (!bson_decimal128_from_string ("0E-2147483649", &decimal128)); } { bson_decimal128_t decimal128; BSON_ASSERT ( !bson_decimal128_from_string ("-0E+2147483648", &decimal128)); } { bson_decimal128_t decimal128; BSON_ASSERT ( !bson_decimal128_from_string ("-0E-2147483649", &decimal128)); } { bson_error_t error; const char *degenerate_extjson = "{\"d\" : {\"$numberDecimal\" : \"0E+2147483648\"}}"; BSON_ASSERT (!bson_new_from_json ( (const uint8_t *) degenerate_extjson, -1, &error)); ASSERT_ERROR_CONTAINS ( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"0E+2147483648\", looking for DECIMAL128"); } { bson_error_t error; const char *degenerate_extjson = "{\"d\" : {\"$numberDecimal\" : \"0E-2147483649\"}}"; BSON_ASSERT (!bson_new_from_json ( (const uint8_t *) degenerate_extjson, -1, &error)); ASSERT_ERROR_CONTAINS ( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"0E-2147483649\", looking for DECIMAL128"); } { bson_error_t error; const char *degenerate_extjson = "{\"d\" : {\"$numberDecimal\" : \"-0E+2147483648\"}}"; BSON_ASSERT (!bson_new_from_json ( (const uint8_t *) degenerate_extjson, -1, &error)); ASSERT_ERROR_CONTAINS ( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"-0E+2147483648\", looking for DECIMAL128"); } { bson_error_t error; const char *degenerate_extjson = "{\"d\" : {\"$numberDecimal\" : \"-0E-2147483649\"}}"; BSON_ASSERT (!bson_new_from_json ( (const uint8_t *) degenerate_extjson, -1, &error)); ASSERT_ERROR_CONTAINS ( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"-0E-2147483649\", looking for DECIMAL128"); } { bson_decimal128_t decimal128; BSON_ASSERT ( !bson_decimal128_from_string ("0E+99999999999999999999", &decimal128)); } { bson_decimal128_t decimal128; BSON_ASSERT ( !bson_decimal128_from_string ("0E-99999999999999999999", &decimal128)); } } static void test_parse_array (void) { { bson_t *b1; { const char *json = BSON_STR ([ {"$code" : "A"} ]); bson_error_t error; b1 = bson_new_from_json ((const uint8_t *) json, -1, &error); ASSERT_OR_PRINT (b1, error); } bson_t *b2; { const char *json = BSON_STR ({"0" : {"$code" : "A"}}); bson_error_t error; b2 = bson_new_from_json ((const uint8_t *) json, -1, &error); ASSERT_OR_PRINT (b2, error); } ASSERT (bson_equal (b1, b2)); bson_destroy (b2); bson_destroy (b1); } { bson_t *b1; { const char *json = BSON_STR ([ {"$code" : "A"}, {"$code" : "B"} ]); bson_error_t error; b1 = bson_new_from_json ((const uint8_t *) json, -1, &error); ASSERT_OR_PRINT (b1, error); } bson_t *b2; { const char *json = BSON_STR ({"0" : {"$code" : "A"}}, {"1" : {"$code" : "B"}}); bson_error_t error; b2 = bson_new_from_json ((const uint8_t *) json, -1, &error); ASSERT_OR_PRINT (b2, error); } ASSERT (bson_equal (b1, b2)); bson_destroy (b2); bson_destroy (b1); } { bson_t *b1; { const char *json = BSON_STR ([ { "$dbPointer" : {"$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"}} } ]); bson_error_t error; b1 = bson_new_from_json ((const uint8_t *) json, -1, &error); ASSERT_OR_PRINT (b1, error); } bson_t *b2; { const char *json = BSON_STR ({ "0" : { "$dbPointer" : { "$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"} } } }); bson_error_t error; b2 = bson_new_from_json ((const uint8_t *) json, -1, &error); ASSERT_OR_PRINT (b2, error); } ASSERT (bson_equal (b1, b2)); bson_destroy (b2); bson_destroy (b1); } { bson_t *b1; { const char *json = BSON_STR ([ { "$dbPointer" : { "$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"} } }, { "$dbPointer" : { "$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"} } } ]); bson_error_t error; b1 = bson_new_from_json ((const uint8_t *) json, -1, &error); ASSERT_OR_PRINT (b1, error); } bson_t *b2; { const char *json = BSON_STR ( { "0" : { "$dbPointer" : { "$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"} } } }, { "1" : { "$dbPointer" : { "$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"} } } }); bson_error_t error; b2 = bson_new_from_json ((const uint8_t *) json, -1, &error); ASSERT_OR_PRINT (b2, error); } ASSERT (bson_equal (b1, b2)); bson_destroy (b2); bson_destroy (b1); } } void test_json_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/as_json/x1000", test_bson_as_json_x1000); TestSuite_Add (suite, "/bson/as_json/multi", test_bson_as_json_multi); TestSuite_Add (suite, "/bson/as_json/string", test_bson_as_json_string); TestSuite_Add (suite, "/bson/as_json/int32", test_bson_as_json_int32); TestSuite_Add (suite, "/bson/as_json/int64", test_bson_as_json_int64); TestSuite_Add (suite, "/bson/as_json/double", test_bson_as_json_double); TestSuite_Add (suite, "/bson/as_json/double/nonfinite", test_bson_as_json_double_nonfinite); TestSuite_Add (suite, "/bson/as_json/code", test_bson_as_json_code); TestSuite_Add ( suite, "/bson/as_json/date_time", test_bson_as_json_date_time); TestSuite_Add (suite, "/bson/as_json/regex", test_bson_as_json_regex); TestSuite_Add (suite, "/bson/as_json/symbol", test_bson_as_json_symbol); TestSuite_Add (suite, "/bson/as_json/utf8", test_bson_as_json_utf8); TestSuite_Add ( suite, "/bson/as_json/dbpointer", test_bson_as_json_dbpointer); TestSuite_Add (suite, "/bson/as_canonical_extended_json/dbpointer", test_bson_as_canonical_extended_json_dbpointer); TestSuite_Add ( suite, "/bson/as_json/stack_overflow", test_bson_as_json_stack_overflow); TestSuite_Add (suite, "/bson/as_json/corrupt", test_bson_corrupt); TestSuite_Add (suite, "/bson/as_json/corrupt_utf8", test_bson_corrupt_utf8); TestSuite_Add ( suite, "/bson/as_json/corrupt_binary", test_bson_corrupt_binary); TestSuite_Add (suite, "/bson/as_json_spacing", test_bson_as_json_spacing); TestSuite_Add ( suite, "/bson/array_as_legacy_json", test_bson_array_as_legacy_json); TestSuite_Add ( suite, "/bson/array_as_relaxed_json", test_bson_array_as_relaxed_json); TestSuite_Add (suite, "/bson/array_as_canonical_json", test_bson_array_as_canonical_json); TestSuite_Add ( suite, "/bson/json/allow_multiple", test_bson_json_allow_multiple); TestSuite_Add ( suite, "/bson/json/read/buffering", test_bson_json_read_buffering); TestSuite_Add (suite, "/bson/json/read", test_bson_json_read); TestSuite_Add (suite, "/bson/json/inc", test_bson_json_inc); TestSuite_Add (suite, "/bson/json/array", test_bson_json_array); TestSuite_Add ( suite, "/bson/json/array/single", test_bson_json_array_single); TestSuite_Add (suite, "/bson/json/array/int64", test_bson_json_array_int64); TestSuite_Add ( suite, "/bson/json/array/subdoc", test_bson_json_array_subdoc); TestSuite_Add (suite, "/bson/json/date", test_bson_json_date); TestSuite_Add (suite, "/bson/json/date/legacy", test_bson_json_date_legacy); TestSuite_Add ( suite, "/bson/json/date/long", test_bson_json_date_numberlong); TestSuite_Add (suite, "/bson/json/timestamp", test_bson_json_timestamp); TestSuite_Add (suite, "/bson/json/read/empty", test_bson_json_read_empty); TestSuite_Add (suite, "/bson/json/read/missing_complex", test_bson_json_read_missing_complex); TestSuite_Add (suite, "/bson/json/read/invalid_binary", test_bson_json_read_invalid_binary); TestSuite_Add ( suite, "/bson/json/read/invalid_json", test_bson_json_read_invalid_json); TestSuite_Add (suite, "/bson/json/read/bad_cb", test_bson_json_read_bad_cb); TestSuite_Add ( suite, "/bson/json/read/invalid", test_bson_json_read_invalid); TestSuite_Add (suite, "/bson/json/read/invalid_base64", test_bson_json_read_invalid_base64); TestSuite_Add ( suite, "/bson/json/read/raw_utf8", test_bson_json_read_raw_utf8); TestSuite_Add ( suite, "/bson/json/read/corrupt_utf8", test_bson_json_read_corrupt_utf8); TestSuite_Add (suite, "/bson/json/read/corrupt_document", test_bson_json_read_corrupt_document); TestSuite_Add ( suite, "/bson/json/read/decimal128", test_bson_json_read_decimal128); TestSuite_Add ( suite, "/bson/json/read/dbpointer", test_bson_json_read_dbpointer); TestSuite_Add ( suite, "/bson/json/read/legacy_regex", test_bson_json_read_legacy_regex); TestSuite_Add (suite, "/bson/json/read/regex_options_order", test_bson_json_read_regex_options_order); TestSuite_Add (suite, "/bson/json/read/binary", test_bson_json_read_binary); TestSuite_Add (suite, "/bson/json/read/legacy_binary", test_bson_json_read_legacy_binary); TestSuite_Add ( suite, "/bson/json/read/file", test_json_reader_new_from_file); TestSuite_Add ( suite, "/bson/json/read/bad_path", test_json_reader_new_from_bad_path); TestSuite_Add ( suite, "/bson/json/read/$numberLong", test_bson_json_number_long); TestSuite_Add (suite, "/bson/json/read/$numberLong/zero", test_bson_json_number_long_zero); TestSuite_Add (suite, "/bson/json/read/code", test_bson_json_code); TestSuite_Add ( suite, "/bson/json/read/code/errors", test_bson_json_code_errors); TestSuite_Add (suite, "/bson/json/read/dbref", test_bson_json_dbref); TestSuite_Add (suite, "/bson/json/read/uescape", test_bson_json_uescape); TestSuite_Add ( suite, "/bson/json/read/uescape/key", test_bson_json_uescape_key); TestSuite_Add ( suite, "/bson/json/read/uescape/bad", test_bson_json_uescape_bad); TestSuite_Add (suite, "/bson/json/read/int32", test_bson_json_int32); TestSuite_Add (suite, "/bson/json/read/int64", test_bson_json_int64); TestSuite_Add (suite, "/bson/json/read/double", test_bson_json_double); TestSuite_Add ( suite, "/bson/json/read/double/overflow", test_bson_json_double_overflow); TestSuite_Add (suite, "/bson/json/read/double/nan", test_bson_json_nan); TestSuite_Add ( suite, "/bson/json/read/double/infinity", test_bson_json_infinity); TestSuite_Add (suite, "/bson/json/read/null", test_bson_json_null); TestSuite_Add ( suite, "/bson/json/read/empty_final", test_bson_json_empty_final_object); TestSuite_Add ( suite, "/bson/as_json/decimal128", test_bson_as_json_decimal128); TestSuite_Add ( suite, "/bson/json/read/$numberDecimal", test_bson_json_number_decimal); TestSuite_Add (suite, "/bson/json/errors", test_bson_json_errors); TestSuite_Add (suite, "/bson/integer/width", test_bson_integer_width); TestSuite_Add ( suite, "/bson/json/read/null_in_str", test_bson_json_null_in_str); TestSuite_Add ( suite, "/bson/json/read/merge_multiple", test_bson_json_merge_multiple); TestSuite_Add ( suite, "/bson/json/read/extra_chars", test_bson_json_extra_chars); TestSuite_Add ( suite, "/bson/as_json/multi_object", test_bson_as_json_multi_object); TestSuite_Add (suite, "/bson/as_json_with_opts/double", test_bson_as_json_with_opts_double); TestSuite_Add ( suite, "/bson/as_json_with_opts/utf8", test_bson_as_json_with_opts_utf8); TestSuite_Add (suite, "/bson/as_json_with_opts/document", test_bson_as_json_with_opts_document); TestSuite_Add (suite, "/bson/as_json_with_opts/array", test_bson_as_json_with_opts_array); TestSuite_Add (suite, "/bson/as_json_with_opts/binary", test_bson_as_json_with_opts_binary); TestSuite_Add (suite, "/bson/as_json_with_opts/undefined", test_bson_as_json_with_opts_undefined); TestSuite_Add ( suite, "/bson/as_json_with_opts/oid", test_bson_as_json_with_opts_oid); TestSuite_Add ( suite, "/bson/as_json_with_opts/bool", test_bson_as_json_with_opts_bool); TestSuite_Add (suite, "/bson/as_json_with_opts/date_time", test_bson_as_json_with_opts_date_time); TestSuite_Add ( suite, "/bson/as_json_with_opts/null", test_bson_as_json_with_opts_null); TestSuite_Add (suite, "/bson/as_json_with_opts/regex", test_bson_as_json_with_opts_regex); TestSuite_Add (suite, "/bson/as_json_with_opts/dbpointer", test_bson_as_json_with_opts_dbpointer); TestSuite_Add ( suite, "/bson/as_json_with_opts/code", test_bson_as_json_with_opts_code); TestSuite_Add (suite, "/bson/as_json_with_opts/symbol", test_bson_as_json_with_opts_symbol); TestSuite_Add (suite, "/bson/as_json_with_opts/codewscope", test_bson_as_json_with_opts_codewscope); TestSuite_Add (suite, "/bson/as_json_with_opts/int32", test_bson_as_json_with_opts_int32); TestSuite_Add (suite, "/bson/as_json_with_opts/int64", test_bson_as_json_with_opts_int64); TestSuite_Add (suite, "/bson/as_json_with_opts/timestamp", test_bson_as_json_with_opts_timestamp); TestSuite_Add (suite, "/bson/as_json_with_opts/minkey", test_bson_as_json_with_opts_minkey); TestSuite_Add (suite, "/bson/as_json_with_opts/maxkey", test_bson_as_json_with_opts_maxkey); TestSuite_Add (suite, "/bson/as_json_with_opts/decimal128", test_bson_as_json_with_opts_decimal128); TestSuite_Add (suite, "/bson/as_json_with_opts/all_types", test_bson_as_json_with_opts_all_types); TestSuite_Add (suite, "/bson/parse_array", test_parse_array); TestSuite_Add (suite, "/bson/decimal128_overflowing_exponent", test_decimal128_overflowing_exponent); } mongo-c-driver-1.26.0/src/libbson/tests/test-oid.c000066400000000000000000000351361456567454500217420ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #define BSON_INSIDE #include "bson/bson-iso8601-private.h" #include "bson/bson-context-private.h" #include "common-thread-private.h" #undef BSON_INSIDE #ifdef BSON_HAVE_STRINGS_H #include #endif #include #include "TestSuite.h" #define N_THREADS 4 static const char *gTestOids[] = {"000000000000000000000000", "010101010101010101010101", "0123456789abcdefafcdef03", "fcdeab182763817236817236", "ffffffffffffffffffffffff", "eeeeeeeeeeeeeeeeeeeeeeee", "999999999999999999999999", "111111111111111111111111", NULL}; static const char *gTestOidsCase[] = {"0123456789ABCDEFAFCDEF03", "FCDEAB182763817236817236", "FFFFFFFFFFFFFFFFFFFFFFFF", "EEEEEEEEEEEEEEEEEEEEEEEE", "01234567890ACBCDEFabcdef", NULL}; static const char *gTestOidsFail[] = {" ", "abasdf ", "asdfasdfasdfasdfasdf ", "00000000000000000000000z", "00187263123ghh21382812a8", NULL}; BSON_THREAD_FUN (oid_worker, data) { bson_context_t *context = data; bson_oid_t oid; bson_oid_t oid2; int i; bson_oid_init (&oid2, context); for (i = 0; i < 500000; i++) { bson_oid_init (&oid, context); BSON_ASSERT (false == bson_oid_equal (&oid, &oid2)); BSON_ASSERT (0 < bson_oid_compare (&oid, &oid2)); bson_oid_copy (&oid, &oid2); } BSON_THREAD_RETURN; } static void test_bson_oid_init_from_string (void) { bson_context_t *context; bson_oid_t oid; char str[25]; int i; context = bson_context_new (BSON_CONTEXT_NONE); /* * Test successfully parsed oids. */ for (i = 0; gTestOids[i]; i++) { bson_oid_init_from_string (&oid, gTestOids[i]); bson_oid_to_string (&oid, str); BSON_ASSERT (!strcmp (str, gTestOids[i])); } /* * Test successfully parsed oids (case-insensitive). */ for (i = 0; gTestOidsCase[i]; i++) { char oid_lower[25]; int j; bson_oid_init_from_string (&oid, gTestOidsCase[i]); bson_oid_to_string (&oid, str); BSON_ASSERT (!bson_strcasecmp (str, gTestOidsCase[i])); for (j = 0; gTestOidsCase[i][j]; j++) { oid_lower[j] = tolower (gTestOidsCase[i][j]); } oid_lower[24] = '\0'; BSON_ASSERT (!strcmp (str, oid_lower)); } /* * Test that sizeof(str) works (len of 25 with \0 instead of 24). */ BSON_ASSERT (bson_oid_is_valid ("ffffffffffffffffffffffff", 24)); bson_oid_init_from_string (&oid, "ffffffffffffffffffffffff"); bson_oid_to_string (&oid, str); BSON_ASSERT (bson_oid_is_valid (str, sizeof str)); /* * Test the failures. */ for (i = 0; gTestOidsFail[i]; i++) { bson_oid_init_from_string (&oid, gTestOidsFail[i]); bson_oid_to_string (&oid, str); BSON_ASSERT (strcmp (str, gTestOidsFail[i])); } bson_context_destroy (context); } static void test_bson_oid_hash (void) { bson_oid_t oid; bson_oid_init_from_string (&oid, "000000000000000000000000"); BSON_ASSERT (bson_oid_hash (&oid) == 1487062149); } static void test_bson_oid_compare (void) { bson_oid_t oid; bson_oid_t oid2; bson_oid_init_from_string (&oid, "000000000000000000001234"); bson_oid_init_from_string (&oid2, "000000000000000000001234"); BSON_ASSERT (0 == bson_oid_compare (&oid, &oid2)); BSON_ASSERT (true == bson_oid_equal (&oid, &oid2)); bson_oid_init_from_string (&oid, "000000000000000000001234"); bson_oid_init_from_string (&oid2, "000000000000000000004321"); BSON_ASSERT (bson_oid_compare (&oid, &oid2) < 0); BSON_ASSERT (bson_oid_compare (&oid2, &oid) > 0); BSON_ASSERT (false == bson_oid_equal (&oid, &oid2)); } static void test_bson_oid_copy (void) { bson_oid_t oid; bson_oid_t oid2; bson_oid_init_from_string (&oid, "000000000000000000001234"); bson_oid_init_from_string (&oid2, "000000000000000000004321"); bson_oid_copy (&oid, &oid2); BSON_ASSERT (true == bson_oid_equal (&oid, &oid2)); } static void test_bson_oid_init (void) { bson_context_t *context; bson_oid_t oid; bson_oid_t oid2; int i; context = bson_context_new (BSON_CONTEXT_NONE); bson_oid_init (&oid, context); for (i = 0; i < 10000; i++) { bson_oid_init (&oid2, context); BSON_ASSERT (false == bson_oid_equal (&oid, &oid2)); BSON_ASSERT (0 > bson_oid_compare (&oid, &oid2)); bson_oid_copy (&oid2, &oid); } bson_context_destroy (context); /* * Test that the shared context works. */ bson_oid_init (&oid, NULL); BSON_ASSERT (bson_context_get_default ()); } static void test_bson_oid_init_sequence (void) { bson_context_t *context; bson_oid_t oid; bson_oid_t oid2; int i; BEGIN_IGNORE_DEPRECATIONS context = bson_context_new (BSON_CONTEXT_NONE); bson_oid_init_sequence (&oid, context); for (i = 0; i < 10000; i++) { bson_oid_init_sequence (&oid2, context); BSON_ASSERT (false == bson_oid_equal (&oid, &oid2)); BSON_ASSERT (0 > bson_oid_compare (&oid, &oid2)); bson_oid_copy (&oid2, &oid); } bson_context_destroy (context); END_IGNORE_DEPRECATIONS } static char * get_time_as_string (const bson_oid_t *oid) { bson_string_t *str = bson_string_new (NULL); time_t time = bson_oid_get_time_t (oid); _bson_iso8601_date_format (time * 1000, str); return bson_string_free (str, false); } static void test_bson_oid_get_time_t (void) { bson_context_t *context; bson_oid_t oid; uint32_t start = (uint32_t) time (NULL); char *str; context = bson_context_new (BSON_CONTEXT_NONE); bson_oid_init (&oid, context); ASSERT_CMPUINT32 ((uint32_t) bson_oid_get_time_t (&oid), >=, start); ASSERT_CMPUINT32 ( (uint32_t) bson_oid_get_time_t (&oid), <=, (uint32_t) time (NULL)); bson_oid_init_from_string (&oid, "000000000000000000000000"); str = get_time_as_string (&oid); ASSERT_CMPSTR (str, "1970-01-01T00:00:00Z"); bson_free (str); /* if time_t is a signed int32, then a negative value may be interpreted * as a negative date when printing. */ if (sizeof (time_t) == 8) { bson_oid_init_from_string (&oid, "7FFFFFFF0000000000000000"); str = get_time_as_string (&oid); ASSERT_CMPSTR (str, "2038-01-19T03:14:07Z"); bson_free (str); bson_oid_init_from_string (&oid, "800000000000000000000000"); str = get_time_as_string (&oid); ASSERT_CMPSTR (str, "2038-01-19T03:14:08Z"); bson_free (str); bson_oid_init_from_string (&oid, "FFFFFFFF0000000000000000"); str = get_time_as_string (&oid); ASSERT_CMPSTR (str, "2106-02-07T06:28:15Z"); bson_free (str); } bson_context_destroy (context); } static void test_bson_oid_init_with_threads (void) { bson_context_t *context; int i; int r; { bson_context_flags_t flags = BSON_CONTEXT_NONE; bson_context_t *contexts[N_THREADS]; bson_thread_t threads[N_THREADS]; for (i = 0; i < N_THREADS; i++) { contexts[i] = bson_context_new (flags); r = mcommon_thread_create (&threads[i], oid_worker, contexts[i]); BSON_ASSERT (r == 0); } for (i = 0; i < N_THREADS; i++) { mcommon_thread_join (threads[i]); } for (i = 0; i < N_THREADS; i++) { bson_context_destroy (contexts[i]); } } /* * Test threaded generation of oids using a single context; */ { bson_thread_t threads[N_THREADS]; context = bson_context_new (BSON_CONTEXT_THREAD_SAFE); for (i = 0; i < N_THREADS; i++) { r = mcommon_thread_create (&threads[i], oid_worker, context); BSON_ASSERT (r == 0); } for (i = 0; i < N_THREADS; i++) { r = mcommon_thread_join (threads[i]); BSON_ASSERT (r == 0); } bson_context_destroy (context); } } static void test_bson_oid_counter_overflow (void) { bson_oid_t oid; char str[25]; bson_context_t *ctx = bson_context_new (BSON_CONTEXT_NONE); ctx->seq32 = 0xFFFFFF; bson_oid_init (&oid, ctx); bson_oid_to_string (&oid, str); /* check that the counter portion of the string is FFFFFF" */ ASSERT_CMPSTR (str + (24 - 6), "ffffff"); bson_oid_init (&oid, ctx); /* the next oid should have overflowed the counter. */ bson_oid_to_string (&oid, str); ASSERT_CMPSTR (str + (24 - 6), "000000"); bson_context_destroy (ctx); } #ifndef _WIN32 #include typedef struct { uint32_t timestamp; /* timestamp */ uint64_t rand; /* only really 5 bytes */ uint32_t counter; /* only really 3 bytes */ } _parsed_oid_t; /* parse an oid into parts usable for comparison. */ static void _parse_oid (bson_oid_t *oid, _parsed_oid_t *out) { memset (out, 0, sizeof (_parsed_oid_t)); memcpy (&out->timestamp, oid->bytes, 4); out->timestamp = BSON_UINT32_FROM_BE (out->timestamp); /* rand_bytes is 5 bytes starting at index 4. Read all of it into an 8 byte * uint64_t * and chop off the extra 3 bytes. */ memcpy (&out->rand, oid->bytes + 1, 8); out->rand = BSON_UINT64_FROM_BE (out->rand) & 0x000000FFFFFFFFFF; /* counter is 3 bytes. Read four bytes and chop off extra 1. */ memcpy (&out->counter, oid->bytes + 8, 4); out->counter = BSON_UINT32_FROM_BE (out->counter) & 0x00FFFFFF; } /* Only test where fork() is available. Does not exercise platform specific * code. */ static void test_bson_oid_after_fork (void) { bson_context_t *ctx; bson_oid_t parent_oid, self_check; _parsed_oid_t parent_parsed, self_check_parsed; pid_t pid; int child_exit_status = 0; /* a self check of the parsing utility. */ bson_oid_init_from_string (&self_check, "AAAAAAAABBBBBBBBBBCCCCCC"); _parse_oid (&self_check, &self_check_parsed); ASSERT_CMPUINT32 (self_check_parsed.timestamp, ==, 0xAAAAAAAA); ASSERT_CMPUINT64 (self_check_parsed.rand, ==, 0x000000BBBBBBBBBB); ASSERT_CMPUINT32 (self_check_parsed.counter, ==, 0x00CCCCCC); bson_oid_init (&parent_oid, bson_context_get_default ()); _parse_oid (&parent_oid, &parent_parsed); pid = fork (); if (pid == 0) { bson_oid_t child_oid, child_2_oid; _parsed_oid_t child_parsed, child_2_parsed; bson_oid_init (&child_oid, bson_context_get_default ()); _parse_oid (&child_oid, &child_parsed); ASSERT_CMPUINT64 (child_parsed.rand, !=, parent_parsed.rand); ASSERT_CMPUINT32 (child_parsed.counter, ==, parent_parsed.counter + 1); BSON_ASSERT (0 != bson_oid_compare (&parent_oid, &child_oid)); /* but a different OID gets the same random bytes. */ bson_oid_init (&child_2_oid, bson_context_get_default ()); _parse_oid (&child_2_oid, &child_2_parsed); ASSERT_CMPUINT64 (child_2_parsed.rand, !=, parent_parsed.rand); ASSERT_CMPUINT64 (child_2_parsed.rand, ==, child_parsed.rand); ASSERT_CMPUINT32 (child_2_parsed.counter, ==, child_parsed.counter + 1); BSON_ASSERT (0 != bson_oid_compare (&child_oid, &child_2_oid)); exit (0); } else { bson_oid_t parent_2_oid; _parsed_oid_t parent_2_parsed; BSON_ASSERT (-1 != waitpid (pid, &child_exit_status, 0 /* opts */)); BSON_ASSERT (child_exit_status == 0); /* but initializing another OID in the parent does *not* change random * bytes. */ bson_oid_init (&parent_2_oid, bson_context_get_default ()); _parse_oid (&parent_2_oid, &parent_2_parsed); ASSERT_CMPUINT64 (parent_2_parsed.rand, ==, parent_parsed.rand); ASSERT_CMPUINT32 (parent_2_parsed.counter, ==, parent_parsed.counter + 1); } /* now test with PID caching enabled. */ ctx = bson_context_new (BSON_CONTEXT_NONE); bson_oid_init (&parent_oid, ctx); _parse_oid (&parent_oid, &parent_parsed); pid = fork (); if (pid == 0) { bson_oid_t child_oid; _parsed_oid_t child_parsed; bson_oid_init (&child_oid, ctx); _parse_oid (&child_oid, &child_parsed); /* since PID is cached, random value does not get regenerated. */ ASSERT_CMPUINT64 (child_parsed.rand, ==, parent_parsed.rand); ASSERT_CMPUINT32 (child_parsed.counter, ==, parent_parsed.counter + 1); BSON_ASSERT (0 != bson_oid_compare (&parent_oid, &child_oid)); exit (0); } else { bson_oid_t parent_2_oid; _parsed_oid_t parent_2_parsed; BSON_ASSERT (-1 != waitpid (pid, &child_exit_status, 0 /* opts */)); BSON_ASSERT (child_exit_status == 0); /* but initializing another OID in the parent does *not* change random * bytes. */ bson_oid_init (&parent_2_oid, ctx); _parse_oid (&parent_2_oid, &parent_2_parsed); ASSERT_CMPUINT64 (parent_2_parsed.rand, ==, parent_parsed.rand); ASSERT_CMPUINT32 (parent_2_parsed.counter, ==, parent_parsed.counter + 1); } bson_context_destroy (ctx); } #endif void test_oid_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/oid/init", test_bson_oid_init); TestSuite_Add ( suite, "/bson/oid/init_from_string", test_bson_oid_init_from_string); TestSuite_Add ( suite, "/bson/oid/init_sequence", test_bson_oid_init_sequence); TestSuite_Add ( suite, "/bson/oid/init_with_threads", test_bson_oid_init_with_threads); TestSuite_Add (suite, "/bson/oid/hash", test_bson_oid_hash); TestSuite_Add (suite, "/bson/oid/compare", test_bson_oid_compare); TestSuite_Add (suite, "/bson/oid/copy", test_bson_oid_copy); TestSuite_Add (suite, "/bson/oid/get_time_t", test_bson_oid_get_time_t); TestSuite_Add ( suite, "/bson/oid/counter_overflow", test_bson_oid_counter_overflow); #ifndef _WIN32 if (!TestSuite_NoFork (suite)) { TestSuite_Add (suite, "/bson/oid/after_fork", test_bson_oid_after_fork); } #endif } mongo-c-driver-1.26.0/src/libbson/tests/test-reader.c000066400000000000000000000203301456567454500224170ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "TestSuite.h" static void test_reader_from_data (void) { bson_reader_t *reader; uint8_t *buffer; const bson_t *b; uint32_t i; bool eof = false; buffer = bson_malloc0 (4095); for (i = 0; i < 4095; i += 5) { buffer[i] = 5; } reader = bson_reader_new_from_data (buffer, 4095); for (i = 0; (b = bson_reader_read (reader, &eof)); i++) { const uint8_t *buf = bson_get_data (b); /* do nothing */ BSON_ASSERT (b->len == 5); BSON_ASSERT (buf[0] == 5); BSON_ASSERT (buf[1] == 0); BSON_ASSERT (buf[2] == 0); BSON_ASSERT (buf[3] == 0); BSON_ASSERT (buf[4] == 0); } BSON_ASSERT (i == (4095 / 5)); ASSERT_CMPINT (eof, ==, true); bson_free (buffer); bson_reader_destroy (reader); } static void test_reader_from_data_overflow (void) { bson_reader_t *reader; uint8_t *buffer; const bson_t *b; uint32_t i; bool eof = false; buffer = bson_malloc0 (4096); for (i = 0; i < 4095; i += 5) { buffer[i] = 5; } buffer[4095] = 5; reader = bson_reader_new_from_data (buffer, 4096); for (i = 0; (b = bson_reader_read (reader, &eof)); i++) { const uint8_t *buf = bson_get_data (b); BSON_ASSERT (b->len == 5); BSON_ASSERT (buf[0] == 5); BSON_ASSERT (buf[1] == 0); BSON_ASSERT (buf[2] == 0); BSON_ASSERT (buf[3] == 0); BSON_ASSERT (buf[4] == 0); eof = false; } BSON_ASSERT (i == (4095 / 5)); ASSERT_CMPINT (eof, ==, false); bson_free (buffer); bson_reader_destroy (reader); } static void test_reader_from_data_document_length_too_large (void) { bson_reader_t *reader; uint8_t *buffer; bool eof = false; buffer = bson_malloc0 (5); buffer[0] = 6; reader = bson_reader_new_from_data (buffer, 5); BSON_ASSERT (!bson_reader_read (reader, &eof)); ASSERT_CMPINT (eof, ==, false); bson_free (buffer); bson_reader_destroy (reader); } static void test_reader_from_data_document_length_too_small (void) { bson_reader_t *reader; uint8_t *buffer; bool eof = false; buffer = bson_malloc0 (5); buffer[0] = 4; reader = bson_reader_new_from_data (buffer, 5); BSON_ASSERT (!bson_reader_read (reader, &eof)); ASSERT_CMPINT (eof, ==, false); bson_free (buffer); bson_reader_destroy (reader); } static ssize_t test_reader_from_handle_read (void *handle, void *buf, size_t len) { return bson_read (*(int *) handle, buf, len); } static void test_reader_from_handle_destroy (void *handle) { bson_close (*(int *) handle); } static void test_reader_from_handle (void) { bson_reader_t *reader; const bson_t *b; bson_iter_t iter; uint32_t i; bool eof = true; int fd; fd = bson_open (BSON_BINARY_DIR "/stream.bson", O_RDONLY); BSON_ASSERT (-1 != fd); reader = bson_reader_new_from_handle ((void *) &fd, &test_reader_from_handle_read, &test_reader_from_handle_destroy); for (i = 0; i < 1000; i++) { eof = false; b = bson_reader_read (reader, &eof); BSON_ASSERT (b); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (!bson_iter_next (&iter)); } ASSERT_CMPINT (eof, ==, false); b = bson_reader_read (reader, &eof); BSON_ASSERT (!b); ASSERT_CMPINT (eof, ==, true); bson_reader_destroy (reader); } static void test_reader_tell (void) { bson_reader_t *reader; const bson_t *b; uint32_t i; bson_iter_t iter; bool eof = true; int fd; fd = bson_open (BSON_BINARY_DIR "/stream.bson", O_RDONLY); BSON_ASSERT (-1 != fd); reader = bson_reader_new_from_handle ((void *) &fd, &test_reader_from_handle_read, &test_reader_from_handle_destroy); for (i = 0; i < 1000; i++) { if (i) { ASSERT_CMPINT (5 * i, ==, (int) bson_reader_tell (reader)); } else { ASSERT_CMPINT (0, ==, (int) bson_reader_tell (reader)); } eof = false; b = bson_reader_read (reader, &eof); BSON_ASSERT (b); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (!bson_iter_next (&iter)); } ASSERT_CMPINT (5000, ==, (int) bson_reader_tell (reader)); ASSERT (!eof); b = bson_reader_read (reader, &eof); BSON_ASSERT (!b); BSON_ASSERT (eof); bson_reader_destroy (reader); } static void test_reader_from_handle_corrupt (void) { bson_reader_t *reader; const bson_t *b; uint32_t i; bson_iter_t iter; bool eof; int fd; fd = bson_open (BSON_BINARY_DIR "/stream_corrupt.bson", O_RDONLY); BSON_ASSERT (-1 != fd); reader = bson_reader_new_from_handle ((void *) &fd, &test_reader_from_handle_read, &test_reader_from_handle_destroy); for (i = 0; i < 1000; i++) { b = bson_reader_read (reader, &eof); BSON_ASSERT (b); BSON_ASSERT (bson_iter_init (&iter, b)); BSON_ASSERT (!bson_iter_next (&iter)); } b = bson_reader_read (reader, &eof); BSON_ASSERT (!b); bson_reader_destroy (reader); } static void test_reader_grow_buffer (void) { bson_reader_t *reader; const bson_t *b; bool eof = false; int fd; fd = bson_open (BSON_BINARY_DIR "/readergrow.bson", O_RDONLY); BSON_ASSERT (-1 != fd); reader = bson_reader_new_from_handle ((void *) &fd, &test_reader_from_handle_read, &test_reader_from_handle_destroy); b = bson_reader_read (reader, &eof); BSON_ASSERT (b); BSON_ASSERT (!eof); b = bson_reader_read (reader, &eof); BSON_ASSERT (!b); BSON_ASSERT (eof); bson_reader_destroy (reader); } static void test_reader_reset (void) { uint8_t buffer[10]; bson_reader_t *reader; bool eof; memset (buffer, 0, sizeof buffer); /* two empty bson documents, length prefix indicates 5 bytes */ buffer[0] = buffer[5] = 5; reader = bson_reader_new_from_data (buffer, sizeof buffer); BSON_ASSERT (bson_reader_read (reader, &eof)->len == 5 && !eof); BSON_ASSERT (bson_reader_read (reader, &eof)->len == 5 && !eof); BSON_ASSERT (!bson_reader_read (reader, &eof) && eof); BSON_ASSERT (bson_reader_tell (reader) == 10); bson_reader_reset (reader); BSON_ASSERT (bson_reader_tell (reader) == 0); BSON_ASSERT (bson_reader_read (reader, &eof)->len == 5 && !eof); BSON_ASSERT (bson_reader_read (reader, &eof)->len == 5 && !eof); BSON_ASSERT (!bson_reader_read (reader, &eof) && eof); BSON_ASSERT (bson_reader_tell (reader) == 10); bson_reader_destroy (reader); } void test_reader_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/reader/new_from_data", test_reader_from_data); TestSuite_Add (suite, "/bson/reader/new_from_data_overflow", test_reader_from_data_overflow); TestSuite_Add (suite, "/bson/reader/new_from_data_document_length_too_large", test_reader_from_data_document_length_too_large); TestSuite_Add (suite, "/bson/reader/new_from_data_document_length_too_small", test_reader_from_data_document_length_too_small); TestSuite_Add ( suite, "/bson/reader/new_from_handle", test_reader_from_handle); TestSuite_Add (suite, "/bson/reader/tell", test_reader_tell); TestSuite_Add (suite, "/bson/reader/new_from_handle_corrupt", test_reader_from_handle_corrupt); TestSuite_Add (suite, "/bson/reader/grow_buffer", test_reader_grow_buffer); TestSuite_Add (suite, "/bson/reader/reset", test_reader_reset); } mongo-c-driver-1.26.0/src/libbson/tests/test-string.c000066400000000000000000000210611456567454500224650ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "TestSuite.h" static void test_bson_string_new (void) { bson_string_t *str; char *s; str = bson_string_new (NULL); s = bson_string_free (str, false); BSON_ASSERT (s); BSON_ASSERT (!strcmp (s, "")); bson_free (s); str = bson_string_new (""); s = bson_string_free (str, false); BSON_ASSERT (s); BSON_ASSERT (!*s); BSON_ASSERT (0 == strcmp (s, "")); bson_free (s); str = bson_string_new ("abcdef"); s = bson_string_free (str, false); BSON_ASSERT (s); BSON_ASSERT (!strcmp (s, "abcdef")); bson_free (s); str = bson_string_new (""); s = bson_string_free (str, true); BSON_ASSERT (!s); } static void test_bson_string_append (void) { bson_string_t *str; char *s; str = bson_string_new (NULL); bson_string_append (str, "christian was here"); bson_string_append (str, "\n"); s = bson_string_free (str, false); BSON_ASSERT (s); BSON_ASSERT (!strcmp (s, "christian was here\n")); bson_free (s); str = bson_string_new (">>>"); bson_string_append (str, "^^^"); bson_string_append (str, "<<<"); s = bson_string_free (str, false); BSON_ASSERT (s); BSON_ASSERT (!strcmp (s, ">>>^^^<<<")); bson_free (s); } static void test_bson_string_append_c (void) { bson_string_t *str; char *s; str = bson_string_new (NULL); bson_string_append_c (str, 'c'); bson_string_append_c (str, 'h'); bson_string_append_c (str, 'r'); bson_string_append_c (str, 'i'); bson_string_append_c (str, 's'); s = bson_string_free (str, false); BSON_ASSERT (s); BSON_ASSERT (!strcmp (s, "chris")); bson_free (s); } static void test_bson_string_append_printf (void) { bson_string_t *str; str = bson_string_new ("abcd "); bson_string_append_printf (str, "%d %d %d", 1, 2, 3); BSON_ASSERT (!strcmp (str->str, "abcd 1 2 3")); bson_string_truncate (str, 2); BSON_ASSERT (!strcmp (str->str, "ab")); bson_string_free (str, true); } static void test_bson_string_append_unichar (void) { static const unsigned char test1[] = {0xe2, 0x82, 0xac, 0}; bson_string_t *str; char *s; str = bson_string_new (NULL); bson_string_append_unichar (str, 0x20AC); s = bson_string_free (str, false); BSON_ASSERT (s); BSON_ASSERT (!strcmp (s, (const char *) test1)); bson_free (s); } static void test_bson_strdup_printf (void) { char *s; s = bson_strdup_printf ("%s:%u", "localhost", 27017); BSON_ASSERT (!strcmp (s, "localhost:27017")); bson_free (s); } static void test_bson_strdup (void) { char *s; s = bson_strdup ("localhost:27017"); BSON_ASSERT (!strcmp (s, "localhost:27017")); bson_free (s); } static void test_bson_strndup (void) { char *s; s = bson_strndup ("asdf", 2); BSON_ASSERT (!strcmp (s, "as")); bson_free (s); s = bson_strndup ("asdf", 10); BSON_ASSERT (!strcmp (s, "asdf")); bson_free (s); /* Some tests where we truncate to size n-1, n, n+1 */ s = bson_strndup ("asdf", 3); BSON_ASSERT (!strcmp (s, "asd")); bson_free (s); s = bson_strndup ("asdf", 4); BSON_ASSERT (!strcmp (s, "asdf")); bson_free (s); s = bson_strndup ("asdf", 5); BSON_ASSERT (!strcmp (s, "asdf")); bson_free (s); } static void test_bson_strnlen (void) { char *s = "test"; ASSERT_CMPINT ((int) strlen (s), ==, (int) bson_strnlen (s, 100)); } typedef struct { const char *str; int base; int64_t rv; const char *remaining; int _errno; } strtoll_test; static void test_bson_ascii_strtoll (void) { #ifdef END #undef END #endif #define END "" int64_t rv; int i; char *endptr; strtoll_test tests[] = { /* input, base, expected output, # of chars parsed, expected errno */ {"1", 10, 1, END, 0}, {"+1", 10, 1, END, 0}, {"-1", 10, -1, END, 0}, {"0", 10, 0, END, 0}, {"0 ", 10, 0, " ", 0}, {" 0 ", 10, 0, " ", 0}, {" 0", 10, 0, END, 0}, {" 0\"", 10, 0, "\"", 0}, {"0l", 10, 0, "l", 0}, {"0l ", 10, 0, "l ", 0}, {"0u", 10, 0, "u", 0}, {"0u ", 10, 0, "u ", 0}, {"0L", 10, 0, "L", 0}, {"0L ", 10, 0, "L ", 0}, {"0U", 10, 0, "U", 0}, {"0U ", 10, 0, "U ", 0}, {"-0", 10, 0, END, 0}, {"+0", 10, 0, END, 0}, {"010", 8, 8, END, 0}, /* stroll "takes as many characters as possible to form a valid base-n * integer", so it ignores "8" and returns 0 */ {"08", 0, 0, "8", 0}, {"010", 10, 10, END, 0}, {"010", 8, 8, END, 0}, {"010", 0, 8, END, 0}, {"68719476736", 10, 68719476736, END, 0}, {"-68719476736", 10, -68719476736, END, 0}, {"+68719476736", 10, 68719476736, END, 0}, {" 68719476736 ", 10, 68719476736, " ", 0}, {" 68719476736 ", 0, 68719476736, " ", 0}, {" -68719476736 ", 10, -68719476736, " ", 0}, {" -68719476736 ", 0, -68719476736, " ", 0}, {" 4611686018427387904LL", 10, 4611686018427387904LL, "LL", 0}, {" -4611686018427387904LL ", 10, -4611686018427387904LL, "LL ", 0}, {"0x1000000000", 16, 68719476736, END, 0}, {"0x1000000000", 0, 68719476736, END, 0}, {"-0x1000000000", 16, -68719476736, END, 0}, {"-0x1000000000", 0, -68719476736, END, 0}, {"+0x1000000000", 16, 68719476736, END, 0}, {"+0x1000000000", 0, 68719476736, END, 0}, {"01234", 8, 668, END, 0}, {"01234", 0, 668, END, 0}, {"-01234", 8, -668, END, 0}, {"-01234", 0, -668, END, 0}, {"+01234", 8, 668, END, 0}, {"+01234", 0, 668, END, 0}, {"9223372036854775807", 10, INT64_MAX, END, 0}, {"-9223372036854775808", 10, INT64_MIN, END, 0}, {"9223372036854775808", 10, INT64_MAX, "8", ERANGE}, /* LLONG_MAX+1 */ {"-9223372036854775809", 10, INT64_MIN, "9", ERANGE}, /* LLONG_MIN-1 */ {"18446744073709551615", 10, INT64_MAX, "5", ERANGE}, /* 2*LLONG_MAX+1 */ {"-18446744073709551618", 10, INT64_MIN, "8", ERANGE}, /* 2*LLONG_MIN-1 */ {NULL}}; for (i = 0; tests[i].str; i++) { errno = 0; rv = bson_ascii_strtoll (tests[i].str, &endptr, tests[i].base); ASSERT_CMPINT64 (rv, ==, tests[i].rv); ASSERT_CMPINT (errno, ==, tests[i]._errno); ASSERT_CMPSTR (endptr, tests[i].remaining); } #undef END } static void test_bson_strncpy (void) { char buf[5]; bson_strncpy (buf, "foo", sizeof buf); ASSERT_CMPSTR ("foo", buf); bson_strncpy (buf, "foobar", sizeof buf); ASSERT_CMPSTR ("foob", buf); /* CDRIVER-2596 make sure strncpy with size 0 doesn't write to buf[-1] */ bson_strncpy (buf + 1, "z", 0); ASSERT_CMPSTR ("foob", buf); } static void test_bson_snprintf (void) { char buf[] = "ab"; /* CDRIVER-2595 make sure snprintf with size 0 doesn't write to buf[-1] */ ASSERT_CMPINT (bson_snprintf (buf + 1, 0, "%d", 1), ==, 0); ASSERT_CMPSTR (buf, "ab"); } static void test_bson_strcasecmp (void) { BSON_ASSERT (!bson_strcasecmp ("FoO", "foo")); BSON_ASSERT (bson_strcasecmp ("Foa", "foo") < 0); BSON_ASSERT (bson_strcasecmp ("FoZ", "foo") > 0); } void test_string_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/string/new", test_bson_string_new); TestSuite_Add (suite, "/bson/string/append", test_bson_string_append); TestSuite_Add (suite, "/bson/string/append_c", test_bson_string_append_c); TestSuite_Add ( suite, "/bson/string/append_printf", test_bson_string_append_printf); TestSuite_Add ( suite, "/bson/string/append_unichar", test_bson_string_append_unichar); TestSuite_Add (suite, "/bson/string/strdup", test_bson_strdup); TestSuite_Add (suite, "/bson/string/strdup_printf", test_bson_strdup_printf); TestSuite_Add (suite, "/bson/string/strndup", test_bson_strndup); TestSuite_Add (suite, "/bson/string/ascii_strtoll", test_bson_ascii_strtoll); TestSuite_Add (suite, "/bson/string/strncpy", test_bson_strncpy); TestSuite_Add (suite, "/bson/string/snprintf", test_bson_snprintf); TestSuite_Add (suite, "/bson/string/strnlen", test_bson_strnlen); TestSuite_Add (suite, "/bson/string/strcasecmp", test_bson_strcasecmp); } mongo-c-driver-1.26.0/src/libbson/tests/test-utf8.c000066400000000000000000000205671456567454500220570ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "TestSuite.h" static void test_bson_utf8_validate (void) { static const unsigned char test1[] = { 0xe2, 0x82, 0xac, ' ', 0xe2, 0x82, 0xac, ' ', 0xe2, 0x82, 0xac, 0}; static const unsigned char test2[] = {0xc0, 0x80, 0}; static const unsigned char out_of_bound[] = { 0xfd, 0x9f, 0xb0, 0x80, 0x80, 0x80, 0}; static const unsigned char bad[] = {0xed, 0xa0, 0xa5, 0}; BSON_ASSERT (bson_utf8_validate ("asdf", 4, false)); BSON_ASSERT (bson_utf8_validate ("asdf", 4, true)); BSON_ASSERT (bson_utf8_validate ("asdf", 5, true)); BSON_ASSERT (!bson_utf8_validate ("asdf", 5, false)); BSON_ASSERT (bson_utf8_validate ((const char *) test1, 11, true)); BSON_ASSERT (bson_utf8_validate ((const char *) test1, 11, false)); BSON_ASSERT (bson_utf8_validate ((const char *) test1, 12, true)); BSON_ASSERT (!bson_utf8_validate ((const char *) test1, 12, false)); BSON_ASSERT (bson_utf8_validate ((const char *) test2, 2, true)); BSON_ASSERT (!bson_utf8_validate ((const char *) test2, 2, false)); /* * This character is allowed in 6-byte-sequence UTF-8 standard but seen as * out of bound in 4-byte-sequence UTF-8 standard (RFC 3629). */ BSON_ASSERT (!bson_utf8_validate ((const char *) out_of_bound, 1, true)); BSON_ASSERT (!bson_utf8_validate ((const char *) out_of_bound, 1, false)); /* * Some UTF-8 code points are prohibited to match the constraints of * the UTF-16 character encoding (RFC 3629). */ BSON_ASSERT (!bson_utf8_validate ((const char *) bad, 1, true)); BSON_ASSERT (!bson_utf8_validate ((const char *) bad, 1, false)); } static void test_bson_utf8_escape_for_json (void) { char *str; char *unescaped = "\x0e"; str = bson_utf8_escape_for_json ("my\0key", 6); BSON_ASSERT (0 == memcmp (str, "my\\u0000key", 7)); bson_free (str); str = bson_utf8_escape_for_json ("my\"key", 6); BSON_ASSERT (0 == memcmp (str, "my\\\"key", 8)); bson_free (str); str = bson_utf8_escape_for_json ("my\\key", 6); BSON_ASSERT (0 == memcmp (str, "my\\\\key", 8)); bson_free (str); str = bson_utf8_escape_for_json ("\\\"\\\"", -1); BSON_ASSERT (0 == memcmp (str, "\\\\\\\"\\\\\\\"", 9)); bson_free (str); str = bson_utf8_escape_for_json (unescaped, -1); BSON_ASSERT (0 == memcmp (str, "\\u000e", 7)); bson_free (str); } static void test_bson_utf8_invalid (void) { /* no UTF-8 sequence can start with 0x80 */ static const unsigned char bad[] = {0x80, 0}; BSON_ASSERT (!bson_utf8_validate ((const char *) bad, 1, true)); BSON_ASSERT (!bson_utf8_validate ((const char *) bad, 1, false)); BSON_ASSERT (!bson_utf8_escape_for_json ((const char *) bad, 1)); } static void test_bson_utf8_nil (void) { static const unsigned char test[] = {'a', 0, 'b', 0}; char *str; BSON_ASSERT (bson_utf8_validate ((const char *) test, 3, true)); BSON_ASSERT (!bson_utf8_validate ((const char *) test, 3, false)); /* no length provided, stop at first nil */ str = bson_utf8_escape_for_json ((const char *) test, -1); ASSERT_CMPSTR ("a", str); bson_free (str); str = bson_utf8_escape_for_json ((const char *) test, 3); ASSERT_CMPSTR ("a\\u0000b", str); bson_free (str); } static void test_bson_utf8_get_char (void) { static const char *test1 = "asdf"; static const unsigned char test2[] = { 0xe2, 0x82, 0xac, ' ', 0xe2, 0x82, 0xac, ' ', 0xe2, 0x82, 0xac, 0}; const char *c; c = test1; BSON_ASSERT (bson_utf8_get_char (c) == 'a'); c = bson_utf8_next_char (c); BSON_ASSERT (bson_utf8_get_char (c) == 's'); c = bson_utf8_next_char (c); BSON_ASSERT (bson_utf8_get_char (c) == 'd'); c = bson_utf8_next_char (c); BSON_ASSERT (bson_utf8_get_char (c) == 'f'); c = bson_utf8_next_char (c); BSON_ASSERT (!*c); c = (const char *) test2; BSON_ASSERT (bson_utf8_get_char (c) == 0x20AC); c = bson_utf8_next_char (c); BSON_ASSERT (c == (const char *) test2 + 3); BSON_ASSERT (bson_utf8_get_char (c) == ' '); c = bson_utf8_next_char (c); BSON_ASSERT (bson_utf8_get_char (c) == 0x20AC); c = bson_utf8_next_char (c); BSON_ASSERT (bson_utf8_get_char (c) == ' '); c = bson_utf8_next_char (c); BSON_ASSERT (bson_utf8_get_char (c) == 0x20AC); c = bson_utf8_next_char (c); BSON_ASSERT (!*c); } static void test_bson_utf8_from_unichar (void) { static const char test1[] = {'a'}; static const unsigned char test2[] = {0xc3, 0xbf}; static const unsigned char test3[] = {0xe2, 0x82, 0xac}; uint32_t len; char str[6]; /* * First possible sequence of a certain length. */ bson_utf8_from_unichar (0, str, &len); BSON_ASSERT (len == 1); bson_utf8_from_unichar (0x00000080, str, &len); BSON_ASSERT (len == 2); bson_utf8_from_unichar (0x00000800, str, &len); BSON_ASSERT (len == 3); bson_utf8_from_unichar (0x00010000, str, &len); BSON_ASSERT (len == 4); /* * Last possible sequence of a certain length. */ bson_utf8_from_unichar (0x0000007F, str, &len); BSON_ASSERT (len == 1); bson_utf8_from_unichar (0x000007FF, str, &len); BSON_ASSERT (len == 2); bson_utf8_from_unichar (0x0000FFFF, str, &len); BSON_ASSERT (len == 3); bson_utf8_from_unichar (0x0010FFFF, str, &len); BSON_ASSERT (len == 4); /* * Other interesting values. */ bson_utf8_from_unichar (0x0000D7FF, str, &len); BSON_ASSERT (len == 3); bson_utf8_from_unichar (0x0000E000, str, &len); BSON_ASSERT (len == 3); bson_utf8_from_unichar (0x0000FFFD, str, &len); BSON_ASSERT (len == 3); bson_utf8_from_unichar (0x0010EFFF, str, &len); BSON_ASSERT (len == 4); bson_utf8_from_unichar (0x00110000, str, &len); BSON_ASSERT (len == 4); bson_utf8_from_unichar ('a', str, &len); BSON_ASSERT (len == 1); BSON_ASSERT (!memcmp (test1, str, 1)); bson_utf8_from_unichar (0xFF, str, &len); BSON_ASSERT (len == 2); BSON_ASSERT (!memcmp ((const char *) test2, str, 2)); bson_utf8_from_unichar (0x20AC, str, &len); BSON_ASSERT (len == 3); BSON_ASSERT (!memcmp ((const char *) test3, str, 3)); } static void test_bson_utf8_non_shortest (void) { static const char *tests[] = { "\xE0\x80\x80", /* Non-shortest form representation of U+0000 */ "\xF0\x80\x80\x80", /* Non-shortest form representation of U+0000 */ "\xE0\x83\xBF", /* Non-shortest form representation of U+00FF */ "\xF0\x80\x83\xBF", /* Non-shortest form representation of U+00FF */ "\xF0\x80\xA3\x80", /* Non-shortest form representation of U+08C0 */ NULL}; static const char *valid_tests[] = { "\xC0\x80", /* Non-shortest form representation of U+0000. * This is how \0 should be encoded. Special casing * to allow for use in things like strlen(). */ NULL}; int i; for (i = 0; tests[i]; i++) { if (bson_utf8_validate (tests[i], strlen (tests[i]), false)) { fprintf (stderr, "non-shortest form failure, test %d\n", i); BSON_ASSERT (false); } } for (i = 0; valid_tests[i]; i++) { if (!bson_utf8_validate (valid_tests[i], strlen (valid_tests[i]), true)) { fprintf (stderr, "non-shortest form failure, valid_tests %d\n", i); BSON_ASSERT (false); } } } void test_utf8_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/utf8/validate", test_bson_utf8_validate); TestSuite_Add (suite, "/bson/utf8/invalid", test_bson_utf8_invalid); TestSuite_Add (suite, "/bson/utf8/nil", test_bson_utf8_nil); TestSuite_Add ( suite, "/bson/utf8/escape_for_json", test_bson_utf8_escape_for_json); TestSuite_Add ( suite, "/bson/utf8/get_char_next_char", test_bson_utf8_get_char); TestSuite_Add ( suite, "/bson/utf8/from_unichar", test_bson_utf8_from_unichar); TestSuite_Add ( suite, "/bson/utf8/non_shortest", test_bson_utf8_non_shortest); } mongo-c-driver-1.26.0/src/libbson/tests/test-value.c000066400000000000000000000072771456567454500223100ustar00rootroot00000000000000/* * Copyright 2014 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "TestSuite.h" static void test_value_basic (void) { static const uint8_t raw[16] = {0}; const bson_value_t *value; bson_value_t copy; bson_iter_t iter; bson_oid_t oid; bson_t other = BSON_INITIALIZER; bson_t *doc; bson_t sub = BSON_INITIALIZER; bool r; int i; bson_oid_init (&oid, NULL); doc = BCON_NEW ("double", BCON_DOUBLE (123.4), "utf8", "this is my string", "document", BCON_DOCUMENT (&sub), "array", BCON_DOCUMENT (&sub), "binary", BCON_BIN (BSON_SUBTYPE_BINARY, raw, sizeof raw), "undefined", BCON_UNDEFINED, "oid", BCON_OID (&oid), "bool", BCON_BOOL (true), "datetime", BCON_DATE_TIME (12345678), "null", BCON_NULL, "regex", BCON_REGEX ("^hello", "i"), "dbpointer", BCON_DBPOINTER ("test.test", &oid), "code", BCON_CODE ("var a = function() {}"), "symbol", BCON_SYMBOL ("my_symbol"), "codewscope", BCON_CODEWSCOPE ("var a = 1;", &sub), "int32", BCON_INT32 (1234), "timestamp", BCON_TIMESTAMP (1234, 4567), "int64", BCON_INT32 (4321), "maxkey", BCON_MAXKEY, "minkey", BCON_MINKEY); r = bson_iter_init (&iter, doc); BSON_ASSERT (r); for (i = 0; i < 20; i++) { r = bson_iter_next (&iter); BSON_ASSERT (r); value = bson_iter_value (&iter); BSON_ASSERT (value); bson_value_copy (value, ©); r = bson_append_value (&other, bson_iter_key (&iter), -1, ©); BSON_ASSERT (r); bson_value_destroy (©); } r = bson_iter_next (&iter); BSON_ASSERT (!r); bson_destroy (doc); bson_destroy (&sub); bson_destroy (&other); } static void test_value_decimal128 (void) { const bson_value_t *value; bson_value_t copy; bson_iter_t iter; bson_decimal128_t dec; bson_t other = BSON_INITIALIZER; bson_t *doc; BSON_ASSERT (bson_decimal128_from_string ("123.5", &dec)); doc = BCON_NEW ("decimal128", BCON_DECIMAL128 (&dec)); BSON_ASSERT (bson_iter_init (&iter, doc) && bson_iter_next (&iter)); value = bson_iter_value (&iter); BSON_ASSERT (value); bson_value_copy (value, ©); BSON_ASSERT (bson_append_value (&other, bson_iter_key (&iter), -1, ©)); bson_value_destroy (©); bson_destroy (doc); bson_destroy (&other); } void test_value_install (TestSuite *suite) { TestSuite_Add (suite, "/bson/value/basic", test_value_basic); TestSuite_Add (suite, "/bson/value/decimal128", test_value_decimal128); } mongo-c-driver-1.26.0/src/libbson/tests/test-writer.c000066400000000000000000000114761456567454500225040ustar00rootroot00000000000000/* * Copyright 2013 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "TestSuite.h" static void * test_bson_writer_custom_realloc_helper (void *mem, size_t num_bytes, void *ctx) { int *x = (int *) ctx; *x = *x + 1; return bson_realloc (mem, num_bytes); } static void test_bson_writer_custom_realloc (void) { bson_writer_t *writer; uint8_t *buf = bson_malloc (0); size_t buflen = 0; bson_t *b; int x = 0; writer = bson_writer_new ( &buf, &buflen, 0, test_bson_writer_custom_realloc_helper, &x); BSON_ASSERT (bson_writer_begin (writer, &b)); BSON_ASSERT (bson_append_utf8 (b, "hello", -1, "world", -1)); bson_writer_end (writer); bson_writer_destroy (writer); ASSERT_CMPINT (x, >, 0); bson_free (buf); } static void test_bson_writer_shared_buffer (void) { bson_writer_t *writer; uint8_t *buf = bson_malloc0 (32); bool rolled_back = false; size_t buflen = 32; size_t n_bytes; bson_t *b; const char *key; char keystr[32]; int i = 0; int j = 0; int n_docs = 10000; writer = bson_writer_new (&buf, &buflen, 0, bson_realloc_ctx, NULL); for (i = 0; i < n_docs; i++) { BSON_ASSERT (bson_writer_begin (writer, &b)); for (j = 0; j < 1000; j++) { bson_uint32_to_string (j, &key, keystr, sizeof keystr); BSON_ASSERT (bson_append_int64 (b, key, -1, j)); } if (bson_writer_get_length (writer) > (48 * 1024 * 1024)) { rolled_back = true; bson_writer_rollback (writer); break; } else { bson_writer_end (writer); } } n_bytes = bson_writer_get_length (writer); bson_writer_destroy (writer); ASSERT_CMPSIZE_T (n_bytes, <, (size_t) (48 * 1024 * 1024)); BSON_ASSERT (rolled_back); bson_free (buf); } static void test_bson_writer_empty_sequence (void) { const uint8_t testdata[] = {5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0}; bson_writer_t *writer; uint8_t *buf = NULL; bson_t *b; size_t len = 0; int r; int i; writer = bson_writer_new (&buf, &len, 0, bson_realloc_ctx, NULL); for (i = 0; i < 5; i++) { BSON_ASSERT (bson_writer_begin (writer, &b)); bson_writer_end (writer); } r = memcmp (buf, testdata, 25); BSON_ASSERT (r == 0); bson_writer_destroy (writer); bson_free (buf); } static void test_bson_writer_null_realloc (void) { const uint8_t testdata[] = {5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0}; bson_writer_t *writer; uint8_t *buf = bson_malloc0 (32); size_t buflen = 32; bson_t *b; int r; int i; writer = bson_writer_new (&buf, &buflen, 0, NULL, NULL); for (i = 0; i < 6; i++) { BSON_ASSERT (bson_writer_begin (writer, &b)); bson_writer_end (writer); } BSON_ASSERT (!bson_writer_begin (writer, &b)); r = memcmp (buf, testdata, 32); BSON_ASSERT (r == 0); bson_writer_destroy (writer); bson_free (buf); } static void test_bson_writer_null_realloc_2 (void) { const uint8_t testdata[] = {5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0}; bson_writer_t *writer; uint8_t *buf = bson_malloc0 (32); size_t buflen = 32; bson_t *b; int r; int i; writer = bson_writer_new (&buf, &buflen, 0, NULL, NULL); for (i = 0; i < 5; i++) { BSON_ASSERT (bson_writer_begin (writer, &b)); bson_writer_end (writer); } BSON_ASSERT (bson_writer_begin (writer, &b)); BSON_ASSERT (!bson_append_int32 (b, "a", -1, 123)); bson_writer_end (writer); r = memcmp (buf, testdata, 32); BSON_ASSERT (r == 0); bson_writer_destroy (writer); bson_free (buf); } void test_writer_install (TestSuite *suite) { TestSuite_Add ( suite, "/bson/writer/custom_realloc", test_bson_writer_custom_realloc); TestSuite_Add ( suite, "/bson/writer/shared_buffer", test_bson_writer_shared_buffer); TestSuite_Add ( suite, "/bson/writer/empty_sequence", test_bson_writer_empty_sequence); TestSuite_Add ( suite, "/bson/writer/null_realloc", test_bson_writer_null_realloc); TestSuite_Add ( suite, "/bson/writer/null_realloc_2", test_bson_writer_null_realloc_2); } mongo-c-driver-1.26.0/src/libmongoc/000077500000000000000000000000001456567454500172155ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/.gitignore000066400000000000000000000016111456567454500212040ustar00rootroot00000000000000# CMake artifacts libmongoc-1.0-config-version.cmake libmongoc-1.0-config.cmake libmongoc-static-1.0-config-version.cmake libmongoc-static-1.0-config.cmake mongoc/mongoc-1.0-config.cmake mongoc/mongoc-1.0-config-version.cmake mongoc/mongoc-targets.cmake # Test program for mongoc_get_accept_args in CMakeLists.txt accept_test1.c # Example binaries aggregation1 basic-aggregation bulk-collation bulk1 bulk2 bulk3 bulk4 bulk5 bulk6 common-operations example-client example-collection-watch example-command-monitoring example-command-with-opts example-manage-collection-indexes example-gridfs example-gridfs-bucket example-pool example-resume example-scram example-sdam-monitoring example-session example-start-at-optime example-transaction example-update fam find-and-modify hello_mongoc mongoc-dump mongoc-ping mongoc-stat mongoc-tail # Test binaries test-libmongoc test-mongoc-gssapi test-mongoc-cache mongo-c-driver-1.26.0/src/libmongoc/CMakeLists.txt000066400000000000000000001631021456567454500217600ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.15) project (libmongoc LANGUAGES C # Inherit the version from mongo-c-driver VERSION "${PROJECT_VERSION}" DESCRIPTION "The MongoDB C Database Driver library" ) # These values are inherited from the mongo-c-driver parent. These are named as to # match the CMake variables generated by project(). set(libmongoc_VERSION_PRERELEASE ${mongo-c-driver_VERSION_PRERELEASE}) set(libmongoc_VERSION_FULL ${mongo-c-driver_VERSION_FULL}) set (MONGOC_API_VERSION 1.0) include (CheckSchedGetCPU) include (CheckStructHasMember) include (CheckSymbolExists) include (CheckTypeSize) include (CMakePushCheckState) include (InstallRequiredSystemLibraries) message (STATUS "libmongoc version (from VERSION_CURRENT file): ${MONGOC_VERSION}") set (MONGOC_API_VERSION 1.0) set (MONGOC_TARGETS_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/mongoc-${MONGOC_API_VERSION}") # Defaults. set (MONGOC_ENABLE_COMPRESSION 0) set (MONGOC_ENABLE_COMPRESSION_SNAPPY 0) set (MONGOC_ENABLE_COMPRESSION_ZLIB 0) set (MONGOC_ENABLE_COMPRESSION_ZSTD 0) # Definition for mongoc-config.h: mongo_pick(MONGOC_ENABLE_SRV 1 0 ENABLE_SRV) set (MONGOC_OUTPUT_BASENAME "mongoc" CACHE STRING "Output mongoc library base name") if (NOT ENABLE_ZLIB MATCHES "SYSTEM|AUTO|BUNDLED|OFF") message (FATAL_ERROR "ENABLE_ZLIB option must be SYSTEM, BUNDLED, AUTO, or OFF" ) endif () if (NOT ENABLE_ZSTD MATCHES "ON|AUTO|OFF") message (FATAL_ERROR "ENABLE_ZSTD option must be ON, AUTO, or OFF") endif () set (ZLIB_INCLUDE_DIRS "") if (ENABLE_ZLIB MATCHES "SYSTEM|AUTO") message (STATUS "Searching for zlib CMake packages") include (FindZLIB) if (ZLIB_FOUND) message (STATUS " zlib found version \"${ZLIB_VERSION_STRING}\"") message (STATUS " zlib include path \"${ZLIB_INCLUDE_DIRS}\"") message (STATUS " zlib libraries \"${ZLIB_LIBRARIES}\"") else () if (ENABLE_ZLIB STREQUAL "SYSTEM") message (FATAL_ERROR "Unable to find system zlib package. Either specify the zlib \ location by setting ZLIB_ROOT, or else set ENABLE_ZLIB=BUNDLED or \ set ENABLE_ZLIB=OFF." ) endif () set (ZLIB_LIBRARIES "") endif () endif () if ( (ENABLE_ZLIB STREQUAL "BUNDLED") OR (ENABLE_ZLIB STREQUAL "AUTO" AND NOT ZLIB_FOUND) ) message (STATUS "Enabling zlib compression (bundled)") add_library (zlib_obj OBJECT "${ZLIB_SOURCES}") set_property (TARGET zlib_obj PROPERTY POSITION_INDEPENDENT_CODE TRUE) # This tells the bundled zlib where to find its generated headers target_include_directories (zlib_obj BEFORE PUBLIC "${SOURCE_DIR}/src/zlib-1.2.13" "${CMAKE_BINARY_DIR}/src/zlib-1.2.13" ) # Disable all warnings for compiling Zlib target_compile_options (zlib_obj PRIVATE -w) set (SOURCES ${SOURCES} $) # This tells mongoc_shared/mongoc_static where to find generated zlib headers set ( ZLIB_INCLUDE_DIRS "${SOURCE_DIR}/src/zlib-1.2.13" "${CMAKE_BINARY_DIR}/src/zlib-1.2.13" ) endif () if (NOT ENABLE_ZLIB STREQUAL "OFF") # At this point the system zlib was found, or the bundled library was used include (CheckIncludeFiles) check_include_files ("unistd.h" HAVE_UNISTD_H) check_include_files ("stdarg.h" HAVE_STDARG_H) if (HAVE_UNISTD_H) add_definitions (-DHAVE_UNISTD_H) endif () if (HAVE_STDARG_H) add_definitions (-DHAVE_STDARG_H) endif () set (MONGOC_ENABLE_COMPRESSION 1) set (MONGOC_ENABLE_COMPRESSION_ZLIB 1) else () message (STATUS "Disabling zlib compression") endif () if (NOT ENABLE_ZSTD STREQUAL OFF) message (STATUS "Searching for compression library zstd") find_package(PkgConfig) pkg_check_modules (ZSTD libzstd) if (NOT ZSTD_FOUND) if (ENABLE_ZSTD MATCHES "ON") message (FATAL_ERROR " Not found") else () message (STATUS " Not found") endif () # The compression format below this version isn't supported. See SERVER-43070 elseif (${ZSTD_VERSION} VERSION_LESS "0.8.0") if (ENABLE_ZSTD MATCHES "ON") message (FATAL_ERROR "Detected zstd version ${ZSTD_VERSION} but version 0.8.0 required") else () message (STATUS "Detected zstd version ${ZSTD_VERSION} but version 0.8.0 required") endif () else () message (STATUS " Found zstd version ${ZSTD_VERSION} in ${ZSTD_INCLUDE_DIRS}") set (MONGOC_ENABLE_COMPRESSION 1) set (MONGOC_ENABLE_COMPRESSION_ZSTD 1) include_directories (${ZSTD_INCLUDE_DIRS}) link_directories (${ZSTD_LIBRARY_DIRS}) set (MONGOC_ZSTD_LIBRARIES ${ZSTD_LINK_LIBRARIES}) endif() endif() add_library(_mongoc-dependencies INTERFACE) add_library(mongo::detail::c_dependencies ALIAS _mongoc-dependencies) target_link_libraries(_mongoc-dependencies INTERFACE mongo::detail::c_platform) install(TARGETS _mongoc-dependencies EXPORT mongoc-targets) set_property(TARGET _mongoc-dependencies PROPERTY EXPORT_NAME detail::c_dependencies) # d888888b db .d8888. # `~~88~~' 88 88' YP # 88 88 `8bo. # 88 88 `Y8b. # 88 88booo. db 8D # YP Y88888P `8888Y' # Pick the TLS library to use. function(_pick_which_tls_lib ssl_opt) # Initial value, if not later set: set_property(DIRECTORY PROPERTY _mongoc-tls-backend OFF) if(ssl_opt STREQUAL "AUTO") # Try to pick one automatically _auto_pick_tls_lib() elseif(ssl_opt) # The user named a TLS library specifically. Use that one: _use_named_tls_lib("${ssl_opt}") else() # User has disabled TLS selection endif() endfunction() # Attempt to automatically find and use a TLS library for the current platform function(_auto_pick_tls_lib) if(WIN32) # Windows has SecureChannel _use_named_tls_lib(WINDOWS) elseif(APPLE) # Apple has SecureTransport _use_named_tls_lib(DARWIN) else() # Try to find one of the common open-source TLS libraries find_package(OpenSSL) if(OpenSSL_FOUND) _use_named_tls_lib(OPENSSL) else() # No OpenSSL. What about LibreSSL? find_package(LibreSSL) if(LibreSSL_FOUND) _use_named_tls_lib(LIBRESSL) endif() endif() endif() endfunction() # Per-backend link libs/options: set(SecureTransport/LINK_LIBRARIES "-framework CoreFoundation" "-framework Security") set(SecureTransport/pkg_config_LIBS -framework Corefoundation -framework Security) set(SecureChannel/LINK_LIBRARIES secur32.lib crypt32.lib Bcrypt.lib) set(SecureChannel/pkg_config_LIBS ${SecureChannel/LINK_LIBRARIES}) set(LibreSSL/LINK_LIBRARIES LibreSSL::TLS LibreSSL::Crypto) set(LibreSSL/pkg_config_LIBS -ltls -lcrypto) set(OpenSSL/LINK_LIBRARIES OpenSSL::SSL OpenSSL::Crypto $<$:crypt32.lib>) set(OpenSSL/pkg_config_LIBS -lssl -lcrypto $<$:crypt32.lib>) # Use *exactly* the TLS library identified by the given name, which is one of # `OPENSSL`, `LIBRESSL`, `DARWIN`, or `WINDOWS`. function(_use_named_tls_lib libname) # Use this property to track what package we import for our TLS libraries: set_property(DIRECTORY PROPERTY _mongoc-tls-package NO) if(libname STREQUAL "OPENSSL") find_package(OpenSSL REQUIRED) set(backend OpenSSL) set_property(DIRECTORY PROPERTY _mongoc-tls-package OpenSSL) elseif(libname STREQUAL "LIBRESSL") find_package(LibreSSL REQUIRED) set(backend LibreSSL) install( FILES "${mongo-c-driver_SOURCE_DIR}/build/cmake/FindLibreSSL.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/mongoc-${MONGOC_API_VERSION}/3rdParty" ) set_property(DIRECTORY PROPERTY _mongoc-tls-package LibreSSL) elseif(libname STREQUAL "DARWIN") set(backend SecureTransport) elseif(libname STREQUAL "WINDOWS") set(backend SecureChannel) else() message(FATAL_ERROR "Unknown TLS library requested: “${libname}”") endif() add_library(_mongoc-tls_backend INTERFACE) install(TARGETS _mongoc-tls_backend EXPORT mongoc-targets) target_link_libraries(_mongoc-dependencies INTERFACE _mongoc-tls_backend) set_property(TARGET _mongoc-tls_backend PROPERTY EXPORT_NAME detail::c_tls_backend) target_link_libraries(_mongoc-tls_backend INTERFACE ${${backend}/LINK_LIBRARIES}) target_link_options(_mongoc-tls_backend INTERFACE ${${backend}/LINK_OPTIONS}) set_property(DIRECTORY PROPERTY _mongoc-tls-backend "${backend}") endfunction() _pick_which_tls_lib("${ENABLE_SSL}") # This property will be set by _pick_which_tls_lib: get_directory_property(TLS_BACKEND _mongoc-tls-backend) message(STATUS "libmongoc TLS : ${TLS_BACKEND}") # Used by *-config.cmake to do a find_dependency(): get_directory_property(TLS_IMPORT_PACKAGE _mongoc-tls-package) set_package_properties( OpenSSL PROPERTIES DESCRIPTION "the standard open-source implementation of TLS, X509, and more" TYPE OPTIONAL PURPOSE "Provides a cryptography and TLS backend" ) set_package_properties( LibreSSL PROPERTIES DESCRIPTION "an alternative implementation of the OpenSSL interface, created by the OpenBSD project" TYPE OPTIONAL PURPOSE "Provides a cryptography and TLS backend" ) mongo_bool01(MONGOC_ENABLE_SSL [[TLS_BACKEND]]) mongo_bool01(MONGOC_ENABLE_SSL_SECURE_CHANNEL [[TLS_BACKEND STREQUAL "SecureChannel"]]) mongo_bool01(MONGOC_ENABLE_SSL_SECURE_TRANSPORT [[TLS_BACKEND STREQUAL "SecureTransport"]]) mongo_bool01(MONGOC_ENABLE_SSL_OPENSSL [[TLS_BACKEND STREQUAL "OpenSSL"]]) mongo_bool01(MONGOC_ENABLE_SSL_LIBRESSL [[TLS_BACKEND STREQUAL "LibreSSL"]]) mongo_bool01(MONGOC_ENABLE_CRYPTO [[TLS_BACKEND]]) mongo_bool01(MONGOC_ENABLE_CRYPTO_LIBCRYPTO [[MONGOC_ENABLE_SSL_OPENSSL OR MONGOC_ENABLE_SSL_LIBRESSL]]) mongo_bool01(MONGOC_ENABLE_CRYPTO_CNG [[MONGOC_ENABLE_SSL_SECURE_CHANNEL]]) mongo_bool01(MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO [[MONGOC_ENABLE_SSL_SECURE_TRANSPORT]]) mongo_bool01(MONGOC_ENABLE_CRYPTO_SYSTEM_PROFILE [[ENABLE_CRYPTO_SYSTEM_PROFILE]]) add_feature_info("TLS" "${MONGOC_ENABLE_SSL}" "for secure network communication (${TLS_BACKEND})") add_feature_info("Cryptography" "${MONGOC_ENABLE_CRYPTO}" "cryptographic primitives (${TLS_BACKEND})") include(CMakePushCheckState) include(CheckSymbolExists) if(TLS_BACKEND STREQUAL "OpenSSL") # Check for newer OpenSSL string functions cmake_push_check_state() list(APPEND CMAKE_REQUIRED_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) check_symbol_exists( ASN1_STRING_get0_data "openssl/asn1.h" HAVE_ASN1_STRING_GET0_DATA ) cmake_pop_check_state() endif() mongo_bool01(MONGOC_HAVE_ASN1_STRING_GET0_DATA [[HAVE_ASN1_STRING_GET0_DATA]]) if(ENABLE_CRYPTO_SYSTEM_PROFILE AND NOT MONGOC_ENABLE_SSL_OPENSSL) message (FATAL_ERROR "ENABLE_CRYPTO_SYSTEM_PROFILE is only available with OpenSSL") endif() set(_aws_feature_desc "authenticate with MongoDB servers using credentials from AWS instance metadata") if(ENABLE_MONGODB_AWS_AUTH) # We may want AWS auth if(NOT MONGOC_ENABLE_SSL) # No TLS libs if(ENABLE_MONGODB_AWS_AUTH STREQUAL "AUTO") # Okay: Just turn it off message(STATUS "Note: AWS Authentication was disabled automatically because no TLS library is found/enabled") set(_enable_aws_auth FALSE) add_feature_info("AWS Authentication" OFF "${_aws_feature_desc}. (Disabled automatically: No TLS backend available)") else() # Bad message(FATAL_ERROR "MongoDB AWS Authentication requires a TLS library, no TLS library was found/enabled") endif() endif() set(_enable_aws_auth TRUE) add_feature_info("AWS Authentication" ON "${_aws_feature_desc}") else() # AWS Auth is explicitly disabled set(_enable_aws_auth FALSE) add_feature_info("AWS Authentication" OFF "${_aws_feature_desc}. (Manually disabled)") endif() # .d8888. .d8b. .d8888. db # 88' YP d8' `8b 88' YP 88 # `8bo. 88ooo88 `8bo. 88 # `Y8b. 88~~~88 `Y8b. 88 # db 8D 88 88 db 8D 88booo. # `8888Y' YP YP `8888Y' Y88888P function(_pick_sasl sasl) if(sasl STREQUAL "AUTO") if(WIN32) # On Windows: Use SSPI _use_sasl("SSPI") else() # Other platforms: Use Cyrus (aka libsasl2) find_package(SASL2 2.0) if(SASL2_FOUND) # Found it _use_sasl("CYRUS") else() # Nope. That's okay, just turn SASL off set_property(DIRECTORY PROPERTY _mongoc-sasl-backend NOTFOUND) endif() endif() elseif(sasl) _use_sasl("${sasl}") else() set_property(DIRECTORY PROPERTY _mongoc-sasl-backend OFF) endif() endfunction() # Use the named SASL library. Must be either "CYRUS" or "SSPI" function(_use_sasl libname) add_library(_mongoc-sasl_backend INTERFACE) set_property(TARGET _mongoc-sasl_backend PROPERTY EXPORT_NAME detail::c_sasl_backend) target_link_libraries(_mongoc-dependencies INTERFACE _mongoc-sasl_backend) install(TARGETS _mongoc-sasl_backend EXPORT mongoc-targets) if(libname STREQUAL "SSPI") target_link_libraries(_mongoc-sasl_backend INTERFACE secur32.lib crypt32.lib Shlwapi.lib) set(backend "SSPI") elseif(libname STREQUAL "CYRUS") find_package(SASL2 2.0 REQUIRED) target_link_libraries(_mongoc-sasl_backend INTERFACE SASL2::SASL2) install(FILES "${mongo-c-driver_SOURCE_DIR}/build/cmake/FindSASL2.cmake" DESTINATION "${MONGOC_TARGETS_INSTALL_DIR}/3rdParty") set(backend "Cyrus") else() message(FATAL_ERROR "Unknown SASL backend “${libname}”") endif() set_property(DIRECTORY PROPERTY _mongoc-sasl-backend "${backend}") endfunction() _pick_sasl("${ENABLE_SASL}") # Variable is used here, as well as within the mongoc-config.cmake template: get_directory_property(SASL_BACKEND _mongoc-sasl-backend) message(STATUS "Using SASL backend : ${SASL_BACKEND}") set_package_properties(SASL2 PROPERTIES DESCRIPTION "Cyrus implementation of SASL" TYPE OPTIONAL PURPOSE "Provides libmongoc SASL authentication support" ) if(SASL_BACKEND STREQUAL "Cyrus") cmake_push_check_state() list(APPEND CMAKE_REQUIRED_LIBRARIES SASL2::SASL2) check_symbol_exists( sasl_client_done sasl/sasl.h SASL2_HAVE_SASL_CLIENT_DONE ) cmake_pop_check_state() endif() mongo_bool01(MONGOC_HAVE_SASL_CLIENT_DONE [[SASL2_HAVE_SASL_CLIENT_DONE]]) mongo_bool01(MONGOC_ENABLE_SASL_SSPI [[SASL_BACKEND STREQUAL "SSPI"]]) mongo_bool01(MONGOC_ENABLE_SASL_CYRUS [[SASL_BACKEND STREQUAL "Cyrus"]]) mongo_bool01(MONGOC_ENABLE_SASL [[MONGOC_ENABLE_SASL_SSPI OR MONGOC_ENABLE_SASL_CYRUS]]) add_feature_info( "SASL Authentication" "${MONGOC_ENABLE_SASL}" "authenticate with MongoDB servers using SASL: “Simple Authentication and Security Layer” (${SASL_BACKEND})" ) if (ENABLE_AUTOMATIC_INIT_AND_CLEANUP) set (MONGOC_NO_AUTOMATIC_GLOBALS 0) else () set (MONGOC_NO_AUTOMATIC_GLOBALS 1) endif () if (WIN32) SET (CMAKE_EXTRA_INCLUDE_FILES "ws2tcpip.h") else () SET (CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") endif () CHECK_TYPE_SIZE (socklen_t HAVE_SOCKLEN) SET (CMAKE_EXTRA_INCLUDE_FILES) if (HAVE_SOCKLEN) set (MONGOC_HAVE_SOCKLEN 1) set (MONGOC_SOCKET_ARG3 "socklen_t") else () set (MONGOC_HAVE_SOCKLEN 0) set (MONGOC_SOCKET_ARG3 "int") endif () # Find name resolution libaries. Also sets definitions used in configure_file(): include(ResSearch) function (mongoc_get_accept_args ARG2 ARG3) SET (VAR 0) foreach (ARG2_VAL "struct sockaddr" "void") foreach (ARG3_VAL "socklen_t" "size_t" "int") MATH (EXPR VAR "${VAR}+1") FILE (WRITE ${CMAKE_CURRENT_BINARY_DIR}/accept_test${VAR}.c "#include #include int main () { int a = 0; ${ARG2_VAL} *b = 0; ${ARG3_VAL} *c = 0; accept (a, b, c); return 0; } ") TRY_COMPILE (RES ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/accept_test${VAR}.c CMAKE_FLAGS "-Werror -DCMAKE_CXX_LINK_EXECUTABLE='echo not linking now...'" OUTPUT_VARIABLE LOG2) if (RES) message ( STATUS "Detected parameters: accept (int, ${ARG2_VAL} *, ${ARG3_VAL} *)") set (${ARG2} ${ARG2_VAL} PARENT_SCOPE) set (${ARG3} ${ARG3_VAL} PARENT_SCOPE) return () endif () endforeach () endforeach () endfunction () # Reasonable defaults. set (MONGOC_SOCKET_ARG2 "struct sockaddr") set (MONGOC_SOCKET_ARG3 "socklen_t") if (NOT WIN32) mongoc_get_accept_args (MONGOC_SOCKET_ARG2 MONGOC_SOCKET_ARG3) endif () set (MONGOC_CC ${CMAKE_C_COMPILER}) set (MONGOC_USER_SET_CFLAGS ${CMAKE_C_FLAGS}) set (MONGOC_USER_SET_LDFLAGS ${CMAKE_EXE_LINKER_FLAGS}) if (ENABLE_TRACING) set (MONGOC_TRACE 1) else () set (MONGOC_TRACE 0) endif () # Sets SNAPPY_LIBRARIES and SNAPPY_INCLUDE_DIRS. include (FindSnappy) if (SNAPPY_INCLUDE_DIRS) set (MONGOC_ENABLE_COMPRESSION 1) include_directories ("${SNAPPY_INCLUDE_DIRS}") endif () mongo_bool01 (MONGOC_ENABLE_SHM_COUNTERS ENABLE_SHM_COUNTERS) # Configure In-Use Encryption set (MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION 0) if (NOT ENABLE_CLIENT_SIDE_ENCRYPTION MATCHES "AUTO|ON|OFF") message (FATAL_ERROR, "ENABLE_CLIENT_SIDE_ENCRYPTION option must be AUTO, ON, or OFF") endif () if (NOT MONGOC_ENABLE_SSL) if (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL ON) message (FATAL_ERROR "SSL disabled, but is required for Client-Side Field Level Encryption support.") elseif (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL AUTO) message (STATUS "SSL disabled. Configuring without Client-Side Field Level Encryption support.") endif () elseif (NOT ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL OFF) message (STATUS "Searching for libmongocrypt") if (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL ON) # do not suppress log output if find_package cannot find libmongocrypt find_package (mongocrypt) elseif (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL AUTO) find_package (mongocrypt QUIET) endif () if (mongocrypt_FOUND AND "${mongocrypt_VERSION}" VERSION_LESS 1.8.0) message (STATUS " libmongocrypt found at ${mongocrypt_DIR}") message (STATUS " libmongocrypt version ${mongocrypt_VERSION} found") message (STATUS " libmongocrypt version 1.8.0 is required to enable Client-Side Field Level Encryption Support.") set (REQUIRED_MONGOCRYPT_VERSION_FOUND OFF) elseif (mongocrypt_FOUND) set (REQUIRED_MONGOCRYPT_VERSION_FOUND ON) else () set (REQUIRED_MONGOCRYPT_VERSION_FOUND OFF) endif () if (REQUIRED_MONGOCRYPT_VERSION_FOUND) set (LIBMONGOCRYPT_TARGET mongo::mongocrypt) get_target_property (LIBMONGOCRYPT_RUNTIME_LIBRARY mongo::mongocrypt LOCATION) get_filename_component(LIBMONGOCRYPT_LIBRARY_LOCATION ${LIBMONGOCRYPT_RUNTIME_LIBRARY} DIRECTORY) find_library (LIBMONGOCRYPT_LIBRARY NAMES mongocrypt PATHS ${LIBMONGOCRYPT_LIBRARY_LOCATION}) get_target_property (LIBMONGOCRYPT_INCLUDE_DIRECTORIES mongo::mongocrypt INTERFACE_INCLUDE_DIRECTORIES) message (STATUS " libmongocrypt found at ${LIBMONGOCRYPT_LIBRARY}") message (STATUS " libmongocrypt include path ${LIBMONGOCRYPT_INCLUDE_DIRECTORIES}") message (STATUS " libmongocrypt version ${mongocrypt_VERSION}") set (MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION 1) elseif (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL ON) message (FATAL_ERROR "Required library (libmongocrypt) not found.") else () message (STATUS "libmongocrypt not found. Configuring without Client-Side Field Level Encryption support.") endif () endif () CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage" ss_family "sys/socket.h" MONGOC_HAVE_SS_FAMILY) if (NOT MONGOC_HAVE_SS_FAMILY) set (MONGOC_HAVE_SS_FAMILY 0) else () set (MONGOC_HAVE_SS_FAMILY 1) endif () set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/src/mongoc/mcd-azure.c ${PROJECT_SOURCE_DIR}/src/mongoc/mcd-rpc.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-aggregate.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-apm.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-array.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-async.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-async-cmd.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-buffer.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-bulk-operation.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-change-stream.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-pool.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-side-encryption.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-aws.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-sasl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-collection.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-compression.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-counters.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypt.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-array.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-cmd.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-change-stream.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-cmd-deprecated.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-find.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-find-cmd.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-find-opquery.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-legacy.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-array.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-database.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-error.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-deprioritized-servers.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-flags.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-find-and-modify.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-generation-map.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-init.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-bucket.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-bucket-file.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-list.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-page.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-list.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-handshake.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-host-list.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-http.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-index.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-init.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-interrupt.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-list.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-linux-distro-scanner.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-log.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-matcher.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-matcher-op.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-memcmp.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cmd.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-opcode.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-optional.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-opts-helpers.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-opts.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-queue.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-read-concern.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-read-prefs.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rpc.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-api.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-description.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-stream.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-session.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-monitor.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-set.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-shared.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-socket.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-buffered.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-file.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-gridfs.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-gridfs-download.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-gridfs-upload.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-socket.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-timeout.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-background-monitoring.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-description.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-description-apm.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-scanner.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-ts-pool.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-uri.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-util.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-version-functions.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-write-command.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-write-concern.c ${PROJECT_SOURCE_DIR}/src/mongoc/service-gcp.c ${PROJECT_SOURCE_DIR}/../../src/common/common-b64.c ${PROJECT_SOURCE_DIR}/../../src/common/common-md5.c ${PROJECT_SOURCE_DIR}/../../src/common/common-thread.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-scram.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-ssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-libressl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-libressl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto-cng.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand-cng.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-secure-channel.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-secure-channel.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto-common-crypto.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand-common-crypto.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-secure-transport.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-secure-transport.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-openssl-bio.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-ocsp-cache.c ) set (HEADERS ${PROJECT_BINARY_DIR}/src/mongoc/mongoc-config.h ${PROJECT_BINARY_DIR}/src/mongoc/mongoc-version.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-apm.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-bulk-operation.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-change-stream.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-pool.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-side-encryption.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-collection.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-database.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-error.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-flags.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-find-and-modify.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-bucket.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-page.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-list.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-handshake.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-host-list.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-init.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-index.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-iovec.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-log.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-macros.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-matcher.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-opcode.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-optional.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-prelude.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-read-concern.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-read-prefs.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-api.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-description.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-session.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-sleep.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-socket.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-libressl.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-openssl.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-buffered.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-file.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-gridfs.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-socket.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-description.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-uri.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-version-functions.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-write-concern.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-ssl.h ) set (HEADERS_FORWARDING ${PROJECT_SOURCE_DIR}/src/mongoc/forwarding/mongoc.h ) configure_file ( "${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-config.h.in" "${PROJECT_BINARY_DIR}/src/mongoc/mongoc-config.h" ) configure_file ( "${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-version.h.in" "${PROJECT_BINARY_DIR}/src/mongoc/mongoc-version.h" ) if (ENABLE_APPLE_FRAMEWORK) configure_file ( "${PROJECT_SOURCE_DIR}/src/mongoc/modules/module.modulemap.in" "${PROJECT_BINARY_DIR}/src/mongoc/modules/module.modulemap" ) endif () if (MONGOC_ENABLE_SASL) set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-sasl.c) if (MONGOC_ENABLE_SASL_CYRUS) message (STATUS "Compiling against Cyrus SASL") set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-cyrus.c) set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cyrus.c) elseif (MONGOC_ENABLE_SASL_SSPI) message (STATUS "Compiling against Windows SSPI") set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-sspi.c) set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-sspi.c) endif () else () message (STATUS "SASL disabled") endif () set (LIBRARIES ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} ${LIBMONGOCRYPT_LIBRARY} ) set (STATIC_LIBRARIES ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} ${LIBMONGOCRYPT_LIBRARY} ) # utf8proc configuration find_package(Utf8Proc REQUIRED) set(UTF8PROC_INCLUDE_DIRS, "") if (USE_BUNDLED_UTF8PROC) set ( UTF8PROC_INCLUDE_DIRS "${SOURCE_DIR}/src/utf8proc-2.8.0" ) list(APPEND SOURCES $) else() target_link_libraries(_mongoc-dependencies INTERFACE utf8proc) endif() if(ENABLE_SRV) # Interface target defined by ResSearch.cmake: if(NOT TARGET mongo::detail::c_resolve) message(SEND_ERROR "ENABLE_SRV is “${ENABLE_SRV}”, but we were unable to find a name resolution library") endif() target_link_libraries(_mongoc-dependencies INTERFACE mongo::detail::c_resolve) endif() if (MONGOC_ENABLE_MONGODB_AWS_AUTH) # Disable warnings on bundled kms_message source files. set_source_files_properties (${KMS_MSG_SOURCES} PROPERTIES COMPILE_FLAGS -w) set (SOURCES ${SOURCES} ${KMS_MSG_SOURCES}) set (KMS_MSG_DEFINITIONS KMS_MSG_STATIC KMS_MESSAGE_ENABLE_CRYPTO) include (TestBigEndian) TEST_BIG_ENDIAN (KMS_BIG_ENDIAN) if (KMS_BIG_ENDIAN) set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_BIG_ENDIAN) else () set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_LITTLE_ENDIAN) endif () if (MONGOC_ENABLE_CRYPTO_CNG) set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_ENABLE_CRYPTO_CNG) elseif (MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO) set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_ENABLE_CRYPTO_COMMON_CRYPTO) elseif(MONGOC_ENABLE_CRYPTO_LIBCRYPTO) set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_ENABLE_CRYPTO_LIBCRYPTO) else () message (FATAL_ERROR "MONGODB-AWS requires a crypto library") endif() endif () if (MONGOC_ENABLE_STATIC_BUILD) add_library (mcd_rpc STATIC EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR}/src/mongoc/mcd-rpc.c) target_include_directories (mcd_rpc PUBLIC ${PROJECT_SOURCE_DIR}/src) target_link_libraries (mcd_rpc PUBLIC ${BSON_STATIC_LIBRARIES}) if (NOT WIN32 AND ENABLE_PIC) target_compile_options (mcd_rpc PUBLIC -fPIC) endif () target_compile_definitions (mcd_rpc PUBLIC ${BSON_STATIC_PUBLIC_DEFINITIONS}) set_target_properties (mcd_rpc PROPERTIES OUTPUT_NAME "mcd-rpc") endif () if (ENABLE_SHARED) add_library (mongoc_shared SHARED ${SOURCES} ${HEADERS} ${HEADERS_FORWARDING}) if(WIN32) # Add resource-definition script for Windows shared library (.dll). configure_file(libmongoc.rc.in libmongoc.rc) target_sources(mongoc_shared PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/libmongoc.rc) endif() set_target_properties (mongoc_shared PROPERTIES CMAKE_CXX_VISIBILITY_PRESET hidden) target_link_libraries (mongoc_shared PRIVATE ${LIBRARIES} PUBLIC ${BSON_LIBRARIES} mongo::detail::c_dependencies) target_include_directories (mongoc_shared PRIVATE ${ZLIB_INCLUDE_DIRS}) target_include_directories (mongoc_shared PRIVATE ${UTF8PROC_INCLUDE_DIRS}) target_include_directories (mongoc_shared PRIVATE ${LIBMONGOCRYPT_INCLUDE_DIRECTORIES}) if (MONGOC_ENABLE_MONGODB_AWS_AUTH) target_include_directories (mongoc_shared PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../kms-message/src") if (APPLE) set_target_properties (mongoc_shared PROPERTIES LINK_FLAGS "-Wl,-unexported_symbols_list,\"${CMAKE_CURRENT_SOURCE_DIR}/../../build/cmake/libmongoc-hidden-symbols.txt\"") elseif (UNIX) set_target_properties (mongoc_shared PROPERTIES LINK_FLAGS "-Wl,--version-script=\"${CMAKE_CURRENT_SOURCE_DIR}/../../build/cmake/libmongoc-hidden-symbols.map\"") endif () endif () target_compile_definitions (mongoc_shared PRIVATE MONGOC_COMPILATION ${KMS_MSG_DEFINITIONS} MCOMMON_NAME_PREFIX=_mongoc_mcommon ) if (USE_BUNDLED_UTF8PROC) target_compile_definitions (mongoc_shared PRIVATE UTF8PROC_STATIC) endif () # Several directories in the source and build trees contain headers we would like # include via relative reference, but they all end up in the same install path target_include_directories ( mongoc_shared PUBLIC $ $ $ $ $ $ $ ) set_target_properties (mongoc_shared PROPERTIES OUTPUT_NAME "${MONGOC_OUTPUT_BASENAME}-${MONGOC_API_VERSION}" VERSION 0.0.0 SOVERSION 0 pkg_config_REQUIRES "libbson-1.0" ) mongo_generate_pkg_config(mongoc_shared INSTALL RENAME libmongoc-${MONGOC_API_VERSION}.pc) if (ENABLE_APPLE_FRAMEWORK) set_target_properties (mongoc_shared PROPERTIES FRAMEWORK TRUE MACOSX_FRAMEWORK_BUNDLE_VERSION ${MONGOC_VERSION} MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${MONGOC_VERSION} MACOSX_FRAMEWORK_IDENTIFIER org.mongodb.mongoc OUTPUT_NAME "${MONGOC_OUTPUT_BASENAME}" PUBLIC_HEADER "${HEADERS}" ) endif () # ENABLE_APPLE_FRAMEWORK add_executable (mongoc-stat ${PROJECT_SOURCE_DIR}/../../src/tools/mongoc-stat.c) target_link_libraries (mongoc-stat mongoc_shared ${LIBRARIES}) # mongoc-stat works if shared memory performance counters are enabled. if (ENABLE_SHM_COUNTERS) install (TARGETS mongoc-stat EXPORT mongoc_targets RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") endif () # ENABLE_SHM_COUNTERS endif () # ENABLE_SHARED if (MONGOC_ENABLE_STATIC_BUILD) add_library (mongoc_static STATIC ${SOURCES} ${HEADERS} ${HEADERS_FORWARDING}) target_link_libraries (mongoc_static PUBLIC ${STATIC_LIBRARIES} ${BSON_STATIC_LIBRARIES} mongo::detail::c_dependencies) if (NOT WIN32 AND ENABLE_PIC) target_compile_options (mongoc_static PUBLIC -fPIC) message (STATUS "Adding -fPIC to compilation of mongoc_static components") endif () if(ENABLE_SRV AND RESOLVE_LIB_NAME) # The static library needs to link to the resolver in pkg-config: set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS "-l${RESOLVE_LIB_NAME}") endif() if(SASL_BACKEND STREQUAL "Cyrus") set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS "-lsasl2") endif() set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS ${${TLS_BACKEND}/pkg_config_LIBS}) target_include_directories (mongoc_static PRIVATE ${ZLIB_INCLUDE_DIRS}) target_include_directories (mongoc_static PRIVATE ${UTF8PROC_INCLUDE_DIRS}) target_include_directories (mongoc_static PRIVATE ${LIBMONGOCRYPT_INCLUDE_DIRECTORIES}) if (MONGOC_ENABLE_MONGODB_AWS_AUTH) target_include_directories (mongoc_static PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../kms-message/src") endif () target_compile_definitions (mongoc_static PUBLIC MONGOC_STATIC ${BSON_STATIC_PUBLIC_DEFINITIONS} PRIVATE MONGOC_COMPILATION ${KMS_MSG_DEFINITIONS} MCOMMON_NAME_PREFIX=_mongoc_mcommon ) if (USE_BUNDLED_UTF8PROC) target_compile_definitions (mongoc_static PRIVATE UTF8PROC_STATIC) endif () # Several directories in the source and build trees contain headers we would like # include via relative reference, but they all end up in the same install path target_include_directories ( mongoc_static PUBLIC $ $ $ $ $ $ $ ) set_target_properties (mongoc_static PROPERTIES VERSION 0.0.0 OUTPUT_NAME "${MONGOC_OUTPUT_BASENAME}-static-${MONGOC_API_VERSION}" pkg_config_REQUIRES "libbson-static-1.0" ) if(MONGOC_ENABLE_STATIC_INSTALL) mongo_generate_pkg_config (mongoc_static FILENAME libmongoc-static-${MONGOC_API_VERSION}.pc INSTALL) endif() endif () set (test-libmongoc-sources ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/corpus-test.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/corpus-test.h ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-atomic.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-b64.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-bson.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-bcon-basic.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-bcon-extract.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-bson-cmp.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-bson-corpus.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-bson-error.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-bson-version.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-bson.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-clock.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-decimal128.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-endian.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-iso8601.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-iter.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-json.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-oid.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-reader.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-string.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-utf8.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-value.c ${PROJECT_SOURCE_DIR}/../../src/libbson/tests/test-writer.c ${PROJECT_SOURCE_DIR}/tests/bsonutil/bson-match.c ${PROJECT_SOURCE_DIR}/tests/bsonutil/bson-parser.c ${PROJECT_SOURCE_DIR}/tests/bsonutil/bson-val.c ${PROJECT_SOURCE_DIR}/tests/debug-stream.c ${PROJECT_SOURCE_DIR}/tests/json-test-monitoring.c ${PROJECT_SOURCE_DIR}/tests/json-test-operations.c ${PROJECT_SOURCE_DIR}/tests/json-test.c ${PROJECT_SOURCE_DIR}/tests/mock_server/future-functions.c ${PROJECT_SOURCE_DIR}/tests/mock_server/future-value.c ${PROJECT_SOURCE_DIR}/tests/mock_server/future.c ${PROJECT_SOURCE_DIR}/tests/mock_server/mock-rs.c ${PROJECT_SOURCE_DIR}/tests/mock_server/mock-server.c ${PROJECT_SOURCE_DIR}/tests/mock_server/request.c ${PROJECT_SOURCE_DIR}/tests/mock_server/sync-queue.c ${PROJECT_SOURCE_DIR}/tests/test-conveniences.c ${PROJECT_SOURCE_DIR}/tests/test-happy-eyeballs.c ${PROJECT_SOURCE_DIR}/tests/test-libmongoc.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-aggregate.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-array.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-async.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-aws.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-background-monitoring.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-buffer.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-bulk.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-change-stream.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-client-pool.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-client-session.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-client.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cluster.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cmd.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-collection-find-with-opts.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-collection-find.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-collection.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-command-monitoring.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-connection-uri.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-counters.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-crud.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cursor.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-database.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-dns.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-error.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-exhaust.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-find-and-modify.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-generation-map.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-gridfs-bucket.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-gridfs-file-page.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-gridfs.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-handshake.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-hedged-reads.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-http.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-interrupt.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-linux-distro-scanner.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-list.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-loadbalanced.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-log.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-long-namespace.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-matcher.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-max-staleness.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-mongohouse.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-mongos-pinning.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-opts.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-primary-stepdown.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-queue.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-read-concern.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-read-prefs.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-read-write-concern.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-retryability-helpers.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-retryable-reads.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-retryable-writes.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-sample-commands.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-scram.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-sdam-monitoring.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-sdam.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-server-description.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-server-selection-errors.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-server-selection.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-server-stream.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-set.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-shared.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-socket.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-speculative-auth.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-ssl.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-stream.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-streamable-hello.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-thread.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-timeout.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-topology-description.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-topology-reconcile.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-topology-scanner.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-topology.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-transactions.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-ts-pool.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-uri.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-usleep.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-util.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-version.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-versioned-api.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-with-transaction.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-write-commands.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-write-concern.c ${PROJECT_SOURCE_DIR}/tests/test-mcd-azure-imds.c ${PROJECT_SOURCE_DIR}/tests/test-service-gcp.c ${PROJECT_SOURCE_DIR}/tests/test-mcd-integer.c ${PROJECT_SOURCE_DIR}/tests/test-mcd-rpc.c ${PROJECT_SOURCE_DIR}/tests/TestSuite.c ${PROJECT_SOURCE_DIR}/tests/unified/operation.c ${PROJECT_SOURCE_DIR}/tests/unified/entity-map.c ${PROJECT_SOURCE_DIR}/tests/unified/result.c ${PROJECT_SOURCE_DIR}/tests/unified/runner.c ${PROJECT_SOURCE_DIR}/tests/unified/test-diagnostics.c ${PROJECT_SOURCE_DIR}/tests/unified/util.c ) if (MONGOC_ENABLE_SSL) set (test-libmongoc-sources ${test-libmongoc-sources} ${PROJECT_SOURCE_DIR}/tests/ssl-test.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-client-side-encryption.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-stream-tls-error.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-stream-tls.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-x509.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-ocsp-cache.c ) endif () if (MONGOC_ENABLE_SASL_CYRUS) set (test-libmongoc-sources ${test-libmongoc-sources} ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cyrus.c ) endif () if (ENABLE_TESTS) add_library (test-libmongoc-lib STATIC ${test-libmongoc-sources}) if (MSVC AND MSVC_VERSION VERSION_LESS 1900) message (STATUS "Disabling warning C4756 for VS 2013 and older") # Macro constant INFINITY triggers constant arithmetic overflow warnings in # VS 2013, but VS 2013 doesn't support inline warning suppression. # Remove once support for VS 2013 is dropped. target_compile_options(test-libmongoc-lib PRIVATE /wd4756) endif () target_link_libraries (test-libmongoc-lib PUBLIC mongoc_static) # We have tests that test our deprecated api. target_compile_options (test-libmongoc-lib PRIVATE $<$>:-Wno-deprecated-declarations> ) target_include_directories (test-libmongoc-lib PRIVATE ${PROJECT_SOURCE_DIR}/tests ${BSON_STATIC_INCLUDE_DIRS} ) target_compile_definitions (test-libmongoc-lib PUBLIC "MONGOC_COMPILATION" "BSON_COMPILATION" "MCOMMON_NAME_PREFIX=_mongoc_mcommon" ) function (mongoc_add_test test) add_executable (${test} ${ARGN}) target_link_libraries (${test} PUBLIC $<$:DbgHelp.dll> mongoc_static ) # We have tests that test our deprecated api. target_compile_options (${test} PRIVATE $<$>:-Wno-deprecated-declarations> ) target_include_directories (${test} PRIVATE ${PROJECT_SOURCE_DIR}/tests ${BSON_STATIC_INCLUDE_DIRS} ) target_compile_definitions (${test} PUBLIC "MONGOC_COMPILATION" "BSON_COMPILATION" "MCOMMON_NAME_PREFIX=_mongoc_mcommon" ) endfunction () mongoc_add_test (test-libmongoc ${PROJECT_SOURCE_DIR}/tests/test-libmongoc-main.c) target_link_libraries (test-libmongoc PUBLIC test-libmongoc-lib) mongoc_add_test (test-atlas-executor ${PROJECT_SOURCE_DIR}/tests/test-atlas-executor.c) target_link_libraries (test-atlas-executor PUBLIC test-libmongoc-lib) mongoc_add_test (test-mongoc-gssapi ${PROJECT_SOURCE_DIR}/tests/test-mongoc-gssapi.c) mongoc_add_test (test-mongoc-cache ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cache.c) mongoc_add_test (test-azurekms ${PROJECT_SOURCE_DIR}/tests/test-azurekms.c) mongoc_add_test (test-gcpkms ${PROJECT_SOURCE_DIR}/tests/test-gcpkms.c) mongoc_add_test (test-awsauth ${PROJECT_SOURCE_DIR}/tests/test-awsauth.c) # "make test" doesn't compile tests, so we create "make check" which compiles # and runs tests: https://gitlab.kitware.com/cmake/cmake/issues/8774 add_custom_target (check COMMAND ${CMAKE_CTEST_COMMAND} -V DEPENDS test-libmongoc ) endif () if (ENABLE_EXAMPLES AND ENABLE_SHARED) function (mongoc_add_example example) add_executable (${example} ${ARGN}) target_link_libraries (${example} mongoc_shared ${LIBRARIES}) if (WIN32) target_link_libraries (${example} shlwapi) endif () set (EXAMPLES ${EXAMPLES} ${example}) endfunction () # examples/ mongoc_add_example (example-client ${PROJECT_SOURCE_DIR}/examples/example-client.c) mongoc_add_example (example-collection-watch ${PROJECT_SOURCE_DIR}/examples/example-collection-watch.c) if (NOT WIN32) mongoc_add_example (example-resume ${PROJECT_SOURCE_DIR}/examples/example-resume.c) endif() mongoc_add_example (example-start-at-optime ${PROJECT_SOURCE_DIR}/examples/example-start-at-optime.c) mongoc_add_example (example-command-monitoring ${PROJECT_SOURCE_DIR}/examples/example-command-monitoring.c) mongoc_add_example (example-command-with-opts ${PROJECT_SOURCE_DIR}/examples/example-command-with-opts.c) mongoc_add_example (example-manage-collection-indexes ${PROJECT_SOURCE_DIR}/examples/example-manage-collection-indexes.c) mongoc_add_example (example-manage-search-indexes ${PROJECT_SOURCE_DIR}/examples/example-manage-search-indexes.c) mongoc_add_example (example-gridfs ${PROJECT_SOURCE_DIR}/examples/example-gridfs.c) mongoc_add_example (example-gridfs-bucket ${PROJECT_SOURCE_DIR}/examples/example-gridfs-bucket.c) if (NOT WIN32 AND ENABLE_EXAMPLES) mongoc_add_example (example-pool ${PROJECT_SOURCE_DIR}/examples/example-pool.c) endif () mongoc_add_example (example-scram ${PROJECT_SOURCE_DIR}/examples/example-scram.c) mongoc_add_example (example-sdam-monitoring ${PROJECT_SOURCE_DIR}/examples/example-sdam-monitoring.c) mongoc_add_example (example-session ${PROJECT_SOURCE_DIR}/examples/example-session.c) mongoc_add_example (example-transaction ${PROJECT_SOURCE_DIR}/examples/example-transaction.c) mongoc_add_example (example-update ${PROJECT_SOURCE_DIR}/examples/example-update.c) mongoc_add_example (find-and-modify ${PROJECT_SOURCE_DIR}/examples/find-and-modify.c) mongoc_add_example (hello_mongoc ${PROJECT_SOURCE_DIR}/examples/hello_mongoc.c) mongoc_add_example (mongoc-dump ${PROJECT_SOURCE_DIR}/examples/mongoc-dump.c) mongoc_add_example (mongoc-ping ${PROJECT_SOURCE_DIR}/examples/mongoc-ping.c) mongoc_add_example (mongoc-tail ${PROJECT_SOURCE_DIR}/examples/mongoc-tail.c) mongoc_add_example (example-collection-command ${PROJECT_SOURCE_DIR}/examples/example-collection-command.c) # examples/aggregation/ mongoc_add_example (aggregation1 ${PROJECT_SOURCE_DIR}/examples/aggregation/aggregation1.c) # examples/basic_aggregation/ mongoc_add_example (basic-aggregation ${PROJECT_SOURCE_DIR}/examples/basic_aggregation/basic-aggregation.c) # examples/bulk/ mongoc_add_example (bulk-collation ${PROJECT_SOURCE_DIR}/examples/bulk/bulk-collation.c) mongoc_add_example (bulk1 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk1.c) mongoc_add_example (bulk2 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk2.c) mongoc_add_example (bulk3 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk3.c) mongoc_add_example (bulk4 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk4.c) mongoc_add_example (bulk5 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk5.c) mongoc_add_example (bulk6 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk6.c) # examples/common_operations/ mongoc_add_example (common-operations ${PROJECT_SOURCE_DIR}/examples/common_operations/common-operations.c) # examples/find_and_modify_with_opts/ mongoc_add_example (fam ${PROJECT_SOURCE_DIR}/examples/find_and_modify_with_opts/fam.c) if (MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION) mongoc_add_example (client-side-encryption-schema-map ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-schema-map.c ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-helpers.c) mongoc_add_example (client-side-encryption-server-schema ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-server-schema.c ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-helpers.c) mongoc_add_example (client-side-encryption-explicit ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-explicit.c ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-helpers.c) mongoc_add_example (client-side-encryption-auto-decryption ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-auto-decryption.c ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-helpers.c) mongoc_add_example (client-side-encryption-doc-snippets ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-doc-snippets.c) endif () # examples/tutorial mongoc_add_example (executing ${PROJECT_SOURCE_DIR}/examples/tutorial/executing.c) mongoc_add_example (appending ${PROJECT_SOURCE_DIR}/examples/tutorial/appending.c) endif () file (COPY ${PROJECT_SOURCE_DIR}/tests/binary DESTINATION ${PROJECT_BINARY_DIR}/tests) file (COPY ${PROJECT_SOURCE_DIR}/tests/json DESTINATION ${PROJECT_BINARY_DIR}/tests) file (COPY ${PROJECT_SOURCE_DIR}/tests/x509gen DESTINATION ${PROJECT_BINARY_DIR}/tests) file (COPY ${PROJECT_SOURCE_DIR}/tests/release_files DESTINATION ${PROJECT_BINARY_DIR}/tests) set (TARGETS_TO_INSTALL) if (MONGOC_ENABLE_STATIC_INSTALL) list (APPEND TARGETS_TO_INSTALL mongoc_static) endif () if (ENABLE_SHARED) list (APPEND TARGETS_TO_INSTALL mongoc_shared) endif () set (MONGOC_HEADER_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}/libmongoc-${MONGOC_API_VERSION}" ) install ( TARGETS ${TARGETS_TO_INSTALL} ${EXAMPLES} EXPORT mongoc-targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${MONGOC_HEADER_INSTALL_DIR} FRAMEWORK DESTINATION ${CMAKE_INSTALL_BINDIR} ) install ( FILES ${HEADERS} DESTINATION "${MONGOC_HEADER_INSTALL_DIR}/mongoc" ) install ( FILES ${HEADERS_FORWARDING} DESTINATION "${MONGOC_HEADER_INSTALL_DIR}" ) if (ENABLE_APPLE_FRAMEWORK) install ( FILES "${PROJECT_BINARY_DIR}/src/mongoc/modules/module.modulemap" DESTINATION "${CMAKE_INSTALL_BINDIR}/mongoc.framework/Modules/" ) endif () # Collect link items for the static library to be inserted into the pkg-config if(TARGET mongoc_static) set(link_options ${ZLIB_LIBRARIES} ${SNAPPY_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} ${LIBMONGOCRYPT_LIBRARY}) # Replace all absolute paths with search-dir link-file options: list(TRANSFORM link_options REPLACE "^(.+)/lib([^/\\.]+)\\..+$" "-L\\1;-l\\2" REGEX "^/") # Prepend "-l" to all bare names: list(TRANSFORM link_options PREPEND "-l" REGEX "^[^-]") list(REMOVE_DUPLICATES link_options) message(DEBUG "Computed static library link options: ${link_options}") set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS ${link_options}) endif() # Relative include-path will be given the install prefix: set_property(TARGET ${TARGETS_TO_INSTALL} APPEND PROPERTY pkg_config_INCLUDE_DIRECTORIES "${MONGOC_HEADER_INSTALL_DIR}") # Deprecated alias for libmongoc-1.0.pc, see CDRIVER-2086. if (MONGOC_ENABLE_SSL) configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/src/libmongoc-ssl-1.0.pc.in ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-ssl-1.0.pc @ONLY) install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-ssl-1.0.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) endif () include (CMakePackageConfigHelpers) write_basic_package_version_file ( "${CMAKE_CURRENT_BINARY_DIR}/mongoc/mongoc-${MONGOC_API_VERSION}-config-version.cmake" VERSION ${MONGOC_VERSION} COMPATIBILITY AnyNewerVersion ) configure_file (src/mongoc-config.cmake "${CMAKE_CURRENT_BINARY_DIR}/mongoc/mongoc-${MONGOC_API_VERSION}-config.cmake" @ONLY ) install (EXPORT mongoc-targets NAMESPACE mongo:: FILE mongoc-targets.cmake DESTINATION ${MONGOC_TARGETS_INSTALL_DIR} ) install ( FILES "${CMAKE_CURRENT_BINARY_DIR}/mongoc/mongoc-${MONGOC_API_VERSION}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/mongoc/mongoc-${MONGOC_API_VERSION}-config-version.cmake" DESTINATION ${MONGOC_TARGETS_INSTALL_DIR} COMPONENT Devel ) include (LegacyPackage) if (ENABLE_MAN_PAGES STREQUAL ON OR ENABLE_HTML_DOCS STREQUAL ON) find_package (Sphinx REQUIRED) add_subdirectory (doc) add_custom_target (mongoc-doc ALL DEPENDS $<$:mongoc-man> $<$:mongoc-html> ) endif () mongo-c-driver-1.26.0/src/libmongoc/THIRD_PARTY_NOTICES000066400000000000000000000052101456567454500221530ustar00rootroot00000000000000The MongoDB C Driver uses third-party code distributed under different licenses. License notice for mongoc-stream-tls-secure-channel.c ------------------------------------------------------------------------------- Curl License Significant portions of mongoc-stream-tls-secure-channel.c are from Curl. Copyright (C) 2012 - 2015, Marc Hoersken, Copyright (C) 2012, Mark Salisbury, Copyright (C) 2012 - 2015, Daniel Stenberg, , et al. All rights reserved. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. License notice for utlist.h ------------------------------------------------------------------------------- BSD 1-Clause License Copyright: 2007-2014, Troy D. Hanson http://troydhanson.github.com/uthash/ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mongo-c-driver-1.26.0/src/libmongoc/doc/000077500000000000000000000000001456567454500177625ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc/.gitignore000066400000000000000000000002531456567454500217520ustar00rootroot00000000000000*.7 *.pyc .doctrees objects.inv html/*.html html/*.css html/*.js html/*.png html/_sources html/_static html/_images/ html/.buildinfo html/.nojekyll man/*.3 man/.buildinfo mongo-c-driver-1.26.0/src/libmongoc/doc/CMakeLists.txt000066400000000000000000000002511456567454500225200ustar00rootroot00000000000000include (SphinxBuild) if (ENABLE_HTML_DOCS) sphinx_build_html (mongoc-html mongo-c-driver) endif () if (ENABLE_MAN_PAGES) sphinx_build_man (mongoc-man) endif () mongo-c-driver-1.26.0/src/libmongoc/doc/advanced-connections.rst000066400000000000000000000145311456567454500246050ustar00rootroot00000000000000:man_page: mongoc_advanced_connections Advanced Connections ==================== The following guide contains information specific to certain types of MongoDB configurations. For an example of connecting to a simple standalone server, see the :ref:`Tutorial `. To establish a connection with authentication options enabled, see the :doc:`Authentication ` page. To see an example of a connection with data compression, see the :doc:`Data Compression ` page. Connecting to a Replica Set --------------------------- Connecting to a `replica set `_ is much like connecting to a standalone MongoDB server. Simply specify the replica set name using the ``?replicaSet=myreplset`` URI option. .. code-block:: c #include #include int main (int argc, char *argv[]) { mongoc_client_t *client; mongoc_init (); /* Create our MongoDB Client */ client = mongoc_client_new ( "mongodb://host01:27017,host02:27017,host03:27017/?replicaSet=myreplset"); /* Do some work */ /* TODO */ /* Clean up */ mongoc_client_destroy (client); mongoc_cleanup (); return 0; } .. tip:: Multiple hostnames can be specified in the MongoDB connection string URI, with a comma separating hosts in the seed list. It is recommended to use a seed list of members of the replica set to allow the driver to connect to any node. Connecting to a Sharded Cluster ------------------------------- To connect to a `sharded cluster `_, specify the ``mongos`` nodes the client should connect to. The C Driver will automatically detect that it has connected to a ``mongos`` sharding server. If more than one hostname is specified, a seed list will be created to attempt failover between the ``mongos`` instances. .. warning:: Specifying the ``replicaSet`` parameter when connecting to a ``mongos`` sharding server is invalid. .. code-block:: c #include #include int main (int argc, char *argv[]) { mongoc_client_t *client; mongoc_init (); /* Create our MongoDB Client */ client = mongoc_client_new ("mongodb://myshard01:27017/"); /* Do something with client ... */ /* Free the client */ mongoc_client_destroy (client); mongoc_cleanup (); return 0; } Connecting to an IPv6 Address ----------------------------- The MongoDB C Driver will automatically resolve IPv6 addresses from host names. However, to specify an IPv6 address directly, wrap the address in ``[]``. .. code-block:: none mongoc_uri_t *uri = mongoc_uri_new ("mongodb://[::1]:27017"); Connecting with IPv4 and IPv6 ----------------------------- .. include:: includes/ipv4-and-ipv6.txt Connecting to a UNIX Domain Socket ---------------------------------- On UNIX-like systems, the C Driver can connect directly to a MongoDB server using a UNIX domain socket. Pass the URL-encoded path to the socket, which *must* be suffixed with ``.sock``. For example, to connect to a domain socket at ``/tmp/mongodb-27017.sock``: .. code-block:: none mongoc_uri_t *uri = mongoc_uri_new ("mongodb://%2Ftmp%2Fmongodb-27017.sock"); Include username and password like so: .. code-block:: none mongoc_uri_t *uri = mongoc_uri_new ("mongodb://user:pass@%2Ftmp%2Fmongodb-27017.sock"); Connecting to a server over TLS ------------------------------- These are instructions for configuring TLS/SSL connections. To run a server locally (on port 27017, for example): .. code-block:: none $ mongod --port 27017 --tlsMode requireTLS --tlsCertificateKeyFile server.pem --tlsCAFile ca.pem Add ``/?tls=true`` to the end of a client URI. .. code-block:: none mongoc_client_t *client = NULL; client = mongoc_client_new ("mongodb://localhost:27017/?tls=true"); MongoDB requires client certificates by default, unless the ``--tlsAllowConnectionsWithoutCertificates`` is provided. The C Driver can be configured to present a client certificate using the URI option ``tlsCertificateKeyFile``, which may be referenced through the constant ``MONGOC_URI_TLSCERTIFICATEKEYFILE``. .. code-block:: none mongoc_client_t *client = NULL; mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost:27017/?tls=true"); mongoc_uri_set_option_as_utf8 (uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "client.pem"); client = mongoc_client_new_from_uri (uri); The client certificate provided by ``tlsCertificateKeyFile`` must be issued by one of the server trusted Certificate Authorities listed in ``--tlsCAFile``, or issued by a CA in the native certificate store on the server when omitted. See :doc:`configuring_tls` for more information on the various TLS related options. Compressing data to and from MongoDB ------------------------------------ This content has been relocated to the :doc:`Data Compression ` page. Additional Connection Options ----------------------------- The full list of connection options can be found in the :symbol:`mongoc_uri_t` docs. Certain socket/connection related options are not configurable: ============== ===================================================== ====================== Option Description Value ============== ===================================================== ====================== SO_KEEPALIVE TCP Keep Alive Enabled -------------- ----------------------------------------------------- ---------------------- TCP_KEEPIDLE How long a connection needs to remain idle before TCP 120 seconds starts sending keepalive probes -------------- ----------------------------------------------------- ---------------------- TCP_KEEPINTVL The time in seconds between TCP probes 10 seconds -------------- ----------------------------------------------------- ---------------------- TCP_KEEPCNT How many probes to send, without acknowledgement, 9 probes before dropping the connection -------------- ----------------------------------------------------- ---------------------- TCP_NODELAY Send packets as soon as possible or buffer small Enabled (no buffering) packets (Nagle algorithm) ============== ===================================================== ====================== mongo-c-driver-1.26.0/src/libmongoc/doc/aggregate.rst000066400000000000000000000111461456567454500224450ustar00rootroot00000000000000:man_page: mongoc_aggregate Aggregation Framework Examples ============================== This document provides a number of practical examples that display the capabilities of the aggregation framework. The `Aggregations using the Zip Codes Data Set `_ examples uses a publicly available data set of all zipcodes and populations in the United States. These data are available at: `zips.json `_. Requirements ------------ Let's check if everything is installed. Use the following command to load zips.json data set into mongod instance: .. code-block:: none $ mongoimport --drop -d test -c zipcodes zips.json Let's use the MongoDB shell to verify that everything was imported successfully. .. code-block:: none $ mongo test connecting to: test > db.zipcodes.count() 29467 > db.zipcodes.findOne() { "_id" : "35004", "city" : "ACMAR", "loc" : [ -86.51557, 33.584132 ], "pop" : 6055, "state" : "AL" } Aggregations using the Zip Codes Data Set ----------------------------------------- Each document in this collection has the following form: .. code-block:: json { "_id" : "35004", "city" : "Acmar", "state" : "AL", "pop" : 6055, "loc" : [-86.51557, 33.584132] } In these documents: * The ``_id`` field holds the zipcode as a string. * The ``city`` field holds the city name. * The ``state`` field holds the two letter state abbreviation. * The ``pop`` field holds the population. * The ``loc`` field holds the location as a ``[latitude, longitude]`` array. States with Populations Over 10 Million --------------------------------------- To get all states with a population greater than 10 million, use the following aggregation pipeline: .. literalinclude:: ../examples/aggregation/aggregation1.c :language: c :caption: aggregation1.c You should see a result like the following: .. code-block:: json { "_id" : "PA", "total_pop" : 11881643 } { "_id" : "OH", "total_pop" : 10847115 } { "_id" : "NY", "total_pop" : 17990455 } { "_id" : "FL", "total_pop" : 12937284 } { "_id" : "TX", "total_pop" : 16986510 } { "_id" : "IL", "total_pop" : 11430472 } { "_id" : "CA", "total_pop" : 29760021 } The above aggregation pipeline is build from two pipeline operators: ``$group`` and ``$match``. The ``$group`` pipeline operator requires _id field where we specify grouping; remaining fields specify how to generate composite value and must use one of the group aggregation functions: ``$addToSet``, ``$first``, ``$last``, ``$max``, ``$min``, ``$avg``, ``$push``, ``$sum``. The ``$match`` pipeline operator syntax is the same as the read operation query syntax. The ``$group`` process reads all documents and for each state it creates a separate document, for example: .. code-block:: json { "_id" : "WA", "total_pop" : 4866692 } The ``total_pop`` field uses the $sum aggregation function to sum the values of all pop fields in the source documents. Documents created by ``$group`` are piped to the ``$match`` pipeline operator. It returns the documents with the value of ``total_pop`` field greater than or equal to 10 million. Average City Population by State -------------------------------- To get the first three states with the greatest average population per city, use the following aggregation: .. code-block:: c pipeline = BCON_NEW ("pipeline", "[", "{", "$group", "{", "_id", "{", "state", "$state", "city", "$city", "}", "pop", "{", "$sum", "$pop", "}", "}", "}", "{", "$group", "{", "_id", "$_id.state", "avg_city_pop", "{", "$avg", "$pop", "}", "}", "}", "{", "$sort", "{", "avg_city_pop", BCON_INT32 (-1), "}", "}", "{", "$limit", BCON_INT32 (3) "}", "]"); This aggregate pipeline produces: .. code-block:: json { "_id" : "DC", "avg_city_pop" : 303450.0 } { "_id" : "FL", "avg_city_pop" : 27942.29805615551 } { "_id" : "CA", "avg_city_pop" : 27735.341099720412 } The above aggregation pipeline is build from three pipeline operators: ``$group``, ``$sort`` and ``$limit``. The first ``$group`` operator creates the following documents: .. code-block:: json { "_id" : { "state" : "WY", "city" : "Smoot" }, "pop" : 414 } Note, that the ``$group`` operator can't use nested documents except the ``_id`` field. The second ``$group`` uses these documents to create the following documents: .. code-block:: json { "_id" : "FL", "avg_city_pop" : 27942.29805615551 } These documents are sorted by the ``avg_city_pop`` field in descending order. Finally, the ``$limit`` pipeline operator returns the first 3 documents from the sorted set. mongo-c-driver-1.26.0/src/libmongoc/doc/api.rst000066400000000000000000000031031456567454500212620ustar00rootroot00000000000000API Reference ============= .. toctree:: :titlesonly: :maxdepth: 1 init-cleanup logging errors lifecycle gridfs mongoc_auto_encryption_opts_t mongoc_bulk_operation_t mongoc_change_stream_t mongoc_client_encryption_t mongoc_client_encryption_datakey_opts_t mongoc_client_encryption_rewrap_many_datakey_result_t mongoc_client_encryption_encrypt_opts_t mongoc_client_encryption_encrypt_range_opts_t mongoc_client_encryption_opts_t mongoc_client_pool_t mongoc_client_session_t mongoc_client_session_with_transaction_cb_t mongoc_client_t mongoc_collection_t mongoc_cursor_t mongoc_database_t mongoc_delete_flags_t mongoc_find_and_modify_opts_t mongoc_gridfs_file_list_t mongoc_gridfs_file_opt_t mongoc_gridfs_file_t mongoc_gridfs_bucket_t mongoc_gridfs_t mongoc_host_list_t mongoc_index_opt_geo_t mongoc_index_opt_t mongoc_index_opt_wt_t mongoc_insert_flags_t mongoc_iovec_t mongoc_optional_t mongoc_query_flags_t mongoc_rand mongoc_read_concern_t mongoc_read_mode_t mongoc_read_prefs_t mongoc_remove_flags_t mongoc_reply_flags_t mongoc_server_api_t mongoc_server_api_version_t mongoc_server_description_t mongoc_session_opt_t mongoc_socket_t mongoc_ssl_opt_t mongoc_stream_buffered_t mongoc_stream_file_t mongoc_stream_socket_t mongoc_stream_t mongoc_stream_tls_t mongoc_topology_description_t mongoc_transaction_opt_t mongoc_transaction_state_t mongoc_update_flags_t mongoc_uri_t mongoc_version mongoc_write_concern_t mongo-c-driver-1.26.0/src/libmongoc/doc/application-performance-monitoring.rst000066400000000000000000000117511456567454500275060ustar00rootroot00000000000000:man_page: mongoc_application_performance_monitoring Application Performance Monitoring (APM) ======================================== The MongoDB C Driver allows you to monitor all the MongoDB operations the driver executes. This event-notification system conforms to two MongoDB driver specs: * `Command Logging and Monitoring `_: events related to all application operations. * `SDAM Monitoring `_: events related to the driver's Server Discovery And Monitoring logic. To receive notifications, create a ``mongoc_apm_callbacks_t`` with :symbol:`mongoc_apm_callbacks_new`, set callbacks on it, then pass it to :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. Command-Monitoring Example -------------------------- .. literalinclude:: ../examples/example-command-monitoring.c :language: c :caption: example-command-monitoring.c This example program prints: .. code-block:: none Command drop started on 127.0.0.1: { "drop" : "test" } Command drop succeeded: { "ns" : "test.test", "nIndexesWas" : 1, "ok" : 1.0 } Command insert started on 127.0.0.1: { "insert" : "test", "ordered" : true, "documents" : [ { "_id" : 0 }, { "_id" : 1 } ] } Command insert succeeded: { "n" : 2, "ok" : 1.0 } Command insert started on 127.0.0.1: { "insert" : "test", "ordered" : true, "documents" : [ { "_id" : 0 } ] } Command insert succeeded: { "n" : 0, "writeErrors" : [ { "index" : 0, "code" : 11000, "errmsg" : "duplicate key" } ], "ok" : 1.0 } started: 3 succeeded: 3 failed: 0 The output has been edited and formatted for clarity. Depending on your server configuration, messages may include metadata like database name, logical session ids, or cluster times that are not shown here. The final "insert" command is considered successful, despite the writeError, because the server replied to the overall command with ``"ok": 1``. SDAM Monitoring Example ----------------------- .. literalinclude:: ../examples/example-sdam-monitoring.c :language: c :caption: example-sdam-monitoring.c Start a 3-node replica set on localhost with set name "rs" and start the program: .. code-block:: none ./example-sdam-monitoring "mongodb://localhost:27017,localhost:27018/?replicaSet=rs" This example program prints something like: .. code-block:: none topology opening topology changed: Unknown -> ReplicaSetNoPrimary secondary UNAVAILABLE primary UNAVAILABLE server opening: localhost:27017 server opening: localhost:27018 localhost:27017 heartbeat started localhost:27018 heartbeat started localhost:27017 heartbeat succeeded: { ... reply ... } server changed: localhost:27017 Unknown -> RSPrimary server opening: localhost:27019 topology changed: ReplicaSetNoPrimary -> ReplicaSetWithPrimary new servers: RSPrimary localhost:27017 secondary UNAVAILABLE primary AVAILABLE localhost:27019 heartbeat started localhost:27018 heartbeat succeeded: { ... reply ... } server changed: localhost:27018 Unknown -> RSSecondary topology changed: ReplicaSetWithPrimary -> ReplicaSetWithPrimary previous servers: RSPrimary localhost:27017 new servers: RSPrimary localhost:27017 RSSecondary localhost:27018 secondary AVAILABLE primary AVAILABLE localhost:27019 heartbeat succeeded: { ... reply ... } server changed: localhost:27019 Unknown -> RSSecondary topology changed: ReplicaSetWithPrimary -> ReplicaSetWithPrimary previous servers: RSPrimary localhost:27017 RSSecondary localhost:27018 new servers: RSPrimary localhost:27017 RSSecondary localhost:27018 RSSecondary localhost:27019 secondary AVAILABLE primary AVAILABLE topology closed Events: server changed: 3 server opening: 3 server closed: 0 topology changed: 4 topology opening: 1 topology closed: 1 heartbeat started: 3 heartbeat succeeded: 3 heartbeat failed: 0 The driver connects to the mongods on ports 27017 and 27018, which were specified in the URI, and determines which is primary. It also discovers the third member, "localhost:27019", and adds it to the topology. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_callbacks_t mongoc_apm_command_failed_t mongoc_apm_command_started_t mongoc_apm_command_succeeded_t mongoc_apm_server_changed_t mongoc_apm_server_closed_t mongoc_apm_server_heartbeat_failed_t mongoc_apm_server_heartbeat_started_t mongoc_apm_server_heartbeat_succeeded_t mongoc_apm_server_opening_t mongoc_apm_topology_changed_t mongoc_apm_topology_closed_t mongoc_apm_topology_opening_t mongo-c-driver-1.26.0/src/libmongoc/doc/authentication.rst000066400000000000000000000252041456567454500235360ustar00rootroot00000000000000:man_page: mongoc_authentication Authentication ============== This guide covers the use of authentication options with the MongoDB C Driver. Ensure that the MongoDB server is also properly configured for authentication before making a connection. For more information, see the `MongoDB security documentation `_. The MongoDB C driver supports several authentication mechanisms through the use of MongoDB connection URIs. By default, if a username and password are provided as part of the connection string (and an optional authentication database), they are used to connect via the default authentication mechanism of the server. To select a specific authentication mechanism other than the default, see the list of supported mechanism below. .. code-block:: none mongoc_client_t *client = mongoc_client_new ("mongodb://user:password@localhost/?authSource=mydb"); Currently supported values for the authMechanism connection string option are: * :ref:`SCRAM-SHA-1 ` * :ref:`MONGODB-CR (deprecated) ` * :ref:`GSSAPI ` * :ref:`PLAIN ` * :ref:`X509 ` * :ref:`MONGODB-AWS ` .. _authentication_scram_sha_256: Basic Authentication (SCRAM-SHA-256) ------------------------------------ MongoDB 4.0 introduces support for authenticating using the SCRAM protocol with the more secure SHA-256 hash described in `RFC 7677 `_. Using this authentication mechanism means that the password is never actually sent over the wire when authenticating, but rather a computed proof that the client password is the same as the password the server knows. In MongoDB 4.0, the C driver can determine the correct default authentication mechanism for users with stored SCRAM-SHA-1 and SCRAM-SHA-256 credentials: .. code-block:: none mongoc_client_t *client = mongoc_client_new ("mongodb://user:password@localhost/?authSource=mydb"); /* the correct authMechanism is negotiated between the driver and server. */ Alternatively, SCRAM-SHA-256 can be explicitly specified as an authMechanism. .. code-block:: none mongoc_client_t *client = mongoc_client_new ("mongodb://user:password@localhost/?authMechanism=SCRAM-SHA-256&authSource=mydb"); .. _authentication_scram_sha_1: Basic Authentication (SCRAM-SHA-1) ---------------------------------- The default authentication mechanism before MongoDB 4.0 is ``SCRAM-SHA-1`` (`RFC 5802 `_). Using this authentication mechanism means that the password is never actually sent over the wire when authenticating, but rather a computed proof that the client password is the same as the password the server knows. .. code-block:: none mongoc_client_t *client = mongoc_client_new ("mongodb://user:password@localhost/?authMechanism=SCRAM-SHA-1&authSource=mydb"); .. note:: ``SCRAM-SHA-1`` authenticates against the ``admin`` database by default. If the user is created in another database, then specifying the authSource is required. .. _authentication_mongodbcr: Legacy Authentication (MONGODB-CR) ---------------------------------- The MONGODB-CR authMechanism is deprecated and will no longer function in MongoDB 4.0. Instead, specify no authMechanism and the driver will use an authentication mechanism compatible with your server. .. _authentication_kerberos: GSSAPI (Kerberos) Authentication -------------------------------- .. note:: On UNIX-like environments, Kerberos support requires compiling the driver against ``cyrus-sasl``. On Windows, Kerberos support requires compiling the driver against Windows Native SSPI or ``cyrus-sasl``. The default configuration of the driver will use Windows Native SSPI. To modify the default configuration, use the cmake option ``ENABLE_SASL``. ``GSSAPI`` (Kerberos) authentication is available in the Enterprise Edition of MongoDB. To authenticate using ``GSSAPI``, the MongoDB C driver must be installed with SASL support. On UNIX-like environments, run the ``kinit`` command before using the following authentication methods: .. code-block:: none $ kinit mongodbuser@EXAMPLE.COM mongodbuser@EXAMPLE.COM's Password: $ klistCredentials cache: FILE:/tmp/krb5cc_1000 Principal: mongodbuser@EXAMPLE.COM Issued Expires Principal Feb 9 13:48:51 2013 Feb 9 23:48:51 2013 krbtgt/EXAMPLE.COM@EXAMPLE.COM Now authenticate using the MongoDB URI. ``GSSAPI`` authenticates against the ``$external`` virtual database, so a database does not need to be specified in the URI. Note that the Kerberos principal *must* be URL-encoded: .. code-block:: none mongoc_client_t *client; client = mongoc_client_new ("mongodb://mongodbuser%40EXAMPLE.COM@mongo-server.example.com/?authMechanism=GSSAPI"); .. note:: ``GSSAPI`` authenticates against the ``$external`` database, so specifying the authSource database is not required. The driver supports these GSSAPI properties: * ``CANONICALIZE_HOST_NAME``: This might be required with Cyrus-SASL when the hosts report different hostnames than what is used in the Kerberos database. The default is "false". * ``SERVICE_NAME``: Use a different service name than the default, "mongodb". Set properties in the URL: .. code-block:: none mongoc_client_t *client; client = mongoc_client_new ("mongodb://mongodbuser%40EXAMPLE.COM@mongo-server.example.com/?authMechanism=GSSAPI&" "authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:true"); If you encounter errors such as ``Invalid net address``, check if the application is behind a NAT (Network Address Translation) firewall. If so, create a ticket that uses ``forwardable`` and ``addressless`` Kerberos tickets. This can be done by passing ``-f -A`` to ``kinit``. .. code-block:: none $ kinit -f -A mongodbuser@EXAMPLE.COM .. _authentication_plain: SASL Plain Authentication ------------------------- .. note:: The MongoDB C Driver must be compiled with SASL support in order to use ``SASL PLAIN`` authentication. MongoDB Enterprise Edition supports the ``SASL PLAIN`` authentication mechanism, initially intended for delegating authentication to an LDAP server. Using the ``SASL PLAIN`` mechanism is very similar to the challenge response mechanism with usernames and passwords. This authentication mechanism uses the ``$external`` virtual database for ``LDAP`` support: .. note:: ``SASL PLAIN`` is a clear-text authentication mechanism. It is strongly recommended to connect to MongoDB using TLS with certificate validation when using the ``PLAIN`` mechanism. .. code-block:: none mongoc_client_t *client; client = mongoc_client_new ("mongodb://user:password@example.com/?authMechanism=PLAIN"); ``PLAIN`` authenticates against the ``$external`` database, so specifying the authSource database is not required. .. _authentication_x509: X.509 Certificate Authentication -------------------------------- .. note:: The MongoDB C Driver must be compiled with TLS support for X.509 authentication support. Once this is done, start a server with the following options: .. code-block:: none $ mongod --tlsMode requireTLS --tlsCertificateKeyFile server.pem --tlsCAFile ca.pem The ``MONGODB-X509`` mechanism authenticates a username derived from the distinguished subject name of the X.509 certificate presented by the driver during TLS negotiation. This authentication method requires the use of TLS connections with certificate validation. .. code-block:: none mongoc_client_t *client; mongoc_ssl_opt_t ssl_opts = { 0 }; ssl_opts.pem_file = "mycert.pem"; ssl_opts.pem_pwd = "mycertpassword"; ssl_opts.ca_file = "myca.pem"; ssl_opts.ca_dir = "trust_dir"; ssl_opts.weak_cert_validation = false; client = mongoc_client_new ("mongodb://x509_derived_username@localhost/?authMechanism=MONGODB-X509"); mongoc_client_set_ssl_opts (client, &ssl_opts); ``MONGODB-X509`` authenticates against the ``$external`` database, so specifying the authSource database is not required. For more information on the x509_derived_username, see the MongoDB server `x.509 tutorial `_. .. note:: The MongoDB C Driver will attempt to determine the x509 derived username when none is provided, and as of MongoDB 3.4 providing the username is not required at all. .. _authentication_aws: Authentication via AWS IAM -------------------------- The ``MONGODB-AWS`` mechanism authenticates to MongoDB servers with credentials provided by AWS Identity and Access Management (IAM). To authenticate, create a user with an associated Amazon Resource Name (ARN) on the ``$external`` database, and specify the ``MONGODB-AWS`` ``authMechanism`` in the URI. .. code-block:: c mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost/?authMechanism=MONGODB-AWS"); Since ``MONGODB-AWS`` always authenticates against the ``$external`` database, so specifying the authSource database is not required. Credentials include the ``access key id``, ``secret access key``, and optional ``session token``. They may be obtained from the following ways. AWS credentials via URI ``````````````````````` Credentials may be passed directly in the URI as username/password. .. code-block:: c mongoc_uri_t *uri = mongoc_uri_new ("mongodb://:localhost/?authMechanism=MONGODB-AWS"); This may include a ``session token`` passed with ``authMechanismProperties``. .. code-block:: c mongoc_uri_t *uri = mongoc_uri_new ("mongodb://:localhost/?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:"); AWS credentials via environment ``````````````````````````````` If credentials are not passed through the URI, libmongoc will check for the following environment variables. - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN (optional) AWS Credentials via ECS ``````````````````````` If credentials are not passed in the URI or with environment variables, libmongoc will check if the environment variable ``AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`` is set, and if so, attempt to retrieve temporary credentials from the ECS task metadata by querying a link local address. AWS Credentials via EC2 ``````````````````````` If credentials are not passed in the URI or with environment variables, and the environment variable ``AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`` is not set, libmongoc will attempt to retrieve temporary credentials from the EC2 machine metadata by querying link local addresses. .. only:: html .. include:: includes/seealso/authmechanism.txt mongo-c-driver-1.26.0/src/libmongoc/doc/basic-troubleshooting.rst000066400000000000000000000143111456567454500250220ustar00rootroot00000000000000:man_page: mongoc_basic_troubleshooting Basic Troubleshooting ===================== Troubleshooting Checklist ------------------------- The following is a short list of things to check when you have a problem. * Did you call ``mongoc_init()`` in ``main()``? If not, you will likely see a segfault. * Have you leaked any clients or cursors as can be found with ``mongoc-stat ``? * Have packets been delivered to the server? See egress bytes from ``mongoc-stat ``. * Does ``ASAN`` show any leaks? Ensure you call ``mongoc_cleanup()`` at the end of your process to cleanup lingering allocations from the MongoDB C driver. * If compiling your own copy of MongoDB C Driver, consider using the cmake option ``-DENABLE_TRACING=ON`` to enable function tracing and hex dumps of network packets to ``STDERR`` and ``STDOUT``. Performance Counters -------------------- The MongoDB C Driver comes with an optional and unique feature to help developers and sysadmins troubleshoot problems in production. Performance counters are available for each process using the C Driver. If available, the counters can be accessed outside of the application process via a shared memory segment. The counters may be used graph statistics about your application process easily from tools like Munin or Nagios. For example, the command ``watch --interval=0.5 -d mongoc-stat $PID`` may be used to monitor an application. Performance counters are only available on Linux platforms and macOS arm64 platforms that support shared memory segments. On supported platforms, they are enabled by default. Applications can be built without the counters by specifying the cmake option ``-DENABLE_SHM_COUNTERS=OFF``. Additionally, if performance counters are already compiled, they can be disabled at runtime by specifying the environment variable ``MONGOC_DISABLE_SHM``. Performance counters keep track of the following: * Active and Disposed Cursors * Active and Disposed Clients, Client Pools, and Socket Streams. * Number of operations sent and received, by type. * Bytes transferred and received. * Authentication successes and failures. * Number of wire protocol errors. .. note:: An operation is considered "sent" when one or more bytes of the corresponding message is written to the stream, regardless of whether the entire message is successfully written or if the operation ultimately succeeds or fails. This does not include bytes that may be written during the stream connection process, such as TLS handshake messages. To access counters for a given process, simply provide the process id to the ``mongoc-stat`` program installed with the MongoDB C Driver. .. code-block:: none $ mongoc-stat 22203 Operations : Egress Total : The number of sent operations. : 13247 Operations : Ingress Total : The number of received operations. : 13246 Operations : Egress Queries : The number of sent Query operations. : 13247 Operations : Ingress Queries : The number of received Query operations. : 0 Operations : Egress GetMore : The number of sent GetMore operations. : 0 Operations : Ingress GetMore : The number of received GetMore operations. : 0 Operations : Egress Insert : The number of sent Insert operations. : 0 Operations : Ingress Insert : The number of received Insert operations. : 0 Operations : Egress Delete : The number of sent Delete operations. : 0 Operations : Ingress Delete : The number of received Delete operations. : 0 Operations : Egress Update : The number of sent Update operations. : 0 Operations : Ingress Update : The number of received Update operations. : 0 Operations : Egress KillCursors : The number of sent KillCursors operations. : 0 Operations : Ingress KillCursors : The number of received KillCursors operations. : 0 Operations : Egress Msg : The number of sent Msg operations. : 0 Operations : Ingress Msg : The number of received Msg operations. : 0 Operations : Egress Reply : The number of sent Reply operations. : 0 Operations : Ingress Reply : The number of received Reply operations. : 13246 Cursors : Active : The number of active cursors. : 1 Cursors : Disposed : The number of disposed cursors. : 13246 Clients : Active : The number of active clients. : 1 Clients : Disposed : The number of disposed clients. : 0 Streams : Active : The number of active streams. : 1 Streams : Disposed : The number of disposed streams. : 0 Streams : Egress Bytes : The number of bytes sent. : 794931 Streams : Ingress Bytes : The number of bytes received. : 589694 Streams : N Socket Timeouts : The number of socket timeouts. : 0 Client Pools : Active : The number of active client pools. : 1 Client Pools : Disposed : The number of disposed client pools. : 0 Protocol : Ingress Errors : The number of protocol errors on ingress. : 0 Auth : Failures : The number of failed authentication requests. : 0 Auth : Success : The number of successful authentication requests. : 0 .. _basic-troubleshooting_file_bug: Submitting a Bug Report ----------------------- Think you've found a bug? Want to see a new feature in the MongoDB C driver? Please open a case in our issue management tool, JIRA: * `Create an account and login `_. * Navigate to `the CDRIVER project `_. * Click *Create Issue* - Please provide as much information as possible about the issue type and how to reproduce it. Bug reports in JIRA for all driver projects (i.e. CDRIVER, CSHARP, JAVA) and the Core Server (i.e. SERVER) project are *public*. mongo-c-driver-1.26.0/src/libmongoc/doc/bulk.rst000066400000000000000000000150011456567454500214460ustar00rootroot00000000000000:man_page: mongoc_bulk Bulk Write Operations ===================== This tutorial explains how to take advantage of MongoDB C driver bulk write operation features. Executing write operations in batches reduces the number of network round trips, increasing write throughput. Bulk Insert ----------- First we need to fetch a bulk operation handle from the :symbol:`mongoc_collection_t`. .. code-block:: c mongoc_bulk_operation_t *bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); We can now start inserting documents to the bulk operation. These will be buffered until we execute the operation. The bulk operation will coalesce insertions as a single batch for each consecutive call to :symbol:`mongoc_bulk_operation_insert()`. This creates a pipelined effect when possible. To execute the bulk operation and receive the result we call :symbol:`mongoc_bulk_operation_execute()`. .. literalinclude:: ../examples/bulk/bulk1.c :language: c :caption: bulk1.c Example ``reply`` document: .. code-block:: none {"nInserted" : 10000, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "nUpserted" : 0, "writeErrors" : [] "writeConcernErrors" : [] } Mixed Bulk Write Operations --------------------------- MongoDB C driver also supports executing mixed bulk write operations. A batch of insert, update, and remove operations can be executed together using the bulk write operations API. Ordered Bulk Write Operations ----------------------------- Ordered bulk write operations are batched and sent to the server in the order provided for serial execution. The ``reply`` document describes the type and count of operations performed. .. literalinclude:: ../examples/bulk/bulk2.c :language: c :caption: bulk2.c Example ``reply`` document: .. code-block:: none { "nInserted" : 3, "nMatched" : 2, "nModified" : 2, "nRemoved" : 10000, "nUpserted" : 1, "upserted" : [{"index" : 5, "_id" : 4}], "writeErrors" : [] "writeConcernErrors" : [] } The ``index`` field in the ``upserted`` array is the 0-based index of the upsert operation; in this example, the sixth operation of the overall bulk operation was an upsert, so its index is 5. Unordered Bulk Write Operations ------------------------------- Unordered bulk write operations are batched and sent to the server in *arbitrary order* where they may be executed in parallel. Any errors that occur are reported after all operations are attempted. In the next example the first and third operations fail due to the unique constraint on ``_id``. Since we are doing unordered execution the second and fourth operations succeed. .. literalinclude:: ../examples/bulk/bulk3.c :language: c :caption: bulk3.c Example ``reply`` document: .. code-block:: none { "nInserted" : 0, "nMatched" : 1, "nModified" : 1, "nRemoved" : 1, "nUpserted" : 0, "writeErrors" : [ { "index" : 0, "code" : 11000, "errmsg" : "E11000 duplicate key error index: test.test.$_id_ dup key: { : 1 }" }, { "index" : 2, "code" : 11000, "errmsg" : "E11000 duplicate key error index: test.test.$_id_ dup key: { : 3 }" } ], "writeConcernErrors" : [] } Error: E11000 duplicate key error index: test.test.$_id_ dup key: { : 1 } The :symbol:`bson_error_t ` domain is ``MONGOC_ERROR_COMMAND`` and its code is 11000. .. _bulk_operation_bypassing_document_validation: Bulk Operation Bypassing Document Validation -------------------------------------------- This feature is only available when using MongoDB 3.2 and later. By default bulk operations are validated against the schema, if any is defined. In certain cases however it may be necessary to bypass the document validation. .. literalinclude:: ../examples/bulk/bulk5.c :language: c :caption: bulk5.c Running the above example will result in: .. code-block:: none { "nInserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "nUpserted" : 0, "writeErrors" : [ { "index" : 0, "code" : 121, "errmsg" : "Document failed validation" } ] } Error: Document failed validation { "nInserted" : 2, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "nUpserted" : 0, "writeErrors" : [] } The :symbol:`bson_error_t ` domain is ``MONGOC_ERROR_COMMAND``. Bulk Operation Write Concerns ----------------------------- By default bulk operations are executed with the :symbol:`write_concern ` of the collection they are executed against. A custom write concern can be passed to the :symbol:`mongoc_collection_create_bulk_operation_with_opts()` method. Write concern errors (e.g. wtimeout) will be reported after all operations are attempted, regardless of execution order. .. literalinclude:: ../examples/bulk/bulk4.c :language: c :caption: bulk4.c Example ``reply`` document and error message: .. code-block:: none { "nInserted" : 2, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "nUpserted" : 0, "writeErrors" : [], "writeConcernErrors" : [ { "code" : 64, "errmsg" : "waiting for replication timed out" } ] } Error: waiting for replication timed out The :symbol:`bson_error_t ` domain is ``MONGOC_ERROR_WRITE_CONCERN`` if there are write concern errors and no write errors. Write errors indicate failed operations, so they take precedence over write concern errors, which mean merely that the write concern is not satisfied *yet*. .. _setting_collation_order: Setting Collation Order ----------------------- This feature is only available when using MongoDB 3.4 and later. .. literalinclude:: ../examples/bulk/bulk-collation.c :language: c :caption: bulk-collation.c Running the above example will result in: .. code-block:: none { "nInserted" : 2, "nMatched" : 1, "nModified" : 1, "nRemoved" : 0, "nUpserted" : 0, "writeErrors" : [ ] } Unacknowledged Bulk Writes -------------------------- Set "w" to zero for an unacknowledged write. The driver sends unacknowledged writes using the legacy opcodes ``OP_INSERT``, ``OP_UPDATE``, and ``OP_DELETE``. .. literalinclude:: ../examples/bulk/bulk6.c :language: c :caption: bulk6.c The ``reply`` document is empty: .. code-block:: none { } Further Reading --------------- See the `Driver Bulk API Spec `_, which describes bulk write operations for all MongoDB drivers. mongo-c-driver-1.26.0/src/libmongoc/doc/client-side-field-level-encryption.rst000066400000000000000000000077341456567454500273050ustar00rootroot00000000000000Client-Side Field Level Encryption ================================== New in MongoDB 4.2, Client-Side Field Level Encryption (also referred to as CSFLE) allows administrators and developers to encrypt specific data fields in addition to other MongoDB encryption features. With CSFLE, developers can encrypt fields client side without any server-side configuration or directives. CSFLE supports workloads where applications must guarantee that unauthorized parties, including server administrators, cannot read the encrypted data. Automatic encryption, where sensitive fields in commands are encrypted automatically, requires an Enterprise-only dependency for Query Analysis. See :doc:`In-Use Encryption ` for more information. .. seealso:: | The MongoDB Manual for `Client-Side Field Level Encryption `_ Automatic Client-Side Field Level Encryption -------------------------------------------- Automatic encryption is enabled by calling :symbol:`mongoc_client_enable_auto_encryption()` on a :symbol:`mongoc_client_t`. The following examples show how to set up automatic encryption using :symbol:`mongoc_client_encryption_t` to create a new encryption data key. .. note:: Automatic encryption requires MongoDB 4.2 enterprise or a MongoDB 4.2 Atlas cluster. The community version of the server supports automatic decryption as well as :ref:`explicit-client-side-encryption`. Providing Local Automatic Encryption Rules `````````````````````````````````````````` The following example shows how to specify automatic encryption rules using a schema map set with :symbol:`mongoc_auto_encryption_opts_set_schema_map()`. The automatic encryption rules are expressed using a strict subset of the JSON Schema syntax. Supplying a schema map provides more security than relying on JSON Schemas obtained from the server. It protects against a malicious server advertising a false JSON Schema, which could trick the client into sending unencrypted data that should be encrypted. JSON Schemas supplied in the schema map only apply to configuring automatic encryption. Other validation rules in the JSON schema will not be enforced by the driver and will result in an error: .. literalinclude:: ../examples/client-side-encryption-schema-map.c :caption: client-side-encryption-schema-map.c :language: c Server-Side Field Level Encryption Enforcement `````````````````````````````````````````````` The MongoDB 4.2 server supports using schema validation to enforce encryption of specific fields in a collection. This schema validation will prevent an application from inserting unencrypted values for any fields marked with the "encrypt" JSON schema keyword. The following example shows how to set up automatic encryption using :symbol:`mongoc_client_encryption_t` to create a new encryption data key and create a collection with the necessary JSON Schema: .. literalinclude:: ../examples/client-side-encryption-server-schema.c :caption: client-side-encryption-server-schema.c :language: c .. _explicit-client-side-encryption: Explicit Encryption ``````````````````` Explicit encryption is a MongoDB community feature and does not use :ref:`query_analysis` (``mongocryptd`` or ``crypt_shared``). Explicit encryption is provided by the :symbol:`mongoc_client_encryption_t` class, for example: .. literalinclude:: ../examples/client-side-encryption-explicit.c :caption: client-side-encryption-explicit.c :language: c Explicit Encryption with Automatic Decryption ````````````````````````````````````````````` Although automatic encryption requires MongoDB 4.2 enterprise or a MongoDB 4.2 Atlas cluster, automatic decryption is supported for all users. To configure automatic decryption without automatic encryption set bypass_auto_encryption=True in :symbol:`mongoc_auto_encryption_opts_t`: .. literalinclude:: ../examples/client-side-encryption-auto-decryption.c :caption: client-side-encryption-auto-decryption.c :language: c mongo-c-driver-1.26.0/src/libmongoc/doc/cmakerefdomain.py000066400000000000000000000026061456567454500233050ustar00rootroot00000000000000""" This is a miniature Sphinx extension that is only used to permit resolution of external references to the CMake Sphinx documentation. It defines no additional directives or object types. This extension defines a "cmake" domain, which may conflict with a proper CMake domain plugin. If that is the case, this extention can likely be disabled and replaced by a more full-featured extension. """ from typing import Any, List from sphinx.application import Sphinx from sphinx.roles import XRefRole from sphinx.domains import Domain, ObjType kinds = [ "command", "cpack_gen", "envvar", "generator", "genex", "guide", "variable", "module", "policy", "prop_cache", "prop_dir", "prop_gbl", "prop_inst", "prop_sf", "prop_test", "prop_tgt", "manual", ] class CMakeRefDomain(Domain): name = "cmake" label = "CMake (Minimal)" object_types = {k: ObjType(k, k) for k in kinds} roles = {k: XRefRole() for k in kinds} roles["command"] = XRefRole(fix_parens=True) directives = {} initial_data: Any = {} def merge_domaindata(self, docnames: List[str], otherdata: Any) -> None: # We have nothing to do, but this is required for parallel execution return def setup(app: Sphinx): app.add_domain(CMakeRefDomain) return { "parallel_read_safe": True, "parallel_write_safe": True, } mongo-c-driver-1.26.0/src/libmongoc/doc/conf.py000066400000000000000000000206001456567454500212570ustar00rootroot00000000000000# -*- coding: utf-8 -*- import http.client import os.path import sys import urllib.request from pathlib import Path from typing import Any, Dict try: from sphinx.builders.dirhtml import DirectoryHTMLBuilder except ImportError: # Try importing from older Sphinx version path. from sphinx.builders.html import DirectoryHTMLBuilder from docutils.parsers.rst import directives, Directive from sphinx.application import Sphinx from sphinx.application import logger as sphinx_log from sphinx.config import Config has_sphinx_design = False try: # Try to import sphinx-design to include directives for HTML pages (e.g. tabs and dropdowns). # sphinx-design is not required for building man pages. # python-sphinx-design is not currently available on EPEL. The package for EPEL includes man pages. from sphinx_design.dropdown import DropdownDirective has_sphinx_design = True except ImportError: pass # Ensure we can import "mongoc" extension module. this_path = os.path.dirname(__file__) sys.path.append(this_path) sys.path.append(os.path.normpath(os.path.join(this_path, "../../../build/sphinx"))) from mongoc_common import * extensions = [ "mongoc", "sphinx.ext.intersphinx", # NOTE: We use our own "minimal" CMake domain that lets us refer to external # objects from the CMake inventory, but provides no other features. The # build *could* otherwise use sphinxcontrib-moderncmakedomain, which is # more full-featured, but it is not (currently) available in repositories for # package building. # "sphinxcontrib.moderncmakedomain", "cmakerefdomain", "sphinx.ext.mathjax", ] if has_sphinx_design: extensions.append("sphinx_design") # General information about the project. project = "libmongoc" copyright = "2017-present, MongoDB, Inc" author = "MongoDB, Inc" version_path = os.path.join(os.path.dirname(__file__), "../../..", "VERSION_CURRENT") version = open(version_path).read().strip() # The extension requires the "base" to contain '%s' exactly once, but we never intend to use it though language = "en" exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] master_doc = "index" html_static_path = ["static"] # Set an empty list of disabled reftypes. # Sphinx 5.0 disables "std:doc" by default. # Many documentation references use :doc: intersphinx_disabled_reftypes = [] # Give the peer 30sec to give us the inventory: intersphinx_timeout = 30 intersphinx_mapping = { "sphinx": ("https://www.sphinx-doc.org/en/master", "includes/sphinx.inv"), "python": ("https://docs.python.org/3", "includes/python.inv"), "bson": ("https://www.mongoc.org/libbson/current", "includes/libbson.inv"), "cmake": ("https://cmake.org/cmake/help/latest", "includes/cmake.inv"), } _UPDATE_KEY = "update_external_inventories" def _maybe_update_inventories(app: Sphinx): """ We save Sphinx inventories for external projects saved within our own project so that we can support fully-offline builds. This is a convenience function to update those inventories automatically. This function will only have an effect if the appropriate command-line config value is defined. """ prefix = "[libmongoc/doc/conf.py]" config = app.config if not config[_UPDATE_KEY]: sphinx_log.info( "%s Using existing intersphinx inventories. Refresh by running with ‘-D %s=1’", prefix, _UPDATE_KEY, ) return for name, tup in intersphinx_mapping.items(): urlbase, filename = tup url = f"{urlbase}/objects.inv" sphinx_log.info("%s Downloading external inventory for %s from [%s]", prefix, name, url) with urllib.request.urlopen(url) as req: req: http.client.HTTPResponse = req dest = Path(app.srcdir) / filename sphinx_log.info("%s Saving inventory [%s] to file [%s]", prefix, url, dest) with dest.open("wb") as out: buf = req.read(1024 * 4) while buf: out.write(buf) buf = req.read(1024 * 4) sphinx_log.info( "%s Inventory file [%s] was updated. Commit the result to save it for subsequent builds.", prefix, dest, ) # -- Options for HTML output ---------------------------------------------- html_theme = "furo" html_title = html_shorttitle = "libmongoc %s" % version # html_favicon = None html_use_index = True rst_prolog = rf""" .. |qenc:is-experimental| replace:: is part of the experimental :doc:`Queryable Encryption ` API and may be subject to breaking changes in future releases. .. |qenc:opt-is-experimental| replace:: This option |qenc:is-experimental| .. |qenc:api-is-experimental| replace:: This API |qenc:is-experimental| .. |qenc:range-is-experimental| replace:: Range algorithm is experimental only and not intended for public use. It is subject to breaking changes. .. _the findAndModify command: https://www.mongodb.com/docs/manual/reference/command/findAndModify/ .. |version| replace:: {version} .. |version.pre| replace:: ``{version}`` .. |vversion| replace:: ``v{version}`` .. role:: bash(code) :language: bash .. role:: batch(code) :language: batch .. role:: c(code) :language: c .. role:: cpp(code) :language: c++ .. role:: bolded-name(literal) :class: bolded-name .. |libbson| replace:: :bolded-name:`libbson` .. |libmongoc| replace:: :bolded-name:`libmongoc` .. |mongo-c-driver| replace:: :bolded-name:`mongo-c-driver` .. The CMake inventory mangles the names of its custom domain objects, for some reason? Offer these substitutions for simpler variable references: .. |cmvar:CMAKE_BUILD_TYPE| replace:: :cmake:variable:`CMAKE_BUILD_TYPE ` .. |cmvar:CMAKE_INSTALL_PREFIX| replace:: :cmake:variable:`CMAKE_INSTALL_PREFIX ` .. |cmvar:CMAKE_PREFIX_PATH| replace:: :cmake:variable:`CMAKE_PREFIX_PATH ` .. |cmcmd:find_package| replace:: :cmake:command:`find_package() ` .. |bson_t-storage-ptr| replace:: non-``NULL`` pointer to :doc:`overwritable storage ` for a :symbol:`bson_t` .. |bson_t-opt-storage-ptr| replace:: maybe-``NULL`` pointer to :doc:`overwritable storage ` for a :symbol:`bson_t` """ def add_canonical_link(app: Sphinx, pagename: str, templatename: str, context: Dict[str, Any], doctree: Any): link = f'' context["metatags"] = context.get("metatags", "") + link if has_sphinx_design: class AdDropdown(DropdownDirective): """A sphinx-design dropdown that can also be an admonition.""" option_spec = DropdownDirective.option_spec | {"admonition": directives.unchanged_required} def run(self): adm = self.options.get("admonition") if adm is not None: self.options.setdefault("class-container", []).extend(("admonition", adm)) self.options.setdefault("class-title", []).append(f"admonition-title") return super().run() else: class EmptyDirective(Directive): has_content = True def run(self): return [] has_add_css_file = True def check_html_builder_requirements (app): if isinstance(app.builder, DirectoryHTMLBuilder): if not has_sphinx_design: raise RuntimeError("The sphinx-design package is required to build HTML documentation but was not detected. Install sphinx-design.") if not has_add_css_file: raise RuntimeError("A newer version of Sphinx is required to build HTML documentation with CSS files. Upgrade Sphinx to v3.5.0 or newer") def setup(app: Sphinx): mongoc_common_setup(app) app.connect("builder-inited", check_html_builder_requirements) if has_sphinx_design: app.add_directive("ad-dropdown", AdDropdown) else: app.add_directive("ad-dropdown", EmptyDirective) app.add_directive("tab-set", EmptyDirective) app.connect("html-page-context", add_canonical_link) if hasattr(app, "add_css_file"): app.add_css_file("styles.css") else: global has_add_css_file has_add_css_file = False app.connect("builder-inited", _maybe_update_inventories) app.add_config_value(_UPDATE_KEY, default=False, rebuild=True, types=[bool]) mongo-c-driver-1.26.0/src/libmongoc/doc/configuring_tls.rst000066400000000000000000000224511456567454500237140ustar00rootroot00000000000000:man_page: mongoc_configuring_tls Configuring TLS =============== Configuration with URI options ------------------------------ Enable TLS by including ``tls=true`` in the URI. .. code:: c mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost:27017/"); mongoc_uri_set_option_as_bool (uri, MONGOC_URI_TLS, true); mongoc_client_t *client = mongoc_client_new_from_uri (uri); The following URI options may be used to further configure TLS: .. include:: includes/tls-options.txt Configuration with mongoc_ssl_opt_t ----------------------------------- Alternatively, the :symbol:`mongoc_ssl_opt_t` struct may be used to configure TLS with :symbol:`mongoc_client_set_ssl_opts()` or :symbol:`mongoc_client_pool_set_ssl_opts()`. Most of the configurable options can be set using the `Connection String URI `_. =============================== =============================== **mongoc_ssl_opt_t key** **URI key** =============================== =============================== pem_file tlsClientCertificateKeyFile pem_pwd tlsClientCertificateKeyPassword ca_file tlsCAFile weak_cert_validation tlsAllowInvalidCertificates allow_invalid_hostname tlsAllowInvalidHostnames =============================== =============================== The only exclusions are ``crl_file`` and ``ca_dir``. Those may only be set with :symbol:`mongoc_ssl_opt_t`. Client Authentication --------------------- When MongoDB is started with TLS enabled, it will by default require the client to provide a client certificate issued by a certificate authority specified by ``--tlsCAFile``, or an authority trusted by the native certificate store in use on the server. To provide the client certificate, set the ``tlsCertificateKeyFile`` in the URI to a PEM armored certificate file. .. code-block:: c mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost:27017/"); mongoc_uri_set_option_as_bool (uri, MONGOC_URI_TLS, true); mongoc_uri_set_option_as_utf8 (uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "/path/to/client-certificate.pem"); mongoc_client_t *client = mongoc_client_new_from_uri (uri); Server Certificate Verification ------------------------------- The MongoDB C Driver will automatically verify the validity of the server certificate, such as issued by configured Certificate Authority, hostname validation, and expiration. To overwrite this behavior, it is possible to disable hostname validation, OCSP endpoint revocation checking, revocation checking entirely, and allow invalid certificates. This behavior is controlled using the ``tlsAllowInvalidHostnames``, ``tlsDisableOCSPEndpointCheck``, ``tlsDisableCertificateRevocationCheck``, and ``tlsAllowInvalidCertificates`` options respectively. By default, all are set to ``false``. It is not recommended to change these defaults as it exposes the client to *Man In The Middle* attacks (when ``tlsAllowInvalidHostnames`` is set), invalid certificates (when ``tlsAllowInvalidCertificates`` is set), or potentially revoked certificates (when ``tlsDisableOCSPEndpointCheck`` or ``tlsDisableCertificateRevocationCheck`` are set). Supported Libraries ------------------- By default, libmongoc will attempt to find a supported TLS library and enable TLS support. This is controlled by the cmake flag ``ENABLE_SSL``, which is set to ``AUTO`` by default. Valid values are: - ``AUTO`` the default behavior. Link to the system's native TLS library, or attempt to find OpenSSL. - ``DARWIN`` link to Secure Transport, the native TLS library on macOS. - ``WINDOWS`` link to Secure Channel, the native TLS library on Windows. - ``OPENSSL`` link to OpenSSL (libssl). An optional install path may be specified with ``OPENSSL_ROOT``. - ``LIBRESSL`` link to LibreSSL's libtls. (LibreSSL's compatible libssl may be linked to by setting ``OPENSSL``). - ``OFF`` disable TLS support. OpenSSL ``````` The MongoDB C Driver uses OpenSSL, if available, on Linux and Unix platforms (besides macOS). Industry best practices and some regulations require the use of TLS 1.1 or newer, which requires at least OpenSSL 1.0.1. Check your OpenSSL version like so:: $ openssl version Ensure your system's OpenSSL is a recent version (at least 1.0.1), or install a recent version in a non-system path and build against it with:: cmake -DOPENSSL_ROOT_DIR=/absolute/path/to/openssl When compiled against OpenSSL, the driver will attempt to load the system default certificate store, as configured by the distribution. That can be overridden by setting the ``tlsCAFile`` URI option or with the fields ``ca_file`` and ``ca_dir`` in the :symbol:`mongoc_ssl_opt_t`. The Online Certificate Status Protocol (OCSP) (see `RFC 6960 `_) is fully supported when using OpenSSL 1.0.1+ with the following notes: - When a ``crl_file`` is set with :symbol:`mongoc_ssl_opt_t`, and the ``crl_file`` revokes the server's certificate, the certificate is considered revoked (even if the certificate has a valid stapled OCSP response) LibreSSL / libtls ````````````````` The MongoDB C Driver supports LibreSSL through the use of OpenSSL compatibility checks when configured to compile against ``openssl``. It also supports the new ``libtls`` library when configured to build against ``libressl``. When compiled against the Windows native libraries, the ``crl_file`` option of a :symbol:`mongoc_ssl_opt_t` is not supported, and will issue an error if used. Setting ``tlsDisableOCSPEndpointCheck`` and ``tlsDisableCertificateRevocationCheck`` has no effect. The Online Certificate Status Protocol (OCSP) (see `RFC 6960 `_) is partially supported with the following notes: - The Must-Staple extension (see `RFC 7633 `_) is ignored. Connection may continue if a Must-Staple certificate is presented with no stapled response (unless the client receives a revoked response from an OCSP responder). - Connection will continue if a Must-Staple certificate is presented without a stapled response and the OCSP responder is down. Native TLS Support on Windows (Secure Channel) `````````````````````````````````````````````` The MongoDB C Driver supports the Windows native TLS library (Secure Channel, or SChannel), and its native crypto library (Cryptography API: Next Generation, or CNG). When compiled against the Windows native libraries, the ``ca_dir`` option of a :symbol:`mongoc_ssl_opt_t` is not supported, and will issue an error if used. Encrypted PEM files (e.g., setting ``tlsCertificateKeyPassword``) are also not supported, and will result in error when attempting to load them. When ``tlsCAFile`` is set, the driver will only allow server certificates issued by the authority (or authorities) provided. When no ``tlsCAFile`` is set, the driver will look up the Certificate Authority using the ``System Local Machine Root`` certificate store to confirm the provided certificate. When ``crl_file`` is set with :symbol:`mongoc_ssl_opt_t`, the driver will import the revocation list to the ``System Local Machine Root`` certificate store. Setting ``tlsDisableOCSPEndpointCheck`` has no effect. The Online Certificate Status Protocol (OCSP) (see `RFC 6960 `_) is partially supported with the following notes: - The Must-Staple extension (see `RFC 7633 `_) is ignored. Connection may continue if a Must-Staple certificate is presented with no stapled response (unless the client receives a revoked response from an OCSP responder). - When a ``crl_file`` is set with :symbol:`mongoc_ssl_opt_t`, and the ``crl_file`` revokes the server's certificate, the OCSP response takes precedence. E.g. if the server presents a certificate with a valid stapled OCSP response, the certificate is considered valid even if the ``crl_file`` marks it as revoked. - Connection will continue if a Must-Staple certificate is presented without a stapled response and the OCSP responder is down. .. _Secure Transport: Native TLS Support on macOS / Darwin (Secure Transport) ``````````````````````````````````````````````````````` The MongoDB C Driver supports the Darwin (OS X, macOS, iOS, etc.) native TLS library (Secure Transport), and its native crypto library (Common Crypto, or CC). When compiled against Secure Transport, the ``ca_dir`` and ``crl_file`` options of a :symbol:`mongoc_ssl_opt_t` are not supported. An error is issued if either are used. When ``tlsCAFile`` is set, the driver will only allow server certificates issued by the authority (or authorities) provided. When no ``tlsCAFile`` is set, the driver will use the Certificate Authorities in the currently unlocked keychains. Setting ``tlsDisableOCSPEndpointCheck`` and ``tlsDisableCertificateRevocationCheck`` has no effect. The Online Certificate Status Protocol (OCSP) (see `RFC 6960 `_) is partially supported with the following notes. - The Must-Staple extension (see `RFC 7633 `_) is ignored. Connection may continue if a Must-Staple certificate is presented with no stapled response (unless the client receives a revoked response from an OCSP responder). - Connection will continue if a Must-Staple certificate is presented without a stapled response and the OCSP responder is down. mongo-c-driver-1.26.0/src/libmongoc/doc/connection-pooling.rst000066400000000000000000000105401456567454500243200ustar00rootroot00000000000000:man_page: mongoc_connection_pooling Connection Pooling ================== The MongoDB C driver has two connection modes: single-threaded and pooled. Single-threaded mode is optimized for embedding the driver within languages like PHP. Multi-threaded programs should use pooled mode: this mode minimizes the total connection count, and in pooled mode background threads monitor the MongoDB server topology, so the program need not block to scan it. Single Mode ----------- In single mode, your program creates a :symbol:`mongoc_client_t` directly: .. code-block:: c mongoc_client_t *client = mongoc_client_new ( "mongodb://hostA,hostB/?replicaSet=my_rs"); The client connects on demand when your program first uses it for a MongoDB operation. Using a non-blocking socket per server, it begins a check on each server concurrently, and uses the asynchronous ``poll`` or ``select`` function to receive events from the sockets, until all have responded or timed out. Put another way, in single-threaded mode the C Driver fans out to begin all checks concurrently, then fans in once all checks have completed or timed out. Once the scan completes, the client executes your program's operation and returns. In single mode, the client re-scans the server topology roughly once per minute. If more than a minute has elapsed since the previous scan, the next operation on the client will block while the client completes its scan. This interval is configurable with ``heartbeatFrequencyMS`` in the connection string. (See :symbol:`mongoc_uri_t`.) A single client opens one connection per server in your topology: these connections are used both for scanning the topology and performing normal operations. Pooled Mode ----------- To activate pooled mode, create a :symbol:`mongoc_client_pool_t`: .. code-block:: c mongoc_uri_t *uri = mongoc_uri_new ( "mongodb://hostA,hostB/?replicaSet=my_rs"); mongoc_client_pool_t *pool = mongoc_client_pool_new (uri); When your program first calls :symbol:`mongoc_client_pool_pop`, the pool launches monitoring threads in the background. Monitoring threads independently connect to all servers in the connection string. As monitoring threads receive hello responses from the servers, they update the shared view of the server topology. Additional monitoring threads and connections are created as new servers are discovered. Monitoring threads are terminated when servers are removed from the shared view of the server topology. Each thread that executes MongoDB operations must check out a client from the pool: .. code-block:: c mongoc_client_t *client = mongoc_client_pool_pop (pool); /* use the client for operations ... */ mongoc_client_pool_push (pool, client); The :symbol:`mongoc_client_t` object is not thread-safe, only the :symbol:`mongoc_client_pool_t` is. When the driver is in pooled mode, your program's operations are unblocked as soon as monitoring discovers a usable server. For example, if a thread in your program is waiting to execute an "insert" on the primary, it is unblocked as soon as the primary is discovered, rather than waiting for all secondaries to be checked as well. The pool opens one connection per server for monitoring, and each client opens its own connection to each server it uses for application operations. Background monitoring threads re-scan servers independently roughly every 10 seconds. This interval is configurable with ``heartbeatFrequencyMS`` in the connection string. (See :symbol:`mongoc_uri_t`.) The connection string can also specify ``waitQueueTimeoutMS`` to limit the time that :symbol:`mongoc_client_pool_pop` will wait for a client from the pool. (See :symbol:`mongoc_uri_t`.) If ``waitQueueTimeoutMS`` is specified, then it is necessary to confirm that a client was actually returned: .. code-block:: c mongoc_uri_t *uri = mongoc_uri_new ( "mongodb://hostA,hostB/?replicaSet=my_rs&waitQueueTimeoutMS=1000"); mongoc_client_pool_t *pool = mongoc_client_pool_new (uri); mongoc_client_t *client = mongoc_client_pool_pop (pool); if (client) { /* use the client for operations ... */ mongoc_client_pool_push (pool, client); } else { /* take appropriate action for a timeout */ } See :ref:`connection_pool_options` to configure pool size and behavior, and see :symbol:`mongoc_client_pool_t` for an extended example of a multi-threaded program that uses the driver in pooled mode. mongo-c-driver-1.26.0/src/libmongoc/doc/cursors.rst000066400000000000000000000056751456567454500222310ustar00rootroot00000000000000:man_page: mongoc_cursors Cursors ======= Handling Cursor Failures ------------------------ Cursors exist on a MongoDB server. However, the ``mongoc_cursor_t`` structure gives the local process a handle to the cursor. It is possible for errors to occur on the server while iterating a cursor on the client. Even a network partition may occur. This means that applications should be robust in handling cursor failures. While iterating cursors, you should check to see if an error has occurred. See the following example for how to robustly check for errors. .. code-block:: c static void print_all_documents (mongoc_collection_t *collection) { mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t error; bson_t query = BSON_INITIALIZER; char *str; cursor = mongoc_collection_find_with_opts (collection, query, NULL, NULL); while (mongoc_cursor_next (cursor, &doc)) { str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } if (mongoc_cursor_error (cursor, &error)) { fprintf (stderr, "Failed to iterate all documents: %s\n", error.message); } mongoc_cursor_destroy (cursor); } Destroying Server-Side Cursors ------------------------------ The MongoDB C driver will automatically destroy a server-side cursor when :symbol:`mongoc_cursor_destroy()` is called. Failure to call this function when done with a cursor will leak memory client side as well as consume extra memory server side. If the cursor was configured to never timeout, it will become a memory leak on the server. .. _cursors_tailable: Tailable Cursors ---------------- Tailable cursors are cursors that remain open even after they've returned a final result. This way, if more documents are added to a collection (i.e., to the cursor's result set), then you can continue to call :symbol:`mongoc_cursor_next()` to retrieve those additional results. Here's a complete test case that demonstrates the use of tailable cursors. .. note:: Tailable cursors are for capped collections only. An example to tail the oplog from a replica set. .. literalinclude:: ../examples/mongoc-tail.c :language: c :caption: mongoc-tail.c Let's compile and run this example against a replica set to see updates as they are made. .. code-block:: none $ gcc -Wall -o mongoc-tail mongoc-tail.c $(pkg-config --cflags --libs libmongoc-1.0) $ ./mongoc-tail mongodb://example.com/?replicaSet=myReplSet { "h" : -8458503739429355503, "ns" : "test.test", "o" : { "_id" : { "$oid" : "5372ab0a25164be923d10d50" } }, "op" : "i", "ts" : { "$timestamp" : { "i" : 1, "t" : 1400023818 } }, "v" : 2 } The line of output is a sample from performing ``db.test.insert({})`` from the mongo shell on the replica set. .. seealso:: | :symbol:`mongoc_cursor_set_max_await_time_ms`. mongo-c-driver-1.26.0/src/libmongoc/doc/data-compression.rst000066400000000000000000000025371456567454500237730ustar00rootroot00000000000000:man_page: mongoc_data_compression Data Compression ================ The following guide explains how data compression support works between the MongoDB server and client. It also shows an example of how to connect to a server with data compression. Compressing data to and from MongoDB ------------------------------------ MongoDB 3.4 added Snappy compression support, while zlib compression was added in 3.6, and zstd compression in 4.2. To enable compression support the client must be configured with which compressors to use: .. code-block:: none mongoc_client_t *client = NULL; client = mongoc_client_new ("mongodb://localhost:27017/?compressors=snappy,zlib,zstd"); The ``compressors`` option specifies the priority order of compressors the client wants to use. Messages are compressed if the client and server share any compressors in common. Note that the compressor used by the server might not be the same compressor as the client used. For example, if the client uses the connection string ``compressors=zlib,snappy`` the client will use ``zlib`` compression to send data (if possible), but the server might still reply using ``snappy``, depending on how the server was configured. The driver must be built with zlib and/or snappy and/or zstd support to enable compression support, any unknown (or not compiled in) compressor value will be ignored. mongo-c-driver-1.26.0/src/libmongoc/doc/debugging.rst000066400000000000000000000061421456567454500224520ustar00rootroot00000000000000:man_page: mongoc_debugging Aids for Debugging ================== GDB --- This repository contains a ``.gdbinit`` file that contains helper functions to aid debugging of data structures. GDB will load this file `automatically`_ if you have added the directory which contains the `.gdbinit` file to GDB's `auto-load safe-path`_, *and* you start GDB from the directory which holds the `.gdbinit` file. You can see the safe-path with ``show auto-load safe-path`` on a GDB prompt. You can configure it by setting it in ``~/.gdbinit`` with:: add-auto-load-safe-path /path/to/mongo-c-driver If you haven't added the path to your auto-load safe-path, or start GDB in another directory, load the file with:: source path/to/mongo-c-driver/.gdbinit The ``.gdbinit`` file defines the ``printbson`` function, which shows the contents of a ``bson_t *`` variable. If you have a local ``bson_t``, then you must prefix the variable with a `&`. An example GDB session looks like:: (gdb) printbson bson ALLOC [0x555556cd7310 + 0] (len=475) { 'bool' : true, 'int32' : NumberInt("42"), 'int64' : NumberLong("3000000042"), 'string' : "Stŕìñg", 'objectId' : ObjectID("5A1442F3122D331C3C6757E1"), 'utcDateTime' : UTCDateTime(1511277299031), 'arrayOfInts' : [ '0' : NumberInt("1"), '1' : NumberInt("2") ], 'embeddedDocument' : { 'arrayOfStrings' : [ '0' : "one", '1' : "two" ], 'double' : 2.718280, 'notherDoc' : { 'true' : NumberInt("1"), 'false' : false } }, 'binary' : Binary("02", "3031343532333637"), 'regex' : Regex("@[a-z]+@", "im"), 'null' : null, 'js' : JavaScript("print foo"), 'jsws' : JavaScript("print foo") with scope: { 'f' : NumberInt("42"), 'a' : [ '0' : 3.141593, '1' : 2.718282 ] }, 'timestamp' : Timestamp(4294967295, 4294967295), 'double' : 3.141593 } .. _automatically: https://sourceware.org/gdb/onlinedocs/gdb/Auto_002dloading.html .. _auto-load safe-path: https://sourceware.org/gdb/onlinedocs/gdb/Auto_002dloading-safe-path.html LLDB ---- The mongo-c-driver repository contains a script ``lldb_bson.py`` that can be imported into an LLDB sessions and allows rich inspection of BSON values. .. note:: The ``lldb_bson.py`` module requires an LLDB with Python 3.8 or newer. To activate the script, import it from the LLDB command line:: (lldb) command script import /path/to/mongo-c-driver/lldb_bson.py Upon success, the message ``lldb_bson is ready`` will be printed to the LLDB console. The import of this script can be made automatic by adding the command to an ``.lldbinit`` file. For example: Create a file ``~/.lldbinit`` containing:: command script import /path/to/mongo-c-driver/lldb_bson.py The docstring at the top of the ``lldb_bson.py`` file contains more information on the capabilities of the module. Debug assertions ---------------- To enable runtime debug assertions, configure with ``-DENABLE_DEBUG_ASSERTIONS=ON``. mongo-c-driver-1.26.0/src/libmongoc/doc/distinct-mapreduce.rst000066400000000000000000000061141456567454500243020ustar00rootroot00000000000000:man_page: mongoc_distinct_mapreduce "distinct" and "mapReduce" ========================== This document provides some practical, simple, examples to demonstrate the ``distinct`` and ``mapReduce`` commands. Setup ----- First we'll write some code to insert sample data: .. literalinclude:: ../examples/doc-common-insert.c :language: c :caption: doc-common-insert.c "distinct" command ------------------ This is how to use the ``distinct`` command to get the distinct values of ``x`` which are greater than ``1``: .. literalinclude:: ../examples/basic_aggregation/distinct.c :language: c :caption: distinct.c "mapReduce" - basic example --------------------------- A simple example using the map reduce framework. It simply adds up the number of occurrences of each "tag". First define the ``map`` and ``reduce`` functions: .. literalinclude:: ../examples/basic_aggregation/constants.c :language: c :caption: constants.c Run the ``mapReduce`` command. Use the generic command helpers (e.g. :symbol:`mongoc_database_command_simple()`). Do not the read command helpers (e.g. :symbol:`mongoc_database_read_command_with_opts()`) because they are considered retryable read operations. If retryable reads are enabled, those operations will retry once on a retryable error, giving undesirable behavior for ``mapReduce``. .. literalinclude:: ../examples/basic_aggregation/map-reduce-basic.c :language: c :caption: map-reduce-basic.c "mapReduce" - more complicated example -------------------------------------- You must have replica set running for this. In this example we contact a secondary in the replica set and do an "inline" map reduce, so the results are returned immediately: .. literalinclude:: ../examples/basic_aggregation/map-reduce-advanced.c :language: c :caption: map-reduce-advanced.c Running the Examples -------------------- Here's how to run the example code .. literalinclude:: ../examples/basic_aggregation/basic-aggregation.c :language: c :caption: basic-aggregation.c If you want to try the advanced map reduce example with a secondary, start a replica set (instructions for how to do this can be found `here `_). Otherwise, just start an instance of MongoDB: .. code-block:: none $ mongod Now compile and run the example program: .. code-block:: none $ cd examples/basic_aggregation/ $ gcc -Wall -o agg-example basic-aggregation.c $(pkg-config --cflags --libs libmongoc-1.0) $ ./agg-example localhost Inserting data distinct Next double: 2.000000 Next double: 3.000000 map reduce { "result" : "outCollection", "timeMillis" : 155, "counts" : { "input" : 84, "emit" : 126, "reduce" : 3, "output" : 3 }, "ok" : 1 } { "_id" : "cat", "value" : 63 } { "_id" : "dog", "value" : 42 } { "_id" : "mouse", "value" : 21 } more complicated map reduce { "results" : [ { "_id" : "cat", "value" : 63 }, { "_id" : "dog", "value" : 42 }, { "_id" : "mouse", "value" : 21 } ], "timeMillis" : 14, "counts" : { "input" : 84, "emit" : 126, "reduce" : 3, "output" : 3 }, "ok" : 1 } mongo-c-driver-1.26.0/src/libmongoc/doc/errors.rst000066400000000000000000001477121456567454500220440ustar00rootroot00000000000000:man_page: mongoc_errors « :doc:`index` Error Reporting =============== Description ----------- Many C Driver functions report errors by returning ``false`` or -1 and filling out a :symbol:`bson:bson_error_t` structure with an error domain, error code, and message. Use ``domain`` to determine which subsystem generated the error, and ``code`` for the specific error. ``message`` is a human-readable error description. .. seealso:: | :doc:`Handling Errors in libbson `. .. _Error code from server: https://github.com/mongodb/mongo/blob/master/src/mongo/base/error_codes.yml +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Code | Description | | +=========================================+==================================================================================================================================+==========================================================================================================================================================================================================================================================================================================================+ | ``MONGOC_ERROR_CLIENT`` | ``MONGOC_ERROR_CLIENT_TOO_BIG`` | You tried to send a message larger than the server's max message size. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_AUTHENTICATE`` | Wrong credentials, or failure sending or receiving authentication messages. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_NO_ACCEPTABLE_PEER`` | You tried an TLS connection but the driver was not built with TLS. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_IN_EXHAUST`` | You began iterating an exhaust cursor, then tried to begin another operation with the same :symbol:`mongoc_client_t`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_SESSION_FAILURE`` | Failure related to creating or using a logical session. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG`` | Failure related to arguments passed when initializing In-Use Encryption. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE`` | Failure related to In-Use Encryption. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_INVALID_LOAD_BALANCER`` | You attempted to connect to a MongoDB server behind a load balancer, but the server does not advertize load balanced support. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_STREAM`` | ``MONGOC_ERROR_STREAM_NAME_RESOLUTION`` | DNS failure. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_STREAM_SOCKET`` | Timeout communicating with server, or connection closed. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_STREAM_CONNECT`` | Failed to connect to server. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_PROTOCOL`` | ``MONGOC_ERROR_PROTOCOL_INVALID_REPLY`` | Corrupt response from server. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION`` | The server version is too old or too new to communicate with the driver. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_CURSOR`` | ``MONGOC_ERROR_CURSOR_INVALID_CURSOR`` | You passed bad arguments to :symbol:`mongoc_collection_find_with_opts`, or you called :symbol:`mongoc_cursor_next` on a completed or failed cursor, or the cursor timed out on the server. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CHANGE_STREAM_NO_RESUME_TOKEN`` | A resume token was not returned in a document found with :symbol:`mongoc_change_stream_next` | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_QUERY`` | ``MONGOC_ERROR_QUERY_FAILURE`` | :ref:`Error API Version 1 `: Server error from command or query. The server error message is in ``message``. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SERVER`` | ``MONGOC_ERROR_QUERY_FAILURE`` | :ref:`Error API Version 2 `: Server error from command or query. The server error message is in ``message``. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SASL`` | A SASL error code. | ``man sasl_errors`` for a list of codes. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_BSON`` | ``MONGOC_ERROR_BSON_INVALID`` | You passed an invalid or oversized BSON document as a parameter, or called :symbol:`mongoc_collection_create_index` with invalid keys, or the server reply was corrupt. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_NAMESPACE`` | ``MONGOC_ERROR_NAMESPACE_INVALID`` | You tried to create a collection with an invalid name. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_COMMAND`` | ``MONGOC_ERROR_COMMAND_INVALID_ARG`` | Many functions set this error code when passed bad parameters. Print the error message for details. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION`` | You tried to use a command option the server does not support. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_DUPLICATE_KEY`` | An insert or update failed because because of a duplicate ``_id`` or other unique-index violation. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_MAX_TIME_MS_EXPIRED`` | The operation failed because maxTimeMS expired. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_SERVER_SELECTION_INVALID_ID`` | The ``serverId`` option for an operation conflicts with the pinned server for that operation's client session (denoted by the ``sessionId`` option). | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_COMMAND`` | `Error code from server`_. | :ref:`Error API Version 1 `: Server error from a command. The server error message is in ``message``. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SERVER`` | `Error code from server`_. | :ref:`Error API Version 2 `: Server error from a command. The server error message is in ``message``. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_COLLECTION`` | ``MONGOC_ERROR_COLLECTION_INSERT_FAILED``, ``MONGOC_ERROR_COLLECTION_UPDATE_FAILED``, ``MONGOC_ERROR_COLLECTION_DELETE_FAILED``. | Invalid or empty input to :symbol:`mongoc_collection_insert_one`, :symbol:`mongoc_collection_insert_bulk`, :symbol:`mongoc_collection_update_one`, :symbol:`mongoc_collection_update_many`, :symbol:`mongoc_collection_replace_one`, :symbol:`mongoc_collection_delete_one`, or :symbol:`mongoc_collection_delete_many`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_COLLECTION`` | `Error code from server`_. | :ref:`Error API Version 1 `: Server error from :symbol:`mongoc_collection_insert_one`, :symbol:`mongoc_collection_insert_bulk`, :symbol:`mongoc_collection_update_one`, :symbol:`mongoc_collection_update_many`, :symbol:`mongoc_collection_replace_one`, | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SERVER`` | `Error code from server`_. | :ref:`Error API Version 2 `: Server error from :symbol:`mongoc_collection_insert_one`, :symbol:`mongoc_collection_insert_bulk`, :symbol:`mongoc_collection_update_one`, :symbol:`mongoc_collection_update_many`, :symbol:`mongoc_collection_replace_one`, | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_GRIDFS`` | ``MONGOC_ERROR_GRIDFS_CHUNK_MISSING`` | The GridFS file is missing a document in its ``chunks`` collection. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_CORRUPT`` | A data inconsistency was detected in GridFS. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_INVALID_FILENAME`` | You passed a NULL filename to :symbol:`mongoc_gridfs_remove_by_filename`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_PROTOCOL_ERROR`` | You called :symbol:`mongoc_gridfs_file_set_id` after :symbol:`mongoc_gridfs_file_save`, or tried to write on a closed GridFS stream. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_BUCKET_FILE_NOT_FOUND`` | A GridFS file is missing from ``files`` collection. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_BUCKET_STREAM`` | An error occurred on a stream created from a GridFS operation like :symbol:`mongoc_gridfs_bucket_upload_from_stream`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SCRAM`` | ``MONGOC_ERROR_SCRAM_PROTOCOL_ERROR`` | Failure in SCRAM-SHA-1 or SCRAM-SHA-256 authentication. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SERVER_SELECTION`` | ``MONGOC_ERROR_SERVER_SELECTION_FAILURE`` | No replica set member or mongos is available, or none matches your :doc:`read preference `, or you supplied an invalid :symbol:`mongoc_read_prefs_t`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_WRITE_CONCERN`` | `Error code from server`_. | There was a :doc:`write concern ` error or :doc:`timeout ` from the server. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_TRANSACTION`` | ``MONGOC_ERROR_TRANSACTION_INVALID`` | You attempted to start a transaction when one is already in progress, or commit or abort when there is no transaction. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION`` | Error code produced by libmongocrypt. | An error occurred in the library responsible for In-Use Encryption | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_AZURE`` | ``MONGOC_ERROR_KMS_SERVER_HTTP`` | An Azure HTTP service responded with an error status | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_KMS_SERVER_BAD_JSON`` | An Azure service responded with invalid JSON data | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_GCP`` | ``MONGOC_ERROR_KMS_SERVER_HTTP`` | A GCP HTTP service responded with an error status | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_KMS_SERVER_BAD_JSON`` | A GCP service responded with invalid JSON data | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. _error_labels: Error Labels ------------ In some cases your application must make decisions based on what category of error the driver has returned, but these categories do not correspond perfectly to an error domain or code. In such cases, error *labels* provide a reliable way to determine how your application should respond to an error. Any C Driver function that has a :symbol:`bson:bson_t` out-parameter named ``reply`` may include error labels to the reply, in the form of a BSON field named "errorLabels" containing an array of strings: .. code-block:: none { "errorLabels": [ "TransientTransactionError" ] } Use :symbol:`mongoc_error_has_label` to test if a reply contains a specific label. See :symbol:`mongoc_client_session_start_transaction` for example code that demonstrates the use of error labels in application logic. The following error labels are currently defined. Future versions of MongoDB may introduce new labels. TransientTransactionError ^^^^^^^^^^^^^^^^^^^^^^^^^ Within a multi-document transaction, certain errors can leave the transaction in an unknown or aborted state. These include write conflicts, primary stepdowns, and network errors. In response, the application should abort the transaction and try the same sequence of operations again in a new transaction. UnknownTransactionCommitResult ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When :symbol:`mongoc_client_session_commit_transaction` encounters a network error or certain server errors, it is not known whether the transaction was committed. Applications should attempt to commit the transaction again until: the commit succeeds, the commit fails with an error *not* labeled "UnknownTransactionCommitResult", or the application chooses to give up. .. _errors_error_api_version: .. _error_api_version: Setting the Error API Version ----------------------------- The driver's error reporting began with a design flaw: when the error *domain* is ``MONGOC_ERROR_COLLECTION``, ``MONGOC_ERROR_QUERY``, or ``MONGOC_ERROR_COMMAND``, the error *code* might originate from the server or the driver. An application cannot always know where an error originated, and therefore cannot tell what the code means. For example, if :symbol:`mongoc_collection_update_one` sets the error's domain to ``MONGOC_ERROR_COLLECTION`` and its code to 24, the application cannot know whether 24 is the generic driver error code ``MONGOC_ERROR_COLLECTION_UPDATE_FAILED`` or the specific server error code "LockTimeout". To fix this flaw while preserving backward compatibility, the C Driver 1.4 introduces "Error API Versions". Version 1, the default Error API Version, maintains the flawed behavior. Version 2 adds a new error domain, ``MONGOC_ERROR_SERVER``. In Version 2, error codes originating on the server always have error domain ``MONGOC_ERROR_SERVER`` or ``MONGOC_ERROR_WRITE_CONCERN``. When the driver uses Version 2 the application can always determine the origin and meaning of error codes. New applications should use Version 2, and existing applications should be updated to use Version 2 as well. +------------------------------------------------------+----------------------------------------+----------------------------------------+ | Error Source | API Version 1 | API Version 2 | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_cursor_error` | ``MONGOC_ERROR_QUERY`` | ``MONGOC_ERROR_SERVER`` | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_client_command_with_opts`, | ``MONGOC_ERROR_QUERY`` | ``MONGOC_ERROR_SERVER`` | | :symbol:`mongoc_database_command_with_opts`, and | | | | other command functions | | | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_collection_count_with_opts` | ``MONGOC_ERROR_QUERY`` | ``MONGOC_ERROR_SERVER`` | | :symbol:`mongoc_client_get_database_names_with_opts`,| | | | and other command helper functions | | | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_collection_insert_one` | ``MONGOC_ERROR_COMMAND`` | ``MONGOC_ERROR_SERVER`` | | :symbol:`mongoc_collection_insert_bulk` | | | | :symbol:`mongoc_collection_update_one` | | | | :symbol:`mongoc_collection_update_many` | | | | :symbol:`mongoc_collection_replace_one` | | | | :symbol:`mongoc_collection_delete_one` | | | | :symbol:`mongoc_collection_delete_many` | | | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_bulk_operation_execute` | ``MONGOC_ERROR_COMMAND`` | ``MONGOC_ERROR_SERVER`` | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | Write-concern timeout | ``MONGOC_ERROR_WRITE_CONCERN`` | ``MONGOC_ERROR_WRITE_CONCERN`` | +------------------------------------------------------+----------------------------------------+----------------------------------------+ The Error API Versions are defined with ``MONGOC_ERROR_API_VERSION_LEGACY`` and ``MONGOC_ERROR_API_VERSION_2``. Set the version with :symbol:`mongoc_client_set_error_api` or :symbol:`mongoc_client_pool_set_error_api`. .. seealso:: | `MongoDB Server Error Codes `_ .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_error_has_label mongo-c-driver-1.26.0/src/libmongoc/doc/full_index.rst000066400000000000000000000004311456567454500226430ustar00rootroot00000000000000:man_page: mongoc_reference :orphan: .. Yes it's confusing: the home page is called "index" so this is "full_index", and it works by including the complete Table of Contents from the homepage, i.e., "index". Index ===== .. toctree:: :maxdepth: 6 :titlesonly: index mongo-c-driver-1.26.0/src/libmongoc/doc/gridfs.rst000066400000000000000000000017111456567454500217720ustar00rootroot00000000000000GridFS ====== The C driver includes two APIs for GridFS. The older API consists of :symbol:`mongoc_gridfs_t` and its derivatives. It contains deprecated API, does not support read preferences, and is not recommended in new applications. It does not conform to the `MongoDB GridFS specification `_. The newer API consists of :symbol:`mongoc_gridfs_bucket_t` and allows uploading/downloading through derived :symbol:`mongoc_stream_t` objects. It conforms to the `MongoDB GridFS specification `_. There is not always a straightforward upgrade path from an application built with :symbol:`mongoc_gridfs_t` to :symbol:`mongoc_gridfs_bucket_t` (e.g. a :symbol:`mongoc_gridfs_file_t` provides functions to seek but :symbol:`mongoc_stream_t` does not). But users are encouraged to upgrade when possible.mongo-c-driver-1.26.0/src/libmongoc/doc/guides.rst000066400000000000000000000005271456567454500220000ustar00rootroot00000000000000:man_page: mongoc_guides Guides ====== .. toctree:: :titlesonly: :maxdepth: 1 configuring_tls mongoc-common-task-examples advanced-connections connection-pooling data-compression cursors bulk aggregate distinct-mapreduce visual-studio-guide manage-collection-indexes debugging in-use-encryption mongo-c-driver-1.26.0/src/libmongoc/doc/howto/000077500000000000000000000000001456567454500211225ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc/howto/index.rst000066400000000000000000000005241456567454500227640ustar00rootroot00000000000000############# How-To Guides ############# .. important:: The "cookbook" is for problem-solving, and deeper dives into approach particular tasks. It may assume some prior knowledge, and these are not tutorials themselves! For learning the basics, see the :doc:`/learn/index` section. .. toctree:: :maxdepth: 2 source-install mongo-c-driver-1.26.0/src/libmongoc/doc/howto/source-install.rst000066400000000000000000000242111456567454500246200ustar00rootroot00000000000000################################################# How to: Install |libbson|/|libmongoc| from Source ################################################# .. |pkg-config| replace:: :bolded-name:`pkg-config` .. _pkg-config: https://www.freedesktop.org/wiki/Software/pkg-config/ .. _XDG base directory: https://wiki.archlinux.org/title/XDG_Base_Directory .. _systemd file-hierarchy: https://man.archlinux.org/man/file-hierarchy.7 .. highlight:: console .. default-role:: bash .. important:: This page assumes that you can successfully configure and build the components that you wish to install, which is detailed and explained on the :doc:`/learn/get/from-source` tutorial page. Whereas that tutorial walks through getting the sources built and a minimal install working, this page will offer deeper guidance on the nuance and available options for installing the |mongo-c-driver| libraries from such a from-source build. |mongo-c-driver| uses CMake to generate its installation rules, and installs a variety of artifacts of interest. For integration with downstream programs, the :external+cmake:ref:`config file packages` and |pkg-config|_ files would be of particular interest. If you are intending to import |libbson| or |libmongoc| via CMake or pkg-config, it can be helpful to be aware of how the respective tool searches for package metadata. .. tab-set:: .. tab-item:: CMake Package Lookup CMake builds a set of search paths based on a set of prefixes, which are read from both the environment and from configure-time CMake settings. In particular, the `$PATH` environment variable will be used to construct the standard prefixes for the system. For each directory :math:`D` in `$PATH`: 1. If the final path component of :math:`D` is "``bin``" or "``sbin``", :math:`D` is replaced with the parent path of :math:`D`. 2. :math:`D` is added as a search prefix. This has the effect that common Unix-specific directories on `$PATH`, such as ``/usr/bin`` and ``/usr/local/bin`` will end up causing CMake to search in ``/usr`` and ``/usr/local`` is prefixes, respectively. If you have the directory `$HOME/.local/bin` on your `$PATH`, then the `$HOME/.local` directory will also be added to the search path. Having `$HOME/.local/bin` on `$PATH` is an increasingly common pattern for many Unix shells, and is recommended if you intend to do use a per-user-prefix_ for your installion. Additionally, the :any:`CMAKE_PREFIX_PATH ` *environment variable* will be used to construct a list of paths. By default, this environment variable is not defined. **On Windows**, the directories :batch:`%ProgramW6432%`, :batch:`%ProgramFiles%`, :batch:`%ProgramFiles(x86)%`, :batch:`%SystemDrive%\\Program Files`, and :batch:`%SystemDrive%\\Program Files (x86)` will also be added. (These come from the :any:`CMAKE_SYSTEM_PREFIX_PATH ` CMake variable, which is defined during CMake's platform detection.) .. seealso:: For detailed information on package lookup, refer to CMake's :external+cmake:ref:`search procedure` section for full details. .. tab-item:: pkg-config Package Lookup The |pkg-config| command-line tool looks for ``.pc`` files in various directories, by default relative to the path of the |pkg-config| tool itself. To get the list of directories that your |pkg-config| will search by default, use the following command: .. code-block:: :caption: Ask |pkg-config| what directories it will search by default $ pkg-config "pkg-config" --variable="pc_path" Additional directories can be specified using the `$PKG_CONFIG_PATH` environment variable. Such paths will be searched *before* the default |pkg-config| paths. **On Windows**, registry keys ``HKCU\Software\pkgconfig\PKG_CONFIG_PATH`` and ``HKLM\Software\pkgconfig\PKG_CONFIG_PATH`` can be used to specify additional search directories for |pkg-config|. Adding directories to the ``HKCU\…`` key is recommended for persisting user-specific search directories. .. seealso:: If you have `man` and |pkg-config| installed on your system, lookup procedures are detailed in `man 1 pkg-config`. This documentation may also be found at many man page archives on the web, such as `pkg-config at linux.die.net`__. __ https://linux.die.net/man/1/pkg-config .. _howto.source-install.choosing-a-prefix: Choosing a Prefix ***************** We will call the directory for the user-local installation `$PREFIX`. Selecting the path to this directory is somewhat arbitrary, but there are some recommendations to consider. The `$PREFIX` directory is the path that you will give to CMake or |pkg-config| when configuring a downstream project. .. _per-user-prefix: Using an Unprivileged User-Local Install Prefix (Recommended) ============================================================= It is recommended that you install custom-built |mongo-c-driver| libraries in an unprivileged filesystem location particular to the user account. .. tab-set:: .. tab-item:: macOS Unlike other Unix-like systems, macOS does not have a specific directory for user-local package installations, and it is up to the individual to create such directories themselves. The choice of directory to use is essentially arbitrary. For per-user installations, the only requirement is that the directory be writeable by the user that wishes to perform and use the installation. For the purposes of uniformity with other Unix variants, this guide will lightly recommend using `$HOME/.local` as a user-local installation prefix. This is based on the behavior specified by the `XDG base directory`_ specifications and the `systemd file-hierarchy`_ common on Linux and various BSDs, but it is not a standard on other platforms. .. tab-item:: Linux & Other Unixes On Linux and BSD systems, it is common to use the `$HOME/.local` directory as the prefix for user-specific package installations. This convention originates in the `XDG base directory`_ specification and the `systemd file-hierarchy`_ Because of its wide-spread use and support in many other tools, this guide recommends using `$HOME/.local` as a user-local installation prefix. .. tab-item:: Windows On Windows, there exists a dedicated directory for user-local files in :batch:`%UserProfile%\\AppData\\Local`. To reference it, expand the :batch:`%LocalAppData%` environment variable. (**Do not** use the :batch:`%AppData%` environment variable!) Despite this directory existing, it has no prescribed structure that suits our purposes. The choice of user-local installation prefix is arbitrary. This guide *strongly discourages* creating additional files and directories directly within the user's home directory. Consider using :batch:`%LocalAppData%\\MongoDB` as a prefix for the purposes of manually installed components. .. _source-install.system-prefix: Selecting a System-Wide Installation Prefix =========================================== If you wish to install the |mongo-c-driver| libraries in a directory that is visible to all users, there are a few standard options. .. tab-set:: .. tab-item:: Linux, macOS, BSD, or Other Unix Using an install `$PREFIX` of ``/usr/local/`` is the primary recommendation for all Unix platforms, but this may vary on some obscure systems. .. warning:: **DO NOT** use ``/usr/`` nor ``/`` (the root directory) as a prefix: These directories are designed to be carefully managed by the system. The ``/usr/local`` directory is intentionally reserved for the purpose of unmanaged software installation. Alternatively, consider installing to a distinct directory that can be easily removed or relocated, such as ``/opt/mongo-c-driver/``. This will be easily identifiable and not interact with other software on the system without explicitly opting-in. .. tab-item:: Windows .. warning:: It is **strongly discouraged** to manually install software system-wide on Windows. Prefer instead to :ref:`use a per-user unprivileged installation prefix `. If you wish to perform a system-wide installation on Windows, prefer to use a named subdirectory of :batch:`%ProgramData%`, which does not require administrative privileges to read and write. (e.g. :batch:`%ProgramData%\\mongo-c-driver`) Installing with CMake ********************* After you have successfully configured and built the libraries and have selected a suitable `$PREFIX`, you can install the built results. Let the name `$BUILD` refer to the directory where you executed the build (this is the directory that contains ``CMakeCache.txt``, among many other files). From a command line, the installation into your chosen `$PREFIX` can be run via CMake using the :external:option:`cmake --install subcommand `:: $ cmake --install "$BUILD" --prefix "$PREFIX" .. important:: If you configured the libraries while using a *multi-config generator* (e.g Visual Studio, Xcode), then you will also need to pass the :external:option:`--config ` command-line option, and must pass the value for the build configuration that you wish to install. For any chosen value of `--config` used for installation, you must also have previously executed a :external:option:`cmake --build ` within that directory with that same `--config` value. .. note:: If you chose to use a system-wide installation `$PREFIX`, it is possible that you will need to execute the installation as a privileged user. If you *cannot run* or *do not want to run* the installation as a privileged user, you should instead `use a per-user installation prefix `_. .. hint:: It is not necessary to set a |cmvar:CMAKE_INSTALL_PREFIX| if you use the :external:option:`--prefix ` command-line option with `cmake --install`. The `--prefix` option will override whatever was specified by |cmvar:CMAKE_INSTALL_PREFIX| when the project was configured. mongo-c-driver-1.26.0/src/libmongoc/doc/in-use-encryption.rst000066400000000000000000000046231456567454500241110ustar00rootroot00000000000000In-Use Encryption ================= In-Use Encryption consists of two features: .. toctree:: :titlesonly: :maxdepth: 1 client-side-field-level-encryption queryable-encryption Installation ------------ Using In-Use Encryption in the C driver requires the dependency libmongocrypt. See the MongoDB Manual for `libmongocrypt installation instructions `_. Once libmongocrypt is installed, configure the C driver with ``-DENABLE_CLIENT_SIDE_ENCRYPTION=ON`` to require In-Use Encryption be enabled. .. parsed-literal:: $ cd mongo-c-driver $ mkdir cmake-build && cd cmake-build $ cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF -DENABLE_CLIENT_SIDE_ENCRYPTION=ON .. $ cmake --build . --target install API --- :symbol:`mongoc_client_encryption_t` is used for explicit encryption and key management. :symbol:`mongoc_client_enable_auto_encryption()` and :symbol:`mongoc_client_pool_enable_auto_encryption()` is used to enable automatic encryption. The Queryable Encryption and CSFLE features share much of the same API with some exceptions. - The supported algorithms documented in :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm` do not apply to both features. - :symbol:`mongoc_auto_encryption_opts_set_encrypted_fields_map` only applies to Queryable Encryption. - :symbol:`mongoc_auto_encryption_opts_set_schema_map` only applies to CSFLE. .. _query_analysis: Query Analysis -------------- To support the automatic encryption feature, one of the following dependencies are required: - The ``mongocryptd`` executable. See the MongoDB Manual documentation: `Install and Configure mongocryptd `_ - The ``crypt_shared`` library. See the MongoDB Manual documentation: `Automatic Encryption Shared Library `_ A :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t` configured with auto encryption will automatically try to load the ``crypt_shared`` library. If loading the ``crypt_shared`` library fails, the :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t` will try to spawn the ``mongocryptd`` process from the application's ``PATH``. To configure use of ``crypt_shared`` and ``mongocryptd`` see :symbol:`mongoc_auto_encryption_opts_set_extra()`. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/000077500000000000000000000000001456567454500215705ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc/includes/aggregate-opts.txt000066400000000000000000000044371456567454500252520ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. * ``batchSize``: An ``int32`` representing number of documents requested to be returned on each call to :symbol:`mongoc_cursor_next` * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Only string values are supported prior to MongoDB 4.4. * ``hint``: A document or string that specifies the index to use to support the query predicate. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/bulk-insert-opts.txt000066400000000000000000000005231456567454500255530ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/bulk-opts.txt000066400000000000000000000023611456567454500242530ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``ordered``: set to ``false`` to attempt to insert all documents, continuing after errors. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/bulk-remove-many-opts.txt000066400000000000000000000010221456567454500265010ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/bulk-remove-one-opts.txt000066400000000000000000000010221456567454500263160ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/bulk-remove-opts.txt000066400000000000000000000004411456567454500255430ustar00rootroot00000000000000``opts`` may be NULL or a BSON document with additional command options: * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/bulk-replace-one-opts.txt000066400000000000000000000014311456567454500264400ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: If true, insert a document if none match ``selector``. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/bulk-update-many-opts.txt000066400000000000000000000015741456567454500265020ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: If true, insert a document if none match ``selector``. * ``arrayFilters``: An array of filters specifying to which array elements an update should apply. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/bulk-update-one-opts.txt000066400000000000000000000015741456567454500263170ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: If true, insert a document if none match ``selector``. * ``arrayFilters``: An array of filters specifying to which array elements an update should apply. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/change-stream-opts.txt000066400000000000000000000046031456567454500260350ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``batchSize``: An ``int32`` representing number of documents requested to be returned on each call to :symbol:`mongoc_change_stream_next` * ``resumeAfter``: A ``Document`` representing the logical starting point of the change stream. The result of :symbol:`mongoc_change_stream_get_resume_token()` or the ``_id`` field of any change received from a change stream can be used here. This option is mutually exclusive with ``startAfter`` and ``startAtOperationTime``. * ``startAfter``: A ``Document`` representing the logical starting point of the change stream. Unlike ``resumeAfter``, this can resume notifications after an "invalidate" event. The result of :symbol:`mongoc_change_stream_get_resume_token()` or the ``_id`` field of any change received from a change stream can be used here. This option is mutually exclusive with ``resumeAfter`` and ``startAtOperationTime``. * ``startAtOperationTime``: A ``Timestamp``. The change stream only provides changes that occurred at or after the specified timestamp. Any command run against the server will return an operation time that can be used here. This option is mutually exclusive with ``resumeAfter`` and ``startAfter``. * ``maxAwaitTimeMS``: An ``int64`` representing the maximum amount of time a call to :symbol:`mongoc_change_stream_next` will block waiting for data * ``fullDocument``: An optional UTF-8 string. Set this option to "default", "updateLookup", "whenAvailable", or "required", If unset, The string "default" is assumed. Set this option to "updateLookup" to direct the change stream cursor to lookup the most current majority-committed version of the document associated to an update change stream event. * ``fullDocumentBeforeChange``: An optional UTF-8 string. Set this option to "whenAvailable", "required", or "off". When unset, the default value is "off". Similar to "fullDocument", but returns the value of the document before the associated change. * ``showExpandedEvents``: Set to ``true`` to return an expanded list of change stream events. Available only on MongoDB versions >=6.0 * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Only string values are supported prior to MongoDB 4.4. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/cmake.inv000066400000000000000000002007361456567454500233760ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: CMake # Version: 3.27.1 # The remainder of this file is compressed using zlib. xڼYoȒ~?Ep桦[Q((mT~!Ti[R|).=̴_pIy~z"[/Wrھ}V[2Ϸz3jl~[?LInyX84m øOϋbu\HC_$`c~ȗu ?.~jt/} {9{\~(yaª!-7rAUC[lR' n^E~7ͱiLvGQoͭ7_׷ + ,H ;kP B&m?mQmN|it(,qyІ26ٯXdaϟ.k.1^_3l|QTΎTƁŠn3_9<סVpm߯neɹn ]^q{ YS/鑰ru[K=Bm8\>.8,Y,sU.-ǖ;3Bσ8~FbfD{u3_/6ۉ$-ⷵEmmw'5<{vُ~P 3_vIUbT>wBy[w~A { e嗬G/\>@^'Q>?{18icyي/`_BmX7+i le ֫僌GR30dBweu72?_<>/6[[*@*(/xɋ +*جϧN( ;vxwn{pyC]bf7 ݩ,%s ~qw̆߃!52,nqs,$s@"vX]uz\A\n7CśJVJVWu=a%[֊zu\tB\e+=O]ΟbURT/S P~Hi/6dffÈ?bD }Hr7 _ F~|O;Q+߱^P"̅vј[m?lOcNb%);$Ԅ^ڑswhB9-6\kx-9FT(qG߈R>@hMY,)Xo}oT6gpڲ~[~c=`qV`wpo ՚QQ]fu?Űq'.s&eĤ-jV^/i齰lck!=fQ{S+T;^a&RT35]î-,z=޽1 VWz}DI+ȼ"Sq<m8DtNˢ[XHO[3)i%8a/V!qT.:вfC T^=Z&Xa!f؛$c|ϤitP * 6^.:-{e^<>e[.Z.VT֖M9:aZBzBqYp 1m̴ϜufgC(wgցv!nml<2mk^iv-+=Rȵi c[Ł(QJίsJk90tO3{VJE}.FSZu֏4*u-w&@â~$NZ_do}ŸPCzo|~}%66 !1ވ}UaاOj>i,I~Y[8fS.;Dc+նǃ(XIJ@.?n].d-_<Y<.ۅJ1A,þSjҏxֿH·BF<ܑnm?fX1=uσފ s."c l+5#L=v(]?:WfbU]~Ln^kͲBgg)byI[nVSaR3&cmB8WBܖmsY$ڦnGw_ v յwRX5t+!Նuu{ `atUr2]q8k4Wl l5lf@1.Ҵiy$J}@T~d] Uyc!؆UBkZ0%!MFnTIFҚ0h/=S#ix'b pc2sLZ *hu=# Lk׈!A*5zV08mvKMzFoE]K{(n*nZ*M'Bt̉0ͶEk*ҶNOl>1XH.{*u/e>Yl Wyl'DŃ:&H ^+I#7$!Τn#ہd\r%u/Rn_mkqj¼Mb솩0qZa:6E)I˪^a}V!8LWXm 3q9bXh aVź,%(55 e>`|r(^ޑbŶ(K$ 3KϙLܾ|@* ~%VTpwW@]7 ʞ<`T3kcʌf-KCuj$eɏGjL鸼-p$R7l r-y[W[o4@lӤ-J>*F<H+wL. ģ_?U8lW?D {zaE&X]Ţ{au{A`VtsRgFi2irK#Q3Iw @d]aM%%-688N ˟8y#۝Nʼ͊^VSϿFAM/yǙaHy\ 47HL'7 &N'1!ñ7J e>}v]$Ee6VB<LqcoAHjC8C?q]gG'a? G+rÆ{i A>sZ7y ŭQ>Mb?H8! ? q 7|\c Hvv3 DipTA(,SײF0/ smܖ=Ix!8ɊKwE: a*N.%nDGd)Qyp;{0N&LnanfqE[`k"-K W+R$WomG18זj I!鐺!|GHCy*~ntݍ 3Tϗ-裌Iey%#V!wliD3 /MJ|z &tEj뉾HͦM vǖ3E@z(doACqWB6qj"ڴ)kASYI[nb$ILd]qyLuOܠoտ4LZq|gyQM^ūlsDS?gpZd ij{˭\w~jjIXtpꠧ1Io\ioJ\1>:x|`8x/|ru^;pA88s~3K~~oG>DvQ> UwF(ɏ($#WՕj (6$e ow4CYԥ?AE2V˗KC֥|hSFu.0jDœ^?8}o)W8tʼnf^5RμQ12:\g2o6<RҎ.+;Ю/%.r\~;ͼ.ja8΂.ZQ7Ѣv>$u\viw^#vw2U ]@tn |3+c'i׵U]Q3Oj+X}]GF#‚pu:*J4KxzxAð(M=ڄvJ \\j/,謣_YBr*&wVu&$.N>Iagw :%GRR;x7x$ e2,BQq"T;$\ *nKkm5隵/T^4NÛng˂7J+i1k]%dw?TW^,5vߖ& ™B񿯗K$ޓgBzQXvQ*w/u/LյS (lR.V2xW1^e:Wnt,OGސ_g+ZuOI~֯|x^-`7%|-{bCPBK^otn^8 o}]մ97׽Z*5Y/V&Jf}^:YM[m;ř0mtBYaբᱼ|t`qήfe)5 s;̟?֛6)a Q\7 _w6$jFƵL a ε]'o q"¬Z"4y2(*vIÕ0Ta*1ܒ)K+K!k]MQÝ6-LV q֯r*O >@EQ]}㠀1?݇L+-(V!#fafѶe'561=R =[cq5C`[X8)mTGTi&mMQvT-9ooAaviޭeAy l\swX)ѢxK=&XVŸ*P{r,$Uـ*gT׏,wB(ɘ'p/!~Ù*XRJ3lRڟ?KVSɃ삐a%6?ú* wXK-Gh^Fhr}Pd 5?#:ȟQݙE׌CѪVsfl 1ԏ|zBmk?ú2( j\Q23enQJ\YFHEh.5hքV[j!-hT# 0Ph;B*u>9G<&c9I js6!*̆H ]BQ}'uwL)WZiԉKt^aSV;Ϡ($dWX5 FL gt0@] 7NҺns6@EP,[=R=)L`+=G_7' VK T}YS/W{\=U4ů免gQ@< M0UU>wÙEx(CRKq*X-)VnQ3}eȟabT[MPˮȞdaw{ZL`ݷ5*>#o7Zm~"dE!7 zK:ﯽke-B[؀$0Ia_L A_1UpVJ T|%<-riVT@~ug+[V%O(JW!0˟a^6jȆL~Lmk_ EF ##!?útSJ+>'3)D \K$wgNamjȏZ 2y5*HdLa6*X.X[aʟAzKů[-ɭ5M33ӀzkZ9Ɣ#V%ډـڻ] HnE.M@7ʦ[něYG8ǁ#k7" 7X@'Eo0ND#0 ǃ&͂ID2kXB,uQ4'n a8%A>A4 V@x2US0Ro䶭y/nps xʽfc xNspg &$Hi taV<&K( Ubcd15M!($$&`&h6<&A*f"C$$-,,1o/e^8 GK2./im :>`N Md !Pe( %K;+![^@i>}QGi z1U!ms!K{t%'Q$l* ?7ć>@|f|~PK, 7Zye(rQx69A5~a< [ I\oӜ:]o[zu:QՌf/+1X L jp3%l.92HFagr: dQTVͶl^i.侩udB-Jz=č؏iJ^4y#xb( ~"3q;7g)4%czy(/țvXa 9lk mjhId6B5P ݋b8I<*TcPҍ?&/&h% f E7.SVzV~jER7HQi1DL :E T@]r(D; ,$_3|c&:m1[cP AcВ6 R~(+&yz.Jv1q KΦn :śbVƵ/jo 5> Z'`q@62Tg` ٶ.UpתpH$/;EwPfWb$r257#L5Zî 29rsf8FtYCZQ65JihT2 hQy>K%A0 jNLXu6=[Ss5JPosեƠ-x~^禛[I}44]PL<˦6&\ľ!D3O!D`G#!zYc8F#!ꈢvkJx&Zч>493c@cy34PPc: G74 }a' 7X6RӛyEC+/˒?ˈ.x˒рZv~\0&IL S0B,"(< 7L,94]9s\3oI :) ө0hTrؑqc kSFS`ӊչ7L.q! Apx7 sf^4 XIp7@=2L~8q=l~_QDEï$@qX3Hfc J4Hp{b\Qyďjb1n zV EAؤibY$ 0#`"D 츦OV̮zwuCDdm,-08ӓ)\nM3!,,) xD ٖAmŊ`y;%*Lqơh:m Tvҝ̰_b5Tdqʛ9ڃS_;UQ9KCb <TP%:֦t8ES!H!!yD.Z-“@e}kG$=A @{2a$560FMŊf؇8Uczw0" ) McsNk"<ֈnSGڟ*BO٤7,*ȵZc[6,)z#}K[YNES"JCaei ӥεrDE~U{?C =LOjI Actǿ_5#r5ckeB!_rkҘEt䃊wͶqۘ"Ҙ2hN_hw]wuċ%jƚIgCGA:;^f͏f5f*`_y5mMJy9]T.Ժ Qn+zIoU'!n+Hc.bypyRuO[,.!h\$nNB\y_bU:KObgJ 90Nc\Օ_ Vp|{u(f0dy8$ @sɖr*7l?Mk3L.Mv8=pNQEWw+2 R# %#_Rn~7{ufoy#_qd@\G,eRri蠢:L=h!la^7]8I5Uk͢dE!z<Յ!;wP:W?N<"s2gmIkq6O}#-B}\b C)H㳉 >ha!(şM<+<|C'AlEC'PbA+"I0AY2:jBgˀ{h-򡵂ﴢ[M WƉ#]|>c*\}(Gvx>qֻQX@쌀J;R HԨN )Eh< PCwqX8)Ah+Wt~RʭAz\Mmskmy_īܣv W}4\fz s7ZcпЇR `o#> 7C >R!57>])g/k9kkECzw2]ZzOVPci^=PwNs[ȭuΰ L=oP?^_T 0:d?:\{ L22Iq EF&ڷf+I+ K^{0(ý^W;aF ۽NCiɈ S۹·&9Țn IuU:_(-< :KRYRm>"z'Gg!-w]jcAa<9NBj;!0qU̍Vv^1Y(5$bnn)l݅ig봋]j3}bc)`3-e6˰DǹPyWl~r(L3F<ڼOxE ˘gi[$9(5SuV'us% {pij.^YrWA$*G7s+,_hb>؞/Cbk0]פ9Z8B;Mh?u#Oki*j屈s˅_6n*Rc: mq(tVwR7/G3ǬL>Z(ȓ8 cUyofSכft[]v/Xʷh8x9 ?+1ՓHMD A="RZʟǶ-aЋ,B gTi-=CVh99@|u!n/W|\+xve1ӗpW,f'{ Dž;/tq-x#\&AR[4ۭ'ءs.i|KAւI*{=X՘E UxoTriӔч i8f<2ii<0񌱅;Lx_|S"* @CgQ, Ғf]ћ3L4s kVT { 0@*4}tq5\Vϕ],y?I϶[u;W bƨX+U$_Nl% )¢Xa"*jNdaoxv8ẙZ'z@f@aX5$$$̲N*ʫpPLp N:lPEPݚ,1y'߼(2IĔ8-߇a@"C:z bv-Z.7魄)'9 B}i\ZZYŚ=6cڋwВ.xJaOsqu.'Ar.>ʏZ9HΞqŪ1<] `rZKb=k2j֬r=4d- qRz6"<VXryT fɘ*zp}Qwsp|Zbl%fTGzKI\uk߇ *pTlU]8P*GEboj3;T,sMdRS͚`Ȋs :{P[ o pr=?cDR '*4po>Ab[)#͸S: vT^MVj"CwKyTԎZ̋ptiS@zZ?{mNwhKh5[2Dq#9&~35ss[>$pi C[mmY5N-54;!iޘZp&7u(wk)$JT-ViE8cMP`Ƹmm;{BemPSDvnNn3W@͇c(Pe-e)6d(;?tO52p0䇺 1s?;&C3l:(xq.,^$Γco)PvNbri5qXT<,Ȏ,MIxEӦ8M\.<@usBPEʙvK./$'H`>^M%1g#f2g};VbŖjO+2_ }bQƩ\ޕ3L{4 'OӕQ—7r5$(]\B?6Ej" E)/]iDz<{5 `1%+ի_G*=?*@wLY>+0Ut,?rT$}^0۪*(z1Ɣc"yȀlI tc +9r&m4'7j%)fP%kҡ@6$]t슾jH/3uJB:ʏ(؃Ʋ-20\EWpb|WQ,W#KǨAj {{q;洞e EV%ǜ+o;9p)Zͼ,K¾|ҟn16Uŧm~8?PqX_ e&W0r *~.sy + sH2so0P+ERO#7_I &щKgľ Y- '0"Lb"'lNrvJn迲nsWji7 kfQx`Ə3TMy-,|gT$s8(IoK/^[3T4(C5mZΞ QQ\b~"utǑe>WfEG]e*SQ9gS`W.z13(<E 2A8B6{zb#d́x_>فIJ%/h[=jaWT.}9pΐ )#\gGdA9-OH Q-JOf YQQ(=]$IۂO: ӬJ|䋟f53pY֪υϔYD)IȺ_%"KVA\h.8YAaaZWD \pW O;2iyzͷ24@xUWz}w.ZY+t\uӽ;po<:J@Aǝ+1,]Y}-7΃pt*t11lƢmtX!0.dz&ш 7XG+P'qVbfCN .L8/패@Ϣ)fMLM8vvz_ii~Yʬ"2sN,̰3l>VO'l55TcdqĩWq2gJx`:xquL+t,nwΪ9Q euId]M" {c!݇/v60;S@0bY`$q>/q 0=S.4ץaʧ5v ȭ.$@C[`,bYEN'QqNunF Qe^3EPQLn:4y0Zvc,{jrzMQY>ua'R%a]yɉW608@ mӿ ,4wjf*N郜kLy0[GUGW`,a6񦧳_̝oDƦqىyn]T55:/q̲^?,vd?$9#zGJy[n}, :'k2tzDҽף+9_;dfnc^=0"< k潸{ĞHW/NэY^/::XxL_{y/CMOWw2u*6.s6rǠr]z0>*f&8:w2Dz,4 Ԥ/Q]mZ=\K/=᭻`ڪ=$kE2ǡy]_k س,;_%0st7DE841`NcfŸ*Yr*+礅=kn>k0#u@4mIm|o0Pp\ }A]|o/)chQ~SsZqφZg 8IJtigKh$]0;ͼqKW xz 3qj'"]UyLc)Y0;WS`2$wO!Eq-P]b; /z!]øNn쵚|P'>I/\uCnh.JqfcKGQrkvO`|=G/0BzTH~J'/t̶MǐKA(=1bf'fxKdw7eX"ZNbdB-S/&iGHr7p'! 6tSX]:HMeKQ5[_K[qcClQ{Qz;Zlpiy:Amudr-ñ\7:!t_zIxʲ+/N>9 ?t_gO&,زF-l:5'gcyQi w+Hv=Wch`lx Fy{4 ]pl5 4HsחSp%}> YZYt&<̟].7~-׫-e̔do,:?˕z$ wǖ~;f'a+5X2 'eFkseuי{jꖙ-s]DU 4pܮW!G0k>loPS0 {'PM$ ғ7'8!rP<$v&05n#f%g.S8{bP胗y0&` 25I~5ߪ=LWH3&FW!]zS23n~ǔ=)l3L֦|(=vl>`OG'S˼2u ZI sʤQT@>=ζAC_R/ Fxܾ v1z1lĨnʧ<0g4ySHp1;]&1A$-dŚ`gUs*!0Usj>^5#(6u0&*aigaU9wmGϧ0>Ge1$m,;ރm+}Xv:O*V,J2 lOĪE(D[4  }qK_KYڣd(w:bMs(ʤ<(=V_:POvvخ۵_} F/S%8Bùk+!Jyu^Wuɩ]jt˄?[Vw8ߦS2ŷtZ[6]:ɄEѹT6R7vuwCeM Ovbʬa@]ܰJ~x '8Rtf5XΘt)#.\^]rMڴ!@cyu2}zJr!("W'nX?\aRW&tlz3ܺw'LsZwO]m- MRR7$ÞVn=];~~j',׫.|5d6}NTXFSԵAC2!Gf2m-fls|ݳ.M aV7fo5җtIסDMɷ4{X}6l3oMnCɹU]Zյ6ڭL;,隗b&0k]n͖62pn/W,Q餮俘׊^*S){O,tD׎=qnMptvG:۝̦Ǵ~(V]?mYAwi`t.@=?ٓ~L7g2c|fFL׌?t#B]y qtXDhVe7K${/UކJ*XE+78. ]y:ލr1[Tc /2W.sq\XB8x}+ ^Dd^*x=`&{ g^tde/^[ot>l9权ÑGqy$0G2:#׀qMHF #cɘƗyʞٔJG}> Iv˒ƀԫ2JgWs{||'"Tqws3f}oig"ߥ@ןEV /rEcvϜU8ikW*SYJ_|L/^:ua0Jwa65Y?9KLݙ%zNh?\ϋf-ƍpH9. oU,ͻ_ev哒 >rUb5%O`]Y?-7#m"-@q]*t pLGtYpW%o|[Lt˞J N<7RVY@MGviļm>͝xWO8{uqt5b"1yz?/w5w>НnW 0w0ٓ`5OE<*Ϗ|rfGq5D!|ʯ܇\UxNHim\GAC6v# *AQNU&=m/nq բ%yR @dq.kf0)?tK UX$GzdKu#eo)y ..A/oJJj7I%Վn~ou7xWV~Uິ|wb;bwVd^k[FWL+XFwڦeoˎjE|kRMrEv|Y ya7o&+b {|˜u+"_-52X2f{]~&t] >_o?bPffCE@xGZ686w}U?I6XBipcWOC%nOi5 +qFz?/Pȍ A-H.9 tA]2&vT>dho JѨ }h:*ۉR 5. > ;]߃eدjuox[{x>:jk%.rdCfŮJַ8s7|zA{L]OfJkCT~R(c|TX0ksX>INWh;W]Zz.YS<}鑫EtE[!&nS9GlV)\ 02C6 Qb-ſ~7!ꎣH૯ *}`x8 < piͣM8neG1pS[oQn2GA0aQqF-Š'HJ@ [0Rɏ;8׬-|>klMֽCp;!!Mb}s+]=(`D&eWbw__kӟw~`7 }a\Z?]_71 \fb߅{"3ߥ[Q v,ֳ~noAlkQ~jgP&(]NDl"kZ־ؾ3z<S7~?[p %{mQPqdz2,Bw"TEAǏS֝K,Df1SEEO"~9}(]뽼e`{f%\wmOد,]Ƹb^3Nd_/*a\Eiq; .]8Y K3ov$ɢ. +›W -g~"[ @Të.4+45G0z3%3! ('gKimÞpքrpmbݎzλ:5'VC[)E/Hkl.и;(Q`yQoWԡ0R"bf?/@u.)43F%fE}g+x gI/ -׈Vhu$^1׌5+Fb{Lj7P}y>wr BauIفC@eUrm:@)Cg4ۥOoSy2/?2ɕs(-!Ζ\`+H~~-X*3f&-s"^J,MV+gV *.pِ\Om7\uo^獮ԛYeԍ߲ї'z)b췭֪C"vLډYӾNk8R'3f[Nkc1癒'W< st1730aWUF~Jo0EJ%+DQ{*ywLzu/@IEHk4gN<;S$xs $X +i&!II$LE|ǃʏ+cI$#Bz$9r,HXlө߂ Xs D ,R5åO :IO kHN`ln& +B AL,w 5!ܖKM Kt.a҉?BD;eB4c= ܅W9/|a j*WvO7Cd#V8`19 d5i8i2͂k"OW!}ȯa]+e7Hk@N`fp/QxGhٯl]<rDS-ٽKb 6\MԲ:+ JkbǞX.[P.-ͬF?3b\.@Yzc6Nl/BX?y)nH0)X6e&/5.o>/fjjt> Oy$ֆ*~9b?ϫNW|c-_V GXB6y.xGJNCk/j59ݖETg;݋vZn7z7-#;M5~e `}ۯK%et)}Ï2jJm&Voz W~;}XkK+h(-i-iJaW,2nyY~@F~f/5%baCEq NGO/ALGQ@|`aA T#E=aEoYdsj@4O+? h4yR{&_:w~;}Ͷ,P~T bulWbXSךv.zU|xy? yƞGxmwsU)6s/xXoKzػu/Eʂ,v5>eŷ|Xni ysiDz]=pX҇`~R=)֥ۺp[nm]-minU\ZϿ2hC o{>{d{+1+*QZgk/A̽Am2Ot܈/tZ쎢[M## dS32R%϶@vr|v4r3Gl_F@>S-FKWMp)i η5 >*.#V0G-,`Ŏ`(#Q%`U~CUvsm?"-&:e-X>].r XSDhf605@kس ڏ[mhӳt_H{eKd;+.Bq.0DJtEűP$'>ɖB|(B)It^/-^[&d3 ~<0Hzi9=>{34 ;Ͳ7!8?b{Xoft@9ߊh d"8&dmqdM 6luXḾoUg69"WDAbBYR+" +(Z5xEϪ(\U+kEZQ_"VDy试ٯj+Qx"G{gEGV~)L(Z͎(K aQ.mw|k Ye`23]M_?QPcmxՑG=Cn_fGGxgr}@EE'dr:. O~}d.Eb<2<ޓ8rnm2=iu0fYgb5H"@a{l(76?#ow@٦O82YzX聏t~$ ›fhvoYisܨ̀|Ph`D?Jo>BQU}Hmp6â \a r^mVAPfU@{mnlb k۪S=ޝi*b=M쭼)ێ՞`N3|hsd07ۻ 8{!#ȪrnVUqJ0\t=&Risc֧KZxuNqШ<rլU{GU{\A+UmcՇ-& :Ĭd.Ĭ\nݾE>?ccʍ}l5ׅۧiW#}_ry?bKUוq]FlsXn;۷ z;mgu0@ +1brms|Jپ۹8"h0ЭXCƣ4/wN[!,էcP}<޶G]xu<]31ۘ>.kޑ| ָb%k]}t~z: 33~~NK1,v|~be9҇ܘkZMe^>^rp|>H6}MѸiCח~jYukx9;lſyJ׳cDe<`iZ<*HvgqXyaZ7s?L$,6Nz0X׍u+ODO=/v>E#{މkq=Q9M|z[;k`uc*@<7u]M|57M~E2t| .#{zނ*8ˏN٘h]+YݿMl(JV7 KUOr'coY`q=!c ソު@玸{ƂrĶFf`}al+)^ͺ~χ]jaLwGAk%E`@)>IJ7G{t8]?;A2 p+[&w/s۸:n6Re~Q zWu&50MHӨIsbkcsl7Af8/'V pgqip4hx0 y[|*mnt۷.ԧ =>wvy*ߖGu;͘:m/dwXQ\8ؓ# qٞRj 1.}>E`WFe0~d%~Y1\"DtoK)Gnc|5J8Ҫ~GZJ9ݸ=.Gi(!7VA XVvnQXFZ]M͛6@~uq YU'N3kFM8u1{D1QhV'\tXʞ,X1t5:I/a;żm>tFX~fhߒ(VWz_]+_{ %,D L(?Z!_x, _PrˌrmQJ"ԅ5 ^?Nƍѵ9NJ.%Վʁ'K *{ )0RZ}~=1eH/ W4 5ex;j5G+I:=Lq Dk- |_:WcJkwy.MZO׳ส}4Ӷd:Av=Mt[^߂lx\7]%*9*..K]W>r{5*]s;(O0 2!c͊HVB5_Oi-wWnR&|^BKOw|ҨݧdD?kzG2xͩKN]pӔ+Cf'b"sZs0n Zvv"sgvێXUR3PH/Dg}sh=C ߞ8q|\iaI_l~g,%27R>ҡWgqfVa PR<)UW-y7bpfDPj;Ψ֓(~?7?2S~r9˜ Bop.ALXD-NrrR+s Zw풯0Sm,G+&cM@\nf ^c~mAz/K _lxZ5>#?sHmꆛrz' 5ȸ;@[՞cԏV:ːȩY![/E?q!l x~T߶5yTǢ}E\~ZW$}z}IJ:μ$u}K_^_E}]H_$?^%YL~Z>6>_ؐ,^In_k|p~.ϼx(Q \\:?Jo޸$'.X'ϑ$G_; }/R1B+MIcz i"p Gou[ަ2G uOe}ipv:x 6QxDއ9Xf~ 6]mY_x:o%u.yP9ލ{urMVttSY'<`&I~ 7} G(<{'o㪅bJn2_T56[ΌԍDqBXЦ띧B idJhloy mVf 쒂^;;@V>J Y mf|cm#Kkj}ZK<߷!w&uVSAmƫY^sM_ >'4_JUyb~h\U7'Br-f$)q${\ƀ5hI#0S=d~BSϚ}ݔAe3??EBo 9}'K '7ykQj{*r4vw,J;`2qAfOiܳJOXdvGer&쿐 T@^eTccGⸯ2Y繓 O87_"#-Pb< ʫ#'xtͧvi PF?k~^Mυ8%GޱLYɭ3([XBx34]{L2]OL|y`}r5{؋zȚFs.PNqs&!y,RXF?VƳ[]zu.+ɉ=ݚ_O 3h (zeS\>Ws-t8mr3Úܜpp3pchrs#܂e7sa9Mn(֪ɝP_ bJw8v5 oNC.kiyD.o+WIlViyƕuqc?q:癓IV~v=z,ȝ)1f%}E%ae*ulj nq;* -+ n#ĩFkX] |eH^gLm0`5Au~^JO#Ĕ!9itB-&JyX(&K*EI'DTkW<Ązɍx~a=A^tӼ 1ck2e SM;ך:hu T0=2}sEnhms6rFS^VW +i,T| rbZ_ 2W8*Y)^XmW ]wo8|Ϫݧt-Ƒ|nK=7˓tԞYbP[< {GIt.gGJfGv^|f[Sl\`e?^vbXWz|o·:|uO7Z!Wf1n\GM= ܯ4ĵ4Na8Qۗ kqox mi_yd-\|ֿ[|z.R*ȯv'c€bI,8ky67h>mʧ<z1v8*^9rW6™GHGW*~B>76Y,6`f;Ky$*A0LGk~(pl%Apu/}.ǃO-_,ml P[-=ЁT2ηmۏ=&9@26|nA[/;"c-@ƂLUo"CUhlgzLJA2R 2Y'Oèׇ5R ]SLl6L7h~CW4[JA D]نzh/??a$!~?_buJBk~̇k/]!A:s4Q(&v t(C&*7ΧPĜ6&`ưJM~x,y9U@H#]:km)= [ar5yS7>N:bV '}`X⃏"0Wq<JV`,% VB"J>XշͲGOC`f8QTQNaGxH}`H|ʮ3,+F^e] F(EʍZ%K,2:Á (S\03pՒT ѤR@bLc%Jp3?i|i9`$̑M)A"Lh ND4~T d[=Ȯ#qZ^ʃʖt/)I_EECm; .Lfٽ>|avUW {q{(xe]iKWcc5 / "@dg<^TtܪO4¹Z;aOV+riy}w2e/sL Q#_H0s{U)6DBsFē(qc 0Di'3 눪L9_6qP"easDYsQJk<œ~=0SD& w }%_:T-Bp+- 1~Qoh) qG"W< dCz [c܄wqp.v ΖnO@!k\n6K'ŋȚ@ÂxKT[,xvf^'j?d rFnBw#=j UWbGu9T4a#TZWuK#C:ڵ,څjG6gMlm.4;5O]愾lyôBQG>7b[S.|m#D$i5fiߙJ!=~ag-[9ޱK⑪I-Gq<=T٨q?]ٓha(#۳$?P_Vf)i H#!I-469gip؇]&+yse/i[C9Gm"Vl>bO'h YEdlD06"FDFc#±؈plDdlD06"FDFc#±؈plDdlD06")06Nqlq c)06Nqlq c)06Nqlq c)06Nqlq c)06Nqlq cg06plqc g06plqc g06plqc g06plqc g06plqc 906qlqc906qlqc906qlqc906qlqc906qlqc06.pl\qc06.pl\qc06.pl\qc06.pl\qc06.pl\qc{26xc=alDZ񞌍06xO{ql'c=86ޓ{xc=dl{26xc=alDZ񁌍06>@pl| c86>cdl|26>c`l|񁌍06>@pl|$c#86>Gc#dl|G26>c#al|ı񑌍06>HGql|$c#86>GcOdl| '26>c`l|±񉌍O06>D'pl|"cO86> 'cOdl| FDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.hDFp\49.qFhE#<.6ksvb=O+nr}W2w˿iLcڄԆ[gd/c z?XN6| a!n>S2wmlmO=buvwGgWAB5U̇ $2&Tzu&LHeAFwBY 4JbˊwF7ivۍ~r|ӪɼnzC|C[xI3:1bu|i~ N^2nc=z h޴ƨ7=-D@$I<D8eWɨvEկ+*xdN_WOypALY'J"~uŷt0^%bQ8-];iѠ4&J5No4;c&Tj0cPee0[gVݠTUXnzQzmpԎޫ:ʡq{4 Kt2b5)^_16nirCe lxnR$o`.[IT /95E 1~45?GRZCoc6lq~_[I} ghmL͛DՔ^GO=NF]5zB \TQM6sX58k\1VQ(p2q;&j!Q^'WT 8Zܸ8& n;dZ̊h;4Q:(_` =S{gUh<2oLri~t~|ǚ3/Ikq[=d#DuV:d&{|. rǓ mgQZDmzS_ۗ"BHi iJx=OX֙hjR^,Ƽ7oPǝk>}=jq~A+cyh*cZK 4rj KH>g "Ɋ+(Zɨ( 5ƫxeMӈ'~s,Q/C4>ϣzeǻ c>}a}j1 0jo]F^<= } w\=>hz:J_W@Ӂ}P -t,\X /Ф~ТON`է2ӱ,sX n3գX 6iQg@b6vbNBGFdSFN2KoWS:l |0q@x@C^עrINI[DPKmzJDً*>{ d4:/W+[\Kk5^qw)V{56FdGD:WD u/҇iX}6{ r? ʯ%㳕0S2w͸JzJwCZeo8u*1X'8iFQ02lK31T4TI:=n5v݅JłT Xvo. 誂 'C5w-tsš~WI !U Gfɛ61.sWxp'^ݕs?r3tb)r'uta@+^eNop,m>$śJϫyqߢ$XoDz#n{wW!c ʤ>P@OE}C=w߲wKkN2Ҁ;i99ެy4: `" zL@?_K)xڽ]д;^m䕥% ϩ:Pԧ+% E'|İT^>XN}㑺q?ZewVG9Ԥ(z'䈈{:q0O:^T^-MV\HAqZz`b#5N.2)ݲKwldZұ7@daԱ2$P~U/J5ll% Rihc] uԺVV(YA㒹*,&\ޥ/CQh㒹:&UAɣzT1&vb]3zP֠a8[P Sd  0th>0#*wX (~oj<=.u+6fq"W+erC)YXJCKM_?n-YCK֑:Ur<*`I ĒIUbQB`QiUbm0 8_ n 2^\dRZL{,u ˑV^[!A p%B.ZOj|z?0*e-lEZp*NyuW:׻ {XAj;Fh˫i{y|s7ck|9(_I,lix罺"Pe?Ζ. RםDhSل]+9 ;T.z=u/bQ77  )$d,3I"oJv\2mx'5 =MȠiE`/8M\pq K~Ĕ?E#a31SXYr};Kwz>\&&'_lX#)]H{áZHө;`GȍKjGŇBֿNqG: ~+H&z.&UƉcDxulMgs[ᐥ6?JcUK6׶lV7O;,t7y+Mc|Lxg?_~EKd4@PwZ^gnZXveˇ@8ȑ#>*UDH6aמJzGx9ä>Tyt4%bb\U*F)HvSЀw鎯31Y_2pXZ6KOp53,5yyS3&&,; ycߨ 5b ;Y%H)x~t 5O_HǞAbLwL?#RN:|+^Uܑc=K:ʮ+(7.m-' wP|}9^y3H#ZУш5',B>I~:%j/c:K㕞 kzIFno~nHuXk2C }r6 UHG) |%PC*2'raS^c-WĂ ]o%>w7(؏t[p_RFB Y ) ((P1 A+.r,LRl;9 U2SM8cޱcCxaT[J1n'RvcImu %FMLH7Pa*ۀ˻W`{z:tJnuTrric]i>7Gd>l&CήU|A,(@ "K{u%.UԎZ tW60 rzR~q~@S@zU NMVt]~KriϢ1>ʫ1*|ImeEyr-ғz¿1G la_ůek0q,Ť8=ïni_v 9Yֻ'=퓡)V=bA{L(i;IKcD?eZu `Yc}\=z_9q>i4`ǿ6OH>Obm8j6-ڹ+c}܈?¬e i3R aU"O̜DeOL="u%/I1k*2Yo葅X3訓 OQ^:>W Rz2hoPL˗3ib>+Z8(^^x<{,=٠T<_IdSy7R8|ieH hZACj\r1O(8m _[q5+PMtVrپiv!e4d-LK]1̆ ܚ'?UH_|/vp1V5K_ d4cEEڜ}Z_m<}&t)@}G{ܬk|Lk.8sWwW~|7[M?w?}ku&lg:'9a8N'k͏Mَ% lb%ld.]%fqu߅/AJITO}F|ĉ $*'x>AJITO}t)'Q>K RO}njFȥ$~!]F*"1%D`t<gh@ у{.(W!9b睪l74kܳmM7X#4_on`"G6PK6SfR)@ԑdass|ommKU(}ӚZu|?6ϭ=>no6nx&Eߌ}+ptF7BC~j _Um~=RmfuWf,>Kҗ6}ZFxnZ6GlԭzX/I`UM4]TzٛSf17?ƗصXN_|Q?{daQl:6T lv`\7yxVk{nRpqQ1|xۇfJpilijԤl8|}F{PwhJ=kacK[j풾ŨIq=o7#4G{P^::_/ns٧ϻ,abd\ [ƾ`3?_gԸग{-Tju [w|o>\_Tc_|쟣!]ZRHQ-]@r i&ܕΚrܬ'Nl\w-g$sᖬŷe=v&W'TӪ Wcoc.H0XϞsZVh8fyFXu˨}`wk\pwM.s6ϭ8]NͤO=nE\ l#=4*11&q .zGʒ0E`PId $cq-_F_4m39:!e!Q_Բ 9!T\H ̮SPLBpy226F,r!PLFP:1&& 3_MrC};_IJBAa,۬BR C2[vdz&J< %0sߠD}# 3 h " )CzɅqosJ2CCxv9 "02g6)<yhH zfL@%dڍIhìTM#yi$c|'ecp :ЫqK}jaIVf\~ KX"\m ڷ\VĈ$!HMʄB_PH健1%fR|?)._9._FI._&YVMy/֪s^, E@D`ˬfp 1LF/16 PӲ(;$$BƼ0$ΩuvDYng|~hB0̇-BSa R0<Cw?&Ui%0+KѠ^[mn ţ!=/U,ʧl8$YMBĉH)/{!P`ʞFʁd**'{H sq4Bvq<$$C_vGl]%B>Ri6y^phBa$.z1g $) z;A G@<,4(n )챑Esmgvbn0JeA<XR7OH} `vF[V.'(aDX рf"^Npwn[Ձ$k}yVlz&@"J_U<̨$YT5tVN}Mz`B"4Zˍ` 9S/< ˜TrVBbBEP, JxjT  F)^H)/3(o@|" Ti+J;F."bkn;4b޾keTUd-FĘT>ٌ~$P4 zk?6J{%X"7:C.&y K'!-|ܦj;@CCej֓l>] fvN&bqVFa)qۭAڮbRLC&u_!U?HvV4'[J14bXL}KdE@jhŌ!ǏIh?juB< Iɡ"O d"Iݾyh/s4OfŲ6L3{MM焮$RX0Z#oI v+#  !n:_L)ݓr 9 k԰8-$>,ORMb }Igo.%A(˨v7GEUg~j!$.p.< ` A: QAViG[ 3Rs Kܫv-|rQ`ZjVmf9sh$8c, DяH.( M Y3C]Y"An*D{Qv*?/  11܁@nv#d`~S} ѕA#؍izuPN0#d"ч@ IS#& hDKօs7ML HҐRAʷRUPdA, anKmQęxu!PPa w6>q@}Q%J @>+c@!zM6 lb1$̑$ TFj)j5E4R_PA'0i\ 2Xtv{?4ϨL@bT}  ``u/\U I&U3@E#zm[r$(L^/\@C}42hb/$FŖѿX (.\y#rXXt:oUZr\1J`yn 9J@x$Vza! RpՇO}:!PB/' `IR# >TGI}XQ$cJA<&+(粗Z tH*ࡻĠ0q{LmfBYX]q (IiIrUEͥu$;66Aa"/l(A<&>MSD6jQeJc } Ҁh8_۷a,琦JM[z҃$`T/ P3ډ=(a^,: =GeX̖7q}PJ(vx̄dTq= n8`;B܅mk&3&XռO ˹zA9"$B`4j4n4q8'NwQ3.fo^Nп%veAbw4aQ[R T!Z! Ua WG5CmZtUo lx@pCڱ^uwGXmZxdiR-D!W0T5B_jes >t,P:;elG P(CeDqٓYz&;=ɬF i\5ijtE2 Xf̳M 3S,p[ "y"Cp% >H`y.ROf]hH;*WJhфgX_H-PPPꃠ]5)לJT ΂0 G%}$h?e>A4TT,UQ#~%H%O3"$@i?2M8**ET\fU-HCMeBhaKUuAf9sTLUbVX8e"hQ:DOakdo>`[a(pa)KYF@+.9yj9BX~k5 ή#prS+R pÚD)&C/E@"\8ІhPGW0HU @93}}Inv:L`u9^.3)W&krBNӒ I-Fe^2[^3VG{HwF$$\&rNgp‚k|W,Jǡx0a"& 9v`!sU1 ^)B8|{HK,'S6A 6Xc6nY_+up  wv8f iD%j Y5;Wz +1)o+((%5/x MHԌlRY씐Uwq6fÇⰿrWKݱicvd㔅J'MHEҲ'>E%drvĥ><39ziu./N sA'n˴&yz uqa yQP.̶[h򢴐C87<}h t@{=dFHٹ\Oi ڹjj>Y9tM/liSMx>N%M'E A-g6ǟ׬:ՐgNpBb$AP Q5ä} &c@yW$nv  UЦy6)5yuÀy par/f'YӇߡnγvOQ(lM') ϳF&B0pyUWsCUc@Hm; WU Vb4T|/2pB1b1@HF0Yyh tDlKZHK W.l׆P9˞h>."hv?9:PJ=c%1cȍaRC;pExt_QAȗkٸ* 4HMPlC8 ΪrUhEBX<}+K=zIQ| * K>`BXqKI\H2J/"z 8OtBTvVJ4#bB>@$+]4jqRRNfY؇*c'^rX.3۬C}8*_MpH]m)<#7BrU 90;lFKdC>XB@K$6 n0z麂څuɬeG/.RΊu|PL@>A!"ҺT:"Nbmz?r@@2¤בOq y]NzRKf1 aLO/Aj&ᐢ$}"$$/0PD7() )bfGEh/>WCYW`˭1w)gc) 0LL]JOY;Fj< P5xJ8}jĪRbym/zs`8'5yKIIG ~ nT1J c|aJ̠k[2mƱD&W<_yMn/Ndܰ PZ>chP@u\F Sj`G⃐o?H }d8-)-DJfrWäf@$Kaʎ҉Feu*SY8 #}N]tUc  ֯@nl6,^àrqqnB\ڑ\7Oe"*޼V$7-z.jB(L @CR"0=jlCdCbn;WMlHm%4,~ֈoHX~89+) )Ran?qZʳijzT JMZ2z}v{DDcfa 2wGgLR ڣIn #4ɃH"`l̶Vb+T('@E{0ϟm9'ے{fm\/sY $x@W "=;L]![#M&5A blHTkն:R] c@H{  Obĭ.KΥ5ִ)GXLY9-k;myXP_(2=M}o|gSHV@޺0bf(Ӝ̎q= 8phЁjvH#y|4*10g]sTnI#n.uטDJ41ہ(m'}h7val5l}7FXql]z~m\UAymF4( mTs(Wܖ*z!F! $~tl672bN1NF Fd}1Q'i6LPeʫQo|%:d` PŢjf%,b_%q~HGL `?znQqV̓ F^Đ[N؜.4_B?v .VSAHW6-wvżX. AL`Y&|vAgl 3۲`{z-'FLiT^"B:QPlS *ܧ' =qSj%X &6 D"\,}"۴%bQ 1mmF}=?-n(I#ĕlȚ*N}yGjEĸ_|௰f7T؏bnrmJFFX;k.`> &.ͪ./6szN7J0ǀseo:NͰ:[~5S#r!Y,;k6޹j;/0$Ps+MˉҾEY1ʠi ;XƮ*/D ,Ρ^/7]or_Bd"3e MvCM<_ Ud P(CjԴ֓liV=%I$St}ai?'9$X~/|J\9Ԁ"m0X.K )eἮUK0Raw)=abē~J7(ʼn4LÄ^[zjd C<@M.qB<$F^N,^2% 8$1RT!q&*tfZa5%[/(\nJ2`޺hr.$9A4z2 I^ij*iRw": ؖLWדI KX0=; e"65?B:QsIcl %A-Arq.;=OO FYvjun!%|M PY] &/ zK}c0' I7n1G#MyHa:b( u-fv?WX)ؗJz2+ЁH!O2?*—%EJc 6cXId2p7Zi4[-t'n@%@,bd)ON=$obhS*j4=tAQ,Q5S&MqW?gra 8@@F\.$GiP^W/YЏ [_)3t?uwEGSf'Â8u[fIӇDݤ喇99Ü\Št,nǻd} t}tai㖠~pr^fM&n6U\eU-Eѣ8 +$ԟ=g^,߃ǩ/:ꯐ%Jy'z^WUD;i'$i=#~n?zctnop&wID'\'OHgG9'\eHV^Rte D5nޯ?'@6mfFmh10nCd`wEѠ mh}}4Ef A|B@P%)uSrptQNY=Gq8)9 fhh;[pI+4Y>FmX[WӛVw> Cthx <\ij%|fw-&+fv*QLNK,ߑ؋مX00簷O//o j0.2L^,]( D,p&9ƙg\HD+Zhs?# ^was=T7:盇?l_6i8=|~wwѥK[n7*v7yo!Sb ?6'jm/>k D_ovF2)z[ &.Ehg٪Wݧ/A]:uof?-bss[+:%DKzUݹHPQ{ߕџW?=xZ8VbXIĸ-!Jbal$nܹ\͋w_W΄ z|݌޷)asS~1&tKqoZAKXY4Ǧ7-+Knw5ptjjЗmongo-c-driver-1.26.0/src/libmongoc/doc/includes/count-document-opts.txt000066400000000000000000000035351456567454500262660ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. * ``skip``: An int specifying how many documents matching the ``query`` should be skipped before counting. * ``limit``: An int specifying the maximum number of documents to count. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Only string values are supported prior to MongoDB 4.4. * ``hint``: A document or string that specifies the index to use to support the query predicate. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/create-index-opts.txt000066400000000000000000000014671456567454500256740ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``command_opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/delete-many-opts.txt000066400000000000000000000033271456567454500255250ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/delete-one-opts.txt000066400000000000000000000033271456567454500253420ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/find-and-modify-appended-opts.txt000066400000000000000000000023661456567454500300460ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``extra`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/generic-opts.txt000066400000000000000000000013321456567454500247270ustar00rootroot00000000000000``opts`` may be NULL or a BSON document with additional command options: * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/gridfs-bucket-opts.txt000066400000000000000000000020731456567454500260470ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``bucketName``: A UTF-8 string used as the prefix to the GridFS "chunks" and "files" collections. Defaults to "fs". The bucket name, together with the database and suffix collections must not exceed 120 characters. See the manual for `the max namespace length `_. * ``chunkSizeBytes``: An ``int32`` representing the chunk size. Defaults to 255KB. * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/gridfs-bucket-upload-opts.txt000066400000000000000000000005341456567454500273310ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``chunkSizeBytes``: An ``int32`` chunk size to use for this file. Overrides the ``chunkSizeBytes`` set on ``bucket``. * ``metadata``: A :symbol:`bson_t` representing metadata to include with the file. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/init_cleanup.txt000066400000000000000000000014151456567454500250040ustar00rootroot00000000000000Initialize the MongoDB C Driver by calling :symbol:`mongoc_init` exactly once at the beginning of your program. It is responsible for initializing global state such as process counters, SSL, and threading primitives. Exception to this is ``mongoc_log_set_handler()``, which should be called before ``mongoc_init()`` or some log traces would not use your log handling function. See :ref:`Custom Log Handlers ` for a detailed example. Call :symbol:`mongoc_cleanup` exactly once at the end of your program to release all memory and other resources allocated by the driver. You must not call any other MongoDB C Driver functions after :symbol:`mongoc_cleanup`. Note that :symbol:`mongoc_init` does **not** reinitialize the driver after :symbol:`mongoc_cleanup`. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/insert-many-opts.txt000066400000000000000000000026151456567454500255660ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``ordered``: set to ``false`` to attempt to insert all documents, continuing after errors. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/insert-one-opts.txt000066400000000000000000000024601456567454500254010ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/ipv4-and-ipv6.txt000066400000000000000000000014211456567454500246330ustar00rootroot00000000000000If connecting to a hostname that has both IPv4 and IPv6 DNS records, the behavior follows `RFC-6555 `_. A connection to the IPv6 address is attempted first. If IPv6 fails, then a connection is attempted to the IPv4 address. If the connection attempt to IPv6 does not complete within 250ms, then IPv4 is tried in parallel. Whichever succeeds connection first cancels the other. The successful DNS result is cached for 10 minutes. As a consequence, attempts to connect to a mongod only listening on IPv4 may be delayed if there are both A (IPv4) and AAAA (IPv6) DNS records associated with the host. To avoid a delay, configure hostnames to match the MongoDB configuration. That is, only create an A record if the mongod is only listening on IPv4.mongo-c-driver-1.26.0/src/libmongoc/doc/includes/libbson.inv000066400000000000000000000055101456567454500237370ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: libbson # Version: 1.25.0-20230716+gitf89a1720e1 # The remainder of this file is compressed using zlib. xڕ[MKrcܒ& kݣ]}t$jvƿ>>Y*v4^Q*/Ɋk쯏-8tm^ե5'vCB'AMZ$fS^M/^cD I\64@#DU+~Aޱj^}ԙqU!B@ٝ&9D S>5!EšV@U5@)*Y@dWi*QE,MP+$8M>q6PHxh{hX'Ko6fTi#8sj}w[ʪNCʔO?~:t͵otAJS[V0Ba]k{Ur y(O``­ :_Kp<5hpsrS^4 JLVb4}+KwriMA{_k*5lLRƸm"Ĵ{V،S{m䑃lX˒a@#VUQP7[{s՜_JCj#ɪ컴dhZPp"ٵSy%6Aս&{Ww](U>&OnpLO7Cm0C4M߶84$(JYf!0\2n)mNnݯl8@y[0$C\C~4$+ɻ'e4!T@mQc{V\1}#Ґ@nRHOCDIX{nm>{&a!`D\ ;V\ r0DCc%K$+eFЩX[1"JQ~eʑk7(+%@eD{1#蔠87l2 ἰyw>b6,cSֲMj<#mhu!CDu+eY3`ez/[\C_ "sӼH*H{!ҴF*,qB%2BS3NŌS Ch\hH$NoʱRB"tSVBqc_E)!4L=/vt!=V&ԐO )|2S>ZyJ1}{S$xqmI*vHjioY2N_Q*=s[0nEPpRPke!`Ky7tUIka lBj!A価tg-I6rjIF ÒMo/6\ l i\vɟm!MbhD꿂NCN|adgcw#f/G8?糰'xh$& dmTBV7+SZB#Õ-~ƀCWLx( Ih1CV 6FȪd d]xϞDH"B q*u|[CȫbJ)EؖCVC$!:jZ3]8S)sOE{C}6Cdv!Ѝ7IG!j0K:&d s"lF)6@\+C ՂS^s.5F*FXc 6ҐUɿ@$1`͵ݜyƀ7Fe{=+ h6Av O`k0*ycH/,8x ϒD?gn+9,L˴P^BDe1e##蔬=UT7+$8&/ 8Dԍ|{T+ l[ +)N7ے_m+&-8His~Rj% 8Y)Ab k&ޘ==PFg7Mb!Lj*{w|7( v?wZC' [٧yy[OXVlO?f?,׷[7 ׺n@nβ: shُ=S Qd߇i~~h21~uq4aq{3췍9ǺΫDτwp1n`E7:Ɯdyptc!uRWG.Dnwc]9D^mcq1*2\*yO~="ey]ˮ[~|/x{otfGr¦mongo-c-driver-1.26.0/src/libmongoc/doc/includes/mongoc_client_pool_call_once.txt000066400000000000000000000002341456567454500302000ustar00rootroot00000000000000Thread Safety ------------- This function can only be called once on a pool, and must be called before the first call to :symbol:`mongoc_client_pool_pop`. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/mongoc_client_pool_thread_safe.txt000066400000000000000000000001221456567454500305220ustar00rootroot00000000000000Thread Safety ------------- This function is safe to call from multiple threads. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/not-retryable-read.txt000066400000000000000000000000731456567454500260310ustar00rootroot00000000000000This function is not considered a retryable read operation.mongo-c-driver-1.26.0/src/libmongoc/doc/includes/opts-sources.txt000066400000000000000000000014541456567454500250030ustar00rootroot00000000000000Read preferences, read and write concern, and collation can be overridden by various sources. The highest-priority sources for these options are listed first: ================== ============== ============== ========= Read Preferences Read Concern Write Concern Collation ================== ============== ============== ========= ``read_prefs`` ``opts`` ``opts`` ``opts`` Transaction Transaction Transaction ================== ============== ============== ========= In a transaction, read concern and write concern are prohibited in ``opts`` and the read preference must be primary or NULL. :ref:`See the example for transactions ` and for :ref:`the "distinct" command with opts `. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/python.inv000066400000000000000000004030261456567454500236340ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: Python # Version: 3.11 # The remainder of this file is compressed using zlib. x̽r8.xfnϔ*;yHV+"nh XA'%.=fUt~ X.&~FKρIoߓ:'|/P__ݷfE$mu6Ǵ=6߷^G W k?W+Hr[ﶗ#vcX.#A!Nv_!'9gU"HRqsYGf}sBF?D:̋W .Xo[ė$`c_U%A&9hqS]n"iڏcUF#"%%.%"l&-PNN5/1QOE|x{~F] '+LUsHZ/ݱ.pab[oj2FQv`W]<2>C-SY'OX0Ttl= Y^#+c}` ** 4xNA젫IBaRAF"X^>_:qX#3ⅱ)QΌ:U~Gzi滁HjCEPTꗁ]m b8w̸v-|߫ YZIfsNQl)923G޾JkJדX^œUcíںY4'tw9OW k`p!%eO-`d~]X IuL5=hd{ 5Ge IH߫Sݲ+X0U:F 00B= M2MW:8/KBX!|E[3|$P[Cyz- iUsQM*,N*nI8H1a44s֠6)U>mҙ"S=+vH_ G*H_ 3w{~T'Z5PmHۆD6d ŕ #UJхW&ENɬʞXzWch_~PWA gBH #԰x ̱@Q!2H Ĉɉ eQʈvwu57lxK3(D5iJ~A %)8bC6irݑmnYk`,5O|SPz:'.udx'9C[dI;hPpHgJyW"i^X*αC1܏ ^ AI[?=%5ii}^pĉ-ʏǺ/Éa^$?֋ YG"y'Z k ??I ?\XN:L9lttgddA όgi=]Y l$o?`"@&-9 Dǵy "m/!0 CEɍ@$7a0i[4X$EMTAnNzkiVBW$:ȊRr^oΦƑW.Rs5i6%8q:A7gC$ 83Wȉ})Se DOd%2m?*)09wGƓƇ]\50dMѨE\㷲z+7sq0A"?U?sTc-/ȓ[/ȪgND<7p$/9mw(I5ޟ#lsbxM].ǹQSoJ f^l  I$e2Y'&fDK?h+ {m3: (i(2^(&gҧԏg_ )ɟ|MGW!xtR:Iۧx'к~ֻ2*{)qȾ۝:ޅ3 礪3G-"^tv(ZeղRe yтļdi HXM#l'g4Wsa`ǮC5Y=_c2k Fږ F̦ٚEruV^|aI:8wB[@='5 uCql!@H6+^|K)ׄGJC7}eSy>MRV6FEFNHP,O'Ǣ}MʬНfX$x =G y hvQ]o liR&E']B?aӪHZL\%I?̪ⷼ7-/I:+|WG? 5 IܭU5B5qANb+6_b\W{%|MW_ck "rDՅlza]x?҄5誾h_Gp1dXp`i 78&{"J'Z<V@yK|ؼ V&%X4, ֣eFe- *k8{)oxt njws~INy("xjV9H?NS5r{31;V9,X="؏GIeq^KלǤƓ Z ?2ۉI8OBWH@`+=T FyМg'Eyވ³ o>5vx΃iY:"A"b+@C3pSϸUY=T!@?!F(mjvOR@_`Tf+3 I)2F hgapĂ)'6!);Kkvse8\Xp|$Gx Sg@K쓘Z;FZ?^P?Ϛ̿3aeU1*mߑnJwylR"hc< |r=G=pYYsxS_5Ţv%j#1fqfa&{n zҗa Ĕj~;4lْI4te1,:z_\!MJbmjA{hsyWِIis z xs{w}cۘ*lnvkcqBt85aQĔA/@vNjXur >UfS5bxͧؒϗaOWulO9E:$ ̿HDJ`Eq?WH*`$B4.D5P7J69=W]LZuҍt3?6G!k|ak6>D@wCt]R 8A#)D ><,$NzldМu]04m-e*=gGʸxlcFȞeP:. 3ů*1ŇQWJZŠw im׊Xm:Z|Xu] fkHԓ~y;H4I]#z8ԵoӘy&d%ؓz0XLvW6KCx\TV4*,Kǽxf e`㶧LI>@ʃԜ/2JKĿXfے@G@cl!X[ w"m pY':=AhS` !.1cg䧐ٴp"x63ax֒aazB`ߒ"I( Չ4Mnőq#4"2FI#:hKtN,)O~orp,:-$~jgа!ză#[ YpHm#Lgrrw:"NG"DN#.f]# :3}S`mQ/r>!eg^@C1)蓆Fn#O ~PfuV$Ǹt^ Ɯl!H@S/V[ z u]VGi53b3S߆x<'ySs IzBhgh^Q~ށPH+R ?6yM =S>Q*m,ʅ[ 6 l@pxXw "j㽛^UVz6ZƺӼEUށn/E3RWd2m51 edeA?S.ɠr3/[* %Z;oۡ2h&i\d |e۴ftXl(?yCXr;őڽ6OpųZC;\V6fOx_^5n1MpUqNRTӽ)뻅$w"uM(7CjNKSEE Z&3"цPόm` -4_VI-p=F'9gCU1=É6FcTo"y _yjȾ &_'C2-]q1,u#8w"Xd@묚rvtG7$P@_H qYj6jYޤ"3'Xࢣq1 <$7QNu%ZaG¡Ⱥ#m^"ϐ#n^4%=mζ+`Lh:9<$ S_y =4:xs)lT8C;lL8ןWc#ux?kNfod2x1u@R.ҧle,>Y挷^MgF! 2fȳtYga_kk>^L,V4TeTL}020_qB ءNcА7>Ļ~!U df, _SRUO@(Ul nT[?FI^,z%nf^cųL%:36VT=I ˍeԪ/msQ^UGW1H y-,U>-x]{XoCq<ΰ BYJPC-G\1 MAXXY>ZkQY$$cT 2cC _Q1댥AG?mAkT!_ET!_UT{56i_K|?t.{YN4CW1}c&)KDd'E&6#b ĸ|c|򕔤IZ^/rҚ?Yt0^tBy6 NpJwGӝ\V##,=%6~Ҵ(NLhhqu2"%c%\JCeW-yXYٌHcå*6oN6{O7U [cipoULrr,Vl;SUUc).T6w6ψMM%@m ojWm墯Dۚ4[ue:T{' o R'ғɖ<A8&irdNXE]Ow%P[O Vkdڣmǂ8WViȷe{4z2&!nmԆ^6_/˪( ^Rz 3ЕyG)-P=sr.klJS9zלv¢pO_" )go#y %OYrzyZUۇ3šmԬd'¬іºX;3(M]5t6ǴeUYW՝ܵ*C#pʠQQV0xْ2 ?5)3MdRsFzTMԛw#*Lma[fWr6`9y՘ O\TQxeĉ_&ׄ7sJ wO}3짇E,_>;pnsO]2z^nH~S%O_x y3ët@z329C&>"DW5%K:tu(rxv)q_3|}L~M<~LTtP!H;8e s.OY2TrW za2`Lg ܲ]mvp"jI[ҾVAcJa_됶*?`4_7rC:)<\Nhd | @g ˆ a>Nq? IP]Y}-)gP\@+Hk|ip $^cZoΧ̠~ϛPE8![gD M~xӣD,.Y_a|ʰ`L'H9)"9A!1e[F7 rX(6ү:iW] y馧C!(uub ,wdtԌ  QT)B@VCx5BHU1i S+d 4JUC7|tW"8 ?ɉ4 {8HUF ,օʓ\EZ-R+ XDhA[=Fh.$0 ]:?8STڝWT?GѫCR\3 aW$J Qa=0A+,duݳ|?͂n$,Ό,n@9>uqA!¤EW-q A^M&Yx*$gK23Q6{ lmBz9aPoOʳ91F:^~qh*4Ydg Ҍf?{`A0Ox s [PP`<}f;{9n2q>zRS}l'c؞ʜZ`^e ]Su 1(3B9T QomnފJ(X"ˍlQL6kûT΅ :qBiL4m򺝫:|'pp˂ ʶj Vd+R&z'DuUP:s{ TɫG d'h\UHo mb- ^RCW$C 1h$IK!(NNbb2;A/(E^G_yDVԧԆ xA0! 'őt8;u3BdY)6'fzgX"*P5k8]϶ l_^M|NJE˶O*zSqS'g]rU6>Y4t$Hg|ZfOCdbMYIi8ĊJYߵVUuLfiP5JlH(_&߃dCHA=-uh)D%)J{䟽nm][߯B j}L!U!2nh}Lِ9=Io; iVd7xIArV {0;B-&*QI~X ߣ9 Wͅ .zahf,}p+2+HWoEX_ LYWhMs*:g'Yք!a<lXfwPl15%eY{Nl wNYdMUIs_]H[gkN{#fbߡ0/pc J+%_^/h7W<:б?]_o} ;# lcuX2Yֶ[s;dS&#MH]Cg˩^*9 BwAHttG`ϑGkC{!=a= %ޓ&RCP'$"sa5Uw!Z ?ֈK}7Dƕ{@\B #t Z?q6ɰymڢ+ >E,<.+@3_1[j!qA=xЗz[?&Z֣}>oŴlO%EƼGF#]bFs+-6Q #"f L(|M }™<5iiA]J% ,m8o6p;͆!:j܌oB!bנ8 a Ep԰ Pl%uE5Ia1ATt.(W/}ac1hxDoBf^Qp/E>#į4)j2 vFm=1j0ُۛw8󊯻y\y]83ŏ^b'T%JӤtqXVeٍ ]eUJU'W&v\ ֚vAWO9NiU[⸱y24DCbUz3t5"u'Fқ"Ltt\}/!a=>6o@M/>cbٚG . >"$C?CN@딍CҐ#gVϠh=GS$o#Okħs.y \|x3 >̿W"&-1 |IMxNQ? wOLd[Ļmyÿ1u&<ߢ{s*>wY[&hHL=b~n;#MtƵdx{0o=B=Ѻ.GYG$Zt (ޜ {pާu.7>Gzߒj_r` /_"ØCҥ}!![&3:zHӛ^ՉeszmY[~;W| xg"/ɰwVȐⶊqAiZE1Js& #{6&}Fݐ4nVJe?%E(ŵto[nWO)H{{^بF U5v,-dUU:_`2˭m\,;jETD /ȅ) p'pLSR*Yd.qygRI] Tɳ9UevJ<ɴw՛)7_gZSBn }Z`X=cYg<]<;reت3cX樦PEJ桗Ic>t']HC)ރ=]`;CͷN^G߶a)rap>h<)Mq'je uFGRM $~Kk9`4a4ٲ/ԝ[O>q2ORK s"mG`hU 8J[bP*=lc +֜<x_#6xN>eG>+F}&7>auӏq-tĜ@-.d]}Һ_4A/*`W4262kR*`P!mK~:֐ޛ ^UjM0Uq5S){*#⠩#Mp1a|tD*=ћ۶z*a-a7j8p\Ç֟B -v-GY7;*WΕ9&䓜s\;zpE/;\q(ABKSc]W>B;U)ۖ^eR.Jr#Ѯd*Iҟho=٠?e]~hwcp5蠬fZ㠗cU)LDtO%MEeVR&O>´ي fѬNa'Uv_yƓZUp'# y&2<|v|FdȖ^i3Rzx` җ(:%*Pc ;1ߔ ɋ5q+}tYYKk_W D{f>jت`\ *< $FmW}ۻ L(Q=j8p\kἚW!y_A}E9xUYv{ r !lL p6b/OQ^').R\7)fǛe* Y7 Czj 8JR)V\`8WiACs%mCFH(pB89369Mj%/^@jtCʗZw |/6c-뒒cѢ xYpƇ/ogus az UA!e$fa(dP\u ʛ`[gANU᪡ ǣY:I%mɇk" :~.AFGEз_|&_,fn3b>ID}' )jJ! 3#f.#QGSH^Ĝa3|vu eX`|ULt!EV\ mDbA}" e3>\5jR3 ]Sz/|5ph%}XRӇm}D2PϷ,OO"K*39bs JgwP'$А˪܋&(eΏ?MlDL: "MJ4$ %M$vMFNpVEus%I?̪ⷼ7iLʴʺ~:(Y;G&)o@tp_ё)>>l:BTi.>|"Zz{i84|㱌?>C>h%? J1՜a6lWiQQ8w _)pdT6$7:nȳ[g렴4 fK>1hcCP+5mR 9KQ=')&Me du|RϹ=& Q1*5@H9>̤L8DCbp+F: >DS-?=I}&7UUՃbD1 5}ER}IбͰ;0ןA0!KQr>9Q+)HtD#'Z^x3ס)p7I 8Ln^vڙ:2CْϨYJf2cK\ZM գSa&&&_1}DKh&'dH=z,f(䭺9"]q$Zm WeFeG O.'3ՏLI€AqBiw#]0U&MM{;xR/,]WH<ʽ β,>C>rTÐ&rۃܾZ|/B7ґO#ȧ2B2bȯُi/Vy iء]6NX3Ivl>bҪm2QL. 8eQ㳛`ݥi_$maF"~Վ,H`a)sIӝNIL5i4y:$PID4J?UI3g6~/Ԫwa/\7%QCcR[çXR&o~$?ɱfV򞒚?K޼b΢ļd쿎e}}}- 穥9rUC%"eڋԟ[5zD?=OOm!r*=L UˌUXFBId[_yJO{ldc°#cj@H$xqT^&N5x^lN|34 LSnh/JOa_!\RwP`)36IHՉ`HztH 9gem ;GPQio:pH˔ gzK1YAc[DΠ>eEFND]u+x D74jsKUViJ#v"hxe05fٱƠajhyYd"j׍]Y} 5cYP#LT?zcߪJ?A9|ȟLT=-ߑ*iIS\Q+ i\+qF16X$~]d9򮙪R搠9:j34eX8c-mpŁ&È=?+IL}ꏄϵCip[T^NANi0 ɟF;2 XgIKʑ#df9tyH ﯬq*ˏ&o 0GS A{?2'9JKFhEO2[vѭC[9/۽6$ħ'UΏYFyUlަK1WUIHAZ7nz]=iH]mxz$5ƇlAJb ӵ*fZh5+핗#E!Z{3ϝC!ɉ[xP%LX}C 3M->ZJkL7)܏^I[D%5" Oydc%1{|A)/#._eY-KjcuN1K/E ᦦ/E;~M0x[1 $ 7˜ g$S{!p3!Xq p1+)8Cqn$i""b##s!섍RY$n~oaL<*cqdq` _ٝaTlOF9,U <2bg) td Ě&N3?/@lZQsNwcKR~[Ȑ УW)Hȋ~IH\ǀl|NnE/MS*pU$/'$:e=mm9I=}Iu='u56gi{n{=nvOBf{q > |el͢aG ecgîtـ+} [}̴qmKk"pDꨌ4";82[8ڛ}> 'ſ`+C2"L_ݪiTЂ#CpԩԜF9@slCA!"Sd/:|U[ӻ.+HQ^|6EI]kowGB- )@N, _Gf3R q4mu,bpDqˤTMڶVX06m^a&H\~kEXv >A {cb5%KiugzVSX)V ŶmXNE։Y5& =nu6uHNpƃ-3i5E2l"1e0OYdu`miM<]˾+jf^YYT:[#"mC#o_()jct*oadžVCOkr(CeتԾ+HiO% &`B- I#5joϷYOGgCyYG_>&Gp9@]6'@m/.ۃʴRf#byyRǤ(QQ&Y\Ҍ)ѷ^=6L83ܚNK1UR4LϞL\ΉHH -v*#I_>LWWk!pDwE'3-}a݅2O0g\<m^O"ҸtdEJh3n|%/Y8:T$yR쿴*)9AX'a3{,1Y9ږe(fl:S5`OQ,Q-WHO ׽)ZQiAsgiI+Hݲ(QYKN.Qȼ-ZE0Dh9,\:5$i Lh2)f!l+@1cA7Z@M:r=]&Y@Ԣ%4 VB#kɉE y= ף (\Q-gK_ݟ)]`w6S˃-zSj$DPU8t~1Q?/w<\3 T%:Z*cQHDDP$B8@%1 [#R$4}cֻ.lͲ|IVs߶w\C6 |8.q2W8~чd8.=AR{Nz( D> ֦O/. U=cZqy{]2P!,}lb& {hb&+ׯ~P2 h` fvP|2ɯAȯ,blɘ`6W`eB1SV Hx䁛6GޡFxd _~RtO Ӛy"ckF/'-.6ڭǝ@3nU}0ӫ5,%3?YQ Tu(?ILD0t>tI q)dX/q(%&9nc4վc C->$gjJ,KLQg('P.8'CD$;>C}~}crq"͌aP=[#hp/雸?#MdTUf|}T^> gf>9-2F<>-XsDzfu8&1s^!c{ށ=b]Ii7>;FvTljگM8ā%OP_0BQoyϡ- ̟CQv-Ɂ/d>6G? Z׈xEG][Li3fZ1qΑI!珖TMFlgDvϢH2+g%9n?ajr_%㛫J窿_M̂;=-ܟE^ffZ(ݖVZ 8kU2ʮL&!Jϐ?<\aqVkDu_M̟C&^rkrB+'Jgt CaF@7*uw.xO+9UXDi뮀^(}=?u!?`D|Ř{^C]V4-/uV+YD:6]Հ nv֓ xǁV{8.}wEg Gِ det1!j z&r cWن3CLAlM(ʪ9 w0Cf#o`lC|6=*˹%d' kEjsY]Odu]MW[£ݫ>l?sT P5#P<3SS3ҀTFV%HOBjI@MÑČH'h EK␴)|<"}>۝ԨTY"E2m Ȧ;\%Ou₹@& F]m? ~>(䘨S!&:ܸvJ# B-n>{D(Q^OMZcJ=iׁ"}LcCYFz)͝ mﶻY2j2XդIQė~ ZYkbrMpXw=4m$at2*wǯ؊@J~ir$ِ<ӷ u͸gC@^:#0 W/܁͜~$ ?>|;:PԀɤ 8:<`bd<5;Ƞly}YyU_M`+Aq}(3Ր;{x(-)_Vڎr Wob"x=O_^: $,5|i׬2/Ѭ7mSXnȲYL]g+/)&9T9k7cAՀw._6_w,oĻo.f7we<<X_Z*a:GKm_vp"kj+̑'js/я)Y..}qUvnoNefʚ{aOj Ϝ(T:/,wgۢH$zR, ɷybcG" _m~ .'{e@3kعl l$W?N/iPJ%v$)ٛ W510ָ)7ʩpE+=,ax:z~;=96*g+(r"SU\c}swo1{K#E^\3E⺢8;XaJגփ)+gEji;m$*=!#I O4%)y+i̖LzU^ydvÉtK^7Z'B:)sU)؛mRlx6wv4$(R=9NP<(zڋ-/°ES>7ﮀoR:_7nsݩ s$%it]vHQLZpm3UuW5K^dԯ1]7/z:5PiH@ uu||bl[+Ǽ }w udNm1~"i!T/,UE例}o*o }}LʬbC\mRExЮ?3-09Tp5y)lST%=K <IiJT4㉞Bwo^*VVJR?kf~@]w zm:"?ȡ )0pTqN5һZS!3#TCBg9ݸvpo*^?l5#Fͽ!ɉ7%I?~-|Ѧ?w=d|fy ]~<8s{u=M siwuw >c^enW6YZuUQ޺w% \0U+5#gPwXTTt;u՗;#|]$FSsb¯g7Gofhb8}F^ $D$ϮNZQ$q̉{o.v^Mzax_oy߿״!jp|}}ntӴa}^~}X?6r=p"R7b5QJP9؂@-tٱ4uyEar͹ĻLaYCpQ|<b2F @0'rFBNLléWf`#4~FR~:k:^+@I%M I f壀 Nۨa2(f+. 7_ӗ˛uA6|^?9O@5ۻhm׻&ޭot3د7D>_n0f+{~x`/}b1|>H⇣h%4=vOnjTX :0=s'^^GtM݇=#y/oށ%$nDP!f3Ƈok[ r{X;ʺݡp ڌPUL-XKguevq{1Cve UD4 sDY@NUamw@NUa|zxedZT7֢?>]6nxcu;# zwG(.*+h3wg{ ֊ݣgwZbhj=X+ZҗVgy)r4Tvِ <6җj`cE:xݰ-#`['Zs.DTyI]9?u?+1;~Gn]޳;f 5ˋ0,|wyx#d=U/wh Re`f(!IV E_x~LlF(t|{JZW\Z,j6+/SRyY5yưBU,Ŷi[~:Ζ͝_uk2 "Xe3L6v 46y|^`Lf9UCy kwP&II$/]J*ui@KÇXW?jX`Vc|Oܜ$o֯tñ u XOv3nK`"nVg d ?[F~a|ps1H7 $ g`4 8XcMSQ6ձFG@2ck舆X =C/Cĺqϼ| z9oXFS$C^#Jh0h5/Vñ$^Ve]~fu!<.8λz4w>v A` IhUݕ!pxG;6? 6BɈ`⟔1ݎ8NdIfL?osh/9ex^G]c/F{߻vRd>`Gm-$#m=$yitwW]g<ށWwx dWX.|%>Z?gOq\֙V{IHPTypl,},#$$5qL3YZ'֯cX35zЎCp7YW0T{uEѓI< \wYVoehF"tD!=gtoĭYqwϷI{OZۤnǞx7"bB:6(M+*s}X8R揻~QӋs{}7,󝟷Q_(Ocq^~n`%_X8Zl]sćnYֱ<n{qw!|N7ENq-z7rA=73IN݊#i[Du}Ϲ9ܱYC2w+Ut|v}8p}Ϲ~H::'~Vpky򃿈!g4ě]ޤ(i^\qXyf/j+)iUé5*(;v}˨C]{xn+ۧSr0!2mwiJ dž>qOawvvJۂ'q8/%c z-)~:I_g s%o4>qwT Tb qƪVJw%7(ά0U^<_4i>ԃiwb}HEHNT BT'<Sw)Bс+sy+}qb~q^e+֟ikyZN~=OnۄՒEe!,4>ƅ͉7},xT;<A,PunD?^RO'?NdnJF*yLKbͰ;Kw(cr؁ r9~$ 5 c STmBݿcg Y֢vCpCur=fL{_BxlQ̞?3(\;G&QIJtAYKϛ<_ԑxgd9$q>Z:E%qrb;OgIWX K*+qCR:V8yn/1^&eJب+sJ$#SUfq5Guۿ+e+EY#EWd:%U b#&9Pe| ԌXl1 h:6Ŷz'A4Hɗi" %GwΣ;نj2!Wt&V)F>g c~OGOhR@b]q, ,8`ÇE F!y閄":Knu%Yʰm֒G5t;6%$WMtߦ𴧤3qwo}#9Zş,X0>J 5X}tݛY:krޱmmly4y6m|6Oンjl ܊kV0F_KฬVUyGw^P~<{GCp6?Ŏb3@[a# dρS )]7)<-h&,(aGɞ)H6c{zrΙ߉ݭPSs+Hs'5]8!/s8ee1]Ԝ 2g!|Ffxi:aPCNU^.|񫤍Y7^,\xsY;a0LΘƒG>ԆL,,,5Ź 틖@,3o> /t\zQ?VZ Z36WiW %)_>M-P &A?; JX6h A7E/\-1,wo]}/:gs r/}@L+_/[O?8Srʇ2ǶrNWf4ݜӆWqrMGGqs 40,͈4?BOC7')urQaz-t]sqw6ax]e\2k/ݑX@PiIzEޗX&_2֚4xT7OT`` ^4Tb@3]~2mʟK,?C^t_I>.^ U4xCCV0f.4 ]8d=?ӷD IOaX}fU}a@x^]L_Q LAsẐ_gBpHh6?j~n_'mb%;EFP-H:l3.pltZQ9@EI@~ue%q+ *(mhMhm9 I֏IpvWO;dn?ufoQ!P8IjZ'UCg |*\- 2//F~ Œ"O7 {G脇dLQTyPKë)(-iNt%6&% ,Ks\q,x vϓ)NE^E^ L@w.m* #e&Ԟum@u6!y^HKCȲԅȔ( ˔"s!K6H (a5XPAա2_dcF:qG`PhkYe?N~"{H =?0j RJHWdH_Pj+#_c 䙸|2cV^Գg}=k'Kuo|]zo/  I*c!G1H1xx6!;hM}k<kk=Ul>cY؋ |ψa1׹a8K͵Z?g^$fM-׏%eXpWS^|߮6/*{ Cýh"k.o>RHi> S ;H因|) j[`Q@>F?_uU5|')N+a2ׯ Yh0T%s`ه|Н WN(r(P\Kur$)Gn~Oƫ]:|` M\?x{u]-9O{3`w` Q<)@!osD1eG2nZSCN9{W[pY,d$JXTa.BᩆܼWذ`Fr T:F|8်#f@羒7Q˨nu3YI|. f}>H3rǓƈ%Kފ{uAo1yea.b(ݺ:Bm~a_RMg'EW\*hV*\l;tTɶ.7IIo}'ª-s.FB8_2%gH@> ˖l[Rw˘@VEHiiؔAm[fESmʨ( 2ވRxi.v]etKNtS!{:2Q>Yxˍ{CqohIoh1 6˭ ЄsO(ohvC-@]ÐT+Afa&hW%#Yp3J2e֐N3G1;@n5<I ?ED36 O XH,Z4#*=R wƐs:#NYytAp82G2@gT Qj2?E;F4{ 8ZKUץ\2Η&% /c&SBe 51ڳ^@;ąjٚ̎Yv^f:%MЧ~><G4 |WDe[&Kb1soxf\ɕ>kzZ<2 2WtgnB8YWJ:CCU%]r}4nÉ![u oOorGTvyP3 {̞'}̓8B5-˘n]-5^#ȅq Js-StM1T[:xb6Ls[nz&*['u9ܶsL]TҖf;З/X\h`X]nmoc?eH> @gԟxEMuWkRd^g6{NqC+4yX(ps"R@שJ mM+QtЕ6xMtXrXt}hIbI1ȠfD 娪(<  Cm*Y$'`r,#?0{Z"K" 0@-(jfW\ i(vŤ[Dw*MNݧM' v!~#CVfvo¡Ƿ[wa3ٜͱTtο[bI䫡a6㾑eõʏ=Ixj`m&"]AF ou6E/`; ]hcPP[uq#eS// #AA|~(慠MlXj4au/=~}6O~8]nWr@ W$Tw]!@. !頯!-ۄ*iAX/'9*r؋q */*cmN?x0 9#uW;ـ}QZ/xx6/([M'&u7+ojVBZqDr"LHH"c/ax`Y ҏd 3 B㽗];~tC^&|O6?aI2eKh+%Dp*ƥ7̨(2|ZyЮjHQ/u$Eo\.18C?qvyNU6oHLd4;>6ݜ0^pX>8@ P{u1̦ m:#$;F4CK'R~E ‡<ߛ}Qm<`AǙQ5G1dh [ Q 0ba…݂/iux6 b-Zgx:w`3~zLIϤz ms m"ðIX6A"1-I_= H? ո :Dy BnD!L '%t|VGX b%x/Qå7G@iypp Pf.zBi(& @Ǧ$m<@=sL~Ҋc^u<|8EBBUztGף]E~rnS2`B]էmd߯}7%b,ƫ d}-z}F@x2yfƫ;}]A+0?/}<ͦs`fcw8 7Cg6,VjkZPq:Gh9=O/k(X!:tn` LB"߃_dUe- ,gHj|tm j۩Ƞ^1A 5{X=\-6Tc~}ތfXBUD|3@XLb.<3٬2"_(z~˕^c+oQH!F"+x 1%ЋL~P4WOV(l9[o tn $k PoX~?L/z9x@Xy㿀wlx>fP B؅R?hM0"yоfb `)3X'o"!S`<^E)T h ϋ|^|" CZ!/s| /0M/ЌV9ՄZ"7j@& '(h9s'Րl+xF/P3:` u(-j W=j UPh-l 3zZ,QKn qKFWEmZiֈf+F.leLټ1 @}fd3P8nU7h;+"0\p-A {,~b{a37 Hr.~E➐]1Co>FJ9rZ_ES$n=!K$;'/Y\hբ! !Ӏ?'puMI^` >IO+&6 W0lDN}\Yl}aBj,ά 8ֻs6۠X]YBa'ٞ*,e$xbd6~̓ZL?3I8HIpiY%#!Yg@ x&rԏIA쒀 8ԓAN#`;XN W(~c$;DkTI#ue'y%Ƒ11\Uxq_zAGP$p%r󺭲]!Vu߂M\ Os.lw3!0.'6)re::HA%)T~EIC%΍1- q("5ecHDb$:mAs;'0פ~;3uEd[ јmTp0` %rXBZk*tq"R mq&9IL0>,c зHmğ[f09h4 hHb!Gl8f ݺjGUopIR }Xz͓^/:H: jl_c{x@P nQʈj_(D~~DvA]' 6G+]J xe`8$(f9Յ̐@mPAu!a )C?0 0,BB M0Pc9+4Ԝ8P& & P5;Ph6FCіkg#d@Bq]0zLl-ւDexzG!J~Qå)p 5pcqBrĖV`HF @+]ex @ \a@hW hFqJP`lY0cch\+D(Vl^&f$b{bŶ 0CF DM5S&/[YD ~^nqHqCAO,/X/Uo׺ef~R v[5n;߯oeا++$I6UC2&_|& xko2nބ욞CY ͺiJY:8H7mǾ9S}xy{᠗D0j.!w*̢&8m0"ذ(2ED_1a=AQdQ5(΂B8Q m`W~'5(iZQP,x m,IY*$ݡg["6X ieV5ZFfMtlD>xzG+u˃-m9ָ-mEڷz_3+x2IHȎ&bX_2͕OP-^Q'܊l'UTo<+ͪbg;j3ͥET"t@")-t]1dNREhUl4{FS?,:`+,˴mq8?zI" T0|*+L3oC5Oo"-G fqŸ o8|z,ȱ4F> j8:`ɏx|  8NFpF@:qRCv nE!֯#Bt)viܷba'D4\hvYrc __6y9G"<*rkY߄Q8A;?nH99|c8{#%7P@hk\2)dpgh}F78Nl`;"-3; 3ٙ"M; ggvvfNFؙٙ;j&^?`;/&`;5p 1Z^À4jSˁ0,tjSN-V2Y?&XO}4oARL)sҧl lҹȉ`}b~lnVa Mv`sQG:>\yf:L`f: -j2ސ7Po:8r>,bÞƳGd }PL1aaz6xxI߁'wGL=$#rUH5}yMzwts5`\$pD& %eH9+UФ!.&y\-O>O.aYsNLJ52n'_]_V(W Oe؀T|\]|lӵ?yƓeN UCaWI<Exv$dd` =5^t9|4 y*X^:)ٯ2_^L\Pa|9+ B~`_ՊՂ 2XEʡpW#Naԥ@aeb1KaY!_]tż(8-㤐5?|{_aZx$CZLS뱨CG~8#uF%6_y6nCAVZK} (`{*]@VGb]XYBЧU TތCyA+ C*7n>7GHZ[# xze3DŽbDUf͔T]Q0Șn3{ !(4T#`V׏!xH4E6>cc!V/ 1a0ڕ1Lk*fhYBSJX|"lS{ LQTkQ 04ވ/uFrRV\5;C?][\bl$q;ȵ \N(fv &U>ԣB2&LJ!kբl8;OB]9.c \p2ݗ7˨ Y^E6-kDK.G;wTRA'>Sy!/{$Tyt񑆃JBqr]/_| GI\J:<G 4A[^`%ѕ#q*mkշ<'x5]/lA}X7x2~6%a 6\?@ rfUf桟GC)e\h`7usC򓘑ɩIo[ #H ?=$@mJIYm*17=`YѾZhl(YhBqTP/(\!@tg'p넔av,Cäޛ)ëka82#9 ik 2MuCvxtf$V-S_Y#޹XsZ7.~/VToF@(x6nr<ob";CֆU9OŠlF8IWrL_p'Gn-泟tr < 4_%$K+؁t"h!d(=O ճB(P3ɸd`2[{LT9 Ph"+ 9x1-Ai1AJO՗++5<qã"uj‘! @b+:V(⬮9k3:zݚUE3b]3J2ʷA:oLҩMS#0tΔi]ݿ%D'r$6$UrdQW&'ɊOʁ ͂wu \g|`4I4S\/oapN UFiWIs㨮^U]CW__]<5XmR=rDH*`MY_SCIFyҋڥ_C.oSɫِgI'$sʩ.1>(7tFtw!Y% SK] kFr5#eyN4$7mAH&umF9}$@k68X}64Io ̙[;yG =~>}NdSuuّK{o;mt ոp^ю&ءBoSjC6$:K}caZmXa^g].Ga =93 IInx ]p"ɠ~m:(rTU̟T=ꨛTt(;k+mI?-T>.(qVm8WW&ӓC}rXLL+xi/h u)bNg=̍tsXxHdW|!ԆЮrFc-mM >&uP.O7[F)""[ZN@)4-|俞Od=x5L" 3(a|R#Kʈ$7RcLH損;/-- Vr]b- <'PfB&)#?hrC7Χ28Cp_i H8+ីjs") .>OA'q(_-rb|~EKzVF1x "W8m\ECwu-K|V<ȔlN3>XlXuWm!z5 #!xgqmA#ٷ:q*a1#ֶ u;h\`&rBJ=fbqR/ao=1'Wvk%͎OGc΂2Wi V*Ű3ȧN?C :̰/ըx]f֣=gq'}Sʈa?@βۂiYj= "k3So;0n>2a&w3s%:r6d :2G+fQHHX6I#flIظOgȗq谣&,|B(VKP`+z16I\  |_m n=uH/j# @Xک% ~0F>7c2IqÑ0Hlsqfxo,ZplBDK IT$),Q/&Gt!G:^OSM]^K7pyv36: s/"yބR3׉7RZ)кY<8w:BTS2)ѫ!WN8K*;oZL@aqp`hxIn0mLF@TJ!gR:\s.r "hJ?,ed7S 0e>ϋnj+ݰ2 G[ ThAz\\!1".u IEAGz c߈* wn`qzL3dyK,vYMA9OPԀ1= _AYPä2dӫ\Rn5K@HhNXq4G}et Yf/uz!yɔb0VEM'kR}~ی9a:eֵyꇇ1_l@>뗥 {e:SVD?ߏ{aVޣP3o1g/&z#9f H3O@jtmqXj~/b('OƘʼݧ5GjU5Y8ӅyҵRS@‚6N=^/ϹО bs< I@!lX'~~utn..D PxWY,f @a܃HV TA}6_ @5 d=~oƐ7@jԐ=_H 'ų I 9d0.A,z i xJ273Hn&4K7 @h" zH^fVo@[,eogƀPti>ԤFH6?|]^_͹W+$/!+1W ~z,rn= Wπ\%@ЊETab^vz>?W7?6x誗2/s$]mqP$*T,m/7 >Aď4 dt^;W"blMΊǶZ$U"s4W e"l(S|N 4 3!#+B Bm'9.L߮۫_狕rF>Zh# bVvy|"/!fhyu[Rն(ή*{; cE@݄T *z0I|о)呎 *mVQ1tRb7yO8B+^a]}y6 }Cpl3h(&TU:0( @/zς· Slr @,/֊PԂAI+=YALzrK+|x  4}AQ;:շkQ>]#z2th2p 0O|ncx;$]6H{֔{VF̌*'&YjD^G$ (OY;H$NcwjH&yҾ(G#9&Y~rȥ&Bm*Z> G0H0U-~7 < }bZ`lc.75N BEֹ @s1 2#vUa ,"Oz~~ \yQ՚z fs=B%|ʄBx'%tgPP n4`Lpp/eE>LU"2SAT<@*-` 9ɢjӶ'$t70. R FcDw&%B>: ra>c'WcX Ff^& PT҇,Hub::k2xuF7{NXK_o[@GwM/V)JQO_FHT*Ľ 2Sf΀@A E/ ࿳ χwfu ́wë-~z_lM6 2]yދ<74TxA^"IiKO_$+sxE#a}SUvjwh*64 fF‹Cq`j!1wBMl^_XHaU.3a]lW||~+P۴'1TZZ8hBHnIk]o"])qfA|iARf0 1rӭg\ j8'X@+էÓZN!t9oh0YCqԒ4!]4R=`Y2ijwb;YT +Vu P"=TlR<帴I27,˼Lt^GId].ZR E3gqҰ8Qk iBdnꓹpqH%2ڦ^N \X$(tAf1mZqЄGk0ȵJ} k7YAɃT?k͇1LȰwqМʣA/)+7A" H/RAtFTqɍ8r({X.[Pϸz 5J[xY~.>?Ksw|Ǩ 䣴q>ge\rB457kk МdFpIՈi~=eqqHŔ -§ѿw($߾F/! B(옃? 0_1y(pRr/JPB"'|7 A_7_5W_wRߜAJ5Ad%o ;=%Zz1<fzSfcE|*ǧbe]|Zs~af U[\5"ޱ[5~`>O,?pć#$Y1zXb?lsK551";e, eh7m xp<دX]mZ7`XQ{_{Bd)5FvhpE+.&HUD7lRN8,go]+KIeXBB; Z_edcN'xw@JTCi!K}כ;띘0*T5/C;\@suuOt(?-vVLUgl&xCPjn\mwZkHK=A.ܒSFN"O_ݱ4ã=߲M39oM|85oFD\> >Q,0_..]  Eht [[XϿz}n|J&k鱲d9}L|$$+^ -y\/m7R/)p>e\?PgEN}ӳs`gRf¤]s2dCvD.KwiSJt=gcDLᎏoVED# H6yc1mommY>81ژwFsE-h LƢylFWEUTcQLn :vT"t&Y~,OWF-yjvm$KZ-4؎:DS5٪¼&Ku)@]{:-GьjL8d~Ĵ̈́H> 16:WwS~AUs[hqE[W^[u!;T6t,Ui5S.y쒒>}{@)7?>fĿyCopAнGftZl缟{7*0_'76Rwn9%n"m$7?a[[6CF/u{gM~E]~&SG/(2,(-dD?{DbwSp}+Qd z >yǬCh9&P=#_ƯKEx+<Ttyg_5΀Wr,&[Uoд voa\R>ˊ8$} }$y YCW6nWb8!S40rhS#/=*i2$$RJro*!QZ`Iq8mN kgpZ -Y?G<BhΨ& \tC8jc/k_;mL-jM6MyIpD;&Lp,液[b~(7p X} $‘oКP―0eeY#6u-ݿNL34E3#7bHd_K8", (smA-*{En|`z Qs!]T'!(eD=Ge:L罥ψEbƛ72V4͵!*_ף_}+oY~oӟ,ә`q77L^&I Uƌn/0*6c49-YHLjE`/wpvNf\^aVC5=m+@FށY0֓S_3I]uvC/bRw}߫huI6D,#P /9p}fQޠ( ^E -U.ujСO, 5Yy|]X 3]ˑ3ds_c Nج9]- jxC.EmU-WU3<Hp<ϤBtXHs {I'ǔr$R8U2zYvQU4; 8B%w%XJXȉs Kcm[.Y_ /lV32EZ)gm :dr'; az!jVKmܲf>$8#숶Zύ7Yv؆2F1)z_v;cL3[}$vVĺ8V'r:2R(T+Z+qׁtrbZzIs:':^v9.Ά ng3.$+}+9~k$a)v7dNe`(Q6`)4Ϩjn]p>?KkT^=9Sj]&B0b$7|lԹiy;#/XI)S?8dxZd0oៜ6,V%3s貭NSlP0\. ..)j=YP99lF FદN[LƳ5qƫ}z!:ҭmQʳp9-&HDz+=o9H^7j*A Pjb:Uj4*SˀdJE>Du&O趺wa$&ܫꆍҼ)JD oC>8TOGI?j-CT⏄dlFB1"?r;YwG`ҢGqn_]:`z ^w'~lO;ʔ: d[FH(zTM7#~=4]^ Y.eYl_~ٮ*bkܬ ? L.bFz4r܊ή@ %\(eQ\7jx~sg?޹[8iವEڢwm;;[Ρ-rY;XZwn,;ǖmC?/? } yfMi,W;+΅~fsl߹\w6Kι~fsg߹\w6SΡ~fsg9ٻ\;wNw9spd;;wNv\9spr*9tH9+L;DbQyZJ8:*|G煢y ۣ OYd9ypązև)ob4S$WU[M4\i^_iaX -iE99:<x7Ջ UwAJMu߈ ̇0Dfz TEʼnb GBr"!ZwLb/ ~Q R@産нP%>eВֈ.`f}jL1r:*S\ФIhR7Br 0b{ w?r+$*-BefJW{ZKAm>ڜx!U {qƞֽ':fX&Ah>R fZj@}nl?LN7}.3f4^[{`5\oVyIB!C3<~\z=a nƫ [M' f |Xj0!9dxY{K6Tr|6T6}D|T9Vn# b)U^CV`|^0) Tz4Bx"D~'B1{C&K$t@9 CVTo`ac) GmQ"շ-y^0#k_8#hk&f:P̃wV .8,JntW ΀4.4БWApX↺D{oEn)6qJ` &#OgsY;c_eE&Z(#AAfU3KYTX61Cl%%l '`$!IcB9N(y# =?. όWBuWe@ 3\ {a<;OC˛ mG! |4HTw&Amh1&8`OhB~#9T`W ((|c-9^?Q4x%'A~Z-># 8]5;@)[?lg>_lt :D$VNX3"0x4&CK.DR99h$H61tSy񌲛RC}O _jݵmpyA%#+A6SRDT0AG:t#iIf Ў jV+b>A kHBBzAL.?y~cz9C?N' \֢]Q|&z&l@:\HVjbTn-$ 7 f-~7ۧdB4N%/l=gZ&ѣ csҦZ 8g$l9609i._g_6|dG7u>:P:Blo?/h{#\u1Yi"}}NcN>x>ز$%q3*TNz0%3gDypYPnJuKbSCݲ[mi8?Ӧ5%mv(+$U'_?ң:LK&EMB{V:q|Av(N:8J,e&=g4 f}δ3.G(=cv2Jۻ%)[na""K:E_j 7$~{PkkB' Cˈx2 =!2QSH t^_ vuCT"׀ H?燲;Ԥs; ćIcϝ7;PXQ.zTT/%Ȅܐ1󲰡)W'0᷋aت=bzi߆2:Oqv51k3B[p :޹+3$sUH5Pܮͺ$o1~kXKo5.jĝԨ̅P#8A٦G}& $p>?FS7.Hy1G!޶BE1N` pEBBhyKQ4HeUb' ӢjJn<], eGX+ vK(% 5L5PNJ'sV[R0nUn_I]7OiVqpˀ][сvY `nWv1p@ @8E !;t]a /G&GC%-o8 &@80JD) VY8,g8Ғ%k lRgX(JK(RNK(^^h0CԄH#GEGEgPpN"{߶hsEBm-4x䜇h^yE 9]^p;sZxi^qjߥx5A)V@LtpHe@ + e@. |""oDžw#7T4g.P4vhrsxi!H4Rz*T> zPЀ_A 8Nh=id 5@ruI !/ ,9,$NiΏd$ڟ!C=e`c@ Qd *L@ΐF)C0]6@L*Ҭ/ &yt| -&f`NGO~GBuKZj~ e-Ɂ,z =8Ǭ=C8Eo YrDqqm+OS#drKw;^ ?lEAq1"߆o^gMpwNAܯ7mZڐk_ʰAB o"~^ojAZ.{BE-}>#{14^8܆]տ]q\%S!!MSTmWS hz ۂ.5f{{&O]穳E>;& x2Muiрyl`k'9dXy%X7<D.s{@WL~A@O/_+}s[}ՙ/#l@TfX=dZlXg{^|zśo8!y1}:A͇demy?&/H՗r|!Vo i4z3fH]BDZPߠlii诔jz+deQMfو1k2$I@wW!{E)lv Z$Q `O>Y-lQ/(#.7|8GӭH!< \}8 ͅ:zεJG;: FH* bm(`"ݏbw1Tt{AJ_ۀDB{~~biVmeZ>1A}|k8.*h ʩr'8BO/ƒ\(/B-1ԄS61zk2SF޻'tCGc+?tJC3yL+R2hVAsఢWk3 | ?((~HMh k~d{r x8]ddz呕_2qbwcR,k\^8  >HXp#P&4)l}2~5\sOjͩ\}3+d'I既a(1BIm..&}׈Q-n~ kjz&/B9!P;yuTd;8 r==!$ b;*/% FʢXb)|eRuFոi1cl/W/IYdPPÏM9b֜1P|"PTc9`^JׇzgΪ~P^ǃf_iaMc+GT`JDERW3Ehd>12_18eF7q1 Xy%ۢ`:(UNJF>"'9\n^c{餹8rJGmՍdI`&Fc_& IrAZ d>!\J۹Xhݭi6ǽW;w@㰎LVʝBrQqЌ;<.@΁4Y.yhYYIGrm oq1mcf 3g[cD7$qm)W;EEO^FXEHSճxb׆sab #r&vn2:_\<;aB{PJo(VtyaQuOA6tQG'+4l%M䭺 SoT^O mS|T~AeDuj;! ^!U#t&p{k`'s{@LӎzP)7x~ 8E7}Frm+b^| o(IԸ10σ<^[Fg G\6omYֿ}N,t*;t#9vs*8+nOwElE{&s;yW99](?c%VK.Mĉ,Fc."\|dW蘓+'GrI5, ]rtTd]Q:}:WW8.(0\y.qdt̜s>`2Eʪel4۲ѿ*&dE}ך±^PpXX( WӍǑHHɶpɛ >^}#/ ]FQL@34]KLvFaiR 7qOLoH~*?ufvԉ!E0GSER?2u 45ypW[o!~Ũ4:NVA/7zRn31[tv#P SokWK58rW&U<Ua` GZ6Fsz GqTD =SʮIǝT`1%QJ",=F JػlNÊѐB?Q&<φgHUzXZ2˥l_cb AL}RĜR֎KF"ЖH̘ Haه E\lH43@O:|Y bt u("dp)уGy\X[}} ڃSOGG2ξz0Ι2RQǨҮ(VtЁ$ؕҡJؒXN`Og޾Y*a1.gCPG D܇ CN!QACF4b1١!aܧiLk $RYDn6x3P,"VxQB,+eBu gF*ٻO ћD ͛r0;ĩOF9)jp$a rR˩&b:GX͢5fz54Üq9DFT?%Ub~J|q.c"h=#rWNDr_4jo,'B;w0PAQ4 u dAܘa w,Nމ~F%&w`U9GrO%sGI #ŽD͞Xr"͜)TO!,,U^Ni>aÅ iJV/0A9M)XhHr/p.D$q/r{X#*<3XNJ8-(B6$I@BbU/@x(vf?x!~lQw lFt40!/hdRYƢyf ٱfq+E=['"aDF"ƹZBR닞e }#$4C#sh]4jE?M8FlFXTi=@bf8%knM%C>%&n¹)4XY (`pW ˤXٟxL;`ZLA+ڑtI%v\ jSJj&`^'TH *LljFtJ) `($AY) Z NHƄl8a8+Rdp[Z&]}Y?LX%_g]]:S=G0LwU5 XL~ƙylnuiF X½3l,~8a`Wq Ah^-Ni04^_!ILC s:Abxp䟌!Rڡhc+#sPx`JFG9V:4+%|ھOyCVrȬY:<'QC'r8j_;sƨ"~ ­,Ho1 F(<:ƠWٙn^KTؙ~_,=gb ϢIz ѻ(ɽUõ:,BYa1 e0_M1e/g.tv~:zu\OId(:?dnLz/DgndkSq Eͳ>PuJn&Vڝ/fJٮwzi$绗z휧|0c~^M~ɽaɃ3嶫PVzzMF)ZE١ّ| Par!@IY]Q`N073IEyuxDv-7" /} [s{ogQ mE!D1F֘xI>@bM5qcʦdVLU6ҮK7&D ہJ Eډû ij<"G|=*OByLĄӼۃ%cyٽ0;F,y"rQ"rɱ< %CŊ*d}Dk8T&ْ|st _Ba3wapmAZ5/p(HB+?R[ۏi,99(}1H0.lVջ [@a1R WfY+ owBi{Y̗i5~7\<W~M,2]bI BCΎb`pu#k>)s|K5Il91Xզw̱lh47;#5^y.KX9kFH\\jxdr?A83ƪ?_n1e${͕&E WtFh 2o`$BA6r .,_^8?#z]ۍ;Oh}]|)ڞ~) ;4{^ >SN~.)j%V^ps+U A`s|=+A(5ͨXM0HݜDZ2z@+l .ܜ%`s9H12D#C眱P׆ֽ Ne c/=_wɧnw~D:` پ<p=-,^_qDzݶv✉o/Hԓ"׍aCؽPN ;nsnuSX,-&IJ=zMӜVTbh?"~?j|σ(oPy*++4z -KSd3)DӁ(!2Q}Ԡ D) O e>M H"@ u/8zݫz׳n&Y_zAU ԝgyTɌtA&gzWJUMc?͊5#(fAٖj\N +ԃ9,7EiR"yڞ#շNR`oGڃ'{`vy!Ч1M,-[&q喳Pl.>pXR'cX^E}~uce;kz/X.7忽nqT* t<rsvyrxyGm4W{.4&[H#~# Hz-\_{xgDExh`W2_:صg_mI.6o/\7$"y(ˈO"AMwg=NGHϫ2iо>Wh|i}Z.8Eq#u9nMF! :<Z!NV5DjObuP^f,G"Pڶ1N/ORMjMhKjk^p0iˍde"9zJ: b^?>j XFM澎3Mt"H߱7.t( FuZ񒴉A6/R`0YY >By^+Lq`գ E5 VxTC~Z%h*/k4~Rdn|jgC] fR S-%ZMmTnjy.p7g:Ru<^-@#KI9EI<MB9W&挘&3NҨw&1^/B˿VUs5z]I1yC~;i?Mzu&t9bd3HqZoue R\ՓrX.V&lp΃J"8:RM?D1OBF-FApsyё6WTnP\y[d*8YˉAO.'`jP Ƌ oˆAB}c_ я+ 6e՟d8t')n[vd E3u@dg_N?E_nKOB{}{^șQ8U1f +c̄#]4,hXK7ռUF arp=nnC o:T&[ ;:$EE{x냆#3jљ[K##9Xh\Y5ڤ/2ؔ8(,/<{p&x( xήOI xIƒJPȳd~Yt @kQ'G=ƽSHm/ӕBχG/=AZu73Von+=o~\j:$CE: |ӿXR_!1`h[$ViqRDВG7gb; x3T{Zh OxMYU8kIӖ sDDzEu/= 6{ha?Ty'fzUҰuNO q,=PP2@f|U)=ÌMTC*J.as%&Z /r PQu 0K3sNQ t1ؔ:J~"'/!kD41%KIV$&6= ^^{K!A4'ojO=YŬ `\1·"))}W;"99=/WA5!q(ait; 07Uqu9@8(cOs@/x|aWaB+kJDXD 𥶉$WU8㵫oiry]ԹȄHrY'Ue1Ū;4)eS_a[_wWABȨ,`Ѱ˸jR p3bq(&"yr8pG2 Wޅs\f!DC)m)eVEGf#A&# IE`SEFC ށՊ~xϮ\^ nQ3_t\3iI~J%n? 0Rk FZ <Wj@ϾzZ:!e hG奊9I5$!tP 2΃(!h,` =1 |3Kc*;"~JMK] wAWh6{gz vCuk\HYU֫ .pIY5 9$)N0/ͽF/)|"@)qz()_ cHp$C*z08%EȝagZu$:L /t(GWiY˥lYeڲCY&L̮>\XnjE6Dˮ$<@OSsxu&AuO5Κ ( ^t[ܛ,{;kd_/bX}G6wdL- (' UN#glMVT%Ļ> w qśϼvx]/V|9[ }UABYqZ ׾g[vv*󦋙9O :yь woFp78pOU!0q6,]v^oE݉U*tv~:S$j z;Z740a#6koBUz@0]?-V8V*cWj5ôg͍ow־4~Yg2c.W ?9b~DۢQz(e7()Yt&@#P[z4)YZ&"%&8(,s8EۿefyNr*$FL@8y^6nz`w]LI.l[ , ༙ Jo W  ?&4^&ĴKH`$ 8`)}ɯ)e6*=A#>狥MvBwoGTK6[M3bJKy:zvV͎lHP8f]~i&ۧAНb5s~{İϗE֫/":2Y+dp+%FZ p}&D׼}`uU&dW1OgsJw=e~W3s OO;8=bX@]M6ڰܝhœc,=EI [m,.Vkc٧yd"W~Uy׈jwlSuyCgZ{/lB`㘅_m,]pV_FUTm,4'l|)uwQ5+N#d^ʺnIjߪ_ڴޢ3g7>:j{z|>.-btIF]6 roIlzOEaʤ -ɫrEU&u]po+RD-ݞT›>GJ,=Zx/KAeݛdC[qB:,_:Լ"\=+ѣ~J* `:Z&-KL"@{js<$qQؔ^(s*'j NhLPK Nlb_ry;7' ^o|Ϗ<_.ܸr[o0m"߬r\Ao1`bUUjW̛9c%1N~lRXR$i2쳬P|jW<;.ᚻ,8bာ){nj__ C #L3gyFL9*rgx(A_Y$㌕Q\\2J`iVѐ0lyI 3$]5t#n^= o Mi{I.tKe[iaqYQ,}3 ²Bd]܄7B_PWg C%w?Dsrk-ş"nQ(d!~t;2ŴV Q{P`*֌`AsG rx6X xhBGzޣ"8IoǴ:(8j3|dO1Gp"Xh@zHMQbRO@'2>/aCH?$-,Vs@bˇ\c4L=JHu!6͔\O~QQ&S ՚r~8[t<txZ$RDZ-OܵaZa]26+GR)o^6h|miӖ5Qko6Mb9 }\?9TnK}l@ }Q%Hð:*1k /w)sFȏ\>P)Eֺs}t0qGpfg"iX<7Fo!ݝ`byH;00Uw!OPcȜs$"%x%H7 tVa{ƚNӲ;r9 vqhW](A#b1o`|@?yt \hB1kb*L aǀh:p}9Cb9$&MWs:1cf F:xA& q-4dKa5,Qn3?Y 5,:q?>>Of:uKX.pu-C9\WX^XUW elƢ㬰'+8C I׽qsCZi4,'u(B_Zڠ90^|\8TXܻDD`aw+i CQ'W)3-Iޢ2>[9GJWH>yu>12k=_tLҜ”'^D0﹟)4أˋKj. Ys=;߅"o^c脷{Nu+ 0O3$% 6Ÿ(m!^X/J0%hT"KG~,0Z$ Xr&f5ܪ(4}{4s8oCDwI5RPZ]/*Dtf ɚ%wkWޭ]fE~ 翾 v! U vȊO|tM--\Gkex e@nز 5K::$yfwJvOH( @P P&+z.TmtQɄfY)uCHyX/`ePw]"*%* j54Y>s#J%*z]zҁ}"PE'YT!yhjG=K&1 `^.޶uߝSG$[}]l꺜 ;gJHJZ{GwB=\YQ/[/Q(Z}&PƈzЮ)7ki2&SyleC÷Y>^4E2-]B$ZѤwNG[&J׮9jtz2]A/;mfru@@(u' n2:UM9'gg4NuVT>>ZdUUɗ@V4|:c2CkKrMn B^ J[kdU,z,3whQX ϭBC4)# x^4s r*Aa{EpT2%c[RdVge,9T7T1]oW cWגݮ&+8Ro 3 !His釶_Ĕݸ#TU+*L,9].4s ~2z>5^`U );AY98mI8bGx^@|2a,)͢jk,݂5d1w΀D U`jmX=Uq Ӗ àC'Q#4Oc8Qc*9T0Wx;5໽jМ"HXT&!<;'z,KBOuo,pFa3c#17G#%E//H3qzњr\MjNsd5*uF [1fߒAZXpE1RM4 4Kxa)Dg{^ʇqmtC]1[Qޙ&͉[E\i6o/c>!iF+x2&)>gK,I&j(*jp@IYH^ʻy+6ۼW?oM.k3ĸAP4!~s g +N]~4"*:~ !/ÛS~Κ~"Q%z.K+n Q R@l ʃiިFBxX`3*cE^$DXNdJ!;*XP#;.8D5Q@% [i D:i\7(N| `!Av`G2I% Ë#ECtr#@Q(;g,i)"x&fd`?12 X9nǤv']}NG8&Qyx  I'%( &q.+h ,i( ne67?., 3\RҴTy0pjn %mAc |ъBJq{ x B2fMTgp+n<'muQf ^ {!@33o(=Nϓ=\ElJD ErZ^}An(n3޻ȴD|]1ς;vMmzk^X7M~͘‰@yA\JI=5M))DPGVi׊cʤ@2cY(ԟ%&_HPؼY-;`ӿXRO#GnPWb` G1#h*qBjVI"g5Y'bsʗrp!dQv4ܩ@!ƍ{p+/K '(z8/w "#aQOi_zֹ9Tl?bEPBGNe:|Rcj}o5uM7O4P<z{0$g/b,KOTA@Λ'EGIm+|fL+TwEHLZյavp#+)<_s?GK !C3- ,DIXI? m5zua6Ic#MkÃz)#{*Aw$oHș4>vl?M$B`"z=^Rk;Յ.bJѷ~Ba3˴'$&{T_-Ƨ}EN]PLMw6 q3I\gěDU"a sKA}gX')r's:Vol@=#1|u.Y ư(w΢t\y^ !Q<LY;(c:*4}]e}q5PNt@n/ǚ Ο2\܈K:ؓBZ2]1`4s?V?2& EZR*C!(#!̯h7u #'FDY3[ BVa_!YѦo5I6G֎D&:?1;5<=WOb[kcqV> Gg^۔QZŦm69;DlP.j. U@XjĶX#cAy5HۑB t% RÅ9au]6c>`bUqQ-xg DҶTcKsZ4[+G4cK5:'tiwL4Ys:r<;σ+ՙ,Rr&W`QW4*8inQXxHS.;sDG?&b&]&FJxz>g@$Uvv?I+O%jͫ,HTxuJB}NB~~= Cs6O>=n |,K74ȴ{T{dړ+j>"ih@n8 IGcվdig|QM|9[oRcdgdp B AoNA(-~<0[.Ks =uR>q(4AvM5Qٛ`yc'MQc}(]oMpS95 XmuOiBÁvJ&H%䩌 `E E9č=5~ OIz~YjS$:U#`D564w,g8E̞zҞ>-53@6o\pK9;oQz Zh$Vk҃cD~]+~f'*VRԅNdՃV#: qXiwmZ~639'هp {5gK*j(l29g:*>!%&-2kMF, tl2"o 12U6{<={O;#LY\Zpeqjqm{g<ewBfEG1"}pM|wh[#KX1}.ʄB{%kM{G,NGUaPd8avP*u/\J(9no8Ͼ f l{tZ"81SyJN[]~6-çm:LWV{BLceS[̏0o(͡MW_'7%Ilc~Ml˪o/l]}ֲ[[oe^wÂGn~L&t)8칍g[{]^k■;O8va;JYsZ.[4IL05T2z|:8ڥ-)WoVs5[$Q/U6Y?F^o,V'YFlv!p(1{7Fޚ#LX&K@ɫa̙$a˵5h n/\D+9$8hh}7J28AoGgְY3K<3$^C!,R+ ̢m'7,&0tBF|w#{clfG0X](̜kB%)#öԦeV)Wb3ƻO+ۄJ;E gf`Q Odė#^^^?b<6?8CJ-W8m-.|C}ZVJy(ɱq5yrdxwE@֋"<`,?0[u?7=o$i1ݮ|ĭO훙sU7^-~_י,D hȋCIS;,$ҜSAG^ ~ „ Nw?p46?4KzM9|1G'yvxã k,ʰzp8"ʔWo) Y*(Zу%>(!y/c.&iP J4v^˿9x{xoz]zq>Dq.':<z}/nPXO6mPUNqx /͎ -OOYtG-JjߴW(*XtaqܦFH·3,&la@yVhjx)?Z;t䂎@ٻ,%ջ+?V Jaĸ}PL2%l xa_y?I?y(ǝ\P u%'췽@=^wi$Qei bcE|dgs0y1fbzoj>N|1܌?FSGϓ`>px2r>7ӻ/B݋Ɨu dp{ #n8 xC/jaGǻԀ;Vzq4|@Ʊ?>?/~>:s톘} p-0߹cS .=si3H+p MgcX88AaS% ${,vMwd0uۈp?v=Lo`r vt45 ԍm@|\ɽ ?䏧~ ՜ټ't:q<Vgփǥag=D <'%ڎgp p uwt0YC>} `>¿ ;YR]_;k88u`܎3ldߎPmy{7-Xm}sټOU'=WT+S<8jt$6 i^7O;<YXS>8 t_]:vV&+1csrJOY=R KQrw+SS'*|P%p _ynXRU/[fixJ! s9( .xҢa\blOOtVG)NgZc<brmԛmd7\DD.hzpLj['8el^:2OŤqa4D{al&Mv;K QPDfD)l$9zMeG/JNcyn{lyE,sGwʱE >ݭgcpVrBmNmL}k ܉_d[ P}bE*$gK<3 , ? (twG!dX>]MymO}'qu@w+'  f'pܑ+P@3+~m}`.]WTaaoN= 9r8,q~'8hF@LjcCZ6K,icj":B{(;$*\Y׏.Nj'r=N=6`߼%qO7m{ '-nُI$5JIߍwh},zo#bIh*-nPQ]NU٦vHS7BOFdߥ&mjoFItL6/4e:"i(iH[óO`F{9Y1\'8Su#+>T}"Oחx!ǩ.C?qt#JcbrWҖ;ᮌuzZ !=(UލSo{N6Cҡe_T71:d4>Ngb@T5M>ܘՆ\+zi܇/TQ8&m;ԛle1l>KKڤ213o@T~n̟7оh$Mbc`̾EşXts˭9M+4=ߟe<+ϱt(2al27+=#ڝL5S g5.ܦuhQ^Fg'r:Z't#j'Kig`NE&Ig=BUIywѴ3RA>ݞs\<#as=Ihu˻ s4&!|4 nb:9SW`zNJr} `n 0#&< ݙ~2`,Zz4LG׋dp6JAklIsΛd<{> as: 5xΈ#>3L8a1vt ߍg! |0>~a4 n^{>Fu'@160v.+X0<’/sh "$ ?.0Om=P9D6én0?v ڵqru8l!Z`78)4a+q TǑ4+‚z]1)&&V>g' ă5<%M26|$9,nǷ6Pd|ԦF:L6OnFIxFkr>[8B:z.:JVCz3GvNkC>wuE+ReETKy*QO"[x,Dz&xNhY5&w"#u=4*ù4Epiy}g4@/lirFz*e"ϱW""}63r>c?9:M\\u#iL뉯^B:&V%;O.pbGg&} }~Bs`=MNtcb&m:5iԺqXJgXwa&=}eYB؜ow>`'wgf= b/uNa:rX`im>[3%E"'[J>-BȳONyC7o=giREqέrٸ](I{V2}#س0۱5&:L3҇:K2cWsGM{3j`ڗ?bWVѫ&SZRaB<D^9G2];:>ar:3有5L--,-,-?g3 aUQ9j)ϜL`<'MTmEßz=u $\uA٘+s z؃AH˕-l*,*l*L*?J2n H-'cv06R 3f ~,Awp3MFs9Fi N~!Et+ݠjz!%۝9qi`o;kewAX4ns?Ȃ~S۩Ƹ7g$|i%?#>Ob,.|dphsGc&?|,L>wvm87zʛ ?^mmMkHr0o5"m-ޏ_aR eY(UCMSK$KNX͔[pȍU 9W`~y>aS '&?,3g^͔k cۓ'TO<v4kSѕ2u Ix$s^.M F25Q^K2K]1VYz~=MP@o1*RrvVe |~u$|~e5]РMZ˶#](>w7ڠcst_P=`Vuf{Dqle2~X\q)G7WV_~XRجHpƓį§77q9?z%(YJG޾8Oܿ`)T"wlz~H8`w`3vijt"s1GU>Má:= o6[@x?wE]>Uz8L׍ߠ%aiJָբ-1h\v|>NtfۄtBx7Mq`~C7DWPtUobj?MB%M">%Ȅ1O󿠔\b+~09n~4e.qd ^#[ /qu'io0It<+L<蠆Πw7ТUJ;//VVO(Z@ :=@| Cp]=+Kf @^A?0k2oۮ0TN(dž\Xšd("y}IKH[;|m uv-^\Y1YpsE?_}r$9]l Q,bѯAqBIe|0 ۏXMC^?Ds|lBA{&[o%҇VxߐVjQ)e("c/Q[i"x 'R8%Dk>-%$ ޢV+&yDEk֨E蕦ǴV+JZXa mKҋDP-Yпa޻ * wi[HQԟ> rnk*M>Q{UkRԇm̢~4E/:.NYvZOҭ> EM[ ޤE]P hlҔk1G\XH6'N5Eyb*1Jw/X >pMy`e^|pSj/6Vtب+z{ElEV/Zj*9(t/BJ eB*%U=K*s(WX(YbU`E1M?}2$N:r-̖Q,:dZr [TPM^޻¤\xɾ o2A&)*aBv~]2v;2u!?C>C>C!Kw![w/w8 HɹKaM9z/ih)q_\`{(.XG-agx OnƷ#*&:[+-pS}NuTrU|Y_E|? ?_3W0~gL[WW57 _4a?wNS1+_767SV9($|o&g|Iҷ8\m-s؜=i,-$s`ԬAߋokw'' װ⟘:DTnj!&ۗxp%4g/-o0Y ÆF缡0 e3S E xb}GfE$yLH\r:N0[?稍Ph njo/(" #BϢsoQ.aoơ?/râPo0y2\MV;jS]*:8:`6ޱ)L^Q T{x胼UF7т_xOӟΐl8u^߭Ƿ׋d6_0yq |;]1=Kݎ#g|:sEn޺^̃<2?~tݎ气]gewW[gdp7rn4}7r<>\K'M fzs@;}焚zMzP9a>:4098׻|19B>@9+- v;~`{u3s-mD~hhkVGw9߁AnsF5x 0^OSN0z@aS9ekhy;rxO,- ^5A{ףhDZeic \ ;" Al]Q(zp [7ݍAn3\8]\bbp}3kWe1P'fGql>qYTQ7l(oȈ)r=cr?9b~\{Pm)aP| ,1wӑh:m0(t'=f.cq:3{Oޡ<:5ϰ`M=]=壦YOB_MGǓ;v8聻M#t@{;hW?G~0 a3?jсN+ YhN<&pfgI;GmǓh8 >GNovn0LDޝa_}Zost0y7y./=Hu;zc8UIt;|6{o8ua> G}VDՠǛѴԇ}-z 7rG) B:zǓnG$X/i+| طSĚ˷?v>ehh盟C\;àLS fN ۅ1 NP7\oD)j`1OI?*d(1ֳ.cO7Ehvw>i䌻w.vE= HO.DG!!$Y hKx?t-X/=],LEE-s #Z (xГA%s@]L@2_e{!4z?쑺J9_X aXH=t)W܋xǡ<-KD{rq%eXƸBؔqt9hn=O-hZKdv4uJ.UޔQmvA+\bhSS^%~Q m&/2n~m >#(h?6pD4=TM3':++;Em>%߅0 `?w 3Č#`$1-,|9(/CERV_ȩ**M0)@h6IMNA>y- I҂*Kac] CnӉyribs'd}s>H e)#S\tyq>.:6LV9$SZuTN^._*+!dWqܘ3zKB!Xir"XX/қv¢k쁆z%A^_ 筐 \˙EmM)d=9Y4i2\M )hAOQqzgml'Rjh֮ d#scC͌˱;VTTMeY7=Jү%uF g)J-W*KaRNbU;*|GuɎeeryn] X)ABinEw1XHtZINmK +=(ա~abAd(*8t[xbiPI71le2qgx(ƭ$["_aLfo,ʷ S._ 5'UJ@Fu&eoqq%:6ep=Dwp`_[9w_TDn5r.JSV8Yqfpx$o0y`vx߃ԒHay;B%r)2e}#)~$F6 G8>UDS쟠tq΢)&$ѩZIZ̠7ë59X @'X8b\QjZ%U" H&,;?\>(MG<“޾=EnN)) ֟ooԤ]=r*7a .D(m`6#A`5YҷR[q#A8p/,z(} kĸ ^@ݎqWVjH3uhemCa4z(m2020l}$aZתDdA6?a>E96+,UqVHQN TڎoᵩVxăɶ(TuYwFt[2*m,YHe$uMP|v t6F-8-CTHxu|zy&O;^v!U@I>Q_8p׷l!LXwb]G_2L-SU-Ǐ}3*l?$f:=~uXe Ko}Zˆn,{zexqT-2孈>>-4piUkD$᱒~{B1%d6~]B.c -İZOcڎy[Ep<"+dS-͑˫ U85ԩ98'\):vBy)/ZPkZn,blL0=v"pc AnQh!⻓,"wxcw+eTLb*V|9s?eB7z6 8gG;h:Aԍ78#|sm8PEҼ}f.[p\AX^fcwBiH 0|Bc7m%FN]8C7K/=hmIf>,-6*\l47ZeCR ƻ?1̟9P-.'_ڗ8)Z׸(s'࿸K$NOvĒaZ[MwBoȫ>I _1_J mg#jva FOkms)uǕzpf p'Y;QTbk#%7+x|AAy,+j!نeĨ&Kk++F| 0~qb绦3h5NR 6aٸ 3A|QaN/M>:~ ,4e<Xu-5k&[^eDj!JN]YpzqoL`H;<мK:2f.]b $PւBUPj "g2Dέ峱N\1K Z¾V2V m!Q8(?(Ar~dedaPm"ID>۰CA[yd"ۤ,bˍZNc` ^pP!ByÊ\Ԭ*ud_sW:JFB&E|* S(Y*r"3тdǧ DrqXjL. [c~E|efi*ė*I8v%BwA+"t"i$ICKu!S&[Z~VA6V] T-ƝbDt.  } 1255rn"Ѭa4 d`uRame?'"-+Ra5Ucy(Acyn1IK{Sr$&/nـ"w"W%0I? L j <b\n,ڽwy4MficMM@l>.҈4, \y$M,0| "uFxe9#]`M{:xհ3N5Uy#Lu$PL(a˶eʂǏXW+ NS$:5L+Wi ioTu#%>QA;2 BR:hC4gܪEҔ+֨{a{,:=rO<D'>G6$&̎%Įv)@Z@S=\$Uci-[B$Ua_|x6uL3WK{0xɄH`xeF߫SV%P,TDs@$v Giַ V?-/uq⇌Ք^{A={_ i1" ȜMɞkG)#+ݐ9\S4nq3jݨvY6ڥGIwj9'~./CvҢQ8LJdk@qȤb$zz,z }=)qs?[5Z=I[#ZšY.tvȗ;Tf<) v6dv6oJރgcuhVۮefd$bIW>qi-RF>\޹48}{prAFE=mWuk$x mV;"hJE''кW!:ܾ-k< ўjmxVxO02B$TgW Uv[5ޥ6Exrɽ>"MX~XПd -Az—תMoc"7G +r^:A"#nՊ~*K2k֨xRd'l jsesؒI_.@8QɝY=@aqaUk! -n|0`֊BXݒ&"}#Bf@Mgnr78#_Y6JRX&sY[|Vҁrjף jhlWJq NmT+P(_CjGjC<5Mʇپ'+RMhҦ.rR*MvǢdN=boBǭA5.e^[82>4`˶xl`F ia^`뮁xm)U.\R>u;V+tSnuݪBwW_v}ݺBi*t=4BFVv*tFK.;.Н8aTO}*ӭ yuڛ6TR8\Xmd><NpxD dӝp1ywbY2cCOmVBjX7mܾӴ*%^J<˜sh"Bbg}"\W(5/<]+"CB{%5nH 5ZlMMVW-/1b{).ٽH/ iRhٍrqr@@ /a)*u+dhjUQSx)DicyL#KzXRԸq|~ҕ)|_R VEfH-\}V#e&TjƐKu+BUׄmiKA?HˮJU(pkZǛ?䌅`Q7h*4 M!nTo N;20q*vlD;oaf:VKpᒁ_~u v T}YN&Kha8,QE}Sv{O=pJt)2 }_ntnav/T(:3 )WH&-`/ZB-+^VkЊA,'?VM_eo(2D0 *; ~SŶY-U Ԉ_[k^ls݆"k Ё4Etj+<}e;/~+K`Ʀ{9ku[+Le4tp sVwM7S"@횾Q +(`Z&H(B B}\Ufov"`4`ۈ )rk+_Z`J$8F~-j_}. ~rU|7 /ڲRx*} rmN'tx z 1 s֑j@Yqg2AhOz%E#ht'V_ġ6F/Y8oRPoY g|ɁɽZ'=GAIA)`g5ЂYYJQ7rO< ƃrym6V:h d04iՅ_cm\j "2USECۉZr_76I iV u$r^E;4l[cZSI X*lkl CݹjVYZ}|I@RAg@hMG=WEgK%2^G2i+x5Ye!=kֶ[z&$aP"O^eI/NV,[Q*' o!/d5^(@}o>W?u^Ɵ֣ap8%EVI9!R/ Y]F)ZTȈ[ǚ H`8Co W3si]۩H'p&_o3|?!Q/] )Е+au*@Ի@d+sq鷷Af ZkܤlP]of(9ԙT<0SZ.\j]6xpM)][,6ԮP283q6FN52Ҙy6UjV#?֭TH`GɪA_] ME1>:7(tϻAdq q~WT~1Qv&h߷_`&SC((Z{ʻE' YcTtȃa\%v"8!Si@0Rw;^3p\>-]t@>aD`5 ⷪXV Cޫi0@CeG1 p[I^1ǵ! cso|ga{%nlG^q@&?^U:djtٖYLY}a+Չ@&s 4 wEc"ϱiYFDn` f4Yn]6pRw- XҳWG)\`hN0cp- j->aN @uC 5,l5[{Ii:(dQSiCfƊtk [U63Jg$Q.9Nɠ/j2UO\kYg&S%%&ҿEuR9rSq\~%9]Qy9? alVܘ}fvAc y%AR1ƫb[4B.LE/iNl9!GH]əT\r.}J1Dq G\7r5ˏwӇH4T; Ki{5ߡ9 p$ eg V30*e'Mxr욁OЈP@-&Ѹ]-~_O7)#|&1jmv,o$U`~\II`BTjv}DP&Nj 8VSXCM*V͏ Ρ]VM=-x7q1v* D,]Fl`71/J`mBU<թU3M_|;;yV^Nt34mJ^.2ks|ժuh o#Jny-J_¤=̧\~mJ׋f]$rI\"1Q5(ME^f Ⱥli/;!wz-D 2לhȉjc5IW]+Q Nde4Z(8T~N_J5Lc7 cwVNd#ƔyvRf`8wj섎JZ|:uH}dp*C&-KD$],Z[eǑQԃSƑxw[fݣV؃$IGOe Oqg"Y*Ԟ?N &snD:VtWߗחߖHtYeRm4R_1@Aq,"pbwwq^m]cg)xJBg}Z'rTE.ad+hݮֿa/krH!lpR,a2zM{nN3\E,mbef G}tyW/PjpV^UV2Z-t~qӑ#U  \αB,oT1_{n G1zx&Ev`zgՋbٔ[}Lsg@" pYBq# (3ʷ]QVN vGLxB')? bazyff(Y\,JWh%@9 J dTO$礄elZhMsڰGgYI/GfY575DxAl,Ъ9BKoce:_ #%&0y( #|thӃ`骇3u1蟿Wr{(0HD4o c 飡p+&G 琔V2TCQdDVçavOXvZP56P.!D11qQ ,t76".FtLWMy`̲*{1;r8φNi f.:^%&LpN2nj'ȑ"G"܇?l%~Ge1H`?V} Ğg{TuG*x̷"(SeC./H/c,%uic__kq w{H Hȟd~sW0~8 WdJN4(wڅjkE5*:5}y:{­~Vc;l]`jI`qŰ1Tp.qR]7d""U@Ls8ҔK"1zhhLoaFےލT rKbVѨ;Ŀ4qtʁhr! k[=e0PLJ&KG6WC7C:>|#ՊM78Z\W3#{"m1tJg&h񱥔<- Lc^*'03ϡu!T J5o% Ќ^[#LKR*ӈ&kiDQ$RJޢ4s 7_bFYJ'%Uş+;1D:b.>O6D"kFB`«:0t֥Nl)ŇE֝ᐆK͈0xV̀P''JKĕauL@9sͥٛc3 5 ~mU2电 /ӇRHFQ⥓iL!Y3'CoNE  MXsZVZOpX0VR.IÐ%\fAרUnx4ӷE~Zb3W|1H*}$3!ipj #{na @]F%֡/7IS/Xa㣥'U)\׾0 Ȣk灛\y'+{Ob6hltg R Bw-ƠW&)'~ͼ1J—)ߢP@٦Ť83CK^ꢝ2W(b jBv%vK)SU ogh2V铃(:=p!v zo)%j1YHAO+Ngxh l>d(ڧF{Z$D0 =XsK$=mvNDCRKqLS=J' Gufd; {"Z Et7ϸ!sBZ\kq+:ލJyu{妋@uүao!X jm`Vsցw2| G~KIAi@4QjV{s }: Qy.׹5~qt(mu(Y|C * 4UlA7u+d$}PgWͬnC֯x2GHR48z&Ȟՙ~ i־ɲ|o<ߨ']Xa|cRɎܝH! VwuBAbжǪ֍1ZϦ:V#Sm@שnovPNB@xwC ǭ'Mn ݘx,b)YOMX,V{ZB~9K]By0K,(XNK4b +'t EV^[8? 0% %Ap=3? 0` $;B<W`Yrne٦N>H@^To(wt\kap!{؋ͯN9:/j_'uͥ?I'JH&m *է KɝiiPMǝP9wϊ`u?,]evJ|9Χ|&im%r5ٴ^R 3QG??wNVK;S(/}EURU,J5MλM\_;KiE>$.Ӛz&>̓,kVjV.E&)'QI>9hI#T3%U!/'(j}jx^H*5M|wdG0 o7ΟA`6l"(O(0= rYȎ[b3|rRׯ2URYse]4u B$I71o [$\q̆2%$H$0"Qԇ%>Xv\bO۳jS#YH)9`zęU@]O9í Pǵ|ݰG Jmeh#RZp7:7boc?R'76Nv_]zӚL~\&-:ZeiFER=fX'cDvegxPH,?N-Q]IJFUV 'E¥'dߞbxPUxqw)d&|3b*K'"Z M"B*}*c5/J4[@)fncGk\Ș嚉eOe1SfmDtwe3,>u~h^ P/1~XSERRέF+J'~-0[dԎю;G]huz02cNR(ٰvCa F}aU>ЫV*dّbȅ@&Ì[HXՅlXuHL YT #ms_z|C]U%]E4iYe<QLA|f4p.ZxCgDAI .Xf铷 "zL~T"Lua,Нm`ecnZ =$ܵ[˰5HÁ,<'wu*e5n Ƣ0dT-NW|qnѿUqpH2M$^qIidh*y%$s}8VdkH(5y _oHsIg/3̜I\vU*Np%hdM>v[v8GvmǙjPEͦ$]ԃ`ZlE_Nv1y>u/Pxж*F}mDIo1Dw)2xkÉ@/*1)LQS˷S4LDVǩUP1OD”lMnv7L A} t.+h8JEIީaK7=ֽ*J7*L 1QR^YRk4Q05w-/p-ӓZPL*|T\,F'X? ?#wq(%$-_&>fo LiY~\NEW+PS橕&xPiiʌf)8Td裩Y4DD8ʹy לX`#K"*Rw}+~տjlZ>_T([Ϳ+T{eAUZo'_C2/3V,] }OS 09 x"dK@p?0h2r y/bt2ʯ((Ƣ!0LDd >܇NMIՔq}Z[GdΙ*n5hmͫtp㊛8\DVʑRGI*@bdyx2i52xeQ7[9Jѿ1KrQ☧uS=4^]ٴ2iBXꜮ}VsM!R JMa[y2Bdym*QAEV%S:W.8ghiL Vm_Qy8oIC([# \ܝHł=,t*cҪnuJ49M=OwlUux^-Ĝ$xE>M Ɗ3xZ1sa:5S^t B@Dk; <<X3\9`|sC$:J FПhݳ7$u3=*sZ% ͠HcLZQ e54U9 Ԛ3lI{̷jB,`:Z ?+TT-G bˢJ+pKB\{γre*h4'r)>Çg[?_Is \V6%AW+h} ~MޘI)xbO _(!Y O8C6qXU&aCLW0W^Lo_*jl*!͝9lO5OwF6iMvSZ4VF!mvQ;!j%yjK(Kkp*R5o[x)?>I¬ssb]gY) m,Co rTv Omy= 4bn W i/m.,HCZ9PK[V*4]f#[)Er.Z44U4q .H5u)#%ytnB͎yL.'$=Tdl4"R_Ko?|x".tK7xèk myUeisQ5j)̨DvL9RCJ-TZQ^͆K{.% E}6;vlːG1 뇖iV椯Us+կӑ@L{5}-Ra`O.b M22Dl&E<{2o +Hl9Ey \2 ){1dI)c54vRq_6|+Yje\O N3^"8.2)2 jy"d,D)@QK߄Q>C^J;5=\KrNl< m]??B*rƨIrBVZ^Q4S$= N5 1KD`˕J33rބoTUOknHnơE`"o(^& rֆ;H u=MNlxHCV{ϾX%ΉIx#K7,@D+-CnP.!=aa7CcERދo|Ȍ!fh1j+8v^9{I ZwGRڍ#´%H]12[G&mRD)=) (V.Հ#oD5 u=Gu/`=25:[2xTnwn3]fҭI>7 W"Uv0=MpRx#uT2YA|zì*u8Ma+3PH>3oqq8(6w.%]˧CFh;o€h>⑖t$XR44'*N3yPX˺ lmGDgo51eܴ̺:V{8jLh> 1-N)f9^@N+{ņoEYF_ Lb|1LdJ>`~d-=}?=aZ/?_x"'7x IMU^Q|}(m' MT|Q5: =ذSm?s[jRA.ALﺷNg%cƫLd( L=eLM .oK78Ssp"gd \Bv?7J1oI g/?s5\㿫y8u `Kw'\ z܃s%Z8a,EF5 #1.tɧOIQpFXoˍOȥDgDrfJaK:嗯Բ80[hڧZՅ{FE͜f+iIsch37=a8jqvY+iTJB'JTv#nS02 OT8/TR:ee*"=e%8#Fe:bִG뿝SyZJ  _>$93ĬƇV&ؘž*V,N5;~c7uFP[QDC{|\@^*C.Sŵ^=HoM&K i]QQY d`6ڟXPʠ&AjIF$ 8.utuG$1әGQOe+E6oVδކg@Iidl}XA ɔV.jPHݨtG&ЧVUÛ@{bGR*vN]!4XC''{Fy0{cuSKOHnᗷ? U|u^;o(խh:FYaCB3#OtI E msӥX7x&[Ȕ JHt\|Њ>җ@*Pi np=3RU{'] #.|)* A:\, x|sT,۔(#*Dlմwpق-eۙuuz/ T[1NÎAX&b?2@YXߧN />`4JB Qp [J݌_<3D%]V" 2ЫoGtt⼽%c@<` Q#2^OJ;T4W<4 -)`pX2<ӍP_`u= ILߋJցv_z!1{\7eQY b?9;T'J:~NVBIGS Z1<e/ߦO(]1X(o,-#xL&=ʸo6d )JƫQBi'ϫ\alBll;k[q_ 7O&!ә)Ƀ4F"6o'ܠR?_ulQ<Aۈ'"c$cA&.ӯ蝶TGܒwSeARXx$I.cC-/R, oץ`1EdthҰŤikNH۽\! u񇪚niߥ}ף(鞆~~0co': } G]ߺu]pDT*<ēX>w7SQ `S*%8vD ?Heo_:=4J|ؗt>}ï=O^p3MO !n, l [/3> w^ޕͶdزtAx/w4h;(@ƫS$ ) ob?V\_Z 㢕2JI?")NzBLS] ]f0`˷Q#%@Yk`41 QnPz`#S`T?3j7e5Ѝĉ[RbO>9~6ytV'YGHTadtC7c=t]1Uq ȓVt-d\E )* *ҁX((C6X۠>.rLXCSFºNrld0er1 Ź%\5~\7rI ( MpBXKL3"śgi -,jXtjx_-Ǿ\"{کWDmܵk^53kq2Kz s@0%C",S00'̣boW:v\/ݟez(šXUuMa\'"ap;!Š.N)zZb9Fʙvj;뙠] W`vsڿdv;zLPIK~sNR f m:SQeM_*ͤ\|_S1yMG$1d,YJRe2V%?2'Iu%6]1`cPU|q?%VBKȳ! ic? ȫ*h7Pq>n+=aͪO?8b'X9"]KGgMZbgp]2=[m)nCo4T`x j6t >P<#\[/ss#7 k"d=.p@ ۊ0P0

    Ҫzd x2UgYOu.$.Zƭhy[{2-"+ ,.fbi *)bkZ|d3 W[9\c\غԑ?^e`7\DJ@6. ϸ-%kR̵TFKnԦNK[_g`ZaT0hV>׌S9:6~%VKK/-Z=ĔrRnqJp$pӃ:D{MүM얤 <1 G LHAy9/*与yB0-5{!iLUѱ. \}R,4Z]J20? # 3L!VZ&O mGSu=6<{jo1k7 Yؑ3jt: rIJY"p9XIpLt]2x"8 aj+))qB3~w E;pyf </$".\˂d0Oua3(U/īմK^_AuC]{^)Djӵ'l%AVbEydzBrغezU@KqtRU3npOrTn(@4Nˏ~R}u7dX!Zu*szw_Zx+_'o?0t{f;5)_y=\!++Փ A=gqb3._s0b>^N'KpfS4A8)c$%Rb :sA=:i:M <tXyQ^rK,i9*Uӗ蒹(s-ԕ?=qkw7BYB2Q1``z]<-<ʱ8~XaA D!U- jq*Y\ MLyw']I 1o썞!zH SYL 7-|Z'0‚'S*!N  R 긴;Y3vbDiU̪63f1_,=LfӣGէz*`3bߕP[a03rR#1: "vDzD>kM4b:`La f7Zh0HQU~Q0Hy6xuL;4:&F%!4YbL݈.]2̨8F5(2jY5 Tu2k~'X)ǜWO4@fIy*# K[#0jA) R+f+q)-D/^{/E_%ӝ?3w 1=\ K. 1x3x ZulW(D0NQ@hR4/ܩ^Q,$a]pkj8ZVl򦘊CЖ5ϕ]';ϒMWX=w9i<3⑪Ljaf@.駜>@ s80&>3ٹȣ?rsyP4Gwc;{P)ɞmt캒0#> .->Xѡ;K m Sܭa$4|풠_ ,wdT#SLM *TX7.bl=&2Fq*3t&V=7QZl#d#SB @r}-*zwHi+q c4@_X9-"H5?Eututt 5.`( >{Y|eo~ qt)ַPSKT1"U(+z#\%˫,q ))TB,ibm(c>f!4q]]SD+l>0b1FzI\ҔjsR½1 cQ{Kppto$WQP[2K}Ё]D'd`1* sA x!U~jsGbM1KzkfD4nMT)ۙY^~b VPS"7HoU-Tf؆v_oD$lpEI9@^γW1D}FiE^5:+^.@'AOB+Z/X?_SH嵋R_oCz B ^өzӆ{ %96Zۧŷ{Hf:Ctl&%Z_g5Cw(7 N#@k,^ G20|0P7u'DL(A`o oOgtE]7w@w?-V{]7yq8Ov`A _ x76 w_/|C$Л!s;M1M#K9'+}"6у>+s|h8Al/ /]Ŧ>%ssKtNUHd$|!2 3Do<.UK 5 0#P`< q>gȵ@3AꪃDܘxi38r*ԬUTA¸p/32b7yߢuRRcc޴ q70߾a ;"GqGV j(c/;ࠃ>uA5; 92\οS/TxN2r쥑ȗF*]n9% Ts;/܌|y b`֒ˮScBU6>%{\q~K3G3dMatjBsZ|],1>hGfWls&EiZzh.opwC_|.I01sUmeΑkjzQ 30Y3ZUNǫ Up\#5$+ )q، AjvaC]h Ps%,Nnqҡ=wezǭcG`jTK=y%ԓmٌU~Bd5Y%zbr 1+=d)n'g:&1AtD0Wop;sDam*HAf~ᗱ-nfDoçW>\|t}'ؿSG^2(oy@#GK'#d&ar 'B- \rʻ*TYbfYXn{:/DDr漿IsE{tց eewDX7o0ї`눍q][kNf3J\oЫ+Me3P#fi:,_d` %eYR4&1@_b3'A0E6tFg9{Ĺ,g㗤#FųCO8"bH| "[yAi(J v)c_bd=Z|_),jXV%15PbMkdkMֻ%?;"4T4ha81ΗMsijX1cueg"ќrjDNb[ݔ&b 7}.}ݦcK&?-ȮjD>q`~!NC]%Nv}遁TmY" 7j)a1cg] *#WUS4CnwaĶ"L;-/Euvmq"ߝE 'uׁh㮜 +QȨ%R1zRAB]2;JN/ 0Nz> [,f1grå_7N]LĎokUcۯ ؕ滌3޵Mc] Gv-`[FM>ߢ>h=2`١.byds0Bi AѪwt!{?́땽j"zpȚ.yT?ecVn%!wЇ٭wF}̺u +gcDRݭ6&C^V;|7@i _ wo%3rj%lv./l<mb7&`Gڷqp{\dJhdW\Mov 2%[n{՟3K=X'v*UCw?}^okJuxY>uP=rwh'00ɞ'vf/ s0r9\C /k_rR-Kqu6c+GV`*k5+iߊ /gX26ɒ yjuE-x6i+gI/H%rrYbΙz),fݩ 6wckK&YT(ZR&+Y(D)X&F(bgTa\I'%zL0qk뾗1Qt‚w2)F ^5 4 @7x\L(w8PSR+ߗUb3|ШVzi^uUeF+0sڔQ@9UfrYZL<~j!W9RzM2G8NU*`qMV?⟰|D+:Njۘ)gX;("VPoR`~^F ! Gvp(0[gk:]ytFfV8)c ;(JFud}@GZ9Bj[D(wQEV{WǍ(#C&R(}pia˱zϒ RqvE7Q-mb]`#tLt;9@[JUir9M9_ZDo:t"5~gsOw铿j>rg)koIڨsլXFVEM  ;r7K"1QIzЀª\23Gg hGEZx6zSX>1@Qsdϓx%ҙXU9w:(dXpPYP䶹k*$X& )Op[H+4΢6TT?\32Vyc&*,J6$.ed *_>K1cLWs*R ʪ4pu' wd1FƟjj&6F*V{5)9RÌ| G5CSͦ骀3UpiRшkaMq,E.14\S^TLACh5 h6r`&6+L'.O A*Q;]!n#rݓ?HF ſ名1P<&KϐhZ"xHc\#:#Ο!_`L'"1k&ZM)A ^&taKXbR2mPQ(yȿ>z^PbZo q5s GfyG'OPL7Y[P ]tVutp]Sb@lVI* D|8R<9R6P%+?+^'T_A caa@ܧ.xF{9m /PF: EF8R`l {#^8:Y= ǔ0JKVtIh Ц"~lǤ\wDzZטl"Ɍ;]%"4vkɨjܦBRg?~V޵{JDKKoe󹡵Hnvl8-&̮⡳8n-Gǚ*lKRa,iW%-Z DezAD %υz^0ʇ8_#7555#e` Nb =߈`Kl񾨺뇇c叕^TǀEfe"MTMKJ!:5u\|HC$~k|W-` @t>C!. %GW u*7 1ju?.T}7@t[A&B ASSVKv"TC|(:N,+ s6@؆r5mCKvG7}Hӹަ+eQ_̶We])bxbڨ7'8 dWb`XS\X"Jh|>i:qn~UoH[Bzb#)R~Oֻ0T31o>) k^Vchl]:7fPxW?\3) F>#){=؊Vh܁ؿc/)-%d-}zg6Ή,(\IޫYUsg%j˩Kә {W8,)FR4Mč{B-# ՉtE vi1v`ۢ~ Q.g8LeZW&VC@W]JxΏp'Ao{r͖˖7FA 1z{^ߧM]mpƒ"WQ0Y7!b Ff3=pAwkQM)q=,^L,뱍Ol4 4V⸼NjqB+ \ 2]f݉0JD(APBw] * Ӊ:p\%brHmC<|99{Y7(.gYi}mRcz<_}+"T =B(Kb%˰U5&teFsi,Q/T{13Y-X J<1r55RpAXh\ u- aֈili^V&2>nίW/*ﱓ^N.Ϣk[&z|3^vl'<:V M iF@B&n)fNv\=+oV$g&v;Fnwꏄ `ޔ IgHc߳yjrC^B=( G&WQFo&l4$h0nUMb ml&3{71{,aOz1i>[1Ǜ"t CcC*x8Lr$ e:ň ^o ߳Nh'i3_1NTƙFLEI )8r3R T$WC#9TF0͇Շg#4/ l`q8kTYKKqL0>ԝ n BdădVgYn Cqm+M8.I1fd$祹hc>w2BYysta [~ws~=ޤ0(+T+ a-Zw-cZuuQ#2X$ Bp +ٲ.Fҫ˗Z^B2M"3{Bųi==zMtL+nՊYub)=cl&=w"-B:NjtY:H¬mhmIVHTE&FQmS8iL3N҃xw_??r<><cIѻ=.J{&3h}4j9bͽR_԰Ԥ)qdxfBaȌvF/E *4i,,{VZ!UhVK+*V< \i0]yCQTP c15aly&k8yE_$C*Α8:čĘޏ|&[C"-_@iCU%0?uKhљr cJ Е=|_ Lep˾3QJ[ b\no $ee$dU`ϜW.733玭3|D9CgM+0 a%]B?G`Ԛ{Se혪a9{L&OmeS/ H+xأ]vP0#LXUYz֤j]CM}]zM0ģet bԙ1,frO*@0zqF"2lۿMh$h_,((X9[f547)FDQQp{ sVOCdKD[LU˦wů)'&tpb#l @NoJ[^댷@9_ybW׊A]HEU OLU yMEy^HYY: #A8ʽ Z?a3 W'vB.4$[y2_p0qMREIt`w?C.(=6I^?cҪL)bѻ\\Bj tFAۊ|eČ,)\'S0 ,SF1݀"4|6i{Gy6 {+M4u<#r#i2J:[ 8Ӑ/9d-ޕtJk]Ţ nP8sj/Z#Nh޹gC2mE@4gs|-\O5DJ9%RJP 30riJ[}qS\1DYu6eT akJQ #Ɓ&M.G ģ4L@2y 7ɷunHV~z!ϧNϧ4N>`oJƠu 4bDe.TO`]%Y%cG Fb¡'.9Na _6n5'{ &>v,!ќ0U [.7ɢPQA} i~f2+>o,HRb+zNs"B- d&5rF^"VǴbK~gWdWm녈E"2,VjA¥AS4uEgF:*3ϝߍ˵F[?cyBLVȒڑ{CжFWFQ'd-cUzI^r1BI'4бhCeMTVmEfbke&0:/H 7*'}y x4NޘuStb[=60+2C~?s&9E +-}V<PZ\jsm{pȿNYEXJ@BtRzIndLk,G,b Y'8]|LV$۫*\yu/Mn7H ;e|Ecѐ3k1:qb;5dB,gaAX8;aơ^#r*/pe1/YF6 y7tξʗsSQD"ŏ], MOH0>jDM?'! ߗF`r =#+gOw7c(Y8 h?X2|Ȟi` 7'pTv 7\ɧbjԭeF'LI)n O']j^v(^½L f {7G%2{d K&o74.ҰTg\6 ӊ$F<5lTcjd}7 P|gWX&rWӼH> >k@'["1 `}QǒzT*dQh?j9E*V/jtFPd+T-0*|F|9j;S~Yo*&R&*"phhe*Qc6gԓ<]QϨ>Px;¼O7lG Eo=7r usX6c\CקEdv9@z<rkoƹ|Q5ykI_31#iQn4שB]PMDBeER9z OFLOIXWvw:1u,j^,#۞eVƦS9mм` V7wk0\ zNcRV'X^`[c9?ăc7N_ǚ恲m[;_ .AmˇkkD6S1W+'eY `~(hLNt-r4bs!ru+ځܮH'PI5,(cdE6?w)HC68`h,|ldVRfl :|šL6a^?)6HPY\J.E'5/`& Lrghz;>n&)s?v/ٚX?ne䕍t%,} @z1Gx p#A{ /X<{@NLtr)| NPJ)(UJZUH⟌%&D v ;h3ݺzJh=y}[Cu+4e׳i'&֍'&(?``2}"܁ tCYp+z:ɏ&[e1$?V~zO!SdT:zOVg%B^Z5=aѝAvkn%v\ amA]yjuPGyHe"kzY'+G/H΁۬~̪, ۬6M?GlT!A\jHn ͭvI'G4\A)I0enyG8*O[d1uЌeun4YmKY_v0K r.HRY"v*Hʸ.-vv_v]^eknϭJ,ֲ,ª\ٺ_Ǘ/ި;inǑD0ݞkIM1BI0g-r،^(,1n'g5!Q@[Mm4xyR=c@m@b&nn請' HP!\b:hR@j'cw29ʌ@2U:.⽒∷X2pEﯯ:\XYWK̃TbXTg-bݧ Z&cd$s{ec`QpبWsG{G5Bi_wuc rJMk0 Hj2щ NI]h}]/s^!yd{jCg{kK]i [ȥ\i#Ӝ}%}Nhb*'e?d7ؙ9"-$q7Ku1+n07%LeFrq ~Ԏp4~*߸!12+ Yl)7FxMҺJF[ni!3D׈\tLiTtmbŅCZ\bN&~ko ].3ӱu*e]#+fj[ouYom^u#`H<KJ>`oo*euEzL??pvKMBRyYRNU͠`9zrj?R F4狛,#7gGyvON`62L`+2Pց&mqT\+[ts"[zU>{D9fh=O6b-1vVEXS&Kµho-*ϼn.ĂLkdgh 8*=Oa',Ii1ZP WƀlW8׻m$[h+0 aú,^/)-e@A}fXQr1)_(*(*Nggb=KoO*]݊Ls }%8p cpK-Pd.'תjj0TMlc+t'>٥cr~Ot(>nN9и pA("v^UqT` Y4BlEw*PGꀣ.[C==rɱ. (o t&y5LrRW?$MkP. ?CL;oTJ1W3ZSyTY1>}j x*1d~:/dH%Bʰw3D}(J%oao35a1)[Ahsm1GbܹHSxv]]΋.qoߊaɨK\C[X$UJ:%Zؐjny(FU搟BB .({Eioį6lzonUV *R[ e v\$IU-ɫG=l9tY+ SU7ܚzۡi5WW_eH[ܫtaF#+,Nt{ơGDlsgMWW L}Ⱦ r990A^{@^6A=  &ȑhyy3fBqr'g 'qr'&+ הWCmye7ۚX kr8rhy@@L77 ָ}y;yy7Nc9Sϔن'q#9`0ph2] an0j"5E+:~WNj!TãJ /R(_N% ȏ#7TDa)m_:==,Q!~'3q| /h$S8Cжm-g1V@xҌ8cE8Hhv)`tCzDm&*hi4]AJpdiR[>}1쥔 ivNN5Vjb nĝ u%0$w04.!bЄѹF/b w 5uB8S ~ E.҆Lx-'q6͓! ;[8|,A!ߏc#&fSVJX ̝ևl@v62yBhm0vs*$HEdJ;-C%}cU/7g\w5cbXH>S+Q[Z$d3ŽLr*pM"-[5mpԹ a& dpBo|!$ij&žx e 8 Py$8`j=Ma38q5X:OfL2H} 8cM薮x`{َc빘_n1Ll2w:3SЇЇpF)C64%A/@]asg+ />M, ,1[:F Ɩpt`A).0,):o~j9m֛pX1RZ]R+Yٍ6YkaRXK|1hIJao_xꘒ/RB1 M]bGۮo3P"L7OFv5X_ʴXuk 8E#QͧiL6WXMB42l۬V ?nS3UL"p EqDaDk!@ip# 6@ڰN>םa%J{Yx+ ¦|m$tnk,X6NS auapy (y͎2O}T&?# ;e p_Tl^Oi8 a{o?yÔu\15Q-m8F4r"y9AKO^o#s"}r50s XX4], mo [ZFӶG4i{Sp^v7B3Ӯ>5Hл@wB>֣duB?;tZ2pz0j.їb'uP2幧Yޅb8c"VڢtHl5)IM)>lwa}*| F)І]itn0XHw؇S܁/| ~zḲPLpH,b ~<:i!e[0#$tA\ErBGoU-4q38UjS+jV~ zX:QO}RoR7bW$L[#Wˎ|ZQrVVHb:Kzc޴rO # Cm&I1ӻdNi*i9v} 87x~i dh1)"%UhQvs>m,GF?D??ȜV$gыb3 măPD]Dɷ{wc:}fAGH|SPT!KLC Bh Gacj #͗yU9$2smp:5Tػ؇)Ya:eS;fQ?z?*s~bM&$[O&+e7!7F;VJ1)Ufp`knXCNRљ guotT20-f8R> lqǎN:U>7 yb6!ƀdSSyB2}"Myy֏i oS4xcBٱXSe*A.~mKq&Z$,xMd?hEܹ Ī l )ǐ.7 2eG3u9tal-:8/_A+׉X""fqBPxDi(JcpgQMgnZ'?R*#|D'9vIf lf& gIFX7wmki_|Jz5#ձ7%SUT:,Sv]d2y `'s8q8PU=-_I}glZğs\) F(woƕXዅ4q%V%)[7"\j5fT;UWWfS}YTת3'W.)^ Tr@+O@2~qV>NvܔE,^rLj^xb#603*0;DJ^w?Xp4.34{s "me >!c4W7+wd-~D5#`W_Cv2^7x &md¥(o*fD'Q$r2PqsH*1jnޛ CS .8w)EÄ1ޭ` and for :ref:`the "distinct" command with opts `. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/read-opts.txt000066400000000000000000000025471456567454500242370ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/read-write-opts-sources.txt000066400000000000000000000015551456567454500270460ustar00rootroot00000000000000Use this function for commands that both read and write, such as "mapReduce" with an output collection. Read and write concern and collation can be overridden by various sources. In a transaction, read concern and write concern are prohibited in ``opts``. The highest-priority sources for these options are listed first in the following table. Read preferences are *not* applied. The write concern is omitted for MongoDB before 3.4. ============== ============== ========= Read Concern Write Concern Collation ============== ============== ========= ``opts`` ``opts`` ``opts`` Transaction Transaction |opts-source| |opts-source| ============== ============== ========= :ref:`See the example for transactions ` and for :ref:`the "distinct" command with opts `. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/read-write-opts.txt000066400000000000000000000031061456567454500253570ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/replace-one-opts.txt000066400000000000000000000036371456567454500255170ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: When true, creates a new document if no document matches the query. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/retryable-read-aggregate.txt000066400000000000000000000005251456567454500271610ustar00rootroot00000000000000This function is considered a retryable read operation unless the pipeline contains a write stage like $out or $merge. Upon a transient error (a network error, errors due to replica set failover, etc.) the operation is safely retried once. If ``retryreads`` is false in the URI (see :symbol:`mongoc_uri_t`) the retry behavior does not apply.mongo-c-driver-1.26.0/src/libmongoc/doc/includes/retryable-read-command.txt000066400000000000000000000004131456567454500266450ustar00rootroot00000000000000Retry logic occurs regardless of the underlying command. Retrying ``mapReduce`` has the potential for degraded performance. Retrying a ``getMore`` command has the potential to miss results. For those commands, use generic command helpers (like |generic-cmd|) instead.mongo-c-driver-1.26.0/src/libmongoc/doc/includes/retryable-read.txt000066400000000000000000000004261456567454500252350ustar00rootroot00000000000000This function is considered a retryable read operation. Upon a transient error (a network error, errors due to replica set failover, etc.) the operation is safely retried once. If ``retryreads`` is false in the URI (see :symbol:`mongoc_uri_t`) the retry behavior does not apply.mongo-c-driver-1.26.0/src/libmongoc/doc/includes/returns-cursor.txt000066400000000000000000000012241456567454500253450ustar00rootroot00000000000000This function returns a newly allocated :symbol:`mongoc_cursor_t` that should be freed with :symbol:`mongoc_cursor_destroy()` when no longer in use. The returned :symbol:`mongoc_cursor_t` is never ``NULL``, even on error. The user must call :symbol:`mongoc_cursor_next()` on the returned :symbol:`mongoc_cursor_t` to execute the initial command. Cursor errors can be checked with :symbol:`mongoc_cursor_error_document`. It always fills out the :symbol:`bson_error_t` if an error occurred, and optionally includes a server reply document if the error occurred server-side. .. warning:: Failure to handle the result of this function is a programming error. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/seealso/000077500000000000000000000000001456567454500232235ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc/includes/seealso/authmechanism.txt000066400000000000000000000005131456567454500266110ustar00rootroot00000000000000.. seealso:: | :symbol:`authentication` | :symbol:`mongoc_uri_get_auth_mechanism()` | :symbol:`mongoc_uri_get_auth_source()` | :symbol:`mongoc_uri_get_mechanism_properties()` | :symbol:`mongoc_uri_set_auth_mechanism()` | :symbol:`mongoc_uri_set_auth_source()` | :symbol:`mongoc_uri_set_mechanism_properties()` mongo-c-driver-1.26.0/src/libmongoc/doc/includes/seealso/cursor-error.txt000066400000000000000000000001401456567454500264230ustar00rootroot00000000000000.. seealso:: | :symbol:`mongoc_cursor_error()` | :symbol:`mongoc_cursor_error_document()` mongo-c-driver-1.26.0/src/libmongoc/doc/includes/seealso/session.txt000066400000000000000000000034171456567454500254540ustar00rootroot00000000000000.. seealso:: | :symbol:`mongoc_client_session_abort_transaction()` | :symbol:`mongoc_client_session_advance_cluster_time()` | :symbol:`mongoc_client_session_advance_operation_time()` | :symbol:`mongoc_client_session_commit_transaction()` | :symbol:`mongoc_client_session_destroy()` | :symbol:`mongoc_client_session_get_client()` | :symbol:`mongoc_client_session_get_cluster_time()` | :symbol:`mongoc_client_session_get_lsid()` | :symbol:`mongoc_client_session_get_operation_time()` | :symbol:`mongoc_client_session_get_opts()` | :symbol:`mongoc_client_session_get_server_id()` | :symbol:`mongoc_client_session_start_transaction()` | :symbol:`mongoc_client_session_t()` | :symbol:`mongoc_client_start_session()` | :symbol:`mongoc_session_opts_clone()` | :symbol:`mongoc_session_opts_destroy()` | :symbol:`mongoc_session_opts_get_causal_consistency()` | :symbol:`mongoc_session_opts_get_default_transaction_opts()` | :symbol:`mongoc_session_opts_get_transaction_opts()` | :symbol:`mongoc_session_opts_new()` | :symbol:`mongoc_session_opts_set_causal_consistency()` | :symbol:`mongoc_session_opts_set_default_transaction_opts()` | :symbol:`mongoc_transaction_opts_clone()` | :symbol:`mongoc_transaction_opts_destroy()` | :symbol:`mongoc_transaction_opts_get_max_commit_time_ms()` | :symbol:`mongoc_transaction_opts_get_read_concern()` | :symbol:`mongoc_transaction_opts_get_read_prefs()` | :symbol:`mongoc_transaction_opts_get_write_concern()` | :symbol:`mongoc_transaction_opts_new()` | :symbol:`mongoc_transaction_opts_set_max_commit_time_ms()` | :symbol:`mongoc_transaction_opts_set_read_concern()` | :symbol:`mongoc_transaction_opts_set_read_prefs()` | :symbol:`mongoc_transaction_opts_set_write_concern()` mongo-c-driver-1.26.0/src/libmongoc/doc/includes/session-lifecycle.txt000066400000000000000000000023731456567454500257560ustar00rootroot00000000000000Start a session with :symbol:`mongoc_client_start_session`, use the session for a sequence of operations and multi-document transactions, then free it with :symbol:`mongoc_client_session_destroy()`. Any :symbol:`mongoc_cursor_t` or :symbol:`mongoc_change_stream_t` using a session must be destroyed before the session, and a session must be destroyed before the :symbol:`mongoc_client_t` it came from. By default, sessions are `causally consistent `_. To disable causal consistency, before starting a session create a :symbol:`mongoc_session_opt_t` with :symbol:`mongoc_session_opts_new()` and call :symbol:`mongoc_session_opts_set_causal_consistency()`, then free the struct with :symbol:`mongoc_session_opts_destroy`. Unacknowledged writes are prohibited with sessions. .. the timeout warning is mandated by the Driver Sessions Spec A :symbol:`mongoc_client_session_t` must be used by only one thread at a time. Due to session pooling, :symbol:`mongoc_client_start_session` may return a session that has been idle for some time and is about to be closed after its idle timeout. Use the session within one minute of acquiring it to refresh the session and avoid a timeout. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/sphinx.inv000066400000000000000000000341041456567454500236210ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: Sphinx # Version: 7.2.0 # The remainder of this file is compressed using zlib. xŝݎ6);qO7ŔvV춁݅TH*DfWI?ʾv;II(Mx}")6o7uțUQU]"/՛(;qZn)pi^NY]/ʸwl_ag!n/Y'vi6RfE>]g/̤УV^ +yQh[ 9A/ߑq.IЬ=j9ƕ˝^QO15joZ~ml{*;}j5-"7)" 0I?O%$(˙k!}Ϳ,k #v?*YTE:=ouVslUx T|=w}A!]_?29IP%Jy,-+"vfO- on3onOWV&YQ]:/@7)B%?k9)Ĝ<ҞѸ~+d\_ߥVO'`U)ylJŠo_-J2U֦cie[8W*SΛǸeYb^R]w[TsqQю#-?O$ھZqXs4Eil?A>!jr'F?UOgjr3VW[M޼ c@^-@ٙID>y n ?Oo {{sWq}mQZEo+_Qy ]}q!^_G-Cɋ+(cS50+ I^-n vwN(g -w0LrMg P因>p8*EL,?z_>NJ:N"| .2xh {:eQ>5,DŽKՂ׊]* HeaYlL]IieIr[UL ΃<}>3͊i6(51m$ |!@q$8 _|΃8p Jua$qJ. N7˜JExR Y-E:f `u-JOAxVlAWcyhH 5RwPoLQ)eS#yASIE>8eu,x}eT$_I^ _{2p B#)G|f-k.) _zQDek'=#–qO%SH t\&AX-WgUYK!KrHĿ] wr;-R!tDuD^EIvA0W $>]q JLLЧ%RdYµq\[*l4Iʡ;:l_x{+,ۢh)'MT>,V7XI>PvcĤ(q%()ѓ/An>l G]c*gɞKBˆZ2[Eqkpv8Gc:R@8)g&K7f޺x/r-3BT։%-.ćϞnE9)>V+_KiZIx ܗvKXZ#zMGb6i3qj;<oSTƆML.,8]2TI%~zC٬Hu'S/}@ZtNq{mYН+=/YVcnڂ#;Z?G"Cs%d=;\fTmX\āz].xU.!y cdL^\8:@zʏOЗh "d- F8g9B%bդX#~7쿚j;7!8AڻfL}q?~1*U`_5>.*1Uc(>t$yҤ-uiYN> ־4*}TAۏ/{ܲ56uRyqBhPiMh&G8_*l<_+rRi}eikTR>G>9(7Ki|͟57 wS38ZVSbuʪ9h1H ZW I+sBqzHam?7IN*I+0t]r׺R<'U9:V9 3[U=Nj\n^\ޗ_:*҂I]wu^&+B/7jO R#;t{Newwx3A[;\]pҮj'iU\9Gdu-ܗ'&\xrW9䈻#Kjz\#"WO9COE1Oܰψaȟ,ÔaH;$ ?]ʬ摩˽{ޖY݁Q%Gx%$(gStx9(RAY<[sb;Mb]>S<;LPt43L%|A5b]$ n" p |_Ȕq![P:P΋ ꬴw#8LكN,XWݻm3%fi4SӲV Cl,L gD1Z3xMԠ=e;2-z{"KO˜,`4|SGh/`ܲ~ʴ13p( E} [> Z `s;)٦cw8̱dC82[8~Gz3er[Cs-]b->jjdSB&B9ZűG 78zBȆŠy>Ӆ03Rx}H. r#R/EmCȈЈS"WΈC=1p ^1l]VLݘ ]?YUȐ5p 5^ӪΓ巀xc#Irӓ={iiŹp3r ]P.*c-+NOsPi` :,|좶g!'|hC<56AZR3FX9/A]i:#6:="bL2`[Sk>P}룯ayh^Zt~r$®u]c0GDYYaVWK|+(c \3?M#θu&zӤیR}SCk#9;Iϯ\\S>-$vC[,o<kL,`DpQ9 gwo ^Q܃VŨ|Iqy=tCoDdM>4y21׶ Bxj< oYe*8u.u|hqzTgκ)E[uQYUKnLBQdaȠ12// R3/Ņqg麁 ވF)e[^ U7YR/* R4(mRYMi~]]*@j`dי©,:Jx4QHf%S'y3P΁ "4]%e8RNց`D>Vx&(|PAU%{`'d!M> pN(IKV;/1NmLv+S\fظy݊isd錘g2SA~}_|,S IVË Z ]\s޽*][c[[kwjkti}wdbvdjT5&Ny6jVhRQƊjD{cݬ?Ƈ#4cu2$^c4 :%z }iʨO;yBs!u(Q*-,%'Oa7Py?]&M=.4%IH7(hw_'Pdun*URe߉k+đ(xɉitJ-gs`K E%|/|n[{%J4KiVòkTttW"] - WTT ĢE4hT]z#:g:q>Vt)30j~jsճS|@蕓giY]*8uQrb#Ļ*۔>YwXq*kfgn*RzCKWWuɞGW}YdrWPHsDQ .o$bH%3VJ:^6:_6jܽBgq2AweLTAytXTkmZRkgzm֬+4fm۲s4qr:ɺ%7w.+ԩ/,P(i_+jok[ ;ߏ:4!p;KWNe{݅& S}&_Ch27?`1qji` q0Ly#4AxAU/8UUQey+x3}6wJ j^Zܕ%F;2v,8FF?jXDM:|c%ϩu_O!(ǠJ'A,5)j_ݥmZd6K5/CRòɏOx}r0nIq&@} !gdwWAq C8'1M5Ϣߒ/5 3ВKs9 /8ѫ@=~aΦƯi0Q^ed\^P %;Hs:?wh2 IܑO`q=+v SHZ$yY7|W3GNQrlD-Xoyic09 X]z]枦7qW8w ,wTQS]KSAv!VGrwTr7L`¥5:ٰFt%ڟI{D^&fCͣOwQ#m/"`tO1i}ib16c-ݚGlBzCHC+#5-VFbo Y'5l3V(]j,J="4U<@x2歇b| =veT$xx4+cd NYJ W֜OλbT-چiV\:ǖ׈Q8, 3-uZ~#UŦThL+ZuJg*ޅ 7H %.s(["_cYwǧgk.' 'ڊαÐUXj^jd1߭gi6>A" x=))ʽuP\;hU=9 /egD$/CaAVy6 ̳ Do| m%;)@:,2a3_t4&( B#-ZSp@82ols>$H5j4,Gfr3 #/lk"yy4݌Ҩ*+Tzt,&F&{6LǙ%t/PmOg%ɝ y(m 86]4.}4!E&t'!MN [;CusrT֧2S+MVąO2~DJA]6+cKvHS;2`.>@I;+ NĿ2´ywӭy/Uc. c|II7QRa]0xO %4}.yG|T,rMx?DTe@ZTy}QI sw"\zMOl wggby鴫F&"Aȷ 11_ķ~3ɰ&v S;&J~ @[Kr}*LcCX2t)o f M[yKJ[];W;ijZW^߾|cWCW[Q6}KV-tb[y)C-[@^.=)fܣ!-0%'E|'Dv}p6=dnZ϶? lߟoX/ 6\a.GR ΄ U;+ |3'v±D`aA Ӛ l1+*so`<ۭ5Q<%$vrϘPMFumI\;lF3fBVA$!a2D?9+L kuɃvDIPvHÇEw;G]da6Lj:@|:ȴmجi@ 8$0):1&Aprq<!0ǃ1Wba-ifD9@8(^ vea $GGOY˃wBdEV )IDp?Iy b;GPgG&5hh$ƋGd!71ɜ K/tῷ;f_dG1vx8s)LFDӊ[?u0D ɊC}-KM?2xf_<ס;đ3<aqF~6%tma@_=)OAl^ȌSD?3+[YspؾQ ?G1Qs*'Br@h5 h#e#Bz?{ ,0iڦ1b qZYd:0G^Lm^CaZgxͭnGKݐ| HsC *Y}L{4G_kIˣ?¼jje| 01+=W|('xyp{ĠW<>6G-B]e!دm{v-DS*'u$hHi&ߎ"xO [٨MG܎e^< TR+u\yZ/myڌI 7KW#?ه[K#sY]tB?kܠxkG4z#VAo5gC0ߒ m |m Cl1l4ge,4㼬$- Q`}lʜӳ,)FzUlKy>91~cIczyAG2?h,ðIoPAKon6mhЦd;8ی$ (%`W}9ax-3ZQN\Nt9 /61> ?c'<yiK5O㫱~D%kX} A=. {PE \ѥu%m/[cr.ׄXFǼԙVT ߧ`f`]K,}%hY`i&duX#ش-Ρ=/*.^Q =E|#?$^G/ՠsD˗&{kko5Qb3ZC΂VG ?<܎l6~ɏ2_Ek%A=h[lt7-cz ْ+4oWe~g~\᛾_ɖSB7[-33+ VPf//};*ߜH(zW׺+|@Q:50qNI8KQS6RRUFNif4rVۙaDlhTIzD4؇~vsJC&'hsE>C'=0J]xcvcu빷?퀏=v{;; -0F=u a=;m>r&Ի&=*4?)llՉg0_09Z&ϖqeVA,t 6t o41 6 xQ[5!z_~=͵TySg. 5<Qz¤}Ҿ >c\D^wt[#&zl!l4-5)  ]UI0+13%Dg'}cSD gQߥ;c(, MNDg=|s/)_O0qts!#6z+S&CFs6;PQ0)">|'ϲ 4o|[Ri74# N[+ DZR{UA&l"oOݟwdb6+x'~턇PrU?քVc;^7Xй,nJb@O@xHr-K{В~Cni-ðGRQ~go"}xnZcA~s "JSv}m$A-LNDL'c+MFc=zW{N\ ]eؽ 턼:aV3=p # zMd"i"гFTI/ՒZ6?ohMj۞Ԫ9;= 4Swn{n݉%:<ꮙF[L}B}|54io,z|bþ٩|jѨ*Hyf1Ӂ)7拥g307߱ldom.R.4KiT{% ZHQAQn. YH!i 7ڇF`$kҨ# Jl*-O֣ ^5l:COC4tq;ݸwnV໱w3J8cqZk}X:GIA+>@S#w9puj4 ܩ&8:ʐ*JC=SjE[VP<B/U %Ѡd%$wS m-}7_o"ӈc+pY\xeniÚ1/]5I; vwW#09 ,X.@' g3\=CeϥG QD`ͽj~2@K\vJrrJƊ2Z~|PLxmongo-c-driver-1.26.0/src/libmongoc/doc/includes/tls-options.txt000066400000000000000000000031261456567454500246260ustar00rootroot00000000000000.. list-table:: :header-rows: 1 * - Constant - Key - Description * - MONGOC_URI_TLS - tls - {true|false}, indicating if TLS must be used. * - MONGOC_URI_TLSCERTIFICATEKEYFILE - tlscertificatekeyfile - Path to PEM formatted Private Key, with its Public Certificate concatenated at the end. * - MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD - tlscertificatekeypassword - The password, if any, to use to unlock encrypted Private Key. * - MONGOC_URI_TLSCAFILE - tlscafile - One, or a bundle of, Certificate Authorities whom should be considered to be trusted. * - MONGOC_URI_TLSALLOWINVALIDCERTIFICATES - tlsallowinvalidcertificates - Accept and ignore certificate verification errors (e.g. untrusted issuer, expired, etc.) * - MONGOC_URI_TLSALLOWINVALIDHOSTNAMES - tlsallowinvalidhostnames - Ignore hostname verification of the certificate (e.g. Man In The Middle, using valid certificate, but issued for another hostname) * - MONGOC_URI_TLSINSECURE - tlsinsecure - {true|false}, indicating if insecure TLS options should be used. Currently this implies MONGOC_URI_TLSALLOWINVALIDCERTIFICATES and MONGOC_URI_TLSALLOWINVALIDHOSTNAMES. * - MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK - tlsdisablecertificaterevocationcheck - {true|false}, indicates if revocation checking (CRL / OCSP) should be disabled. * - MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK - tlsdisableocspendpointcheck - {true|false}, indicates if OCSP responder endpoints should not be requested when an OCSP response is not stapled.mongo-c-driver-1.26.0/src/libmongoc/doc/includes/update-many-opts.txt000066400000000000000000000040021456567454500255340ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: When true, creates a new document if no document matches the query. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``arrayFilters``: An array of filters specifying to which array elements an update should apply. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/update-one-opts.txt000066400000000000000000000040021456567454500253510ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t `. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: When true, creates a new document if no document matches the query. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``arrayFilters``: An array of filters specifying to which array elements an update should apply. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/write-opts-sources.txt000066400000000000000000000014051456567454500261270ustar00rootroot00000000000000Use this function for commands that write such as "drop" or "createRole" (but not for "insert", "update", or "delete", see `Basic Write Operations`_). Write concern and collation can be overridden by various sources. In a transaction, read concern and write concern are prohibited in ``opts``. The highest-priority sources for these options are listed first in the following table. The write concern is omitted for MongoDB before 3.4. ============== ========= Write Concern Collation ============== ========= ``opts`` ``opts`` Transaction |opts-source| ============== ========= :ref:`See the example for transactions ` and for :ref:`the "distinct" command with opts `. mongo-c-driver-1.26.0/src/libmongoc/doc/includes/write-opts.txt000066400000000000000000000024401456567454500244460ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``collation``: Configure textual comparisons. See :ref:`Setting Collation Order `, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. mongo-c-driver-1.26.0/src/libmongoc/doc/index.rst000066400000000000000000000011361456567454500216240ustar00rootroot00000000000000libmongoc ========= A Cross Platform MongoDB Client Library for C Introduction ------------ The MongoDB C Driver, also known as "libmongoc", is a library for using MongoDB from C applications, and for writing MongoDB drivers in higher-level languages. It depends on :doc:`libbson ` to generate and parse BSON documents, the native data format of MongoDB. .. toctree:: :maxdepth: 2 learn/index howto/index ref/index .. toctree:: :maxdepth: 2 tutorial authentication basic-troubleshooting guides api application-performance-monitoring * :ref:`genindex` mongo-c-driver-1.26.0/src/libmongoc/doc/init-cleanup.rst000066400000000000000000000021011456567454500230760ustar00rootroot00000000000000:man_page: mongoc_init_cleanup Initialization and cleanup ========================== Synopsis -------- .. include:: includes/init_cleanup.txt .. only:: html .. toctree:: :titlesonly: :maxdepth: 1 mongoc_init mongoc_cleanup Deprecated feature: automatic initialization and cleanup -------------------------------------------------------- On some platforms the driver can automatically call :symbol:`mongoc_init` before ``main``, and call :symbol:`mongoc_cleanup` as the process exits. This is problematic in situations where related libraries also execute cleanup code on shutdown, and it creates inconsistent rules across platforms. Therefore the automatic initialization and cleanup feature is deprecated, and will be dropped in version 2.0. Meanwhile, for backward compatibility, the feature is *enabled* by default on platforms where it is available. For portable, future-proof code, always call :symbol:`mongoc_init` and :symbol:`mongoc_cleanup` yourself, and configure the driver like: .. code-block:: none cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF mongo-c-driver-1.26.0/src/libmongoc/doc/installing.rst000066400000000000000000000055041456567454500226640ustar00rootroot00000000000000:man_page: mongoc_installing :orphan: Installing the MongoDB C Driver (libmongoc) and BSON library (libbson) ====================================================================== .. note:: Much of this section of documentation has been rewritten and moved: :doc:`/learn/get/index` Supported Platforms ------------------- .. note:: Moved: :doc:`/ref/platforms` Install libmongoc with a Package Manager ---------------------------------------- .. note:: Moved: :doc:`/learn/get/installing` .. _installing_libbson_with_pkg_manager: Install libbson with a Package Manager -------------------------------------- .. note:: Moved: :doc:`/learn/get/installing` Docker image ------------ You can find a Docker image in `Docker Hub `_ along with example usage of using libmongoc to ping a MongoDB database from within a Docker container. Build environment ----------------- .. note:: Moved: :doc:`/learn/get/from-source` Uninstalling the installed components ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are two ways to uninstall the components that have been installed. The first is to invoke the uninstall program directly. On Linux/Unix: .. code-block:: none $ sudo /usr/local/share/mongo-c-driver/uninstall.sh On Windows: .. code-block:: none $ C:\mongo-c-driver\share\mongo-c-driver\uninstall.bat The second way to uninstall is from within the build directory, assuming that it is in the exact same state as when the install command was invoked: .. code-block:: none $ sudo cmake --build . --target uninstall The second approach simply invokes the uninstall program referenced in the first approach. Dealing with Build Failures ^^^^^^^^^^^^^^^^^^^^^^^^^^^ If your attempt to build the C driver fails, please see the `README `_ for instructions on requesting assistance. Additional Options for Integrators ---------------------------------- In the event that you are building the BSON library and/or the C driver to embed with other components and you wish to avoid the potential for collision with components installed from a standard build or from a distribution package manager, you can make use of the ``BSON_OUTPUT_BASENAME`` and ``MONGOC_OUTPUT_BASENAME`` options to ``cmake``. .. code-block:: none $ cmake -DBSON_OUTPUT_BASENAME=custom_bson -DMONGOC_OUTPUT_BASENAME=custom_mongoc .. The above command would produce libraries named ``libcustom_bson.so`` and ``libcustom_mongoc.so`` (or with the extension appropriate for the build platform). Those libraries could be placed in a standard system directory or in an alternate location and could be linked to by specifying something like ``-lcustom_mongoc -lcustom_bson`` on the linker command line (possibly adjusting the specific flags to those required by your linker). mongo-c-driver-1.26.0/src/libmongoc/doc/learn/000077500000000000000000000000001456567454500210635ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc/learn/get/000077500000000000000000000000001456567454500216425ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc/learn/get/docs.rst000066400000000000000000000040611456567454500233250ustar00rootroot00000000000000################################################# Building the |mongo-c-driver| Documentation Pages ################################################# .. highlight:: console .. default-role:: bash This documentation is rendered using Sphinx__. To easily ensure that all tooling matches expected versions, it is recommended to use Poetry__ to install and run the required tools. __ https://www.sphinx-doc.org __ https://python-poetry.org .. tip:: Poetry itself may be installed externally, but can also be automatically managed using the included wrapping scripts for Bash (At ``tools/poetry.sh``) or PowerShell (at ``tools/poetry.ps1``). These scripts can stand in for ``poetry`` in any command written below. Setting Up the Environment ************************** To install the required tooling, use the `poetry install` command, enabling documentation dependencies:: $ poetry install --with=docs This will create a user-local Python virtualenv that contains the necessary tools for building this documentation. The `poetry install` command only needs to be run when the `pyproject.toml` file is changed. Running Sphinx ************** Poetry can be used to execute the :std:doc:`man/sphinx-build` command:: $ poetry run sphinx-build -b dirhtml "./src/libmongoc/doc" "./_build/docs/html" This command will generate the HTML documentation in the `_build/docs/html` subdirectory. .. tip:: Because Sphinx builds many pages, the build may run quite slowly. For faster builds, it is recommended to use the :std:option:`--jobs ` command-line option when invoking :std:doc:`sphinx:man/sphinx-build`. Viewing the Documentation ************************* To quickly view the rendered HTML pages, a simple local HTTP server can be spawned on the command line by using Python's built-in :py:mod:`http.server` module: .. code-block:: sh $ poetry run python -m http.server --directory=_build/docs/html By default, this will serve the documentation at http://127.0.0.1:8000, which you can open in any web browser to see the rendered pages. mongo-c-driver-1.26.0/src/libmongoc/doc/learn/get/from-source.rst000066400000000000000000000326261456567454500246460ustar00rootroot00000000000000########################################### Building the C Driver Libraries from Source ########################################### .. highlight:: shell-session .. default-role:: bash This page details how to download, unpack, configure, and build |libbson| and |libmongoc| from their original source-code form. .. ad-dropdown:: Extra information :admonition: hint :open: Dropdowns (like this one) contain extra information and explanatory details that are not required to complete the tutorial, but may be helpful for curious readers, and more advanced users that want an explanation of the meaning of certain tutorial steps. The following page uses a few named "variables" that you must decide up-front. When you see such a value referrenced in a tutorial step, you should substitute the value into that step. .. seealso:: Before building, you may want to check that you are running on a supported platform. For the list of supported platforms, refer to the :doc:`/ref/platforms` page. Choose a Version **************** Before we begin, know what version of |mongo-c-driver| you will be downloading. A list of available versions can be found on `the GitHub repository tags page`__. (The current version written for this documentation is |version.pre|.) __ https://github.com/mongodb/mongo-c-driver/tags For the remainder of this page, `$VERSION` will refer to the version number of |mongo-c-driver| that you will be building for this tutorial. .. _get-src: Obtaining the Source ******************** There are two primary recommended methods of obtaining the |mongo-c-driver| source code: 1. Clone the repository using `git` (recommended). :ref:`(See below) ` 2. Download a source archive at a specific version. :ref:`(See below) ` .. important:: It is **highly recommended** that new users use a stable released version of the driver, rather than building from a development branch. When you `git clone` or download an archive of the repository, be sure to specify a release tag (e.g. with Git's `--branch` argument). .. _learn.obtaining.git: Downloading Using Git ===================== Using Git, the C driver repository can be cloned from the GitHub URL https://github.com/mongodb/mongo-c-driver.git. Git tags for released versions are named after the version for which they correspond (e.g. "|version.pre|"). To clone the repository using the command line, the following command may be used:: $ git clone https://github.com/mongodb/mongo-c-driver.git --branch="$VERSION" "$SOURCE" .. tip:: Despite the name, `git-clone`\ 's `--branch` argument may also be used to clone from repository *tags*. .. _learn.obtaining.archive: Downloading a Release Archive ============================= An archived snapshot of the repository can be obtained from the `GitHub Releases Page`__. The ``mongo-c-driver-x.y.z.tar.gz`` archive attached to any release contains the minimal set of files that you'll need for the build. __ https://github.com/mongodb/mongo-c-driver/releases .. tab-set:: .. tab-item:: Using ``wget`` + ``tar`` :: ## Download using wget: $ wget "https://github.com/mongodb/mongo-c-driver/archive/refs/tags/$VERSION.tar.gz" \ --output-document="mongo-c-driver-$VERSION.tar.gz" ## Extract using tar: $ tar xf "mongo-c-driver-$VERSION.tar.gz" .. tab-item:: Using ``curl`` + ``tar`` :: ## Using curl: $ curl "https://github.com/mongodb/mongo-c-driver/archive/refs/tags/$VERSION.tar.gz" \ --output="mongo-c-driver-$VERSION.tar.gz" ## Extract using tar: $ tar xf "mongo-c-driver-$VERSION.tar.gz" .. tab-item:: PowerShell .. code-block:: pwsh-session ## Use Invoke-WebRequest: PS> $url = "https://github.com/mongodb/mongo-c-driver/archive/refs/tags/$VERSION.zip" PS> $file = "mongo-c-driver-$VERSION.zip" PS> Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $file ## Extract using Expand-Archive: PS> Expand-Archive mongo-c-driver-$VERSION.zip The above commands will create a new directory `mongo-c-driver-$VERSION` within the directory in which you ran the `tar`/`Expand-Archive` command (**note**: PowerShell will create an additional intermediate subdirectory of the same name). This directory is the root of the driver source tree (which we refer to as `$SOURCE` in these documents). The `$SOURCE` directory should contain the top-level `CMakeLists.txt` file. Obtaining Prerequisites *********************** In order to build the project, a few prerequisites need to be available. Both |libmongoc| and |libbson| projects use CMake__ for build configuration. __ https://cmake.org .. note:: It is *highly recommended* -- but not *required* -- that you download the latest stable CMake available for your platform. .. ad-dropdown:: Getting the Latest CMake :admonition: hint A new stable release of CMake can be obtained from `the CMake downloads page`__. __ https://cmake.org/download/#latest For Windows and macOS, simply download the CMake `.msi`/`.dmg` (not the `.zip`/`.tar.gz`) and use it to install CMake. On Linux, download the self-extracting shell script (ending with `.sh`) and execute it using the `sh` utility, passing the appropriate arguments to perform the install. For example, with the CMake 3.27.0 on the `x86_64` platform, the following command can be used on the `cmake-3.27.0-linux-x86_64.sh` script:: $ sh cmake-3.27.0-linux-x86_64.sh --prefix="$HOME/.local" --exclude-subdir --skip-license Assuming that `$HOME/.local/bin` is on your `$PATH` list, the `cmake` command for 3.27.0 will then become available. The `--help` option can be passed to the shell script for more information. For the remainder of this page, it will be assumed that `cmake` is available as a command on your `PATH` environment variable and can be executed as "`cmake`" from a shell. You can test this by requesting the `--version` from CMake from the command line:: $ cmake --version cmake version 3.21.4 CMake suite maintained and supported by Kitware (kitware.com/cmake). .. note:: If you intend to build |libbson| *only*, then CMake is sufficient for the build. Additional C driver features may require additional external dependencies be installed, but we will not worry about them here. .. XXX: Additional note for installing dependencies The Linux dependencies of sufficient version are likely available using the system package manager. For example, on **Debian**/**Ubuntu** based systems, they can be installed using APT:: # apt install libssl-dev libsasl2-dev On **RedHat** based systems (**Fedora**, **CentOS**, **RockyLinux**, **AlmaLinux**, etc.):: # dnf install openssl-devel cyrus-sasl-devel Package names may vary between distributions. .. _learn.get.configure: Configuring for |libbson| ************************* .. important:: If you are building with Xcode [#xcode_env]_ or Visual Studio [#vs_env]_, you may need to execute CMake from within a special environment in which the respective toolchain is available. Let the name `$BUILD` be the path `$SOURCE/_build`. This will be the directory where our built files will be written by CMake. With the source directory for |mongo-c-driver| at `$SOURCE` and build directory `$BUILD`, the following command can be executed from a command-line to configure the project with both |libbson| and |libmongoc|:: $ cmake -S $SOURCE -B $BUILD \ -D ENABLE_EXTRA_ALIGNMENT=OFF \ -D ENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF \ -D CMAKE_BUILD_TYPE=RelWithDebInfo \ -D BUILD_VERSION="$VERSION" \ -D ENABLE_MONGOC=OFF If all dependencies are satisfied, the above command should succeed and end with:: $ cmake … ## … (Lines of output) … -- Generating done -- Build files have been written to: $BUILD If configuration failed with an error, refer to the CMake output for error messages and information. Ensure that configuration succeeds before proceeding. .. ad-dropdown:: What do these CMake arguments mean? :admonition: hint The `BUILD_VERSION` sets the version number that will be included in the build results. This should be set to the same value as the version of the source driver that was downloaded in :ref:`get-src`. The `ENABLE_EXTRA_ALIGNMENT` and `ENABLE_AUTOMATIC_INIT_AND_CLEANUP` are part of |mongo-c-driver|, and correspond to deprecated features that are only enabled by default for ABI compatibility purposes. It is highly recommended to disable these features whenever possible. The `ENABLE_MONGOC=OFF` argument disabled building |libmongoc|. We'll build that in the next section. The |cmvar:CMAKE_BUILD_TYPE| setting tells CMake what variant of code will be generated. In the case of `RelWithDebInfo`, optimized binaries will be produced, but still include debug information. The |cmvar:CMAKE_BUILD_TYPE| has no effect on Multi-Config generators (i.e. Visual Studio), which instead rely on the `--config` option when building/installing. .. _CMAKE_BUILD_TYPE: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html .. _learn.get.build: Building the Project ******************** After successfully configuring the project, the build can be executed by using CMake:: $ cmake --build $BUILD --config RelWithDebInfo --parallel If configured properly and all dependencies are satisfied, then the above command should proceed to compile and link the configured components. If the above command fails, then there is likely an error with your environment, or you are using an unsupported/untested platform. Refer to the build tool output for more information. .. ad-dropdown:: The ``--config`` option :admonition: hint :animate: fade-in The :option:`--config ` option is used to set the build configuration to use in the case of Multi-Config generators (i.e. Visual Studio). It has no effect on other generators, which instead use |cmvar:CMAKE_BUILD_TYPE|. .. _learn.get.install: Installing the Built Results **************************** Let `$PREFIX` be the path `$SOURCE/_install`. We can use CMake to install the built results:: $ cmake --install "$BUILD" --prefix "$PREFIX" --config RelWithDebInfo This command will install the |mongo-c-driver| build results into the `$PREFIX` directory. .. ad-dropdown:: The ``--config`` option :admonition: hint :animate: fade-in The :external:option:`--config ` option is only used for Multi-Config generators (i.e. Visual Studio) and is otherwise ignored. The value given for `--config` must be the same as was given for :external:option:`--config ` with `cmake --build`. .. seealso:: The above snippet simply installs |mongo-c-driver| in a subdirectory of the source directory itself, but this is not a normal workflow. Once you feel compfortable about configuring and building |mongo-c-driver|, the page :doc:`/howto/source-install` will do a deeper dive on from-source installation options. Configuring with |libmongoc| **************************** If you followed the above steps starting from :ref:`learn.get.configure`, your final result with only contain |libbson| and not the full C database driver library. Building of |libmongoc| is enabled/disabled using the `ENABLE_MONGOC` CMake variable. Re-run CMake again, but set `ENABLE_MONGOC` to `TRUE`:: $ cmake -D ENABLE_MONGOC=ON $BUILD If the above command succeeds, then the project has been reconfigured to build with |libmongoc|. Follow the process at :ref:`learn.get.build` and :ref:`learn.get.install` again to build and install |libmongoc|. .. TODO: Add a guide on installing with the additional option features, which requires additional packages be available for the build. .. rubric:: Footnotes .. [#xcode_env] If you wish to configure and build the project with Xcode, the Xcode command-line tools need to be installed and made available in the environment. From within a command-line environment, run:: $ xcode-select --install This will ensure that the compilers and linkers are available on your `$PATH`. .. [#vs_env] If you wish to configure and build the project using Microsoft Visual C++, then the Visual C++ tools and environment variables may need to be set when running any CMake or build command. In many cases, CMake will detect a Visual Studio installation and automatically load the environment itself when it is executed. This automatic detection can be controlled with CMake's :option:`-G `, :option:`-T `, and :option:`-A ` options. The `-G` option is the most significant, as it selects which Visual Studio version will be used. The versions of Visual Studio supported depends on the version of CMake that you have installed. `A list of supported Visual Studio versions can be found here`__ __ https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#visual-studio-generators For greater control and more tooling options, it is recommended to run commands from within a Visual Studio *Developer PowerShell* (preferred) or *Developer Command Prompt* (legacy). For more information, refer to: `Visual Studio Developer Command Prompt and Developer PowerShell`__ and `Use the Microsoft C++ toolset from the command line`__ on the Microsoft Visual Studio documentation pages. __ https://learn.microsoft.com/en-us/visualstudio/ide/reference/command-prompt-powershell __ https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line mongo-c-driver-1.26.0/src/libmongoc/doc/learn/get/index.rst000066400000000000000000000004121456567454500235000ustar00rootroot00000000000000######################################## Obtaining the MongoDB C Driver Libraries ######################################## There are a few methods of obtaining the ``mongo-c-driver`` codebase: .. toctree:: :maxdepth: 1 from-source installing docs mongo-c-driver-1.26.0/src/libmongoc/doc/learn/get/installing.rst000066400000000000000000000207251456567454500245460ustar00rootroot00000000000000############################################## Installing Prebuilt MongoDB C Driver Libraries ############################################## .. highlight:: shell-session .. default-role:: bash .. Links: .. _EPEL: https://docs.fedoraproject.org/en-US/epel/ .. _Homebrew: https://brew.sh/ The |libmongoc| and |libbson| libraries are often available in the package management repositories of :ref:`common Linux distributions ` and :ref:`macOS via Homebrew `. .. note:: For :index:`Windows`, it is recommended to instead :doc:`build the libraries from source `, for maximum compatibility with the local toolchain. Building from source can be automated by using a from-source library package management tool such as Conan_ or vcpkg_ (See: :ref:`installing.pkgman`). .. caution:: If you install and use prebuilt binaries from a third-party packager, it is possible that it lags behind the version of the libraries described in these documentation pages (|version|). Note the version that you install and keep it in mind when reading these pages. For the most up-to-date versions of the C driver libraries, prefer to instead :doc:`build from source `. .. seealso:: For a listing and common reference on available packages, refer to :doc:`/ref/packages`. .. index:: package managers; Conan package managers; vcpkg pair: installation; package managers .. _installing.pkgman: Cross Platform Installs Using Library Package Managers ****************************************************** Various library package managers offer |libbson| and |libmongoc| as installable packages, including Conan_ and vcpkg_. This section will detail how to install using those tools. .. _conan: https://conan.io/ .. _vcpkg: https://vcpkg.io/ .. index:: ! pair: installation; vcpkg Installing using vcpkg ====================== .. note:: This page will not detail how to get started using vcpkg_. For that, refer to `Get started with vcpkg`__ __ https://vcpkg.io/en/getting-started .. tab-set:: .. tab-item:: vcpkg Manifest Mode (Recommended) In `vcpkg manifest mode`__, add the desired libraries to your project's ``vcpkg.json`` manifest file: __ https://learn.microsoft.com/en-us/vcpkg/users/manifests .. code-block:: js :caption: ``vcpkg.json`` :linenos: { // ... "dependencies": [ // ... "mongo-c-driver" ] } When you build a CMake project with vcpkg integration and have a ``vcpkg.json`` manifest file, vcpkg will automatically install the project's dependencies before proceeding with the configuration phase, so no additional manual work is required. .. tab-item:: vcpkg Classic Mode In `vcpkg classic mode`__, |libbson| and |libmongoc| can be installed through the names ``libbson`` and ``mongo-c-driver``, respectively:: $ vcpkg install mongo-c-driver __ https://learn.microsoft.com/en-us/vcpkg/users/classic-mode (Installing ``mongo-c-driver`` will transitively install |libbson| as well.) When the |libmongoc| and |libbson| packages are installed and vcpkg has been properly integrated into your build system, the desired libraries will be available for import. With CMake, the standard config-file package will be available, as well as the generated ``IMPORTED`` targets: .. code-block:: cmake :caption: ``CMakeLists.txt`` find_package(mongoc-1.0 CONFIG REQUIRED) target_link_libraries(my-application PRIVATE $,mongo::mongoc_shared,mongo::mongoc_static>) .. note:: The large ``$:...>`` generator expression (:external:doc:`manual/cmake-generator-expressions.7`) can be used to switch the link type of |libmongoc| based on whichever form is available from the ``find_package()`` command. |libmongoc| supports building with both *dynamic* and *static* library types, but vcpkg will only install one of the two library types at a time. Configuring a CMake project with vcpkg integration is a matter of setting the CMake toolchain file at the initial configure command:: $ cmake -S . -B _build -D CMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake .. index:: ! pair: Linux; installation .. _installing.linux: Installing in Linux ******************* The names and process of installing |libbson| and |libmongoc| varies between distributions, but generally follows a similar pattern. The following Linux distributions provide |libbson| and |libmongoc| packages: - `Fedora `_ via `dnf` - `RedHat Enterprise Linux (RHEL) 7 and Newer `_ and distribusions based on RHEL 7 or newer, including `CentOS, Rocky Linux, and AlmaLinux `_, via `yum`/`dnf` and EPEL_. - `Debian `_ and Debian-based distributions, including `Ubuntu `_ and Ubuntu derivatives, via APT. .. seealso:: For a list of available packages and package options, see: :doc:`/ref/packages`. .. index:: !pair: installation; RHEL !pair: installation; Fedora !pair: installation; CentOS !pair: installation; Rocky Linux !pair: installation; AlmaLinux !pair: installation; Yum !pair: installation; DNF .. _redhat: RedHat-based Systems ==================== In RedHat-based Linux distributions, including **Fedora**, **CentOS**, **Rocky Linux**, and **AlmaLinux**, the C driver libraries can be installed with Yum/DNF. .. note:: For Fedora and enterprise Linux of version 8 or greater, it is recommended to use the `dnf` command in place of any `yum` command. .. XXX: Once RHEL 7 support is dropped, all supported RedHat systems will use `dnf`, so these docs should be updated accordingly. .. important:: **Except for Fedora:** The C driver libraries are only available in version 7 and newer of the respective enterprise Linux distributions. However, the C driver libraries are not available in the default repositories, but can be obtained by enabling the EPEL_ repositories. This can be done by installing the `epel-release` package:: # yum install epel-release `epel-release` must be installed before attempting to install the C driver libraries (i.e. one cannot install them both in a single `yum install` command). To install |libbson| only, install the `libbson-devel` package:: # yum install libbson-devel To install the full C database driver (|libmongoc|), install `mongo-c-driver-devel`:: ## (This package will transitively install libbson-devel) # yum install mongo-c-driver-devel To check which version is available, see https://packages.fedoraproject.org/pkgs/mongo-c-driver/mongo-c-driver-devel. The development packages (ending in `-devel`) include files required to build applications using |libbson| and |libmongoc|. To only install the libraries without development files, install the `libbson` or `mongo-c-driver-libs` packages. .. index:: !pair: installation; Debian !pair: installation; Ubuntu !pair: installation; APT .. _debian: Debian-based Systems ==================== In Debian-based Linux distributions, including Ubuntu and Ubuntu derivatives, |libbson| and |libmongoc| are available in the distribution repositories via APT, and can be installed as `libbson-dev` and `libmongoc-dev`, respectively:: ## Update repository information, if necessary: # apt update To install only |libbson|:: # apt install libbson-dev To install |libmongoc| (which will also install |libbson|):: # apt install libmongoc-dev To check which version is available, run `apt-cache policy libmongoc-dev`. The development packages (ending in `-dev`) include files required to build applications using |libbson| and |libmongoc|. To only install the libraries without development files, install the `libbson-1.0-0` or `libmongoc-1.0-0` packages. .. index:: !pair: installation; macOS !pair: installation; Homebrew package managers; Homebrew .. _installing.macos: Installing on macOS with Homebrew ********************************* If you are using a macOS system, the C driver libraries (including both |libmongoc| and |libbson|) may be installed using the Homebrew_ package manager [#macos_brew]_ with the following command:: $ brew install mongo-c-driver .. note:: Homebrew does not provide separate packages for |libbson| and |libmongoc|. .. [#macos_brew] The Homebrew_ package manager is not installed by default on macOS. For information on installing Homebrew, refer to `the Homebrew installation documentation page `_. mongo-c-driver-1.26.0/src/libmongoc/doc/learn/index.rst000066400000000000000000000002461456567454500227260ustar00rootroot00000000000000######### Tutorials ######### This section contains tutorials on how to get started with the basics of using the C driver. .. toctree:: :maxdepth: 2 get/index mongo-c-driver-1.26.0/src/libmongoc/doc/lifecycle.rst000066400000000000000000000067501456567454500224630ustar00rootroot00000000000000Object Lifecycle ================ This page documents the order of creation and destruction for libmongoc's main struct types. Clients and pools ----------------- Call :symbol:`mongoc_init()` once, before calling any other libmongoc functions, and call :symbol:`mongoc_cleanup()` once before your program exits. A program that uses libmongoc from multiple threads should create a :symbol:`mongoc_client_pool_t` with :symbol:`mongoc_client_pool_new()`. Each thread acquires a :symbol:`mongoc_client_t` from the pool with :symbol:`mongoc_client_pool_pop()` and returns it with :symbol:`mongoc_client_pool_push()` when the thread is finished using it. To destroy the pool, first return all clients, then call :symbol:`mongoc_client_pool_destroy()`. If your program uses libmongoc from only one thread, create a :symbol:`mongoc_client_t` directly with :symbol:`mongoc_client_new()` or :symbol:`mongoc_client_new_from_uri()`. Destroy it with :symbol:`mongoc_client_destroy()`. Databases, collections, and related objects ------------------------------------------- You can create a :symbol:`mongoc_database_t` or :symbol:`mongoc_collection_t` from a :symbol:`mongoc_client_t`, and create a :symbol:`mongoc_cursor_t` or :symbol:`mongoc_bulk_operation_t` from a :symbol:`mongoc_collection_t`. Each of these objects must be destroyed before the client they were created from, but their lifetimes are otherwise independent. GridFS objects -------------- You can create a :symbol:`mongoc_gridfs_t` from a :symbol:`mongoc_client_t`, create a :symbol:`mongoc_gridfs_file_t` or :symbol:`mongoc_gridfs_file_list_t` from a :symbol:`mongoc_gridfs_t`, create a :symbol:`mongoc_gridfs_file_t` from a :symbol:`mongoc_gridfs_file_list_t`, and create a :symbol:`mongoc_stream_t` from a :symbol:`mongoc_gridfs_file_t`. Each of these objects depends on the object it was created from. Always destroy GridFS objects in the reverse of the order they were created. The sole exception is that a :symbol:`mongoc_gridfs_file_t` need not be destroyed before the :symbol:`mongoc_gridfs_file_list_t` it was created from. GridFS bucket objects --------------------- Create :symbol:`mongoc_gridfs_bucket_t` with a :symbol:`mongoc_database_t` derived from a :symbol:`mongoc_client_t`. The :symbol:`mongoc_database_t` is independent from the :symbol:`mongoc_gridfs_bucket_t`. But the :symbol:`mongoc_client_t` must outlive the :symbol:`mongoc_gridfs_bucket_t`. A :symbol:`mongoc_stream_t` may be created from the :symbol:`mongoc_gridfs_bucket_t`. The :symbol:`mongoc_gridfs_bucket_t` must outlive the :symbol:`mongoc_stream_t`. Sessions -------- .. include:: includes/session-lifecycle.txt Client Side Encryption ---------------------- When configuring a :symbol:`mongoc_client_t` for automatic encryption via :symbol:`mongoc_client_enable_auto_encryption()`, if a separate key vault client is set in the options (via :symbol:`mongoc_auto_encryption_opts_set_keyvault_client()`) the key vault client must outlive the encrypted client. When configuring a :symbol:`mongoc_client_pool_t` for automatic encryption via :symbol:`mongoc_client_pool_enable_auto_encryption()`, if a separate key vault client pool is set in the options (via :symbol:`mongoc_auto_encryption_opts_set_keyvault_client_pool()`) the key vault client pool must outlive the encrypted client pool. When creating a :symbol:`mongoc_client_encryption_t`, the configured key vault client (set via :symbol:`mongoc_client_encryption_opts_set_keyvault_client()`) must outlive the :symbol:`mongoc_client_encryption_t`.mongo-c-driver-1.26.0/src/libmongoc/doc/logging.rst000066400000000000000000000075701456567454500221530ustar00rootroot00000000000000:man_page: mongoc_logging Logging ======= MongoDB C driver Logging Abstraction Synopsis -------- .. code-block:: c typedef enum { MONGOC_LOG_LEVEL_ERROR, MONGOC_LOG_LEVEL_CRITICAL, MONGOC_LOG_LEVEL_WARNING, MONGOC_LOG_LEVEL_MESSAGE, MONGOC_LOG_LEVEL_INFO, MONGOC_LOG_LEVEL_DEBUG, MONGOC_LOG_LEVEL_TRACE, } mongoc_log_level_t; #define MONGOC_ERROR(...) #define MONGOC_CRITICAL(...) #define MONGOC_WARNING(...) #define MONGOC_MESSAGE(...) #define MONGOC_INFO(...) #define MONGOC_DEBUG(...) typedef void (*mongoc_log_func_t) (mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data); void mongoc_log_set_handler (mongoc_log_func_t log_func, void *user_data); void mongoc_log (mongoc_log_level_t log_level, const char *log_domain, const char *format, ...) BSON_GNUC_PRINTF (3, 4); const char * mongoc_log_level_str (mongoc_log_level_t log_level); void mongoc_log_default_handler (mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data); void mongoc_log_trace_enable (void); void mongoc_log_trace_disable (void); The MongoDB C driver comes with an abstraction for logging that you can use in your application, or integrate with an existing logging system. Macros ------ To make logging a little less painful, various helper macros are provided. See the following example. .. code-block:: c #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "my-custom-domain" MONGOC_WARNING ("An error occurred: %s", strerror (errno)); .. _custom_log_handlers: Custom Log Handlers ------------------- The default log handler prints a timestamp and the log message to ``stdout``, or to ``stderr`` for warnings, critical messages, and errors. You can override the handler with ``mongoc_log_set_handler()``. Your handler function is called in a mutex for thread safety. For example, you could register a custom handler to suppress messages at INFO level and below: .. code-block:: c void my_logger (mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data) { /* smaller values are more important */ if (log_level < MONGOC_LOG_LEVEL_INFO) { mongoc_log_default_handler (log_level, log_domain, message, user_data); } } int main (int argc, char *argv[]) { mongoc_log_set_handler (my_logger, NULL); mongoc_init (); /* ... your code ... */ mongoc_cleanup (); return 0; } Note that in the example above ``mongoc_log_set_handler()`` is called before ``mongoc_init()``. Otherwise, some log traces could not be processed by the log handler. To restore the default handler: .. code-block:: c mongoc_log_set_handler (mongoc_log_default_handler, NULL); Disable logging --------------- To disable all logging, including warnings, critical messages and errors, provide an empty log handler: .. code-block:: c mongoc_log_set_handler (NULL, NULL); Tracing ------- If compiling your own copy of the MongoDB C driver, consider configuring with ``-DENABLE_TRACING=ON`` to enable function tracing and hex dumps of network packets to ``STDERR`` and ``STDOUT`` during development and debugging. This is especially useful when debugging what may be going on internally in the driver. Trace messages can be enabled and disabled by calling ``mongoc_log_trace_enable()`` and ``mongoc_log_trace_disable()`` .. note:: Compiling the driver with ``-DENABLE_TRACING=ON`` will affect its performance. Disabling tracing with ``mongoc_log_trace_disable()`` significantly reduces the overhead, but cannot remove it completely. mongo-c-driver-1.26.0/src/libmongoc/doc/manage-collection-indexes.rst000066400000000000000000000047661456567454500255470ustar00rootroot00000000000000:man_page: mongoc_manage_collection_indexes Manage Collection Indexes ========================= To create indexes on a MongoDB collection, use :symbol:`mongoc_collection_create_indexes_with_opts`: .. literalinclude:: ../examples/example-manage-collection-indexes.c :language: c :start-after: // Create an index ... begin :end-before: // Create an index ... end :dedent: 6 To list indexes, use :symbol:`mongoc_collection_find_indexes_with_opts`: .. literalinclude:: ../examples/example-manage-collection-indexes.c :language: c :start-after: // List indexes ... begin :end-before: // List indexes ... end :dedent: 6 To drop an index, use :symbol:`mongoc_collection_drop_index_with_opts`. The index name may be obtained from the ``keys`` document with :symbol:`mongoc_collection_keys_to_index_string`: .. literalinclude:: ../examples/example-manage-collection-indexes.c :language: c :start-after: // Drop an index ... begin :end-before: // Drop an index ... end :dedent: 6 For a full example, see `example-manage-collection-indexes.c `_. Manage Atlas Search Indexes --------------------------- To create an Atlas Search Index, use the ``createSearchIndexes`` command: .. literalinclude:: ../examples/example-manage-search-indexes.c :language: c :start-after: // Create an Atlas Search Index ... begin :end-before: // Create an Atlas Search Index ... end :dedent: 6 To list Atlas Search Indexes, use the ``$listSearchIndexes`` aggregation stage: .. literalinclude:: ../examples/example-manage-search-indexes.c :language: c :start-after: // List Atlas Search Indexes ... begin :end-before: // List Atlas Search Indexes ... end :dedent: 6 To update an Atlas Search Index, use the ``updateSearchIndex`` command: .. literalinclude:: ../examples/example-manage-search-indexes.c :language: c :start-after: // Update an Atlas Search Index ... begin :end-before: // Update an Atlas Search Index ... end :dedent: 6 To drop an Atlas Search Index, use the ``dropSearchIndex`` command: .. literalinclude:: ../examples/example-manage-search-indexes.c :language: c :start-after: // Drop an Atlas Search Index ... begin :end-before: // Drop an Atlas Search Index ... end :dedent: 6 For a full example, see `example-manage-search-indexes.c `_. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc-common-task-examples.rst000066400000000000000000000051761456567454500260510ustar00rootroot00000000000000:man_page: mongoc_common_task_examples Common Tasks ============ Drivers for some other languages provide helper functions to perform certain common tasks. In the C Driver we must explicitly build commands to send to the server. Setup ----- First we'll write some code to insert sample data: .. literalinclude:: ../examples/doc-common-insert.c :language: c :caption: doc-common-insert.c "explain" Command ----------------- This is how to use the ``explain`` command in MongoDB 3.2+: .. literalinclude:: ../examples/common_operations/explain.c :language: c :caption: explain.c Running the Examples -------------------- .. literalinclude:: ../examples/common_operations/common-operations.c :language: c :caption: common-operations.c First launch two separate instances of mongod (must be done from separate shells): .. code-block:: none $ mongod .. code-block:: none $ mkdir /tmp/db2 $ mongod --dbpath /tmp/db2 --port 27018 # second instance Now compile and run the example program: .. code-block:: none $ cd examples/common_operations/$ gcc -Wall -o example common-operations.c $(pkg-config --cflags --libs libmongoc-1.0)$ ./example localhost:27017 localhost:27018 Inserting data explain { "executionStats" : { "allPlansExecution" : [], "executionStages" : { "advanced" : 19, "direction" : "forward" , "docsExamined" : 76, "executionTimeMillisEstimate" : 0, "filter" : { "x" : { "$eq" : 1 } }, "invalidates" : 0, "isEOF" : 1, "nReturned" : 19, "needTime" : 58, "needYield" : 0, "restoreState" : 0, "saveState" : 0, "stage" : "COLLSCAN" , "works" : 78 }, "executionSuccess" : true, "executionTimeMillis" : 0, "nReturned" : 19, "totalDocsExamined" : 76, "totalKeysExamined" : 0 }, "ok" : 1, "queryPlanner" : { "indexFilterSet" : false, "namespace" : "test.things", "parsedQuery" : { "x" : { "$eq" : 1 } }, "plannerVersion" : 1, "rejectedPlans" : [], "winningPlan" : { "direction" : "forward" , "filter" : { "x" : { "$eq" : 1 } }, "stage" : "COLLSCAN" } }, "serverInfo" : { "gitVersion" : "05552b562c7a0b3143a729aaa0838e558dc49b25" , "host" : "MacBook-Pro-57.local", "port" : 27017, "version" : "3.2.6" } } mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_callbacks_destroy.rst000066400000000000000000000006351456567454500264070ustar00rootroot00000000000000:man_page: mongoc_apm_callbacks_destroy mongoc_apm_callbacks_destroy() ============================== Synopsis -------- .. code-block:: c void mongoc_apm_callbacks_destroy (mongoc_apm_callbacks_t *callbacks); Free a :symbol:`mongoc_apm_callbacks_t`. Does nothing if ``callbacks`` is NULL. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_callbacks_new.rst000066400000000000000000000007651456567454500255130ustar00rootroot00000000000000:man_page: mongoc_apm_callbacks_new mongoc_apm_callbacks_new() ========================== Synopsis -------- .. code-block:: c mongoc_apm_callbacks_t * mongoc_apm_callbacks_new (void) BSON_GNUC_WARN_UNUSED_RESULT; Create a struct to hold event-notification callbacks. Returns ------- A new ``mongoc_apm_callbacks_t`` you must free with :symbol:`mongoc_apm_callbacks_destroy`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_callbacks_t.rst000066400000000000000000000022401456567454500251530ustar00rootroot00000000000000:man_page: mongoc_apm_callbacks_t mongoc_apm_callbacks_t ====================== Notification callbacks Synopsis -------- Used to receive notification of events, such as when a MongoDB command begins, succeeds, or fails. Create a ``mongoc_apm_callbacks_t`` with :symbol:`mongoc_apm_callbacks_new`, set callbacks on it, then pass it to :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_callbacks_destroy mongoc_apm_callbacks_new mongoc_apm_set_command_failed_cb mongoc_apm_set_command_started_cb mongoc_apm_set_command_succeeded_cb mongoc_apm_set_server_changed_cb mongoc_apm_set_server_closed_cb mongoc_apm_set_server_heartbeat_failed_cb mongoc_apm_set_server_heartbeat_started_cb mongoc_apm_set_server_heartbeat_succeeded_cb mongoc_apm_set_server_opening_cb mongoc_apm_set_topology_changed_cb mongoc_apm_set_topology_closed_cb mongoc_apm_set_topology_opening_cb mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_command_name.rst000066400000000000000000000013251456567454500311730ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_command_name mongoc_apm_command_failed_get_command_name() ============================================ Synopsis -------- .. code-block:: c const char * mongoc_apm_command_failed_get_command_name ( const mongoc_apm_command_failed_t *event); Returns this event's command name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_context.rst000066400000000000000000000011631456567454500302410ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_context mongoc_apm_command_failed_get_context() ======================================= Synopsis -------- .. code-block:: c void * mongoc_apm_command_failed_get_context ( const mongoc_apm_command_failed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_duration.rst000066400000000000000000000010521456567454500303770ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_duration mongoc_apm_command_failed_get_duration() ======================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_failed_get_duration ( const mongoc_apm_command_failed_t *event); Returns this event's duration in microseconds. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The event's duration. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_error.rst000066400000000000000000000011501456567454500277020ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_error mongoc_apm_command_failed_get_error() ===================================== Synopsis -------- .. code-block:: c void mongoc_apm_command_failed_get_error (const mongoc_apm_command_failed_t *event, bson_error_t *error); Copies this event's error info. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. * ``error``: A :symbol:`bson:bson_error_t` to receive the event's error info. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_host.rst000066400000000000000000000014651456567454500275370ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_host mongoc_apm_command_failed_get_host() ==================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_command_failed_get_host (const mongoc_apm_command_failed_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_operation_id.rst000066400000000000000000000013011456567454500312230ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_operation_id mongoc_apm_command_failed_get_operation_id() ============================================ Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_failed_get_operation_id ( const mongoc_apm_command_failed_t *event); Returns this event's operation id. This number correlates all the commands in a bulk operation, or all the "find" and "getMore" commands required to stream a large query result. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The event's operation id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_reply.rst000066400000000000000000000016211456567454500277070ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_reply mongoc_apm_command_failed_get_reply() ======================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_apm_command_failed_get_reply ( const mongoc_apm_command_failed_t *event); Returns the server's reply to a command that failed. The reply contains details about why the command failed. If no server reply was received, such as in the event of a network error, then the reply is a valid empty BSON document. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_request_id.rst000066400000000000000000000011761456567454500307250ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_request_id mongoc_apm_command_failed_get_request_id() ========================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_failed_get_request_id ( const mongoc_apm_command_failed_t *event); Returns this event's wire-protocol request id. Use this number to correlate client-side events with server log messages. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The event's request id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_server_connection_id.rst000066400000000000000000000022651456567454500327620ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_server_connection_id mongoc_apm_command_failed_get_server_connection_id() ==================================================== .. warning:: .. deprecated:: 1.24.0 This function is deprecated and should not be used in new code. Please use :symbol:`mongoc_apm_command_failed_get_server_connection_id_int64()` in new code. Synopsis -------- .. code-block:: c int32_t mongoc_apm_command_failed_get_server_connection_id ( const mongoc_apm_command_failed_t *event) BSON_GNUC_DEPRECATED_FOR ( "mongoc_apm_command_failed_get_server_connection_id_int64"); Returns this event's context. Returns the server connection ID for the command. The server connection ID is distinct from the server ID (:symbol:`mongoc_apm_command_failed_get_server_id`) and is returned by the hello or legacy hello response as "connectionId" from the server on 4.2+. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The server connection ID as a positive integer or -1 if it is not available. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_server_connection_id_int64.rst000066400000000000000000000016271456567454500340070ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_server_connection_id_int64 mongoc_apm_command_failed_get_server_connection_id_int64() ========================================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_failed_get_server_connection_id_int64 ( const mongoc_apm_command_failed_t *event); Returns this event's context. Returns the server connection ID for the command. The server connection ID is distinct from the server ID (:symbol:`mongoc_apm_command_failed_get_server_id`) and is returned by the hello or legacy hello response as "connectionId" from the server on 4.2+. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The server connection ID as a positive integer or -1 if it is not available. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_server_id.rst000066400000000000000000000010411456567454500305320ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_server_id mongoc_apm_command_failed_get_server_id() ========================================= Synopsis -------- .. code-block:: c uint32_t mongoc_apm_command_failed_get_server_id ( const mongoc_apm_command_failed_t *event); Returns this event's server id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The event's server id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_get_service_id.rst000066400000000000000000000011451456567454500306710ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_service_id mongoc_apm_command_failed_get_service_id() ========================================== Synopsis -------- .. code-block:: c const bson_oid_t * mongoc_apm_command_failed_get_service_id ( const mongoc_apm_command_failed_t *event); Returns this event's service ID, which identifies the MongoDB service behind a load balancer, or ``NULL`` if not connected to a load balanced cluster. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- A :symbol:`bson_oid_t` that should not be modified or freed or ``NULL``. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_failed_t.rst000066400000000000000000000017141456567454500261630ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_t mongoc_apm_command_failed_t =========================== Command-failed event Synopsis -------- An event notification sent when the driver fails to execute a MongoDB command. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_command_failed_get_command_name mongoc_apm_command_failed_get_context mongoc_apm_command_failed_get_duration mongoc_apm_command_failed_get_error mongoc_apm_command_failed_get_host mongoc_apm_command_failed_get_operation_id mongoc_apm_command_failed_get_reply mongoc_apm_command_failed_get_request_id mongoc_apm_command_failed_get_server_id mongoc_apm_command_failed_get_service_id mongoc_apm_command_failed_get_server_connection_id mongoc_apm_command_failed_get_server_connection_id_int64 .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_command.rst000066400000000000000000000013231456567454500304130ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_command mongoc_apm_command_started_get_command() ======================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_apm_command_started_get_command ( const mongoc_apm_command_started_t *event); Returns this event's command. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_command_name.rst000066400000000000000000000013331456567454500314140ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_command_name mongoc_apm_command_started_get_command_name() ============================================= Synopsis -------- .. code-block:: c const char * mongoc_apm_command_started_get_command_name ( const mongoc_apm_command_started_t *event); Returns this event's command name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_context.rst000066400000000000000000000011711456567454500304620ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_context mongoc_apm_command_started_get_context() ======================================== Synopsis -------- .. code-block:: c void * mongoc_apm_command_started_get_context ( const mongoc_apm_command_started_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_database_name.rst000066400000000000000000000013401456567454500315400ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_database_name mongoc_apm_command_started_get_database_name() ============================================== Synopsis -------- .. code-block:: c const char * mongoc_apm_command_started_get_database_name ( const mongoc_apm_command_started_t *event); Returns this event's database name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_host.rst000066400000000000000000000014731456567454500277600ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_host mongoc_apm_command_started_get_host() ===================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_command_started_get_host (const mongoc_apm_command_started_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_operation_id.rst000066400000000000000000000013071456567454500314530ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_operation_id mongoc_apm_command_started_get_operation_id() ============================================= Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_started_get_operation_id ( const mongoc_apm_command_started_t *event); Returns this event's operation id. This number correlates all the commands in a bulk operation, or all the "find" and "getMore" commands required to stream a large query result. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The event's operation id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_request_id.rst000066400000000000000000000012041456567454500311370ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_request_id mongoc_apm_command_started_get_request_id() =========================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_started_get_request_id ( const mongoc_apm_command_started_t *event); Returns this event's wire-protocol request id. Use this number to correlate client-side events with server log messages. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The event's request id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_server_connection_id.rst000066400000000000000000000022421456567454500331770ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_server_connection_id mongoc_apm_command_started_get_server_connection_id() ===================================================== .. warning:: .. deprecated:: 1.24.0 This function is deprecated and should not be used in new code. Please use :symbol:`mongoc_apm_command_started_get_server_connection_id_int64()` in new code. Synopsis -------- .. code-block:: c int32_t mongoc_apm_command_started_get_server_connection_id ( const mongoc_apm_command_started_t *event) BSON_GNUC_DEPRECATED_FOR ( "mongoc_apm_command_started_get_server_connection_id_int64"); Returns the server connection ID for the command. The server connection ID is distinct from the server ID (:symbol:`mongoc_apm_command_started_get_server_id`) and is returned by the hello or legacy hello response as "connectionId" from the server on 4.2+. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The server connection ID as a positive integer or -1 if it is not available. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongoc_apm_command_started_get_server_connection_id_int64.rst000066400000000000000000000015771456567454500341560ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc:man_page: mongoc_apm_command_started_get_server_connection_id_int64 mongoc_apm_command_started_get_server_connection_id_int64() =========================================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_started_get_server_connection_id_int64 ( const mongoc_apm_command_started_t *event); Returns the server connection ID for the command. The server connection ID is distinct from the server ID (:symbol:`mongoc_apm_command_started_get_server_id`) and is returned by the hello or legacy hello response as "connectionId" from the server on 4.2+. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The server connection ID as a positive integer or -1 if it is not available. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_server_id.rst000066400000000000000000000010471456567454500307620ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_server_id mongoc_apm_command_started_get_server_id() ========================================== Synopsis -------- .. code-block:: c uint32_t mongoc_apm_command_started_get_server_id ( const mongoc_apm_command_started_t *event); Returns this event's server id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The event's server id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_get_service_id.rst000066400000000000000000000011531456567454500311120ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_service_id mongoc_apm_command_started_get_service_id() =========================================== Synopsis -------- .. code-block:: c const bson_oid_t * mongoc_apm_command_started_get_service_id ( const mongoc_apm_command_started_t *event); Returns this event's service ID, which identifies the MongoDB service behind a load balancer, or ``NULL`` if not connected to a load balanced cluster. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A :symbol:`bson_oid_t` that should not be modified or freed or ``NULL``. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_started_t.rst000066400000000000000000000016721456567454500264100ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_t mongoc_apm_command_started_t ============================ Command-started event Synopsis -------- An event notification sent when the driver begins executing a MongoDB command. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_command_started_get_command mongoc_apm_command_started_get_command_name mongoc_apm_command_started_get_context mongoc_apm_command_started_get_database_name mongoc_apm_command_started_get_host mongoc_apm_command_started_get_operation_id mongoc_apm_command_started_get_request_id mongoc_apm_command_started_get_server_id mongoc_apm_command_started_get_service_id mongoc_apm_command_started_get_server_connection_id mongoc_apm_command_started_get_server_connection_id_int64 mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_command_name.rst000066400000000000000000000013471456567454500316770ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_command_name mongoc_apm_command_succeeded_get_command_name() =============================================== Synopsis -------- .. code-block:: c const char * mongoc_apm_command_succeeded_get_command_name ( const mongoc_apm_command_succeeded_t *event); Returns this event's command name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_context.rst000066400000000000000000000012051456567454500307360ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_context mongoc_apm_command_succeeded_get_context() ========================================== Synopsis -------- .. code-block:: c void * mongoc_apm_command_succeeded_get_context ( const mongoc_apm_command_succeeded_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_duration.rst000066400000000000000000000010741456567454500311030ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_duration mongoc_apm_command_succeeded_get_duration() =========================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_succeeded_get_duration ( const mongoc_apm_command_succeeded_t *event); Returns this event's duration in microseconds. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The event's duration. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_host.rst000066400000000000000000000015151456567454500302330ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_host mongoc_apm_command_succeeded_get_host() ======================================= Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_command_succeeded_get_host ( const mongoc_apm_command_succeeded_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_operation_id.rst000066400000000000000000000013231456567454500317270ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_operation_id mongoc_apm_command_succeeded_get_operation_id() =============================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_succeeded_get_operation_id ( const mongoc_apm_command_succeeded_t *event); Returns this event's operation id. This number correlates all the commands in a bulk operation, or all the "find" and "getMore" commands required to stream a large query result. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The event's operation id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_reply.rst000066400000000000000000000013251456567454500304100ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_reply mongoc_apm_command_succeeded_get_reply() ======================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_apm_command_succeeded_get_reply ( const mongoc_apm_command_succeeded_t *event); Returns this event's reply. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_request_id.rst000066400000000000000000000012201456567454500314130ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_request_id mongoc_apm_command_succeeded_get_request_id() ============================================= Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_succeeded_get_request_id ( const mongoc_apm_command_succeeded_t *event); Returns this event's wire-protocol request id. Use this number to correlate client-side events with server log messages. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The event's request id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_server_connection_id.rst000066400000000000000000000022611456567454500334560ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_server_connection_id mongoc_apm_command_succeeded_get_server_connection_id() ======================================================= .. warning:: .. deprecated:: 1.24.0 This function is deprecated and should not be used in new code. Please use :symbol:`mongoc_apm_command_succeeded_get_server_connection_id_int64()` in new code. Synopsis -------- .. code-block:: c int32_t mongoc_apm_command_succeeded_get_server_connection_id ( const mongoc_apm_command_succeeded_t *event) BSON_GNUC_DEPRECATED_FOR ( "mongoc_apm_command_succeeded_get_server_connection_id_int64"); Returns the server connection ID for the command. The server connection ID is distinct from the server ID (:symbol:`mongoc_apm_command_succeeded_get_server_id`) and is returned by the hello or legacy hello response as "connectionId" from the server on 4.2+. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The server connection ID as a positive integer or -1 if it is not available. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongoc_apm_command_succeeded_get_server_connection_id_int64.rst000066400000000000000000000016151456567454500344250ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc:man_page: mongoc_apm_command_succeeded_get_server_connection_id_int64 mongoc_apm_command_succeeded_get_server_connection_id_int64() ============================================================= Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_succeeded_get_server_connection_id_int64 ( const mongoc_apm_command_succeeded_t *event); Returns the server connection ID for the command. The server connection ID is distinct from the server ID (:symbol:`mongoc_apm_command_succeeded_get_server_id`) and is returned by the hello or legacy hello response as "connectionId" from the server on 4.2+. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The server connection ID as a positive integer or -1 if it is not available. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_server_id.rst000066400000000000000000000010631456567454500312360ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_server_id mongoc_apm_command_succeeded_get_server_id() ============================================ Synopsis -------- .. code-block:: c uint32_t mongoc_apm_command_succeeded_get_server_id ( const mongoc_apm_command_succeeded_t *event); Returns this event's server id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The event's server id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_get_service_id.rst000066400000000000000000000011671456567454500313750ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_service_id mongoc_apm_command_succeeded_get_service_id() ============================================= Synopsis -------- .. code-block:: c const bson_oid_t * mongoc_apm_command_succeeded_get_service_id ( const mongoc_apm_command_succeeded_t *event); Returns this event's service ID, which identifies the MongoDB service behind a load balancer, or ``NULL`` if not connected to a load balanced cluster. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- A :symbol:`bson_oid_t` that should not be modified or freed or ``NULL``. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_command_succeeded_t.rst000066400000000000000000000017261456567454500266660ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_t mongoc_apm_command_succeeded_t ============================== Command-succeeded event Synopsis -------- An event notification sent when the driver successfully executes a MongoDB command. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_command_succeeded_get_command_name mongoc_apm_command_succeeded_get_context mongoc_apm_command_succeeded_get_duration mongoc_apm_command_succeeded_get_host mongoc_apm_command_succeeded_get_operation_id mongoc_apm_command_succeeded_get_reply mongoc_apm_command_succeeded_get_request_id mongoc_apm_command_succeeded_get_server_id mongoc_apm_command_succeeded_get_service_id mongoc_apm_command_succeeded_get_server_connection_id mongoc_apm_command_succeeded_get_server_connection_id_int64 mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_changed_get_context.rst000066400000000000000000000011631456567454500302760ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_context mongoc_apm_server_changed_get_context() ======================================= Synopsis -------- .. code-block:: c void * mongoc_apm_server_changed_get_context ( const mongoc_apm_server_changed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_changed_get_host.rst000066400000000000000000000014651456567454500275740ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_host mongoc_apm_server_changed_get_host() ==================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_changed_get_host (const mongoc_apm_server_changed_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_changed_get_new_description.rst000066400000000000000000000014321456567454500320050ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_new_description mongoc_apm_server_changed_get_new_description() =============================================== Synopsis -------- .. code-block:: c const mongoc_server_description_t * mongoc_apm_server_changed_get_new_description ( const mongoc_apm_server_changed_t *event); Returns this event's new description. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. Returns ------- A :symbol:`mongoc_server_description_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_changed_get_previous_description.rst000066400000000000000000000014631456567454500330740ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_previous_description mongoc_apm_server_changed_get_previous_description() ==================================================== Synopsis -------- .. code-block:: c const mongoc_server_description_t * mongoc_apm_server_changed_get_previous_description ( const mongoc_apm_server_changed_t *event); Returns this event's previous description. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. Returns ------- A :symbol:`mongoc_server_description_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_changed_get_topology_id.rst000066400000000000000000000012251456567454500311410ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_topology_id mongoc_apm_server_changed_get_topology_id() =========================================== Synopsis -------- .. code-block:: c void mongoc_apm_server_changed_get_topology_id ( const mongoc_apm_server_changed_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_changed_t.rst000066400000000000000000000012501456567454500262130ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_t mongoc_apm_server_changed_t =========================== Server-changed event Synopsis -------- An event notification sent when the driver observes a change in status of a server it is connected to. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_changed_get_context mongoc_apm_server_changed_get_host mongoc_apm_server_changed_get_new_description mongoc_apm_server_changed_get_previous_description mongoc_apm_server_changed_get_topology_id mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_closed_get_context.rst000066400000000000000000000011471456567454500301600ustar00rootroot00000000000000:man_page: mongoc_apm_server_closed_get_context mongoc_apm_server_closed_get_context() ====================================== Synopsis -------- .. code-block:: c void * mongoc_apm_server_closed_get_context (const mongoc_apm_server_closed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_closed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_closed_get_host.rst000066400000000000000000000014571456567454500274550ustar00rootroot00000000000000:man_page: mongoc_apm_server_closed_get_host mongoc_apm_server_closed_get_host() =================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_closed_get_host (const mongoc_apm_server_closed_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_closed_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_closed_get_topology_id.rst000066400000000000000000000012171456567454500310220ustar00rootroot00000000000000:man_page: mongoc_apm_server_closed_get_topology_id mongoc_apm_server_closed_get_topology_id() ========================================== Synopsis -------- .. code-block:: c void mongoc_apm_server_closed_get_topology_id ( const mongoc_apm_server_closed_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_closed_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_closed_t.rst000066400000000000000000000011151456567454500260730ustar00rootroot00000000000000:man_page: mongoc_apm_server_closed_t mongoc_apm_server_closed_t ========================== Server-closed event Synopsis -------- An event notification sent when the driver stops monitoring a server and removes its :symbol:`mongoc_server_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_closed_get_context mongoc_apm_server_closed_get_host mongoc_apm_server_closed_get_topology_id mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_awaited.rst000066400000000000000000000012311456567454500320760ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_awaited mongoc_apm_server_heartbeat_failed_get_awaited() ================================================ Synopsis -------- .. code-block:: c bool mongoc_apm_server_heartbeat_failed_get_awaited ( const mongoc_apm_server_heartbeat_failed_t *event); Returns whether this event came from an awaitable hello. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. Returns ------- A bool indicating whether the heartbeat event came from an awaitable hello. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_context.rst000066400000000000000000000012511456567454500321460ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_context mongoc_apm_server_heartbeat_failed_get_context() ================================================ Synopsis -------- .. code-block:: c void * mongoc_apm_server_heartbeat_failed_get_context ( const mongoc_apm_server_heartbeat_failed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_duration.rst000066400000000000000000000011401456567454500323040ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_duration mongoc_apm_server_heartbeat_failed_get_duration() ================================================= Synopsis -------- .. code-block:: c int64_t mongoc_apm_server_heartbeat_failed_get_duration ( const mongoc_apm_server_heartbeat_failed_t *event); Returns this event's duration in microseconds. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. Returns ------- The event's duration. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_error.rst000066400000000000000000000011751456567454500316200ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_error mongoc_apm_server_heartbeat_failed_get_error() ============================================== Synopsis -------- .. code-block:: c void mongoc_apm_server_heartbeat_failed_get_error ( const mongoc_apm_server_heartbeat_failed_t *event, bson_error_t *error); Copies this event's error info. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. * ``error``: A :symbol:`bson:bson_error_t` to receive the event's error info. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_host.rst000066400000000000000000000015611456567454500314430ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_host mongoc_apm_server_heartbeat_failed_get_host() ============================================= Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_heartbeat_failed_get_host ( const mongoc_apm_server_heartbeat_failed_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_t.rst000066400000000000000000000013361456567454500300720ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_t mongoc_apm_server_heartbeat_failed_t ==================================== Heartbeat-failed event Synopsis -------- An event notification sent when the driver failed to send a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_heartbeat_failed_get_awaited mongoc_apm_server_heartbeat_failed_get_context mongoc_apm_server_heartbeat_failed_get_duration mongoc_apm_server_heartbeat_failed_get_error mongoc_apm_server_heartbeat_failed_get_host mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_started_get_awaited.rst000066400000000000000000000012371456567454500323260ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_started_get_awaited mongoc_apm_server_heartbeat_started_get_awaited() ================================================= Synopsis -------- .. code-block:: c bool mongoc_apm_server_heartbeat_started_get_awaited ( const mongoc_apm_server_heartbeat_started_t *event); Returns whether this event came from an awaitable hello. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_started_t`. Returns ------- A bool indicating whether the heartbeat event came from an awaitable hello. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_started_get_context.rst000066400000000000000000000012571456567454500323760ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_started_get_context mongoc_apm_server_heartbeat_started_get_context() ================================================= Synopsis -------- .. code-block:: c void * mongoc_apm_server_heartbeat_started_get_context ( const mongoc_apm_server_heartbeat_started_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_started_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_started_get_host.rst000066400000000000000000000015671456567454500316730ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_started_get_host mongoc_apm_server_heartbeat_started_get_host() ============================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_heartbeat_started_get_host ( const mongoc_apm_server_heartbeat_started_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_started_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_started_t.rst000066400000000000000000000012021456567454500303040ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_started_t mongoc_apm_server_heartbeat_started_t ===================================== Heartbeat-started event Synopsis -------- An event notification sent when the driver begins executing a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_heartbeat_started_get_awaited mongoc_apm_server_heartbeat_started_get_context mongoc_apm_server_heartbeat_started_get_host mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_awaited.rst000066400000000000000000000012531456567454500326020ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_awaited mongoc_apm_server_heartbeat_succeeded_get_awaited() =================================================== Synopsis -------- .. code-block:: c bool mongoc_apm_server_heartbeat_succeeded_get_awaited ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns whether this event came from an awaitable hello. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- A bool indicating whether the heartbeat event came from an awaitable hello. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_context.rst000066400000000000000000000012731456567454500326520ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_context mongoc_apm_server_heartbeat_succeeded_get_context() =================================================== Synopsis -------- .. code-block:: c void * mongoc_apm_server_heartbeat_succeeded_get_context ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_duration.rst000066400000000000000000000011621456567454500330100ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_duration mongoc_apm_server_heartbeat_succeeded_get_duration() ==================================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_server_heartbeat_succeeded_get_duration ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns this event's duration in microseconds. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- The event's duration. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_host.rst000066400000000000000000000016031456567454500321400ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_host mongoc_apm_server_heartbeat_succeeded_get_host() ================================================ Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_heartbeat_succeeded_get_host ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_reply.rst000066400000000000000000000014131456567454500323150ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_reply mongoc_apm_server_heartbeat_succeeded_get_reply() ================================================= Synopsis -------- .. code-block:: c const bson_t * mongoc_apm_server_heartbeat_succeeded_get_reply ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns this event's reply. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_t.rst000066400000000000000000000013641456567454500305730ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_t mongoc_apm_server_heartbeat_succeeded_t ======================================= Heartbeat-succeeded event Synopsis -------- An event notification sent when the driver completes a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_heartbeat_succeeded_get_awaited mongoc_apm_server_heartbeat_succeeded_get_context mongoc_apm_server_heartbeat_succeeded_get_duration mongoc_apm_server_heartbeat_succeeded_get_host mongoc_apm_server_heartbeat_succeeded_get_reply mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_opening_get_context.rst000066400000000000000000000011631456567454500303440ustar00rootroot00000000000000:man_page: mongoc_apm_server_opening_get_context mongoc_apm_server_opening_get_context() ======================================= Synopsis -------- .. code-block:: c void * mongoc_apm_server_opening_get_context ( const mongoc_apm_server_opening_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_opening_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_opening_get_host.rst000066400000000000000000000014651456567454500276420ustar00rootroot00000000000000:man_page: mongoc_apm_server_opening_get_host mongoc_apm_server_opening_get_host() ==================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_opening_get_host (const mongoc_apm_server_opening_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_opening_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_opening_get_topology_id.rst000066400000000000000000000012251456567454500312070ustar00rootroot00000000000000:man_page: mongoc_apm_server_opening_get_topology_id mongoc_apm_server_opening_get_topology_id() =========================================== Synopsis -------- .. code-block:: c void mongoc_apm_server_opening_get_topology_id ( const mongoc_apm_server_opening_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_opening_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_server_opening_t.rst000066400000000000000000000011371456567454500262650ustar00rootroot00000000000000:man_page: mongoc_apm_server_opening_t mongoc_apm_server_opening_t =========================== Server-opening event Synopsis -------- An event notification sent when the driver adds a :symbol:`mongoc_server_description_t` for a new server it was not monitoring before. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_opening_get_context mongoc_apm_server_opening_get_host mongoc_apm_server_opening_get_topology_id mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_command_failed_cb.rst000066400000000000000000000014331456567454500271550ustar00rootroot00000000000000:man_page: mongoc_apm_set_command_failed_cb mongoc_apm_set_command_failed_cb() ================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_command_failed_cb_t) ( const mongoc_apm_command_failed_t *event); void mongoc_apm_set_command_failed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_failed_cb_t cb); Receive an event notification whenever the driver fails to execute a MongoDB operation. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_command_failed_t` whenever a MongoDB operation fails. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_command_started_cb.rst000066400000000000000000000014461456567454500274030ustar00rootroot00000000000000:man_page: mongoc_apm_set_command_started_cb mongoc_apm_set_command_started_cb() =================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_command_started_cb_t) ( const mongoc_apm_command_started_t *event); void mongoc_apm_set_command_started_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_started_cb_t cb); Receive an event notification whenever the driver starts a MongoDB operation. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_command_started_t` whenever the driver begins a MongoDB operation. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_command_succeeded_cb.rst000066400000000000000000000014761456567454500276640ustar00rootroot00000000000000:man_page: mongoc_apm_set_command_succeeded_cb mongoc_apm_set_command_succeeded_cb() ===================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_command_succeeded_cb_t) ( const mongoc_apm_command_succeeded_t *event); void mongoc_apm_set_command_succeeded_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_succeeded_cb_t cb); Receive an event notification whenever the driver completes a MongoDB operation. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_command_succeeded_t` whenever the driver completes a MongoDB operation. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_server_changed_cb.rst000066400000000000000000000015351456567454500272150ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_changed_cb mongoc_apm_set_server_changed_cb() ================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_changed_cb_t) ( const mongoc_apm_server_changed_t *event); void mongoc_apm_set_server_changed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_changed_cb_t cb); Receive an event notification whenever the driver observes a change in status of a server it is connected to. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_changed_t` whenever the driver observes a change in status of a server it is connected to. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_server_closed_cb.rst000066400000000000000000000015761456567454500271020ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_closed_cb mongoc_apm_set_server_closed_cb() ================================= Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_closed_cb_t) ( const mongoc_apm_server_closed_t *event); void mongoc_apm_set_server_closed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_closed_cb_t cb); Receive an event notification whenever the driver stops monitoring a server and removes its :symbol:`mongoc_server_description_t`. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_closed_t` whenever the driver stops monitoring a server and removes its :symbol:`mongoc_server_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_server_heartbeat_failed_cb.rst000066400000000000000000000016701456567454500310670ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_heartbeat_failed_cb mongoc_apm_set_server_heartbeat_failed_cb() =========================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_heartbeat_failed_cb_t) ( const mongoc_apm_server_heartbeat_failed_t *event); void mongoc_apm_set_server_heartbeat_failed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_failed_cb_t cb); Receive an event notification whenever the driver fails to send a "hello" command to check the status of a server. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_heartbeat_failed_t` whenever the driver fails to send a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_server_heartbeat_started_cb.rst000066400000000000000000000017071456567454500313120ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_heartbeat_started_cb mongoc_apm_set_server_heartbeat_started_cb() ============================================ Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_heartbeat_started_cb_t) ( const mongoc_apm_server_heartbeat_started_t *event); void mongoc_apm_set_server_heartbeat_started_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_started_cb_t cb); Receive an event notification whenever the driver begins executing a "hello" command to check the status of a server. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_heartbeat_started_t` whenever the driver begins executing a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_server_heartbeat_succeeded_cb.rst000066400000000000000000000017131456567454500315650ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_heartbeat_succeeded_cb mongoc_apm_set_server_heartbeat_succeeded_cb() ============================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_heartbeat_succeeded_cb_t) ( const mongoc_apm_server_heartbeat_succeeded_t *event); void mongoc_apm_set_server_heartbeat_succeeded_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_succeeded_cb_t cb); Receive an event notification whenever the driver completes a "hello" command to check the status of a server. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_heartbeat_succeeded_t` whenever the driver completes a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_server_opening_cb.rst000066400000000000000000000016351456567454500272640ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_opening_cb mongoc_apm_set_server_opening_cb() ================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_opening_cb_t) ( const mongoc_apm_server_opening_t *event); void mongoc_apm_set_server_opening_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_opening_cb_t cb); Receive an event notification whenever the driver adds a :symbol:`mongoc_server_description_t` for a new server it was not monitoring before. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_opening_t` whenever the driver adds a :symbol:`mongoc_server_description_t` for a new server it was not monitoring before. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_topology_changed_cb.rst000066400000000000000000000017051456567454500275620ustar00rootroot00000000000000:man_page: mongoc_apm_set_topology_changed_cb mongoc_apm_set_topology_changed_cb() ==================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_topology_changed_cb_t) ( const mongoc_apm_topology_changed_t *event); void mongoc_apm_set_topology_changed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_changed_cb_t cb); Receive an event notification whenever the driver observes a change in any of the servers it is connected to or a change in the overall server topology. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_topology_changed_t` whenever the driver observes a change in any of the servers it is connected to or a change in the overall server topology. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_topology_closed_cb.rst000066400000000000000000000016501456567454500274410ustar00rootroot00000000000000:man_page: mongoc_apm_set_topology_closed_cb mongoc_apm_set_topology_closed_cb() =================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_topology_closed_cb_t) ( const mongoc_apm_topology_closed_t *event); void mongoc_apm_set_topology_closed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_closed_cb_t cb); Receive an event notification whenever the driver stops monitoring a server topology and destroys its :symbol:`mongoc_topology_description_t`. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_topology_closed_t` whenever the driver stops monitoring a server topology and destroys its :symbol:`mongoc_topology_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_set_topology_opening_cb.rst000066400000000000000000000015451456567454500276320ustar00rootroot00000000000000:man_page: mongoc_apm_set_topology_opening_cb mongoc_apm_set_topology_opening_cb() ==================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_topology_opening_cb_t) ( const mongoc_apm_topology_opening_t *event); void mongoc_apm_set_topology_opening_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_opening_cb_t cb); Receive an event notification whenever the driver initializes a :symbol:`mongoc_topology_description_t`. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_topology_opening_t` whenever the driver initializes a :symbol:`mongoc_topology_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_changed_get_context.rst000066400000000000000000000011771456567454500306510ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_get_context mongoc_apm_topology_changed_get_context() ========================================= Synopsis -------- .. code-block:: c void * mongoc_apm_topology_changed_get_context ( const mongoc_apm_topology_changed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_changed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_changed_get_new_description.rst000066400000000000000000000014521456567454500323550ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_get_new_description mongoc_apm_topology_changed_get_new_description() ================================================= Synopsis -------- .. code-block:: c const mongoc_topology_description_t * mongoc_apm_topology_changed_get_new_description ( const mongoc_apm_topology_changed_t *event); Returns this event's new description. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_changed_t`. Returns ------- A :symbol:`mongoc_topology_description_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_changed_get_previous_description.rst000066400000000000000000000015031456567454500334350ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_get_previous_description mongoc_apm_topology_changed_get_previous_description() ====================================================== Synopsis -------- .. code-block:: c const mongoc_topology_description_t * mongoc_apm_topology_changed_get_previous_description ( const mongoc_apm_topology_changed_t *event); Returns this event's previous description. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_changed_t`. Returns ------- A :symbol:`mongoc_topology_description_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_changed_get_topology_id.rst000066400000000000000000000012411456567454500315050ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_get_topology_id mongoc_apm_topology_changed_get_topology_id() ============================================= Synopsis -------- .. code-block:: c void mongoc_apm_topology_changed_get_topology_id ( const mongoc_apm_topology_changed_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_changed_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_changed_t.rst000066400000000000000000000012741456567454500265670ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_t mongoc_apm_topology_changed_t ============================= Topology-changed event Synopsis -------- An event notification sent when the driver observes a change in any of the servers it is connected to or a change in the overall server topology. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_topology_changed_get_context mongoc_apm_topology_changed_get_new_description mongoc_apm_topology_changed_get_previous_description mongoc_apm_topology_changed_get_topology_id mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_closed_get_context.rst000066400000000000000000000011711456567454500305230ustar00rootroot00000000000000:man_page: mongoc_apm_topology_closed_get_context mongoc_apm_topology_closed_get_context() ======================================== Synopsis -------- .. code-block:: c void * mongoc_apm_topology_closed_get_context ( const mongoc_apm_topology_closed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_closed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_closed_get_topology_id.rst000066400000000000000000000012331456567454500313660ustar00rootroot00000000000000:man_page: mongoc_apm_topology_closed_get_topology_id mongoc_apm_topology_closed_get_topology_id() ============================================ Synopsis -------- .. code-block:: c void mongoc_apm_topology_closed_get_topology_id ( const mongoc_apm_topology_closed_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_closed_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_closed_t.rst000066400000000000000000000010771456567454500264500ustar00rootroot00000000000000:man_page: mongoc_apm_topology_closed_t mongoc_apm_topology_closed_t ============================ Topology-closed event Synopsis -------- An event notification sent when the driver stops monitoring a server topology and destroys its :symbol:`mongoc_topology_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_topology_closed_get_context mongoc_apm_topology_closed_get_topology_id mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_opening_get_context.rst000066400000000000000000000011771456567454500307170ustar00rootroot00000000000000:man_page: mongoc_apm_topology_opening_get_context mongoc_apm_topology_opening_get_context() ========================================= Synopsis -------- .. code-block:: c void * mongoc_apm_topology_opening_get_context ( const mongoc_apm_topology_opening_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_opening_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_opening_get_topology_id.rst000066400000000000000000000012411456567454500315530ustar00rootroot00000000000000:man_page: mongoc_apm_topology_opening_get_topology_id mongoc_apm_topology_opening_get_topology_id() ============================================= Synopsis -------- .. code-block:: c void mongoc_apm_topology_opening_get_topology_id ( const mongoc_apm_topology_opening_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_opening_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_apm_topology_opening_t.rst000066400000000000000000000010371456567454500266320ustar00rootroot00000000000000:man_page: mongoc_apm_topology_opening_t mongoc_apm_topology_opening_t ============================= Topology-opening event Synopsis -------- An event notification sent when the driver initializes a :symbol:`mongoc_topology_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_topology_opening_get_context mongoc_apm_topology_opening_get_topology_id mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_destroy.rst000066400000000000000000000007461456567454500301250ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_destroy mongoc_auto_encryption_opts_destroy() ===================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_destroy (mongoc_auto_encryption_opts_t *opts); Destroy a :symbol:`mongoc_auto_encryption_opts_t`. Parameters ---------- * ``opts`` The :symbol:`mongoc_auto_encryption_opts_t` to destroy. .. seealso:: | :symbol:`mongoc_auto_encryption_opts_new()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_new.rst000066400000000000000000000022211456567454500272130ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_new mongoc_auto_encryption_opts_new() ================================= Synopsis -------- .. code-block:: c mongoc_auto_encryption_opts_t * mongoc_auto_encryption_opts_new (void) BSON_GNUC_WARN_UNUSED_RESULT; Create a new :symbol:`mongoc_auto_encryption_opts_t`. Caller must set the required options: * :symbol:`mongoc_auto_encryption_opts_set_keyvault_namespace()` * :symbol:`mongoc_auto_encryption_opts_set_kms_providers()` Caller may set optionally set the following: * :symbol:`mongoc_auto_encryption_opts_set_keyvault_client()` * :symbol:`mongoc_auto_encryption_opts_set_schema_map()` * :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption()` * :symbol:`mongoc_auto_encryption_opts_set_extra()` This options struct is used to enable auto encryption with :symbol:`mongoc_client_enable_auto_encryption()`. Returns ------- A new :symbol:`mongoc_auto_encryption_opts_t`, which must be destroyed with :symbol:`mongoc_auto_encryption_opts_destroy()`. .. seealso:: | :symbol:`mongoc_auto_encryption_opts_destroy()` | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_bypass_auto_encryption.rst000066400000000000000000000013451456567454500341060ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_bypass_auto_encryption mongoc_auto_encryption_opts_set_bypass_auto_encryption() ======================================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_bypass_auto_encryption ( mongoc_auto_encryption_opts_t *opts, bool bypass_auto_encryption); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``bypass_auto_encryption``: A boolean. If true, a :symbol:`mongoc_client_t` configured with :symbol:`mongoc_client_enable_auto_encryption()` will only perform automatic decryption (not encryption). .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_bypass_query_analysis.rst000066400000000000000000000015761456567454500337420ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_bypass_query_analysis mongoc_auto_encryption_opts_set_bypass_query_analysis() ======================================================= Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_bypass_query_analysis ( mongoc_auto_encryption_opts_t *opts, bool bypass_query_analysis); .. versionadded:: 1.22.0 Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``bypass_query_analysis``: A boolean. ``bypass_query_analysis`` disables automatic analysis of outgoing commands. ``bypass_query_analysis`` is useful for encrypting indexed fields without the ``crypt_shared`` library or ``mongocryptd`` process. Set ``bypass_query_analysis`` to true to use explicit encryption on indexed fields. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_encrypted_fields_map.rst000066400000000000000000000021101456567454500334520ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_encrypted_fields_map mongoc_auto_encryption_opts_set_encrypted_fields_map() ====================================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_encrypted_fields_map ( mongoc_auto_encryption_opts_t *opts, const bson_t *encrypted_fields_map); .. versionadded:: 1.22.0 Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``encrypted_fields_map``: A :symbol:`bson_t` where keys are collection namespaces and values are encrypted fields documents. Supplying an ``encrypted_fields_map`` provides more security than relying on an ``encryptedFields`` obtained from the server. It protects against a malicious server advertising a false ``encryptedFields``. The schema map does not apply to collections encrypted with: :doc:`Client-Side Field Level Encryption `. See :symbol:`mongoc_auto_encryption_opts_set_schema_map()` instead. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_extra.rst000066400000000000000000000060551456567454500304310ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_extra mongoc_auto_encryption_opts_set_extra() ======================================= Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_extra (mongoc_auto_encryption_opts_t *opts, const bson_t *extra); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``extra``: A :symbol:`bson_t` of additional options. ``extra`` is a :symbol:`bson_t` containing any of the following optional fields: * ``mongocryptdURI`` set to a URI to connect to the mongocryptd process (default is "mongodb://localhost:27020"). * ``mongocryptdBypassSpawn`` set to true to prevent the driver from spawning the mongocryptd process (default behavior is to spawn). * ``mongocryptdSpawnPath`` set to a path (with trailing slash) to search for mongocryptd (defaults to empty string and uses default system paths). * ``mongocryptdSpawnArgs`` set to an array of string arguments to pass to ``mongocryptd`` when spawning (defaults to ``[ "--idleShutdownTimeoutSecs=60" ]``). * ``cryptSharedLibPath`` - Set a filepath string referring to a ``crypt_shared`` library file. Unset by default. * If not set (the default), ``libmongocrypt`` will attempt to load ``crypt_shared`` using the host system's default dynamic-library-search system. * If set, the given path should identify the ``crypt_shared`` dynamic library file itself, not the directory that contains it. * If the given path is a relative path and the first path component is ``$ORIGIN``, the ``$ORIGIN`` component will be replaced with the absolute path to the directory containing the ``libmongocrypt`` library in use by the application. .. note:: No other ``RPATH``/``RUNPATH``-style substitutions are available. * If the given path is a relative path, the path will be resolved relative to the working directory of the operating system process. * If this option is set and ``libmongocrypt`` fails to load ``crypt_shared`` from the given filepath, ``libmongocrypt`` will fail to initialize and will not attempt to search for ``crypt_shared`` in any other locations. * ``cryptSharedLibRequired`` - If set to ``true``, and ``libmongocrypt`` fails to load a ``crypt_shared`` library, initialization of auto-encryption will fail immediately and will not attempt to spawn ``mongocryptd``. If set to ``false`` (the default), ``cryptSharedLibPath`` is not set, *and* ``libmongocrypt`` fails to load ``crypt_shared``, then ``libmongocrypt`` will proceed without ``crypt_shared`` and fall back to using ``mongocryptd``. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` | MongoDB Manual documentation for ``crypt_shared``: `Automatic Encryption Shared Library `_ | MongoDB Manual documentation for ``mongocryptd``: `Install and Configure mongocryptd `_ mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_keyvault_client.rst000066400000000000000000000022461456567454500325060ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_key_vault_client mongoc_auto_encryption_opts_set_keyvault_client() ================================================= Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_keyvault_client ( mongoc_auto_encryption_opts_t *opts, mongoc_client_t *client); Set an optional separate :symbol:`mongoc_client_t` to use during key lookup for automatic encryption and decryption. Only applies to automatic encryption on a single-threaded :symbol:`mongoc_client_t`. Parameters ---------- * ``opts``: A :symbol:`mongoc_auto_encryption_opts_t`. * ``client``: A :symbol:`mongoc_client_t` to use for key queries. This client should *not* have automatic encryption enabled, as it will only execute ``find`` commands against the key vault collection to retrieve keys for automatic encryption and decryption. This ``client`` MUST outlive any :symbol:`mongoc_client_t` which has been enabled to use it through :symbol:`mongoc_client_enable_auto_encryption()`. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_auto_encryption_opts_set_keyvault_client_pool()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_keyvault_client_pool.rst000066400000000000000000000024521456567454500335360ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_key_vault_client_pool mongoc_auto_encryption_opts_set_keyvault_client_pool() ====================================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_keyvault_client_pool ( mongoc_auto_encryption_opts_t *opts, mongoc_client_pool_t *pool); Set an optional separate :symbol:`mongoc_client_pool_t` to use during key lookup for automatic encryption and decryption. Only applies to automatic encryption on a :symbol:`mongoc_client_pool_t`. It is invalid to set this for automatic encryption on a single-threaded :symbol:`mongoc_client_t`. Parameters ---------- * ``opts``: A :symbol:`mongoc_auto_encryption_opts_t`. * ``pool``: A :symbol:`mongoc_client_pool_t` to use for key queries. This client pool should *not* have automatic encryption enabled, as it will only execute ``find`` commands against the key vault collection to retrieve keys for automatic encryption and decryption. This ``pool`` MUST outlive any :symbol:`mongoc_client_pool_t` which has been enabled to use it through :symbol:`mongoc_client_pool_enable_auto_encryption()`. .. seealso:: | :symbol:`mongoc_client_pool_enable_auto_encryption()` | :symbol:`mongoc_auto_encryption_opts_set_keyvault_client()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_keyvault_namespace.rst000066400000000000000000000015621456567454500331640ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_key_vault_namespace mongoc_auto_encryption_opts_set_keyvault_namespace() ==================================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_keyvault_namespace ( mongoc_auto_encryption_opts_t *opts, const char *db, const char *coll); Set the database and collection name of the key vault. The key vault is the specially designated collection containing encrypted data keys for :doc:`in-use-encryption`. Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``db``: A ``const char *`` representing the database name of the key vault collection. * ``coll``: A ``const char *`` representing the collection name of the key vault collection. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` mongoc_auto_encryption_opts_set_kms_credential_provider_callback.rst000066400000000000000000000017541456567454500357420ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc:man_page: mongoc_auto_encryption_opts_set_kms_credential_provider_callback mongoc_auto_encryption_opts_set_kms_credential_provider_callback() ================================================================== .. versionadded:: 1.23.0 Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_kms_credential_provider_callback( mongoc_auto_encryption_opts_t *opts, mongoc_kms_credentials_provider_callback_fn fn, void *userdata); Set the user-provided callback to provide KMS credentials on-demand when they are needed. Parameters ---------- - ``opts`` - The options object to update. - ``fn`` - The provider callback to set on the options object. May be ``NULL`` to clear the callback. Refer to: :c:type:`mongoc_kms_credentials_provider_callback_fn` - ``userdata`` - An arbitrary pointer that will be passed along to the callback function when it is called by libmongoc. .. seealso:: :doc:`mongoc_client_encryption_opts_set_kms_credential_provider_callback` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_kms_providers.rst000066400000000000000000000050551456567454500321740ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_kms_providers mongoc_auto_encryption_opts_set_kms_providers() =============================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_kms_providers ( mongoc_auto_encryption_opts_t *opts, const bson_t *kms_providers); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``kms_providers``: A :symbol:`bson_t` containing configuration for an external Key Management Service (KMS). ``kms_providers`` is a BSON document containing configuration for each KMS provider. KMS providers are specified as a string of the form ```` or ``:``. The supported KMS provider types are ``aws``, ``azure``, ``gcp``, ``local``, and ``kmip``. The optional name enables configuring multiple KMS providers with the same KMS provider type (e.g. ``aws:name1`` and ``aws:name2`` can refer to different AWS accounts). At least one KMS provider must be specified. The format for the KMS provider type ``aws`` is as follows: .. code-block:: javascript aws: { accessKeyId: String, secretAccessKey: String } The format for the KMS provider type ``local`` is as follows: .. code-block:: javascript local: { key: <96 byte BSON binary of subtype 0> or String /* The master key used to encrypt/decrypt data keys. May be passed as a base64 encoded string. */ } The format for the KMS provider type ``azure`` is as follows: .. code-block:: javascript azure: { tenantId: String, clientId: String, clientSecret: String, identityPlatformEndpoint: Optional /* Defaults to login.microsoftonline.com */ } The format for the KMS provider type ``gcp`` is as follows: .. code-block:: javascript gcp: { email: String, privateKey: byte[] or String, /* May be passed as a base64 encoded string. */ endpoint: Optional /* Defaults to oauth2.googleapis.com */ } The format for the KMS provider type ``kmip`` is as follows: .. code-block:: javascript kmip: { endpoint: String } KMS providers may include an optional name suffix separate with a colon. This enables configuring multiple KMS providers with the same KMS provider type. Example: .. code-block:: javascript "aws:name1": { accessKeyId: String, secretAccessKey: String }, "aws:name2": { accessKeyId: String, secretAccessKey: String } .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_schema_map.rst000066400000000000000000000040241456567454500313750ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_schema_map mongoc_auto_encryption_opts_set_schema_map() ============================================ Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_schema_map (mongoc_auto_encryption_opts_t *opts, const bson_t *schema_map); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``schema_map``: A :symbol:`bson_t` where keys are collection namespaces and values are JSON schemas. Supplying a schema map provides more security than relying on JSON Schemas obtained from the server. It protects against a malicious server advertising a false JSON Schema, which could trick the client into sending unencrypted data that should be encrypted. Schemas supplied in the schema map only apply to configuring automatic encryption for :doc:`Client-Side Field Level Encryption `. Other validation rules in the JSON schema will not be enforced by the driver and will result in an error. The following is an example of a schema map which configures automatic encryption for the collection ``db.coll``: .. code-block:: js { "db.coll": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } The schema map does not apply to collections encrypted with: :doc:`Queryable Encryption `. Use :symbol:`mongoc_auto_encryption_opts_set_encrypted_fields_map()` instead. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_set_tls_opts.rst000066400000000000000000000031241456567454500311470ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_tls_opts mongoc_auto_encryption_opts_set_tls_opts() ========================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_tls_opts ( mongoc_auto_encryption_opts_t *opts, const bson_t *tls_opts); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``tls_opts``: A :symbol:`bson_t` mapping a Key Management Service (KMS) provider to a BSON document with TLS options. ``tls_opts`` is a BSON document of the following form: .. code-block:: javascript : { tlsCaFile: Optional tlsCertificateKeyFile: Optional tlsCertificateKeyFilePassword: Optional } The KMS providers ``aws``, ``azure``, ``gcp``, and ``kmip`` are supported as keys in the ``tls_opts`` document. They may include an optional name suffix separated with a colon. Example: ``aws:name2``. ``tls_opts`` maps the KMS provider name to a BSON document for TLS options. The BSON document for TLS options may contain the following keys: - ``MONGOC_URI_TLSCERTIFICATEKEYFILE`` - ``MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD`` - ``MONGOC_URI_TLSCAFILE`` .. literalinclude:: ../examples/client-side-encryption-doc-snippets.c :caption: Example use :start-after: BEGIN:mongoc_auto_encryption_opts_set_tls_opts :end-before: END:mongoc_auto_encryption_opts_set_tls_opts :dedent: 6 See :doc:`configuring_tls` for a description of the behavior of these options. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_auto_encryption_opts_t.rst000066400000000000000000000021301456567454500266640ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_t mongoc_auto_encryption_opts_t ============================= Options for enabling automatic encryption and decryption for :doc:`in-use-encryption`. Synopsis -------- .. code-block:: c typedef struct _mongoc_auto_encryption_opts_t mongoc_auto_encryption_opts_t; .. seealso:: | :doc:`in-use-encryption` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_auto_encryption_opts_new mongoc_auto_encryption_opts_destroy mongoc_auto_encryption_opts_set_keyvault_client mongoc_auto_encryption_opts_set_keyvault_client_pool mongoc_auto_encryption_opts_set_keyvault_namespace mongoc_auto_encryption_opts_set_kms_providers mongoc_auto_encryption_opts_set_kms_credential_provider_callback mongoc_auto_encryption_opts_set_schema_map mongoc_auto_encryption_opts_set_bypass_auto_encryption mongoc_auto_encryption_opts_set_extra mongoc_auto_encryption_opts_set_tls_opts mongoc_auto_encryption_opts_set_encrypted_fields_map mongoc_auto_encryption_opts_set_bypass_query_analysis mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_delete.rst000066400000000000000000000017301456567454500264160ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_delete mongoc_bulk_operation_delete() ============================== .. warning:: .. deprecated:: 0.96.0 This function is deprecated and should not be used in new code. Please use :symbol:`mongoc_bulk_operation_remove()` in new code. Synopsis -------- .. code-block:: c void mongoc_bulk_operation_delete (mongoc_bulk_operation_t *bulk, const bson_t *selector) BSON_GNUC_DEPRECATED_FOR (mongoc_bulk_operation_remove); Deletes documents as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t`. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` | :symbol:`mongoc_bulk_operation_remove_one_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_delete_one.rst000066400000000000000000000020011456567454500272470ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_delete_one mongoc_bulk_operation_delete_one() ================================== .. warning:: .. deprecated:: 0.96.0 This function is deprecated and should not be used in new code. Please use :symbol:`mongoc_bulk_operation_remove_one()` in new code. Synopsis -------- .. code-block:: c void mongoc_bulk_operation_delete_one (mongoc_bulk_operation_t *bulk, const bson_t *selector) BSON_GNUC_DEPRECATED_FOR (mongoc_bulk_operation_remove_one); Delete a single document as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t`. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_one_with_opts()` | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_destroy.rst000066400000000000000000000006141456567454500266450ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_destroy mongoc_bulk_operation_destroy() =============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_destroy (mongoc_bulk_operation_t *bulk); Destroys a :symbol:`mongoc_bulk_operation_t` and frees the structure. Does nothing if ``bulk`` is NULL. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_execute.rst000066400000000000000000000031471456567454500266220ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_execute mongoc_bulk_operation_execute() =============================== Synopsis -------- .. code-block:: c uint32_t mongoc_bulk_operation_execute (mongoc_bulk_operation_t *bulk, bson_t *reply, bson_error_t *error); This function executes all operations queued into the bulk operation. Unless ``ordered: false`` was specified in the ``opts`` passed to :symbol:`mongoc_collection_create_bulk_operation_with_opts()`, then forward progress will be stopped upon the first error. It is only valid to call :symbol:`mongoc_bulk_operation_execute()` once. The ``mongoc_bulk_operation_t`` must be destroyed afterwards. .. warning:: ``reply`` is always initialized, even upon failure. Callers *must* call :symbol:`bson:bson_destroy()` to release this potential allocation. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- On success, returns the server id used. On failure, returns 0 and sets ``error``. A write concern timeout or write concern error is considered a failure. The ``reply`` document counts operations and collects error information. See :doc:`Bulk Write Operations ` for examples. .. seealso:: | :symbol:`Bulk Write Operations ` | :symbol:`mongoc_bulk_operation_get_hint`, which gets the id of the server used even if the operation failed. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_get_hint.rst000066400000000000000000000015441456567454500267600ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_get_hint mongoc_bulk_operation_get_hint() ================================ Synopsis -------- .. code-block:: c uint32_t mongoc_bulk_operation_get_hint (const mongoc_bulk_operation_t *bulk); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. Description ----------- Retrieves the opaque id of the server used for the operation. (The function name includes the old term "hint" for the sake of backward compatibility, but we now call this number a "server id".) This number is zero until the driver actually uses a server in :symbol:`mongoc_bulk_operation_execute`. The server id is the same number as the return value of a successful :symbol:`mongoc_bulk_operation_execute`, so ``mongoc_bulk_operation_get_hint`` is useful mainly in case :symbol:`mongoc_bulk_operation_execute` fails and returns zero. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_get_write_concern.rst000066400000000000000000000010231456567454500306470ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_get_write_concern mongoc_bulk_operation_get_write_concern() ========================================= Synopsis -------- .. code-block:: c const mongoc_write_concern_t * mongoc_bulk_operation_get_write_concern (const mongoc_bulk_operation_t *bulk); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. Description ----------- Fetches the write concern to be used for ``bulk``. Returns ------- A :symbol:`mongoc_write_concern_t` that should not be modified or freed. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_insert.rst000066400000000000000000000013341456567454500264600ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_insert mongoc_bulk_operation_insert() ============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_insert (mongoc_bulk_operation_t *bulk, const bson_t *document); Queue an insert of a single document into a bulk operation. The insert is not performed until :symbol:`mongoc_bulk_operation_execute()` is called. This function is superseded by :symbol:`mongoc_bulk_operation_insert_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``document``: A :symbol:`bson:bson_t`. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :doc:`bulk` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_insert_with_opts.rst000066400000000000000000000021071456567454500305570ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_insert_with_opts mongoc_bulk_operation_insert_with_opts() ======================================== Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_insert_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ Queue an insert of a single document into a bulk operation. The insert is not performed until :symbol:`mongoc_bulk_operation_execute()` is called. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``document``: A :symbol:`bson:bson_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/bulk-insert-opts.txt Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if passed invalid arguments. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_remove.rst000066400000000000000000000016601456567454500264530ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_remove mongoc_bulk_operation_remove() ============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_remove (mongoc_bulk_operation_t *bulk, const bson_t *selector); Remove documents as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. This function is superseded by :symbol:`mongoc_bulk_operation_remove_one_with_opts()` and :symbol:`mongoc_bulk_operation_remove_many_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t`. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_one()` | :symbol:`mongoc_bulk_operation_remove_one_with_opts()` | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_remove_many_with_opts.rst000066400000000000000000000024101456567454500315710ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_remove_many_with_opts mongoc_bulk_operation_remove_many_with_opts() ============================================= Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_remove_many_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *opts, bson_error_t *error); /* OUT */ Delete documents as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/bulk-remove-many-opts.txt Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_remove()` | :symbol:`mongoc_bulk_operation_remove_one_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_remove_one.rst000066400000000000000000000016041456567454500273120ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_remove_one mongoc_bulk_operation_remove_one() ================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_remove_one (mongoc_bulk_operation_t *bulk, const bson_t *selector); Remove a single document as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. This function is superseded by :symbol:`mongoc_bulk_operation_remove_one_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_one_with_opts()` | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_remove_one_with_opts.rst000066400000000000000000000024151456567454500314130ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_remove_one_with_opts mongoc_bulk_operation_remove_one_with_opts() ============================================ Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_remove_one_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *opts, bson_error_t *error); /* OUT */ Remove a single document as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/bulk-remove-one-opts.txt Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_one()` | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_replace_one.rst000066400000000000000000000022351456567454500274310ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_replace_one mongoc_bulk_operation_replace_one() =================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_replace_one (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); Replace a single document as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. This function is superseded by :symbol:`mongoc_bulk_operation_replace_one_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``document``: A :symbol:`bson:bson_t` containing the replacement document. * ``upsert``: ``true`` if this should be an ``upsert``. .. warning:: ``document`` may not contain fields with keys containing ``.`` or ``$``. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_replace_one_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_replace_one_with_opts.rst000066400000000000000000000027711456567454500315360ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_replace_one_with_opts mongoc_bulk_operation_replace_one_with_opts() ============================================= Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_replace_one_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ Replace a single document as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``document``: A :symbol:`bson:bson_t` containing the replacement document. * ``error``: A :symbol:`bson:bson_error_t` any errors that may have occurred. .. include:: includes/bulk-replace-one-opts.txt .. warning:: ``document`` may not contain fields with keys containing ``.`` or ``$``. Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` | :symbol:`mongoc_bulk_operation_insert()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_set_bypass_document_validation.rst000066400000000000000000000011631456567454500334400ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_bypass_document_validation mongoc_bulk_operation_set_bypass_document_validation() ====================================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_bypass_document_validation ( mongoc_bulk_operation_t *bulk, bool bypass); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``bypass``: A boolean. Description ----------- Will bypass document validation for all operations part of this :doc:`bulk `. .. seealso:: | :ref:`bulk_operation_bypassing_document_validation` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_set_client_session.rst000066400000000000000000000012741456567454500310530ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_client_session mongoc_bulk_operation_set_client_session() ========================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_client_session ( mongoc_bulk_operation_t *bulk, mongoc_client_session_t *client_session); Sets an explicit client session to use for the bulk operation. It is an error to use a session for unacknowledged writes. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``client_session``: A :symbol:`mongoc_client_session_t`. Must be derived from the same :symbol:`mongoc_client_t` as ``bulk``. .. seealso:: | :symbol:`mongoc_client_start_session()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_set_comment.rst000066400000000000000000000014731456567454500274750ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_comment mongoc_bulk_operation_set_comment() =================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_comment ( mongoc_bulk_operation_t *bulk, const bson_value_t *comment); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``comment``: A :symbol:`bson_value_t` specifying the comment to associate with this bulk write. Description ----------- Assigns a comment to attach to all commands executed as part of this :doc:`bulk `. The comment will appear in log messages, profiler output, and currentOp output. Comments for write commands are only supported by MongoDB 4.4+. It is prohibited to call this function after adding operations to the :doc:`bulk `. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_set_hint.rst000066400000000000000000000016631456567454500267760ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_hint mongoc_bulk_operation_set_hint() ================================ Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_hint (const mongoc_bulk_operation_t *bulk, uint32_t server_id); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``server_id``: An opaque id identifying the server to use. Description ----------- Specifies which server to use for the operation. This function has an effect only if called before :symbol:`mongoc_bulk_operation_execute`. (The function name includes the old term "hint" for the sake of backward compatibility, but we now call this number a "server id".) Use ``mongoc_bulk_operation_set_hint`` only for building a language driver that wraps the C Driver. When writing applications in C, leave the server id unset and allow the driver to choose a suitable server for the bulk operation. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_set_let.rst000066400000000000000000000013641456567454500266160ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_let mongoc_bulk_operation_set_let() =============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_let ( mongoc_bulk_operation_t *bulk, const bson_t *let); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. Description ----------- Defines constants that can be accessed by all update, replace, and delete operations executed as part of this :doc:`bulk `. It is prohibited to call this function after adding operations to the :doc:`bulk `. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_t.rst000066400000000000000000000032621456567454500254210ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_t mongoc_bulk_operation_t ======================= Bulk Write Operations Synopsis -------- .. code-block:: c typedef struct _mongoc_bulk_operation_t mongoc_bulk_operation_t; The opaque type ``mongoc_bulk_operation_t`` provides an abstraction for submitting multiple write operations as a single batch. After adding all of the write operations to the ``mongoc_bulk_operation_t``, call :symbol:`mongoc_bulk_operation_execute()` to execute the operation. .. warning:: It is only valid to call :symbol:`mongoc_bulk_operation_execute()` once. The ``mongoc_bulk_operation_t`` must be destroyed afterwards. .. seealso:: | :symbol:`Bulk Write Operations ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulk_operation_delete mongoc_bulk_operation_delete_one mongoc_bulk_operation_destroy mongoc_bulk_operation_execute mongoc_bulk_operation_get_hint mongoc_bulk_operation_get_write_concern mongoc_bulk_operation_insert mongoc_bulk_operation_insert_with_opts mongoc_bulk_operation_remove mongoc_bulk_operation_remove_many_with_opts mongoc_bulk_operation_remove_one mongoc_bulk_operation_remove_one_with_opts mongoc_bulk_operation_replace_one mongoc_bulk_operation_replace_one_with_opts mongoc_bulk_operation_set_bypass_document_validation mongoc_bulk_operation_set_client_session mongoc_bulk_operation_set_comment mongoc_bulk_operation_set_hint mongoc_bulk_operation_set_let mongoc_bulk_operation_update mongoc_bulk_operation_update_many_with_opts mongoc_bulk_operation_update_one mongoc_bulk_operation_update_one_with_opts mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_update.rst000066400000000000000000000024751456567454500264450ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_update mongoc_bulk_operation_update() ============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_update (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); This function queues an update as part of a bulk operation. This does not execute the operation. To execute the entirety of the bulk operation call :symbol:`mongoc_bulk_operation_execute()`. ``document`` MUST only contain fields whose key starts with ``$``. See the update document specification for more details. This function is superseded by :symbol:`mongoc_bulk_operation_update_one_with_opts()` and :symbol:`mongoc_bulk_operation_update_many_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which documents to remove. * ``document``: A :symbol:`bson:bson_t` containing the update document. * ``upsert``: ``true`` if an ``upsert`` should be performed. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_update_one_with_opts()` | :symbol:`mongoc_bulk_operation_update_many_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_update_many_with_opts.rst000066400000000000000000000031121456567454500315560ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_update_many_with_opts mongoc_bulk_operation_update_many_with_opts() ============================================= Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_update_many_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ This function queues an update as part of a bulk operation. This does not execute the operation. To execute the entirety of the bulk operation call :symbol:`mongoc_bulk_operation_execute()`. .. warning:: ``document`` MUST only contain fields whose key starts with ``$``. See the update document specification for more details. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which documents to remove. * ``document``: A :symbol:`bson:bson_t` containing the update document. * ``error``: A :symbol:`bson:bson_error_t` any errors that may have occurred. .. include:: includes/bulk-update-many-opts.txt Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if there is a server or network error or if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_update_one_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_update_one.rst000066400000000000000000000024201456567454500272740ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_update_one mongoc_bulk_operation_update_one() ================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_update_one (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); This function queues an update as part of a bulk operation. It will only modify a single document on the MongoDB server. This function does not execute the operation. To execute the entirety of the bulk operation call :symbol:`mongoc_bulk_operation_execute()`. This function is superseded by :symbol:`mongoc_bulk_operation_update_one_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``document``: A :symbol:`bson:bson_t` containing the update document. * ``upsert``: ``true`` if an ``upsert`` should be performed. .. warning:: ``document`` *must only* contain fields whose key starts with ``$``. See the update document specification for more details. .. seealso:: | :symbol:`mongoc_bulk_operation_update()` | :symbol:`mongoc_bulk_operation_update_one_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_bulk_operation_update_one_with_opts.rst000066400000000000000000000032111456567454500313730ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_update_one_with_opts mongoc_bulk_operation_update_one_with_opts() ============================================ Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_update_one_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ This function queues an update as part of a bulk operation. It will only modify a single document on the MongoDB server. This function does not execute the operation. To execute the entirety of the bulk operation call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``document``: A :symbol:`bson:bson_t` containing the update document. * ``error``: A :symbol:`bson:bson_error_t` any errors that may have occurred. .. include:: includes/bulk-update-one-opts.txt .. warning:: ``document`` *must only* contain fields whose key starts with ``$``. See the update document specification for more details. Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if there is a server or network error or if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_update_many_with_opts()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_change_stream_destroy.rst000066400000000000000000000005311456567454500264260ustar00rootroot00000000000000:man_page: mongoc_change_stream_destroy mongoc_change_stream_destroy() ============================== Synopsis -------- .. code-block:: c void mongoc_change_stream_destroy (mongoc_change_stream_t *stream); Destroys a change stream and associated data. Parameters ---------- * ``stream``: An allocated :symbol:`mongoc_change_stream_t`.mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_change_stream_error_document.rst000066400000000000000000000016611456567454500277710ustar00rootroot00000000000000:man_page: mongoc_change_stream_error_document mongoc_change_stream_error_document() ===================================== Synopsis -------- .. code-block:: c bool mongoc_change_stream_error_document (mongoc_change_stream_t *stream, bson_error_t *err, const bson_t **reply); Checks if an error has occurred when creating or iterating over a change stream. Similar to :symbol:`mongoc_cursor_error_document` if the error has occurred client-side then the ``reply`` will be set to an empty BSON document. If the error occurred server-side, ``reply`` is set to the server's reply document. Parameters ---------- * ``stream``: A :symbol:`mongoc_change_stream_t`. * ``err``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. * ``reply``: A location for a :symbol:`bson:bson_t`. Returns ------- A boolean indicating if there was an error. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_change_stream_get_resume_token.rst000066400000000000000000000021131456567454500302720ustar00rootroot00000000000000:man_page: mongoc_change_stream_get_resume_token mongoc_change_stream_get_resume_token() ======================================= Synopsis -------- .. code-block:: c const bson_t * mongoc_change_stream_get_resume_token (mongoc_change_stream_t *stream); This function returns the cached resume token, which may be passed as either the ``resumeAfter`` or ``startAfter`` option of a ``watch`` function to start a new change stream from the same point. Parameters ---------- * ``stream``: A :symbol:`mongoc_change_stream_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. Returns ``NULL`` if no resume token is available. This is possible if the change stream has not been iterated and neither ``resumeAfter`` nor ``startAfter`` options were specified in the ``watch`` function. Lifecycle --------- The returned :symbol:`bson:bson_t` is valid for the lifetime of ``stream`` and its data may be updated if :symbol:`mongoc_change_stream_next` is called after this function. The value may be copied to extend its lifetime or preserve the current resume token. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_change_stream_next.rst000066400000000000000000000022071456567454500257150ustar00rootroot00000000000000:man_page: mongoc_change_stream_next mongoc_change_stream_next() =========================== Synopsis -------- .. code-block:: c bool mongoc_change_stream_next (mongoc_change_stream_t *stream, const bson_t **bson); This function iterates the underlying cursor, setting ``bson`` to the next document. This will block for a maximum of ``maxAwaitTimeMS`` milliseconds as specified in the options when created, or the default timeout if omitted. Data may be returned before the timeout. If no data is returned this function returns ``false``. Parameters ---------- * ``stream``: A :symbol:`mongoc_change_stream_t`. * ``bson``: The location for the resulting document. Returns ------- This function returns true if a valid bson document was read from the stream. Otherwise, false if there was an error or no document was available. Errors can be determined with the :symbol:`mongoc_change_stream_error_document` function. Lifecycle --------- Similar to :symbol:`mongoc_cursor_next` the lifetime of ``bson`` is until the next call to :symbol:`mongoc_change_stream_next`, so it needs to be copied to extend the lifetime. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_change_stream_t.rst000066400000000000000000000053601456567454500252050ustar00rootroot00000000000000:man_page: mongoc_change_stream_t mongoc_change_stream_t ====================== Synopsis -------- .. code-block:: c #include typedef struct _mongoc_change_stream_t mongoc_change_stream_t; :symbol:`mongoc_change_stream_t` is a handle to a change stream. A collection change stream can be obtained using :symbol:`mongoc_collection_watch`. It is recommended to use a :symbol:`mongoc_change_stream_t` and its functions instead of a raw aggregation with a ``$changeStream`` stage. For more information see the `MongoDB Manual Entry on Change Streams `_. Example ------- .. literalinclude:: ../examples/example-collection-watch.c :language: c :caption: example-collection-watch.c Starting and Resuming ````````````````````` All ``watch`` functions accept several options to indicate where a change stream should start returning changes from: ``resumeAfter``, ``startAfter``, and ``startAtOperationTime``. All changes returned by :symbol:`mongoc_change_stream_next` include a resume token in the ``_id`` field. MongoDB 4.2 also includes an additional resume token in each "aggregate" and "getMore" command response, which points to the end of that response's batch. The current token is automatically cached by libmongoc. In the event of an error, libmongoc attempts to recreate the change stream starting where it left off by passing the cached resume token. libmongoc only attempts to resume once, but client applications can access the cached resume token with :symbol:`mongoc_change_stream_get_resume_token` and use it for their own resume logic by passing it as either the ``resumeAfter`` or ``startAfter`` option. Additionally, change streams can start returning changes at an operation time by using the ``startAtOperationTime`` field. This can be the timestamp returned in the ``operationTime`` field of a command reply. ``resumeAfter``, ``startAfter``, and ``startAtOperationTime`` are mutually exclusive options. Setting more than one will result in a server error. The following example implements custom resuming logic, persisting the resume token in a file. .. literalinclude:: ../examples/example-resume.c :language: c :caption: example-resume.c The following example shows using ``startAtOperationTime`` to synchronize a change stream with another operation. .. literalinclude:: ../examples/example-start-at-optime.c :language: c :caption: example-start-at-optime.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_watch mongoc_database_watch mongoc_collection_watch mongoc_change_stream_next mongoc_change_stream_get_resume_token mongoc_change_stream_error_document mongoc_change_stream_destroy mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_check_version.rst000066400000000000000000000010511456567454500246750ustar00rootroot00000000000000:man_page: mongoc_check_version mongoc_check_version() ====================== Synopsis -------- .. code-block:: c bool mongoc_check_version (int required_major, int required_minor, int required_micro); Parameters ---------- * ``required_major``: The minimum major version required. * ``required_minor``: The minimum minor version required. * ``required_micro``: The minimum micro version required. Returns ------- True if libmongoc's version is greater than or equal to the required version. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_cleanup.rst000066400000000000000000000003051456567454500235030ustar00rootroot00000000000000:man_page: mongoc_cleanup mongoc_cleanup() ================ Synopsis -------- .. code-block:: c void mongoc_cleanup (void); Description ----------- .. include:: includes/init_cleanup.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_command.rst000066400000000000000000000036501456567454500250360ustar00rootroot00000000000000:man_page: mongoc_client_command mongoc_client_command() ======================= Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_client_command (mongoc_client_t *client, const char *db_name, mongoc_query_flags_t flags, uint32_t skip, uint32_t limit, uint32_t batch_size, const bson_t *query, const bson_t *fields, const mongoc_read_prefs_t *read_prefs) BSON_GNUC_WARN_UNUSED_RESULT; This function is superseded by :symbol:`mongoc_client_command_with_opts()`, :symbol:`mongoc_client_read_command_with_opts()`, :symbol:`mongoc_client_write_command_with_opts()`, and :symbol:`mongoc_client_read_write_command_with_opts()`. .. include:: includes/not-retryable-read.txt Description ----------- This function creates a cursor which will execute the command when :symbol:`mongoc_cursor_next` is called on it. The client's read preference, read concern, and write concern are not applied to the command, and :symbol:`mongoc_cursor_next` will not check the server response for a write concern error or write concern timeout. If :symbol:`mongoc_cursor_next()` returns ``false``, then retrieve error details with :symbol:`mongoc_cursor_error()` or :symbol:`mongoc_cursor_error_document()`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``flags``: Unused. * ``skip``: Unused. * ``limit``: Unused. * ``batch_size``: Unused. * ``query``: A :symbol:`bson:bson_t` containing the command specification. * ``fields``: Unused. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. Otherwise, the command uses mode ``MONGOC_READ_PRIMARY``. Returns ------- A :symbol:`mongoc_cursor_t`. The cursor should be freed with :symbol:`mongoc_cursor_destroy()`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_command_simple.rst000066400000000000000000000031731456567454500264070ustar00rootroot00000000000000:man_page: mongoc_client_command_simple mongoc_client_command_simple() ============================== Synopsis -------- .. code-block:: c bool mongoc_client_command_simple (mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); This is a simplified interface to :symbol:`mongoc_client_command()`. It returns the first document from the result cursor into ``reply``. The client's read preference, read concern, and write concern are not applied to the command. .. warning:: ``reply`` is always set, and should be released with :symbol:`bson:bson_destroy()`. .. include:: includes/not-retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. Otherwise, the command uses mode ``MONGOC_READ_PRIMARY``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. This function does not check the server response for a write concern error or write concern timeout. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_command_simple_with_server_id.rst000066400000000000000000000023461456567454500315050ustar00rootroot00000000000000:man_page: mongoc_client_command_simple_with_server_id mongoc_client_command_simple_with_server_id() ============================================= Synopsis -------- .. code-block:: c bool mongoc_client_command_simple_with_server_id ( mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, uint32_t server_id, bson_t *reply, bson_error_t *error); This function executes a command on a specific server, using the database and command specification provided. .. include:: includes/not-retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``server_id``: An opaque id specifying which server to use. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or a ``NULL``. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. This function does not check the server response for a write concern error or write concern timeout. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_command_with_opts.rst000066400000000000000000000035121456567454500271330ustar00rootroot00000000000000:man_page: mongoc_client_command_with_opts mongoc_client_command_with_opts() ================================= Synopsis -------- .. code-block:: c bool mongoc_client_command_with_opts ( mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, interpreting ``opts`` according to the MongoDB server version. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``client`` .. include:: includes/opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. .. include:: includes/not-retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. The reply is not parsed for a write concern timeout or write concern error. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_destroy.rst000066400000000000000000000012761456567454500251130ustar00rootroot00000000000000:man_page: mongoc_client_destroy mongoc_client_destroy() ======================= Synopsis -------- .. code-block:: c void mongoc_client_destroy (mongoc_client_t *client); Release all resources associated with ``client`` and free the structure. Does nothing if ``client`` is NULL. Only call :symbol:`mongoc_client_destroy` on a single-threaded client. Do not call on a :symbol:`mongoc_client_t` obtained from a :symbol:`mongoc_client_pool_t`, which should instead be pushed back with :symbol:`mongoc_client_pool_push()`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. .. seealso:: | :symbol:`mongoc_client_pool_push()` to push a multi-threaded client back onto a pool. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_enable_auto_encryption.rst000066400000000000000000000041451456567454500301500ustar00rootroot00000000000000:man_page: mongoc_client_enable_auto_encryption mongoc_client_enable_auto_encryption() ====================================== Synopsis -------- .. code-block:: c bool mongoc_client_enable_auto_encryption (mongoc_client_t *client, mongoc_auto_encryption_opts_t* opts, bson_error_t* error); Enable automatic In-Use Encryption on a :symbol:`mongoc_client_t`. Requires libmongoc to be built with support for In-Use Encryption. See :doc:`in-use-encryption` for instructions to enable In-Use Encryption in libmongoc. Automatic encryption is an enterprise only feature that only applies to operations on a collection. Automatic encryption is not supported for operations on a database or view, and operations that are not bypassed will result in error. To bypass automatic encryption for all operations, bypass automatic encryption with :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption()` in ``opts``. Automatic encryption requires the authenticated user to have the `listCollections privilege action `_. Enabling automatic encryption reduces the maximum message size and may have a negative performance impact. Only applies to a single-threaded :symbol:`mongoc_client_t`. To use with client pools, see :symbol:`mongoc_client_pool_enable_auto_encryption()`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A required :symbol:`mongoc_auto_encryption_opts_t`. * ``error``: A :symbol:`bson_error_t` which is set on error. Returns ------- True on success. False on error. On error, ``error`` is set. .. seealso:: | :symbol:`mongoc_auto_encryption_opts_t` | :symbol:`mongoc_client_pool_enable_auto_encryption()` | :doc:`in-use-encryption` for libmongoc | The MongoDB Manual for `Client-Side Field Level Encryption `_ | The MongoDB Manual for `Queryable Encryption `_ mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_add_key_alt_name.rst000066400000000000000000000022041456567454500311240ustar00rootroot00000000000000:man_page: mongoc_client_encryption_add_key_alt_name mongoc_client_encryption_add_key_alt_name() =========================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_add_key_alt_name ( mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error); Add ``keyaltname`` to the set of alternate names in the key document with UUID ``keyid``. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyid``: A UUID (BSON binary subtype 0x04) key ID of the key to add the key alternate name to. * ``keyaltname``: The key alternate name to add. * ``key_doc``: Optional. An uninitialized :symbol:`bson_t` set to the value of the key document before addition of the alternate name, or an empty document if the key does not exist. Must be freed by :symbol:`bson_destroy`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_create_datakey.rst000066400000000000000000000034061456567454500306360ustar00rootroot00000000000000:man_page: mongoc_client_encryption_create_datakey mongoc_client_encryption_create_datakey() ========================================= Synopsis -------- .. code-block:: c bool mongoc_client_encryption_create_datakey ( mongoc_client_encryption_t *client_encryption, const char *kms_provider, const mongoc_client_encryption_datakey_opts_t *opts, bson_value_t *keyid, bson_error_t *error); Creates a new key document in the key vault collection and sets ``keyid`` to the UUID of the newly created key if ``keyid`` is not NULL. The new key can be used to configure automatic encryption (see :symbol:`mongoc_client_enable_auto_encryption()` and :symbol:`mongoc_client_pool_enable_auto_encryption()`) or for explicit encryption (see :symbol:`mongoc_client_encryption_encrypt()`). The created key document is inserted into the key vault collection (identified via :symbol:`mongoc_client_encryption_opts_set_keyvault_namespace()`) with majority write concern. ``keyid`` is always initialized (even on error). Caller must call :symbol:`bson_value_destroy()` on ``keyid`` to free. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``kms_provider``: A string identifying the Key Management Service (KMS) provider used to encrypt the datakey (e.g. "aws" or "local"). * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t` * ``keyid``: Optional. An uninitialized :symbol:`bson_value_t` set to the UUID (BSON binary subtype 0x04) of the newly created key. Must be freed by :symbol:`bson_value_destroy`. * ``error``: Optional. A :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_datakey_opts_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_create_encrypted_collection.rst000066400000000000000000000067371456567454500334360ustar00rootroot00000000000000:man_page: mongoc_client_encryption_create_encrypted_collection mongoc_client_encryption_create_encrypted_collection() ====================================================== Synopsis -------- .. code-block:: c mongoc_collection_t* mongoc_client_encryption_create_encrypted_collection ( mongoc_client_encryption_t *enc, mongoc_database_t *database, const char *name, const bson_t *in_options, bson_t *out_options, const char *kms_provider, const bson_t *opt_masterKey, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; Create a new collection with :doc:`Queryable Encryption ` enabled. Requires a valid :symbol:`mongoc_client_encryption_t` object to operate. .. versionadded:: 1.24.0 .. seealso:: This function is a convenience API wrapping :symbol:`mongoc_database_create_collection`. Parameters ---------- * ``enc``: The :symbol:`mongoc_client_encryption_t` to be used to configure encryption for the new collection. * ``database``: The :symbol:`mongoc_database_t` in which the new collection will be created. * ``name``: The name of the new collection. * ``in_options``: The options for the new collection. (See below). * ``out_options``: An optional output option for the final create-collection options. Should point to storage for a :symbol:`bson_t`. The pointed-to object must be destroyed by the caller. If ``NULL``, has no effect. * ``kms_provider``: The name of the KMS provider to use for generating new data encryption keys for encrypted fields within the collection. * ``opt_masterKey``: If provided, used as the masterkey option when data encryption keys need to be created. (See: :doc:`mongoc_client_encryption_datakey_opts_set_masterkey`) * ``error``: Optional output parameter pointing to storage for a :symbol:`bson_error_t`. If an error occurs, will be initialized with error information. Returns ------- If successful, this function returns a new :symbol:`mongoc_collection_t` object. Upon failure, returns ``NULL`` and initializes ``*error`` with an error indicating the reason for failure. The returned collection object must be freed by the caller. Creation Options ---------------- The ``in_options`` parameter behaves similarly to the ``opts`` parameter for :symbol:`mongoc_database_create_collection`, which accepts the options for the ``create`` MongoDB command (`Documented here `_). The ``in_options`` document accepted here is different in one important way: The ``$.encryptedFields.fields`` array is *required* by this function, and, unlike the schema documented for the ``create`` command, accepts a value of ``null`` for the ``keyId`` parameter on each array element. This function has the following as-if effect: .. default-role:: math 1. A new set of options `O` will be created based on ``in_options``. 2. For each element `F` in the ``$.encryptedFields.fields`` array of `O`: 1. If `F` contains a ``"keyId": null`` element, a new data encryption key `K_f` will be created as-if by calling the :symbol:`mongoc_client_encryption_create_datakey`, using the relevant arguments that were given to ``mongoc_client_encryption_create_encrypted_collection``. 2. The ID of `K_f` will be used to replace the ``"keyId": null`` element within `F`. 3. A collection will be created using the options `O`. 4. If ``out_options`` is not ``NULL``, `O` will be written to ``out_options``. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_destroy.rst000066400000000000000000000010611456567454500321240ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_destroy mongoc_client_encryption_datakey_opts_destroy() =============================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_datakey_opts_destroy (mongoc_client_encryption_datakey_opts_t *opts); Frees resources of a :symbol:`mongoc_client_encryption_datakey_opts_t` created with :symbol:`mongoc_client_encryption_datakey_opts_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t`.mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_new.rst000066400000000000000000000007161456567454500312320ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_new mongoc_client_encryption_datakey_opts_new() =========================================== Synopsis -------- .. code-block:: c mongoc_client_encryption_datakey_opts_t * mongoc_client_encryption_datakey_opts_new (void) BSON_GNUC_WARN_UNUSED_RESULT; Returns ------- A new :symbol:`mongoc_client_encryption_datakey_opts_t` that must be freed with :symbol:`mongoc_client_encryption_datakey_opts_destroy()`.mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_set_keyaltnames.rst000066400000000000000000000014301456567454500336230ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_set_keyaltnames mongoc_client_encryption_datakey_opts_set_keyaltnames() ======================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_datakey_opts_set_keyaltnames ( mongoc_client_encryption_datakey_opts_t *opts, char **keyaltnames, uint32_t keyaltnames_count); Sets a list of alternate name strings that can be used to identify a data key. Key alternate names must be unique. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t` * ``keyaltnames``: An array of strings. * ``keyaltnames_count``: The number of strings in ``keyaltnames``. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_set_keyaltname` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_set_keymaterial.rst000066400000000000000000000016311456567454500336200ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_set_keymaterial mongoc_client_encryption_datakey_opts_set_keymaterial() ======================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_datakey_opts_set_keymaterial ( mongoc_client_encryption_datakey_opts_t *opts, const uint8_t *data, uint32_t len); Sets the custom key material to be used by the data key for encryption and decryption. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t` * ``data``: A pointer to the bytes constituting the custom key material. * ``len``: The length of the bytes constituting the custom key material. Description ----------- Key material is used to encrypt and decrypt data. If custom key material is not provided, the key material for the new data key is generated from a cryptographically secure random device. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_set_masterkey.rst000066400000000000000000000043501456567454500333160ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_set_masterkey mongoc_client_encryption_datakey_opts_set_masterkey() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_datakey_opts_set_masterkey ( mongoc_client_encryption_datakey_opts_t *opts, const bson_t *masterkey); Identifies the masterkey for the Key Management Service (KMS) provider used to encrypt a new data key. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t` * ``masterkey``: A :symbol:`bson_t` document describing the KMS provider specific masterkey. Description ----------- Setting the masterkey is required when creating a data key with the KMS provider types: ``aws``, ``azure``, ``gcp``, and ``kmip``. Setting the masterkey is prohibited with the KMS provider type ``local``. The format of ``masterkey`` for the KMS provider type ``aws`` is as follows: .. code-block:: javascript { region: String, key: String, /* The Amazon Resource Name (ARN) to the AWS customer master key (CMK). */ endpoint: Optional /* An alternate host identifier to send KMS requests to. May include port number. Defaults to "kms..amazonaws.com" */ } The format of ``masterkey`` for the KMS provider type ``azure`` is as follows: .. code-block:: javascript { keyVaultEndpoint: String, /* Host with optional port. Example: "example.vault.azure.net". */ keyName: String, keyVersion: Optional /* A specific version of the named key, defaults to using the key's primary version. */ } The format of ``masterkey`` for the KMS provider type ``gcp`` is as follows: .. code-block:: javascript { projectId: String, location: String, keyRing: String, keyName: String, keyVersion: Optional, /* A specific version of the named key, defaults to using the key's primary version. */ endpoint: Optional /* Host with optional port. Defaults to "cloudkms.googleapis.com". */ } The format of ``masterkey`` for the KMS provider type ``kmip`` is as follows: .. code-block:: javascript { keyId: Optional, endpoint: Optional /* Host with optional port. */ } mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_t.rst000066400000000000000000000014131456567454500306770ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_t mongoc_client_encryption_datakey_opts_t ======================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_datakey_opts_t mongoc_client_encryption_datakey_opts_t; Used to set options for :symbol:`mongoc_client_encryption_create_datakey()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_datakey_opts_new mongoc_client_encryption_datakey_opts_destroy mongoc_client_encryption_datakey_opts_set_masterkey mongoc_client_encryption_datakey_opts_set_keyaltnames mongoc_client_encryption_datakey_opts_set_keymaterial .. seealso:: | :symbol:`mongoc_client_encryption_create_datakey()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_decrypt.rst000066400000000000000000000020701456567454500273370ustar00rootroot00000000000000:man_page: mongoc_client_decryption_decrypt mongoc_client_decryption_decrypt() ================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_decrypt (mongoc_client_encryption_t *client_encryption, const bson_value_t *ciphertext, bson_value_t *value, bson_error_t *error); Performs explicit decryption. ``value`` is always initialized (even on failure). Caller must call :symbol:`bson_value_destroy()` to free. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t` * ``ciphertext``: The ciphertext (a BSON binary with subtype 6) to decrypt. * ``value``: A :symbol:`bson_value_t` for the resulting decrypted value. * ``error``: A :symbol:`bson_error_t` set on failure. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_client_encryption_encrypt()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_delete_key.rst000066400000000000000000000016131456567454500300010ustar00rootroot00000000000000:man_page: mongoc_client_encryption_delete_key mongoc_client_encryption_delete_key() ===================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_delete_key ( mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *reply, bson_error_t *error); Delete a key document in the key vault collection that has the given ``keyid``. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyid``: The UUID (BSON binary subtype 0x04) of the key to delete. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` | :symbol:`mongoc_client_encryption_create_datakey` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_destroy.rst000066400000000000000000000007331456567454500273620ustar00rootroot00000000000000:man_page: mongoc_client_encryption_destroy mongoc_client_encryption_destroy() ================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_destroy ( mongoc_client_encryption_t *client_encryption); Release all resources associated with ``client_encryption`` and free the structure. Does nothing if ``client_encryption`` is NULL. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt.rst000066400000000000000000000040601456567454500273520ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt mongoc_client_encryption_encrypt() ================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_encrypt ( mongoc_client_encryption_t *client_encryption, const bson_value_t *value, mongoc_client_encryption_encrypt_opts_t *opts, bson_value_t *ciphertext, bson_error_t *error); Performs explicit encryption. ``ciphertext`` is always initialized (even on failure). Caller must call :symbol:`bson_value_destroy()` to free. To insert or query with an "Indexed" or "RangePreview" encrypted payload, use a :symbol:`mongoc_client_t` configured with :symbol:`mongoc_auto_encryption_opts_t`. The :symbol:`mongoc_auto_encryption_opts_t` may be configured to bypass query analysis with :symbol:`mongoc_auto_encryption_opts_set_bypass_query_analysis`. The :symbol:`mongoc_auto_encryption_opts_t` must not be configured to bypass automatic encryption with :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption`. **Note** that the ``"RangePreview"`` payload type |qenc:is-experimental|. The |qenc:range-is-experimental| To insert with a ``RangePreview`` payload :symbol:`mongoc_client_encryption_encrypt_range_opts_t` must be set in ``opts``. To query with a ``RangePreview`` payload, use :symbol:`mongoc_client_encryption_encrypt_expression()` **NOTE** that the |qenc:range-is-experimental| Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t` * ``value``: The value to encrypt. * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t`. * ``ciphertext``: A :symbol:`bson_value_t` for the resulting ciphertext (a BSON binary with subtype 6). * ``error``: A :symbol:`bson_error_t` set on failure. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_t` | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_client_encryption_decrypt()` | :symbol:`mongoc_client_encryption_encrypt_expression()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_expression.rst000066400000000000000000000046511456567454500316370ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_expression mongoc_client_encryption_encrypt_expression() ============================================= Synopsis -------- .. code-block:: c bool mongoc_client_encryption_encrypt_expression ( mongoc_client_encryption_t *client_encryption, const bson_t *expr, mongoc_client_encryption_encrypt_opts_t *opts, bson_t *expr_out, bson_error_t *error); .. important:: The |qenc:range-is-experimental| |qenc:api-is-experimental| .. versionadded:: 1.24.0 Encrypts a Match Expression or Aggregate Expression to query a range index. To query with a ``RangePreview`` encrypted payload, use a :symbol:`mongoc_client_t` configured with :symbol:`mongoc_auto_encryption_opts_t`. The :symbol:`mongoc_auto_encryption_opts_t` may be configured to bypass query analysis with :symbol:`mongoc_auto_encryption_opts_set_bypass_query_analysis`. The :symbol:`mongoc_auto_encryption_opts_t` must not be configured to bypass automatic encryption with :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption`. To query with a ``RangePreview`` payload, ``expr`` must be one of the following forms: #. A Match Expression of the following form: .. code-block:: javascript // $gt may also be $gte. $lt may also be $lte. // Can include one of $gt/$gte/$lt/$lte. It is not required to include both. {"$and": [{"": {"$gt": ""}}, {"": {"$lt": "" }}]} #. An Aggregation Expression of this form: .. code-block:: javascript // $gt may also be $gte. $lt may also be $lte // Can include one of $gt/$gte/$lt/$lte. It is not required to include both. {"$and": [{"$gt": ["", ""]}, {"$lt": ["", ""]}] Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t` * ``expr``: The expression to encrypt. * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t`. * ``expr_out``: A :symbol:`bson_t` for the resulting encrypted expression. ``expr_out`` is always initialized (even on failure). Caller must call :symbol:`bson_destroy()` to free. * ``error``: A :symbol:`bson_error_t` set on failure. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_t` | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_client_encryption_decrypt()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_destroy.rst000066400000000000000000000010611456567454500321660ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_destroy mongoc_client_encryption_encrypt_opts_destroy() =============================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_destroy (mongoc_client_encryption_encrypt_opts_t *opts); Frees resources of a :symbol:`mongoc_client_encryption_encrypt_opts_t` created with :symbol:`mongoc_client_encryption_encrypt_opts_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t`.mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_new.rst000066400000000000000000000007161456567454500312740ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_new mongoc_client_encryption_encrypt_opts_new() =========================================== Synopsis -------- .. code-block:: c mongoc_client_encryption_encrypt_opts_t * mongoc_client_encryption_encrypt_opts_new (void) BSON_GNUC_WARN_UNUSED_RESULT; Returns ------- A new :symbol:`mongoc_client_encryption_encrypt_opts_t` that must be freed with :symbol:`mongoc_client_encryption_encrypt_opts_destroy()`.mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_algorithm.rst000066400000000000000000000033071456567454500333430ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_algorithm mongoc_client_encryption_encrypt_opts_set_algorithm() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_algorithm ( mongoc_client_encryption_encrypt_opts_t *opts, const char *algorithm); #define MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_RANDOM "AEAD_AES_256_CBC_HMAC_SHA_512-Random" #define MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" // (Experimental: See below) #define MONGOC_ENCRYPT_ALGORITHM_INDEXED "Indexed" // (Experimental: See below) #define MONGOC_ENCRYPT_ALGORITHM_UNINDEXED "Unindexed" // (Experimental: See below) #define MONGOC_ENCRYPT_ALGORITHM_RANGEPREVIEW "RangePreview" Identifies the algorithm to use for encryption. Valid values of ``algorithm`` are: ``"AEAD_AES_256_CBC_HMAC_SHA_512-Random"`` for randomized encryption. Specific to the :doc:`client-side-field-level-encryption` feature. ``"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"`` for deterministic (queryable) encryption. Specific to the :doc:`client-side-field-level-encryption` feature. ``"Indexed"`` for indexed encryption. Specific to the :doc:`queryable-encryption` feature. ``"Unindexed"`` for unindexed encryption. Specific to the :doc:`queryable-encryption` feature. ``"RangePreview"`` for range encryption. Specific to the :doc:`queryable-encryption` feature. .. note:: The |qenc:range-is-experimental| |qenc:opt-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``algorithm``: A ``char *`` identifying the algorithm. mongoc_client_encryption_encrypt_opts_set_contention_factor.rst000066400000000000000000000017011456567454500350100ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_opts_set_contention_factor mongoc_client_encryption_encrypt_opts_set_contention_factor() ============================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_contention_factor ( mongoc_client_encryption_encrypt_opts_t *opts, int64_t contention_factor); .. versionadded:: 1.22.0 Sets a contention factor for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Indexed" or "RangePreview". It is an error to set the contention factor when algorithm is not "Indexed" or "RangePreview". **Note** that the |qenc:range-is-experimental| If contention factor is not supplied, it defaults to a value of 0. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``contention_factor``: A non-negative contention factor. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_keyaltname.rst000066400000000000000000000014531456567454500335070ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_keyaltname mongoc_client_encryption_encrypt_opts_set_keyaltname() ====================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_keyaltname ( mongoc_client_encryption_encrypt_opts_t *opts, const char *keyaltname); Identifies the data key to use for encryption. This option is mutually exclusive with :symbol:`mongoc_client_encryption_encrypt_opts_set_keyid()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``keyaltname``: A string identifying a data key by alternate name. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_set_keyid` | :symbol:`mongoc_client_encryption_datakey_opts_set_keyaltnames` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_keyid.rst000066400000000000000000000013701456567454500324600ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_keyid mongoc_client_encryption_encrypt_opts_set_keyid() ================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_keyid ( mongoc_client_encryption_encrypt_opts_t *opts, const bson_value_t *keyid); Identifies the data key to use for encryption. This option is mutually exclusive with :symbol:`mongoc_client_encryption_encrypt_opts_set_keyaltname()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``keyid``: The UUID (BSON binary subtype 0x04) corresponding to the ``_id`` of the data key. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_set_keyaltname` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_query_type.rst000066400000000000000000000020761456567454500335650ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_query_type mongoc_client_encryption_encrypt_opts_set_query_type() ====================================================== Synopsis -------- .. code-block:: c #define MONGOC_ENCRYPT_QUERY_TYPE_EQUALITY "equality" #define MONGOC_ENCRYPT_QUERY_TYPE_RANGEPREVIEW "rangePreview" MONGOC_EXPORT (void) mongoc_client_encryption_encrypt_opts_set_query_type ( mongoc_client_encryption_encrypt_opts_t *opts, const char* query_type); .. versionadded:: 1.22.0 Sets a query type for explicit encryption. Currently, the supported values for ``query_type`` are ``"equality"`` and ``"rangePreview"``. **NOTE** that the |qenc:range-is-experimental| Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Indexed" or "RangePreview". It is an error to set the query type when algorithm is not "Indexed" or "RangePreview". Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``query_type``: A query type to use for explicit encryption. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_range_opts.rst000066400000000000000000000017541456567454500335220ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_range_opts mongoc_client_encryption_encrypt_opts_set_range_opts() ====================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_range_opts ( mongoc_client_encryption_encrypt_opts_t *opts, const mongoc_client_encryption_encrypt_range_opts_t *range_opts); .. important:: The |qenc:range-is-experimental| |qenc:api-is-experimental| .. versionadded:: 1.24.0 Sets the ``range_opts`` for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "RangePreview". It is an error to set ``range_opts`` when algorithm is not "RangePreview". Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_new` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_t.rst000066400000000000000000000016521456567454500307460ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_t mongoc_client_encryption_encrypt_opts_t ======================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_encrypt_opts_t mongoc_client_encryption_encrypt_opts_t; Used to set options for :symbol:`mongoc_client_encryption_encrypt()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_encrypt_opts_new mongoc_client_encryption_encrypt_opts_destroy mongoc_client_encryption_encrypt_opts_set_keyid mongoc_client_encryption_encrypt_opts_set_keyaltname mongoc_client_encryption_encrypt_opts_set_algorithm mongoc_client_encryption_encrypt_opts_set_contention_factor mongoc_client_encryption_encrypt_opts_set_query_type mongoc_client_encryption_encrypt_opts_set_range_opts .. seealso:: | :symbol:`mongoc_client_encryption_encrypt()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_destroy.rst000066400000000000000000000014421456567454500333450ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_destroy mongoc_client_encryption_encrypt_range_opts_destroy() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_destroy (mongoc_client_encryption_encrypt_range_opts_t *range_opts); .. important:: The |qenc:range-is-experimental| |qenc:api-is-experimental| .. versionadded:: 1.24.0 Frees resources of a :symbol:`mongoc_client_encryption_encrypt_range_opts_t` created with :symbol:`mongoc_client_encryption_encrypt_range_opts_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t`. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_t`mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_new.rst000066400000000000000000000013221456567454500324420ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_new mongoc_client_encryption_encrypt_range_opts_new() ================================================= Synopsis -------- .. code-block:: c mongoc_client_encryption_encrypt_range_opts_t * mongoc_client_encryption_encrypt_range_opts_new (void); .. important:: The |qenc:range-is-experimental| |qenc:api-is-experimental| .. versionadded:: 1.24.0 Returns ------- A new :symbol:`mongoc_client_encryption_encrypt_range_opts_t` that must be freed with :symbol:`mongoc_client_encryption_encrypt_range_opts_destroy()`. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` | :symbol:`mongoc_client_encryption_encrypt_range_opts_destroy` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_set_max.rst000066400000000000000000000024431456567454500333160ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_set_max mongoc_client_encryption_encrypt_range_opts_set_max() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_set_max ( mongoc_client_encryption_encrypt_range_opts_t *range_opts, const bson_value_t *max); .. important:: The |qenc:range-is-experimental| |qenc:api-is-experimental| .. versionadded:: 1.24.0 Sets the maximum value of the range for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "RangePreview". It is an error to set maximum when algorithm is not "RangePreview". The maximum must match the value set in the encryptedFields of the destination collection. It is an error to set a different value. For double and decimal128 fields, max/max/precision must all be set, or all be unset. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` * ``max``: The maximum bson value of the range. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_precision` | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_min` | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_set_min.rst000066400000000000000000000024431456567454500333140ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_set_min mongoc_client_encryption_encrypt_range_opts_set_min() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_set_min ( mongoc_client_encryption_encrypt_range_opts_t *range_opts, const bson_value_t *min); .. important:: The |qenc:range-is-experimental| |qenc:api-is-experimental| .. versionadded:: 1.24.0 Sets the minimum value of the range for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "RangePreview". It is an error to set minimum when algorithm is not "RangePreview". The minimum must match the value set in the encryptedFields of the destination collection. It is an error to set a different value. For double and decimal128 fields, min/max/precision must all be set, or all be unset. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` * ``min``: The minimum bson value of the range. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_precision` | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_max` | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` mongoc_client_encryption_encrypt_range_opts_set_precision.rst000066400000000000000000000027121456567454500344440ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_range_opts_set_precision mongoc_client_encryption_encrypt_range_opts_set_precision() =========================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_set_precision ( mongoc_client_encryption_encrypt_range_opts_t *range_opts, int32_t precision); .. important:: The |qenc:range-is-experimental| |qenc:api-is-experimental| .. versionadded:: 1.24.0 Sets precision for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "RangePreview". It is an error to set precision when algorithm is not "RangePreview". Precision can only be set with double or decimal128 fields. It is an error to set precision if the type of the encryptedFields in the destination collection is not double or decimal128. For double and decimal128 fields, min/max/precision must all be set, or all be unset. Precision must match the value set in the encryptedFields of the destination collection. It is an error to set a different value. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` * ``precision``: A non-negative precision. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_min` | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_max` | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_set_sparsity.rst000066400000000000000000000021471456567454500344100ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_set_sparsity mongoc_client_encryption_encrypt_range_opts_set_sparsity() ========================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_set_sparsity ( mongoc_client_encryption_encrypt_range_opts_t *range_opts, int64_t sparsity); .. important:: The |qenc:range-is-experimental| |qenc:api-is-experimental| .. versionadded:: 1.24.0 Sets sparsity for explicit encryption. Sparsity is required for explicit encryption of range indexes. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "RangePreview". It is an error to set sparsity when algorithm is not "RangePreview". Sparsity must match the value set in the encryptedFields of the destination collection. It is an error to set a different value. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` * ``sparsity``: A non-negative sparsity. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_t.rst000066400000000000000000000025641456567454500321250ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_t mongoc_client_encryption_encrypt_range_opts_t ============================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_encrypt_range_opts_t mongoc_client_encryption_encrypt_range_opts_t; .. important:: The |qenc:range-is-experimental| |qenc:api-is-experimental| .. versionadded:: 1.24.0 RangeOpts specifies index options for a Queryable Encryption field supporting "rangePreview" queries. Used to set options for :symbol:`mongoc_client_encryption_encrypt()`. The options min, max, sparsity, and range must match the values set in the encryptedFields of the destination collection. For double and decimal128 fields, min/max/precision must all be set, or all be unset. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_encrypt_range_opts_new mongoc_client_encryption_encrypt_range_opts_destroy mongoc_client_encryption_encrypt_range_opts_set_sparsity mongoc_client_encryption_encrypt_range_opts_set_min mongoc_client_encryption_encrypt_range_opts_set_max mongoc_client_encryption_encrypt_range_opts_set_precision mongoc_client_encryption_encrypt_opts_set_range_opts .. seealso:: | :symbol:`mongoc_client_encryption_encrypt()` | :symbol:`mongoc_client_encryption_encrypt_opts_t()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_get_crypt_shared_version.rst000066400000000000000000000021401456567454500327560ustar00rootroot00000000000000:man_page: mongoc_client_encryption_get_crypt_shared_version mongoc_client_encryption_get_crypt_shared_version() =================================================== Synopsis -------- .. code-block:: c const char* mongoc_client_encryption_get_crypt_shared_version (mongoc_client_encryption_t const *enc) BSON_GNUC_WARN_UNUSED_RESULT; Obtain the version string of the crypt_shared_ that is loaded for the given explicit encryption object. If no crypt_shared_ library is loaded, the returned pointer will be ``NULL``. Parameters ---------- * ``enc``: A live :symbol:`mongoc_client_encryption_t` Returns ------- A pointer to a null-terminated character array string designating the version of crypt_shared_ that was loaded for ``enc``. If no crypt_shared_ library is loaded, the returned pointer will be ``NULL``. The pointed-to array must not be modified or freed. The returned pointer is only valid for the lifetime of ``enc``. .. _crypt_shared: https://www.mongodb.com/docs/manual/core/queryable-encryption/reference/shared-library/ .. seealso:: - :symbol:`mongoc_client_get_crypt_shared_version` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_get_key.rst000066400000000000000000000020301456567454500273100ustar00rootroot00000000000000:man_page: mongoc_client_encryption_get_key mongoc_client_encryption_get_key() ================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_get_key (mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *key_doc, bson_error_t *error); Get a key document in the key vault collection that has the given ``keyid``. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyid``: The UUID (BSON binary subtype 0x04) of the key to get. * ``key_doc``: Optional. An uninitialized :symbol:`bson_t` set to the resulting key document, or an empty document value if the key does not exist. Must be freed by :symbol:`bson_destroy`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_get_key_by_alt_name.rst000066400000000000000000000017621456567454500316550ustar00rootroot00000000000000:man_page: mongoc_client_encryption_get_key_by_alt_name mongoc_client_encryption_get_key_by_alt_name() ============================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_get_key_by_alt_name ( mongoc_client_encryption_t *client_encryption, const char *keyaltname, bson_value_t *key_doc, bson_error_t *error); Get a key document in the key vault collection that has the given ``keyaltname``. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyaltname``: The key alternate name of the key to get. * ``key_doc``: Optional. An uninitialized :symbol:`bson_t` set to the resulting key document, or an empty document if the key does not exist. Must be freed by :symbol:`bson_value_destroy`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_get_keys.rst000066400000000000000000000012731456567454500275030ustar00rootroot00000000000000:man_page: mongoc_client_encryption_get_keys mongoc_client_encryption_get_keys() =================================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_client_encryption_get_keys (mongoc_client_encryption_t *client_encryption, bson_error_t *error); Get all the key documents in the key vault collection. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns the result of the internal find command if successful. Returns ``NULL`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_new.rst000066400000000000000000000014331456567454500264600ustar00rootroot00000000000000:man_page: mongoc_client_encryption_new mongoc_client_encryption_new() ============================== Synopsis -------- .. code-block:: c mongoc_client_encryption_t * mongoc_client_encryption_new (mongoc_client_encryption_opts_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; Create a new :symbol:`mongoc_client_encryption_t`. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_opts_t`. * ``error``: A :symbol:`bson_error_t`. Returns ------- A new :symbol:`mongoc_client_encryption_t` that must be freed with :symbol:`mongoc_client_encryption_destroy()` if successful. Returns ``NULL`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` | :symbol:`mongoc_client_encryption_opts_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_opts_destroy.rst000066400000000000000000000007631456567454500304320ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_destroy mongoc_client_encryption_opts_destroy() ======================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_destroy (mongoc_client_encryption_opts_t *opts); Frees resources of a :symbol:`mongoc_client_encryption_opts_t` created with :symbol:`mongoc_client_encryption_opts_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_opts_t`.mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_opts_new.rst000066400000000000000000000006261456567454500275300ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_new mongoc_client_encryption_opts_new() =================================== Synopsis -------- .. code-block:: c mongoc_client_encryption_opts_t * mongoc_client_encryption_opts_new (void) BSON_GNUC_WARN_UNUSED_RESULT; Returns ------- A new :symbol:`mongoc_client_encryption_opts_t` that must be freed with :symbol:`mongoc_client_encryption_opts_destroy()`.mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_opts_set_keyvault_client.rst000066400000000000000000000017201456567454500330100ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_set_keyvault_client mongoc_client_encryption_opts_set_keyvault_client() =================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_keyvault_client ( mongoc_client_encryption_opts_t *opts, mongoc_client_t *keyvault_client); Set the :symbol:`mongoc_client_t` to use during key creation and key lookup for encryption and decryption. This may be either a single-threaded or multi-threaded client (i.e. a client obtained from a :symbol:`mongoc_client_pool_t`). Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_opts_t`. * ``client``: A :symbol:`mongoc_client_t` to use for key lookup and creation. This ``client`` MUST outlive any :symbol:`mongoc_client_encryption_t` configured to use it with :symbol:`mongoc_client_encryption_new()`. .. seealso:: | :symbol:`mongoc_client_encryption_new()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_opts_set_keyvault_namespace.rst000066400000000000000000000014661456567454500334750ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_set_key_vault_namespace mongoc_client_encryption_opts_set_keyvault_namespace() ====================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_keyvault_namespace ( mongoc_client_encryption_opts_t *opts, const char *db, const char *coll); Set the database and collection name of the key vault. The key vault is the specially designated collection containing encrypted data keys for :doc:`in-use-encryption`. Parameters ---------- * ``opts``: The :symbol:`mongoc_client_encryption_opts_t` * ``db``: The database name of the key vault collection. * ``coll``: The collection name of the key vault collection. .. seealso:: | :symbol:`mongoc_client_encryption_new()` | :doc:`in-use-encryption` mongoc_client_encryption_opts_set_kms_credential_provider_callback.rst000066400000000000000000000044511456567454500362450ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc:man_page: mongoc_client_encryption_opts_set_kms_credential_provider_callback mongoc_client_encryption_opts_set_kms_credential_provider_callback () ===================================================================== .. versionadded:: 1.23.0 Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_kms_credential_provider_callback ( mongoc_client_encryption_opts_t *opts, mongoc_kms_credentials_provider_callback_fn fn, void *userdata); Set the user-provided callback to provide KMS credentials on-demand when they are needed. Parameters ---------- - ``opts`` - The options object to update. - ``fn`` - The provider callback to set on the options object. May be ``NULL`` to clear the callback. Refer to: :c:type:`mongoc_kms_credentials_provider_callback_fn` - ``userdata`` - An arbitrary pointer that will be passed along to the callback function when it is called by libmongoc. .. seealso:: :doc:`mongoc_auto_encryption_opts_set_kms_credential_provider_callback` .. rubric:: Related: .. c:type:: mongoc_kms_credentials_provider_callback_fn .. - The :noindexentry: prevents a one-off index entry for this item. Most entities are not documented as Sphinx objects, and thus do not generate index entries. Future changes may flip the script. .. code-block:: c typedef bool (*mongoc_kms_credentials_provider_callback_fn) (void *userdata, const bson_t *params, bson_t *out, bson_error_t *error); The type of a callback function for providing KMS providers data on-demand. :parameters: - ``userdata`` - The same userdata pointer provided to the ``userdata`` parameter when the callback was set. - ``params`` - Parameters for the requested KMS credentials. Currently empty. - ``out`` - The output :symbol:`bson:bson_t` in which to write the new KMS providers. When passed to the callback, this already points to an empty BSON document which must be populated. - ``error`` - An output parameter for indicating any errors that might occur while generating the KMS credentials. :return value: Must return ``true`` on success, ``false`` on failure. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_opts_set_kms_providers.rst000066400000000000000000000050601456567454500324760ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_set_kms_providers mongoc_client_encryption_opts_set_kms_providers() ================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_kms_providers ( mongoc_client_encryption_opts_t *opts, const bson_t *kms_providers); Parameters ---------- * ``opts``: The :symbol:`mongoc_client_encryption_opts_t` * ``kms_providers``: A :symbol:`bson_t` containing configuration for an external Key Management Service (KMS). ``kms_providers`` is a BSON document containing configuration for each KMS provider. KMS providers are specified as a string of the form ```` or ``:``. The supported KMS provider types are ``aws``, ``azure``, ``gcp``, ``local``, and ``kmip``. The optional name enables configuring multiple KMS providers with the same KMS provider type (e.g. ``aws:name1`` and ``aws:name2`` can refer to different AWS accounts). At least one KMS provider must be specified. The format for the KMS provider type ``aws`` is as follows: .. code-block:: javascript aws: { accessKeyId: String, secretAccessKey: String } The format for the KMS provider type ``local`` is as follows: .. code-block:: javascript local: { key: <96 byte BSON binary of subtype 0> or String /* The master key used to encrypt/decrypt data keys. May be passed as a base64 encoded string. */ } The format for the KMS provider type ``azure`` is as follows: .. code-block:: javascript azure: { tenantId: String, clientId: String, clientSecret: String, identityPlatformEndpoint: Optional /* Defaults to login.microsoftonline.com */ } The format for the KMS provider type ``gcp`` is as follows: .. code-block:: javascript gcp: { email: String, privateKey: byte[] or String, /* May be passed as a base64 encoded string. */ endpoint: Optional /* Defaults to oauth2.googleapis.com */ } The format for the KMS provider type ``kmip`` is as follows: .. code-block:: javascript kmip: { endpoint: String } KMS providers may include an optional name suffix separate with a colon. This enables configuring multiple KMS providers with the same KMS provider type. Example: .. code-block:: javascript "aws:name1": { accessKeyId: String, secretAccessKey: String }, "aws:name2": { accessKeyId: String, secretAccessKey: String } .. seealso:: | :symbol:`mongoc_client_encryption_new()` | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_opts_set_tls_opts.rst000066400000000000000000000033401456567454500314550ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_set_tls_opts mongoc_client_encryption_opts_set_tls_opts() ============================================ Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_tls_opts ( mongoc_client_encryption_opts_t *opts, const bson_t *tls_opts); Parameters ---------- * ``opts``: The :symbol:`mongoc_client_encryption_opts_t` * ``tls_opts``: A :symbol:`bson_t` mapping a Key Management Service (KMS) provider to a BSON document with TLS options. ``tls_opts`` is a BSON document of the following form: .. code-block:: javascript : { tlsCaFile: Optional tlsCertificateKeyFile: Optional tlsCertificateKeyFilePassword: Optional } KMS providers are specified as a string of the form ```` or ``:``. The supported KMS provider types are ``aws``, ``azure``, ``gcp``, ``local``, and ``kmip``. The optional name enables configuring multiple KMS providers with the same KMS provider type (e.g. ``aws:name1`` and ``aws:name2`` can refer to different AWS accounts). ``tls_opts`` maps the KMS provider to a BSON document for TLS options. The BSON document for TLS options may contain the following keys: - ``MONGOC_URI_TLSCERTIFICATEKEYFILE`` - ``MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD`` - ``MONGOC_URI_TLSCAFILE`` .. literalinclude:: ../examples/client-side-encryption-doc-snippets.c :caption: Example use :start-after: BEGIN:mongoc_client_encryption_opts_set_tls_opts :end-before: END:mongoc_client_encryption_opts_set_tls_opts :dedent: 6 See :doc:`configuring_tls` for a description of the behavior of these options. .. seealso:: | :doc:`in-use-encryption` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_opts_t.rst000066400000000000000000000014541456567454500272020ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_t mongoc_client_encryption_opts_t =============================== Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_opts_t mongoc_client_encryption_opts_t; Used to set options for :symbol:`mongoc_client_encryption_new()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_opts_new mongoc_client_encryption_opts_destroy mongoc_client_encryption_opts_set_keyvault_client mongoc_client_encryption_opts_set_keyvault_namespace mongoc_client_encryption_opts_set_kms_credential_provider_callback mongoc_client_encryption_opts_set_kms_providers mongoc_client_encryption_opts_set_tls_opts .. seealso:: | :symbol:`mongoc_client_encryption_new()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_remove_key_alt_name.rst000066400000000000000000000023701456567454500316750ustar00rootroot00000000000000:man_page: mongoc_client_encryption_remove_key_alt_name mongoc_client_encryption_remove_key_alt_name() ============================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_remove_key_alt_name ( mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error); Remove ``keyaltname`` from the set of keyAltNames in the key document with UUID ``keyid``. Also removes the ``keyAltNames`` field from the key document if it would otherwise be empty. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyid``: The UUID (BSON binary subtype 0x04) of the key to remove the key alternate name from. * ``keyaltname``: The key alternate name to remove. * ``key_doc``: Optional. An uninitialized :symbol:`bson_t` set to the value of the key document before removal of the key alternate name, or an empty document the key does not exist. Must be freed by :symbol:`bson_value_destroy`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_rewrap_many_datakey.rst000066400000000000000000000034761456567454500317260ustar00rootroot00000000000000:man_page: mongoc_client_encryption_rewrap_many_datakey mongoc_client_encryption_rewrap_many_datakey() ============================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_rewrap_many_datakey ( mongoc_client_encryption_t *client_encryption, const bson_t *filter, const char *provider, const bson_t *master_key, mongoc_client_encryption_rewrap_many_datakey_result_t *result, bson_error_t *error); Rewraps zero or more data keys in the key vault collection that match the provided ``filter``. A ``NULL`` argument for ``filter`` is equivalent to being given an empty document (match all). If ``provider`` is ``NULL``, rewraps matching data keys with their current KMS provider and master key. If ``provider`` is not ``NULL``, rewraps matching data keys with the new KMS provider as described by ``master_key``. The ``master_key`` document must conform to the `Client Side Encryption specification `_. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``filter``: The filter to use when finding data keys to rewrap in the key vault collection. * ``provider``: The new KMS provider to use to encrypt the data keys, or ``NULL`` to use the current KMS provider(s). * ``master_key``: The master key fields corresponding to the new KMS provider when ``provider`` is not ``NULL``. * ``result``: An optional :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t`. * ``error``: A :symbol:`bson_error_t` set on failure. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t` mongoc_client_encryption_rewrap_many_datakey_result_destroy.rst000066400000000000000000000012571456567454500350110ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc:man_page: mongoc_client_encryption_rewrap_many_datakey_result_destroy mongoc_client_encryption_rewrap_many_datakey_result_destroy() ============================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_rewrap_many_datakey_result_destroy ( mongoc_client_encryption_rewrap_many_datakey_result_t *result); Frees resources of a :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t` created with :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``result``: A :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t`. mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result.rst000066400000000000000000000017661456567454500377310ustar00rootroot00000000000000mongo-c-driver-1.26.0/src/libmongoc/doc:man_page: mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result() =========================================================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result ( mongoc_client_encryption_rewrap_many_datakey_result_t *result) BSON_GNUC_WARN_UNUSED_RESULT; Get the bulk write result set by a successful call to :symbol:`mongoc_client_encryption_rewrap_many_datakey()`. Returns ``NULL`` if no bulk write operation was executed or if the bulk write operation was unacknowledged. Parameters ---------- * ``result``: A :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t`. Returns ------- A :symbol:`bson_t` that must not be modified or freed if ``result`` is not ``NULL``. Otherwise, returns ``NULL``. .. seealso:: | :symbol:`mongoc_client_encryption_rewrap_many_datakey()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_rewrap_many_datakey_result_new.rst000066400000000000000000000010661456567454500341660ustar00rootroot00000000000000:man_page: mongoc_client_encryption_rewrap_many_datakey_result_new mongoc_client_encryption_rewrap_many_datakey_result_new() ========================================================= Synopsis -------- .. code-block:: c mongoc_client_encryption_rewrap_many_datakey_result_t * mongoc_client_encryption_rewrap_many_datakey_result_new (void) BSON_GNUC_WARN_UNUSED_RESULT; Returns ------- A new :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t` that must be freed with :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_destroy()`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_rewrap_many_datakey_result_t.rst000066400000000000000000000014461456567454500336420ustar00rootroot00000000000000:man_page: mongoc_client_encryption_rewrap_many_datakey_result_t mongoc_client_encryption_rewrap_many_datakey_result_t ===================================================== Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_rewrap_many_datakey_result_t mongoc_client_encryption_rewrap_many_datakey_result_t; Used to access the result of :symbol:`mongoc_client_encryption_rewrap_many_datakey()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_rewrap_many_datakey_result_new mongoc_client_encryption_rewrap_many_datakey_result_destroy mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result .. seealso:: | :symbol:`mongoc_client_encryption_rewrap_many_datakey()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_encryption_t.rst000066400000000000000000000035521456567454500261360ustar00rootroot00000000000000:man_page: mongoc_client_encryption_t mongoc_client_encryption_t ========================== Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_t mongoc_client_encryption_t; ``mongoc_client_encryption_t`` provides utility functions for :doc:`in-use-encryption`. Thread Safety ------------- :symbol:`mongoc_client_encryption_t` is NOT thread-safe and should only be used in the same thread as the :symbol:`mongoc_client_t` that is configured via :symbol:`mongoc_client_encryption_opts_set_keyvault_client()`. Lifecycle --------- The key vault client, configured via :symbol:`mongoc_client_encryption_opts_set_keyvault_client()`, must outlive the :symbol:`mongoc_client_encryption_t`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_new mongoc_client_encryption_destroy mongoc_client_encryption_create_datakey mongoc_client_encryption_create_encrypted_collection mongoc_client_encryption_rewrap_many_datakey mongoc_client_encryption_delete_key mongoc_client_encryption_get_crypt_shared_version mongoc_client_encryption_get_key mongoc_client_encryption_get_keys mongoc_client_encryption_add_key_alt_name mongoc_client_encryption_remove_key_alt_name mongoc_client_encryption_get_key_by_alt_name mongoc_client_encryption_encrypt mongoc_client_encryption_encrypt_expression mongoc_client_encryption_decrypt .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_client_pool_enable_auto_encryption()` | :doc:`in-use-encryption` for libmongoc | The MongoDB Manual for `Client-Side Field Level Encryption `_ | The MongoDB Manual for `Queryable Encryption `_ mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_find_databases_with_opts.rst000066400000000000000000000022701456567454500304440ustar00rootroot00000000000000:man_page: mongoc_client_find_databases_with_opts mongoc_client_find_databases_with_opts() ======================================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_client_find_databases_with_opts ( mongoc_client_t *client, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; Fetches a cursor containing documents, each corresponding to a database on this MongoDB server. .. include:: includes/retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. .. |opts-source| replace:: ``client`` .. include:: includes/generic-opts.txt For a list of all options, see `the MongoDB Manual entry on the listDatabases command `_. Errors ------ Use :symbol:`mongoc_cursor_error` on the returned cursor to check for errors. Returns ------- A cursor where each result corresponds to the server's representation of a database. The cursor functions :symbol:`mongoc_cursor_set_limit`, :symbol:`mongoc_cursor_set_batch_size`, and :symbol:`mongoc_cursor_set_max_await_time_ms` have no use on the returned cursor. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_collection.rst000066400000000000000000000017171456567454500264140ustar00rootroot00000000000000:man_page: mongoc_client_get_collection mongoc_client_get_collection() ============================== Synopsis -------- .. code-block:: c mongoc_collection_t * mongoc_client_get_collection (mongoc_client_t *client, const char *db, const char *collection) BSON_GNUC_WARN_UNUSED_RESULT; Get a newly allocated :symbol:`mongoc_collection_t` for the collection named ``collection`` in the database named ``db``. .. tip:: Collections are automatically created on the MongoDB server upon insertion of the first document. There is no need to create a collection manually. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db``: The name of the database containing the collection. * ``collection``: The name of the collection. Returns ------- A newly allocated :symbol:`mongoc_collection_t` that should be freed with :symbol:`mongoc_collection_destroy()` when no longer in use. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_crypt_shared_version.rst000066400000000000000000000022071456567454500305100ustar00rootroot00000000000000:man_page: mongoc_client_get_crypt_shared_version mongoc_client_get_crypt_shared_version() ======================================== Synopsis -------- .. code-block:: c const char * mongoc_client_get_crypt_shared_version (const mongoc_client_t *client) BSON_GNUC_WARN_UNUSED_RESULT; Obtain the version string of the crypt_shared_ that is loaded for auto-encryption on the given ``client``. If no crypt_shared_ library is loaded, the returned pointer will be ``NULL``. Parameters ---------- * ``client``: A live :symbol:`mongoc_client_t` Returns ------- A pointer to a null-terminated character array string designating the version of crypt_shared_ that was loaded for auto-encryption with ``client``. If no crypt_shared_ library is loaded, or auto-encryption is not loaded for the given ``client``, the returned pointer will be ``NULL``. The pointed-to array must not be modified or freed. The returned pointer is only valid for the lifetime of ``client``. .. _crypt_shared: https://www.mongodb.com/docs/manual/core/queryable-encryption/reference/shared-library/ .. seealso:: - :symbol:`mongoc_client_encryption_get_crypt_shared_version` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_database.rst000066400000000000000000000014671456567454500260270ustar00rootroot00000000000000:man_page: mongoc_client_get_database mongoc_client_get_database() ============================ Synopsis -------- .. code-block:: c mongoc_database_t * mongoc_client_get_database (mongoc_client_t *client, const char *name) BSON_GNUC_WARN_UNUSED_RESULT; Get a newly allocated :symbol:`mongoc_database_t` for the database named ``name``. .. tip:: Databases are automatically created on the MongoDB server upon insertion of the first document into a collection. There is no need to create a database manually. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``name``: The name of the database. Returns ------- A newly allocated :symbol:`mongoc_database_t ` that should be freed with :symbol:`mongoc_database_destroy()` when no longer in use. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_database_names.rst000066400000000000000000000021341456567454500272020ustar00rootroot00000000000000:man_page: mongoc_client_get_database_names mongoc_client_get_database_names() ================================== .. warning:: .. deprecated:: 1.9.0 This function is deprecated and should not be used in new code. Please use :symbol:`mongoc_client_get_database_names_with_opts()` in new code. Synopsis -------- .. code-block:: c char ** mongoc_client_get_database_names (mongoc_client_t *client, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT BSON_GNUC_DEPRECATED_FOR (mongoc_client_get_database_names_with_opts); Description ----------- This function queries the MongoDB server for a list of known databases. .. include:: includes/retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- A ``NULL`` terminated vector of ``NULL-byte`` terminated strings. The result should be freed with :symbol:`bson:bson_strfreev()`. ``NULL`` is returned upon failure and ``error`` is set. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_database_names_with_opts.rst000066400000000000000000000031761456567454500313110ustar00rootroot00000000000000:man_page: mongoc_client_get_database_names_with_opts mongoc_client_get_database_names_with_opts() ============================================ Synopsis -------- .. code-block:: c char ** mongoc_client_get_database_names_with_opts (mongoc_client_t *client, const bson_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; This function queries the MongoDB server for a list of known databases. .. include:: includes/retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``client`` .. include:: includes/generic-opts.txt For a list of all options, see `the MongoDB Manual entry on the listDatabases command `_. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- A ``NULL`` terminated vector of ``NULL-byte`` terminated strings. The result should be freed with :symbol:`bson:bson_strfreev()`. ``NULL`` is returned upon failure and ``error`` is set. Examples -------- .. code-block:: c { bson_error_t error; char **strv; unsigned i; if ((strv = mongoc_client_get_database_names_with_opts (client, NULL, &error))) { for (i = 0; strv[i]; i++) printf ("%s\n", strv[i]); bson_strfreev (strv); } else { fprintf (stderr, "Command failed: %s\n", error.message); } } mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_default_database.rst000066400000000000000000000023531456567454500275260ustar00rootroot00000000000000:man_page: mongoc_client_get_default_database mongoc_client_get_default_database() ==================================== Synopsis -------- .. code-block:: c mongoc_database_t * mongoc_client_get_default_database (mongoc_client_t *client) BSON_GNUC_WARN_UNUSED_RESULT; Get the database named in the MongoDB connection URI, or ``NULL`` if the URI specifies none. Useful when you want to choose which database to use based only on the URI in a configuration file. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A newly allocated :symbol:`mongoc_database_t ` that should be freed with :symbol:`mongoc_database_destroy()`. Example ------- .. code-block:: c :caption: Default Database Example /* default database is "db_name" */ mongoc_client_t *client = mongoc_client_new ("mongodb://host/db_name"); mongoc_database_t *db = mongoc_client_get_default_database (client); assert (!strcmp ("db_name", mongoc_database_get_name (db))); mongoc_database_destroy (db); mongoc_client_destroy (client); /* no default database */ client = mongoc_client_new ("mongodb://host/"); db = mongoc_client_get_default_database (client); assert (!db); mongoc_client_destroy (client); mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_gridfs.rst000066400000000000000000000022771456567454500255410ustar00rootroot00000000000000:man_page: mongoc_client_get_gridfs mongoc_client_get_gridfs() ========================== Synopsis -------- .. code-block:: c mongoc_gridfs_t * mongoc_client_get_gridfs (mongoc_client_t *client, const char *db, const char *prefix, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; The ``mongoc_client_get_gridfs()`` function shall create a new :symbol:`mongoc_gridfs_t`. The ``db`` parameter is the name of the database which the gridfs instance should exist in. The ``prefix`` parameter corresponds to the gridfs collection namespacing; its default is "fs", thus the default GridFS collection names are "fs.files" and "fs.chunks". Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db``: The database name. * ``prefix``: Optional prefix for gridfs collection names or ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- On success, returns a :symbol:`mongoc_gridfs_t` you must free with :symbol:`mongoc_gridfs_destroy()`. Returns ``NULL`` upon failure and sets ``error``. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_handshake_description.rst000066400000000000000000000056121456567454500306100ustar00rootroot00000000000000:man_page: mongoc_client_get_handshake_description mongoc_client_get_handshake_description() ========================================= Synopsis -------- .. code-block:: c mongoc_server_description_t * mongoc_client_get_handshake_description (mongoc_client_t *client, uint32_t server_id, bson_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; Returns a description constructed from the initial handshake response to a server. Description ----------- :symbol:`mongoc_client_get_handshake_description` is distinct from :symbol:`mongoc_client_get_server_description`. :symbol:`mongoc_client_get_server_description` returns a server description constructed from monitoring, which may differ from the server description constructed from the connection handshake. :symbol:`mongoc_client_get_handshake_description` will attempt to establish a connection to the server if a connection was not already established. It will perform the MongoDB handshake and authentication if required. Use this function only for building a language driver that wraps the C Driver. When writing applications in C, higher-level functions automatically select a suitable server. Single-threaded client behavior ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Single-threaded clients only have one active connection to each server. The one connection is used for both monitoring and application operations. However, the server description returned by :symbol:`mongoc_client_get_handshake_description` may still differ from the server description returned by :symbol:`mongoc_client_get_server_description`. Notably, if connected to a load balanced cluster, the server description returned by :symbol:`mongoc_client_get_server_description` will describe the load balancer server (:symbol:`mongoc_server_description_type` will return "LoadBalancer"). And the server description returned by :symbol:`mongoc_client_get_handshake_description` will describe the backing server. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``server_id``: The ID of the server. This can be obtained from the server description of :symbol:`mongoc_client_select_server`. * ``opts``: Unused. Pass ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Returns ------- A :symbol:`mongoc_server_description_t` that must be freed with :symbol:`mongoc_server_description_destroy`. If a connection has not been successfully established to a server, returns ``NULL`` and ``error`` is filled out. See Also -------- - :symbol:`mongoc_client_select_server` To select a server from read preferences. - :symbol:`mongoc_client_get_server_description` To obtain the server description from monitoring for a server. - :symbol:`mongoc_server_description_type` To obtain the type of server from a server description. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_read_concern.rst000066400000000000000000000007421456567454500267000ustar00rootroot00000000000000:man_page: mongoc_client_get_read_concern mongoc_client_get_read_concern() ================================ Synopsis -------- .. code-block:: c const mongoc_read_concern_t * mongoc_client_get_read_concern (const mongoc_client_t *client); Retrieve the default read concern configured for the client instance. The result should not be modified or freed. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A :symbol:`mongoc_read_concern_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_read_prefs.rst000066400000000000000000000007331456567454500263700ustar00rootroot00000000000000:man_page: mongoc_client_get_read_prefs mongoc_client_get_read_prefs() ============================== Synopsis -------- .. code-block:: c const mongoc_read_prefs_t * mongoc_client_get_read_prefs (const mongoc_client_t *client); Retrieves the default read preferences configured for the client instance. The result should not be modified or freed. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A :symbol:`mongoc_read_prefs_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_server_description.rst000066400000000000000000000012571456567454500301710ustar00rootroot00000000000000:man_page: mongoc_client_get_server_description mongoc_client_get_server_description() ====================================== Synopsis -------- .. code-block:: c mongoc_server_description_t * mongoc_client_get_server_description ( mongoc_client_t *client, uint32_t server_id) BSON_GNUC_WARN_UNUSED_RESULT; Get information about the server specified by ``server_id``. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``server_id``: An opaque id specifying the server. Returns ------- A :symbol:`mongoc_server_description_t` that must be freed with :symbol:`mongoc_server_description_destroy`. If the server is no longer in the topology, returns NULL. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_server_descriptions.rst000066400000000000000000000032261456567454500303520ustar00rootroot00000000000000:man_page: mongoc_client_get_server_descriptions mongoc_client_get_server_descriptions() ======================================= Synopsis -------- .. code-block:: c mongoc_server_description_t ** mongoc_client_get_server_descriptions (const mongoc_client_t *client, size_t *n) BSON_GNUC_WARN_UNUSED_RESULT; Fetches an array of :symbol:`mongoc_server_description_t` structs for all known servers in the topology. Returns no servers until the client connects. Returns a single server if the client is directly connected, or all members of a replica set if the client's MongoDB URI includes a "replicaSet" option, or all known mongos servers if the MongoDB URI includes a list of them. .. code-block:: c void show_servers (const mongoc_client_t *client) { bson_t *b = BCON_NEW ("ping", BCON_INT32 (1)); bson_error_t error; bool r; mongoc_server_description_t **sds; size_t i, n; /* ensure client has connected */ r = mongoc_client_command_simple (client, "db", b, NULL, NULL, &error); if (!r) { MONGOC_ERROR ("could not connect: %s\n", error.message); return; } sds = mongoc_client_get_server_descriptions (client, &n); for (i = 0; i < n; ++i) { printf ("%s\n", mongoc_server_description_host (sds[i])->host_and_port); } mongoc_server_descriptions_destroy_all (sds, n); bson_destroy (&b); } Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``n``: Receives the length of the descriptions array. Returns ------- A newly allocated array that must be freed with :symbol:`mongoc_server_descriptions_destroy_all`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_server_status.rst000066400000000000000000000025631456567454500271720ustar00rootroot00000000000000:man_page: mongoc_client_get_server_status mongoc_client_get_server_status() ================================= .. warning:: .. deprecated:: 1.10.0 This function is deprecated and should not be used in new code. Run the `serverStatus `_ command directly with :symbol:`mongoc_client_read_command_with_opts()` instead. Synopsis -------- .. code-block:: c bool mongoc_client_get_server_status (mongoc_client_t *client, mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error) BSON_GNUC_DEPRECATED; Queries the server for the current server status. The result is stored in ``reply``. ``reply`` is always initialized, even in the case of failure. Always call :symbol:`bson:bson_destroy()` to release it. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_uri.rst000066400000000000000000000006351456567454500250560ustar00rootroot00000000000000:man_page: mongoc_client_get_uri mongoc_client_get_uri() ======================= Synopsis -------- .. code-block:: c const mongoc_uri_t * mongoc_client_get_uri (const mongoc_client_t *client); Fetches the :symbol:`mongoc_uri_t` used to create the client. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A :symbol:`mongoc_uri_t` that should not be modified or freed. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_get_write_concern.rst000066400000000000000000000007511456567454500271170ustar00rootroot00000000000000:man_page: mongoc_client_get_write_concern mongoc_client_get_write_concern() ================================= Synopsis -------- .. code-block:: c const mongoc_write_concern_t * mongoc_client_get_write_concern (const mongoc_client_t *client); Retrieve the default write concern configured for the client instance. The result should not be modified or freed. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A :symbol:`mongoc_write_concern_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_new.rst000066400000000000000000000012011456567454500241770ustar00rootroot00000000000000:man_page: mongoc_client_new mongoc_client_new() =================== Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_new (const char *uri_string) BSON_GNUC_WARN_UNUSED_RESULT; Creates a new :symbol:`mongoc_client_t` using the URI string provided. Parameters ---------- * ``uri_string``: A string containing the MongoDB connection URI. Returns ------- A newly allocated :symbol:`mongoc_client_t` that should be freed with :symbol:`mongoc_client_destroy()` when no longer in use. On error, ``NULL`` is returned and an error or warning will be logged. .. seealso:: | :symbol:`mongoc_client_new_from_uri()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_new_from_uri.rst000066400000000000000000000012321456567454500261050ustar00rootroot00000000000000:man_page: mongoc_client_new_from_uri mongoc_client_new_from_uri() ============================ Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_new_from_uri (const mongoc_uri_t *uri) BSON_GNUC_WARN_UNUSED_RESULT; Creates a new :symbol:`mongoc_client_t` using the :symbol:`mongoc_uri_t` provided. Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Returns ------- A newly allocated :symbol:`mongoc_client_t` that should be freed with :symbol:`mongoc_client_destroy()` when no longer in use. On error, ``NULL`` is returned and an error will be logged. .. seealso:: | :symbol:`mongoc_client_new_from_uri_with_error()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_new_from_uri_with_error.rst000066400000000000000000000014631456567454500303570ustar00rootroot00000000000000:man_page: mongoc_client_new_from_uri_with_error mongoc_client_new_from_uri_with_error() ======================================= Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_new_from_uri_with_error (const mongoc_uri_t *uri, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; Creates a new :symbol:`mongoc_client_t` using the :symbol:`mongoc_uri_t` provided. Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Returns ------- A newly allocated :symbol:`mongoc_client_t` that should be freed with :symbol:`mongoc_client_destroy()` when no longer in use. On error, ``NULL`` is returned and ``error`` will be populated with the error description. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_destroy.rst000066400000000000000000000014171456567454500261410ustar00rootroot00000000000000:man_page: mongoc_client_pool_destroy mongoc_client_pool_destroy() ============================ Synopsis -------- .. code-block:: c void mongoc_client_pool_destroy (mongoc_client_pool_t *pool); Release all resources associated with ``pool``, including freeing the structure. All :symbol:`mongoc_client_t` objects obtained from :symbol:`mongoc_client_pool_pop()` from ``pool`` must be pushed back onto the pool with :symbol:`mongoc_client_pool_push()` prior to calling :symbol:`mongoc_client_pool_destroy()`. This method is NOT thread safe, and must only be called by one thread. It should be called once the application is shutting down, and after all other threads that use clients have been joined. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_enable_auto_encryption.rst000066400000000000000000000040141456567454500311740ustar00rootroot00000000000000:man_page: mongoc_client_pool_enable_auto_encryption mongoc_client_pool_enable_auto_encryption() =========================================== Synopsis -------- .. code-block:: c bool mongoc_client_pool_enable_auto_encryption (mongoc_client_pool_t *pool, mongoc_auto_encryption_opts_t* opts, bson_error_t* error); Enable automatic client side encryption on a :symbol:`mongoc_client_pool_t`. Requires libmongoc to be built with support for In-Use Encryption. See :doc:`in-use-encryption` for instructions to enable In-Use Encryption in libmongoc. Automatic encryption is an enterprise-only feature that only applies to operations on a collection. Automatic encryption is not supported for operations on a database or view, and operations that are not bypassed will result in error. To bypass automatic encryption for all operations, bypass automatic encryption with :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption()` in ``opts``. Automatic encryption requires the authenticated user to have the `listCollections privilege action `_. Enabling automatic encryption reduces the maximum message size and may have a negative performance impact. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A required :symbol:`mongoc_auto_encryption_opts_t`. * ``error``: A :symbol:`bson_error_t` which is set on error. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_auto_encryption_opts_t` | :symbol:`mongoc_client_enable_auto_encryption()` | :doc:`in-use-encryption` for libmongoc | The MongoDB Manual for `Client-Side Field Level Encryption `_ | The MongoDB Manual for `Queryable Encryption `_ mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_max_size.rst000066400000000000000000000011221456567454500262600ustar00rootroot00000000000000:man_page: mongoc_client_pool_max_size mongoc_client_pool_max_size() ============================= Synopsis -------- .. code-block:: c void mongoc_client_pool_max_size (mongoc_client_pool_t *pool, uint32_t max_pool_size); This function sets the maximum number of pooled connections available from a :symbol:`mongoc_client_pool_t`. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``max_pool_size``: The maximum number of connections which shall be available from the pool. .. include:: includes/mongoc_client_pool_thread_safe.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_min_size.rst000066400000000000000000000022351456567454500262640ustar00rootroot00000000000000:man_page: mongoc_client_pool_min_size mongoc_client_pool_min_size() ============================= .. warning:: .. deprecated:: 1.9.0 This function is deprecated because its behavior does not match what developers expect from a "minimum pool size", and its actual behavior is likely to hurt performance. Applications should not call this function, they should instead accept the default behavior, which is to keep all idle clients that are pushed into the pool. Synopsis -------- .. code-block:: c void mongoc_client_pool_min_size (mongoc_client_pool_t *pool, uint32_t min_pool_size) BSON_GNUC_DEPRECATED; This function sets the *maximum* number of idle clients to be kept in the pool. Any idle clients in excess of the maximum are destroyed. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``min_pool_size``: The number of idle clients to keep in the pool. .. include:: includes/mongoc_client_pool_thread_safe.txt Subsequent calls to :symbol:`mongoc_client_pool_push` respect the new minimum size, and close the least recently used :symbol:`mongoc_client_t` if the minimum size is exceeded. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_new.rst000066400000000000000000000012421456567454500252350ustar00rootroot00000000000000:man_page: mongoc_client_pool_new mongoc_client_pool_new() ======================== Synopsis -------- .. code-block:: c mongoc_client_pool_t * mongoc_client_pool_new (const mongoc_uri_t *uri) BSON_GNUC_WARN_UNUSED_RESULT; This function creates a new :symbol:`mongoc_client_pool_t` using the :symbol:`mongoc_uri_t` provided. Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Returns ------- A newly allocated :symbol:`mongoc_client_pool_t` that should be freed with :symbol:`mongoc_client_pool_destroy()` when no longer in use. On error, ``NULL`` is returned and an error may be logged. .. seealso:: | :symbol:`mongoc_client_pool_new_with_error()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_new_with_error.rst000066400000000000000000000015011456567454500274770ustar00rootroot00000000000000:man_page: mongoc_client_pool_new_with_error mongoc_client_pool_new_with_error() =================================== Synopsis -------- .. code-block:: c mongoc_client_pool_t * mongoc_client_pool_new_with_error (const mongoc_uri_t *uri, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; This function creates a new :symbol:`mongoc_client_pool_t` using the :symbol:`mongoc_uri_t` provided. Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Returns ------- A newly allocated :symbol:`mongoc_client_pool_t` that should be freed with :symbol:`mongoc_client_pool_destroy()` when no longer in use. On error, ``NULL`` is returned and ``error`` will be populated with the error description. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_pop.rst000066400000000000000000000020261456567454500252430ustar00rootroot00000000000000:man_page: mongoc_client_pool_pop mongoc_client_pool_pop() ======================== Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_pool_pop (mongoc_client_pool_t *pool) BSON_GNUC_WARN_UNUSED_RESULT; Retrieve a :symbol:`mongoc_client_t` from the client pool, or create one. The total number of clients that can be created from this pool is limited by the URI option "maxPoolSize", default 100. If this number of clients has been created and all are in use, ``mongoc_client_pool_pop`` blocks until another thread returns a client with :symbol:`mongoc_client_pool_push()`. If the "waitQueueTimeoutMS" URI option was specified with a positive value, then ``mongoc_client_pool_pop`` will return ``NULL`` when the timeout expires. The returned :symbol:`mongoc_client_t` must be returned to the pool with :symbol:`mongoc_client_pool_push()`. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. Returns ------- A :symbol:`mongoc_client_t`. .. include:: includes/mongoc_client_pool_thread_safe.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_push.rst000066400000000000000000000007161456567454500254300ustar00rootroot00000000000000:man_page: mongoc_client_pool_push mongoc_client_pool_push() ========================= Synopsis -------- .. code-block:: c void mongoc_client_pool_push (mongoc_client_pool_t *pool, mongoc_client_t *client); This function returns a :symbol:`mongoc_client_t` back to the client pool. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``client``: A :symbol:`mongoc_client_t`. .. include:: includes/mongoc_client_pool_thread_safe.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_set_apm_callbacks.rst000066400000000000000000000021701456567454500300740ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_apm_callbacks mongoc_client_pool_set_apm_callbacks() ====================================== Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_apm_callbacks (mongoc_client_pool_t *pool, mongoc_apm_callbacks_t *callbacks, void *context); Register a set of callbacks to receive Application Performance Monitoring events. The ``callbacks`` are copied by the pool and may be destroyed at any time after. If a ``context`` is passed, it is the application's responsibility to ensure ``context`` remains valid for the lifetime of the pool. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``context``: Optional pointer to include with each event notification. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. .. include:: includes/mongoc_client_pool_call_once.txt .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_set_appname.rst000066400000000000000000000014001456567454500267340ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_appname mongoc_client_pool_set_appname() ================================ Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_appname (mongoc_client_pool_t *pool, const char *appname) This function is identical to :symbol:`mongoc_client_set_appname()` except for client pools. Also note that :symbol:`mongoc_client_set_appname()` cannot be called on a client retrieved from a client pool. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``appname``: The application name, of length at most ``MONGOC_HANDSHAKE_APPNAME_MAX``. Returns ------- Returns true if appname was set. If appname is too long, returns false and logs an error. .. include:: includes/mongoc_client_pool_call_once.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_set_error_api.rst000066400000000000000000000014121456567454500273000ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_error_api mongoc_client_pool_set_error_api() ================================== Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_error_api (mongoc_client_pool_t *client, int32_t version); Configure how the C Driver reports errors. See :ref:`Setting the Error API Version `. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``version``: The version of the error API, either ``MONGOC_ERROR_API_VERSION_LEGACY`` or ``MONGOC_ERROR_API_VERSION_2``. Returns ------- Returns true if the error API version was set, or logs an error message and returns false if ``version`` is invalid. .. include:: includes/mongoc_client_pool_call_once.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_set_server_api.rst000066400000000000000000000015001456567454500274530ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_server_api mongoc_client_pool_set_server_api() =================================== Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_server_api (mongoc_client_pool_t *pool, const mongoc_server_api_t *api, bson_error_t *error); Set the API version to use for clients created through ``pool``. Once the API version is set on a pool, it may not be changed to a new value. Attempting to do so will cause this method to fail and set ``error``. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``api``: A :symbol:`mongoc_server_api_t`. * ``error``: A :symbol:`bson_error_t`. Returns ------- True if the version was successfully set, false if not. On failure, ``error`` will be set. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_set_ssl_opts.rst000066400000000000000000000023761456567454500271760ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_ssl_opts mongoc_client_pool_set_ssl_opts() ================================= Synopsis -------- .. code-block:: c #ifdef MONGOC_ENABLE_SSL void mongoc_client_pool_set_ssl_opts (mongoc_client_pool_t *pool, const mongoc_ssl_opt_t *opts); #endif This function is identical to :symbol:`mongoc_client_set_ssl_opts()` except for client pools. It ensures that all clients retrieved from :symbol:`mongoc_client_pool_pop()` or :symbol:`mongoc_client_pool_try_pop()` are configured with the same SSL settings. The ``mongoc_ssl_opt_t`` struct is copied by the pool along with the strings it points to (``pem_file``, ``pem_pwd``, ``ca_file``, ``ca_dir``, and ``crl_file``) so they don't have to remain valid after the call to ``mongoc_client_pool_set_ssl_opts``. A call to ``mongoc_client_pool_set_ssl_opts`` overrides all TLS options set through the connection string with which the ``mongoc_client_pool_t`` was constructed. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``opts``: A :symbol:`mongoc_ssl_opt_t`. .. include:: includes/mongoc_client_pool_call_once.txt Availability ------------ This feature requires that the MongoDB C driver was compiled with ``-DENABLE_SSL``. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_t.rst000066400000000000000000000024761456567454500247210ustar00rootroot00000000000000:man_page: mongoc_client_pool_t mongoc_client_pool_t ==================== A connection pool for multi-threaded programs. See :doc:`connection-pooling`. Synopsis -------- .. code-block:: c typedef struct _mongoc_client_pool_t mongoc_client_pool_t ``mongoc_client_pool_t`` is the basis for multi-threading in the MongoDB C driver. Since :symbol:`mongoc_client_t` structures are not thread-safe, this structure is used to retrieve a new :symbol:`mongoc_client_t` for a given thread. This structure *is thread-safe*, except for its destructor method, :symbol:`mongoc_client_pool_destroy`, which *is not thread-safe* and must only be called from one thread. Example ------- .. literalinclude:: ../examples/example-pool.c :language: c :caption: example-pool.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_pool_destroy mongoc_client_pool_enable_auto_encryption mongoc_client_pool_max_size mongoc_client_pool_min_size mongoc_client_pool_new mongoc_client_pool_new_with_error mongoc_client_pool_pop mongoc_client_pool_push mongoc_client_pool_set_apm_callbacks mongoc_client_pool_set_appname mongoc_client_pool_set_error_api mongoc_client_pool_set_server_api mongoc_client_pool_set_ssl_opts mongoc_client_pool_try_pop mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_pool_try_pop.rst000066400000000000000000000011631456567454500261420ustar00rootroot00000000000000:man_page: mongoc_client_pool_try_pop mongoc_client_pool_try_pop() ============================ Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_pool_try_pop (mongoc_client_pool_t *pool) BSON_GNUC_WARN_UNUSED_RESULT; This function is identical to :symbol:`mongoc_client_pool_pop()` except it will return ``NULL`` instead of blocking for a client to become available. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. Returns ------- A :symbol:`mongoc_client_t` if one is immediately available, otherwise ``NULL``. .. include:: includes/mongoc_client_pool_thread_safe.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_read_command_with_opts.rst000066400000000000000000000043361456567454500301330ustar00rootroot00000000000000:man_page: mongoc_client_read_command_with_opts mongoc_client_read_command_with_opts() ====================================== Synopsis -------- .. code-block:: c bool mongoc_client_read_command_with_opts (mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic that is specific to commands that read, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``client`` .. include:: includes/read-cmd-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. .. |generic-cmd| replace:: :symbol:`mongoc_client_command_with_opts` .. include:: includes/retryable-read.txt .. include:: includes/retryable-read-command.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. .. _mongoc_client_read_command_with_opts_example: Example ------- .. literalinclude:: ../examples/example-command-with-opts.c :language: c :caption: example-command-with-opts.c mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_read_write_command_with_opts.rst000066400000000000000000000040301456567454500313340ustar00rootroot00000000000000:man_page: mongoc_client_read_write_command_with_opts mongoc_client_read_write_command_with_opts() ============================================ Synopsis -------- .. code-block:: c bool mongoc_client_read_write_command_with_opts ( mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* UNUSED */, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic for commands that both read and write, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``client`` .. include:: includes/read-write-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. (The :symbol:`mongoc_read_prefs_t` parameter was included by mistake when this function was introduced in libmongoc 1.5. A command that writes must not obey a read preference.) Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: Ignored. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_reset.rst000066400000000000000000000015201456567454500245340ustar00rootroot00000000000000:man_page: mongoc_client_reset mongoc_client_reset() ===================== Synopsis -------- .. code-block:: c void mongoc_client_reset (mongoc_client_t *client); Call this method in the child after forking to invalidate the :symbol:`mongoc_client_t`. Description ----------- Calling :symbol:`mongoc_client_reset()` prevents resource cleanup in the child process from interfering with the parent process. This method causes the client to clear its session pool without sending endSessions. It also increments an internal generation counter on the given client. After this method is called, cursors from previous generations will not issue a killCursors command when they are destroyed. Client sessions from previous generations cannot be used and should be destroyed. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_select_server.rst000066400000000000000000000024641456567454500262670ustar00rootroot00000000000000:man_page: mongoc_client_select_server mongoc_client_select_server() ============================= Synopsis -------- .. code-block:: c mongoc_server_description_t * mongoc_client_select_server (mongoc_client_t *client, bool for_writes, const mongoc_read_prefs_t *prefs, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; Choose a server for an operation, according to the logic described in the Server Selection Spec. Use this function only for building a language driver that wraps the C Driver. When writing applications in C, higher-level functions automatically select a suitable server. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``for_writes``: Whether to choose a server suitable for writes or reads. * ``prefs``: An optional :symbol:`mongoc_read_prefs_t`. If ``for_writes`` is true, ``prefs`` must be NULL. Otherwise, use ``prefs`` to customize server selection, or pass NULL to use read preference PRIMARY. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Returns ------- A :symbol:`mongoc_server_description_t` that must be freed with :symbol:`mongoc_server_description_destroy`. If no suitable server is found, returns NULL and ``error`` is filled out. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_abort_transaction.rst000066400000000000000000000014431456567454500306750ustar00rootroot00000000000000:man_page: mongoc_client_session_abort_transaction mongoc_client_session_abort_transaction() ========================================= Synopsis -------- .. code-block:: c bool mongoc_client_session_abort_transaction (mongoc_client_session_t *session, bson_error_t *error); Abort a multi-document transaction. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Return ------ Returns true if the transaction was aborted. Returns ``false`` and sets ``error`` if there are invalid arguments, such as a session with no transaction in progress. Network or server errors are ignored. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_advance_cluster_time.rst000066400000000000000000000020111456567454500313310ustar00rootroot00000000000000:man_page: mongoc_client_session_advance_cluster_time mongoc_client_session_advance_cluster_time() ============================================ Synopsis -------- .. code-block:: c void mongoc_client_session_advance_cluster_time (mongoc_client_session_t *session, const bson_t *cluster_time); Advance the cluster time for a session. Has an effect only if the new cluster time is greater than the session's current cluster time. Use :symbol:`mongoc_client_session_advance_operation_time` and :symbol:`mongoc_client_session_advance_cluster_time` to copy the operationTime and clusterTime from another session, ensuring subsequent operations in this session are causally consistent with the last operation in the other session Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``cluster_time``: The session's new cluster time, as a :symbol:`bson:bson_t` like `{"cluster time": }`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_advance_operation_time.rst000066400000000000000000000022371456567454500316620ustar00rootroot00000000000000:man_page: mongoc_client_session_advance_operation_time mongoc_client_session_advance_operation_time() ============================================== Synopsis -------- .. code-block:: c void mongoc_client_session_advance_operation_time (mongoc_client_session_t *session, uint32_t timestamp, uint32_t increment); Advance the session's operation time, expressed as a BSON Timestamp with timestamp and increment components. Has an effect only if the new operation time is greater than the session's current operation time. Use :symbol:`mongoc_client_session_advance_operation_time` and :symbol:`mongoc_client_session_advance_cluster_time` to copy the operationTime and clusterTime from another session, ensuring subsequent operations in this session are causally consistent with the last operation in the other session Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``timestamp``: The new operationTime's timestamp component. * ``increment``: The new operationTime's increment component. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_append.rst000066400000000000000000000020131456567454500264220ustar00rootroot00000000000000:man_page: mongoc_client_session_append mongoc_client_session_append() ============================== Synopsis -------- .. code-block:: c bool mongoc_client_session_append (const mongoc_client_session_t *client_session, bson_t *opts, bson_error_t *error); Parameters ---------- * ``client_session``: A pointer to a :symbol:`mongoc_client_session_t`. * ``opts``: A pointer to a :symbol:`bson:bson_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- This function appends a logical session id to command options. Use it to configure a session for any function that takes an options document, such as :symbol:`mongoc_client_write_command_with_opts`. It is an error to use a session for unacknowledged writes. Returns ------- Returns true on success. If any arguments are invalid, returns false and fills out ``error``. Example ------- See the example code for :symbol:`mongoc_client_session_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_commit_transaction.rst000066400000000000000000000020241456567454500310520ustar00rootroot00000000000000:man_page: mongoc_client_session_commit_transaction mongoc_client_session_commit_transaction() ========================================== Synopsis -------- .. code-block:: c bool mongoc_client_session_commit_transaction (mongoc_client_session_t *session, bson_t *reply, bson_error_t *error); Commit a multi-document transaction. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Return ------ Returns true if the transaction was committed. Returns ``false`` and sets ``error`` if there are invalid arguments, such as a session with no transaction in progress, or if there is a server or network error. If a ``reply`` is supplied, it is always initialized and must be freed with :symbol:`bson:bson_destroy`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_destroy.rst000066400000000000000000000011621456567454500266500ustar00rootroot00000000000000:man_page: mongoc_client_session_destroy mongoc_client_session_destroy() =============================== Synopsis -------- .. code-block:: c void mongoc_client_session_destroy (mongoc_client_session_t *session); End a session, returning its session id to the pool, and free all client resources associated with the session. If a multi-document transaction is in progress, abort it. Does nothing if ``session`` is NULL. See the example code for :symbol:`mongoc_client_session_t`. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_get_client.rst000066400000000000000000000011051456567454500272710ustar00rootroot00000000000000:man_page: mongoc_client_session_get_client mongoc_client_session_get_client() ================================== Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_session_get_client (const mongoc_client_session_t *session); Returns the :symbol:`mongoc_client_t` from which this session was created. See :symbol:`mongoc_client_start_session()`. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- A :symbol:`mongoc_client_t` that should not be freed. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_get_cluster_time.rst000066400000000000000000000013021456567454500305110ustar00rootroot00000000000000:man_page: mongoc_client_session_get_cluster_time mongoc_client_session_get_cluster_time() ======================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_client_session_get_cluster_time (const mongoc_client_session_t *session); Get the session's clusterTime as a BSON document. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- If the session has not been used for any operation and :symbol:`mongoc_client_session_advance_cluster_time()` has not been called, a :symbol:`bson:bson_t` that is valid only for the lifetime of ``session``. Otherwise, ``NULL``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_get_dirty.rst000066400000000000000000000014311456567454500271500ustar00rootroot00000000000000:man_page: mongoc_client_session_get_dirty mongoc_client_session_get_dirty() ================================= Synopsis -------- .. code-block:: c bool mongoc_client_session_get_dirty (const mongoc_client_session_t *session); Indicates whether ``session`` has been marked "dirty" as defined in the `driver sessions specification `_. Parameters ---------- * ``session``: A const :symbol:`mongoc_client_session_t`. Description ----------- This function is intended for use by drivers that wrap libmongoc. It is not useful in client applications. Returns ------- A boolean indicating whether the session has been marked "dirty". .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_get_lsid.rst000066400000000000000000000011061456567454500267470ustar00rootroot00000000000000:man_page: mongoc_client_session_get_lsid mongoc_client_session_get_lsid() ================================ Synopsis -------- .. code-block:: c const bson_t * mongoc_client_session_get_lsid (mongoc_client_session_t *session); Get the server-side "logical session ID" associated with this :symbol:`mongoc_client_session_t` as a BSON document. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- A :symbol:`bson:bson_t` that is valid only for the lifetime of ``session``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_get_operation_time.rst000066400000000000000000000015741456567454500310430ustar00rootroot00000000000000:man_page: mongoc_client_session_get_operation_time mongoc_client_session_get_operation_time() ========================================== Synopsis -------- .. code-block:: c void mongoc_client_session_get_operation_time (const mongoc_client_session_t *session, uint32_t *timestamp, uint32_t *increment); Get the session's operationTime, expressed as a BSON Timestamp with timestamp and increment components. If the session has not been used for any operations, the timestamp and increment are 0. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``timestamp``: A pointer to a ``uint32_t`` to receive the timestamp component. * ``increment``: A pointer to a ``uint32_t`` to receive the increment component. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_get_opts.rst000066400000000000000000000011151456567454500270010ustar00rootroot00000000000000:man_page: mongoc_client_session_get_opts mongoc_client_session_get_opts() ================================ Synopsis -------- .. code-block:: c const mongoc_session_opt_t * mongoc_client_session_get_opts (const mongoc_client_session_t *session); Get a reference to the :symbol:`mongoc_session_opt_t` with which this session was configured. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- A :symbol:`mongoc_session_opt_t` that is valid only for the lifetime of ``session``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_get_server_id.rst000066400000000000000000000011041456567454500277740ustar00rootroot00000000000000:man_page: mongoc_client_session_get_server_id mongoc_client_session_get_server_id() ===================================== Synopsis -------- .. code-block:: c uint32_t mongoc_client_session_get_server_id (const mongoc_client_session_t *session); Get the "server ID" of the ``mongos`` this :symbol:`mongoc_client_session_t` is pinned to. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- A server ID or ``0`` if this :symbol:`mongoc_client_session_t` is not pinned. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_get_transaction_state.rst000066400000000000000000000010431456567454500315410ustar00rootroot00000000000000:man_page: mongoc_client_session_get_transaction_state mongoc_client_session_get_transaction_state() ============================================= Synopsis -------- .. code-block:: c mongoc_transaction_state_t mongoc_client_session_get_transaction_state (const mongoc_client_session_t *session); Returns the current transaction state for this session. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Return ------ Returns a :symbol:`mongoc_transaction_state_t` that represents the current transaction state. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_in_transaction.rst000066400000000000000000000010151456567454500301670ustar00rootroot00000000000000:man_page: mongoc_client_session_in_transaction mongoc_client_session_in_transaction() ====================================== Synopsis -------- .. code-block:: c bool mongoc_client_session_in_transaction (const mongoc_client_session_t *session); Check whether a multi-document transaction is in progress for this session. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Return ------ Returns true if a transaction was started and has not been committed or aborted, otherwise ``false``. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_start_transaction.rst000066400000000000000000000034321456567454500307230ustar00rootroot00000000000000:man_page: mongoc_client_session_start_transaction mongoc_client_session_start_transaction() ========================================= Synopsis -------- .. code-block:: c bool mongoc_client_session_start_transaction (mongoc_client_session_t *session, const mongoc_transaction_opt_t *opts, bson_error_t *error); Start a multi-document transaction for all following operations in this session. Any options provided in ``opts`` override options passed to :symbol:`mongoc_session_opts_set_default_transaction_opts`, and options inherited from the :symbol:`mongoc_client_t`. The ``opts`` argument is copied and can be freed after calling this function. The transaction must be completed with :symbol:`mongoc_client_session_commit_transaction` or :symbol:`mongoc_client_session_abort_transaction`. An in-progress transaction is automatically aborted by :symbol:`mongoc_client_session_destroy`. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``opts``: A :symbol:`mongoc_transaction_opt_t` or ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Return ------ Returns true if the transaction was started. Returns ``false`` and sets ``error`` if there are invalid arguments, such as a session with a transaction already in progress. .. _mongoc_client_session_start_transaction_example: Example ------- The following example demonstrates how to use :ref:`error labels ` to reliably execute a multi-document transaction despite network errors and other transient failures. .. literalinclude:: ../examples/example-transaction.c :language: c :caption: example-transaction.c .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_t.rst000066400000000000000000000027331456567454500254270ustar00rootroot00000000000000:man_page: mongoc_client_session_t :tags: session mongoc_client_session_t ======================= Use a session for a sequence of operations, optionally with causal consistency. See `the MongoDB Manual Entry for Causal Consistency `_. Synopsis -------- .. include:: includes/session-lifecycle.txt Fork Safety ----------- A :symbol:`mongoc_client_session_t` is only usable in the parent process after a fork. The child process must call :symbol:`mongoc_client_reset` on the ``client`` field. Example ------- .. literalinclude:: ../examples/example-session.c :language: c :caption: example-session.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_session_start_transaction mongoc_client_session_in_transaction mongoc_client_session_get_transaction_state mongoc_client_session_commit_transaction mongoc_client_session_abort_transaction mongoc_client_session_advance_cluster_time mongoc_client_session_advance_operation_time mongoc_client_session_with_transaction mongoc_client_session_append mongoc_client_session_get_client mongoc_client_session_get_cluster_time mongoc_client_session_get_dirty mongoc_client_session_get_operation_time mongoc_client_session_get_opts mongoc_client_session_get_lsid mongoc_client_session_get_server_id mongoc_client_session_destroy mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_with_transaction.rst000066400000000000000000000045321456567454500305430ustar00rootroot00000000000000:man_page: mongoc_client_session_with_transaction mongoc_client_session_with_transaction() ======================================== Synopsis -------- .. code-block:: c bool mongoc_client_session_with_transaction (mongoc_client_session_t *session, mongoc_client_session_with_transaction_cb_t cb, const mongoc_transaction_opt_t *opts, void *ctx, bson_t *reply, bson_error_t *error); This method will start a new transaction on ``session``, run ``cb``, and then commit the transaction. If it cannot commit the transaction, the entire sequence may be retried, and ``cb`` may be run multiple times. ``ctx`` will be passed to ``cb`` each time it is called. This method has an internal time limit of 120 seconds, and will retry until that time limit is reached. This timeout is not configurable. ``cb`` should not attempt to start new transactions, but should simply run operations meant to be contained within a transaction. The ``cb`` does not need to commit transactions; this is handled by the :symbol:`mongoc_client_session_with_transaction`. If ``cb`` does commit or abort a transaction, however, this method will return without taking further action. The parameter ``reply`` is initialized even upon failure to simplify memory management. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``cb``: A :symbol:`mongoc_client_session_with_transaction_cb_t` callback, which will run inside of a new transaction on the session. See example below. * ``opts``: An optional :symbol:`mongoc_transaction_opt_t`. * ``ctx``: A ``void*``. This user-provided data will be passed to ``cb``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t` or ``NULL``. Return ------ Returns ``true`` if the transaction was completed successfully. Otherwise, returns ``false`` in case of failure. In cases of failure ``error`` will also be set, except if the passed-in ``cb`` fails without setting ``error``. If a non-NULL ``reply`` is passed in, ``reply`` will be set to the value of the last server response, except if the passed-in ``cb`` fails without setting a ``reply``. Example ------- .. literalinclude:: ../examples/example-with-transaction-cb.c :language: c :caption: Use with_transaction() to run a callback within a transaction mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_session_with_transaction_cb_t.rst000066400000000000000000000024111456567454500315240ustar00rootroot00000000000000:man_page: mongoc_client_session_with_transaction_cb_t mongoc_client_session_with_transaction_cb_t =========================================== Synopsis -------- .. code-block:: c typedef bool (*mongoc_client_session_with_transaction_cb_t) ( mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error); Provide this callback to :symbol:`mongoc_client_session_with_transaction`. The callback should run a sequence of operations meant to be contained within a transaction. The callback should not attempt to start or commit transactions. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``ctx``: A ``void*`` set to the the user-provided ``ctx`` passed to :symbol:`mongoc_client_session_with_transaction`. * ``reply``: An optional location for a :symbol:`bson_t` or ``NULL``. The callback should set this if it runs any operations against the server and receives replies. * ``error``: A :symbol:`bson_error_t`. The callback should set this if it receives any errors while running operations against the server. Return ------ Returns ``true`` for success and ``false`` on failure. If ``cb`` returns ``false`` then it should also set ``error``. .. seealso:: | :symbol:`mongoc_client_session_with_transaction` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_set_apm_callbacks.rst000066400000000000000000000021101456567454500270350ustar00rootroot00000000000000:man_page: mongoc_client_set_apm_callbacks mongoc_client_set_apm_callbacks() ================================= Synopsis -------- .. code-block:: c bool mongoc_client_set_apm_callbacks (mongoc_client_t *client, mongoc_apm_callbacks_t *callbacks, void *context); Register a set of callbacks to receive Application Performance Monitoring events. The ``callbacks`` are copied by the client and may be destroyed at any time after. If a ``context`` is passed, it is the application's responsibility to ensure ``context`` remains valid for the lifetime of the client. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``callbacks``: Optional :symbol:`mongoc_apm_callbacks_t`. Pass NULL to clear all callbacks. * ``context``: Optional pointer to include with each event notification. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_set_appname.rst000066400000000000000000000020151456567454500257060ustar00rootroot00000000000000:man_page: mongoc_client_set_appname mongoc_client_set_appname() =========================== Synopsis -------- .. code-block:: c bool mongoc_client_set_appname (mongoc_client_t *client, const char *appname) Sets the application name for this client. This string, along with other internal driver details, is sent to the server as part of the initial connection handshake (`"hello" `_). ``appname`` is copied, and doesn't have to remain valid after the call to ``mongoc_client_set_appname()``. This function will log an error and return false in the following cases: * ``appname`` is longer than ``MONGOC_HANDSHAKE_APPNAME_MAX`` * ``client`` has already initiated a handshake * ``client`` is from a :symbol:`mongoc_client_pool_t` Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``appname``: The application name, of length at most ``MONGOC_HANDSHAKE_APPNAME_MAX``. Returns ------- true if the appname is set successfully. Otherwise, false. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_set_error_api.rst000066400000000000000000000013241456567454500262510ustar00rootroot00000000000000:man_page: mongoc_client_set_error_api mongoc_client_set_error_api() ============================= Synopsis -------- .. code-block:: c bool mongoc_client_set_error_api (mongoc_client_t *client, int32_t version); Configure how the C Driver reports errors. See :ref:`Setting the Error API Version `. Do not use this function with pooled clients, see :symbol:`mongoc_client_pool_set_error_api`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``version``: The version of the error API, either ``MONGOC_ERROR_API_VERSION_LEGACY`` or ``MONGOC_ERROR_API_VERSION_2``. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_set_read_concern.rst000066400000000000000000000015771456567454500267230ustar00rootroot00000000000000:man_page: mongoc_client_set_read_concern mongoc_client_set_read_concern() ================================ Synopsis -------- .. code-block:: c void mongoc_client_set_read_concern (mongoc_client_t *client, const mongoc_read_concern_t *read_concern); Sets the read concern for the client. This only affects future operations, collections, and databases inheriting from ``client``. The default read concern is MONGOC_READ_CONCERN_LEVEL_LOCAL. This is the correct read concern for the great majority of applications. It is a programming error to call this function on a client from a :symbol:`mongoc_client_pool_t`. For pooled clients, set the read concern with the :ref:`MongoDB URI ` instead. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``read_concern``: A :symbol:`mongoc_read_concern_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_set_read_prefs.rst000066400000000000000000000015721456567454500264060ustar00rootroot00000000000000:man_page: mongoc_client_set_read_prefs mongoc_client_set_read_prefs() ============================== Synopsis -------- .. code-block:: c void mongoc_client_set_read_prefs (mongoc_client_t *client, const mongoc_read_prefs_t *read_prefs); Sets the default read preferences to use with future operations upon ``client``. The global default is to read from the replica set primary. It is a programming error to call this function on a client from a :symbol:`mongoc_client_pool_t`. For pooled clients, set the read preferences with the :ref:`MongoDB URI ` instead. Please see the MongoDB website for a description of `Read Preferences `_. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_set_server_api.rst000066400000000000000000000014101456567454500264220ustar00rootroot00000000000000:man_page: mongoc_client_set_server_api mongoc_client_set_server_api() ============================== Synopsis -------- .. code-block:: c bool mongoc_client_set_server_api (mongoc_client_t *client, const mongoc_server_api_t *api, bson_error_t *error); Set the API version to use for ``client``. Once the API version is set on a client, it may not be changed to a new value. Attempting to do so will cause this method to fail and set ``error``. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``api``: A :symbol:`mongoc_server_api_t`. * ``error``: A :symbol:`bson_error_t`. Returns ------- True if the version was successfully set, false if not. On failure, ``error`` will be set. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_set_ssl_opts.rst000066400000000000000000000022571456567454500261430ustar00rootroot00000000000000:man_page: mongoc_client_set_ssl_opts mongoc_client_set_ssl_opts() ============================ Synopsis -------- .. code-block:: c #ifdef MONGOC_ENABLE_SSL void mongoc_client_set_ssl_opts (mongoc_client_t *client, const mongoc_ssl_opt_t *opts); #endif Sets the TLS (SSL) options to use when connecting to TLS enabled MongoDB servers. The ``mongoc_ssl_opt_t`` struct is copied by the client along with the strings it points to (``pem_file``, ``pem_pwd``, ``ca_file``, ``ca_dir``, and ``crl_file``) so they don't have to remain valid after the call to ``mongoc_client_set_ssl_opts``. A call to ``mongoc_client_set_ssl_opts`` overrides all TLS options set through the connection string with which the ``mongoc_client_t`` was constructed. It is a programming error to call this function on a client from a :symbol:`mongoc_client_pool_t`. Instead, call :symbol:`mongoc_client_pool_set_ssl_opts` on the pool before popping any clients. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A :symbol:`mongoc_ssl_opt_t`. Availability ------------ This feature requires that the MongoDB C driver was compiled with ``-DENABLE_SSL``. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_set_stream_initiator.rst000066400000000000000000000021521456567454500276440ustar00rootroot00000000000000:man_page: mongoc_client_set_stream_initiator mongoc_client_set_stream_initiator() ==================================== Synopsis -------- .. code-block:: c void mongoc_client_set_stream_initiator (mongoc_client_t *client, mongoc_stream_initiator_t initiator, void *user_data); The :symbol:`mongoc_client_set_stream_initiator()` function shall associate a given :symbol:`mongoc_client_t` with a new stream initiator. This will completely replace the default transport (buffered TCP, possibly with TLS). The ``initiator`` should fulfill the :symbol:`mongoc_stream_t` contract. ``user_data`` is passed through to the ``initiator`` callback and may be used for whatever run time customization is necessary. If ``user_data`` is passed, it is the application's responsibility to ensure ``user_data`` remains valid for the lifetime of the client. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``initiator``: A :symbol:`mongoc_stream_initiator_t `. * ``user_data``: User supplied pointer for callback function. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_set_write_concern.rst000066400000000000000000000017371456567454500271400ustar00rootroot00000000000000:man_page: mongoc_client_set_write_concern mongoc_client_set_write_concern() ================================= Synopsis -------- .. code-block:: c void mongoc_client_set_write_concern (mongoc_client_t *client, const mongoc_write_concern_t *write_concern); Sets the write concern for the client. This only affects future operations, collections, and databases inheriting from ``client``. The default write concern is MONGOC_WRITE_CONCERN_W_DEFAULT: the driver blocks awaiting basic acknowledgement of write operations from MongoDB. This is the correct write concern for the great majority of applications. It is a programming error to call this function on a client from a :symbol:`mongoc_client_pool_t`. For pooled clients, set the write concern with the :ref:`MongoDB URI ` instead. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``write_concern``: A :symbol:`mongoc_write_concern_t`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_start_session.rst000066400000000000000000000021041456567454500263110ustar00rootroot00000000000000:man_page: mongoc_client_start_session mongoc_client_start_session() ============================= Synopsis -------- .. code-block:: c mongoc_client_session_t * mongoc_client_start_session (mongoc_client_t *client, mongoc_session_opt_t *opts, bson_error_t *error) Create a session for a sequence of operations. .. include:: includes/session-lifecycle.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: An optional :symbol:`mongoc_session_opt_t`. * ``error``: A :symbol:`bson:bson_error_t`. Returns ------- If successful, this function returns a newly allocated :symbol:`mongoc_client_session_t` that should be freed with :symbol:`mongoc_client_session_destroy()` when no longer in use. On error, returns NULL and sets ``error``. Errors ------ This function can fail if the driver is not built with crypto support, if ``opts`` is misconfigured, or if the session is configured with options that the server does not support. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_t.rst000066400000000000000000000057521456567454500236700ustar00rootroot00000000000000:man_page: mongoc_client_t mongoc_client_t =============== A single-threaded MongoDB connection. See :doc:`connection-pooling`. Synopsis -------- .. code-block:: c typedef struct _mongoc_client_t mongoc_client_t; typedef mongoc_stream_t *(*mongoc_stream_initiator_t) ( const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error); ``mongoc_client_t`` is an opaque type that provides access to a MongoDB server, replica set, or sharded cluster. It maintains management of underlying sockets and routing to individual nodes based on :symbol:`mongoc_read_prefs_t` or :symbol:`mongoc_write_concern_t`. Streams ------- The underlying transport for a given client can be customized, wrapped or replaced by any implementation that fulfills :symbol:`mongoc_stream_t`. A custom transport can be set with :symbol:`mongoc_client_set_stream_initiator()`. Thread Safety ------------- ``mongoc_client_t`` is *NOT* thread-safe and should only be used from one thread at a time. When used in multi-threaded scenarios, it is recommended that you use the thread-safe :symbol:`mongoc_client_pool_t` to retrieve a ``mongoc_client_t`` for your thread. Fork Safety ----------- A :symbol:`mongoc_client_t` is only usable in the parent process after a fork. The child process must call :symbol:`mongoc_client_reset`. Example ------- .. literalinclude:: ../examples/example-client.c :language: c :caption: example-client.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_command mongoc_client_command_simple mongoc_client_command_simple_with_server_id mongoc_client_command_with_opts mongoc_client_destroy mongoc_client_enable_auto_encryption mongoc_client_find_databases_with_opts mongoc_client_get_collection mongoc_client_get_crypt_shared_version mongoc_client_get_database mongoc_client_get_database_names mongoc_client_get_database_names_with_opts mongoc_client_get_default_database mongoc_client_get_gridfs mongoc_client_get_handshake_description mongoc_client_get_read_concern mongoc_client_get_read_prefs mongoc_client_get_server_description mongoc_client_get_server_descriptions mongoc_client_get_server_status mongoc_client_get_uri mongoc_client_get_write_concern mongoc_client_new mongoc_client_new_from_uri mongoc_client_new_from_uri_with_error mongoc_client_read_command_with_opts mongoc_client_read_write_command_with_opts mongoc_client_reset mongoc_client_select_server mongoc_client_set_apm_callbacks mongoc_client_set_appname mongoc_client_set_error_api mongoc_client_set_read_concern mongoc_client_set_read_prefs mongoc_client_set_server_api mongoc_client_set_ssl_opts mongoc_client_set_stream_initiator mongoc_client_set_write_concern mongoc_client_start_session mongoc_client_watch mongoc_client_write_command_with_opts mongoc_handshake_data_append mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_watch.rst000066400000000000000000000031761456567454500245310ustar00rootroot00000000000000:man_page: mongoc_client_watch mongoc_client_watch() ===================== Synopsis -------- .. code-block:: c mongoc_change_stream_t* mongoc_client_watch (mongoc_client_t *client, const bson_t *pipeline, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; A helper function to create a change stream. It is preferred to call this function over using a raw aggregation to create a change stream. This function uses the read preference and read concern of the client. If the change stream needs to re-establish connection, the same read preference will be used. This may happen if the change stream encounters a resumable error. .. warning:: A change stream is only supported with majority read concern. .. include:: includes/retryable-read.txt Parameters ---------- * ``db``: A :symbol:`mongoc_client_t` specifying the client which the change stream listens to. * ``pipeline``: A :symbol:`bson:bson_t` representing an aggregation pipeline appended to the change stream. This may be an empty document. * ``opts``: A :symbol:`bson:bson_t` containing change stream options. .. include:: includes/change-stream-opts.txt Returns ------- A newly allocated :symbol:`mongoc_change_stream_t` which must be freed with :symbol:`mongoc_change_stream_destroy` when no longer in use. The returned :symbol:`mongoc_change_stream_t` is never ``NULL``. If there is an error, it can be retrieved with :symbol:`mongoc_change_stream_error_document`, and subsequent calls to :symbol:`mongoc_change_stream_next` will return ``false``. .. seealso:: | :doc:`mongoc_database_watch` | :doc:`mongoc_collection_watch` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_client_write_command_with_opts.rst000066400000000000000000000046201456567454500303460ustar00rootroot00000000000000:man_page: mongoc_client_write_command_with_opts mongoc_client_write_command_with_opts() ======================================= Synopsis -------- .. code-block:: c bool mongoc_client_write_command_with_opts (mongoc_client_t *client, const char *db_name, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic that is specific to commands that write, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``client`` .. include:: includes/write-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Basic Write Operations ---------------------- Do not use this function to call the basic write commands "insert", "update", and "delete". Those commands require special logic not implemented in ``mongoc_client_write_command_with_opts``. For basic write operations use CRUD functions such as :symbol:`mongoc_collection_insert_one` and the others described in :ref:`the CRUD tutorial `, or use the :doc:`Bulk API `. Example ------- .. literalinclude:: ../examples/example-command-with-opts.c :language: c :caption: example-command-with-opts.c mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_aggregate.rst000066400000000000000000000110271456567454500262200ustar00rootroot00000000000000:man_page: mongoc_collection_aggregate mongoc_collection_aggregate() ============================= Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_collection_aggregate (mongoc_collection_t *collection, mongoc_query_flags_t flags, const bson_t *pipeline, const bson_t *opts, const mongoc_read_prefs_t *read_prefs) BSON_GNUC_WARN_UNUSED_RESULT; Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A :symbol:`mongoc_query_flags_t`. Not all flag values apply. In particular, setting ``MONGOC_QUERY_EXHAUST`` results in an error. * ``pipeline``: A :symbol:`bson:bson_t`, either a BSON array or a BSON document containing an array field named "pipeline". * ``opts``: A :symbol:`bson:bson_t` containing options for the command, or ``NULL``. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/aggregate-opts.txt For a list of all options, see `the MongoDB Manual entry on the aggregate command `_. .. include:: includes/retryable-read-aggregate.txt Description ----------- This function creates a cursor which sends the aggregate command on the underlying collection upon the first call to :symbol:`mongoc_cursor_next()`. For more information on building aggregation pipelines, see `the MongoDB Manual entry on the aggregate command `_. Read preferences, read and write concern, and collation can be overridden by various sources. The highest-priority sources for these options are listed first in the following table. In a transaction, read concern and write concern are prohibited in ``opts`` and the read preference must be primary or NULL. Write concern is applied from ``opts``, or if ``opts`` has no write concern and the aggregation pipeline includes "$out", the write concern is applied from ``collection``. The write concern is omitted for MongoDB before 3.4. ================== ============== ============== ========= Read Preferences Read Concern Write Concern Collation ================== ============== ============== ========= ``read_prefs`` ``opts`` ``opts`` ``opts`` Transaction Transaction Transaction ``collection`` ``collection`` ``collection`` ================== ============== ============== ========= :ref:`See the example for transactions ` and for :ref:`the "distinct" command with opts `. Returns ------- .. include:: includes/returns-cursor.txt Example ------- .. code-block:: c #include #include static mongoc_cursor_t * pipeline_query (mongoc_collection_t *collection) { mongoc_cursor_t *cursor; bson_t *pipeline; pipeline = BCON_NEW ("pipeline", "[", "{", "$match", "{", "foo", BCON_UTF8 ("A"), "}", "}", "{", "$match", "{", "bar", BCON_BOOL (false), "}", "}", "]"); cursor = mongoc_collection_aggregate ( collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_destroy (pipeline); return cursor; } Other Parameters ---------------- When using ``$out``, the pipeline stage that writes, the write_concern field of the :symbol:`mongoc_cursor_t` will be set to the :symbol:`mongoc_write_concern_t` parameter, if it is valid, and applied to the write command when :symbol:`mongoc_cursor_next()` is called. Pass any other parameters to the ``aggregate`` command, besides ``pipeline``, as fields in ``opts``: .. code-block:: c mongoc_write_concern_t *write_concern = mongoc_write_concern_new (); mongoc_write_concern_set_w (write_concern, 3); pipeline = BCON_NEW ("pipeline", "[", "{", "$out", BCON_UTF8 ("collection2"), "}", "]"); opts = BCON_NEW ("bypassDocumentValidation", BCON_BOOL (true)); mongoc_write_concern_append (write_concern, opts); cursor = mongoc_collection_aggregate ( collection1, MONGOC_QUERY_NONE, pipeline, opts, NULL); mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_command.rst000066400000000000000000000031661456567454500257150ustar00rootroot00000000000000:man_page: mongoc_collection_command mongoc_collection_command() =========================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_collection_command (mongoc_collection_t *collection, mongoc_query_flags_t flags, uint32_t skip, uint32_t limit, uint32_t batch_size, const bson_t *command, const bson_t *fields, const mongoc_read_prefs_t *read_prefs) BSON_GNUC_WARN_UNUSED_RESULT; This function is superseded by :symbol:`mongoc_collection_command_with_opts()`, :symbol:`mongoc_collection_read_command_with_opts()`, :symbol:`mongoc_collection_write_command_with_opts()`, and :symbol:`mongoc_collection_read_write_command_with_opts()`. .. include:: includes/not-retryable-read.txt Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A :symbol:`mongoc_query_flags_t`. * ``skip``: A uint32_t with the number of documents to skip or zero. * ``limit``: A uint32_t with the max number of documents to return or zero. * ``batch_size``: A uint32_t with the number of documents in each batch or zero. Default is 100. * ``command``: A :symbol:`bson:bson_t` containing the command to execute. * ``fields``: A :symbol:`bson:bson_t` containing the fields to return or ``NULL``. Not all commands support this option. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. Otherwise, the command uses mode ``MONGOC_READ_PRIMARY``. Returns ------- .. include:: includes/returns-cursor.txt mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_command_simple.rst000066400000000000000000000037541456567454500272710ustar00rootroot00000000000000:man_page: mongoc_collection_command_simple mongoc_collection_command_simple() ================================== Synopsis -------- .. code-block:: c bool mongoc_collection_command_simple (mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``command``: A :symbol:`bson:bson_t` containing the command to execute. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. Otherwise, the command uses mode ``MONGOC_READ_PRIMARY``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- This is a simplified version of :symbol:`mongoc_collection_command()` that returns the first result document in ``reply``. The collection's read preference, read concern, and write concern are not applied to the command. The parameter ``reply`` is initialized even upon failure to simplify memory management. This function tries to unwrap an embedded error in the command when possible. The unwrapped error will be propagated via the ``error`` parameter. Additionally, the result document is set in ``reply``. .. include:: includes/not-retryable-read.txt Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. This function does not check the server response for a write concern error or write concern timeout. Example ------- The following is an example of executing the ``ping`` command. .. literalinclude:: ../examples/example-collection-command.c :start-after: BEGIN:mongoc_collection_command :end-before: END:mongoc_collection_command mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_command_with_opts.rst000066400000000000000000000034261456567454500300140ustar00rootroot00000000000000:man_page: mongoc_collection_command_with_opts mongoc_collection_command_with_opts() ===================================== Synopsis -------- .. code-block:: c bool mongoc_collection_command_with_opts ( mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, interpreting ``opts`` according to the MongoDB server version. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``collection`` .. include:: includes/opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. .. include:: includes/not-retryable-read.txt Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. The reply is not parsed for a write concern timeout or write concern error. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_copy.rst000066400000000000000000000015561456567454500252520ustar00rootroot00000000000000:man_page: mongoc_collection_copy mongoc_collection_copy() ======================== Synopsis -------- .. code-block:: c mongoc_collection_t * mongoc_collection_copy (mongoc_collection_t *collection) BSON_GNUC_WARN_UNUSED_RESULT; Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. Description ----------- Performs a deep copy of the ``collection`` struct and its configuration. Useful if you intend to call :symbol:`mongoc_collection_set_write_concern`, :symbol:`mongoc_collection_set_read_prefs`, or :symbol:`mongoc_collection_set_read_concern`, and want to preserve an unaltered copy of the struct. This function does *not* copy the contents of the collection on the MongoDB server. Returns ------- A newly allocated :symbol:`mongoc_collection_t` that should be freed with :symbol:`mongoc_collection_destroy()` when no longer in use. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_count.rst000066400000000000000000000060401456567454500254210ustar00rootroot00000000000000:man_page: mongoc_collection_count mongoc_collection_count() ========================= .. warning:: .. deprecated:: 1.11.0 This function is deprecated and should not be used in new code. Use :symbol:`mongoc_collection_count_documents` or :symbol:`mongoc_collection_estimated_document_count` instead. :symbol:`mongoc_collection_count_documents` has similar performance to calling :symbol:`mongoc_collection_count` with a non-NULL ``query``, and is guaranteed to retrieve an accurate collection count. See :ref:`migrating from deprecated count functions ` for details. :symbol:`mongoc_collection_estimated_document_count` has the same performance as calling :symbol:`mongoc_collection_count` with a NULL ``query``, but is not guaranteed to retrieve an accurate collection count. .. include:: includes/retryable-read.txt Synopsis -------- .. code-block:: c int64_t mongoc_collection_count (mongoc_collection_t *collection, mongoc_query_flags_t flags, const bson_t *query, int64_t skip, int64_t limit, const mongoc_read_prefs_t *read_prefs, bson_error_t *error) BSON_GNUC_DEPRECATED_FOR (mongoc_collection_count_documents or mongoc_collection_estimated_document_count); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A :symbol:`mongoc_query_flags_t`. * ``query``: A :symbol:`bson:bson_t` containing the query. * ``skip``: A int64_t, zero to ignore. * ``limit``: A int64_t, zero to ignore. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- This function shall execute a count query on the underlying 'collection'. The bson 'query' is not validated, simply passed along as appropriate to the server. As such, compatibility and errors should be validated in the appropriate server documentation. For more information, see the `query reference `_ at the MongoDB website. The :symbol:`mongoc_read_concern_t` specified on the :symbol:`mongoc_collection_t` will be used, if any. If ``read_prefs`` is NULL, the collection's read preferences are used. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- -1 on failure, otherwise the number of documents counted. Example ------- .. code-block:: c #include #include #include static void print_query_count (mongoc_collection_t *collection, bson_t *query) { bson_error_t error; int64_t count; count = mongoc_collection_count ( collection, MONGOC_QUERY_NONE, query, 0, 0, NULL, &error); if (count < 0) { fprintf (stderr, "Count failed: %s\n", error.message); } else { printf ("%" PRId64 " documents counted.\n", count); } } mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_count_documents.rst000066400000000000000000000067471456567454500275200ustar00rootroot00000000000000:man_page: mongoc_collection_count_documents mongoc_collection_count_documents() =================================== Synopsis -------- .. code-block:: c int64_t mongoc_collection_count_documents (mongoc_collection_t *collection, const bson_t *filter, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``filter``: A :symbol:`bson:bson_t` containing the filter. * ``opts``: A :symbol:`bson:bson_t`, ``NULL`` to ignore. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/count-document-opts.txt Other options are included in the sent ``aggregate`` command. For a list of all options, see `the MongoDB Manual entry on the aggregate command `_. Description ----------- This functions executes a count query on ``collection``. In contrast with :symbol:`mongoc_collection_estimated_document_count()`, the count returned is guaranteed to be accurate. .. include:: includes/retryable-read.txt Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- -1 on failure, otherwise the number of documents counted. Example ------- .. code-block:: c #include #include #include static void print_count (mongoc_collection_t *collection, bson_t *filter) { bson_error_t error; int64_t count; bson_t* opts = BCON_NEW ("skip", BCON_INT64(5)); count = mongoc_collection_count_documents ( collection, filter, opts, NULL, NULL, &error); bson_destroy (opts); if (count < 0) { fprintf (stderr, "Count failed: %s\n", error.message); } else { printf ("%" PRId64 " documents counted.\n", count); } } .. _migrating-from-deprecated-count: Migrating from deprecated count functions ----------------------------------------- When migrating to :symbol:`mongoc_collection_count_documents` from the deprecated :symbol:`mongoc_collection_count` or :symbol:`mongoc_collection_count_with_opts`, the following query operators in the filter must be replaced: +-------------+-------------------------------------+ | Operator | Replacement | +=============+=====================================+ | $where | `$expr`_ | +-------------+-------------------------------------+ | $near | `$geoWithin`_ with `$center`_ | +-------------+-------------------------------------+ | $nearSphere | `$geoWithin`_ with `$centerSphere`_ | +-------------+-------------------------------------+ $expr requires MongoDB 3.6+ .. _$expr: https://www.mongodb.com/docs/manual/reference/operator/query/expr/ .. _$geoWithin: https://www.mongodb.com/docs/manual/reference/operator/query/geoWithin/ .. _$center: https://www.mongodb.com/docs/manual/reference/operator/query/center/#op._S_center .. _$centerSphere: https://www.mongodb.com/docs/manual/reference/operator/query/centerSphere/#op._S_centerSphere .. seealso:: | :symbol:`mongoc_collection_estimated_document_count()` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_count_with_opts.rst000066400000000000000000000114041456567454500275210ustar00rootroot00000000000000:man_page: mongoc_collection_count_with_opts mongoc_collection_count_with_opts() =================================== .. warning:: .. deprecated:: 1.11.0 This function is deprecated and should not be used in new code. Use :symbol:`mongoc_collection_count_documents` or :symbol:`mongoc_collection_estimated_document_count` instead. :symbol:`mongoc_collection_count_documents` has similar performance to calling :symbol:`mongoc_collection_count` with a non-NULL ``query``, and is guaranteed to retrieve an accurate collection count. See :ref:`migrating from deprecated count functions ` for details. :symbol:`mongoc_collection_estimated_document_count` has the same performance as calling :symbol:`mongoc_collection_count` with a NULL ``query``, but is not guaranteed to retrieve an accurate collection count. Synopsis -------- .. code-block:: c int64_t mongoc_collection_count_with_opts (mongoc_collection_t *collection, mongoc_query_flags_t flags, const bson_t *query, int64_t skip, int64_t limit, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_error_t *error) BSON_GNUC_DEPRECATED_FOR (mongoc_collection_count_documents or mongoc_collection_estimated_document_count); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A :symbol:`mongoc_query_flags_t`. * ``query``: A :symbol:`bson:bson_t` containing the query. * ``skip``: A int64_t, zero to ignore. * ``limit``: A int64_t, zero to ignore. * ``opts``: A :symbol:`bson:bson_t`, ``NULL`` to ignore. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`, otherwise uses the collection's read preference. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/read-opts.txt Description ----------- This function shall execute a count query on the underlying 'collection'. The bson 'query' is not validated, simply passed along as appropriate to the server. As such, compatibility and errors should be validated in the appropriate server documentation. The :symbol:`mongoc_read_concern_t` specified on the :symbol:`mongoc_collection_t` will be used, if any. If ``read_prefs`` is NULL, the collection's read preferences are used. In addition to the standard functionality available from mongoc_collection_count, this function allows the user to add arbitrary extra keys to the count. This pass through enables features such as hinting for counts. For more information, see the `query reference `_ at the MongoDB website. .. include:: includes/retryable-read.txt Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- -1 on failure, otherwise the number of documents counted. Examples -------- .. code-block:: c :caption: Basic Counting #include #include #include static void print_query_count (mongoc_collection_t *collection, bson_t *query) { bson_error_t error; int64_t count; bson_t opts; bson_init (&opts); BSON_APPEND_UTF8 (&opts, "hint", "_id_"); count = mongoc_collection_count_with_opts ( collection, MONGOC_QUERY_NONE, query, 0, 0, &opts, NULL, &error); bson_destroy (&opts); if (count < 0) { fprintf (stderr, "Count failed: %s\n", error.message); } else { printf ("%" PRId64 " documents counted.\n", count); } } .. code-block:: c :caption: Counting with Collation #include #include #include static void print_query_count (mongoc_collection_t *collection, bson_t *query) { bson_t *selector; bson_t *opts; bson_error_t error; int64_t count; selector = BCON_NEW ("_id", "{", "$gt", BCON_UTF8 ("one"), "}"); /* "One" normally sorts before "one"; make "one" come first */ opts = BCON_NEW ("collation", "{", "locale", BCON_UTF8 ("en_US"), "caseFirst", BCON_UTF8 ("lower"), "}"); count = mongoc_collection_count_with_opts ( collection, MONGOC_QUERY_NONE, query, 0, 0, opts, NULL, &error); bson_destroy (selector); bson_destroy (opts); if (count < 0) { fprintf (stderr, "Count failed: %s\n", error.message); } else { printf ("%" PRId64 " documents counted.\n", count); } } mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_create_bulk_operation.rst000066400000000000000000000040321456567454500306300ustar00rootroot00000000000000:man_page: mongoc_collection_create_bulk_operation mongoc_collection_create_bulk_operation() ========================================= .. warning:: .. deprecated:: 1.9.0 This function is deprecated and should not be used in new code. Please use :symbol:`mongoc_collection_create_bulk_operation_with_opts()` in new code. Synopsis -------- .. code-block:: c mongoc_bulk_operation_t * mongoc_collection_create_bulk_operation ( mongoc_collection_t *collection, bool ordered, const mongoc_write_concern_t *write_concern) BSON_GNUC_WARN_UNUSED_RESULT BSON_GNUC_DEPRECATED_FOR (mongoc_collection_create_bulk_operation_with_opts); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``ordered``: If the operations must be performed in order. * ``write_concern``: An optional :symbol:`mongoc_write_concern_t` or ``NULL``. Description ----------- This function shall begin a new bulk operation. After creating this you may call various functions such as :symbol:`mongoc_bulk_operation_update()`, :symbol:`mongoc_bulk_operation_insert()` and others. After calling :symbol:`mongoc_bulk_operation_execute()` the commands will be executed in as large as batches as reasonable by the client. If ``ordered`` is true, then processing will stop at the first error. If ``ordered`` is not true, then the bulk operation will attempt to continue processing even after the first failure. ``write_concern`` contains the write concern for all operations in the bulk operation. If ``NULL``, the collection's write concern is used. The global default is acknowledged writes: MONGOC_WRITE_CONCERN_W_DEFAULT. Errors ------ Errors are propagated when executing the bulk operation. Returns ------- A newly allocated :symbol:`mongoc_bulk_operation_t` that should be freed with :symbol:`mongoc_bulk_operation_destroy()` when no longer in use. .. warning:: Failure to handle the result of this function is a programming error. .. seealso:: | :symbol:`Bulk Write Operations ` :symbol:`mongoc_bulk_operation_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_create_bulk_operation_with_opts.rst000066400000000000000000000024511456567454500327330ustar00rootroot00000000000000:man_page: mongoc_collection_create_bulk_operation_with_opts mongoc_collection_create_bulk_operation_with_opts() =================================================== Synopsis -------- .. code-block:: c mongoc_bulk_operation_t * mongoc_collection_create_bulk_operation_with_opts ( mongoc_collection_t *collection, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. .. |opts-source| replace:: ``collection`` .. include:: includes/bulk-opts.txt Description ----------- This function shall begin a new bulk operation. After creating this you may call various functions such as :symbol:`mongoc_bulk_operation_update()`, :symbol:`mongoc_bulk_operation_insert()` and others. After calling :symbol:`mongoc_bulk_operation_execute()` the commands will be executed in as large as batches as reasonable by the client. Errors ------ Errors are propagated when executing the bulk operation. Returns ------- A newly allocated :symbol:`mongoc_bulk_operation_t` that should be freed with :symbol:`mongoc_bulk_operation_destroy()` when no longer in use. .. warning:: Failure to handle the result of this function is a programming error. .. seealso:: | :symbol:`Bulk Write Operations ` | :symbol:`mongoc_bulk_operation_t` mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_create_index.rst000066400000000000000000000014341456567454500267250ustar00rootroot00000000000000:man_page: mongoc_collection_create_index mongoc_collection_create_index() ================================ .. warning:: .. deprecated:: 1.8.0 This function is deprecated and should not be used in new code. See :doc:`manage-collection-indexes`. Synopsis -------- .. code-block:: c bool mongoc_collection_create_index (mongoc_collection_t *collection, const bson_t *keys, const mongoc_index_opt_t *opt, bson_error_t *error) BSON_GNUC_DEPRECATED; Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``keys``: A :symbol:`bson:bson_t`. * ``opt``: A mongoc_index_opt_t. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_create_index_with_opts.rst000066400000000000000000000036231456567454500310270ustar00rootroot00000000000000:man_page: mongoc_collection_create_index_with_opts mongoc_collection_create_index_with_opts() ========================================== .. warning:: .. deprecated:: 1.8.0 This function is deprecated and should not be used in new code. See :doc:`manage-collection-indexes`. Synopsis -------- .. code-block:: c bool mongoc_collection_create_index_with_opts (mongoc_collection_t *collection, const bson_t *keys, const mongoc_index_opt_t *index_opts, const bson_t *command_opts, bson_t *reply, bson_error_t *error) BSON_GNUC_DEPRECATED; Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``keys``: A :symbol:`bson:bson_t`. * ``index_opts``: A mongoc_index_opt_t. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/create-index-opts.txt Description ----------- This function will request the creation of a new index. This function will use the ``createIndexes`` command. The server's reply is stored in ``reply``. If no write concern is provided in ``command_opts``, the collection's write concern is used. See :symbol:`mongoc_index_opt_t` for options on creating indexes. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. ``reply`` is always initialized and must be destroyed with :symbol:`bson:bson_destroy()`. If the server is running an obsolete version of MongoDB then ``reply`` may be empty, though it will still be initialized. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_create_indexes_with_opts.rst000066400000000000000000000046761456567454500313700ustar00rootroot00000000000000:man_page: mongoc_collection_create_indexes_with_opts mongoc_collection_create_indexes_with_opts() ============================================ Synopsis -------- .. code-block:: c typedef struct _mongoc_index_model_t mongoc_index_model_t; mongoc_index_model_t * mongoc_index_model_new (const bson_t *keys, const bson_t *opts); void mongoc_index_model_destroy (mongoc_index_model_t *model); bool mongoc_collection_create_indexes_with_opts (mongoc_collection_t *collection, mongoc_index_model_t **models, size_t n_models, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``models``: An array of ``mongoc_index_model_t *``. * ``n_models``: The number of ``models``. * ``opts``: Optional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/write-opts.txt Additional options passed in ``opts`` are appended to the ``createIndexes`` command. See the `MongoDB Manual for createIndexes `_ for all supported options. If no write concern is provided in ``opts``, the collection's write concern is used. mongoc_index_model_t ```````````````````` Each ``mongoc_index_model_t`` represents an index to create. ``mongoc_index_model_new`` includes: * ``keys`` Expected to match the form of the ``key`` field in the `createIndexes `_ command. * ``opts`` Optional index options appended as a sibling to the ``key`` field in the `createIndexes `_ command. Description ----------- This function wraps around the `createIndexes `_ command. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. .. seealso:: | :doc:`manage-collection-indexes`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_delete.rst000066400000000000000000000034551456567454500255420ustar00rootroot00000000000000:man_page: mongoc_collection_delete mongoc_collection_delete() ========================== .. warning:: .. deprecated:: 1.9.0 This function is deprecated and should not be used in new code. Please use :symbol:`mongoc_collection_delete_one()` or :symbol:`mongoc_collection_delete_many()` in new code. Synopsis -------- .. code-block:: c bool mongoc_collection_delete (mongoc_collection_t *collection, mongoc_delete_flags_t flags, const bson_t *selector, const mongoc_write_concern_t *write_concern, bson_error_t *error) BSON_GNUC_DEPRECATED_FOR (mongoc_collection_delete_one or mongoc_collection_delete_many); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A :symbol:`mongoc_delete_flags_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match documents. * ``write_concern``: A :symbol:`mongoc_write_concern_t` or ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- This function shall delete documents in the given ``collection`` that match ``selector``. The bson ``selector`` is not validated, simply passed along as appropriate to the server. As such, compatibility and errors should be validated in the appropriate server documentation. If you want to limit deletes to a single document, provide ``MONGOC_DELETE_SINGLE_REMOVE`` in ``flags``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_delete_many.rst000066400000000000000000000027521456567454500265650ustar00rootroot00000000000000:man_page: mongoc_collection_delete_many mongoc_collection_delete_many() =============================== Synopsis -------- .. code-block:: c bool mongoc_collection_delete_many (mongoc_collection_t *collection, const bson_t *selector, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match documents. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/delete-many-opts.txt Description ----------- This function removes all documents in the given ``collection`` that match ``selector``. To delete at most one matching document, use :symbol:`mongoc_collection_delete_one`. If you pass a non-NULL ``reply``, it is filled out with the field "deletedCount". If there is a server error then ``reply`` contains either a "writeErrors" array with one subdocument or a "writeConcernErrors" array. The reply must be freed with :symbol:`bson:bson_destroy`. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_delete_one.rst000066400000000000000000000027441456567454500264030ustar00rootroot00000000000000:man_page: mongoc_collection_delete_one mongoc_collection_delete_one() ============================== Synopsis -------- .. code-block:: c bool mongoc_collection_delete_one (mongoc_collection_t *collection, const bson_t *selector, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match documents. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/delete-one-opts.txt Description ----------- This function removes at most one document in the given ``collection`` that matches ``selector``. To delete all matching documents, use :symbol:`mongoc_collection_delete_many`. If you pass a non-NULL ``reply``, it is filled out with the field "deletedCount". If there is a server error then ``reply`` contains either a "writeErrors" array with one subdocument or a "writeConcernErrors" array. The reply must be freed with :symbol:`bson:bson_destroy`. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_destroy.rst000066400000000000000000000010531456567454500257610ustar00rootroot00000000000000:man_page: mongoc_collection_destroy mongoc_collection_destroy() =========================== Synopsis -------- .. code-block:: c void mongoc_collection_destroy (mongoc_collection_t *collection); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. Description ----------- This function shall destroy a :symbol:`mongoc_collection_t` and its associated resources. Does nothing if ``collection`` is NULL. .. warning:: Always destroy a :symbol:`mongoc_cursor_t` created from a collection before destroying the collection. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_drop.rst000066400000000000000000000010671456567454500252410ustar00rootroot00000000000000:man_page: mongoc_collection_drop mongoc_collection_drop() ======================== Synopsis -------- .. code-block:: c bool mongoc_collection_drop (mongoc_collection_t *collection, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- For more information, see :symbol:`mongoc_collection_drop_with_opts()`. This function is a thin wrapper, passing ``NULL`` in as :symbol:`opts ` parameter. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_drop_index.rst000066400000000000000000000014151456567454500264250ustar00rootroot00000000000000:man_page: mongoc_collection_drop_index mongoc_collection_drop_index() ============================== Synopsis -------- .. code-block:: c bool mongoc_collection_drop_index (mongoc_collection_t *collection, const char *index_name, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``index_name``: A string containing the name of the index. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- For more information, see :symbol:`mongoc_collection_drop_with_opts() `. This function is a thin wrapper, passing ``NULL`` in as :symbol:`opts ` parameter. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_drop_index_with_opts.rst000066400000000000000000000022531456567454500305260ustar00rootroot00000000000000:man_page: mongoc_collection_drop_index_with_opts mongoc_collection_drop_index_with_opts() ======================================== Synopsis -------- .. code-block:: c bool mongoc_collection_drop_index_with_opts (mongoc_collection_t *collection, const char *index_name, const bson_t *opts, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``index_name``: A string containing the name of the index. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/write-opts.txt Description ----------- This function requests than an index on ``collection`` be dropped. If no write concern is provided in ``opts``, the collection's write concern is used. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. .. seealso:: | :doc:`manage-collection-indexes`. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_drop_with_opts.rst000066400000000000000000000045111456567454500273360ustar00rootroot00000000000000:man_page: mongoc_collection_drop_with_opts mongoc_collection_drop_with_opts() ================================== Synopsis -------- .. code-block:: c bool mongoc_collection_drop_with_opts (mongoc_collection_t *collection, bson_t *opts, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/write-opts.txt Description ----------- This function requests that a ``collection`` be dropped, including all indexes associated with the ``collection``. If no write concern is provided in ``opts``, the collection's write concern is used. If the collection does not exist, the server responds with an "ns not found" error. It is safe to ignore this error; set the :ref:`Error API Version ` to 2 and ignore server error code 26: .. code-block:: c mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bool r; client = mongoc_client_new (NULL); mongoc_client_set_error_api (client, 2); collection = mongoc_client_get_collection (client, "db", "collection"); r = mongoc_collection_drop_with_opts (collection, NULL /* opts */, &error); if (r) { printf ("Dropped.\n"); } else { printf ("Error message: %s\n", error.message); if (error.domain == MONGOC_ERROR_SERVER && error.code == 26) { printf ("Ignoring 'ns not found' error\n"); } else { fprintf (stderr, "Unrecognized error!\n"); } } mongoc_collection_destroy (collection); mongoc_client_destroy (client); In MongoDB 3.0 and older, the "ns not found" error code is the generic MONGOC_ERROR_QUERY_FAILURE; in this case check whether the error message is equal to the string "ns not found". The ``encryptedFields`` document in ``opts`` may be used to drop a collection for :doc:`Queryable Encryption `. If ``encryptedFields`` is specified, the "ns not found" error is not returned. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns true if the collection was successfully dropped. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_ensure_index.rst000066400000000000000000000015451456567454500267660ustar00rootroot00000000000000:man_page: mongoc_collection_ensure_index mongoc_collection_ensure_index() ================================ .. warning:: .. deprecated:: 1.8.0 This function is deprecated and should not be used in new code. See :doc:`manage-collection-indexes`. Synopsis -------- .. code-block:: c bool mongoc_collection_ensure_index (mongoc_collection_t *collection, const bson_t *keys, const mongoc_index_opt_t *opt, bson_error_t *error) BSON_GNUC_DEPRECATED; Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``keys``: A :symbol:`bson:bson_t`. * ``opt``: A mongoc_index_opt_t. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_estimated_document_count.rst000066400000000000000000000061141456567454500313600ustar00rootroot00000000000000:man_page: mongoc_collection_estimated_document_count mongoc_collection_estimated_document_count() ============================================ Synopsis -------- .. code-block:: c int64_t mongoc_collection_estimated_document_count (mongoc_collection_t *collection, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``opts``: A :symbol:`bson:bson_t`, ``NULL`` to ignore. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/read-opts.txt * ``skip``: An int specifying how many documents matching the ``query`` should be skipped before counting. * ``limit``: An int specifying the maximum number of documents to count. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. For a list of all options, see `the MongoDB Manual entry on the count command `_. Description ----------- This functions executes a count query on ``collection``. In contrast with :symbol:`mongoc_collection_count_documents()`, the count returned is *not* guaranteed to be accurate. .. include:: includes/retryable-read.txt Behavior ^^^^^^^^ This method is implemented using the `count `_ command. Due to an oversight in versions 5.0.0-5.0.8 of MongoDB, the ``count`` command was not included in version "1" of the Stable API. Applications using this method with the Stable API are recommended to upgrade their server version to 5.0.9+ or disable strict mode (via `:symbol:`mongoc_server_api_strict()`) to avoid encountering errors. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- -1 on failure, otherwise the number of documents counted. Example ------- .. code-block:: c #include #include #include static void print_count (mongoc_collection_t *collection, bson_t *query) { bson_error_t error; int64_t count; bson_t* opts = BCON_NEW ("skip", BCON_INT64(5)); count = mongoc_collection_estimated_document_count ( collection, opts, NULL, NULL, &error); bson_destroy (opts); if (count < 0) { fprintf (stderr, "Count failed: %s\n", error.message); } else { printf ("%" PRId64 " documents counted.\n", count); } } .. seealso:: | :symbol:`mongoc_collection_count_documents()` | `Count: Behavior `_ in the MongoDB Manual mongo-c-driver-1.26.0/src/libmongoc/doc/mongoc_collection_find.rst000066400000000000000000000132021456567454500252070ustar00rootroot00000000000000:man_page: mongoc_collection_find mongoc_collection_find() ======================== .. warning:: .. deprecated:: 1.5.0 This function is deprecated and should not be used in new code. Use the more convenient :symbol:`mongoc_collection_find_with_opts` instead. Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_collection_find (mongoc_collection_t *collection, mongoc_query_flags_t flags, uint32_t skip, uint32_t limit, uint32_t batch_size, const bson_t *query, const bson_t *fields, const mongoc_read_prefs_t *read_prefs) BSON_GNUC_DEPRECATED_FOR (mongoc_collection_find_with_opts) BSON_GNUC_WARN_UNUSED_RESULT; Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A :symbol:`mongoc_query_flags_t`. * ``skip``: A uint32_t of number of documents to skip or 0. * ``limit``: A uint32_t of max number of documents to return or 0. * ``batch_size``: A uint32_t containing batch size of document result sets or 0 for default. Default is 100. * ``query``: A :symbol:`bson:bson_t` containing the query and options to execute. * ``fields``: A :symbol:`bson:bson_t` containing fields to return or ``NULL``. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL`` for default read preferences. Description ----------- This function shall execute a query on the underlying ``collection``. If no options are necessary, ``query`` can simply contain a query such as ``{a:1}``. If you would like to specify options such as a sort order, the query must be placed inside of ``{"$query": {}}``. See the example below for how to properly specify additional options to ``query``. .. include:: includes/retryable-read.txt Returns ------- .. include:: includes/returns-cursor.txt Example ------- .. code-block:: c :caption: Print All Documents in a Collection #include #include #include static void print_all_documents (mongoc_collection_t *collection) { mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; char *str; bson_t *query; query = BCON_NEW ("$query", "{", "foo", BCON_INT32 (1), "}", "$orderby", "{", "bar", BCON_INT32 (-1), "}"); cursor = mongoc_collection_find ( collection, MONGOC_QUERY_NONE, 0, 0, 0, query, NULL, NULL); while (mongoc_cursor_next (cursor, &doc)) { str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } if (mongoc_cursor_error (cursor, &error)) { fprintf (stderr, "An error occurred: %s\n", error.message); } mongoc_cursor_destroy (cursor); bson_destroy (query); } The "find" command ------------------ Queries have historically been sent as OP_QUERY wire protocol messages, but beginning in MongoDB 3.2 queries use `the "find" command `_ instead. The driver automatically converts queries to the new "find" command syntax if needed, so this change is typically invisible to C Driver users. However, an application written exclusively for MongoDB 3.2 and later can choose to use the new syntax directly instead of relying on the driver to convert from the old syntax: .. code-block:: c /* MongoDB 3.2+ "find" command syntax */ query = BCON_NEW ("filter", "{", "foo", BCON_INT32 (1), "}", "sort", "{", "bar", BCON_INT32 (-1), "}"); cursor = mongoc_collection_find ( collection, MONGOC_QUERY_NONE, 0, 0, 0, query, NULL, NULL); The "find" command takes different options from the traditional OP_QUERY message. ==================== ================== ================= Query ``$query`` ``filter`` Sort ``$orderby`` ``sort`` Show record location ``$showDiskLoc`` ``showRecordId`` Other $-options ``$

    [ ...] # • Enter directory and execute the given command. The working # directory of the caller is not changed. # * have-command # • Return zero if names a command that can be executed by the shell # * is-file # * is-dir # * exists # • Return zero if names a file, directory, or either, respectively. set -o errexit set -o pipefail set -o nounset is-set() { [[ -n ${!1+x} ]] } log() { echo "${@}" 1>&2 return 0 } debug() { if [[ "${PRINT_DEBUG_LOGS:-0}" != "0" ]]; then log "${@}" fi } fail() { log "${@}" return 1 } run-chdir() { [[ "$#" -gt 1 ]] || fail "run-chdir expects at least two arguments" local _dir="$1" shift pushd "$_dir" > /dev/null debug "Run in directory [$_dir]:" "$@" "$@" local _rc=$? popd > /dev/null return $_rc } is-file() { [[ -f "$1" ]];} is-dir() { [[ -d "$1" ]];} exists() { [[ -e "$1" ]];} have-command() { [[ "$#" -eq 1 ]] || fail "have-command expects a single argument" type "$1" > /dev/null 2>&1 } # Inhibit msys path conversion export MSYS2_ARG_CONV_EXCL="*" mongo-c-driver-1.26.0/tools/download.sh000077500000000000000000000045241456567454500177700ustar00rootroot00000000000000#!/usr/bin/env bash ## Commands defined by this file: # # * download-file --uri= --out= [--no-tls-verify] # • Download the HTTP resource specified by and save the respond body # to . Follows redirects. # # If `--no-tls-verify` is provided, TLS certificate validation will be # disabled. . "$(dirname "${BASH_SOURCE[0]}")/use.sh" base download-file() { declare uri declare out unset no_tls_verify while [[ "$#" != 0 ]]; do case "$1" in --uri) shift uri=$1 ;; --uri=*) uri="${1#--uri=*}" ;; --out) shift out=$1 ;; --out=*) out=${1#--out=*} ;; --no-tls-verify) # shellcheck disable=2034 no_tls_verify=1 ;; *) fail "Unknown argument: $1" esac shift done if ! is-set uri || ! is-set out; then fail "download-file requires --uri= and --out= arguments" return fi debug "Download [$uri] to [$out]" if have-command curl; then curl_argv=( --silent --show-error --fail --retry 5 --max-time 120 --location # (Follow redirects) --output "$out" ) if is-set no_tls_verify; then curl_argv+=(--insecure) fi curl_argv+=(-- "$uri") debug "Execute curl command: [curl ${curl_argv[*]}]" output=$(curl "${curl_argv[@]}") || fail "$output" || return debug "$output" elif have-command wget; then wget_argv=( --output-document="$out" --tries=5 --timeout=120 ) if is-set no_tls_verify; then wget_argv+=(--no-check-certificate) fi wget_argv+=(-- "$uri") debug "Execute wget command: [wget ${wget_argv[*]}]" output=$(wget "${wget_argv[@]}" 2>&1) || fail "wget failed: $output" || return debug "$output" else fail "This script requires either curl or wget to be available" || return fi debug "Download [$uri] to [$out] - Done" } if is-main; then download-file "$@" fi mongo-c-driver-1.26.0/tools/earthly.sh000077500000000000000000000020201456567454500176160ustar00rootroot00000000000000#!/usr/bin/env bash . "$(dirname "${BASH_SOURCE[0]}")/use.sh" paths platform set -euo pipefail : "${EARTHLY_VERSION:=0.7.17}" # Calc the arch of the executable we want case "$ARCHNAME" in x64) arch=amd64 ;; arm64) arch=arm64 ;; *) echo "Unsupported architecture for automatic Earthly download: $HOSTTYPE" 1>&1 exit 99 ;; esac # The location where the Earthly executable will live cache_dir="$USER_CACHES_DIR/earthly-sh/$EARTHLY_VERSION" mkdir -p "$cache_dir" exe_filename="earthly-$OS_FAMILY-$arch$EXE_SUFFIX" EARTHLY_EXE="$cache_dir/$exe_filename" # Download if it isn't already present if ! is-file "$EARTHLY_EXE"; then echo "Downloading $exe_filename $EARTHLY_VERSION" url="https://github.com/earthly/earthly/releases/download/v$EARTHLY_VERSION/$exe_filename" curl --retry 5 -LsS --max-time 120 --fail "$url" --output "$EARTHLY_EXE" chmod a+x "$EARTHLY_EXE" fi run-earthly() { "$EARTHLY_EXE" "$@" } if is-main; then run-earthly "$@" fi mongo-c-driver-1.26.0/tools/init.ps1000066400000000000000000000031511456567454500172050ustar00rootroot00000000000000$ErrorActionPreference = "Stop" $is_windows = $PSVersionTable.Platform -eq "Win32NT" -or $PSVersionTable.PSEdition -eq "Desktop" if (-not $is_windows) { throw "This script is meant for Windows only." } $USER_CACHES_DIR = $env:USER_CACHES_DIR if ([String]::IsNullOrEmpty($USER_CACHES_DIR)) { $USER_CACHES_DIR = $env:LOCALAPPDATA } $BUILD_CACHE_BUST = $env:BUILD_CACHE_BUST if ([String]::IsNullOrEmpty($BUILD_CACHE_BUST)) { $BUILD_CACHE_BUST = "1" } $BUILD_CACHE_DIR = Join-Path $USER_CACHES_DIR "mongoc.$BUILD_CACHE_BUST" Write-Debug "Calculated mongoc build cache directory to be [$BUILD_CACHE_DIR]" function Test-Command { param ( [string[]]$Name, [System.Management.Automation.CommandTypes]$CommandType = 'All' ) $found = @(Get-Command -Name:$Name -CommandType:$CommandType -ErrorAction Ignore -TotalCount 1) if ($found.Length -ne 0) { return $true } return $false } function Find-Python { if (Test-Command "py" -CommandType Application -and (& py -c "(x:=0)")) { $found = "py" } else { foreach ($n in 20..8) { $cand = "python3.$n" Write-Debug "Try Python: [$cand]" if (!(Test-Command $cand -CommandType Application)) { continue; } if (& "$cand" -c "(x:=0)") { $found = "$cand" break } } } $found = (Get-Command "$found" -CommandType Application).Source $ver = (& $found -c "import sys; print(sys.version)" | Out-String).Trim() Write-Debug "Found Python: [$found] (Version $ver)" return $found } mongo-c-driver-1.26.0/tools/paths.sh000077500000000000000000000121411456567454500172720ustar00rootroot00000000000000#!/usr/bin/env bash ## Commands defined by this file: # # * to_absolute # • Convert a given path into an absolute path. Relative paths are # resolved relative to the working directory. Removes redundant directory # separators. # * native_path # • On MinGW/Cygwin/MSYS, convert the given Cygwin path to a Windows-native # path. On other platforms, the argument is unmodified # ## Variables set by this file: # # * TOOLS_DIR # • The path to the directory containing this script file # * MONGOC_DIR # • The path to the top-level project directory # * USER_CACHES_DIR (overridable) # • A user-local directory in which to store cached data # * BUILD_CACHE_DIR (overridable) # • A user-local directory for caches related to these scripts # * EXE_SUFFIX # • Expands to “.exe” on Windows, otherwise an empty string . "$(dirname "${BASH_SOURCE[0]}")/use.sh" platform base # Check for Cygpath, used by various commands. Better to check once than check every time. _HAVE_CYGPATH=false if have-command cygpath; then _HAVE_CYGPATH=true fi # Usage: native-path native-path() { [[ "$#" -eq 1 ]] || fail "native_path expects exactly one argument" local arg=$1 if $IS_WINDOWS; then $_HAVE_CYGPATH || fail "No 'cygpath' command is available, but we require it to normalize file paths on Windows." local ret ret="$(cygpath -w "$arg")" debug "Convert path [$arg] → [$ret]" printf %s "$ret" else printf %s "$arg" fi } # Usage: to_absolute to_absolute() { [[ "$#" -eq 1 ]] || fail "to_absolute expects a single argument" local ret local arg="$1" debug "Resolve path [$arg]" # Cygpath can resolve the path in a single subprocess: if $_HAVE_CYGPATH; then # Ask Cygpath to resolve the path. It knows how to do it reliably and quickly: ret=$(cygpath --absolute --mixed --long-name -- "$arg") debug "Cygpath resolved: [$arg]" printf %s "$ret" return 0 fi # If the given directory exists, we can ask the shell to resolve the path # by going there and asking the PWD: if is-dir "$arg"; then ret=$(run-chdir "$arg" pwd) debug "Resolved: [$arg]" printf %s "$ret" return 0 fi # Do it the "slow" way: # The parent path: local _parent _parent="$(dirname "$arg")" # The filename part: local _fname _fname="$(basename "$arg")" # There are four cases to consider from dirname: if [[ $_parent = "." ]]; then # The parent is '.' as in './foo' # Replace the leading '.' with the working directory _parent="$(pwd)" elif [[ $_parent = ".." ]]; then # The parent is '..' as in '../foo' # Replace a leading '..' with the parent of the working directory _parent="$(dirname "$(pwd)")" elif [[ $arg == "$_parent" ]]; then # The parent is itself, as in '/' # A root directory is its own parent according to 'dirname' printf %s "$arg" return 0 else # The parent is some other path, like 'foo' in 'foo/bar' # Resolve the parent path _parent="$(set +x; DEBUG=0 to_absolute "$_parent")" fi # At this point $_parent is an absolute path if [[ $_fname = ".." ]]; then # Strip one component ret="$(dirname "$_parent")" elif [[ $_fname = "." ]]; then # Drop a '.' at the end of a path ret="$_parent" else # Join the result ret="$_parent/$_fname" fi # Remove duplicate dir separators while [[ $ret =~ "//" ]]; do ret="${ret//\/\///}" done debug "Resolved path: [$arg] → [$ret]" printf %s "$ret" } # Get the TOOLS_DIR as a native absolute path. All other path vars are derived # from this one, and will therefore remain as native pathsS _this_file=$(to_absolute "${BASH_SOURCE[0]}") _this_dir=$(dirname "$_this_file") TOOLS_DIR=$(native-path "$_this_dir") declare -r TOOLS_DIR=$TOOLS_DIR MONGOC_DIR=$(dirname "$TOOLS_DIR") declare -r MONGOC_DIR=$MONGOC_DIR EXE_SUFFIX="" if $IS_WINDOWS; then EXE_SUFFIX=".exe" fi declare -r EXE_SUFFIX=$EXE_SUFFIX if [[ "${USER_CACHES_DIR:=${XDG_CACHE_HOME:-}}" = "" ]]; then if $IS_DARWIN; then USER_CACHES_DIR=$HOME/Library/Caches elif $IS_UNIX_LIKE; then USER_CACHES_DIR=$HOME/.cache elif $IS_WINDOWS; then USER_CACHES_DIR=${LOCALAPPDATA:-$USERPROFILE/.cache} else log "Using ~/.cache as fallback user caching directory" USER_CACHES_DIR="$(to_absolute ~/.cache)" fi fi # Ensure we are dealing with a complete path USER_CACHES_DIR="$(to_absolute "$USER_CACHES_DIR")" declare -r USER_CACHES_DIR=$USER_CACHES_DIR : "${BUILD_CACHE_BUST:=1}" : "${BUILD_CACHE_DIR:="$USER_CACHES_DIR/mongoc/build.$BUILD_CACHE_BUST"}" if is-main; then # Just print the paths that we detected log "Paths:" log " • USER_CACHES_DIR=[$USER_CACHES_DIR]" log " • BUILD_CACHE_DIR=[$BUILD_CACHE_DIR]" log " • BUILD_CACHE_BUST=[$BUILD_CACHE_BUST]" log " • EXE_SUFFIX=[$EXE_SUFFIX]" log " • TOOLS_DIR=[$TOOLS_DIR]" log " • MONGOC_DIR=[$MONGOC_DIR]" fi mongo-c-driver-1.26.0/tools/platform.sh000077500000000000000000000112541456567454500200030ustar00rootroot00000000000000#!/usr/bin/env bash ## Variables set by this file: # # * IS_DARWIN, IS_WINDOWS, IS_LINUX, IS_BSD, IS_WSL, IS_UNIX_LIKE # • Set to either "true" or "false" depending on the host operating system. # More than one value may be true (i.e. $IS_WSL and $IS_UNIX_LIKE). Because # "true" and "false" are Bash built-ins, these can be used in conditionals # directly, as in "if $IS_WINDOWS || $IS_DARWIN; then …" # * OS_FAMILY # • One of "windows", "linux", "darwin", or "bsd", depending on the host # operating system. . "$(dirname "${BASH_SOURCE[0]}")/use.sh" base _is_darwin=false _is_windows=false _is_linux=false _is_unix_like=false _is_wsl=false _is_bsd=false _os_family=unknown case "$OSTYPE" in linux-*) if have-command cmd.exe; then _is_wsl=true _is_unix_like=true _os_family=windows else _is_linux=true _is_unix_like=true _os_family=linux fi ;; darwin*) _is_darwin=true _is_unix_like=true _os_family=darwin ;; FreeBSD|openbsd*|netbsd) _is_bsd=true _is_unix_like=true _os_family=bsd ;; msys*|cygwin*) _is_windows=true _os_family=windows ;; esac declare -r IS_DARWIN=$_is_darwin declare -r IS_WINDOWS=$_is_windows declare -r IS_LINUX=$_is_linux declare -r IS_UNIX_LIKE=$_is_unix_like declare -r IS_WSL=$_is_wsl declare -r IS_BSD=$_is_bsd declare -r OS_FAMILY=$_os_family _is_redhat_based=false _is_debian_based=false if $IS_LINUX; then if is-file /etc/redhat-release; then _is_redhat_based=true _dist_version=$(sed 's|.*release \([^ ]\+\).*|\1|' < /etc/redhat-release) elif is-file /etc/debian_version; then _is_debian_based=true _dist_version=$(grep VERSION_ID /etc/os-release | sed 's|VERSION_ID="\(.*\)"|\1|') elif is-file /etc/alpine-release; then _is_alpine=true _dist_version=$(cat /etc/alpine-release) fi _dist_version=${_dist_version:-0} _major_version=${_dist_version/.*/} declare -r DIST_VERSION=$_dist_version declare -r DIST_MAJOR_VERSION=$_major_version if is-file /etc/redhat-release; then _dist_id=$(cut -d ' ' -f1 < /etc/redhat-release) declare -r DIST_ID=${_dist_id} elif is-file /etc/os-release; then _dist_id=$(grep '^ID=' /etc/os-release | sed 's|ID=||') declare -r DIST_ID=${_dist_id} fi elif $IS_DARWIN; then _version=$(sw_vers | grep ProductVersion | sed 's|ProductVersion: \(.*\)|\1|') _major_version=${_version/.*/} declare -r MACOS_VERSION=${_version} declare -r MACOS_MAJOR_VERSION=${_major_version} fi declare -r IS_REDHAT_BASED=${_is_redhat_based} declare -r IS_DEBIAN_BASED=${_is_debian_based} _is_x86=false _is_x64=false _is_arm=false _is_ppc=false _is_zseries=false _archname="" case "$HOSTTYPE" in x86_64) _is_x86=true _is_x64=true _archname=x64 ;; x86*) _is_x86=true _archname="x86" ;; aarch64|arm64) _is_arm=true _archname="arm64" ;; powerpc*) _is_ppc=true _archname="ppc" ;; s390x) _is_zseries=true _archname="s390x" ;; *) log "Unknown host architecture in HOSTTYPE '$HOSTTYPE'";; esac declare -r IS_X86=$_is_x86 declare -r IS_X64=$_is_x64 declare -r IS_ARM=$_is_arm declare -r IS_POWERPC=$_is_ppc declare -r IS_ZSERIES=$_is_zseries declare -r ARCHNAME=$_archname if is-set DIST_ID; then _os_shortname="${DIST_ID}${DIST_MAJOR_VERSION}" elif $IS_WINDOWS; then _os_shortname=win elif $IS_DARWIN; then _os_shortname=macos$MACOS_VERSION else _os_shortname=unknown fi declare OS_SHORTNAME=$_os_shortname if is-main; then log "Operating system detection:" log " • OS_SHORTNAME: $OS_SHORTNAME" log " • OS_FAMILY: $OS_FAMILY" log " • IS_WINDOWS: $IS_WINDOWS" log " • IS_DARWIN: $IS_DARWIN" log " • IS_LINUX: $IS_LINUX" log " • IS_BSD: $IS_BSD" log " • IS_WSL: $IS_WSL" log " • IS_UNIX_LIKE: $IS_UNIX_LIKE" log " • IS_REDHAT_BASED: $IS_REDHAT_BASED" log " • IS_DEBIAN_BASED: $IS_DEBIAN_BASED" log " • DIST_ID: ${DIST_ID:-⟨unset⟩}" log " • DIST_VERSION: ${DIST_VERSION:-⟨unset⟩}" log " • DIST_MAJOR_VERSION: ${DIST_MAJOR_VERSION:-⟨unset⟩}" log " • MACOS_VERSION: ${MACOS_VERSION:-⟨unset⟩}" log " • MACOS_MAJOR_VERSION: ${MACOS_MAJOR_VERSION:-⟨unset⟩}" log " • IS_X86: $IS_X86" log " • IS_X64: $IS_X64" log " • IS_ARM: $IS_ARM" log " • IS_POWERPC: $IS_POWERPC" log " • IS_ZSERIES: $IS_ZSERIES" log " • ARCHNAME: $ARCHNAME" fi mongo-c-driver-1.26.0/tools/poetry.ps1000066400000000000000000000064021456567454500175660ustar00rootroot00000000000000<# .SYNOPSIS Execute a pinned and cached installation of Poetry .DESCRIPTION This command will execute a Poetry command subprocess. It first looks for an installed version, installs it if it is absent, and then uses the installed Poetry to execute the requested command. For help from Poetry, Use the 'poetry.ps1 help' command as seen in example 1. .EXAMPLE > poetry.ps1 help Print help messages from Poetry itself .EXAMPLE > poetry.ps1 install --with=docs --with=env Installs the project dependencies in the active virtualenv. This operation is idempotent .EXAMPLE > poetry.ps1 shell Spawn a new interactive PowerShell session with the project's virtualenv active. With this, the project's dependencies will be available on $env:PATH. .EXAMPLE > poetry.ps1 run sphinx-build -bhtml docs/ out/docs/html Execute the sphinx-build executable that is installed within the Poetry-managed virtual environment. .LINK https://python-poetry.org The Poetry website. #> [CmdletBinding(PositionalBinding = $false)] param( # The version of Poetry that we want to install. By default, installs 1.4.2 [string] $PoetryVersion = "1.4.2", # Force the directory in which Poetry will be installed [string] $PoetryHome, # The Poetry subcommand to execute. (If any Poetry arguments conflict with # PowerShell argument parsing, enquote them to ensure they are passed as # positional string arguments.) [Parameter(Position = 2, ValueFromRemainingArguments)] [string[]] $Command ) # Halt on subcommand errors $ErrorActionPreference = 'Stop' # We assume Windows and pwsh 7+ $is_pwsh_win = $PSVersionTable.Platform -eq "Win32NT" -or $PSVersionTable.PSEdition -eq "Desktop" if (-not $is_pwsh_win) { throw "This script is meant for PowerShell 7+ on Windows. (Use 'pwsh' on Windows, and use poetry.sh for Unix-like systems.)" } # The directory that contains this file: $this_dir = $PSScriptRoot # Load util vars and functions: . "$this_dir/init.ps1" # The directory in which we are installing Poetry: if ([String]::IsNullOrEmpty($PoetryHome)) { $PoetryHome = "$BUILD_CACHE_DIR/poetry-$PoetryVersion" } $stamp_file = Join-Path $PoetryHome ".installed.done" # Poetry respects the POETRY_HOME environment variable. $env:POETRY_HOME = $PoetryHome $py = Find-Python # Create the Poetry installation if it is not already present if (!(Test-Path $stamp_file)) { Write-Debug "Installing Poetry $PoetryVersion into [$PoetryHome]" # Lock to prevent concurrent installations $mtx = New-Object System.Threading.Mutex($false, "Global\MongoCPoetryInstall") [void]$mtx.WaitOne() # (No need to double-check, since a second install is a no-op) try { # Do the actual install: & $py -u "$this_dir/install-poetry.py" --yes --version "$PoetryVersion" if ($LASTEXITCODE -ne 0) { throw "Poetry installation failed [$LASTEXITCODE]" } # Touch the stamp file to tell future runs that the install is okay: Set-Content $stamp_file "" } finally { [void]$mtx.ReleaseMutex() } } # Execute the Poetry command $poetry_exe = Join-Path $PoetryHome "bin/poetry.exe" & $poetry_exe env use --quiet $py & $poetry_exe @Command exit $LASTEXITCODE mongo-c-driver-1.26.0/tools/poetry.sh000077500000000000000000000075141456567454500175050ustar00rootroot00000000000000#!/usr/bin/env bash # Automatically installs and invokes a pinned version of Poetry (https://python-poetry.org/) # ## Commands defined by this file: # # * run-poetry [ ...] # • Execute the given Poetry command. This script can also be executed # directly to run the same Poetry command. # # On first run, will install a new Poetry instance in a user-local cache # directory. This script DOES NOT respect POETRY_HOME! Instead, use # FORCE_POETRY_HOME to force a directory in which to install Poetry. # # * ensure-poetry [ []] # • Ensures that Poetry of the given is installed into . # This is an idempotent operation. Defaults are from WANT_POETRY_VERSION # and POETRY_HOME (see below). # ## Variables set by this file: # # * POETRY_HOME # • The default user-local directory in which Poetry will be installed. # This can be overriden by setting FORCE_POETRY_HOME. # * POETRY_EXE # • The default full path to the Poetry that will be installed and run by # this script (not present until after ensure-poetry or run-poetry is # executed). # * WANT_POETRY_VERSION (overridable) (default 1.5.1) # • The version of Poetry that will be installed by run-poetry when executed. # * POETRY_PYTHON_VERSION (overridable) (default to result of find-python) # • The Python binary to use by the Poetry installer and virtual environment(s). # Load vars and utils: . "$(dirname "${BASH_SOURCE[0]}")/use.sh" python paths base with_lock download : "${WANT_POETRY_VERSION:=1.5.1}" : "${POETRY_PYTHON_BINARY:="$(find-python)"}" declare -r -x POETRY_HOME=${FORCE_POETRY_HOME:-"$BUILD_CACHE_DIR/poetry-$WANT_POETRY_VERSION"} declare -r POETRY_EXE=$POETRY_HOME/bin/poetry$EXE_SUFFIX # Usage: install-poetry install-poetry() { declare poetry_version=$1 declare poetry_home=$2 log "Installing Poetry $poetry_version into [$poetry_home]" mkdir -p "$poetry_home" # Download the automated installer: installer=$poetry_home/install-poetry.py download-file --uri=https://install.python-poetry.org --out="$installer" # Run the install: with-lock "$POETRY_HOME/.install.lock" \ env POETRY_HOME="$poetry_home" \ "$POETRY_PYTHON_BINARY" -u "$installer" --yes --version "$poetry_version" \ || ( cat -- poetry-installer*.log && fail "Poetry installation failed" ) printf %s "$poetry_version" > "$POETRY_HOME/installed.txt" } # Idempotent installation: # Usage: ensure-poetry ensure-poetry() { declare version=${1:-$WANT_POETRY_VERSION} declare home=${2:-$POETRY_HOME} if ! is-file "$home/installed.txt" || [[ "$(cat "$home/installed.txt")" != "$version" ]]; then install-poetry "$version" "$home" fi # Extra step must be taken to ensure Poetry's virtual environment uses the correct Python binary. # See: https://github.com/python-poetry/poetry/issues/522 with-lock "$POETRY_HOME/.install.lock" \ env POETRY_HOME="$POETRY_HOME" \ "$POETRY_EXE" env use --quiet -- "$POETRY_PYTHON_BINARY" \ || ( fail "Poetry failed to set Python binary to $POETRY_PYTHON_BINARY" ) } run-poetry() { ensure-poetry "$WANT_POETRY_VERSION" "$POETRY_HOME" env POETRY_HOME="$POETRY_HOME" "$POETRY_EXE" "$@" } # Poetry bug: Poetry uses the keyring, even for non-authenticating commands, # which can wreak havoc in cases where the keyring is unavailable # (i.e. SSH and non-interactive sessions) # (https://github.com/python-poetry/poetry/issues/1917) export PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring" if is-main; then if [[ "$*" = "--ensure-installed" ]]; then # Just install, don't run it ensure-poetry "$WANT_POETRY_VERSION" "$POETRY_HOME" else # Run the Poetry command: run-poetry "$@" fi fi mongo-c-driver-1.26.0/tools/python.sh000077500000000000000000000023751456567454500175040ustar00rootroot00000000000000#!/usr/bin/env bash ## Commands defined by this file: # # * run-python [...] # • Execute the Python interpreter with the given arguments # * find-python # • Searches for a Python executable that supports Python 3.8 or newer # # Run this file directly to invoke the same Python executable. # Invoke this script with "--where" to print the path to the Python executable # that would be used. . "$(dirname "${BASH_SOURCE[0]}")/use.sh" base find-python() { pys=( py python3.14 python3.13 python3.12 python3.11 python3.10 python3.9 python3.8 python3 python ) for cand in "${pys[@]}"; do # Find a Python that supports "x := 0", which was added in Python 3.8 if have-command "$cand" && "$cand" -c "(x:=0)" > /dev/null 2>&1; then _found=$(type -P "$cand") break fi done if ! is-set _found; then fail "No Python (≥3.8) executable was found" fi debug "Found Python: $_found" printf %s "$_found" } run-python() { local py py=$(find-python) "$py" "$@" } if is-main; then if [[ "$*" = "--where" ]]; then printf "%s\n" "$(find-python)" else run-python "$@" fi fi mongo-c-driver-1.26.0/tools/str.sh000077500000000000000000000037101456567454500167650ustar00rootroot00000000000000#!/bin/sh # This is a tiny shell utility for string manipulation. # Allow us to use "local" # shellcheck disable=SC3043 set -eu _HELP='Usage: str {lower,upper} str test Commands: lower, upper Convert input (stdin) to all-lowercase or all-uppercase, respectively test (-ieq|-ine|-contains|-matches) Like "test", but with additional string comparisons: -ieq • case-insensitive equal -ine • case-insensitive not-equal -contains • Check if contains -matches • Check if matches pattern (A grep -E pattern) ' fail() { # shellcheck disable=SC2059 printf -- "$@" 1>&2 printf -- "\n" 1>&2 return 1 } __str__upper() { __justStdin upper __upper "$@" } __upper() { tr '[:lower:]' '[:upper:]' } __str__lower() { __justStdin lower __lower "$@" } __lower() { tr '[:upper:]' '[:lower:]' } __justStdin() { if test $# -gt 2; then fail "Command '%s' does not take any arguments (write input into stdin)" "$1" || return fi "$2" } __str__help() { printf %s "$_HELP" } __str____help() { __str help } __str___h() { __str help } __str___help() { __str help } __str__test() { test "$#" -eq 3 || fail '“str test” expects three arguments (Got %d: “%s”)' $# "$*" \ || return local lhs="$1" local op="$2" local rhs="$3" local norm_lhs norm_rhs; norm_lhs=$(echo "$lhs" | __str lower) || return norm_rhs=$(echo "$rhs" | __str lower) || return case $op in -ieq) test "$norm_lhs" = "$norm_rhs";; -ine) test "$norm_lhs" != "$norm_rhs";; -matches) printf %s "$lhs" | grep -qE -- "$rhs";; -contains) printf %s "$lhs" | grep -qF -- "$rhs";; -*|=*) # Just defer to the underlying test command test "$lhs" "$op" "$rhs" esac } __str() { local _Command="$1" local _CommandIdent _CommandIdent="$(echo "__str__$_Command" | sed ' s/-/_/g s/\./__/g ')" shift "$_CommandIdent" "$@" } __str "$@" mongo-c-driver-1.26.0/tools/use.sh000077500000000000000000000047061456567454500167570ustar00rootroot00000000000000#!/usr/bin/env bash : < [ [...]] This script will enable strict mode in the parent. refers to the filepath stems of scripts that are sibling to use.sh (i.e. within the same directory, the name of "foo.sh" is "foo"). Commands defined by importing this file: is-main • This command takes no arguments, and returns zero if the invoked in context where imports are not being resolved (i.e. the script is being executed directly rather than being imported) EOF set -o errexit set -o pipefail set -o nounset # A utility that exits true if invoked outside of an importing context: is-main() { $_IS_MAIN; } # Grab the absolute path to the directory of this script: pushd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null _this_dir=$(pwd) popd >/dev/null # Keep a stack, of scripts being imported: declare -a _USE_IMPORTING # Inform scripts that they are being imported, not executed directly: _IS_MAIN=false for item in "$@"; do # Don't double-import items: _varname="_IMPORTED_$item" if [[ -n "${!_varname+n}" ]]; then continue fi # Push this item: _USE_IMPORTING+=("$item") # The file to be imported: file=$_this_dir/$item.sh ! [[ ${PRINT_DEBUG_LOGS:-} = 1 ]] || echo "Import: [$item]" 1>&2 _err=0 # Detect self-import: if printf '%s\0' "${BASH_SOURCE[@]}" | grep -qFxZ -- "$file"; then echo "File '$file' imports itself transitively" 1>&2 _err=1 fi # Detect non-existing imports: if ! [[ -f $file ]]; then echo "No script '$file' exists to import." 1>&2 _err=1 fi # Print the stacktrace of imports upon error: if [[ $_err -eq 1 ]]; then printf " • [%s] loaded by:\n" "${BASH_SOURCE[@]}" 1>&2 echo " • (user)" 1>&2 echo "Bailing out" 1>&2 return 1 fi # shellcheck disable=1090 . "$file" # Recover item from the stack, since we may have recursed: item="${_USE_IMPORTING[${#_USE_IMPORTING[@]}-1]}" # Pop the top stack item: unset "_USE_IMPORTING[${#_USE_IMPORTING[@]}-1]" # Declare that the item has been imported, for future reference: declare "_IMPORTED_$item=1" ! [[ ${PRINT_DEBUG_LOGS:-} = 1 ]] || echo "Import: [$item] - done" 1>&2 done # Set _IS_MAIN to zero if the import stack is empty if [[ "${_USE_IMPORTING+${_USE_IMPORTING[*]}}" = "" ]]; then _IS_MAIN=true fi mongo-c-driver-1.26.0/tools/with_lock.sh000077500000000000000000000015231456567454500201400ustar00rootroot00000000000000#!/usr/bin/env bash . "$(dirname "${BASH_SOURCE[0]}")/use.sh" base # * with-lock [command ...] # Execute ‘command’ while holding as an exclusive lock. This # requires the ‘lckdo’ command, otherwise it executes the command without # taking any lock. The parent directory of must exists. NOTE: # the given command must be an application, and not a shell-internal or # shell function. with-lock() { [[ "$#" -gt 1 ]] || fail "with-lock requires a lock filename and a command to run" if ! have-command lckdo; then log "No ‘lckdo’ program is installed. We'll run without the lock, but parallel tasks may contend." log " (‘lckdo’ is part of the ‘moreutils’ package)" shift command "$@" else lckdo -W 30 -- "$@" fi } mongo-c-driver-1.26.0/valgrind.suppressions000066400000000000000000000020451456567454500207630ustar00rootroot00000000000000{ ignore_libcrypto_conditional_jump_errors_in_leak Memcheck:Leak ... obj:*/libcrypto.so.* } { ignore_libcrypto_conditional_jump_errors_in_cond Memcheck:Cond ... obj:*/libcrypto.so.* } { ignore_libssl_conditional_jump_errors_in_cond Memcheck:Cond ... obj:*/libssl.so.* } { ignore_libcrypto_conditional_jump_errors_in_value8 Memcheck:Value8 ... obj:*/libcrypto.so.* } { ignore_scram_nonce_uninitialized_warning_cond Memcheck:Cond fun:mongoc_b64_ntop ... fun:_mongoc_scram_step ... } { ignore_scram_nonce_uninitialized_warning_value8 Memcheck:Value8 fun:mongoc_b64_ntop ... fun:_mongoc_scram_step ... } { ignore_libcrypto_conditional_jump_errors_in_param Memcheck:Param sendmsg(msg.msg_iov[0]) ... obj:*/libcrypto.so.* } { ignore_sasl_load_plugin_reachable_warnings Memcheck:Leak ... fun:_sasl_get_plugin ... fun:_mongoc_do_init } { ignore_sasl_load_plugin_leak Memcheck:Leak ... fun:_sasl_load_plugins ... fun:_mongoc_do_init }

    l 7l 0l )l "l l l  l l k k k k k k k k k k k k k k k k k k k zk sk lk ek ^k Wk Pk Ik Bk ;k 4k -k &k k k k  k k j j j j j j j j j j j j j j j j j j ~j wj pj ij bj [j Tj Mj Fj ?j 8j 1j *j #j j j j j j i i i i i i i i i i i i i i i i i i {i ti mi fi _i Xi Qi Ji Ci e 7e 0e )e "e e e  e e d d d d d d d d d d d d d d d d d d d zd sd ld ed ^d Wd Pd Id Bd ;d 4d -d &d d d d  d d c c c c c c c c c c c c c c c c c c ~c wc pc ic bc [c Tc Mc Fc ?c 8c 1c *c #c c c c c c b b b b b b b b b b b b b b b b b b {b tb mb fb _b Xb Qb Jb Cb ^ 7^ 0^ )^ "^ ^ ^  ^ ^ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] z] s] l] e] ^] W] P] I] B] ;] 4] -] &] ] ] ]  ] ] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ~\ w\ p\ i\ b\ [\ T\ M\ F\ ?\ 8\ 1\ *\ #\ \ \ \ \ \ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ {[ t[ m[ f[ _[ X[ Q[ J[ C[ <[ 5[ .[ '[  [ [ [  [ [ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z xZ qZ jZ cZ \Z UZ NZ GZ @Z 9Z 2Z +Z $Z Z Z Z Z Z Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y |Y uY nY gY `Y YY RY KY DY =Y 6Y /Y (Y !Y Y Y  Y Y X X X X X X X X X X X X X X X X X X X yX rX kX dX ]X VX OX HX AX :X 3X ,X %X X X X  X X W W W W W W W W W W W W W W W W W W }W vW oW hW aW ZW SW LW EW >W 7W 0W )W "W W W  W W V V V V V V V V V V V V V V V V V V V zV sV lV eV ^V WV PV IV BV ;V 4V -V &V V V V  V V U U U U U U U U U U U U U U U U U U ~U wU pU iU bU [U TU MU FU ?U 8U 1U *U #U U U U U U T T T T T T T T T T T T T T T T T T {T tT mT fT _T XT QT JT CT P 7P 0P )P "P P P  P P O O O O O O O O O O O O O O O O O O O zO sO lO eO ^O WO PO IO BO ;O 4O -O &O O O O  O O N N N N N N N N N N N N N N N N N N ~N wN pN iN bN [N TN MN FN ?N 8N 1N *N #N N N N N N M M M M M M M M M M M M M M M M M M {M tM mM fM _M XM QM JM CM I 7I 0I )I "I I I  I I H H H H H H H H H H H H H H H H H H H zH sH lH eH ^H WH PH IH BH ;H 4H -H &H H H H  H H G G G G G G G G G G G G G G G G G G ~G wG pG iG bG [G TG MG FG ?G 8G 1G *G #G G G G G G F F F F F F F F F F F F F F F F F F {F tF mF fF _F XF QF JF CF B 7B 0B )B "B B B  B B A A A A A A A A A A A A A A A A A A A zA sA lA eA ^A WA PA IA BA ;A 4A -A &A A A A  A A @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ~@ w@ p@ i@ b@ [@ T@ M@ F@ ?@ 8@ 1@ *@ #@ @ @ @ @ @ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {? t? m? f? _? X? Q? J? C?  > > > > > > > > > > > > > > > > > > x> q> j> c> \> U> N> G> @> 9> 2> +> $> > > > > > = = = = = = = = = = = = = = = = = = |= u= n= g= `= Y= R= K= D= == 6= /= (= != = =  = = < < < < < < < < < < < < < < < < < < < y< r< k< d< ]< V< O< H< A< :< 3< ,< %< < < <  < < ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; }; v; o; h; a; Z; S; L; E; >; 7; 0; ); "; ; ;  ; ; : : : : : : : : : : : : : : : : : : : z: s: l: e: ^: W: P: I: B: ;: 4: -: &: : : :  : : 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ~9 w9 p9 i9 b9 [9 T9 M9 F9 ?9 89 19 *9 #9 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 {8 t8 m8 f8 _8 X8 Q8 J8 C8 <8 58 .8 '8  8 8 8  8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 x7 q7 j7 c7 \7 U7 N7 G7 @7 97 27 +7 $7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 |6 u6 n6 g6 `6 Y6 R6 K6 D6 =6 66 /6 (6 !6 6 6  6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 y5 r5 k5 d5 ]5 V5 O5 H5 A5 :5 35 ,5 %5 5 5 5  5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 }4 v4 o4 h4 a4 Z4 S4 L4 E4 >4 74 04 )4 "4 4 4  4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 z3 s3 l3 e3 ^3 W3 P3 I3 B3 ;3 43 -3 &3 3 3 3  3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ~2 w2 p2 i2 b2 [2 T2 M2 F2 ?2 82 12 *2 #2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 {1 t1 m1 f1 _1 X1 Q1 J1 C1 <1 51 .1 '1  1 1 1  1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x0 q0 j0 c0 \0 U0 N0 G0 @0 90 20 +0 $0 0 0 0 0 0 / / / / / / / / / / / / / / / / / / |/ u/ n/ g/ `/ Y/ R/ K/ D/ =/ 6/ // (/ !/ / /  / / . . . . . . . . . . . . . . . . . . . y. r. k. d. ]. V. O. H. A. :. 3. ,. %. . . .  . . - - - - - - - - - - - - - - - - - - }- v- o- h- a- Z- S- L- E- >- 7- 0- )- "- - -  - - , , , , , , , , , , , , , , , , , , , z, s, l, e, ^, W, P, I, B, ;, 4, -, &, , , ,  , , + + + + + + + + + + + + + + + + + + ~+ w+ p+ i+ b+ [+ T+ M+ F+ ?+ 8+ 1+ *+ #+ + + + + + * * * * * * * * * * * * * * * * * * {* t* m* f* _* X* Q* J* C* <* 5* .* '*  * * *  * * ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) x) q) j) c) \) U) N) G) @) 9) 2) +) $) ) ) ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( |( u( n( g( `( Y( R( K( D( =( 6( /( (( !( ( (  ( ( ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' y' r' k' d' ]' V' O' H' A' :' 3' ,' %' ' ' '  ' ' & & & & & & & & & & & & & & & & & & }& v& o& h& a& Z& S& L& E& >& 7& 0& )& "& & &  & & % % % % % % % % % % % % % % % % % % % z% s% l% e% ^% W% P% I% B% ;% 4% -% &% % % %  % % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ~$ w$ p$ i$ b$ [$ T$ M$ F$ ?$ 8$ 1$ *$ #$ $ $ $ $ $ # # # # # # # # # # # # # # # # # # {# t# m# f# _# X# Q# J# C# <# 5# .# '#  # # #  # # " " " " " " " " " " " " " " " " " " " x" q" j" c" \" U" N" G" @" 9" 2" +" $" " " " " " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! |! u! n! g! `! Y! R! K! D! =! 6! /! (! !! ! !  ! !                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% ߿ؿѿʿÿ}vohaZSLE>70)" ܾվξǾzsle^WPIB;4-& ٽҽ˽Ľ~wpib[TMF?81*#ݼּϼȼ{tmf_XQJC<5.'  ڻӻ̻Żxqjc\UNG@92+$޺׺кɺº|ung`YRKD=6/(! ۹Թ͹ƹyrkd]VOHA:3,% ߸ظѸʸø}vohaZSLE>70)" ܷշηǷzsle^WPIB;4-& ٶҶ˶Ķ~wpib[TMF?81*#ݵֵϵȵ{tmf_XQJC<5.'  ڴӴ̴Ŵxqjc\UNG@92+$޳׳гɳ³|ung`YRKD=6/(! ۲ԲͲƲyrkd]VOHA:3,% ߱رѱʱñ}vohaZSLE>70)" ܰհΰǰzsle^WPIB;4-& ٯү˯į~wpib[TMF?81*#ݮ֮ϮȮ{tmf_XQJC<5.'  ڭӭ̭ŭxqjc\UNG@92+$ެ׬Ьɬ¬|ung`YRKD=6/(! ۫ԫͫƫyrkd]VOHA:3,% ߪتѪʪê}vohaZSLE>70)" ܩթΩǩzsle^WPIB;4-& ٨Ҩ˨Ĩ~wpib[TMF?81*#ݧ֧ϧȧ{tmf_XQJC<5.'  ڦӦ̦Ŧxqjc\UNG@92+$ޥץХɥ¥|ung`YRKD=6/(! ۤԤͤƤyrkd]VOHA:3,% ߣأѣʣã}vohaZSLE>70)" ܢբ΢Ǣzsle^WPIB;4-& ١ҡˡġ~wpib[TMF?81*#ݠ֠ϠȠ{tmf_XQJC<5.'  ڟӟ̟şxqjc\UNG@92+$ޞמОɞž|ung`YRKD=6/(! ۝ԝ͝Ɲyrkd]VOHA:3,% ߜ؜ќʜÜ}vohaZSLE>70)" ܛ՛ΛǛzsle^WPIB;4-& ٚҚ˚Ě~wpib[TMF?81*#ݙ֙ϙș{tmf_XQJC<5.'  ژӘ̘Řxqjc\UNG@92+$ޗחЗɗ—|ung`YRKD=6/(! ۖԖ͖Ɩyrkd]VOHA:3,% ߕؕѕʕÕ}vohaZSLE>70)" ܔՔΔǔzsle^WPIB;4-& ٓғ˓ē~wpib[TMF?81*#ݒ֒ϒȒ{tmf_XQJC<5.'  ڑӑ̑őxqjc\UNG@92+$ސאАɐ|ung`YRKD=6/(! ۏԏ͏Əyrkd]VOHA:3,% ߎ؎юʎÎ}vohaZSLE>70)" ܍Ս΍Ǎzsle^WPIB;4-& ٌҌˌČ~wpib[TMF?81*#݋֋ϋȋ{tmf_XQJC<5.'  ڊӊ̊Ŋxqjc\UNG@92+$މ׉Љɉ‰|ung`YRKD=6/(! ۈԈ͈ƈyrkd]VOHA:3,% ߇؇чʇÇ}vohaZSLE>70)" ܆ՆΆdžzsle^WPIB;4-& م҅˅ą~wpib[TMF?81*#݄քτȄ{tmf_XQJC<5.'  ڃӃ̃Ńxqjc\UNG@92+$ނׂЂɂ‚|ung`YRKD=6/(! ہԁ́Ɓyrkd]VOHA:3,% ߀؀рʀÀ}vohaZSLE>70)" zsle^WPIB;4-& ~~~~~~~~~~~~~~~~~~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~}}}}}}}}}}}}}}}}}}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}|||||||||||||||||||x|q|j|c|\|U|N|G|@|9|2|+|$||||||{{{{{{{{{{{{{{{{{{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{zzzzzzzzzzzzzzzzzzzyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzyyyyyyyyyyyyyyyyyy}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyxxxxxxxxxxxxxxxxxxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxwwwwwwwwwwwwwwwwww~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwvvvvvvvvvvvvvvvvvv{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrqqqqqqqqqqqqqqqqqqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqpppppppppppppppppp~pwpppipbp[pTpMpFp?p8p1p*p#ppppppoooooooooooooooooo{otomofo_oXoQoJoCok7k0k)k"kkk kkjjjjjjjjjjjjjjjjjjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjiiiiiiiiiiiiiiiiii~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiihhhhhhhhhhhhhhhhhh{hthmhfh_hXhQhJhChd7d0d)d"ddd ddccccccccccccccccccczcsclcec^cWcPcIcBc;c4c-c&cccc ccbbbbbbbbbbbbbbbbbb~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbaaaaaaaaaaaaaaaaaa{atamafa_aXaQaJaCa]7]0])]"]]] ]]\\\\\\\\\\\\\\\\\\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\[[[[[[[[[[[[[[[[[[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ZZZZZZZZZZZZZZZZZZ{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVUUUUUUUUUUUUUUUUUUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUTTTTTTTTTTTTTTTTTT~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTSSSSSSSSSSSSSSSSSS{StSmSfS_SXSQSJSCSO7O0O)O"OOO OONNNNNNNNNNNNNNNNNNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNMMMMMMMMMMMMMMMMMM~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMLLLLLLLLLLLLLLLLLL{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHGGGGGGGGGGGGGGGGGGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGFFFFFFFFFFFFFFFFFF~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFEEEEEEEEEEEEEEEEEE{EtEmEfE_EXEQEJECEA7A0A)A"AAA AA@@@@@@@@@@@@@@@@@@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@??????????????????~?w?p?i?b?[?T?M?F???8?1?*?#??????>>>>>>>>>>>>>>>>>>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>===================x=q=j=c=\=U=N=G=@=9=2=+=$======<<<<<<<<<<<<<<<<<<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<;;;;;;;;;;;;;;;;;;;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;::::::::::::::::::}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::9999999999999999999z9s9l9e9^9W9P9I9B9;949-9&9999 99888888888888888888~8w8p8i8b8[8T8M8F8?88818*8#888888777777777777777777{7t7m7f7_7X7Q7J7C7<757.7'7 777 776666666666666666666x6q6j6c6\6U6N6G6@69626+6$666666555555555555555555|5u5n5g5`5Y5R5K5D5=565/5(5!555 554444444444444444444y4r4k4d4]4V4O4H4A4:434,4%4444 44333333333333333333}3v3o3h3a3Z3S3L3E3>37303)3"333 332222222222222222222z2s2l2e2^2W2P2I2B2;242-2&2222 22111111111111111111~1w1p1i1b1[1T1M1F1?18111*1#111111000000000000000000{0t0m0f0_0X0Q0J0C0<050.0'0 000 00///////////////////x/q/j/c/\/U/N/G/@/9/2/+/$//////..................|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..-------------------y-r-k-d-]-V-O-H-A-:-3-,-%---- --,,,,,,,,,,,,,,,,,,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,+++++++++++++++++++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++******************~*w*p*i*b*[*T*M*F*?*8*1***#******)))))))))))))))))){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))(((((((((((((((((((x(q(j(c(\(U(N(G(@(9(2(+($((((((''''''''''''''''''|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''&&&&&&&&&&&&&&&&&&&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&%%%%%%%%%%%%%%%%%%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%$$$$$$$$$$$$$$$$$$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$##################~#w#p#i#b#[#T#M#F#?#8#1#*########""""""""""""""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""!!!!!!!!!!!!!!!!!!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!                  | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#                  { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  ڿӿ̿ſxqjc\UNG@92+$޾׾оɾ¾|ung`YRKD=6/(! ۽Խͽƽyrkd]VOHA:3,% ߼ؼѼʼü}vohaZSLE>70)" ܻջλǻzsle^WPIB;4-& ٺҺ˺ĺ~wpib[TMF?81*#ݹֹϹȹ{tmf_XQJC<5.'  ڸӸ̸Ÿxqjc\UNG@92+$޷׷зɷ·|ung`YRKD=6/(! ۶ԶͶƶyrkd]VOHA:3,% ߵصѵʵõ}vohaZSLE>70)" ܴմδǴzsle^WPIB;4-& ٳҳ˳ij~wpib[TMF?81*#ݲֲϲȲ{tmf_XQJC<5.'  ڱӱ̱űxqjc\UNG@92+$ްװаɰ°|ung`YRKD=6/(! ۯԯͯƯyrkd]VOHA:3,% ߮خѮʮî}vohaZSLE>70)" ܭխέǭzsle^WPIB;4-& ٬ҬˬĬ~wpib[TMF?81*#ݫ֫ϫȫ{tmf_XQJC<5.'  ڪӪ̪Ūxqjc\UNG@92+$ީשЩɩ©|ung`YRKD=6/(! ۨԨͨƨyrkd]VOHA:3,% ߧاѧʧç}vohaZSLE>70)" ܦզΦǦzsle^WPIB;4-& ٥ҥ˥ĥ~wpib[TMF?81*#ݤ֤ϤȤ{tmf_XQJC<5.'  ڣӣ̣ţxqjc\UNG@92+$ޢעТɢ¢|ung`YRKD=6/(! ۡԡ͡ơyrkd]VOHA:3,% ߠؠѠʠà}vohaZSLE>70)" ܟ՟Οǟzsle^WPIB;4-& ٞҞ˞Ğ~wpib[TMF?81*#ݝ֝ϝȝ{tmf_XQJC<5.'  ڜӜ̜Ŝxqjc\UNG@92+$ޛכЛɛ›|ung`YRKD=6/(! ۚԚ͚ƚyrkd]VOHA:3,% ߙؙљʙÙ}vohaZSLE>70)" ܘ՘Θǘzsle^WPIB;4-& ٗҗ˗ė~wpib[TMF?81*#ݖ֖ϖȖ{tmf_XQJC<5.'  ڕӕ̕ŕxqjc\UNG@92+$ޔהДɔ”|ung`YRKD=6/(! ۓԓ͓Ɠyrkd]VOHA:3,% ߒؒђʒÒ}vohaZSLE>70)" ܑՑΑǑzsle^WPIB;4-& ِҐːĐ~wpib[TMF?81*#ݏ֏Ϗȏ{tmf_XQJC<5.'  ڎӎ̎Ŏxqjc\UNG@92+$ލ׍Ѝɍ|ung`YRKD=6/(! یԌ͌ƌyrkd]VOHA:3,% ߋ؋ыʋË}vohaZSLE>70)" ܊ՊΊNJzsle^WPIB;4-& ى҉ˉĉ~wpib[TMF?81*#݈ֈψȈ{tmf_XQJC<5.'  ڇӇ̇Ňxqjc\UNG@92+$ކ׆ІɆ†|ung`YRKD=6/(! ۅԅͅƅyrkd]VOHA:3,% ߄؄фʄÄ}vohaZSLE>70)" ܃Ճ΃ǃzsle^WPIB;4-& ق҂˂Ă~wpib[TMF?81*#݁ցρȁ{tmf_XQJC<5.'  ڀӀ̀ŀxqjc\UNG@92+$|ung`YRKD=6/(! ~~~~~~~~~~~~~~~~~~~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~}}}}}}}}}}}}}}}}}}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}|||||||||||||||||||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||{{{{{{{{{{{{{{{{{{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{zzzzzzzzzzzzzzzzzz{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvuuuuuuuuuuuuuuuuuuuzusulueu^uWuPuIuBu;u4u-u&uuuu uutttttttttttttttttt~twtptitbt[tTtMtFt?t8t1t*t#ttttttssssssssssssssssss{stsmsfs_sXsQsJsCso7o0o)o"ooo oonnnnnnnnnnnnnnnnnnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnmmmmmmmmmmmmmmmmmm~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmllllllllllllllllll{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhgggggggggggggggggggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggffffffffffffffffff~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffeeeeeeeeeeeeeeeeee{etemefe_eXeQeJeCea7a0a)a"aaa aa```````````````````z`s`l`e`^`W`P`I`B`;`4`-`&```` ``__________________~_w_p_i_b_[_T_M_F_?_8_1_*_#______^^^^^^^^^^^^^^^^^^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^]]]]]]]]]]]]]]]]]]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]\\\\\\\\\\\\\\\\\\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\[[[[[[[[[[[[[[[[[[[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ZZZZZZZZZZZZZZZZZZ}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZYYYYYYYYYYYYYYYYYYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYXXXXXXXXXXXXXXXXXX~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXWWWWWWWWWWWWWWWWWW{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSRRRRRRRRRRRRRRRRRRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRQQQQQQQQQQQQQQQQQQ~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQPPPPPPPPPPPPPPPPPP{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLKKKKKKKKKKKKKKKKKKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKJJJJJJJJJJJJJJJJJJ~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJIIIIIIIIIIIIIIIIII{ItImIfI_IXIQIJICIE7E0E)E"EEE EEDDDDDDDDDDDDDDDDDDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDCCCCCCCCCCCCCCCCCC~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCBBBBBBBBBBBBBBBBBB{BtBmBfB_BXBQBJBCB>>>>>>>>>>>>>>>>>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>===================z=s=l=e=^=W=P=I=B=;=4=-=&==== ==<<<<<<<<<<<<<<<<<<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<;;;;;;;;;;;;;;;;;;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;:::::::::::::::::::x:q:j:c:\:U:N:G:@:9:2:+:$::::::999999999999999999|9u9n9g9`9Y9R9K9D9=969/9(9!999 998888888888888888888y8r8k8d8]8V8O8H8A8:838,8%8888 88777777777777777777}7v7o7h7a7Z7S7L7E7>77707)7"777 776666666666666666666z6s6l6e6^6W6P6I6B6;646-6&6666 66555555555555555555~5w5p5i5b5[5T5M5F5?58515*5#555555444444444444444444{4t4m4f4_4X4Q4J4C4<454.4'4 444 443333333333333333333x3q3j3c3\3U3N3G3@39323+3$333333222222222222222222|2u2n2g2`2Y2R2K2D2=262/2(2!222 221111111111111111111y1r1k1d1]1V1O1H1A1:131,1%1111 11000000000000000000}0v0o0h0a0Z0S0L0E0>07000)0"000 00///////////////////z/s/l/e/^/W/P/I/B/;/4/-/&//// //..................~.w.p.i.b.[.T.M.F.?.8.1.*.#......------------------{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --,,,,,,,,,,,,,,,,,,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,++++++++++++++++++|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++*******************y*r*k*d*]*V*O*H*A*:*3*,*%**** **))))))))))))))))))})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))(((((((((((((((((((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((''''''''''''''''''~'w'p'i'b'['T'M'F'?'8'1'*'#''''''&&&&&&&&&&&&&&&&&&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&%%%%%%%%%%%%%%%%%%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%$$$$$$$$$$$$$$$$$$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$###################y#r#k#d#]#V#O#H#A#:#3#,#%#### ##""""""""""""""""""}"v"o"h"a"Z"S"L"E">"7"0")""""" ""!!!!!!!!!!!!!!!!!!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!                  ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,%                   } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $      |ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" ܿտοǿzsle^WPIB;4-& پҾ˾ľ~wpib[TMF?81*#ݽֽϽȽ{tmf_XQJC<5.'  ڼӼ̼żxqjc\UNG@92+$޻׻лɻ»|ung`YRKD=6/(! ۺԺͺƺyrkd]VOHA:3,% ߹عѹʹù}vohaZSLE>70)" ܸոθǸzsle^WPIB;4-& ٷҷ˷ķ~wpib[TMF?81*#ݶֶ϶ȶ{tmf_XQJC<5.'  ڵӵ̵ŵxqjc\UNG@92+$޴״дɴ´|ung`YRKD=6/(! ۳ԳͳƳyrkd]VOHA:3,% ߲زѲʲò}vohaZSLE>70)" ܱձαDZzsle^WPIB;4-& ٰҰ˰İ~wpib[TMF?81*#ݯ֯ϯȯ{tmf_XQJC<5.'  ڮӮ̮Ůxqjc\UNG@92+$ޭ׭Эɭ­|ung`YRKD=6/(! ۬ԬͬƬyrkd]VOHA:3,% ߫ثѫʫë}vohaZSLE>70)" ܪժΪǪzsle^WPIB;4-& ٩ҩ˩ĩ~wpib[TMF?81*#ݨ֨ϨȨ{tmf_XQJC<5.'  ڧӧ̧ŧxqjc\UNG@92+$ަצЦɦ¦|ung`YRKD=6/(! ۥԥͥƥyrkd]VOHA:3,% ߤؤѤʤä}vohaZSLE>70)" ܣգΣǣzsle^WPIB;4-& ٢ҢˢĢ~wpib[TMF?81*#ݡ֡ϡȡ{tmf_XQJC<5.'  ڠӠ̠Šxqjc\UNG@92+$ޟןПɟŸ|ung`YRKD=6/(! ۞Ԟ͞ƞyrkd]VOHA:3,% ߝ؝ѝʝÝ}vohaZSLE>70)" ܜ՜Μǜzsle^WPIB;4-& ٛқ˛ě~wpib[TMF?81*#ݚ֚ϚȚ{tmf_XQJC<5.'  ڙә̙řxqjc\UNG@92+$ޘטИɘ˜|ung`YRKD=6/(! ۗԗ͗Ɨyrkd]VOHA:3,% ߖؖіʖÖ}vohaZSLE>70)" ܕՕΕǕzsle^WPIB;4-& ٔҔ˔Ĕ~wpib[TMF?81*#ݓ֓ϓȓ{tmf_XQJC<5.'  ڒӒ̒Œxqjc\UNG@92+$ޑבБɑ‘|ung`YRKD=6/(! ېԐ͐Ɛyrkd]VOHA:3,% ߏ؏яʏÏ}vohaZSLE>70)" ܎ՎΎǎzsle^WPIB;4-& ٍҍˍč~wpib[TMF?81*#݌֌όȌ{tmf_XQJC<5.'  ڋӋ̋ŋxqjc\UNG@92+$ފ׊ЊɊŠ|ung`YRKD=6/(! ۉԉ͉Ɖyrkd]VOHA:3,% ߈؈шʈÈ}vohaZSLE>70)" ܇Շ·LJzsle^WPIB;4-& ن҆ˆĆ~wpib[TMF?81*#݅օυȅ{tmf_XQJC<5.'  ڄӄ̄ńxqjc\UNG@92+$ރ׃ЃɃƒ|ung`YRKD=6/(! ۂԂ͂Ƃyrkd]VOHA:3,% ߁؁сʁÁ}vohaZSLE>70)" ܀Հ΀ǀzsle^WPIB;4-& ~wpib[TMF?81*#~~~~~~~~~~~~~~~~~~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~}}}}}}}}}}}}}}}}}}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}||||||||||||||||||||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||{{{{{{{{{{{{{{{{{{{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{zzzzzzzzzzzzzzzzzz}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzyyyyyyyyyyyyyyyyyyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyxxxxxxxxxxxxxxxxxx~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxwwwwwwwwwwwwwwwwww{wtwmwfw_wXwQwJwCws7s0s)s"sss ssrrrrrrrrrrrrrrrrrrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrqqqqqqqqqqqqqqqqqq~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqpppppppppppppppppp{ptpmpfp_pXpQpJpCpl7l0l)l"lll llkkkkkkkkkkkkkkkkkkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkjjjjjjjjjjjjjjjjjj~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjiiiiiiiiiiiiiiiiii{itimifi_iXiQiJiCie7e0e)e"eee eedddddddddddddddddddzdsdlded^dWdPdIdBd;d4d-d&dddd ddcccccccccccccccccc~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccbbbbbbbbbbbbbbbbbb{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^]]]]]]]]]]]]]]]]]]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]\\\\\\\\\\\\\\\\\\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\[[[[[[[[[[[[[[[[[[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ZZZZZZZZZZZZZZZZZZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZYYYYYYYYYYYYYYYYYY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYXXXXXXXXXXXXXXXXXXXyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXWWWWWWWWWWWWWWWWWW}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWVVVVVVVVVVVVVVVVVVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVUUUUUUUUUUUUUUUUUU~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUTTTTTTTTTTTTTTTTTT{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPOOOOOOOOOOOOOOOOOOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OONNNNNNNNNNNNNNNNNN~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNMMMMMMMMMMMMMMMMMM{MtMmMfM_MXMQMJMCMI7I0I)I"III IIHHHHHHHHHHHHHHHHHHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHGGGGGGGGGGGGGGGGGG~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGFFFFFFFFFFFFFFFFFF{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBAAAAAAAAAAAAAAAAAAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AA@@@@@@@@@@@@@@@@@@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@??????????????????{?t?m?f?_?X?Q?J?C?>>>>>>>>>>>>>>>>>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>==================|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==<<<<<<<<<<<<<<<<<<<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<;;;;;;;;;;;;;;;;;;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;:::::::::::::::::::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::999999999999999999~9w9p9i9b9[9T9M9F9?98919*9#999999888888888888888888{8t8m8f8_8X8Q8J8C8<858.8'8 888 887777777777777777777x7q7j7c7\7U7N7G7@79727+7$777777666666666666666666|6u6n6g6`6Y6R6K6D6=666/6(6!666 665555555555555555555y5r5k5d5]5V5O5H5A5:535,5%5555 55444444444444444444}4v4o4h4a4Z4S4L4E4>47404)4"444 443333333333333333333z3s3l3e3^3W3P3I3B3;343-3&3333 33222222222222222222~2w2p2i2b2[2T2M2F2?28212*2#222222111111111111111111{1t1m1f1_1X1Q1J1C1<151.1'1 111 110000000000000000000x0q0j0c0\0U0N0G0@09020+0$000000//////////////////|/u/n/g/`/Y/R/K/D/=/6///(/!/// //...................y.r.k.d.].V.O.H.A.:.3.,.%.... ..------------------}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --,,,,,,,,,,,,,,,,,,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,++++++++++++++++++~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++******************{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **)))))))))))))))))))x)q)j)c)\)U)N)G)@)9)2)+)$))))))((((((((((((((((((|(u(n(g(`(Y(R(K(D(=(6(/(((!((( (('''''''''''''''''''y'r'k'd']'V'O'H'A':'3','%'''' ''&&&&&&&&&&&&&&&&&&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&%%%%%%%%%%%%%%%%%%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%$$$$$$$$$$$$$$$$$$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$##################{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##"""""""""""""""""""x"q"j"c"\"U"N"G"@"9"2"+"$""""""!!!!!!!!!!!!!!!!!!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!                   y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'                     x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$޿׿пɿ¿|ung`YRKD=6/(! ۾Ծ;ƾyrkd]VOHA:3,% ߽ؽѽʽý}vohaZSLE>70)" ܼռμǼzsle^WPIB;4-& ٻһ˻Ļ~wpib[TMF?81*#ݺֺϺȺ{tmf_XQJC<5.'  ڹӹ̹Źxqjc\UNG@92+$޸׸иɸ¸|ung`YRKD=6/(! ۷ԷͷƷyrkd]VOHA:3,% ߶ضѶʶö}vohaZSLE>70)" ܵյεǵzsle^WPIB;4-& ٴҴ˴Ĵ~wpib[TMF?81*#ݳֳϳȳ{tmf_XQJC<5.'  ڲӲ̲Ųxqjc\UNG@92+$ޱױбɱ±|ung`YRKD=6/(! ۰԰Ͱưyrkd]VOHA:3,% ߯دѯʯï}vohaZSLE>70)" ܮծήǮzsle^WPIB;4-& ٭ҭ˭ĭ~wpib[TMF?81*#ݬ֬ϬȬ{tmf_XQJC<5.'  ګӫ̫ūxqjc\UNG@92+$ުתЪɪª|ung`YRKD=6/(! ۩ԩͩƩyrkd]VOHA:3,% ߨبѨʨè}vohaZSLE>70)" ܧէΧǧzsle^WPIB;4-& ٦Ҧ˦Ħ~wpib[TMF?81*#ݥ֥ϥȥ{tmf_XQJC<5.'  ڤӤ̤Ťxqjc\UNG@92+$ޣףУɣ£|ung`YRKD=6/(! ۢԢ͢Ƣyrkd]VOHA:3,% ߡءѡʡá}vohaZSLE>70)" ܠՠΠǠzsle^WPIB;4-& ٟҟ˟ğ~wpib[TMF?81*#ݞ֞ϞȞ{tmf_XQJC<5.'  ڝӝ̝ŝxqjc\UNG@92+$ޜלМɜœ|ung`YRKD=6/(! ۛԛ͛ƛyrkd]VOHA:3,% ߚؚњʚÚ}vohaZSLE>70)" ܙՙΙǙzsle^WPIB;4-& ٘Ҙ˘Ę~wpib[TMF?81*#ݗ֗ϗȗ{tmf_XQJC<5.'  ږӖ̖Ŗxqjc\UNG@92+$ޕוЕɕ•|ung`YRKD=6/(! ۔Ԕ͔Ɣyrkd]VOHA:3,% ߓؓѓʓÓ}vohaZSLE>70)" ܒՒΒǒzsle^WPIB;4-& ّґˑđ~wpib[TMF?81*#ݐ֐ϐȐ{tmf_XQJC<5.'  ڏӏ̏ŏxqjc\UNG@92+$ގ׎ЎɎŽ|ung`YRKD=6/(! ۍԍ͍ƍyrkd]VOHA:3,% ߌ،ьʌÌ}vohaZSLE>70)" ܋Ջ΋Njzsle^WPIB;4-& يҊˊĊ~wpib[TMF?81*#݉։ωȉ{tmf_XQJC<5.'  ڈӈ̈ňxqjc\UNG@92+$އׇЇɇ‡|ung`YRKD=6/(! ۆԆ͆Ɔyrkd]VOHA:3,% ߅؅хʅÅ}vohaZSLE>70)" ܄Մ΄DŽzsle^WPIB;4-& ك҃˃ă~wpib[TMF?81*#݂ւςȂ{tmf_XQJC<5.'  ځӁ́Łxqjc\UNG@92+$ހ׀Ѐɀ€|ung`YRKD=6/(! yrkd]VOHA:3,% ~~~~~~~~~~~~~~~~~~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~}}}}}}}}}}}}}}}}}}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}||||||||||||||||||~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||{{{{{{{{{{{{{{{{{{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{zzzzzzzzzzzzzzzzzzzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzyyyyyyyyyyyyyyyyyy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyxxxxxxxxxxxxxxxxxxxyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxwwwwwwwwwwwwwwwwww}wvwowhwawZwSwLwEw>w7w0w)w"www wwvvvvvvvvvvvvvvvvvvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvuuuuuuuuuuuuuuuuuu~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuutttttttttttttttttt{tttmtft_tXtQtJtCtp7p0p)p"ppp ppooooooooooooooooooozosoloeo^oWoPoIoBo;o4o-o&oooo oonnnnnnnnnnnnnnnnnn~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnmmmmmmmmmmmmmmmmmm{mtmmmfm_mXmQmJmCmi7i0i)i"iii iihhhhhhhhhhhhhhhhhhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhgggggggggggggggggg~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggffffffffffffffffff{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbaaaaaaaaaaaaaaaaaaazasalaea^aWaPaIaBa;a4a-a&aaaa aa``````````````````~`w`p`i`b`[`T`M`F`?`8`1`*`#``````__________________{_t_m_f___X_Q_J_C_<_5_._'_ ___ __^^^^^^^^^^^^^^^^^^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^]]]]]]]]]]]]]]]]]]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]\\\\\\\\\\\\\\\\\\\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\[[[[[[[[[[[[[[[[[[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ZZZZZZZZZZZZZZZZZZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZYYYYYYYYYYYYYYYYYY~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYXXXXXXXXXXXXXXXXXX{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTSSSSSSSSSSSSSSSSSSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSRRRRRRRRRRRRRRRRRR~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRQQQQQQQQQQQQQQQQQQ{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMLLLLLLLLLLLLLLLLLLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLKKKKKKKKKKKKKKKKKK~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKJJJJJJJJJJJJJJJJJJ{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFEEEEEEEEEEEEEEEEEEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEDDDDDDDDDDDDDDDDDD~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDCCCCCCCCCCCCCCCCCC{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??>>>>>>>>>>>>>>>>>>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>==================~=w=p=i=b=[=T=M=F=?=8=1=*=#======<<<<<<<<<<<<<<<<<<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<;;;;;;;;;;;;;;;;;;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;::::::::::::::::::|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::9999999999999999999y9r9k9d9]9V9O9H9A9:939,9%9999 99888888888888888888}8v8o8h8a8Z8S8L8E8>87808)8"888 887777777777777777777z7s7l7e7^7W7P7I7B7;747-7&7777 77666666666666666666~6w6p6i6b6[6T6M6F6?68616*6#666666555555555555555555{5t5m5f5_5X5Q5J5C5<555.5'5 555 554444444444444444444x4q4j4c4\4U4N4G4@49424+4$444444333333333333333333|3u3n3g3`3Y3R3K3D3=363/3(3!333 332222222222222222222y2r2k2d2]2V2O2H2A2:232,2%2222 22111111111111111111}1v1o1h1a1Z1S1L1E1>17101)1"111 110000000000000000000z0s0l0e0^0W0P0I0B0;040-0&0000 00//////////////////~/w/p/i/b/[/T/M/F/?/8/1/*/#//////..................{.t.m.f._.X.Q.J.C.<.5...'. ... ..-------------------x-q-j-c-\-U-N-G-@-9-2-+-$------,,,,,,,,,,,,,,,,,,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,+++++++++++++++++++y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++******************}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **)))))))))))))))))))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))((((((((((((((((((~(w(p(i(b([(T(M(F(?(8(1(*(#((((((''''''''''''''''''{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''&&&&&&&&&&&&&&&&&&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&%%%%%%%%%%%%%%%%%%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%$$$$$$$$$$$$$$$$$$$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$##################}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##"""""""""""""""""""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""!!!!!!!!!!!!!!!!!!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!                  { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)"                    z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !     yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ٿҿ˿Ŀ~wpib[TMF?81*#ݾ־ϾȾ{tmf_XQJC<5.'  ڽӽ̽Žxqjc\UNG@92+$޼׼мɼ¼|ung`YRKD=6/(! ۻԻͻƻyrkd]VOHA:3,% ߺغѺʺú}vohaZSLE>70)" ܹչιǹzsle^WPIB;4-& ٸҸ˸ĸ~wpib[TMF?81*#ݷַϷȷ{tmf_XQJC<5.'  ڶӶ̶Ŷxqjc\UNG@92+$޵׵еɵµ|ung`YRKD=6/(! ۴Դʹƴyrkd]VOHA:3,% ߳سѳʳó}vohaZSLE>70)" ܲղβDzzsle^WPIB;4-& ٱұ˱ı~wpib[TMF?81*#ݰְϰȰ{tmf_XQJC<5.'  گӯ̯ůxqjc\UNG@92+$ޮ׮Юɮ®|ung`YRKD=6/(! ۭԭͭƭyrkd]VOHA:3,% ߬جѬʬì}vohaZSLE>70)" ܫիΫǫzsle^WPIB;4-& ٪Ҫ˪Ī~wpib[TMF?81*#ݩ֩ϩȩ{tmf_XQJC<5.'  ڨӨ̨Ũxqjc\UNG@92+$ާקЧɧ§|ung`YRKD=6/(! ۦԦͦƦyrkd]VOHA:3,% ߥإѥʥå}vohaZSLE>70)" ܤդΤǤzsle^WPIB;4-& ٣ңˣģ~wpib[TMF?81*#ݢ֢ϢȢ{tmf_XQJC<5.'  ڡӡ̡šxqjc\UNG@92+$ޠנРɠ |ung`YRKD=6/(! ۟ԟ͟Ɵyrkd]VOHA:3,% ߞ؞ўʞÞ}vohaZSLE>70)" ܝ՝Νǝzsle^WPIB;4-& ٜҜ˜Ĝ~wpib[TMF?81*#ݛ֛ϛț{tmf_XQJC<5.'  ښӚ̚Śxqjc\UNG@92+$ޙיЙə™|ung`YRKD=6/(! ۘԘ͘Ƙyrkd]VOHA:3,% ߗؗїʗ×}vohaZSLE>70)" ܖՖΖǖzsle^WPIB;4-& ٕҕ˕ĕ~wpib[TMF?81*#ݔ֔ϔȔ{tmf_XQJC<5.'  ړӓ̓œxqjc\UNG@92+$ޒגВɒ’|ung`YRKD=6/(! ۑԑ͑Ƒyrkd]VOHA:3,% ߐؐѐʐÐ}vohaZSLE>70)" ܏ՏΏǏzsle^WPIB;4-& َҎˎĎ~wpib[TMF?81*#ݍ֍ύȍ{tmf_XQJC<5.'  ڌӌ̌Ōxqjc\UNG@92+$ދ׋Ћɋ‹|ung`YRKD=6/(! ۊԊ͊Ɗyrkd]VOHA:3,% ߉؉щʉÉ}vohaZSLE>70)" ܈ՈΈLjzsle^WPIB;4-& ه҇ˇć~wpib[TMF?81*#݆ֆφȆ{tmf_XQJC<5.'  څӅ̅Ņxqjc\UNG@92+$ބׄЄɄ„|ung`YRKD=6/(! ۃԃ̓ƃyrkd]VOHA:3,% ߂؂тʂÂ}vohaZSLE>70)" ܁Ձ΁ǁzsle^WPIB;4-& ـҀˀĀ~wpib[TMF?81*#{tmf_XQJC<5.'  ~~~~~~~~~~~~~~~~~~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~}}}}}}}}}}}}}}}}}}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}|||||||||||||||||||y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||{{{{{{{{{{{{{{{{{{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{zzzzzzzzzzzzzzzzzzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzyyyyyyyyyyyyyyyyyy~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyxxxxxxxxxxxxxxxxxx{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttssssssssssssssssssszssslses^sWsPsIsBs;s4s-s&ssss ssrrrrrrrrrrrrrrrrrr~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrqqqqqqqqqqqqqqqqqq{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmlllllllllllllllllllzlslllel^lWlPlIlBl;l4l-l&llll llkkkkkkkkkkkkkkkkkk~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkjjjjjjjjjjjjjjjjjj{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffeeeeeeeeeeeeeeeeeeezeseleee^eWePeIeBe;e4e-e&eeee eedddddddddddddddddd~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddcccccccccccccccccc{ctcmcfc_cXcQcJcCc_7_0_)_"___ __^^^^^^^^^^^^^^^^^^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^]]]]]]]]]]]]]]]]]]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]\\\\\\\\\\\\\\\\\\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\[[[[[[[[[[[[[[[[[[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ZZZZZZZZZZZZZZZZZZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZYYYYYYYYYYYYYYYYYYYyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYXXXXXXXXXXXXXXXXXX}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXWWWWWWWWWWWWWWWWWWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWVVVVVVVVVVVVVVVVVV~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVUUUUUUUUUUUUUUUUUU{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQPPPPPPPPPPPPPPPPPPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPOOOOOOOOOOOOOOOOOO~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOONNNNNNNNNNNNNNNNNN{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJIIIIIIIIIIIIIIIIIIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIHHHHHHHHHHHHHHHHHH~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHGGGGGGGGGGGGGGGGGG{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCBBBBBBBBBBBBBBBBBBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBAAAAAAAAAAAAAAAAAA~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAA@@@@@@@@@@@@@@@@@@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@???????????????????x?q?j?c?\?U?N?G?@?9?2?+?$??????>>>>>>>>>>>>>>>>>>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>===================y=r=k=d=]=V=O=H=A=:=3=,=%==== ==<<<<<<<<<<<<<<<<<<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<;;;;;;;;;;;;;;;;;;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;::::::::::::::::::~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::999999999999999999{9t9m9f9_9X9Q9J9C9<959.9'9 999 998888888888888888888x8q8j8c8\8U8N8G8@89828+8$888888777777777777777777|7u7n7g7`7Y7R7K7D7=767/7(7!777 776666666666666666666y6r6k6d6]6V6O6H6A6:636,6%6666 66555555555555555555}5v5o5h5a5Z5S5L5E5>57505)5"555 554444444444444444444z4s4l4e4^4W4P4I4B4;444-4&4444 44333333333333333333~3w3p3i3b3[3T3M3F3?38313*3#333333222222222222222222{2t2m2f2_2X2Q2J2C2<252.2'2 222 221111111111111111111x1q1j1c1\1U1N1G1@19121+1$111111000000000000000000|0u0n0g0`0Y0R0K0D0=060/0(0!000 00///////////////////y/r/k/d/]/V/O/H/A/:/3/,/%//// //..................}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..-------------------z-s-l-e-^-W-P-I-B-;-4---&---- --,,,,,,,,,,,,,,,,,,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,++++++++++++++++++{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++*******************x*q*j*c*\*U*N*G*@*9*2*+*$******))))))))))))))))))|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))(((((((((((((((((((y(r(k(d(](V(O(H(A(:(3(,(%(((( ((''''''''''''''''''}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''&&&&&&&&&&&&&&&&&&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&%%%%%%%%%%%%%%%%%%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%$$$$$$$$$$$$$$$$$${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$###################x#q#j#c#\#U#N#G#@#9#2#+#$######""""""""""""""""""|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""!!!!!!!!!!!!!!!!!!!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!                  } v o h a Z S L E > 7 0 ) "     zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$                  | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #      {tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! ۿԿͿƿyrkd]VOHA:3,% ߾ؾѾʾþ}vohaZSLE>70)" ܽսνǽzsle^WPIB;4-& ټҼ˼ļ~wpib[TMF?81*#ݻֻϻȻ{tmf_XQJC<5.'  ںӺ̺źxqjc\UNG@92+$޹׹йɹ¹|ung`YRKD=6/(! ۸Ը͸Ƹyrkd]VOHA:3,% ߷طѷʷ÷}vohaZSLE>70)" ܶնζǶzsle^WPIB;4-& ٵҵ˵ĵ~wpib[TMF?81*#ݴִϴȴ{tmf_XQJC<5.'  ڳӳ̳ųxqjc\UNG@92+$޲ײвɲ²|ung`YRKD=6/(! ۱ԱͱƱyrkd]VOHA:3,% ߰ذѰʰð}vohaZSLE>70)" ܯկίǯzsle^WPIB;4-& ٮҮˮĮ~wpib[TMF?81*#ݭ֭ϭȭ{tmf_XQJC<5.'  ڬӬ̬Ŭxqjc\UNG@92+$ޫ׫Ыɫ«|ung`YRKD=6/(! ۪Ԫͪƪyrkd]VOHA:3,% ߩةѩʩé}vohaZSLE>70)" ܨըΨǨzsle^WPIB;4-& ٧ҧ˧ħ~wpib[TMF?81*#ݦ֦ϦȦ{tmf_XQJC<5.'  ڥӥ̥ťxqjc\UNG@92+$ޤפФɤ¤|ung`YRKD=6/(! ۣԣͣƣyrkd]VOHA:3,% ߢآѢʢâ}vohaZSLE>70)" ܡաΡǡzsle^WPIB;4-& ٠ҠˠĠ~wpib[TMF?81*#ݟ֟ϟȟ{tmf_XQJC<5.'  ڞӞ̞Şxqjc\UNG@92+$ޝםНɝ|ung`YRKD=6/(! ۜԜ͜Ɯyrkd]VOHA:3,% ߛ؛ћʛÛ}vohaZSLE>70)" ܚ՚Κǚzsle^WPIB;4-& ٙҙ˙ę~wpib[TMF?81*#ݘ֘ϘȘ{tmf_XQJC<5.'  ڗӗ̗ŗxqjc\UNG@92+$ޖזЖɖ–|ung`YRKD=6/(! ەԕ͕ƕyrkd]VOHA:3,% ߔؔєʔÔ}vohaZSLE>70)" ܓՓΓǓzsle^WPIB;4-& ْҒ˒Ē~wpib[TMF?81*#ݑ֑ϑȑ{tmf_XQJC<5.'  ڐӐ̐Őxqjc\UNG@92+$ޏ׏Џɏ|ung`YRKD=6/(! ێԎ͎Ǝyrkd]VOHA:3,% ߍ؍эʍÍ}vohaZSLE>70)" ܌ՌΌnjzsle^WPIB;4-& ًҋˋċ~wpib[TMF?81*#݊֊ϊȊ{tmf_XQJC<5.'  ډӉ̉ʼnxqjc\UNG@92+$ވ׈ЈɈˆ|ung`YRKD=6/(! ۇԇ͇Ƈyrkd]VOHA:3,% ߆؆цʆÆ}vohaZSLE>70)" ܅Յ΅Džzsle^WPIB;4-& ل҄˄Ą~wpib[TMF?81*#݃փσȃ{tmf_XQJC<5.'  ڂӂ̂łxqjc\UNG@92+$ށׁЁɁ|ung`YRKD=6/(! ۀԀ̀ƀyrkd]VOHA:3,% }vohaZSLE>70)" ~~~~~~~~~~~~~~~~~~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~}}}}}}}}}}}}}}}}}}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}||||||||||||||||||{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||{{{{{{{{{{{{{{{{{{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{zzzzzzzzzzzzzzzzzz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzyyyyyyyyyyyyyyyyyyyyyrykydy]yVyOyHyAy:y3y,y%yyyy yyxxxxxxxxxxxxxxxxxx}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxwwwwwwwwwwwwwwwwwwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwvvvvvvvvvvvvvvvvvv~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvuuuuuuuuuuuuuuuuuu{utumufu_uXuQuJuCuq7q0q)q"qqq qqpppppppppppppppppppzpsplpep^pWpPpIpBp;p4p-p&pppp ppoooooooooooooooooo~owopoiobo[oToMoFo?o8o1o*o#oooooonnnnnnnnnnnnnnnnnn{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjiiiiiiiiiiiiiiiiiiizisiliei^iWiPiIiBi;i4i-i&iiii iihhhhhhhhhhhhhhhhhh~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhgggggggggggggggggg{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccbbbbbbbbbbbbbbbbbbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbaaaaaaaaaaaaaaaaaa~awapaiaba[aTaMaFa?a8a1a*a#aaaaaa``````````````````{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``___________________x_q_j_c_\_U_N_G_@_9_2_+_$______^^^^^^^^^^^^^^^^^^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^]]]]]]]]]]]]]]]]]]]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]\\\\\\\\\\\\\\\\\\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\[[[[[[[[[[[[[[[[[[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ZZZZZZZZZZZZZZZZZZ~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZYYYYYYYYYYYYYYYYYY{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUTTTTTTTTTTTTTTTTTTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTSSSSSSSSSSSSSSSSSS~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSRRRRRRRRRRRRRRRRRR{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNMMMMMMMMMMMMMMMMMMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMLLLLLLLLLLLLLLLLLL~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLKKKKKKKKKKKKKKKKKK{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGFFFFFFFFFFFFFFFFFFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFEEEEEEEEEEEEEEEEEE~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEDDDDDDDDDDDDDDDDDD{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@???????????????????z?s?l?e?^?W?P?I?B?;?4?-?&???? ??>>>>>>>>>>>>>>>>>>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>=================={=t=m=f=_=X=Q=J=C=<=5=.='= === ==<<<<<<<<<<<<<<<<<<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<;;;;;;;;;;;;;;;;;;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;:::::::::::::::::::y:r:k:d:]:V:O:H:A:::3:,:%:::: ::999999999999999999}9v9o9h9a9Z9S9L9E9>97909)9"999 998888888888888888888z8s8l8e8^8W8P8I8B8;848-8&8888 88777777777777777777~7w7p7i7b7[7T7M7F7?78717*7#777777666666666666666666{6t6m6f6_6X6Q6J6C6<656.6'6 666 665555555555555555555x5q5j5c5\5U5N5G5@59525+5$555555444444444444444444|4u4n4g4`4Y4R4K4D4=464/4(4!444 443333333333333333333y3r3k3d3]3V3O3H3A3:333,3%3333 33222222222222222222}2v2o2h2a2Z2S2L2E2>27202)2"222 221111111111111111111z1s1l1e1^1W1P1I1B1;141-1&1111 11000000000000000000~0w0p0i0b0[0T0M0F0?08010*0#000000//////////////////{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++*******************z*s*l*e*^*W*P*I*B*;*4*-*&**** **))))))))))))))))))~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))(((((((((((((((((({(t(m(f(_(X(Q(J(C(<(5(.('( ((( (('''''''''''''''''''x'q'j'c'\'U'N'G'@'9'2'+'$''''''&&&&&&&&&&&&&&&&&&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&%%%%%%%%%%%%%%%%%%%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%$$$$$$$$$$$$$$$$$$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$###################z#s#l#e#^#W#P#I#B#;#4#-#&#### ##""""""""""""""""""~"w"p"i"b"["T"M"F"?"8"1"*"#""""""!!!!!!!!!!!!!!!!!!{!t!m!f!_!X!Q!J!C!70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-&                   ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %      }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#ݿֿϿȿ{tmf_XQJC<5.'  ھӾ̾žxqjc\UNG@92+$޽׽нɽ½|ung`YRKD=6/(! ۼԼͼƼyrkd]VOHA:3,% ߻ػѻʻû}vohaZSLE>70)" ܺպκǺzsle^WPIB;4-& ٹҹ˹Ĺ~wpib[TMF?81*#ݸָϸȸ{tmf_XQJC<5.'  ڷӷ̷ŷxqjc\UNG@92+$޶׶жɶ¶|ung`YRKD=6/(! ۵Ե͵Ƶyrkd]VOHA:3,% ߴشѴʴô}vohaZSLE>70)" ܳճγdzzsle^WPIB;4-& ٲҲ˲IJ~wpib[TMF?81*#ݱֱϱȱ{tmf_XQJC<5.'  ڰӰ̰Űxqjc\UNG@92+$ޯׯЯɯ¯|ung`YRKD=6/(! ۮԮͮƮyrkd]VOHA:3,% ߭حѭʭí}vohaZSLE>70)" ܬլάǬzsle^WPIB;4-& ٫ҫ˫ī~wpib[TMF?81*#ݪ֪ϪȪ{tmf_XQJC<5.'  کө̩ũxqjc\UNG@92+$ިרШɨ¨|ung`YRKD=6/(! ۧԧͧƧyrkd]VOHA:3,% ߦئѦʦæ}vohaZSLE>70)" ܥեΥǥzsle^WPIB;4-& ٤ҤˤĤ~wpib[TMF?81*#ݣ֣ϣȣ{tmf_XQJC<5.'  ڢӢ̢Ţxqjc\UNG@92+$ޡסСɡ¡|ung`YRKD=6/(! ۠Ԡ͠Ơyrkd]VOHA:3,% ߟ؟џʟß}vohaZSLE>70)" ܞ՞ΞǞzsle^WPIB;4-& ٝҝ˝ĝ~wpib[TMF?81*#ݜ֜ϜȜ{tmf_XQJC<5.'  ڛӛ̛śxqjc\UNG@92+$ޚךКɚš|ung`YRKD=6/(! ۙԙ͙ƙyrkd]VOHA:3,% ߘؘјʘØ}vohaZSLE>70)" ܗ՗ΗǗzsle^WPIB;4-& ٖҖ˖Ė~wpib[TMF?81*#ݕ֕ϕȕ{tmf_XQJC<5.'  ڔӔ̔Ŕxqjc\UNG@92+$ޓדГɓ“|ung`YRKD=6/(! ےԒ͒ƒyrkd]VOHA:3,% ߑؑёʑÑ}vohaZSLE>70)" ܐՐΐǐzsle^WPIB;4-& ُҏˏď~wpib[TMF?81*#ݎ֎ώȎ{tmf_XQJC<5.'  ڍӍ̍ōxqjc\UNG@92+$ތ׌ЌɌŒ|ung`YRKD=6/(! ۋԋ͋Ƌyrkd]VOHA:3,% ߊ؊ъʊÊ}vohaZSLE>70)" ܉ՉΉljzsle^WPIB;4-& و҈ˈĈ~wpib[TMF?81*#݇ևχȇ{tmf_XQJC<5.'  چӆ̆ņxqjc\UNG@92+$ޅׅЅɅ…|ung`YRKD=6/(! ۄԄ̈́Ƅyrkd]VOHA:3,% ߃؃уʃÃ}vohaZSLE>70)" ܂Ղ΂ǂzsle^WPIB;4-& فҁˁā~wpib[TMF?81*#݀րπȀ{tmf_XQJC<5.'  xqjc\UNG@92+$~~~~~~~~~~~~~~~~~~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~}}}}}}}}}}}}}}}}}}}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}||||||||||||||||||}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||{{{{{{{{{{{{{{{{{{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{zzzzzzzzzzzzzzzzzz~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzyyyyyyyyyyyyyyyyyy{ytymyfy_yXyQyJyCyu7u0u)u"uuu uutttttttttttttttttttztstltet^tWtPtItBt;t4t-t&tttt ttssssssssssssssssss~swspsisbs[sTsMsFs?s8s1s*s#ssssssrrrrrrrrrrrrrrrrrr{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnmmmmmmmmmmmmmmmmmmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmllllllllllllllllll~lwlplilbl[lTlMlFl?l8l1l*l#llllllkkkkkkkkkkkkkkkkkk{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggfffffffffffffffffffzfsflfef^fWfPfIfBf;f4f-f&ffff ffeeeeeeeeeeeeeeeeee~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeedddddddddddddddddd{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``___________________z_s_l_e_^_W_P_I_B_;_4_-_&____ __^^^^^^^^^^^^^^^^^^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^]]]]]]]]]]]]]]]]]]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]\\\\\\\\\\\\\\\\\\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\[[[[[[[[[[[[[[[[[[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[ZZZZZZZZZZZZZZZZZZZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZYYYYYYYYYYYYYYYYYY}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYXXXXXXXXXXXXXXXXXXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXWWWWWWWWWWWWWWWWWW~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWVVVVVVVVVVVVVVVVVV{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRQQQQQQQQQQQQQQQQQQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQPPPPPPPPPPPPPPPPPP~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPOOOOOOOOOOOOOOOOOO{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKJJJJJJJJJJJJJJJJJJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJIIIIIIIIIIIIIIIIII~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIHHHHHHHHHHHHHHHHHH{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDCCCCCCCCCCCCCCCCCCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCBBBBBBBBBBBBBBBBBB~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBAAAAAAAAAAAAAAAAAA{AtAmAfA_AXAQAJACA>>>>>>>>>>>>>>>>>>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>==================}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==<<<<<<<<<<<<<<<<<<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<;;;;;;;;;;;;;;;;;;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;::::::::::::::::::{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::9999999999999999999x9q9j9c9\9U9N9G9@99929+9$999999888888888888888888|8u8n8g8`8Y8R8K8D8=868/8(8!888 887777777777777777777y7r7k7d7]7V7O7H7A7:737,7%7777 77666666666666666666}6v6o6h6a6Z6S6L6E6>67606)6"666 665555555555555555555z5s5l5e5^5W5P5I5B5;545-5&5555 55444444444444444444~4w4p4i4b4[4T4M4F4?48414*4#444444333333333333333333{3t3m3f3_3X3Q3J3C3<353.3'3 333 332222222222222222222x2q2j2c2\2U2N2G2@29222+2$222222111111111111111111|1u1n1g1`1Y1R1K1D1=161/1(1!111 110000000000000000000y0r0k0d0]0V0O0H0A0:030,0%0000 00//////////////////}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //...................z.s.l.e.^.W.P.I.B.;.4.-.&.... ..------------------~-w-p-i-b-[-T-M-F-?-8-1-*-#------,,,,,,,,,,,,,,,,,,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,+++++++++++++++++++x+q+j+c+\+U+N+G+@+9+2+++$++++++******************|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **)))))))))))))))))))y)r)k)d)])V)O)H)A):)3),)%)))) ))((((((((((((((((((}(v(o(h(a(Z(S(L(E(>(7(0()("((( (('''''''''''''''''''z's'l'e'^'W'P'I'B';'4'-'&'''' ''&&&&&&&&&&&&&&&&&&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&%%%%%%%%%%%%%%%%%%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%$$$$$$$$$$$$$$$$$$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$##################|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##"""""""""""""""""""y"r"k"d"]"V"O"H"A":"3","%"""" ""!!!!!!!!!!!!!!!!!!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!                   z s l e ^ W P I B ; 4 - &      ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '      xqjc\UNG@92+$|ung`YRKD=6/(! yrkd]VOHA:3,% }vohaZSLE>70)" zsle^WPIB;4-& ~wpib[TMF?81*#{tmf_XQJC<5.'  xqjc\UNG@92+$|ung`YRKD=6/(!                    y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %          ߿ ؿ ѿ ʿ ÿ          } v o h a Z S L E > 7 0 ) "          ܾ վ ξ Ǿ           z s l e ^ W P I B ; 4 - &           ٽ ҽ ˽ Ľ          ~ w p i b [ T M F ? 8 1 * #          ݼ ּ ϼ ȼ           { t m f _ X Q J C < 5 . '           ڻ ӻ ̻ Ż           x q j c \ U N G @ 9 2 + $          ޺ ׺ к ɺ º          | u n g ` Y R K D = 6 / ( !          ۹ Թ ͹ ƹ           y r k d ] V O H A : 3 , %          ߸ ظ Ѹ ʸ ø          } v o h a Z S L E > 7 0 ) "          ܷ շ η Ƿ           z s l e ^ W P I B ; 4 - &           ٶ Ҷ ˶ Ķ          ~ w p i b [ T M F ? 8 1 * #          ݵ ֵ ϵ ȵ           { t m f _ X Q J C < 5 . '           ڴ Ӵ ̴ Ŵ           x q j c \ U N G @ 9 2 + $          ޳ ׳ г ɳ ³          | u n g ` Y R K D = 6 / ( !          ۲ Բ Ͳ Ʋ           y r k d ] V O H A : 3 , %          ߱ ر ѱ ʱ ñ          } v o h a Z S L E > 7 0 ) "          ܰ հ ΰ ǰ           z s l e ^ W P I B ; 4 - &           ٯ ү ˯ į          ~ w p i b [ T M F ? 8 1 * #          ݮ ֮ Ϯ Ȯ           { t m f _ X Q J C < 5 . '           ڭ ӭ ̭ ŭ           x q j c \ U N G @ 9 2 + $          ެ ׬ Ь ɬ ¬          | u n g ` Y R K D = 6 / ( !          ۫ ԫ ͫ ƫ           y r k d ] V O H A : 3 , %          ߪ ت Ѫ ʪ ê          } v o h a Z S L E > 7 0 ) "          ܩ թ Ω ǩ           z s l e ^ W P I B ; 4 - &           ٨ Ҩ ˨ Ĩ          ~ w p i b [ T M F ? 8 1 * #          ݧ ֧ ϧ ȧ           { t m f _ X Q J C < 5 . '           ڦ Ӧ ̦ Ŧ           x q j c \ U N G @ 9 2 + $          ޥ ץ Х ɥ ¥          | u n g ` Y R K D = 6 / ( !          ۤ Ԥ ͤ Ƥ           y r k d ] V O H A : 3 , %          ߣ أ ѣ ʣ ã          } v o h a Z S L E > 7 0 ) "          ܢ բ ΢ Ǣ           z s l e ^ W P I B ; 4 - &           ١ ҡ ˡ ġ          ~ w p i b [ T M F ? 8 1 * #          ݠ ֠ Ϡ Ƞ           { t m f _ X Q J C < 5 . '           ڟ ӟ ̟ ş           x q j c \ U N G @ 9 2 + $          ޞ מ О ɞ ž          | u n g ` Y R K D = 6 / ( !          ۝ ԝ ͝ Ɲ           y r k d ] V O H A : 3 , %          ߜ ؜ ќ ʜ Ü          } v o h a Z S L E > 7 0 ) "          ܛ ՛ Λ Ǜ           z s l e ^ W P I B ; 4 - &           ٚ Қ ˚ Ě          ~ w p i b [ T M F ? 8 1 * #          ݙ ֙ ϙ ș           { t m f _ X Q J C < 5 . '           ژ Ә ̘ Ř           x q j c \ U N G @ 9 2 + $          ޗ ח З ɗ —          | u n g ` Y R K D = 6 / ( !          ۖ Ԗ ͖ Ɩ           y r k d ] V O H A : 3 , %          ߕ ؕ ѕ ʕ Õ          } v o h a Z S L E > 7 0 ) "          ܔ Ք Δ ǔ           z s l e ^ W P I B ; 4 - &           ٓ ғ ˓ ē          ~ w p i b [ T M F ? 8 1 * #          ݒ ֒ ϒ Ȓ           { t m f _ X Q J C < 5 . '           ڑ ӑ ̑ ő           x q j c \ U N G @ 9 2 + $          ސ א А ɐ           | u n g ` Y R K D = 6 / ( !          ۏ ԏ ͏ Ə           y r k d ] V O H A : 3 , %          ߎ ؎ ю ʎ Î          } v o h a Z S L E > 7 0 ) "          ܍ Ս ΍ Ǎ           z s l e ^ W P I B ; 4 - &           ٌ Ҍ ˌ Č          ~ w p i b [ T M F ? 8 1 * #          ݋ ֋ ϋ ȋ           { t m f _ X Q J C < 5 . '           ڊ ӊ ̊ Ŋ           x q j c \ U N G @ 9 2 + $          މ ׉ Љ ɉ ‰          | u n g ` Y R K D = 6 / ( !          ۈ Ԉ ͈ ƈ           y r k d ] V O H A : 3 , %          ߇ ؇ ч ʇ Ç          } v o h a Z S L E > 7 0 ) "          ܆ Ն Ά dž           z s l e ^ W P I B ; 4 - &           م ҅ ˅ ą          ~ w p i b [ T M F ? 8 1 * #          ݄ ք τ Ȅ           { t m f _ X Q J C < 5 . '           ڃ Ӄ ̃ Ń           x q j c \ U N G @ 9 2 + $          ނ ׂ Ђ ɂ ‚          | u n g ` Y R K D = 6 / ( !          ہ ԁ ́ Ɓ           y r k d ] V O H A : 3 , %          ߀ ؀ р ʀ À          } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &       ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~~ w~ p~ i~ b~ [~ T~ M~ F~ ?~ 8~ 1~ *~ #~ ~ ~ ~ ~ ~ } } } } } } } } } } } } } } } } } } {} t} m} f} _} X} Q} J} C} <} 5} .} '}  } } }  } } | | | | | | | | | | | | | | | | | | | x| q| j| c| \| U| N| G| @| 9| 2| +| $| | | | | | { { { { { { { { { { { { { { { { { { |{ u{ n{ g{ `{ Y{ R{ K{ D{ ={ 6{ /{ ({ !{ { {  { { z z z z z z z z z z z z z z z z z z z yz rz kz dz ]z Vz Oz Hz Az :z 3z ,z %z z z z  z z y y y y y y y y y y y y y y y y y y }y vy oy hy ay Zy Sy Ly Ey >y 7y 0y )y "y y y  y y x x x x x x x x x x x x x x x x x x x zx sx lx ex ^x Wx Px Ix Bx ;x 4x -x &x x x x  x x w w w w w w w w w w w w w w w w w w ~w ww pw iw bw [w Tw Mw Fw ?w 8w 1w *w #w w w w w w v v v v v v v v v v v v v v v v v v {v tv mv fv _v Xv Qv Jv Cv r 7r 0r )r "r r r  r r q q q q q q q q q q q q q q q q q q q zq sq lq eq ^q Wq Pq Iq Bq ;q 4q -q &q q q q  q q p p p p p p p p p p p p p p p p p p ~p wp pp ip bp [p Tp Mp Fp ?p 8p 1p *p #p p p p p p o o o o o o o o o o o o o o o o o o {o to mo fo _o Xo Qo Jo Co k 7k 0k )k "k k k  k k j j j j j j j j j j j j j j j j j j j zj sj lj ej ^j Wj Pj Ij Bj ;j 4j -j &j j j j  j j i i i i i i i i i i i i i i i i i i ~i wi pi ii bi [i Ti Mi Fi ?i 8i 1i *i #i i i i i i h h h h h h h h h h h h h h h h h h {h th mh fh _h Xh Qh Jh Ch d 7d 0d )d "d d d  d d c c c c c c c c c c c c c c c c c c c zc sc lc ec ^c Wc Pc Ic Bc ;c 4c -c &c c c c  c c b b b b b b b b b b b b b b b b b b ~b wb pb ib bb [b Tb Mb Fb ?b 8b 1b *b #b b b b b b a a a a a a a a a a a a a a a a a a {a ta ma fa _a Xa Qa Ja Ca ] 7] 0] )] "] ] ]  ] ] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ z\ s\ l\ e\ ^\ W\ P\ I\ B\ ;\ 4\ -\ &\ \ \ \  \ \ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ ~[ w[ p[ i[ b[ [[ T[ M[ F[ ?[ 8[ 1[ *[ #[ [ [ [ [ [ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z {Z tZ mZ fZ _Z XZ QZ JZ CZ V 7V 0V )V "V V V  V V U U U U U U U U U U U U U U U U U U U zU sU lU eU ^U WU PU IU BU ;U 4U -U &U U U U  U U T T T T T T T T T T T T T T T T T T ~T wT pT iT bT [T TT MT FT ?T 8T 1T *T #T T T T T T S S S S S S S S S S S S S S S S S S {S tS mS fS _S XS QS JS CS O 7O 0O )O "O O O  O O N N N N N N N N N N N N N N N N N N N zN sN lN eN ^N WN PN IN BN ;N 4N -N &N N N N  N N M M M M M M M M M M M M M M M M M M ~M wM pM iM bM [M TM MM FM ?M 8M 1M *M #M M M M M M L L L L L L L L L L L L L L L L L L {L tL mL fL _L XL QL JL CL H 7H 0H )H "H H H  H H G G G G G G G G G G G G G G G G G G G zG sG lG eG ^G WG PG IG BG ;G 4G -G &G G G G  G G F F F F F F F F F F F F F F F F F F ~F wF pF iF bF [F TF MF FF ?F 8F 1F *F #F F F F F F E E E E E E E E E E E E E E E E E E {E tE mE fE _E XE QE JE CE A 7A 0A )A "A A A  A A @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ z@ s@ l@ e@ ^@ W@ P@ I@ B@ ;@ 4@ -@ &@ @ @ @  @ @ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ~? w? p? i? b? [? T? M? F? ?? 8? 1? *? #? ? ? ? ? ? > > > > > > > > > > > > > > > > > > {> t> m> f> _> X> Q> J> C> <> 5> .> '>  > > >  > > = = = = = = = = = = = = = = = = = = = x= q= j= c= \= U= N= G= @= 9= 2= += $= = = = = = < < < < < < < < < < < < < < < < < < |< u< n< g< `< Y< R< K< D< =< 6< /< (< !< < <  < < ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; y; r; k; d; ]; V; O; H; A; :; 3; ,; %; ; ; ;  ; ; : : : : : : : : : : : : : : : : : : }: v: o: h: a: Z: S: L: E: >: 7: 0: ): ": : :  : : 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 z9 s9 l9 e9 ^9 W9 P9 I9 B9 ;9 49 -9 &9 9 9 9  9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ~8 w8 p8 i8 b8 [8 T8 M8 F8 ?8 88 18 *8 #8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 {7 t7 m7 f7 _7 X7 Q7 J7 C7 <7 57 .7 '7  7 7 7  7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 x6 q6 j6 c6 \6 U6 N6 G6 @6 96 26 +6 $6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 |5 u5 n5 g5 `5 Y5 R5 K5 D5 =5 65 /5 (5 !5 5 5  5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 y4 r4 k4 d4 ]4 V4 O4 H4 A4 :4 34 ,4 %4 4 4 4  4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 }3 v3 o3 h3 a3 Z3 S3 L3 E3 >3 73 03 )3 "3 3 3  3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 z2 s2 l2 e2 ^2 W2 P2 I2 B2 ;2 42 -2 &2 2 2 2  2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ~1 w1 p1 i1 b1 [1 T1 M1 F1 ?1 81 11 *1 #1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 {0 t0 m0 f0 _0 X0 Q0 J0 C0 <0 50 .0 '0  0 0 0  0 0 / / / / / / / / / / / / / / / / / / / x/ q/ j/ c/ \/ U/ N/ G/ @/ 9/ 2/ +/ $/ / / / / / . . . . . . . . . . . . . . . . . . |. u. n. g. `. Y. R. K. D. =. 6. /. (. !. . .  . . - - - - - - - - - - - - - - - - - - - y- r- k- d- ]- V- O- H- A- :- 3- ,- %- - - -  - - , , , , , , , , , , , , , , , , , , }, v, o, h, a, Z, S, L, E, >, 7, 0, ), ", , ,  , , + + + + + + + + + + + + + + + + + + + z+ s+ l+ e+ ^+ W+ P+ I+ B+ ;+ 4+ -+ &+ + + +  + + * * * * * * * * * * * * * * * * * * ~* w* p* i* b* [* T* M* F* ?* 8* 1* ** #* * * * * * ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) {) t) m) f) _) X) Q) J) C) <) 5) .) ')  ) ) )  ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( x( q( j( c( \( U( N( G( @( 9( 2( +( $( ( ( ( ( ( ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' |' u' n' g' `' Y' R' K' D' =' 6' /' (' !' ' '  ' ' & & & & & & & & & & & & & & & & & & & y& r& k& d& ]& V& O& H& A& :& 3& ,& %& & & &  & & % % % % % % % % % % % % % % % % % % }% v% o% h% a% Z% S% L% E% >% 7% 0% )% "% % %  % % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ z$ s$ l$ e$ ^$ W$ P$ I$ B$ ;$ 4$ -$ &$ $ $ $  $ $ # # # # # # # # # # # # # # # # # # ~# w# p# i# b# [# T# M# F# ?# 8# 1# *# ## # # # # # " " " " " " " " " " " " " " " " " " {" t" m" f" _" X" Q" J" C" <" 5" ." '"  " " "  " " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! x! q! j! c! \! U! N! G! @! 9! 2! +! $! ! ! ! ! !                   | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                         y r k d ] V O H A : 3 , %                         } v o h a Z S L E > 7 0 ) "                         z s l e ^ W P I B ; 4 - &                         ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '                         x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !                        y r k d ] V O H A : 3 , %                        } v o h a Z S L E > 7 0 ) "                        z s l e ^ W P I B ; 4 - &                        ~ w p i b [ T M F ? 8 1 * #                        { t m f _ X Q J C < 5 . '           ڿ ӿ ̿ ſ           x q j c \ U N G @ 9 2 + $          ޾ ׾ о ɾ ¾          | u n g ` Y R K D = 6 / ( !          ۽ Խ ͽ ƽ           y r k d ] V O H A : 3 , %          ߼ ؼ Ѽ ʼ ü          } v o h a Z S L E > 7 0 ) "          ܻ ջ λ ǻ           z s l e ^ W P I B ; 4 - &           ٺ Һ ˺ ĺ          ~ w p i b [ T M F ? 8 1 * #          ݹ ֹ Ϲ ȹ           { t m f _ X Q J C < 5 . '           ڸ Ӹ ̸ Ÿ           x q j c \ U N G @ 9 2 + $          ޷ ׷ з ɷ ·          | u n g ` Y R K D = 6 / ( !          ۶ Զ Ͷ ƶ           y r k d ] V O H A : 3 , %          ߵ ص ѵ ʵ õ          } v o h a Z S L E > 7 0 ) "          ܴ մ δ Ǵ           z s l e ^ W P I B ; 4 - &           ٳ ҳ ˳ ij          ~ w p i b [ T M F ? 8 1 * #          ݲ ֲ ϲ Ȳ           { t m f _ X Q J C < 5 . '           ڱ ӱ ̱ ű           x q j c \ U N G @ 9 2 + $          ް װ а ɰ °          | u n g ` Y R K D = 6 / ( !          ۯ ԯ ͯ Ư           y r k d ] V O H A : 3 , %          ߮ خ Ѯ ʮ î          } v o h a Z S L E > 7 0 ) "          ܭ խ έ ǭ           z s l e ^ W P I B ; 4 - &           ٬ Ҭ ˬ Ĭ          ~ w p i b [ T M F ? 8 1 * #          ݫ ֫ ϫ ȫ           { t m f _ X Q J C < 5 . '           ڪ Ӫ ̪ Ū           x q j c \ U N G @ 9 2 + $          ީ ש Щ ɩ ©          | u n g ` Y R K D = 6 / ( !          ۨ Ԩ ͨ ƨ           y r k d ] V O H A : 3 , %          ߧ ا ѧ ʧ ç          } v o h a Z S L E > 7 0 ) "          ܦ զ Φ Ǧ           z s l e ^ W P I B ; 4 - &           ٥ ҥ ˥ ĥ          ~ w p i b [ T M F ? 8 1 * #          ݤ ֤ Ϥ Ȥ           { t m f _ X Q J C < 5 . '           ڣ ӣ ̣ ţ           x q j c \ U N G @ 9 2 + $          ޢ ע Т ɢ ¢          | u n g ` Y R K D = 6 / ( !          ۡ ԡ ͡ ơ           y r k d ] V O H A : 3 , %          ߠ ؠ Ѡ ʠ à          } v o h a Z S L E > 7 0 ) "          ܟ ՟ Ο ǟ           z s l e ^ W P I B ; 4 - &           ٞ Ҟ ˞ Ğ          ~ w p i b [ T M F ? 8 1 * #          ݝ ֝ ϝ ȝ           { t m f _ X Q J C < 5 . '           ڜ Ӝ ̜ Ŝ           x q j c \ U N G @ 9 2 + $          ޛ כ Л ɛ ›          | u n g ` Y R K D = 6 / ( !          ۚ Ԛ ͚ ƚ           y r k d ] V O H A : 3 , %          ߙ ؙ љ ʙ Ù          } v o h a Z S L E > 7 0 ) "          ܘ ՘ Θ ǘ           z s l e ^ W P I B ; 4 - &           ٗ җ ˗ ė          ~ w p i b [ T M F ? 8 1 * #          ݖ ֖ ϖ Ȗ           { t m f _ X Q J C < 5 . '           ڕ ӕ ̕ ŕ           x q j c \ U N G @ 9 2 + $          ޔ ה Д ɔ ”          | u n g ` Y R K D = 6 / ( !          ۓ ԓ ͓ Ɠ           y r k d ] V O H A : 3 , %          ߒ ؒ ђ ʒ Ò          } v o h a Z S L E > 7 0 ) "          ܑ Ց Α Ǒ           z s l e ^ W P I B ; 4 - &           ِ Ґ ː Đ          ~ w p i b [ T M F ? 8 1 * #          ݏ ֏ Ϗ ȏ           { t m f _ X Q J C < 5 . '           ڎ ӎ ̎ Ŏ           x q j c \ U N G @ 9 2 + $          ލ ׍ Ѝ ɍ           | u n g ` Y R K D = 6 / ( !          ی Ԍ ͌ ƌ           y r k d ] V O H A : 3 , %          ߋ ؋ ы ʋ Ë          } v o h a Z S L E > 7 0 ) "          ܊ Պ Ί NJ           z s l e ^ W P I B ; 4 - &           ى ҉ ˉ ĉ          ~ w p i b [ T M F ? 8 1 * #          ݈ ֈ ψ Ȉ           { t m f _ X Q J C < 5 . '           ڇ Ӈ ̇ Ň           x q j c \ U N G @ 9 2 + $          ކ ׆ І Ɇ †          | u n g ` Y R K D = 6 / ( !          ۅ ԅ ͅ ƅ           y r k d ] V O H A : 3 , %          ߄ ؄ ф ʄ Ä          } v o h a Z S L E > 7 0 ) "          ܃ Ճ ΃ ǃ           z s l e ^ W P I B ; 4 - &           ق ҂ ˂ Ă          ~ w p i b [ T M F ? 8 1 * #          ݁ ց ρ ȁ           { t m f _ X Q J C < 5 . '           ڀ Ӏ ̀ ŀ           x q j c \ U N G @ 9 2 + $                        | u n g ` Y R K D = 6 / ( !      ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ y~ r~ k~ d~ ]~ V~ O~ H~ A~ :~ 3~ ,~ %~ ~ ~ ~  ~ ~ } } } } } } } } } } } } } } } } } } }} v} o} h} a} Z} S} L} E} >} 7} 0} )} "} } }  } } | | | | | | | | | | | | | | | | | | | z| s| l| e| ^| W| P| I| B| ;| 4| -| &| | | |  | | { { { { { { { { { { { { { { { { { { ~{ w{ p{ i{ b{ [{ T{ M{ F{ ?{ 8{ 1{ *{ #{ { { { { { z z z z z z z z z z z z z z z z z z {z tz mz fz _z Xz Qz Jz Cz v 7v 0v )v "v v v  v v u u u u u u u u u u u u u u u u u u u zu su lu eu ^u Wu Pu Iu Bu ;u 4u -u &u u u u  u u t t t t t t t t t t t t t t t t t t ~t wt pt it bt [t Tt Mt Ft ?t 8t 1t *t #t t t t t t s s s s s s s s s s s s s s s s s s {s ts ms fs _s Xs Qs Js Cs o 7o 0o )o "o o o  o o n n n n n n n n n n n n n n n n n n n zn sn ln en ^n Wn Pn In Bn ;n 4n -n &n n n n  n n m m m m m m m m m m m m m m m m m m ~m wm pm im bm [m Tm Mm Fm ?m 8m 1m *m #m m m m m m l l l l l l l l l l l l l l l l l l {l tl ml fl _l Xl Ql Jl Cl h 7h 0h )h "h h h  h h g g g g g g g g g g g g g g g g g g g zg sg lg eg ^g Wg Pg Ig Bg ;g 4g -g &g g g g  g g f f f f f f f f f f f f f f f f f f ~f wf pf if bf [f Tf Mf Ff ?f 8f 1f *f #f f f f f f e e e e e e e e e e e e e e e e e e {e te me fe _e Xe Qe Je Ce a 7a 0a )a "a a a  a a ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` z` s` l` e` ^` W` P` I` B` ;` 4` -` &` ` ` `  ` ` _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ~_ w_ p_ i_ b_ [_ T_ M_ F_ ?_ 8_ 1_ *_ #_ _ _ _ _ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ {^ t^ m^ f^ _^ X^ Q^ J^ C^ <^ 5^ .^ '^  ^ ^ ^  ^ ^ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] x] q] j] c] \] U] N] G] @] 9] 2] +] $] ] ] ] ] ] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ |\ u\ n\ g\ `\ Y\ R\ K\ D\ =\ 6\ /\ (\ !\ \ \  \ \ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ y[ r[ k[ d[ ][ V[ O[ H[ A[ :[ 3[ ,[ %[ [ [ [  [ [ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z }Z vZ oZ hZ aZ ZZ SZ LZ EZ >Z 7Z 0Z )Z "Z Z Z  Z Z Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y zY sY lY eY ^Y WY PY IY BY ;Y 4Y -Y &Y Y Y Y  Y Y X X X X X X X X X X X X X X X X X X ~X wX pX iX bX [X TX MX FX ?X 8X 1X *X #X X X X X X W W W W W W W W W W W W W W W W W W {W tW mW fW _W XW QW JW CW S 7S 0S )S "S S S  S S R R R R R R R R R R R R R R R R R R R zR sR lR eR ^R WR PR IR BR ;R 4R -R &R R R R  R R Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ~Q wQ pQ iQ bQ [Q TQ MQ FQ ?Q 8Q 1Q *Q #Q Q Q Q Q Q P P P P P P P P P P P P P P P P P P {P tP mP fP _P XP QP JP CP