diff --git a/exempi.spec b/exempi.spec index 3a8e3fc..c5626fe 100644 --- a/exempi.spec +++ b/exempi.spec @@ -5,7 +5,7 @@ Summary: Library for easy parsing of XMP metadata Name: exempi Version: 2.6.0 -Release: 0.1.%{date}git%{shortcommit}%{?dist} +Release: 0.2.%{date}git%{shortcommit}%{?dist} License: BSD URL: http://libopenraw.freedesktop.org/wiki/Exempi Source0: https://gitlab.freedesktop.org/libopenraw/%{name}/-/archive/%{commit}/%{name}-%{commit}.tar.bz2 @@ -73,6 +73,10 @@ rm -rf %{buildroot}%{_libdir}/*.a %{_libdir}/pkgconfig/*.pc %changelog +* Wed Nov 03 2021 Nikola Forró - 2.6.0-0.2.20211007gite23c213 +- Add modified upstream test suite as a gating test + Related #1989405 + * Wed Oct 20 2021 Nikola Forró - 2.6.0-0.1.20211007gite23c213 - Update to (unreleased) version 2.6.0 to resolve licensing issues Resolves #1989405 diff --git a/gating.yaml b/gating.yaml index b6c5cde..648918d 100644 --- a/gating.yaml +++ b/gating.yaml @@ -3,4 +3,4 @@ product_versions: - rhel-9 decision_context: osci_compose_gate rules: - - !PassingTestCaseRule {test_case_name: manual.sst_desktop.dvd.sanity} + - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional} diff --git a/tests/exempi/Makefile.am b/tests/exempi/Makefile.am new file mode 100644 index 0000000..eceec14 --- /dev/null +++ b/tests/exempi/Makefile.am @@ -0,0 +1,4 @@ +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = exempi +DIST_SUBDIRS = exempi diff --git a/tests/exempi/README b/tests/exempi/README new file mode 100644 index 0000000..acf0d25 --- /dev/null +++ b/tests/exempi/README @@ -0,0 +1,7 @@ +exempi test suite modified to run against installed exempi + +All files except the following are taken unmodified from upstream tarball: + +configure.ac +Makefile.am +exempi/Makefile.am diff --git a/tests/exempi/configure.ac b/tests/exempi/configure.ac new file mode 100644 index 0000000..ca7d62a --- /dev/null +++ b/tests/exempi/configure.ac @@ -0,0 +1,41 @@ +AC_PREREQ(2.50) +AC_INIT(exempi-tests,0.1) +AM_INIT_AUTOMAKE([foreign dist-bzip2 subdir-objects]) +AM_MAINTAINER_MODE +m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])]) +AM_SILENT_RULES([yes]) + +EXEMPI_MAJOR_VERSION=2.0 +AC_SUBST(EXEMPI_MAJOR_VERSION) + +EXEMPI_INCLUDE_BASE=exempi-$EXEMPI_MAJOR_VERSION +AC_SUBST(EXEMPI_INCLUDE_BASE) + +AC_CONFIG_MACRO_DIR([m4]) + +AC_PROG_CC +AC_PROG_CXX +AC_PROG_LIBTOOL +AX_CXX_COMPILE_STDCXX_11(noext,mandatory) + +AC_C_BIGENDIAN +AC_DEFINE(CHECKED_ENDIANNESS) + +ENABLE_UNITTEST=yes +BOOST_REQUIRE([1.48.0]) +BOOST_TEST([mt-s]) + +AC_DEFINE(UNIX_ENV, [1]) + +AM_CONDITIONAL(WITH_UNIT_TEST, test x$ENABLE_UNITTEST = xyes) + +VALGRIND= +AC_SUBST(VALGRIND) + +AC_LANG_CPLUSPLUS +AC_LANG_COMPILER_REQUIRE + +AC_OUTPUT([ +Makefile +exempi/Makefile +]) diff --git a/tests/exempi/exempi/Makefile.am b/tests/exempi/exempi/Makefile.am new file mode 100644 index 0000000..d45c130 --- /dev/null +++ b/tests/exempi/exempi/Makefile.am @@ -0,0 +1,99 @@ +AUTOMAKE_OPTIONS = parallel-tests +TEST_EXTENSIONS = .sh + +if WITH_UNIT_TEST +check_PROGRAMS = testexempicore testserialise \ + testwritenewprop \ + testtiffleak testxmpfiles testxmpfileswrite \ + testparse testiterator testinit testfdo18635\ + testfdo83313 testcpp testwebp \ + testxmpformat \ + $(NULL) +TESTS = testinit testexempicore testserialise \ + testwritenewprop \ + testtiffleak testxmpfiles testxmpfileswrite \ + testparse testiterator testfdo18635 testfdo83313 testcpp testwebp \ + testxmpformat \ + $(NULL) +TESTS_ENVIRONMENT = TEST_DIR=$(srcdir)/tests BOOST_TEST_CATCH_SYSTEM_ERRORS=no VALGRIND="$(VALGRIND)" +LOG_COMPILER = $(VALGRIND) +endif + +check_DATA = tests/test1.xmp tests/fdo18635.jpg tests/fdo83313.jpg + +noinst_HEADERS = tests/utils.h + +EXTRA_DIST = $(check_DATA) $(check_SCRIPTS) +CLEANFILES = test.jpg test.webp + +AM_CXXFLAGS = @BOOST_CPPFLAGS@ + +testinit_SOURCES = tests/testinit.cpp tests/utils.cpp +testinit_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testinit_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testinit_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testexempicore_SOURCES = tests/test-exempi-core.cpp tests/utils.cpp +testexempicore_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testexempicore_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testexempicore_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testserialise_SOURCES = tests/test-serialise.cpp tests/utils.cpp +testserialise_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testserialise_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testserialise_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testwritenewprop_SOURCES = tests/test-write-new-prop.cpp tests/utils.cpp +testwritenewprop_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testwritenewprop_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testwritenewprop_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testtiffleak_SOURCES = tests/test-tiff-leak.cpp tests/utils.cpp +testtiffleak_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testtiffleak_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testtiffleak_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testxmpfiles_SOURCES = tests/test-xmpfiles.cpp tests/utils.cpp +testxmpfiles_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testxmpfiles_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testxmpfiles_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testxmpfileswrite_SOURCES = tests/test-xmpfiles-write.cpp tests/utils.cpp +testxmpfileswrite_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testxmpfileswrite_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testxmpfileswrite_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testparse_SOURCES = tests/testparse.cpp tests/utils.cpp +testparse_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testparse_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testparse_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testiterator_SOURCES = tests/test-iterator.cpp tests/utils.cpp +testiterator_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testiterator_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testiterator_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testfdo18635_SOURCES = tests/test-bgo.cpp tests/utils.cpp +testfdo18635_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testfdo18635_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testfdo18635_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testfdo83313_SOURCES = tests/test-fdo83313.cpp tests/utils.cpp +testfdo83313_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testfdo83313_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testfdo83313_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testcpp_SOURCES = tests/testcpp.cpp tests/utils.cpp +testcpp_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testcpp_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testcpp_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testwebp_SOURCES = tests/test-webp.cpp tests/utils.cpp +testwebp_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testwebp_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testwebp_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi + +testxmpformat_SOURCES = tests/test-xmpformat.cpp +testxmpformat_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ +testxmpformat_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ +testxmpformat_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi diff --git a/tests/exempi/exempi/tests/fdo18635.jpg b/tests/exempi/exempi/tests/fdo18635.jpg new file mode 100644 index 0000000..0f8f38f Binary files /dev/null and b/tests/exempi/exempi/tests/fdo18635.jpg differ diff --git a/tests/exempi/exempi/tests/fdo83313.jpg b/tests/exempi/exempi/tests/fdo83313.jpg new file mode 100644 index 0000000..59c5c43 Binary files /dev/null and b/tests/exempi/exempi/tests/fdo83313.jpg differ diff --git a/tests/exempi/exempi/tests/test-bgo.cpp b/tests/exempi/exempi/tests/test-bgo.cpp new file mode 100644 index 0000000..1919780 --- /dev/null +++ b/tests/exempi/exempi/tests/test-bgo.cpp @@ -0,0 +1,74 @@ +/* + * exempi - test-bgo.cpp + * + * Copyright (C) 2007-2008 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmpconsts.h" +#include "xmp.h" + +int test_main(int argc, char* argv[]) +{ + prepare_test(argc, argv, "fdo18635.jpg"); + + BOOST_CHECK(xmp_init()); + + XmpFilePtr xf = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ); + + BOOST_CHECK(xf != NULL); + if (xf == NULL) { + return 1; + } + + XmpPtr xmp = xmp_files_get_new_xmp(xf); + + BOOST_CHECK(xmp != NULL); + + BOOST_CHECK(xmp_free(xmp)); + BOOST_CHECK(xmp_files_free(xf)); + + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/test-exempi-core.cpp b/tests/exempi/exempi/tests/test-exempi-core.cpp new file mode 100644 index 0000000..8f48aa9 --- /dev/null +++ b/tests/exempi/exempi/tests/test-exempi-core.cpp @@ -0,0 +1,235 @@ +/* + * exempi - test-exempi-core.cpp + * + * Copyright (C) 2007-2013 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmpconsts.h" +#include "xmp.h" + +using boost::unit_test::test_suite; + +// void test_exempi() +int test_main(int argc, char *argv[]) +{ + prepare_test(argc, argv, "test1.xmp"); + + size_t len; + char *buffer; + + FILE *f = fopen(g_testfile.c_str(), "rb"); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + exit(128); + } + fseek(f, 0, SEEK_END); + len = ftell(f); + fseek(f, 0, SEEK_SET); + + buffer = (char *)malloc(len + 1); + size_t rlen = fread(buffer, 1, len, f); + + BOOST_CHECK(rlen == len); + BOOST_CHECK(len != 0); + + BOOST_CHECK(xmp_init()); + + // See https://bugs.freedesktop.org/show_bug.cgi?id=53983 + // It is recognized as unknown. + BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_UNKNOWN); + + XmpPtr xmp = xmp_new_empty(); + + BOOST_CHECK(xmp_parse(xmp, buffer, len)); + + BOOST_CHECK(xmp != NULL); + + XmpStringPtr the_prop = xmp_string_new(); + BOOST_CHECK(xmp_string_len(the_prop) == 0); + + BOOST_CHECK(xmp_has_property(xmp, NS_TIFF, "Make")); + BOOST_CHECK(!xmp_has_property(xmp, NS_TIFF, "Foo")); + + BOOST_CHECK(xmp_get_property(xmp, NS_TIFF, "Make", the_prop, NULL)); + BOOST_CHECK(strcmp("Canon", xmp_string_cstr(the_prop)) == 0); + BOOST_CHECK(xmp_string_len(the_prop) == 5); + + BOOST_CHECK(xmp_set_property(xmp, NS_TIFF, "Make", "Leica", 0)); + BOOST_CHECK(xmp_get_property(xmp, NS_TIFF, "Make", the_prop, NULL)); + BOOST_CHECK(strcmp("Leica", xmp_string_cstr(the_prop)) == 0); + BOOST_CHECK(xmp_string_len(the_prop) == 5); + + uint32_t bits; + BOOST_CHECK( + xmp_get_property(xmp, NS_DC, "rights[1]/?xml:lang", the_prop, &bits)); + BOOST_CHECK(bits == 0x20); + BOOST_CHECK(XMP_IS_PROP_QUALIFIER(bits)); + + BOOST_CHECK(xmp_get_property(xmp, NS_DC, "rights[1]", the_prop, &bits)); + BOOST_CHECK(bits == 0x50); + BOOST_CHECK(XMP_HAS_PROP_QUALIFIERS(bits)); + + XmpStringPtr the_lang = xmp_string_new(); + BOOST_CHECK(xmp_get_localized_text(xmp, NS_DC, "rights", NULL, "x-default", + the_lang, the_prop, &bits)); + BOOST_CHECK(strcmp("x-default", xmp_string_cstr(the_lang)) == 0); + BOOST_CHECK(strcmp("2006, Hubert Figuiere", xmp_string_cstr(the_prop)) == 0); + + // This will modify the default property. + BOOST_CHECK( + xmp_set_localized_text(xmp, NS_DC, "rights", "en", "en-CA", "Foo Bar", 0)); + // Ask for the en_US alternative. + BOOST_CHECK(xmp_get_localized_text(xmp, NS_DC, "rights", "en", "en-US", + the_lang, the_prop, &bits)); + // And we only got the "en-CA" as the only "en" + BOOST_CHECK(strcmp("en-US", xmp_string_cstr(the_lang)) != 0); + BOOST_CHECK(strcmp("en-CA", xmp_string_cstr(the_lang)) == 0); + // Check its value + BOOST_CHECK(strcmp("Foo Bar", xmp_string_cstr(the_prop)) == 0); + // The default property is supposed to have been changed too. + BOOST_CHECK(xmp_get_localized_text(xmp, NS_DC, "rights", NULL, "x-default", + the_lang, the_prop, &bits)); + BOOST_CHECK(strcmp("Foo Bar", xmp_string_cstr(the_prop)) == 0); + + // This should also remove the property x-default. (SDK 5.2.2) + BOOST_CHECK(xmp_delete_localized_text(xmp, NS_DC, "rights", "en", "en-CA")); + + BOOST_CHECK(!xmp_has_property(xmp, NS_DC, "rights[1]")); + BOOST_CHECK(!xmp_has_property(xmp, NS_DC, "rights[2]")); + + xmp_string_free(the_lang); + + BOOST_CHECK(xmp_set_array_item(xmp, NS_DC, "creator", 2, "foo", 0)); + BOOST_CHECK(xmp_get_array_item(xmp, NS_DC, "creator", 2, the_prop, &bits)); + BOOST_CHECK(XMP_IS_PROP_SIMPLE(bits)); + BOOST_CHECK(strcmp("foo", xmp_string_cstr(the_prop)) == 0); + BOOST_CHECK(xmp_append_array_item(xmp, NS_DC, "creator", 0, "bar", 0)); + + BOOST_CHECK(xmp_get_array_item(xmp, NS_DC, "creator", 3, the_prop, &bits)); + BOOST_CHECK(XMP_IS_PROP_SIMPLE(bits)); + BOOST_CHECK(strcmp("bar", xmp_string_cstr(the_prop)) == 0); + + BOOST_CHECK(xmp_delete_property(xmp, NS_DC, "creator[3]")); + BOOST_CHECK(!xmp_has_property(xmp, NS_DC, "creator[3]")); + + BOOST_CHECK( + xmp_get_property(xmp, NS_EXIF, "DateTimeOriginal", the_prop, NULL)); + BOOST_CHECK(strcmp("2006-12-07T23:20:43-05:00", xmp_string_cstr(the_prop)) == + 0); + + BOOST_CHECK(xmp_get_property(xmp, NS_XAP, "Rating", the_prop, NULL)); + BOOST_CHECK(strcmp("3", xmp_string_cstr(the_prop)) == 0); + + xmp_string_free(the_prop); + + // testing date time get + XmpDateTime the_dt; + bool ret; + BOOST_CHECK(ret = xmp_get_property_date(xmp, NS_EXIF, "DateTimeOriginal", + &the_dt, NULL)); + BOOST_CHECK(the_dt.year == 2006); + BOOST_CHECK(the_dt.minute == 20); + BOOST_CHECK(the_dt.tzSign == XMP_TZ_WEST); + + // testing compare + XmpDateTime the_other_dt; + BOOST_CHECK(ret = xmp_get_property_date(xmp, NS_EXIF, "DateTimeOriginal", + &the_other_dt, NULL)); + BOOST_CHECK(xmp_datetime_compare(&the_dt, &the_other_dt) == 0); + the_other_dt.year++; + BOOST_CHECK(xmp_datetime_compare(&the_dt, &the_other_dt) < 0); + BOOST_CHECK(xmp_datetime_compare(&the_other_dt, &the_dt) > 0); + // NULL checks - this is Exempi API + BOOST_CHECK(xmp_datetime_compare(NULL, NULL) == 0); + BOOST_CHECK(xmp_datetime_compare(NULL, &the_other_dt) < 0); + BOOST_CHECK(xmp_datetime_compare(&the_other_dt, NULL) > 0); + + // testing float get set + double float_value = 0.0; + BOOST_CHECK(xmp_get_property_float(xmp, NS_CAMERA_RAW_SETTINGS, + "SharpenRadius", &float_value, NULL)); + BOOST_CHECK(float_value == 1.0); + BOOST_CHECK(xmp_set_property_float(xmp, NS_CAMERA_RAW_SETTINGS, + "SharpenRadius", 2.5, 0)); + BOOST_CHECK(xmp_get_property_float(xmp, NS_CAMERA_RAW_SETTINGS, + "SharpenRadius", &float_value, NULL)); + BOOST_CHECK(float_value == 2.5); + + // testing bool get set + bool bool_value = true; + BOOST_CHECK(xmp_get_property_bool(xmp, NS_CAMERA_RAW_SETTINGS, + "AlreadyApplied", &bool_value, NULL)); + BOOST_CHECK(!bool_value); + BOOST_CHECK(xmp_set_property_bool(xmp, NS_CAMERA_RAW_SETTINGS, + "AlreadyApplied", true, 0)); + BOOST_CHECK(xmp_get_property_bool(xmp, NS_CAMERA_RAW_SETTINGS, + "AlreadyApplied", &bool_value, NULL)); + BOOST_CHECK(bool_value); + + // testing int get set + int32_t value = 0; + BOOST_CHECK( + xmp_get_property_int32(xmp, NS_EXIF, "MeteringMode", &value, NULL)); + BOOST_CHECK(value == 5); + BOOST_CHECK(xmp_set_property_int32(xmp, NS_EXIF, "MeteringMode", 10, 0)); + int64_t valuelarge = 0; + BOOST_CHECK( + xmp_get_property_int64(xmp, NS_EXIF, "MeteringMode", &valuelarge, NULL)); + BOOST_CHECK(valuelarge == 10); + BOOST_CHECK(xmp_set_property_int64(xmp, NS_EXIF, "MeteringMode", 32, 0)); + + BOOST_CHECK( + xmp_get_property_int32(xmp, NS_EXIF, "MeteringMode", &value, NULL)); + BOOST_CHECK(value == 32); + + BOOST_CHECK(xmp_free(xmp)); + + free(buffer); + fclose(f); + + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/test-fdo83313.cpp b/tests/exempi/exempi/tests/test-fdo83313.cpp new file mode 100644 index 0000000..38ff771 --- /dev/null +++ b/tests/exempi/exempi/tests/test-fdo83313.cpp @@ -0,0 +1,74 @@ +/* + * exempi - test-bgo.cpp + * + * Copyright (C) 2007-2008 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmpconsts.h" +#include "xmp.h" + +int test_main(int argc, char* argv[]) +{ + prepare_test(argc, argv, "fdo83313.jpg"); + + BOOST_CHECK(xmp_init()); + + XmpFilePtr xf = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ); + + BOOST_CHECK(xf != NULL); + if (xf == NULL) { + return 1; + } + + XmpPtr xmp = xmp_files_get_new_xmp(xf); + + BOOST_CHECK(xmp != NULL); + + BOOST_CHECK(xmp_free(xmp)); + BOOST_CHECK(xmp_files_free(xf)); + + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/test-iterator.cpp b/tests/exempi/exempi/tests/test-iterator.cpp new file mode 100644 index 0000000..93ea189 --- /dev/null +++ b/tests/exempi/exempi/tests/test-iterator.cpp @@ -0,0 +1,174 @@ +/* + * exempi - test3.cpp + * + * Copyright (C) 2007-2017 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "utils.h" +#include "xmp.h" +#include "xmpconsts.h" + +using boost::unit_test::test_suite; + +// void test_exempi_iterate() +int test_main(int argc, char *argv[]) +{ + prepare_test(argc, argv, "test1.xmp"); + + size_t len; + char *buffer; + + FILE *f = fopen(g_testfile.c_str(), "rb"); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + exit(128); + } + fseek(f, 0, SEEK_END); + len = ftell(f); + fseek(f, 0, SEEK_SET); + + buffer = (char *)malloc(len + 1); + size_t rlen = fread(buffer, 1, len, f); + + BOOST_CHECK(rlen == len); + BOOST_CHECK(len != 0); + BOOST_CHECK(xmp_init()); + + XmpPtr xmp = xmp_new_empty(); + + BOOST_CHECK(xmp_parse(xmp, buffer, len)); + + BOOST_CHECK(xmp != NULL); + + XmpStringPtr the_schema = xmp_string_new(); + XmpStringPtr the_path = xmp_string_new(); + XmpStringPtr the_prop = xmp_string_new(); + uint32_t options; + + typedef std::array tuple3; + + { + // leafnodes iteration + XmpIteratorPtr iter = + xmp_iterator_new(xmp, NS_DC, NULL, XMP_ITER_JUSTLEAFNODES); + + BOOST_CHECK(iter); + std::vector props; + + while (xmp_iterator_next(iter, the_schema, the_path, the_prop, &options)) { + props.push_back(tuple3 {{ + xmp_string_cstr(the_schema), + xmp_string_cstr(the_path), + xmp_string_cstr(the_prop) + }}); + } + + BOOST_CHECK(props.size() == 7); + for (auto prop_tuple : props) { + BOOST_CHECK(prop_tuple[0] == NS_DC); + } + BOOST_CHECK(props[0][2] == "unknown"); + BOOST_CHECK(props[3][1] == "dc:subject[1]"); + + BOOST_CHECK(xmp_iterator_free(iter)); + } + + { + // leafname iteration + XmpIteratorPtr iter = + xmp_iterator_new(xmp, NS_DC, "rights", XMP_ITER_JUSTLEAFNAME); + + BOOST_CHECK(iter); + std::vector props; + + while (xmp_iterator_next(iter, the_schema, the_path, the_prop, &options)) { + props.push_back(tuple3 {{ + xmp_string_cstr(the_schema), + xmp_string_cstr(the_path), + xmp_string_cstr(the_prop) + }}); + } + + BOOST_CHECK(props.size() == 3); + + BOOST_CHECK(props[0] == (tuple3{{NS_DC, "dc:rights", ""}})); + BOOST_CHECK(props[1] == (tuple3{{"", "[1]", "2006, Hubert Figuiere"}})); + BOOST_CHECK(props[2] == (tuple3{{NS_XML, "xml:lang", "x-default"}})); + + BOOST_CHECK(xmp_iterator_free(iter)); + } + + { + // Iterator with property but no NS is invalid. + XmpIteratorPtr iter = + xmp_iterator_new(xmp, NULL, "rights", XMP_ITER_JUSTLEAFNODES); + + // Invalid iterator + BOOST_CHECK(!iter); + } + + { + // Iterating namespaces is invalid. + XmpIteratorPtr iter = + xmp_iterator_new(xmp, NULL, NULL, XMP_ITER_NAMESPACES); + + // Invalid iterator + BOOST_CHECK(!iter); + } + + xmp_string_free(the_prop); + xmp_string_free(the_path); + xmp_string_free(the_schema); + BOOST_CHECK(xmp_free(xmp)); + + free(buffer); + fclose(f); + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/test-serialise.cpp b/tests/exempi/exempi/tests/test-serialise.cpp new file mode 100644 index 0000000..6175a16 --- /dev/null +++ b/tests/exempi/exempi/tests/test-serialise.cpp @@ -0,0 +1,102 @@ +/* + * exempi - test-serialise.cpp + * + * Copyright (C) 2007-2008 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmpconsts.h" +#include "xmp.h" + +using boost::unit_test::test_suite; + +// void test_serialize() +int test_main(int argc, char *argv[]) +{ + prepare_test(argc, argv, "test1.xmp"); + + size_t len; + char *buffer; + FILE *f = fopen(g_testfile.c_str(), "rb"); + + fseek(f, 0, SEEK_END); + len = ftell(f); + fseek(f, 0, SEEK_SET); + + buffer = (char *)malloc(len + 1); + size_t rlen = fread(buffer, 1, len, f); + + BOOST_CHECK(rlen == len); + BOOST_CHECK(len != 0); + buffer[rlen] = 0; + + BOOST_CHECK(xmp_init()); + BOOST_CHECK(xmp_get_error() == 0); + + XmpPtr xmp = xmp_new_empty(); + BOOST_CHECK(xmp_get_error() == 0); + + BOOST_CHECK(xmp_parse(xmp, buffer, len)); + BOOST_CHECK(xmp_get_error() == 0); + + std::string b1(buffer); + std::string b2; + XmpStringPtr output = xmp_string_new(); + + BOOST_CHECK(xmp_serialize_and_format( + xmp, output, XMP_SERIAL_OMITPACKETWRAPPER, 0, "\n", " ", 0)); + BOOST_CHECK(xmp_get_error() == 0); + b2 = xmp_string_cstr(output); + // find a way to compare that. + // BOOST_CHECK_EQUAL(b1, b2); + + xmp_string_free(output); + BOOST_CHECK(xmp_free(xmp)); + + free(buffer); + fclose(f); + + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/test-tiff-leak.cpp b/tests/exempi/exempi/tests/test-tiff-leak.cpp new file mode 100644 index 0000000..729cced --- /dev/null +++ b/tests/exempi/exempi/tests/test-tiff-leak.cpp @@ -0,0 +1,86 @@ +/* + * exempi - test-tiff-leak.cpp + * + * Copyright (C) 2007-2008,2010 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmp.h" +#include "xmpconsts.h" + +/** See http://www.adobeforums.com/webx/.3bc42b73 for the orignal + * test case */ +// void test_tiff_leak() +int test_main(int argc, char *argv[]) +{ + prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.jpg"); + + std::string orig_tiff_file = + g_src_testdir + "../../samples/testfiles/BlueSquare.tif"; + BOOST_CHECK(copy_file(orig_tiff_file, "test.tif")); + BOOST_CHECK(chmod("test.tif", S_IRUSR | S_IWUSR) == 0); + BOOST_CHECK(xmp_init()); + + XmpFilePtr f = xmp_files_open_new("test.tif", XMP_OPEN_FORUPDATE); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + return 1; + } + + XmpPtr xmp; + + BOOST_CHECK(xmp = xmp_files_get_new_xmp(f)); + BOOST_CHECK(xmp != NULL); + + xmp_set_localized_text(xmp, NS_DC, "description", "en", "en-US", "foo", 0); + BOOST_CHECK(xmp_files_put_xmp(f, xmp)); + BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_NOOPTION)); + BOOST_CHECK(xmp_free(xmp)); + BOOST_CHECK(xmp_files_free(f)); + xmp_terminate(); + + BOOST_CHECK(unlink("test.tif") == 0); + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/test-webp.cpp b/tests/exempi/exempi/tests/test-webp.cpp new file mode 100644 index 0000000..47aa7dc --- /dev/null +++ b/tests/exempi/exempi/tests/test-webp.cpp @@ -0,0 +1,119 @@ +/* + * exempi - test-webp.cpp + * + * Copyright (C) 2007-2016 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmp.h" +#include "xmpconsts.h" + +using boost::unit_test::test_suite; + + +int test_main(int argc, char *argv[]) +{ + prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.webp"); + + BOOST_CHECK(xmp_init()); + + BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_WEBP); + XmpFilePtr f = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + return 1; + } + + XmpPtr xmp = xmp_files_get_new_xmp(f); + BOOST_CHECK(xmp != NULL); + + BOOST_CHECK(xmp_files_free(f)); + + BOOST_CHECK(copy_file(g_testfile, "test.webp")); + BOOST_CHECK(chmod("test.webp", S_IRUSR | S_IWUSR) == 0); + + BOOST_CHECK(xmp_files_check_file_format("test.webp") == XMP_FT_WEBP); + + f = xmp_files_open_new("test.webp", XMP_OPEN_FORUPDATE); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + return 2; + } + + BOOST_CHECK(xmp_set_property(xmp, NS_PHOTOSHOP, "ICCProfile", "foo", 0)); + + BOOST_CHECK(xmp_files_can_put_xmp(f, xmp)); + BOOST_CHECK(xmp_files_put_xmp(f, xmp)); + + BOOST_CHECK(xmp_free(xmp)); + BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_SAFEUPDATE)); + BOOST_CHECK(xmp_files_free(f)); + + f = xmp_files_open_new("test.webp", XMP_OPEN_READ); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + return 3; + } + xmp = xmp_files_get_new_xmp(f); + BOOST_CHECK(xmp != NULL); + + XmpStringPtr the_prop = xmp_string_new(); + BOOST_CHECK( + xmp_get_property(xmp, NS_PHOTOSHOP, "ICCProfile", the_prop, NULL)); + BOOST_CHECK(strcmp("foo", xmp_string_cstr(the_prop)) == 0); + + xmp_string_free(the_prop); + + BOOST_CHECK(xmp_free(xmp)); + BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_NOOPTION)); + BOOST_CHECK(xmp_files_free(f)); + + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + + return 0; +} diff --git a/tests/exempi/exempi/tests/test-write-new-prop.cpp b/tests/exempi/exempi/tests/test-write-new-prop.cpp new file mode 100644 index 0000000..524376e --- /dev/null +++ b/tests/exempi/exempi/tests/test-write-new-prop.cpp @@ -0,0 +1,150 @@ +/* + * exempi - test1.cpp + * + * Copyright (C) 2007-2008 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmpconsts.h" +#include "xmp.h" + +using boost::unit_test::test_suite; + +// void test_write_new_property() +int test_main(int argc, char *argv[]) +{ + prepare_test(argc, argv, "test1.xmp"); + + size_t len; + char *buffer; + + FILE *f = fopen(g_testfile.c_str(), "rb"); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + exit(128); + } + fseek(f, 0, SEEK_END); + len = ftell(f); + fseek(f, 0, SEEK_SET); + + buffer = (char *)malloc(len + 1); + size_t rlen = fread(buffer, 1, len, f); + + BOOST_CHECK(rlen == len); + BOOST_CHECK(len != 0); + + BOOST_CHECK(xmp_init()); + BOOST_CHECK(xmp_get_error() == 0); + + XmpPtr xmp = xmp_new_empty(); + BOOST_CHECK(xmp_get_error() == 0); + + BOOST_CHECK(xmp_parse(xmp, buffer, len)); + BOOST_CHECK(xmp_get_error() == 0); + + BOOST_CHECK(xmp != NULL); + + XmpStringPtr reg_prefix = xmp_string_new(); + BOOST_CHECK(xmp_register_namespace(NS_CC, "cc", reg_prefix)); + BOOST_CHECK(xmp_get_error() == 0); + BOOST_CHECK(strcmp("cc:", xmp_string_cstr(reg_prefix)) == 0); + + BOOST_CHECK(xmp_prefix_namespace_uri("cc", reg_prefix)); + BOOST_CHECK(xmp_get_error() == 0); + BOOST_CHECK(strcmp(NS_CC, xmp_string_cstr(reg_prefix)) == 0); + + BOOST_CHECK(xmp_namespace_prefix(NS_CC, reg_prefix)); + BOOST_CHECK(xmp_get_error() == 0); + BOOST_CHECK(strcmp("cc:", xmp_string_cstr(reg_prefix)) == 0); + + xmp_string_free(reg_prefix); + + BOOST_CHECK(xmp_set_property(xmp, NS_CC, "License", "Foo", 0)); + BOOST_CHECK(xmp_get_error() == 0); + + XmpStringPtr the_prop = xmp_string_new(); + BOOST_CHECK(xmp_get_property(xmp, NS_CC, "License", the_prop, NULL)); + BOOST_CHECK(xmp_get_error() == 0); + BOOST_CHECK(strcmp("Foo", xmp_string_cstr(the_prop)) == 0); + + XmpDateTime the_dt; + the_dt.year = 2005; + the_dt.month = 12; + the_dt.day = 25; + the_dt.hour = 12; + the_dt.minute = 42; + the_dt.second = 42; + the_dt.tzSign = XMP_TZ_UTC; + the_dt.tzHour = 0; + the_dt.tzMinute = 0; + the_dt.nanoSecond = 0; + BOOST_CHECK( + xmp_set_property_date(xmp, NS_EXIF, "DateTimeOriginal", &the_dt, 0)); + BOOST_CHECK(xmp_get_error() == 0); + + BOOST_CHECK( + xmp_get_property(xmp, NS_EXIF, "DateTimeOriginal", the_prop, NULL)); + BOOST_CHECK(xmp_get_error() == 0); + BOOST_CHECK(strcmp("2005-12-25T12:42:42", xmp_string_cstr(the_prop)) == 0); + + XmpDateTime the_dt2; + BOOST_CHECK( + xmp_get_property_date(xmp, NS_EXIF, "DateTimeOriginal", &the_dt2, NULL)); + BOOST_CHECK(xmp_get_error() == 0); + + BOOST_CHECK(the_dt2.year == 2005); + BOOST_CHECK(the_dt2.minute == 42); + BOOST_CHECK(the_dt2.tzSign == XMP_TZ_UTC); + + xmp_string_free(the_prop); + + BOOST_CHECK(xmp_free(xmp)); + + free(buffer); + fclose(f); + + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/test-xmpfiles-write.cpp b/tests/exempi/exempi/tests/test-xmpfiles-write.cpp new file mode 100644 index 0000000..e44e242 --- /dev/null +++ b/tests/exempi/exempi/tests/test-xmpfiles-write.cpp @@ -0,0 +1,120 @@ +/* + * exempi - test-xmpfile-write.cpp + * + * Copyright (C) 2007-2008,2010 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmp.h" +#include "xmpconsts.h" + +using boost::unit_test::test_suite; + +// void test_xmpfiles_write() +int test_main(int argc, char *argv[]) +{ + prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.jpg"); + + BOOST_CHECK(xmp_init()); + + BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_JPEG); + XmpFilePtr f = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + return 1; + } + + XmpPtr xmp = xmp_files_get_new_xmp(f); + BOOST_CHECK(xmp != NULL); + + BOOST_CHECK(xmp_files_free(f)); + + BOOST_CHECK(copy_file(g_testfile, "test.jpg")); + BOOST_CHECK(chmod("test.jpg", S_IRUSR | S_IWUSR) == 0); + + BOOST_CHECK(xmp_files_check_file_format("test.jpg") == XMP_FT_JPEG); + + f = xmp_files_open_new("test.jpg", XMP_OPEN_FORUPDATE); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + return 2; + } + + BOOST_CHECK(xmp_set_property(xmp, NS_PHOTOSHOP, "ICCProfile", "foo", 0)); + + BOOST_CHECK(xmp_files_can_put_xmp(f, xmp)); + BOOST_CHECK(xmp_files_put_xmp(f, xmp)); + + BOOST_CHECK(xmp_free(xmp)); + BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_SAFEUPDATE)); + BOOST_CHECK(xmp_files_free(f)); + + f = xmp_files_open_new("test.jpg", XMP_OPEN_READ); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + return 3; + } + xmp = xmp_files_get_new_xmp(f); + BOOST_CHECK(xmp != NULL); + + XmpStringPtr the_prop = xmp_string_new(); + BOOST_CHECK( + xmp_get_property(xmp, NS_PHOTOSHOP, "ICCProfile", the_prop, NULL)); + BOOST_CHECK(strcmp("foo", xmp_string_cstr(the_prop)) == 0); + + xmp_string_free(the_prop); + + BOOST_CHECK(xmp_free(xmp)); + BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_NOOPTION)); + BOOST_CHECK(xmp_files_free(f)); + + // unlink("test.jpg"); + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + + return 0; +} diff --git a/tests/exempi/exempi/tests/test-xmpfiles.cpp b/tests/exempi/exempi/tests/test-xmpfiles.cpp new file mode 100644 index 0000000..9a2bfca --- /dev/null +++ b/tests/exempi/exempi/tests/test-xmpfiles.cpp @@ -0,0 +1,129 @@ +/* + * exempi - test-xmpfiles.cpp + * + * Copyright (C) 2007-2016 Hubert Figuière + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmp.h" +#include "xmpconsts.h" + +using boost::unit_test::test_suite; + +// void test_xmpfiles() +int test_main(int argc, char* argv[]) +{ + prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.jpg"); + + BOOST_CHECK(xmp_init()); + + XmpFilePtr f = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + exit(128); + } + + BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_JPEG); + + XmpStringPtr file_path = xmp_string_new(); + XmpOpenFileOptions options; + XmpFileType file_format; + XmpFileFormatOptions handler_flags; + BOOST_CHECK(xmp_files_get_file_info(f, file_path, &options, &file_format, + &handler_flags)); + BOOST_CHECK(options == XMP_OPEN_READ); + BOOST_CHECK(file_format == XMP_FT_JPEG); + // the value check might break at each SDK update. You have been warned. + BOOST_CHECK(handler_flags == 0x27f); + BOOST_CHECK(g_testfile == xmp_string_cstr(file_path)); + xmp_string_free(file_path); + + XmpPtr xmp = xmp_new_empty(); + + BOOST_CHECK(xmp != NULL); + + BOOST_CHECK(xmp_files_get_xmp(f, xmp)); + + { + XmpStringPtr thestring = xmp_string_new(); + XmpPacketInfo packet_info; + BOOST_CHECK(xmp_files_get_xmp_xmpstring(f, thestring, &packet_info)); + BOOST_CHECK(packet_info.offset == 2189); + BOOST_CHECK(packet_info.length == 4782); + BOOST_CHECK(packet_info.padSize == 2049); + BOOST_CHECK(packet_info.hasWrapper); + + const char *xmp_str = xmp_string_cstr(thestring); + BOOST_CHECK(xmp_str); + xmp_string_free(thestring); + } + + XmpStringPtr the_prop = xmp_string_new(); + + BOOST_CHECK( + xmp_get_property(xmp, NS_PHOTOSHOP, "ICCProfile", the_prop, NULL)); + BOOST_CHECK(strcmp("sRGB IEC61966-2.1", xmp_string_cstr(the_prop)) == 0); + + xmp_string_free(the_prop); + BOOST_CHECK(xmp_free(xmp)); + + BOOST_CHECK(xmp_files_free(f)); + + XmpFileFormatOptions formatOptions; + + // the value check might break at each SDK update. You have been warned. + BOOST_CHECK(xmp_files_get_format_info(XMP_FT_JPEG, &formatOptions)); + BOOST_CHECK(formatOptions == 0x27f); + BOOST_CHECK(xmp_files_get_format_info(XMP_FT_GIF, &formatOptions)); + BOOST_CHECK(formatOptions == 0x46b); + BOOST_CHECK(xmp_files_get_format_info(XMP_FT_PNG, &formatOptions)); + BOOST_CHECK(formatOptions == 0x46b); + // PDF doesn't have a smart handler. + BOOST_CHECK(!xmp_files_get_format_info(XMP_FT_PDF, &formatOptions)); + + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/test-xmpformat.cpp b/tests/exempi/exempi/tests/test-xmpformat.cpp new file mode 100644 index 0000000..af13cb1 --- /dev/null +++ b/tests/exempi/exempi/tests/test-xmpformat.cpp @@ -0,0 +1,98 @@ +/* + * exempi - test-xmpformat.cpp + * + * Copyright (C) 2020 Hubert Figuière + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include + +#include "xmp.h" + +const std::map TEST_CASES = { + { "avi", XMP_FT_AVI }, + { "eps", XMP_FT_EPS }, + { "gif", XMP_FT_GIF }, + { "indd", XMP_FT_INDESIGN }, + { "jpg", XMP_FT_JPEG }, + { "mov", XMP_FT_MOV }, + { "mp3", XMP_FT_MP3 }, + { "png", XMP_FT_PNG }, + { "psd", XMP_FT_PHOTOSHOP }, + { "tif", XMP_FT_TIFF }, + { "webp", XMP_FT_WEBP }, + { "wav", XMP_FT_WAV } +}; + +const std::map FAILING_CASES = { + // This is a GIF87a. Not supported. + { "gif", XMP_FT_UNKNOWN } +}; + +// Test that the sample files match the file type. +// +// This test would have caught: +// https://gitlab.freedesktop.org/libopenraw/exempi/-/issues/20 +// +int test_main(int , char *[]) +{ + const char* srcdir = getenv("srcdir"); + if (!srcdir) { + srcdir = "."; + } + + BOOST_CHECK(xmp_init()); + + for (auto testcase : TEST_CASES) { + std::string imagepath(srcdir); + imagepath += "/../samples/testfiles/BlueSquare."; + imagepath += testcase.first; + + printf("%s\n", imagepath.c_str()); + auto xft = xmp_files_check_file_format(imagepath.c_str()); + BOOST_CHECK(xft == testcase.second); + } + + for (auto testcase : FAILING_CASES) { + std::string imagepath(srcdir); + imagepath += "/../samples/testfiles/BlueSquare-FAIL."; + imagepath += testcase.first; + + printf("%s\n", imagepath.c_str()); + auto xft = xmp_files_check_file_format(imagepath.c_str()); + BOOST_CHECK(xft == testcase.second); + } + + return 0; +} diff --git a/tests/exempi/exempi/tests/test1.xmp b/tests/exempi/exempi/tests/test1.xmp new file mode 100644 index 0000000..281f936 --- /dev/null +++ b/tests/exempi/exempi/tests/test1.xmp @@ -0,0 +1,255 @@ + + + + Canon + Canon EOS 20D + 1 + 3504 + 2336 + + + 0221 + 15/1 + -3906891/1000000 + 8/1 + 6/1 + 1 + 2006-12-07T23:20:43-05:00 + 2006-12-07T23:20:43-05:00 + 0/2 + 3625/1000 + 5 + 32/1 + 0 + 1 + 0 + 0 + 3504000/885 + 2336000/590 + 2 + + + 100 + + + + False + 0 + 2 + False + False + + + + 2006-12-07T23:20:43-05:00 + 3 + + + + + unknown + + + + + 2006, Hubert Figuiere + + + + + night + ontario + ottawa + parliament of canada + + + + + 420103070 + 24/1 85/1 0/0 0/0 + 24.0-85.0 mm + 176 + -2/1 + unknown + 1.1.0 + + + False + As Shot + 0.00 + 5 + +50 + +25 + 0 + 25 + 0 + 25 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 25 + 50 + 75 + +1.0 + 25 + 0 + False + Medium Contrast + + + 0, 0 + 32, 22 + 64, 56 + 128, 128 + 192, 196 + 255, 255 + + + + + false + 0 + 25 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 50 + 75 + 25 + 25 + As Shot + 0 + 0 + 0 + 100 + 0 + 0 + 71 + 0 + 25 + 0 + 5 + 0 + 50 + 0 + 0 + 0 + 29 + false + false + false + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + false + 1 + 0 + 0 + 0 + 0 + 29 + 0 + 0 + 0 + 71 + 50 + 0 + false + 0 + 0 + true + 0 + 0 + 1 + 4350 + + + aGllcmFyY2hpY2FsS2V5d29yZHMgPSB7Cgl7CgkJZmxhdCA9IHsKCQkJIm5pZ2h0IiwKCQl9LAoJCXBhdGggPSB7CgkJCSJuaWdodCIsCgkJfSwKCQlwcmltYXJ5ID0gIm5pZ2h0IiwKCQl1dWlkID0gIkU1RDEwQTFELTU3QUYtMTFEQi04RTMzLTAwMEQ5MzVDODY5QSIsCgl9LAoJewoJCWZsYXQgPSB7CgkJCSJvbnRhcmlvIiwKCQkJIm90dGF3YSIsCgkJfSwKCQlwYXRoID0gewoJCQkib250YXJpbyIsCgkJCSJvdHRhd2EiLAoJCX0sCgkJcHJpbWFyeSA9ICJvdHRhd2EiLAoJCXV1aWQgPSAiQjgzMTc4RkItNTdBRi0xMURCLThFMzMtMDAwRDkzNUM4NjlBIiwKCX0sCgl7CgkJZmxhdCA9IHsKCQkJInBhcmxpYW1lbnQgb2YgY2FuYWRhIiwKCQkJIm9udGFyaW8iLAoJCQkib3R0YXdhIiwKCQl9LAoJCXBhdGggPSB7CgkJCSJvbnRhcmlvIiwKCQkJIm90dGF3YSIsCgkJCSJwYXJsaWFtZW50IG9mIGNhbmFkYSIsCgkJfSwKCQlwcmltYXJ5ID0gInBhcmxpYW1lbnQgb2YgY2FuYWRhIiwKCQl1dWlkID0gIkU1RDMzMEZDLTU3QUYtMTFEQi04RTMzLTAwMEQ5MzVDODY5QSIsCgl9LAp9Cg== + + + + + 4 + 3 + inches + + + + + Parliament Hill, Ottawa, Ontario, Canada + + + diff --git a/tests/exempi/exempi/tests/testcpp.cpp b/tests/exempi/exempi/tests/testcpp.cpp new file mode 100644 index 0000000..da4c40f --- /dev/null +++ b/tests/exempi/exempi/tests/testcpp.cpp @@ -0,0 +1,69 @@ +/* + * exempi - testcpp.cpp + * + * Copyright (C) 2011 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include "utils.h" +#include "xmp.h" +#include "xmpconsts.h" +#include "xmp++.hpp" + +using boost::unit_test::test_suite; + +int test_main(int /*argc*/, char* /*argv*/ []) +{ + // this test is totally useless without leak checking. + // but for compiling. + { + xmp::ScopedPtr ptr(xmp_string_new()); + } + + { + xmp::ScopedPtr ptr(xmp_files_new()); + } + + { + xmp::ScopedPtr ptr(xmp_new_empty()); + { + xmp::ScopedPtr iterptr( + xmp_iterator_new(ptr, NS_EXIF, NULL, XMP_ITER_JUSTLEAFNODES)); + } + } + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/testinit.cpp b/tests/exempi/exempi/tests/testinit.cpp new file mode 100644 index 0000000..6df3053 --- /dev/null +++ b/tests/exempi/exempi/tests/testinit.cpp @@ -0,0 +1,96 @@ +/* + * exempi - testinit.cpp + * + * Copyright (C) 2007 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +#include + +#include "utils.h" +#include "xmpconsts.h" +#include "xmp.h" + +// void test_exempi_init() +int test_main(int argc, char* argv[]) +{ + prepare_test(argc, argv, "test1.xmp"); + + size_t len; + char* buffer; + + FILE* f = fopen(g_testfile.c_str(), "rb"); + + BOOST_CHECK(f != NULL); + if (f == NULL) { + exit(128); + } + fseek(f, 0, SEEK_END); + len = ftell(f); + fseek(f, 0, SEEK_SET); + + buffer = (char*)malloc(len + 1); + size_t rlen = fread(buffer, 1, len, f); + + fclose(f); + + BOOST_CHECK(rlen == len); + BOOST_CHECK(len != 0); + + BOOST_CHECK(xmp_init()); + BOOST_CHECK(xmp_init()); + + XmpPtr xmp = xmp_new_empty(); + BOOST_CHECK(xmp_parse(xmp, buffer, len)); + BOOST_CHECK(xmp != NULL); + BOOST_CHECK(xmp_free(xmp)); + + xmp_terminate(); + + xmp = xmp_new_empty(); + BOOST_CHECK(xmp_parse(xmp, buffer, len)); + BOOST_CHECK(xmp != NULL); + BOOST_CHECK(xmp_free(xmp)); + + xmp_terminate(); + + free(buffer); + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/testparse.cpp b/tests/exempi/exempi/tests/testparse.cpp new file mode 100644 index 0000000..803f0df --- /dev/null +++ b/tests/exempi/exempi/tests/testparse.cpp @@ -0,0 +1,77 @@ +/* + * exempi - test3.cpp + * + * Copyright (C) 2007-2017 Hubert Figuiere + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include +#include + +#include +#include + +#include "utils.h" +#include "xmp.h" +#include "xmpconsts.h" + +using boost::unit_test::test_suite; + +// void test_exempi_iterate() +int test_main(int, char *[]) +{ + char *buffer; + + buffer = strdup("This is not even XML"); + size_t len = strlen(buffer); + + BOOST_CHECK(len != 0); + BOOST_CHECK(xmp_init()); + + XmpPtr xmp = xmp_new_empty(); + + BOOST_CHECK(!xmp_parse(xmp, buffer, len)); + + BOOST_CHECK(xmp != NULL); + + BOOST_CHECK(xmp_free(xmp)); + + free(buffer); + xmp_terminate(); + + BOOST_CHECK(!g_lt->check_leaks()); + BOOST_CHECK(!g_lt->check_errors()); + return 0; +} diff --git a/tests/exempi/exempi/tests/utils.cpp b/tests/exempi/exempi/tests/utils.cpp new file mode 100644 index 0000000..1620597 --- /dev/null +++ b/tests/exempi/exempi/tests/utils.cpp @@ -0,0 +1,119 @@ +/* + * exempi - utils.cpp + * + * Copyright (C) 2007-2016 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +#include "utils.h" + +std::string g_testfile; +std::string g_src_testdir; +std::unique_ptr g_lt(new LeakTracker) ; + +void prepare_test(int argc, char *argv[], const char *filename) +{ + if (argc == 1) { + // no argument, lets run like we are in "check" + const char *srcdir = getenv("TEST_DIR"); + + BOOST_ASSERT(srcdir != NULL); + g_src_testdir = std::string(srcdir) + "/"; + g_testfile = g_src_testdir + filename; + } else { + g_src_testdir = "./"; + g_testfile = argv[1]; + } +} + +bool copy_file(const std::string &source, const std::string &dest) +{ + std::string command = "cp "; + command += source + " " + dest; + return (system(command.c_str()) >= 0); +} + +#ifdef HAVE_VALGRIND_MEMCHECK_H +#include +#include +#define CC_EXTENSION __extension__ +#else +#define VALGRIND_COUNT_ERRORS 0 +#define VALGRIND_DO_LEAK_CHECK +#define VALGRIND_COUNT_LEAKS(a, b, c, d) (a = b = c = d = 0) +#define CC_EXTENSION +#endif + +LeakTracker::LeakTracker() + : m_leaks(0), m_dubious(0), m_reachable(0), m_suppressed(0), m_errors(0) +{ +} + +LeakTracker::~LeakTracker() +{ + printf("LeakTracker: leaked = %d, errors = %d\n", m_leaks, m_errors); +} + +int LeakTracker::check_leaks() +{ + int leaked = 0; + int dubious = 0; + int reachable = 0; + int suppressed = 0; + + VALGRIND_DO_LEAK_CHECK; + VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed); + printf("memleaks: sure:%d dubious:%d reachable:%d suppress:%d\n", leaked, + dubious, reachable, suppressed); + bool has_leaks = (m_leaks != leaked); + + m_leaks = leaked; + m_dubious = dubious; + m_reachable = reachable; + m_suppressed = suppressed; + + return has_leaks; +} + +int LeakTracker::check_errors() +{ + int errors = (int)(CC_EXTENSION VALGRIND_COUNT_ERRORS); + bool has_new_errors = (m_errors != errors); + m_errors = errors; + return has_new_errors; +} diff --git a/tests/exempi/exempi/tests/utils.h b/tests/exempi/exempi/tests/utils.h new file mode 100644 index 0000000..a26ccd2 --- /dev/null +++ b/tests/exempi/exempi/tests/utils.h @@ -0,0 +1,69 @@ +/* + * exempi - utils.h + * + * Copyright (C) 2007,2010 Hubert Figuiere + * All rights reserved. + * + * 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 Authors, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software wit hout specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __TEST_UTILS_H__ +#define __TEST_UTILS_H__ + +#include + +#include + +extern std::string g_testfile; +extern std::string g_src_testdir; + +void prepare_test(int argc, char* argv[], const char* filename); + +bool copy_file(const std::string& source, const std::string& dest); + +class LeakTracker { +public: + LeakTracker(); + ~LeakTracker(); + /** return false if there is NO leak. Will print on stdout */ + int check_leaks(); + int check_errors(); + +private: + int m_leaks; + int m_dubious; + int m_reachable; + int m_suppressed; + int m_errors; +}; + +extern std::unique_ptr g_lt; + +#endif diff --git a/tests/exempi/m4/ax_append_compile_flags.m4 b/tests/exempi/m4/ax_append_compile_flags.m4 new file mode 100644 index 0000000..2bb27ef --- /dev/null +++ b/tests/exempi/m4/ax_append_compile_flags.m4 @@ -0,0 +1,67 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# For every FLAG1, FLAG2 it is checked whether the compiler works with the +# flag. If it does, the flag is added FLAGS-VARIABLE +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. During the check the flag is always added to the +# current language's flags. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: This macro depends on the AX_APPEND_FLAG and +# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with +# AX_APPEND_LINK_FLAGS. +# +# LICENSE +# +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 5 + +AC_DEFUN([AX_APPEND_COMPILE_FLAGS], +[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG]) +AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) +for flag in $1; do + AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4]) +done +])dnl AX_APPEND_COMPILE_FLAGS diff --git a/tests/exempi/m4/ax_append_flag.m4 b/tests/exempi/m4/ax_append_flag.m4 new file mode 100644 index 0000000..08f2e07 --- /dev/null +++ b/tests/exempi/m4/ax_append_flag.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space +# added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 6 + +AC_DEFUN([AX_APPEND_FLAG], +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + AS_VAR_APPEND(FLAGS,[" $1"]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_APPEND_FLAG diff --git a/tests/exempi/m4/ax_cflags_gcc_option.m4 b/tests/exempi/m4/ax_cflags_gcc_option.m4 new file mode 100644 index 0000000..9a4d62a --- /dev/null +++ b/tests/exempi/m4/ax_cflags_gcc_option.m4 @@ -0,0 +1,230 @@ +##### http://autoconf-archive.cryp.to/ax_cflags_gcc_option.html +# +# SYNOPSIS +# +# AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]]) +# +# DESCRIPTION +# +# AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like +# "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the +# optionflag to CFLAGS if it is understood. You can override the +# shellvar-default of CFLAGS of course. The order of arguments stems +# from the explicit macros like AX_CFLAGS_WARN_ALL. +# +# The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add +# to CXXFLAGS - and it uses the autoconf setup for C++ instead of C +# (since it is possible to use different compilers for C and C++). +# +# The macro is a lot simpler than any special AX_CFLAGS_* macro (or +# ac_cxx_rtti.m4 macro) but allows to check for arbitrary options. +# However, if you use this macro in a few places, it would be great +# if you would make up a new function-macro and submit it to the +# ac-archive. +# +# - $1 option-to-check-for : required ("-option" as non-value) +# - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case) +# - $3 action-if-found : add value to shellvariable +# - $4 action-if-not-found : nothing +# +# note: in earlier versions, $1-$2 were swapped. We try to detect the +# situation and accept a $2=~/-/ as being the old +# option-to-check-for. +# +# also: there are other variants that emerged from the original macro +# variant which did just test an option to be possibly added. +# However, some compilers accept an option silently, or possibly for +# just another option that was not intended. Therefore, we have to do +# a generic test for a compiler family. For gcc we check "-pedantic" +# being accepted which is also understood by compilers who just want +# to be compatible with gcc even when not being made from gcc +# sources. +# +# see also: +# +# AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION +# AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION +# +# LAST MODIFICATION +# +# 2006-12-12 +# +# COPYLEFT +# +# Copyright (c) 2006 Guido U. Draheim +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl +AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$2])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], +VAR,[VAR="no, unknown" + AC_LANG_SAVE + AC_LANG_C + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC + "-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + + +dnl the only difference - the LANG selection... and the default FLAGS + +AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_OLD], [dnl +AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$2])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], +VAR,[VAR="no, unknown" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC + "-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + +dnl ------------------------------------------------------------------------- + +AC_DEFUN([AX_CFLAGS_GCC_OPTION_NEW], [dnl +AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$1])dnl +AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], +VAR,[VAR="no, unknown" + AC_LANG_SAVE + AC_LANG_C + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC + "-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"]) + m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + + +dnl the only difference - the LANG selection... and the default FLAGS + +AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_NEW], [dnl +AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$1])dnl +AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], +VAR,[VAR="no, unknown" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC + "-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"]) + m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + +AC_DEFUN([AX_CFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1, +[AX_CFLAGS_GCC_OPTION_NEW($@)],[AX_CFLAGS_GCC_OPTION_OLD($@)])]) + +AC_DEFUN([AX_CXXFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1, +[AX_CXXFLAGS_GCC_OPTION_NEW($@)],[AX_CXXFLAGS_GCC_OPTION_OLD($@)])]) diff --git a/tests/exempi/m4/ax_check_compile_flag.m4 b/tests/exempi/m4/ax_check_compile_flag.m4 new file mode 100644 index 0000000..ca36397 --- /dev/null +++ b/tests/exempi/m4/ax_check_compile_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 4 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/tests/exempi/m4/ax_cxx_compile_stdcxx.m4 b/tests/exempi/m4/ax_cxx_compile_stdcxx.m4 new file mode 100644 index 0000000..b61fcb6 --- /dev/null +++ b/tests/exempi/m4/ax_cxx_compile_stdcxx.m4 @@ -0,0 +1,982 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the specified +# version of the C++ standard. If necessary, add switches to CXX and +# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) +# or '14' (for the C++14 standard). +# +# The second argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for an extended mode. +# +# The third argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline support for the specified C++ standard is +# required and that the macro should error out if no mode with that +# support is found. If specified 'optional', then configuration proceeds +# regardless, after defining HAVE_CXX${VERSION} if and only if a +# supporting mode is found. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik +# Copyright (c) 2012 Zack Weinberg +# Copyright (c) 2013 Roy Stogner +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov +# Copyright (c) 2015 Paul Norman +# Copyright (c) 2015 Moritz Klammler +# Copyright (c) 2016 Krzesimir Nowak +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro +dnl (serial version number 13). + +AX_REQUIRE_DEFINED([AC_MSG_WARN]) +AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl + m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], + [$1], [14], [ax_cxx_compile_alternatives="14 1y"], + [$1], [17], [ax_cxx_compile_alternatives="17 1z"], + [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$2], [], [], + [$2], [ext], [], + [$2], [noext], [], + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], + [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], + [$3], [optional], [ax_cxx_compile_cxx$1_required=false], + [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, + ax_cv_cxx_compile_cxx$1, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [ax_cv_cxx_compile_cxx$1=yes], + [ax_cv_cxx_compile_cxx$1=no])]) + if test x$ax_cv_cxx_compile_cxx$1 = xyes; then + ac_success=yes + fi + + m4_if([$2], [noext], [], [dnl + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + switch="-std=gnu++${alternative}" + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi]) + + m4_if([$2], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + dnl Cray's crayCC needs "-h std=c++11" + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$ax_cxx_compile_cxx$1_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) + fi + fi + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + AC_SUBST(HAVE_CXX$1) + m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])]) +]) + + +dnl Test body for checking C++11 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 +) + + +dnl Test body for checking C++14 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 +) + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 +) + +dnl Tests for new features in C++11 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201103L + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual void f() {} + }; + + struct Derived : public Base + { + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + +]]) + + +dnl Tests for new features in C++14 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + +]]) + + +dnl Tests for new features in C++17 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus <= 201402L + +#error "This is not a C++17 compiler" + +#else + +#if defined(__clang__) + #define REALLY_CLANG +#else + #if defined(__GNUC__) + #define REALLY_GCC + #endif +#endif + +#include +#include +#include + +namespace cxx17 +{ + +#if !defined(REALLY_CLANG) + namespace test_constexpr_lambdas + { + + // TODO: test it with clang++ from git + + constexpr int foo = [](){return 42;}(); + + } +#endif // !defined(REALLY_CLANG) + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + +#if !defined(REALLY_CLANG) + namespace test_template_argument_deduction_for_class_templates + { + + // TODO: test it with clang++ from git + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } +#endif // !defined(REALLY_CLANG) + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + +#if !defined(REALLY_CLANG) + namespace test_structured_bindings + { + + // TODO: test it with clang++ from git + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } +#endif // !defined(REALLY_CLANG) + +#if !defined(REALLY_CLANG) + namespace test_exception_spec_type_system + { + + // TODO: test it with clang++ from git + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } +#endif // !defined(REALLY_CLANG) + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus <= 201402L + +]]) diff --git a/tests/exempi/m4/ax_cxx_compile_stdcxx_11.m4 b/tests/exempi/m4/ax_cxx_compile_stdcxx_11.m4 new file mode 100644 index 0000000..0aadeaf --- /dev/null +++ b/tests/exempi/m4/ax_cxx_compile_stdcxx_11.m4 @@ -0,0 +1,39 @@ +# ============================================================================ +# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html +# ============================================================================ +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX_11([ext|noext], [mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the C++11 +# standard; if necessary, add switches to CXX and CXXCPP to enable +# support. +# +# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX +# macro with the version set to C++11. The two optional arguments are +# forwarded literally as the second and third argument respectively. +# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for +# more information. If you want to use this macro, you also need to +# download the ax_cxx_compile_stdcxx.m4 file. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik +# Copyright (c) 2012 Zack Weinberg +# Copyright (c) 2013 Roy Stogner +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov +# Copyright (c) 2015 Paul Norman +# Copyright (c) 2015 Moritz Klammler +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 17 + +AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX]) +AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [AX_CXX_COMPILE_STDCXX([11], [$1], [$2])]) diff --git a/tests/exempi/m4/ax_ld_check_flag.m4 b/tests/exempi/m4/ax_ld_check_flag.m4 new file mode 100644 index 0000000..2339657 --- /dev/null +++ b/tests/exempi/m4/ax_ld_check_flag.m4 @@ -0,0 +1,96 @@ +# =========================================================================== +# http://autoconf-archive.cryp.to/ax_ld_check_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_LD_CHECK_FLAG(FLAG-TO-CHECK,[PROLOGUE],[BODY],[ACTION-IF-SUCCESS],[ACTION-IF-FAILURE]) +# +# DESCRIPTION +# +# This macro tests if the C++ compiler supports the flag FLAG-TO-CHECK. If +# successfull execute ACTION-IF-SUCCESS otherwise ACTION-IF-FAILURE. +# PROLOGUE and BODY are optional and should be used as in AC_LANG_PROGRAM +# macro. +# +# Example: +# +# AX_LD_CHECK_FLAG([-Wl,-L/usr/lib],[],[],[ +# ... +# ],[ +# ... +# ]) +# +# This code is inspired from KDE_CHECK_COMPILER_FLAG macro. Thanks to +# Bogdan Drozdowski for testing and bug fixes. +# +# LAST MODIFICATION +# +# 2008-04-12 +# +# COPYLEFT +# +# Copyright (c) 2008 Francesco Salvestrini +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Macro Archive. When you make and +# distribute a modified version of the Autoconf Macro, you may extend this +# special exception to the GPL to apply to your modified version as well. + +AC_DEFUN([AX_LD_CHECK_FLAG],[ + AC_PREREQ([2.61]) + AC_REQUIRE([AC_PROG_CXX]) + AC_REQUIRE([AC_PROG_SED]) + + flag=`echo "$1" | $SED 'y% .=/+-(){}<>:*,%_______________%'` + + AC_CACHE_CHECK([whether the linker accepts the $1 flag], + [ax_cv_ld_check_flag_$flag],[ + + #AC_LANG_PUSH([C]) + + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $1" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([$2],[$3]) + ],[ + eval "ax_cv_ld_check_flag_$flag=yes" + ],[ + eval "ax_cv_ld_check_flag_$flag=no" + ]) + + LDFLAGS="$save_LDFLAGS" + + #AC_LANG_POP + + ]) + + AS_IF([eval "test \"`echo '$ax_cv_ld_check_flag_'$flag`\" = yes"],[ + : + $4 + ],[ + : + $5 + ]) +]) diff --git a/tests/exempi/m4/ax_require_defined.m4 b/tests/exempi/m4/ax_require_defined.m4 new file mode 100644 index 0000000..cae1111 --- /dev/null +++ b/tests/exempi/m4/ax_require_defined.m4 @@ -0,0 +1,37 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_REQUIRE_DEFINED(MACRO) +# +# DESCRIPTION +# +# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have +# been defined and thus are available for use. This avoids random issues +# where a macro isn't expanded. Instead the configure script emits a +# non-fatal: +# +# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found +# +# It's like AC_REQUIRE except it doesn't expand the required macro. +# +# Here's an example: +# +# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +# +# LICENSE +# +# Copyright (c) 2014 Mike Frysinger +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 1 + +AC_DEFUN([AX_REQUIRE_DEFINED], [dnl + m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) +])dnl AX_REQUIRE_DEFINED diff --git a/tests/exempi/m4/ax_tls.m4 b/tests/exempi/m4/ax_tls.m4 new file mode 100644 index 0000000..41620a7 --- /dev/null +++ b/tests/exempi/m4/ax_tls.m4 @@ -0,0 +1,78 @@ +# =========================================================================== +# http://autoconf-archive.cryp.to/ax_tls.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_TLS +# +# DESCRIPTION +# +# Provides a test for the compiler support of thread local storage (TLS) +# extensions. Defines TLS if it is found. Currently only knows about GCC +# and MSVC. I think SunPro uses the same as GCC, and Borland apparently +# supports either. +# +# LAST MODIFICATION +# +# 2008-04-12 +# +# COPYLEFT +# +# Copyright (c) 2008 Alan Woodland +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Macro Archive. When you make and +# distribute a modified version of the Autoconf Macro, you may extend this +# special exception to the GPL to apply to your modified version as well. + +AC_DEFUN([AX_TLS], [ + AC_MSG_CHECKING(for thread local storage (TLS) class) + AC_CACHE_VAL(ac_cv_tls, [ + ax_tls_keywords="__thread __declspec(thread) none" + for ax_tls_keyword in $ax_tls_keywords; do + case $ax_tls_keyword in + none) ac_cv_tls=none ; break ;; + *) + AC_TRY_COMPILE( + [#include + static void + foo(void) { + static ] $ax_tls_keyword [ int bar; + exit(1); + }], + [], + [ac_cv_tls=$ax_tls_keyword ; break], + ac_cv_tls=none + ) + esac + done +]) + + if test "$ac_cv_tls" != "none"; then + dnl AC_DEFINE([TLS], [], [If the compiler supports a TLS storage class define it to that here]) + AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here]) + fi + AC_MSG_RESULT($ac_cv_tls) +]) diff --git a/tests/exempi/m4/boost.m4 b/tests/exempi/m4/boost.m4 new file mode 100644 index 0000000..27d063f --- /dev/null +++ b/tests/exempi/m4/boost.m4 @@ -0,0 +1,1560 @@ +# boost.m4: Locate Boost headers and libraries for autoconf-based projects. +# Copyright (C) 2007-2011, 2014 Benoit Sigoure +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Additional permission under section 7 of the GNU General Public +# License, version 3 ("GPLv3"): +# +# If you convey this file as part of a work that contains a +# configuration script generated by Autoconf, you may do so under +# terms of your choice. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +m4_define([_BOOST_SERIAL], [m4_translit([ +# serial 25 +], [# +], [])]) + +# Original sources can be found at http://github.com/tsuna/boost.m4 +# You can fetch the latest version of the script by doing: +# wget http://github.com/tsuna/boost.m4/raw/master/build-aux/boost.m4 + +# ------ # +# README # +# ------ # + +# This file provides several macros to use the various Boost libraries. +# The first macro is BOOST_REQUIRE. It will simply check if it's possible to +# find the Boost headers of a given (optional) minimum version and it will +# define BOOST_CPPFLAGS accordingly. It will add an option --with-boost to +# your configure so that users can specify non standard locations. +# If the user's environment contains BOOST_ROOT and --with-boost was not +# specified, --with-boost=$BOOST_ROOT is implicitly used. +# For more README and documentation, go to http://github.com/tsuna/boost.m4 +# Note: THESE MACROS ASSUME THAT YOU USE LIBTOOL. If you don't, don't worry, +# simply read the README, it will show you what to do step by step. + +m4_pattern_forbid([^_?(BOOST|Boost)_]) + + +# _BOOST_SED_CPP(SED-PROGRAM, PROGRAM, +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# -------------------------------------------------------- +# Same as AC_EGREP_CPP, but leave the result in conftest.i. +# +# SED-PROGRAM is *not* overquoted, as in AC_EGREP_CPP. It is expanded +# in double-quotes, so escape your double quotes. +# +# It could be useful to turn this into a macro which extracts the +# value of any macro. +m4_define([_BOOST_SED_CPP], +[AC_LANG_PUSH([C++])dnl +AC_LANG_PREPROC_REQUIRE()dnl +AC_REQUIRE([AC_PROG_SED])dnl +AC_LANG_CONFTEST([AC_LANG_SOURCE([[$2]])]) +AS_IF([dnl eval is necessary to expand ac_cpp. +dnl Ultrix and Pyramid sh refuse to redirect output of eval, so use subshell. +dnl Beware of Windows end-of-lines, for instance if we are running +dnl some Windows programs under Wine. In that case, boost/version.hpp +dnl is certainly using "\r\n", but the regular Unix shell will only +dnl strip `\n' with backquotes, not the `\r'. This results in +dnl boost_cv_lib_version='1_37\r' for instance, which breaks +dnl everything else. +dnl Cannot use 'dnl' after [$4] because a trailing dnl may break AC_CACHE_CHECK +dnl +dnl Beware that GCC 5, when expanding macros, may embed # line directives +dnl a within single line: +dnl +dnl # 1 "conftest.cc" +dnl # 1 "" +dnl # 1 "" +dnl # 1 "conftest.cc" +dnl # 1 "/opt/local/include/boost/version.hpp" 1 3 +dnl # 2 "conftest.cc" 2 +dnl boost-lib-version = +dnl # 2 "conftest.cc" 3 +dnl "1_56" +dnl +dnl So get rid of the # lines, and glue the remaining ones together. +(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | + grep -v '#' | + tr -d '\r' | + tr -s '\n' ' ' | + $SED -n -e "$1" >conftest.i 2>&1], + [$3], + [$4]) +rm -rf conftest* +AC_LANG_POP([C++])dnl +])# _BOOST_SED_CPP + + + +# BOOST_REQUIRE([VERSION], [ACTION-IF-NOT-FOUND]) +# ----------------------------------------------- +# Look for Boost. If version is given, it must either be a literal of the form +# "X.Y.Z" where X, Y and Z are integers (the ".Z" part being optional) or a +# variable "$var". +# Defines the value BOOST_CPPFLAGS. This macro only checks for headers with +# the required version, it does not check for any of the Boost libraries. +# On # success, defines HAVE_BOOST. On failure, calls the optional +# ACTION-IF-NOT-FOUND action if one was supplied. +# Otherwise aborts with an error message. +AC_DEFUN_ONCE([BOOST_REQUIRE], +[AC_REQUIRE([AC_PROG_CXX])dnl +AC_REQUIRE([AC_PROG_GREP])dnl +echo "$as_me: this is boost.m4[]_BOOST_SERIAL" >&AS_MESSAGE_LOG_FD +boost_save_IFS=$IFS +boost_version_req=$1 +IFS=. +set x $boost_version_req 0 0 0 +IFS=$boost_save_IFS +shift +boost_version_req=`expr "$[1]" '*' 100000 + "$[2]" '*' 100 + "$[3]"` +boost_version_req_string=$[1].$[2].$[3] +AC_ARG_WITH([boost], + [AS_HELP_STRING([--with-boost=DIR], + [prefix of Boost $1 @<:@guess@:>@])])dnl +AC_ARG_VAR([BOOST_ROOT],[Location of Boost installation])dnl +# If BOOST_ROOT is set and the user has not provided a value to +# --with-boost, then treat BOOST_ROOT as if it the user supplied it. +if test x"$BOOST_ROOT" != x; then + if test x"$with_boost" = x; then + AC_MSG_NOTICE([Detected BOOST_ROOT; continuing with --with-boost=$BOOST_ROOT]) + with_boost=$BOOST_ROOT + else + AC_MSG_NOTICE([Detected BOOST_ROOT=$BOOST_ROOT, but overridden by --with-boost=$with_boost]) + fi +fi +AC_SUBST([DISTCHECK_CONFIGURE_FLAGS], + ["$DISTCHECK_CONFIGURE_FLAGS '--with-boost=$with_boost'"])dnl +boost_save_CPPFLAGS=$CPPFLAGS + AC_CACHE_CHECK([for Boost headers version >= $boost_version_req_string], + [boost_cv_inc_path], + [boost_cv_inc_path=no +AC_LANG_PUSH([C++])dnl +m4_pattern_allow([^BOOST_VERSION$])dnl + AC_LANG_CONFTEST([AC_LANG_PROGRAM([[#include +#if !defined BOOST_VERSION +# error BOOST_VERSION is not defined +#elif BOOST_VERSION < $boost_version_req +# error Boost headers version < $boost_version_req +#endif +]])]) + # If the user provided a value to --with-boost, use it and only it. + case $with_boost in #( + ''|yes) set x '' /opt/local/include /usr/local/include /opt/include \ + /usr/include C:/Boost/include;; #( + *) set x "$with_boost/include" "$with_boost";; + esac + shift + for boost_dir + do + # Without --layout=system, Boost (or at least some versions) installs + # itself in /include/boost-. This inner loop helps to + # find headers in such directories. + # + # Any ${boost_dir}/boost-x_xx directories are searched in reverse version + # order followed by ${boost_dir}. The final '.' is a sentinel for + # searching $boost_dir" itself. Entries are whitespace separated. + # + # I didn't indent this loop on purpose (to avoid over-indented code) + boost_layout_system_search_list=`cd "$boost_dir" 2>/dev/null \ + && ls -1 | "${GREP}" '^boost-' | sort -rn -t- -k2 \ + && echo .` + for boost_inc in $boost_layout_system_search_list + do + if test x"$boost_inc" != x.; then + boost_inc="$boost_dir/$boost_inc" + else + boost_inc="$boost_dir" # Uses sentinel in boost_layout_system_search_list + fi + if test x"$boost_inc" != x; then + # We are going to check whether the version of Boost installed + # in $boost_inc is usable by running a compilation that + # #includes it. But if we pass a -I/some/path in which Boost + # is not installed, the compiler will just skip this -I and + # use other locations (either from CPPFLAGS, or from its list + # of system include directories). As a result we would use + # header installed on the machine instead of the /some/path + # specified by the user. So in that precise case (trying + # $boost_inc), make sure the version.hpp exists. + # + # Use test -e as there can be symlinks. + test -e "$boost_inc/boost/version.hpp" || continue + CPPFLAGS="$CPPFLAGS -I$boost_inc" + fi + AC_COMPILE_IFELSE([], [boost_cv_inc_path=yes], [boost_cv_version=no]) + if test x"$boost_cv_inc_path" = xyes; then + if test x"$boost_inc" != x; then + boost_cv_inc_path=$boost_inc + fi + break 2 + fi + done + done +AC_LANG_POP([C++])dnl + ]) + case $boost_cv_inc_path in #( + no) + boost_errmsg="cannot find Boost headers version >= $boost_version_req_string" + m4_if([$2], [], [AC_MSG_ERROR([$boost_errmsg])], + [AC_MSG_NOTICE([$boost_errmsg])]) + $2 + ;;#( + yes) + BOOST_CPPFLAGS= + ;;#( + *) + AC_SUBST([BOOST_CPPFLAGS], ["-I$boost_cv_inc_path"])dnl + ;; + esac + if test x"$boost_cv_inc_path" != xno; then + AC_DEFINE([HAVE_BOOST], [1], + [Defined if the requested minimum BOOST version is satisfied]) + AC_CACHE_CHECK([for Boost's header version], + [boost_cv_lib_version], + [m4_pattern_allow([^BOOST_LIB_VERSION$])dnl + _BOOST_SED_CPP([[/^boost-lib-version = /{s///;s/[\" ]//g;p;q;}]], + [#include +boost-lib-version = BOOST_LIB_VERSION], + [boost_cv_lib_version=`cat conftest.i`])]) + # e.g. "134" for 1_34_1 or "135" for 1_35 + boost_major_version=`echo "$boost_cv_lib_version" | sed 's/_//;s/_.*//'` + case $boost_major_version in #( + '' | *[[!0-9]]*) + AC_MSG_ERROR([invalid value: boost_major_version='$boost_major_version']) + ;; + esac +fi +CPPFLAGS=$boost_save_CPPFLAGS +])# BOOST_REQUIRE + + +# BOOST_STATIC() +# -------------- +# Add the "--enable-static-boost" configure argument. If this argument is given +# on the command line, static versions of the libraries will be looked up. +AC_DEFUN([BOOST_STATIC], + [AC_ARG_ENABLE([static-boost], + [AS_HELP_STRING([--enable-static-boost], + [Prefer the static boost libraries over the shared ones [no]])], + [enable_static_boost=yes], + [enable_static_boost=no])])# BOOST_STATIC + + +# BOOST_FIND_HEADER([HEADER-NAME], [ACTION-IF-NOT-FOUND], [ACTION-IF-FOUND]) +# -------------------------------------------------------------------------- +# Wrapper around AC_CHECK_HEADER for Boost headers. Useful to check for +# some parts of the Boost library which are only made of headers and don't +# require linking (such as Boost.Foreach). +# +# Default ACTION-IF-NOT-FOUND: Fail with a fatal error unless Boost couldn't be +# found in the first place, in which case by default a notice is issued to the +# user. Presumably if we haven't died already it's because it's OK to not have +# Boost, which is why only a notice is issued instead of a hard error. +# +# Default ACTION-IF-FOUND: define the preprocessor symbol HAVE_ in +# case of success # (where HEADER-NAME is written LIKE_THIS, e.g., +# HAVE_BOOST_FOREACH_HPP). +AC_DEFUN([BOOST_FIND_HEADER], +[AC_REQUIRE([BOOST_REQUIRE])dnl +if test x"$boost_cv_inc_path" = xno; then + m4_default([$2], [AC_MSG_NOTICE([Boost not available, not searching for $1])]) +else +AC_LANG_PUSH([C++])dnl +boost_save_CPPFLAGS=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" +AC_CHECK_HEADER([$1], + [m4_default([$3], [AC_DEFINE(AS_TR_CPP([HAVE_$1]), [1], + [Define to 1 if you have <$1>])])], + [m4_default([$2], [AC_MSG_ERROR([cannot find $1])])]) +CPPFLAGS=$boost_save_CPPFLAGS +AC_LANG_POP([C++])dnl +fi +])# BOOST_FIND_HEADER + + +# BOOST_FIND_LIBS([COMPONENT-NAME], [CANDIDATE-LIB-NAMES], +# [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST], +# [CXX-PROLOGUE]) +# -------------------------------------------------------------- +# Look for the Boost library COMPONENT-NAME (e.g., `thread', for +# libboost_thread) under the possible CANDIDATE-LIB-NAMES (e.g., +# "thread_win32 thread"). Check that HEADER-NAME works and check that +# libboost_LIB-NAME can link with the code CXX-TEST. The optional +# argument CXX-PROLOGUE can be used to include some C++ code before +# the `main' function. +# +# Invokes BOOST_FIND_HEADER([HEADER-NAME]) (see above). +# +# Boost libraries typically come compiled with several flavors (with different +# runtime options) so PREFERRED-RT-OPT is the preferred suffix. A suffix is one +# or more of the following letters: sgdpn (in that order). s = static +# runtime, d = debug build, g = debug/diagnostic runtime, p = STLPort build, +# n = (unsure) STLPort build without iostreams from STLPort (it looks like `n' +# must always be used along with `p'). Additionally, PREFERRED-RT-OPT can +# start with `mt-' to indicate that there is a preference for multi-thread +# builds. Some sample values for PREFERRED-RT-OPT: (nothing), mt, d, mt-d, gdp +# ... If you want to make sure you have a specific version of Boost +# (eg, >= 1.33) you *must* invoke BOOST_REQUIRE before this macro. +AC_DEFUN([BOOST_FIND_LIBS], +[AC_REQUIRE([BOOST_REQUIRE])dnl +AC_REQUIRE([_BOOST_FIND_COMPILER_TAG])dnl +AC_REQUIRE([BOOST_STATIC])dnl +AC_REQUIRE([_BOOST_GUESS_WHETHER_TO_USE_MT])dnl +if test x"$boost_cv_inc_path" = xno; then + AC_MSG_NOTICE([Boost not available, not searching for the Boost $1 library]) +else +dnl The else branch is huge and wasn't intended on purpose. +AC_LANG_PUSH([C++])dnl +AS_VAR_PUSHDEF([Boost_lib], [boost_cv_lib_$1])dnl +AS_VAR_PUSHDEF([Boost_lib_LDFLAGS], [boost_cv_lib_$1_LDFLAGS])dnl +AS_VAR_PUSHDEF([Boost_lib_LDPATH], [boost_cv_lib_$1_LDPATH])dnl +AS_VAR_PUSHDEF([Boost_lib_LIBS], [boost_cv_lib_$1_LIBS])dnl +BOOST_FIND_HEADER([$4]) +boost_save_CPPFLAGS=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" +AC_CACHE_CHECK([for the Boost $1 library], [Boost_lib], + [_BOOST_FIND_LIBS($@)]) +case $Boost_lib in #( + (no) _AC_MSG_LOG_CONFTEST + AC_MSG_ERROR([cannot find the flags to link with Boost $1]) + ;; +esac +AC_SUBST(AS_TR_CPP([BOOST_$1_LDFLAGS]), [$Boost_lib_LDFLAGS])dnl +AC_SUBST(AS_TR_CPP([BOOST_$1_LDPATH]), [$Boost_lib_LDPATH])dnl +AC_SUBST([BOOST_LDPATH], [$Boost_lib_LDPATH])dnl +AC_SUBST(AS_TR_CPP([BOOST_$1_LIBS]), [$Boost_lib_LIBS])dnl +CPPFLAGS=$boost_save_CPPFLAGS +AS_VAR_POPDEF([Boost_lib])dnl +AS_VAR_POPDEF([Boost_lib_LDFLAGS])dnl +AS_VAR_POPDEF([Boost_lib_LDPATH])dnl +AS_VAR_POPDEF([Boost_lib_LIBS])dnl +AC_LANG_POP([C++])dnl +fi +]) + + +# BOOST_FIND_LIB([LIB-NAME], +# [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST], +# [CXX-PROLOGUE]) +# -------------------------------------------------------------- +# Backward compatibility wrapper for BOOST_FIND_LIBS. +AC_DEFUN([BOOST_FIND_LIB], +[BOOST_FIND_LIBS([$1], $@)]) + + +# _BOOST_FIND_LIBS([LIB-NAME], [CANDIDATE-LIB-NAMES], +# [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST], +# [CXX-PROLOGUE]) +# -------------------------------------------------------------- +# Real implementation of BOOST_FIND_LIBS: rely on these local macros: +# Boost_lib, Boost_lib_LDFLAGS, Boost_lib_LDPATH, Boost_lib_LIBS +# +# The algorithm is as follows: first look for a given library name +# according to the user's PREFERRED-RT-OPT. For each library name, we +# prefer to use the ones that carry the tag (toolset name). Each +# library is searched through the various standard paths were Boost is +# usually installed. If we can't find the standard variants, we try +# to enforce -mt (for instance on MacOSX, libboost_thread.dylib +# doesn't exist but there's -obviously- libboost_thread-mt.dylib). +AC_DEFUN([_BOOST_FIND_LIBS], +[Boost_lib=no + case "$3" in #( + (mt | mt-) boost_mt=-mt; boost_rtopt=;; #( + (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X$3" : 'Xmt-*\(.*\)'`;; #( + (*) boost_mt=; boost_rtopt=$3;; + esac + if test $enable_static_boost = yes; then + boost_rtopt="s$boost_rtopt" + fi + # Find the proper debug variant depending on what we've been asked to find. + case $boost_rtopt in #( + (*d*) boost_rt_d=$boost_rtopt;; #( + (*[[sgpn]]*) # Insert the `d' at the right place (in between `sg' and `pn') + boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #( + (*) boost_rt_d='-d';; + esac + # If the PREFERRED-RT-OPT are not empty, prepend a `-'. + test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt" + $boost_guess_use_mt && boost_mt=-mt + # Look for the abs path the static archive. + # $libext is computed by Libtool but let's make sure it's non empty. + test -z "$libext" && + AC_MSG_ERROR([the libext variable is empty, did you invoke Libtool?]) + boost_save_ac_objext=$ac_objext + # Generate the test file. + AC_LANG_CONFTEST([AC_LANG_PROGRAM([#include <$4> +$6], [$5])]) +dnl Optimization hacks: compiling C++ is slow, especially with Boost. What +dnl we're trying to do here is guess the right combination of link flags +dnl (LIBS / LDFLAGS) to use a given library. This can take several +dnl iterations before it succeeds and is thus *very* slow. So what we do +dnl instead is that we compile the code first (and thus get an object file, +dnl typically conftest.o). Then we try various combinations of link flags +dnl until we succeed to link conftest.o in an executable. The problem is +dnl that the various TRY_LINK / COMPILE_IFELSE macros of Autoconf always +dnl remove all the temporary files including conftest.o. So the trick here +dnl is to temporarily change the value of ac_objext so that conftest.o is +dnl preserved accross tests. This is obviously fragile and I will burn in +dnl hell for not respecting Autoconf's documented interfaces, but in the +dnl mean time, it optimizes the macro by a factor of 5 to 30. +dnl Another small optimization: the first argument of AC_COMPILE_IFELSE left +dnl empty because the test file is generated only once above (before we +dnl start the for loops). + AC_COMPILE_IFELSE([], + [ac_objext=do_not_rm_me_plz], + [AC_MSG_ERROR([cannot compile a test that uses Boost $1])]) + ac_objext=$boost_save_ac_objext + boost_failed_libs= +# Don't bother to ident the following nested for loops, only the 2 +# innermost ones matter. +for boost_lib_ in $2; do +for boost_tag_ in -$boost_cv_lib_tag ''; do +for boost_ver_ in -$boost_cv_lib_version ''; do +for boost_mt_ in $boost_mt -mt ''; do +for boost_rtopt_ in $boost_rtopt '' -d; do + for boost_lib in \ + boost_$boost_lib_$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \ + boost_$boost_lib_$boost_tag_$boost_rtopt_$boost_ver_ \ + boost_$boost_lib_$boost_tag_$boost_mt_$boost_ver_ \ + boost_$boost_lib_$boost_tag_$boost_ver_ + do + # Avoid testing twice the same lib + case $boost_failed_libs in #( + (*@$boost_lib@*) continue;; + esac + # If with_boost is empty, we'll search in /lib first, which is not quite + # right so instead we'll try to a location based on where the headers are. + boost_tmp_lib=$with_boost + test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include} + for boost_ldpath in "$boost_tmp_lib/lib" '' \ + /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \ + "$with_boost" C:/Boost/lib /lib* + do + # Don't waste time with directories that don't exist. + if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then + continue + fi + boost_save_LDFLAGS=$LDFLAGS + # Are we looking for a static library? + case $boost_ldpath:$boost_rtopt_ in #( + (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt) + Boost_lib_LIBS="$boost_ldpath/lib$boost_lib.$libext" + test -e "$Boost_lib_LIBS" || continue;; #( + (*) # No: use -lboost_foo to find the shared library. + Boost_lib_LIBS="-l$boost_lib";; + esac + boost_save_LIBS=$LIBS + LIBS="$Boost_lib_LIBS $LIBS" + test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath" +dnl First argument of AC_LINK_IFELSE left empty because the test file is +dnl generated only once above (before we start the for loops). + _BOOST_AC_LINK_IFELSE([], + [Boost_lib=yes], [Boost_lib=no]) + ac_objext=$boost_save_ac_objext + LDFLAGS=$boost_save_LDFLAGS + LIBS=$boost_save_LIBS + if test x"$Boost_lib" = xyes; then + # Check or used cached result of whether or not using -R or + # -rpath makes sense. Some implementations of ld, such as for + # Mac OSX, require -rpath but -R is the flag known to work on + # other systems. https://github.com/tsuna/boost.m4/issues/19 + AC_CACHE_VAL([boost_cv_rpath_link_ldflag], + [case $boost_ldpath in + '') # Nothing to do. + boost_cv_rpath_link_ldflag= + boost_rpath_link_ldflag_found=yes;; + *) + for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do + LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath" + LIBS="$boost_save_LIBS $Boost_lib_LIBS" + _BOOST_AC_LINK_IFELSE([], + [boost_rpath_link_ldflag_found=yes + break], + [boost_rpath_link_ldflag_found=no]) + done + ;; + esac + AS_IF([test "x$boost_rpath_link_ldflag_found" != "xyes"], + [AC_MSG_ERROR([Unable to determine whether to use -R or -rpath])]) + LDFLAGS=$boost_save_LDFLAGS + LIBS=$boost_save_LIBS + ]) + test x"$boost_ldpath" != x && + Boost_lib_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath" + Boost_lib_LDPATH="$boost_ldpath" + break 7 + else + boost_failed_libs="$boost_failed_libs@$boost_lib@" + fi + done + done +done +done +done +done +done # boost_lib_ +rm -f conftest.$ac_objext +]) + + + +# --------------------------------------- # +# Checks for the various Boost libraries. # +# --------------------------------------- # + +# List of boost libraries: http://www.boost.org/libs/libraries.htm +# The page http://beta.boost.org/doc/libs is useful: it gives the first release +# version of each library (among other things). + +# BOOST_DEFUN(LIBRARY, CODE) +# -------------------------- +# Define BOOST_ as a macro that runs CODE. +# +# Use indir to avoid the warning on underquoted macro name given to AC_DEFUN. +m4_define([BOOST_DEFUN], +[m4_indir([AC_DEFUN], + m4_toupper([BOOST_$1]), +[m4_pushdef([BOOST_Library], [$1])dnl +$2 +m4_popdef([BOOST_Library])dnl +]) +]) + +# BOOST_ARRAY() +# ------------- +# Look for Boost.Array +BOOST_DEFUN([Array], +[BOOST_FIND_HEADER([boost/array.hpp])]) + + +# BOOST_ASIO() +# ------------ +# Look for Boost.Asio (new in Boost 1.35). +BOOST_DEFUN([Asio], +[AC_REQUIRE([BOOST_SYSTEM])dnl +BOOST_FIND_HEADER([boost/asio.hpp])]) + + +# BOOST_BIND() +# ------------ +# Look for Boost.Bind. +BOOST_DEFUN([Bind], +[BOOST_FIND_HEADER([boost/bind.hpp])]) + + +# BOOST_CHRONO() +# -------------- +# Look for Boost.Chrono. +BOOST_DEFUN([Chrono], +[# Do we have to check for Boost.System? This link-time dependency was +# added as of 1.35.0. If we have a version <1.35, we must not attempt to +# find Boost.System as it didn't exist by then. +if test $boost_major_version -ge 135; then + BOOST_SYSTEM([$1]) +fi # end of the Boost.System check. +boost_filesystem_save_LIBS=$LIBS +boost_filesystem_save_LDFLAGS=$LDFLAGS +m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl +LIBS="$LIBS $BOOST_SYSTEM_LIBS" +LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS" +BOOST_FIND_LIB([chrono], [$1], + [boost/chrono.hpp], + [boost::chrono::thread_clock d;]) +if test $enable_static_boost = yes && test $boost_major_version -ge 135; then + BOOST_CHRONO_LIBS="$BOOST_CHRONO_LIBS $BOOST_SYSTEM_LIBS" +fi +LIBS=$boost_filesystem_save_LIBS +LDFLAGS=$boost_filesystem_save_LDFLAGS +])# BOOST_CHRONO + + +# BOOST_CONTEXT([PREFERRED-RT-OPT]) +# ----------------------------------- +# Look for Boost.Context. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +# +# * This library was introduced in Boost 1.51.0 +# * The signatures of make_fcontext() and jump_fcontext were changed in 1.56.0 +# * A dependency on boost_thread appears in 1.57.0 +BOOST_DEFUN([Context], +[boost_context_save_LIBS=$LIBS + boost_context_save_LDFLAGS=$LDFLAGS +if test $boost_major_version -ge 157; then + BOOST_THREAD([$1]) + m4_pattern_allow([^BOOST_THREAD_(LIBS|LDFLAGS)$])dnl + LIBS="$LIBS $BOOST_THREAD_LIBS" + LDFLAGS="$LDFLAGS $BOOST_THREAD_LDFLAGS" +fi +BOOST_FIND_LIB([context], [$1], + [boost/context/all.hpp],[[ + +// creates a stack +void * stack_pointer = new void*[4096]; +std::size_t const size = sizeof(void*[4096]); + +#if BOOST_VERSION <= 105100 +ctx::make_fcontext(&fc, f); +return ctx::jump_fcontext(&fcm, &fc, 3) == 6; + +#else + +fc = ctx::make_fcontext(stack_pointer, size, f); +return ctx::jump_fcontext(&fcm, fc, 3) == 6; + +#endif + + +]],[dnl + +#include +#if BOOST_VERSION <= 105100 + +namespace ctx = boost::ctx; + +static ctx::fcontext_t fcm, fc; + +static void f(intptr_t i) { + ctx::jump_fcontext(&fc, &fcm, i * 2); +} + +#elif BOOST_VERSION <= 105500 + +namespace ctx = boost::context; + +// context +static ctx::fcontext_t fcm, *fc; + +// context-function +static void f(intptr_t i) { + ctx::jump_fcontext(fc, &fcm, i * 2); +} + +#else + +namespace ctx = boost::context; + +// context +static ctx::fcontext_t fcm, fc; + +// context-function +static void f(intptr_t i) { + ctx::jump_fcontext(&fc, fcm, i * 2); +} +#endif +]) +LIBS=$boost_context_save_LIBS +LDFLAGS=$boost_context_save_LDFLAGS +])# BOOST_CONTEXT + + +# BOOST_CONVERSION() +# ------------------ +# Look for Boost.Conversion (cast / lexical_cast) +BOOST_DEFUN([Conversion], +[BOOST_FIND_HEADER([boost/cast.hpp]) +BOOST_FIND_HEADER([boost/lexical_cast.hpp]) +])# BOOST_CONVERSION + + +# BOOST_COROUTINE([PREFERRED-RT-OPT]) +# ----------------------------------- +# Look for Boost.Coroutine. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. This library was introduced in Boost +# 1.53.0 +BOOST_DEFUN([Coroutine], +[ +boost_coroutine_save_LIBS=$LIBS +boost_coroutine_save_LDFLAGS=$LDFLAGS +# Link-time dependency from coroutine to context +BOOST_CONTEXT([$1]) +# Starting from Boost 1.55 a dependency on Boost.System is added +if test $boost_major_version -ge 155; then + BOOST_SYSTEM([$1]) +fi +m4_pattern_allow([^BOOST_(CONTEXT|SYSTEM)_(LIBS|LDFLAGS)]) +LIBS="$LIBS $BOOST_CONTEXT_LIBS $BOOST_SYSTEM_LIBS" +LDFLAGS="$LDFLAGS $BOOST_CONTEXT_LDFLAGS" + +# in 1.53 coroutine was a header only library +if test $boost_major_version -eq 153; then + BOOST_FIND_HEADER([boost/coroutine/coroutine.hpp]) +else + BOOST_FIND_LIB([coroutine], [$1], + [boost/coroutine/coroutine.hpp], + [ + #include + #if BOOST_VERSION <= 105500 + boost::coroutines::coroutine coro; coro.get(); + #else + boost::coroutines::asymmetric_coroutine::pull_type coro; coro.get(); + #endif + ]) +fi +# Link-time dependency from coroutine to context, existed only in 1.53, in 1.54 +# coroutine doesn't use context from its headers but from its library. +if test $boost_major_version -eq 153 || test $enable_static_boost = yes && test $boost_major_version -ge 154; then + BOOST_COROUTINE_LIBS="$BOOST_COROUTINE_LIBS $BOOST_CONTEXT_LIBS" + BOOST_COROUTINE_LDFLAGS="$BOOST_COROUTINE_LDFLAGS $BOOST_CONTEXT_LDFLAGS" +fi +if test $enable_static_boost = yes && test $boost_major_version -ge 155; then + BOOST_COROUTINE_LIBS="$BOOST_COROUTINE_LIBS $BOOST_SYSTEM_LIBS" + BOOST_COROUTINE_LDFLAGS="$BOOST_COROUTINE_LDFLAGS $BOOST_SYSTEM_LDFLAGS" +fi +LIBS=$boost_coroutine_save_LIBS +LDFLAGS=$boost_coroutine_save_LDFLAGS +])# BOOST_COROUTINE + + +# BOOST_CRC() +# ----------- +# Look for Boost.CRC +BOOST_DEFUN([CRC], +[BOOST_FIND_HEADER([boost/crc.hpp]) +])# BOOST_CRC + + +# BOOST_DATE_TIME([PREFERRED-RT-OPT]) +# ----------------------------------- +# Look for Boost.Date_Time. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Date_Time], +[BOOST_FIND_LIB([date_time], [$1], + [boost/date_time/posix_time/posix_time.hpp], + [boost::posix_time::ptime t;]) +])# BOOST_DATE_TIME + + +# BOOST_FILESYSTEM([PREFERRED-RT-OPT]) +# ------------------------------------ +# Look for Boost.Filesystem. For the documentation of PREFERRED-RT-OPT, see +# the documentation of BOOST_FIND_LIB above. +# Do not check for boost/filesystem.hpp because this file was introduced in +# 1.34. +BOOST_DEFUN([Filesystem], +[# Do we have to check for Boost.System? This link-time dependency was +# added as of 1.35.0. If we have a version <1.35, we must not attempt to +# find Boost.System as it didn't exist by then. +if test $boost_major_version -ge 135; then + BOOST_SYSTEM([$1]) +fi # end of the Boost.System check. +boost_filesystem_save_LIBS=$LIBS +boost_filesystem_save_LDFLAGS=$LDFLAGS +m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl +LIBS="$LIBS $BOOST_SYSTEM_LIBS" +LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS" +BOOST_FIND_LIB([filesystem], [$1], + [boost/filesystem/path.hpp], [boost::filesystem::path p;]) +if test $enable_static_boost = yes && test $boost_major_version -ge 135; then + BOOST_FILESYSTEM_LIBS="$BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS" +fi +LIBS=$boost_filesystem_save_LIBS +LDFLAGS=$boost_filesystem_save_LDFLAGS +])# BOOST_FILESYSTEM + + +# BOOST_FLYWEIGHT() +# ----------------- +# Look for Boost.Flyweight. +BOOST_DEFUN([Flyweight], +[dnl There's a hidden dependency on pthreads. +AC_REQUIRE([_BOOST_PTHREAD_FLAG])dnl +BOOST_FIND_HEADER([boost/flyweight.hpp]) +AC_SUBST([BOOST_FLYWEIGHT_LIBS], [$boost_cv_pthread_flag]) +]) + + +# BOOST_FOREACH() +# --------------- +# Look for Boost.Foreach. +BOOST_DEFUN([Foreach], +[BOOST_FIND_HEADER([boost/foreach.hpp])]) + + +# BOOST_FORMAT() +# -------------- +# Look for Boost.Format. +# Note: we can't check for boost/format/format_fwd.hpp because the header isn't +# standalone. It can't be compiled because it triggers the following error: +# boost/format/detail/config_macros.hpp:88: error: 'locale' in namespace 'std' +# does not name a type +BOOST_DEFUN([Format], +[BOOST_FIND_HEADER([boost/format.hpp])]) + + +# BOOST_FUNCTION() +# ---------------- +# Look for Boost.Function +BOOST_DEFUN([Function], +[BOOST_FIND_HEADER([boost/function.hpp])]) + + +# BOOST_GEOMETRY() +# ---------------- +# Look for Boost.Geometry (new since 1.47.0). +BOOST_DEFUN([Geometry], +[BOOST_FIND_HEADER([boost/geometry.hpp]) +])# BOOST_GEOMETRY + + +# BOOST_GRAPH([PREFERRED-RT-OPT]) +# ------------------------------- +# Look for Boost.Graphs. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Graph], +[boost_graph_save_LIBS=$LIBS +boost_graph_save_LDFLAGS=$LDFLAGS +# Link-time dependency from graph to regex was added as of 1.40.0. +if test $boost_major_version -ge 140; then + BOOST_REGEX([$1]) + m4_pattern_allow([^BOOST_REGEX_(LIBS|LDFLAGS)$])dnl + LIBS="$LIBS $BOOST_REGEX_LIBS" + LDFLAGS="$LDFLAGS $BOOST_REGEX_LDFLAGS" +fi +BOOST_FIND_LIB([graph], [$1], + [boost/graph/adjacency_list.hpp], [boost::adjacency_list<> g;]) +LIBS=$boost_graph_save_LIBS +LDFLAGS=$boost_graph_save_LDFLAGS +])# BOOST_GRAPH + + +# BOOST_IOSTREAMS([PREFERRED-RT-OPT]) +# ----------------------------------- +# Look for Boost.IOStreams. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([IOStreams], +[BOOST_FIND_LIB([iostreams], [$1], + [boost/iostreams/device/file_descriptor.hpp], + [boost::iostreams::file_descriptor fd; fd.close();]) +])# BOOST_IOSTREAMS + + +# BOOST_HASH() +# ------------ +# Look for Boost.Functional/Hash +BOOST_DEFUN([Hash], +[BOOST_FIND_HEADER([boost/functional/hash.hpp])]) + + +# BOOST_LAMBDA() +# -------------- +# Look for Boost.Lambda +BOOST_DEFUN([Lambda], +[BOOST_FIND_HEADER([boost/lambda/lambda.hpp])]) + + +# BOOST_LOCALE() +# -------------- +# Look for Boost.Locale +BOOST_DEFUN([Locale], +[ +boost_locale_save_LIBS=$LIBS +boost_locale_save_LDFLAGS=$LDFLAGS +# require SYSTEM for boost-1.50.0 and up +if test $boost_major_version -ge 150; then + BOOST_SYSTEM([$1]) + m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl + LIBS="$LIBS $BOOST_SYSTEM_LIBS" + LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS" +fi # end of the Boost.System check. +BOOST_FIND_LIB([locale], [$1], + [boost/locale.hpp], + [[boost::locale::generator gen; std::locale::global(gen(""));]]) +LIBS=$boost_locale_save_LIBS +LDFLAGS=$boost_locale_save_LDFLAGS +])# BOOST_LOCALE + +# BOOST_LOG([PREFERRED-RT-OPT]) +# ----------------------------- +# Look for Boost.Log. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Log], +[boost_log_save_LIBS=$LIBS +boost_log_save_LDFLAGS=$LDFLAGS +BOOST_SYSTEM([$1]) +BOOST_FILESYSTEM([$1]) +BOOST_DATE_TIME([$1]) +m4_pattern_allow([^BOOST_(SYSTEM|FILESYSTEM|DATE_TIME)_(LIBS|LDFLAGS)$])dnl +LIBS="$LIBS $BOOST_DATE_TIME_LIBS $BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS" +LDFLAGS="$LDFLAGS $BOOST_DATE_TIME_LDFLAGS $BOOST_FILESYSTEM_LDFLAGS $BOOST_SYSTEM_LDFLAGS" +BOOST_FIND_LIB([log], [$1], + [boost/log/core/core.hpp], + [boost::log::attribute a; a.get_value();]) +LIBS=$boost_log_save_LIBS +LDFLAGS=$boost_log_save_LDFLAGS +])# BOOST_LOG + + +# BOOST_LOG_SETUP([PREFERRED-RT-OPT]) +# ----------------------------------- +# Look for Boost.Log. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Log_Setup], +[boost_log_setup_save_LIBS=$LIBS +boost_log_setup_save_LDFLAGS=$LDFLAGS +BOOST_LOG([$1]) +m4_pattern_allow([^BOOST_LOG_(LIBS|LDFLAGS)$])dnl +LIBS="$LIBS $BOOST_LOG_LIBS" +LDFLAGS="$LDFLAGS $BOOST_LOG_LDFLAGS" +BOOST_FIND_LIB([log_setup], [$1], + [boost/log/utility/setup/from_settings.hpp], + [boost::log::basic_settings bs; bs.empty();]) +LIBS=$boost_log_setup_save_LIBS +LDFLAGS=$boost_log_setup_save_LDFLAGS +])# BOOST_LOG_SETUP + + +# BOOST_MATH() +# ------------ +# Look for Boost.Math +# TODO: This library isn't header-only but it comes in multiple different +# flavors that don't play well with BOOST_FIND_LIB (e.g, libboost_math_c99, +# libboost_math_c99f, libboost_math_c99l, libboost_math_tr1, +# libboost_math_tr1f, libboost_math_tr1l). This macro must be fixed to do the +# right thing anyway. +BOOST_DEFUN([Math], +[BOOST_FIND_HEADER([boost/math/special_functions.hpp])]) + + +# BOOST_MPI([PREFERRED-RT-OPT]) +# ------------------------------- +# Look for Boost MPI. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. Uses MPICXX variable if it is +# set, otherwise tries CXX +# +BOOST_DEFUN([MPI], +[boost_save_CXX=${CXX} +boost_save_CXXCPP=${CXXCPP} +if test x"${MPICXX}" != x; then + CXX=${MPICXX} + CXXCPP="${MPICXX} -E" +fi +BOOST_FIND_LIB([mpi], [$1], + [boost/mpi.hpp], + [int argc = 0; + char **argv = 0; + boost::mpi::environment env(argc,argv);]) +CXX=${boost_save_CXX} +CXXCPP=${boost_save_CXXCPP} +])# BOOST_MPI + + +# BOOST_MULTIARRAY() +# ------------------ +# Look for Boost.MultiArray +BOOST_DEFUN([MultiArray], +[BOOST_FIND_HEADER([boost/multi_array.hpp])]) + + +# BOOST_NUMERIC_UBLAS() +# -------------------------- +# Look for Boost.NumericUblas (Basic Linear Algebra) +BOOST_DEFUN([Numeric_Ublas], +[BOOST_FIND_HEADER([boost/numeric/ublas/vector.hpp]) +])# BOOST_NUMERIC_UBLAS + + +# BOOST_NUMERIC_CONVERSION() +# -------------------------- +# Look for Boost.NumericConversion (policy-based numeric conversion) +BOOST_DEFUN([Numeric_Conversion], +[BOOST_FIND_HEADER([boost/numeric/conversion/converter.hpp]) +])# BOOST_NUMERIC_CONVERSION + + +# BOOST_OPTIONAL() +# ---------------- +# Look for Boost.Optional +BOOST_DEFUN([Optional], +[BOOST_FIND_HEADER([boost/optional.hpp])]) + + +# BOOST_PREPROCESSOR() +# -------------------- +# Look for Boost.Preprocessor +BOOST_DEFUN([Preprocessor], +[BOOST_FIND_HEADER([boost/preprocessor/repeat.hpp])]) + + +# BOOST_RANGE() +# -------------------- +# Look for Boost.Range +BOOST_DEFUN([Range], +[BOOST_FIND_HEADER([boost/range/adaptors.hpp])]) + +# BOOST_UNORDERED() +# ----------------- +# Look for Boost.Unordered +BOOST_DEFUN([Unordered], +[BOOST_FIND_HEADER([boost/unordered_map.hpp])]) + + +# BOOST_UUID() +# ------------ +# Look for Boost.Uuid +BOOST_DEFUN([Uuid], +[BOOST_FIND_HEADER([boost/uuid/uuid.hpp])]) + + +# BOOST_PROGRAM_OPTIONS([PREFERRED-RT-OPT]) +# ----------------------------------------- +# Look for Boost.Program_options. For the documentation of PREFERRED-RT-OPT, +# see the documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Program_Options], +[BOOST_FIND_LIB([program_options], [$1], + [boost/program_options.hpp], + [boost::program_options::options_description d("test");]) +])# BOOST_PROGRAM_OPTIONS + + + +# _BOOST_PYTHON_CONFIG(VARIABLE, FLAG) +# ------------------------------------ +# Save VARIABLE, and define it via `python-config --FLAG`. +# Substitute BOOST_PYTHON_VARIABLE. +m4_define([_BOOST_PYTHON_CONFIG], +[AC_SUBST([BOOST_PYTHON_$1], + [`python-config --$2 2>/dev/null`])dnl +boost_python_save_$1=$$1 +$1="$$1 $BOOST_PYTHON_$1"]) + + +# BOOST_PYTHON([PREFERRED-RT-OPT]) +# -------------------------------- +# Look for Boost.Python. For the documentation of PREFERRED-RT-OPT, +# see the documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Python], +[_BOOST_PYTHON_CONFIG([CPPFLAGS], [includes]) +_BOOST_PYTHON_CONFIG([LDFLAGS], [ldflags]) +_BOOST_PYTHON_CONFIG([LIBS], [libs]) +m4_pattern_allow([^BOOST_PYTHON_MODULE$])dnl +BOOST_FIND_LIBS([python], [python python3], [$1], + [boost/python.hpp], + [], [BOOST_PYTHON_MODULE(empty) {}]) +CPPFLAGS=$boost_python_save_CPPFLAGS +LDFLAGS=$boost_python_save_LDFLAGS +LIBS=$boost_python_save_LIBS +])# BOOST_PYTHON + + +# BOOST_REF() +# ----------- +# Look for Boost.Ref +BOOST_DEFUN([Ref], +[BOOST_FIND_HEADER([boost/ref.hpp])]) + + +# BOOST_REGEX([PREFERRED-RT-OPT]) +# ------------------------------- +# Look for Boost.Regex. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Regex], +[BOOST_FIND_LIB([regex], [$1], + [boost/regex.hpp], + [boost::regex exp("*"); boost::regex_match("foo", exp);]) +])# BOOST_REGEX + + +# BOOST_SERIALIZATION([PREFERRED-RT-OPT]) +# --------------------------------------- +# Look for Boost.Serialization. For the documentation of PREFERRED-RT-OPT, see +# the documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Serialization], +[BOOST_FIND_LIB([serialization], [$1], + [boost/archive/text_oarchive.hpp], + [std::ostream* o = 0; // Cheap way to get an ostream... + boost::archive::text_oarchive t(*o);]) +])# BOOST_SERIALIZATION + + +# BOOST_SIGNALS([PREFERRED-RT-OPT]) +# --------------------------------- +# Look for Boost.Signals. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Signals], +[BOOST_FIND_LIB([signals], [$1], + [boost/signal.hpp], + [boost::signal s;]) +])# BOOST_SIGNALS + + +# BOOST_SIGNALS2() +# ---------------- +# Look for Boost.Signals2 (new since 1.39.0). +BOOST_DEFUN([Signals2], +[BOOST_FIND_HEADER([boost/signals2.hpp]) +])# BOOST_SIGNALS2 + + +# BOOST_SMART_PTR() +# ----------------- +# Look for Boost.SmartPtr +BOOST_DEFUN([Smart_Ptr], +[BOOST_FIND_HEADER([boost/scoped_ptr.hpp]) +BOOST_FIND_HEADER([boost/shared_ptr.hpp]) +]) + + +# BOOST_STATICASSERT() +# -------------------- +# Look for Boost.StaticAssert +BOOST_DEFUN([StaticAssert], +[BOOST_FIND_HEADER([boost/static_assert.hpp])]) + + +# BOOST_STRING_ALGO() +# ------------------- +# Look for Boost.StringAlgo +BOOST_DEFUN([String_Algo], +[BOOST_FIND_HEADER([boost/algorithm/string.hpp]) +]) + + +# BOOST_SYSTEM([PREFERRED-RT-OPT]) +# -------------------------------- +# Look for Boost.System. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. This library was introduced in Boost +# 1.35.0. +BOOST_DEFUN([System], +[BOOST_FIND_LIB([system], [$1], + [boost/system/error_code.hpp], + [boost::system::error_code e; e.clear();]) +])# BOOST_SYSTEM + + +# BOOST_TEST([PREFERRED-RT-OPT]) +# ------------------------------ +# Look for Boost.Test. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Test], +[m4_pattern_allow([^BOOST_CHECK$])dnl +BOOST_FIND_LIB([unit_test_framework], [$1], + [boost/test/unit_test.hpp], [BOOST_CHECK(2 == 2);], + [using boost::unit_test::test_suite; + test_suite* init_unit_test_suite(int argc, char ** argv) + { return NULL; }]) +])# BOOST_TEST + + +# BOOST_THREAD([PREFERRED-RT-OPT]) +# --------------------------------- +# Look for Boost.Thread. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Thread], +[dnl Having the pthread flag is required at least on GCC3 where +dnl boost/thread.hpp would complain if we try to compile without +dnl -pthread on GNU/Linux. +AC_REQUIRE([_BOOST_PTHREAD_FLAG])dnl +boost_thread_save_LIBS=$LIBS +boost_thread_save_LDFLAGS=$LDFLAGS +boost_thread_save_CPPFLAGS=$CPPFLAGS +# Link-time dependency from thread to system was added as of 1.49.0. +if test $boost_major_version -ge 149; then +BOOST_SYSTEM([$1]) +fi # end of the Boost.System check. +m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl +LIBS="$LIBS $BOOST_SYSTEM_LIBS $boost_cv_pthread_flag" +LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS" +CPPFLAGS="$CPPFLAGS $boost_cv_pthread_flag" + +# When compiling for the Windows platform, the threads library is named +# differently. This suffix doesn't exist in new versions of Boost, or +# possibly new versions of GCC on mingw I am assuming it's Boost's change for +# now and I am setting version to 1.48, for lack of knowledge as to when this +# change occurred. +if test $boost_major_version -lt 148; then + case $host_os in + (*mingw*) boost_thread_lib_ext=_win32;; + esac +fi +BOOST_FIND_LIBS([thread], [thread$boost_thread_lib_ext], + [$1], + [boost/thread.hpp], [boost::thread t; boost::mutex m;]) + +case $host_os in + (*mingw*) boost_thread_w32_socket_link=-lws2_32;; +esac + +BOOST_THREAD_LIBS="$BOOST_THREAD_LIBS $BOOST_SYSTEM_LIBS $boost_cv_pthread_flag $boost_thread_w32_socket_link" +BOOST_THREAD_LDFLAGS="$BOOST_SYSTEM_LDFLAGS" +BOOST_CPPFLAGS="$BOOST_CPPFLAGS $boost_cv_pthread_flag" +LIBS=$boost_thread_save_LIBS +LDFLAGS=$boost_thread_save_LDFLAGS +CPPFLAGS=$boost_thread_save_CPPFLAGS +])# BOOST_THREAD + +AU_ALIAS([BOOST_THREADS], [BOOST_THREAD]) + + +# BOOST_TOKENIZER() +# ----------------- +# Look for Boost.Tokenizer +BOOST_DEFUN([Tokenizer], +[BOOST_FIND_HEADER([boost/tokenizer.hpp])]) + + +# BOOST_TRIBOOL() +# --------------- +# Look for Boost.Tribool +BOOST_DEFUN([Tribool], +[BOOST_FIND_HEADER([boost/logic/tribool_fwd.hpp]) +BOOST_FIND_HEADER([boost/logic/tribool.hpp]) +]) + + +# BOOST_TUPLE() +# ------------- +# Look for Boost.Tuple +BOOST_DEFUN([Tuple], +[BOOST_FIND_HEADER([boost/tuple/tuple.hpp])]) + + +# BOOST_TYPETRAITS() +# -------------------- +# Look for Boost.TypeTraits +BOOST_DEFUN([TypeTraits], +[BOOST_FIND_HEADER([boost/type_traits.hpp])]) + + +# BOOST_UTILITY() +# --------------- +# Look for Boost.Utility (noncopyable, result_of, base-from-member idiom, +# etc.) +BOOST_DEFUN([Utility], +[BOOST_FIND_HEADER([boost/utility.hpp])]) + + +# BOOST_VARIANT() +# --------------- +# Look for Boost.Variant. +BOOST_DEFUN([Variant], +[BOOST_FIND_HEADER([boost/variant/variant_fwd.hpp]) +BOOST_FIND_HEADER([boost/variant.hpp])]) + + +# BOOST_POINTER_CONTAINER() +# ------------------------ +# Look for Boost.PointerContainer +BOOST_DEFUN([Pointer_Container], +[BOOST_FIND_HEADER([boost/ptr_container/ptr_deque.hpp]) +BOOST_FIND_HEADER([boost/ptr_container/ptr_list.hpp]) +BOOST_FIND_HEADER([boost/ptr_container/ptr_vector.hpp]) +BOOST_FIND_HEADER([boost/ptr_container/ptr_array.hpp]) +BOOST_FIND_HEADER([boost/ptr_container/ptr_set.hpp]) +BOOST_FIND_HEADER([boost/ptr_container/ptr_map.hpp]) +])# BOOST_POINTER_CONTAINER + + +# BOOST_WAVE([PREFERRED-RT-OPT]) +# ------------------------------ +# NOTE: If you intend to use Wave/Spirit with thread support, make sure you +# call BOOST_THREAD first. +# Look for Boost.Wave. For the documentation of PREFERRED-RT-OPT, see the +# documentation of BOOST_FIND_LIB above. +BOOST_DEFUN([Wave], +[AC_REQUIRE([BOOST_FILESYSTEM])dnl +AC_REQUIRE([BOOST_DATE_TIME])dnl +boost_wave_save_LIBS=$LIBS +boost_wave_save_LDFLAGS=$LDFLAGS +m4_pattern_allow([^BOOST_((FILE)?SYSTEM|DATE_TIME|THREAD)_(LIBS|LDFLAGS)$])dnl +LIBS="$LIBS $BOOST_SYSTEM_LIBS $BOOST_FILESYSTEM_LIBS $BOOST_DATE_TIME_LIBS \ +$BOOST_THREAD_LIBS" +LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS $BOOST_FILESYSTEM_LDFLAGS \ +$BOOST_DATE_TIME_LDFLAGS $BOOST_THREAD_LDFLAGS" +BOOST_FIND_LIB([wave], [$1], + [boost/wave.hpp], + [boost::wave::token_id id; get_token_name(id);]) +LIBS=$boost_wave_save_LIBS +LDFLAGS=$boost_wave_save_LDFLAGS +])# BOOST_WAVE + + +# BOOST_XPRESSIVE() +# ----------------- +# Look for Boost.Xpressive (new since 1.36.0). +BOOST_DEFUN([Xpressive], +[BOOST_FIND_HEADER([boost/xpressive/xpressive.hpp])]) + + +# ----------------- # +# Internal helpers. # +# ----------------- # + + +# _BOOST_PTHREAD_FLAG() +# --------------------- +# Internal helper for BOOST_THREAD. Computes boost_cv_pthread_flag +# which must be used in CPPFLAGS and LIBS. +# +# Yes, we *need* to put the -pthread thing in CPPFLAGS because with GCC3, +# boost/thread.hpp will trigger a #error if -pthread isn't used: +# boost/config/requires_threads.hpp:47:5: #error "Compiler threading support +# is not turned on. Please set the correct command line options for +# threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)" +# +# Based on ACX_PTHREAD: http://autoconf-archive.cryp.to/acx_pthread.html +AC_DEFUN([_BOOST_PTHREAD_FLAG], +[AC_REQUIRE([AC_PROG_CXX])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_LANG_PUSH([C++])dnl +AC_CACHE_CHECK([for the flags needed to use pthreads], [boost_cv_pthread_flag], +[ boost_cv_pthread_flag= + # The ordering *is* (sometimes) important. Some notes on the + # individual items follow: + # (none): in case threads are in libc; should be tried before -Kthread and + # other compiler flags to prevent continual compiler warnings + # -lpthreads: AIX (must check this before -lpthread) + # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # -llthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + # -pthread: GNU Linux/GCC (kernel threads), BSD/GCC (userland threads) + # -pthreads: Solaris/GCC + # -mthreads: MinGW32/GCC, Lynx/GCC + # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it + # doesn't hurt to check since this sometimes defines pthreads too; + # also defines -D_REENTRANT) + # ... -mt is also the pthreads flag for HP/aCC + # -lpthread: GNU Linux, etc. + # --thread-safe: KAI C++ + case $host_os in #( + *solaris*) + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + boost_pthread_flags="-pthreads -lpthread -mt -pthread";; #( + *) + boost_pthread_flags="-lpthreads -Kthread -kthread -llthread -pthread \ + -pthreads -mthreads -lpthread --thread-safe -mt";; + esac + # Generate the test file. + AC_LANG_CONFTEST([AC_LANG_PROGRAM([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0);])]) + for boost_pthread_flag in '' $boost_pthread_flags; do + boost_pthread_ok=false +dnl Re-use the test file already generated. + boost_pthreads__save_LIBS=$LIBS + LIBS="$LIBS $boost_pthread_flag" + AC_LINK_IFELSE([], + [if grep ".*$boost_pthread_flag" conftest.err; then + echo "This flag seems to have triggered warnings" >&AS_MESSAGE_LOG_FD + else + boost_pthread_ok=:; boost_cv_pthread_flag=$boost_pthread_flag + fi]) + LIBS=$boost_pthreads__save_LIBS + $boost_pthread_ok && break + done +]) +AC_LANG_POP([C++])dnl +])# _BOOST_PTHREAD_FLAG + + +# _BOOST_gcc_test(MAJOR, MINOR) +# ----------------------------- +# Internal helper for _BOOST_FIND_COMPILER_TAG. +m4_define([_BOOST_gcc_test], +["defined __GNUC__ && __GNUC__ == $1 && __GNUC_MINOR__ == $2 && !defined __ICC @ gcc$1$2"])dnl + +# _BOOST_mingw_test(MAJOR, MINOR) +# ----------------------------- +# Internal helper for _BOOST_FIND_COMPILER_TAG. +m4_define([_BOOST_mingw_test], +["defined __GNUC__ && __GNUC__ == $1 && __GNUC_MINOR__ == $2 && !defined __ICC && \ + (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \ + || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw$1$2"])dnl + + +# _BOOST_FIND_COMPILER_TAG() +# -------------------------- +# Internal. When Boost is installed without --layout=system, each library +# filename will hold a suffix that encodes the compiler used during the +# build. The Boost build system seems to call this a `tag'. +AC_DEFUN([_BOOST_FIND_COMPILER_TAG], +[AC_REQUIRE([AC_PROG_CXX])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_CACHE_CHECK([for the toolset name used by Boost for $CXX], + [boost_cv_lib_tag], +[boost_cv_lib_tag=unknown +if test x$boost_cv_inc_path != xno; then + AC_LANG_PUSH([C++])dnl + # The following tests are mostly inspired by boost/config/auto_link.hpp + # The list is sorted to most recent/common to oldest compiler (in order + # to increase the likelihood of finding the right compiler with the + # least number of compilation attempt). + # Beware that some tests are sensible to the order (for instance, we must + # look for MinGW before looking for GCC3). + # I used one compilation test per compiler with a #error to recognize + # each compiler so that it works even when cross-compiling (let me know + # if you know a better approach). + # Known missing tags (known from Boost's tools/build/v2/tools/common.jam): + # como, edg, kcc, bck, mp, sw, tru, xlc + # I'm not sure about my test for `il' (be careful: Intel's ICC pre-defines + # the same defines as GCC's). + for i in \ + _BOOST_mingw_test(5, 3) \ + _BOOST_gcc_test(5, 3) \ + _BOOST_mingw_test(5, 2) \ + _BOOST_gcc_test(5, 2) \ + _BOOST_mingw_test(5, 1) \ + _BOOST_gcc_test(5, 1) \ + _BOOST_mingw_test(5, 0) \ + _BOOST_gcc_test(5, 0) \ + _BOOST_mingw_test(4, 10) \ + _BOOST_gcc_test(4, 10) \ + _BOOST_mingw_test(4, 9) \ + _BOOST_gcc_test(4, 9) \ + _BOOST_mingw_test(4, 8) \ + _BOOST_gcc_test(4, 8) \ + _BOOST_mingw_test(4, 7) \ + _BOOST_gcc_test(4, 7) \ + _BOOST_mingw_test(4, 6) \ + _BOOST_gcc_test(4, 6) \ + _BOOST_mingw_test(4, 5) \ + _BOOST_gcc_test(4, 5) \ + _BOOST_mingw_test(4, 4) \ + _BOOST_gcc_test(4, 4) \ + _BOOST_mingw_test(4, 3) \ + _BOOST_gcc_test(4, 3) \ + _BOOST_mingw_test(4, 2) \ + _BOOST_gcc_test(4, 2) \ + _BOOST_mingw_test(4, 1) \ + _BOOST_gcc_test(4, 1) \ + _BOOST_mingw_test(4, 0) \ + _BOOST_gcc_test(4, 0) \ + "defined __GNUC__ && __GNUC__ == 3 && !defined __ICC \ + && (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \ + || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw" \ + _BOOST_gcc_test(3, 4) \ + _BOOST_gcc_test(3, 3) \ + "defined _MSC_VER && _MSC_VER >= 1500 @ vc90" \ + "defined _MSC_VER && _MSC_VER == 1400 @ vc80" \ + _BOOST_gcc_test(3, 2) \ + "defined _MSC_VER && _MSC_VER == 1310 @ vc71" \ + _BOOST_gcc_test(3, 1) \ + _BOOST_gcc_test(3, 0) \ + "defined __BORLANDC__ @ bcb" \ + "defined __ICC && (defined __unix || defined __unix__) @ il" \ + "defined __ICL @ iw" \ + "defined _MSC_VER && _MSC_VER == 1300 @ vc7" \ + _BOOST_gcc_test(2, 95) \ + "defined __MWERKS__ && __MWERKS__ <= 0x32FF @ cw9" \ + "defined _MSC_VER && _MSC_VER < 1300 && !defined UNDER_CE @ vc6" \ + "defined _MSC_VER && _MSC_VER < 1300 && defined UNDER_CE @ evc4" \ + "defined __MWERKS__ && __MWERKS__ <= 0x31FF @ cw8" + do + boost_tag_test=`expr "X$i" : 'X\([[^@]]*\) @ '` + boost_tag=`expr "X$i" : 'X[[^@]]* @ \(.*\)'` + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#if $boost_tag_test +/* OK */ +#else +# error $boost_tag_test +#endif +]])], [boost_cv_lib_tag=$boost_tag; break], []) + done +AC_LANG_POP([C++])dnl + case $boost_cv_lib_tag in #( + # Some newer (>= 1.35?) versions of Boost seem to only use "gcc" as opposed + # to "gcc41" for instance. + *-gcc | *'-gcc ') :;; #( Don't re-add -gcc: it's already in there. + gcc*) + boost_tag_x= + case $host_os in #( + darwin*) + if test $boost_major_version -ge 136; then + # The `x' added in r46793 of Boost. + boost_tag_x=x + fi;; + esac + # We can specify multiple tags in this variable because it's used by + # BOOST_FIND_LIB that does a `for tag in -$boost_cv_lib_tag' ... + boost_cv_lib_tag="$boost_tag_x$boost_cv_lib_tag -${boost_tag_x}gcc" + ;; #( + unknown) + AC_MSG_WARN([[could not figure out which toolset name to use for $CXX]]) + boost_cv_lib_tag= + ;; + esac +fi])dnl end of AC_CACHE_CHECK +])# _BOOST_FIND_COMPILER_TAG + + +# _BOOST_GUESS_WHETHER_TO_USE_MT() +# -------------------------------- +# Compile a small test to try to guess whether we should favor MT (Multi +# Thread) flavors of Boost. Sets boost_guess_use_mt accordingly. +AC_DEFUN([_BOOST_GUESS_WHETHER_TO_USE_MT], +[# Check whether we do better use `mt' even though we weren't ask to. +AC_LANG_PUSH([C++])dnl +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#if defined _REENTRANT || defined _MT || defined __MT__ +/* use -mt */ +#else +# error MT not needed +#endif +]])], [boost_guess_use_mt=:], [boost_guess_use_mt=false]) +AC_LANG_POP([C++])dnl +]) + +# _BOOST_AC_LINK_IFELSE(PROGRAM, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +# ------------------------------------------------------------------- +# Fork of _AC_LINK_IFELSE that preserves conftest.o across calls. Fragile, +# will break when Autoconf changes its internals. Requires that you manually +# rm -f conftest.$ac_objext in between to really different tests, otherwise +# you will try to link a conftest.o left behind by a previous test. +# Used to aggressively optimize BOOST_FIND_LIB (see the big comment in this +# macro). +# +# Don't use "break" in the actions, as it would short-circuit some code +# this macro runs after the actions. +m4_define([_BOOST_AC_LINK_IFELSE], +[m4_ifvaln([$1], [AC_LANG_CONFTEST([$1])])dnl +rm -f conftest$ac_exeext +boost_save_ac_ext=$ac_ext +boost_use_source=: +# If we already have a .o, re-use it. We change $ac_ext so that $ac_link +# tries to link the existing object file instead of compiling from source. +test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false && + _AS_ECHO_LOG([re-using the existing conftest.$ac_objext]) +AS_IF([_AC_DO_STDERR($ac_link) && { + test -z "$ac_[]_AC_LANG_ABBREV[]_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_executable_p conftest$ac_exeext +dnl FIXME: use AS_TEST_X instead when 2.61 is widespread enough. + }], + [$2], + [if $boost_use_source; then + _AC_MSG_LOG_CONFTEST + fi + $3]) +ac_objext=$boost_save_ac_objext +ac_ext=$boost_save_ac_ext +dnl Delete also the IPA/IPO (Inter Procedural Analysis/Optimization) +dnl information created by the PGI compiler (conftest_ipa8_conftest.oo), +dnl as it would interfere with the next link command. +rm -f core conftest.err conftest_ipa8_conftest.oo \ + conftest$ac_exeext m4_ifval([$1], [conftest.$ac_ext])[]dnl +])# _BOOST_AC_LINK_IFELSE + +# Local Variables: +# mode: autoconf +# End: diff --git a/tests/exempi/m4/shave.m4 b/tests/exempi/m4/shave.m4 new file mode 100644 index 0000000..5b1f675 --- /dev/null +++ b/tests/exempi/m4/shave.m4 @@ -0,0 +1,40 @@ +dnl Make automake/libtool output more friendly to humans +dnl +dnl SHAVE_INIT([shavedir]) +dnl +dnl shavedir: the directory where the shave script is, it defaults to +dnl $(top_builddir) +dnl +dnl * SHAVE_INIT should be called late in your configure.(ac|in) file (just +dnl before AC_CONFIG_FILE/AC_OUTPUT is perfect. This macro rewrite CC and +dnl LIBTOOL, you don't want the configure tests to have these variables +dnl re-defined. +dnl * This macro requires GNU make's -s option. + +AC_DEFUN([SHAVE_INIT], [ +dnl where can we find the shave scripts? +m4_if([$1],, + [shavedir='$(top_builddir)'], + [shavedir='$(top_builddir)'/$1]) +AC_SUBST(shavedir) +dnl make is now quiet +AC_SUBST([MAKEFLAGS], [-s]) +AC_SUBST([AM_MAKEFLAGS], ['`test -z $V && echo -s`']) +dnl we need sed +AC_CHECK_PROG(SED,sed,sed,false) +dnl substitute libtool +SHAVE_SAVED_LIBTOOL=$LIBTOOL +AC_SUBST(SHAVE_SAVED_LIBTOOL) +LIBTOOL="\$(SHELL) \$(shavedir)/shave-libtool '\$(SHAVE_SAVED_LIBTOOL)'" +AC_SUBST(LIBTOOL) +dnl substitute cc +SHAVE_SAVED_CC=$CC +SHAVE_SAVED_CXX=$CXX +AC_SUBST(SHAVE_SAVED_CC) +AC_SUBST(SHAVE_SAVED_CXX) +CC="\$(SHELL) \$(shavedir)/shave cc '\$(SHAVE_SAVED_CC)'" +CXX="\$(SHELL) \$(shavedir)/shave cxx '\$(SHAVE_SAVED_CXX)'" +AC_SUBST(CC) +AC_SUBST(CXX) +]) + diff --git a/tests/exempi/samples/testfiles/BlueSquare-FAIL.gif b/tests/exempi/samples/testfiles/BlueSquare-FAIL.gif new file mode 100644 index 0000000..7dcc9e7 Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare-FAIL.gif differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.ai b/tests/exempi/samples/testfiles/BlueSquare.ai new file mode 100755 index 0000000..2391f02 Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.ai differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.avi b/tests/exempi/samples/testfiles/BlueSquare.avi new file mode 100755 index 0000000..f29de6d Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.avi differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.eps b/tests/exempi/samples/testfiles/BlueSquare.eps new file mode 100755 index 0000000..ea4f79c --- /dev/null +++ b/tests/exempi/samples/testfiles/BlueSquare.eps @@ -0,0 +1,87 @@ +%!PS-Adobe-3.1 EPSF-3.0 %ADO_DSC_Encoding: MacOS Roman %%Title: BlueSquare.eps %%Creator: Adobe Illustrator(R) 12 %%AI8_CreatorVersion: 12.0.0 %AI9_PrintingDataBegin %%For: Alan Lillich %%CreationDate: 9/7/05 %%BoundingBox: 0 0 289 361 %%HiResBoundingBox: 0 0 288.9996 361 %%CropBox: 0 0 288.9996 361 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 %%+ procset Adobe_CoolType_Utility_T42 1.0 0 %%+ procset Adobe_CoolType_Utility_MAKEOCF 1.19 0 %%+ procset Adobe_CoolType_Core 2.23 0 %%+ procset Adobe_AGM_Core 2.0 0 %%+ procset Adobe_AGM_Utils 1.0 0 %%DocumentFonts: %%DocumentNeededFonts: %%DocumentNeededFeatures: %%DocumentSuppliedFeatures: %%DocumentProcessColors: Cyan Magenta Black %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %ADO_BuildNumber: Adobe Illustrator(R) 12.0.0 x5199 R agm 4.3861 ct 5.530 %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 104 128 8 %%BeginData: 29100 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %522853285328532853285328532853285328532853285328532853285328 %532853285328532853285328532853285328532853285328532853285328 %532853285328532853285328532853285328532853285328532853285328 %5328532853285328532853287DFF28290629062906290629062906290629 %062906290629062906290629062906290629062906290629062906290629 %062906290629062906290629062906290629062906290629062906290629 %062906290629062906290629062906290629062906290629062953FF5307 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929287DFF282906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629292906292929062929290629062953FF53072F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F287EFF2829282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929282929292829292953FF532929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F287DFF28292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062953FF53292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F297DFF282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929282929292829292928292929062959FF53072F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29287DFF2829062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062929290629062953FF53072F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F28 %7EFF28292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292953FF532929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F287DFF %282929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629292906292929062953FF53292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F297DFF2829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929062959FF53072F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929287DFF28290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629062953FF53072F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F287EFF282928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292953FF532929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F287DFF2829292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062953FF53292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F297DFF28292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %062959FF53072F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929287DFF282906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906290629 %53FF53072F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F287EFF2829282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929282929292829292928292929282929292829292953FF %532929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F287DFF28292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062953FF5329 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F297DFF282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292928292929282929292829292928292929062959FF53072F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929287DFF2829062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629292906292929062929290629062953FF53072F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F287EFF28292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292953FF532929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F287DFF282929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629292906292929062953FF53292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F297DFF2829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929062959FF53072F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292928 %7DFF28290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629062953FF53072F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F287EFF %282928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929282929292829292953FF532929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F287DFF2829 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062953FF53292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F297DFF28292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929062959FF53072F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929287DFF282906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629062953FF53072F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F287EFF2829282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292953FF532929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F287DFF28292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062953FF53292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F297DFF282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929290629 %59FF53072F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929287DFF2829062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062929290629292906292929062929290629062953FF %53072F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F287EFF28292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292953FF5329 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F287DFF282929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629292906292929062929290629292906292929062953FF53292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F297DFF2829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929282929292829292928292929062959FF53072F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929287DFF28290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629062953FF53072F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F287EFF282928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292928292929282929292829292953FF532929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F287DFF2829292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629292906292929062953FF53292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %7DFF28292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929062959FF53072F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929287DFF %282906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629062953FF53072F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F287EFF2829 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292953FF532929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F287DFF28292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062953FF53292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F297DFF282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929062959FF53072F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929287DFF2829062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629062953FF53072F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F287EFF28292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292953FF532929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F287DFF282929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %53FF53292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F297DFF2829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929282929292829292928292929062959FF %53072F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929287DFF28290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629062953FF5307 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F287EFF282928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929282929292829292928292929282929292829292953FF53292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F287DFF2829292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062929290629292906292929062953FF53292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F297DFF28292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929062959FF53072F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929287DFF282906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629292906292929062929290629062953FF53072F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F287EFF2829282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929282929292829292953FF532929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F28 %7DFF28292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062953FF53292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F297DFF %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292928292929062959FF53072F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929287DFF2829 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629062953FF53072F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F287EFF28292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292953FF532929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F287DFF282929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062953FF53292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F297DFF2829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929062959FF53072F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929287DFF28290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %062953FF53072F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F287EFF282928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %53FF532929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F287DFF2829292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629292906292929062929290629292906292929062953FF %53292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F297DFF28292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929062959FF5307 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929287DFF282906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629292906292929062929290629062953FF53072F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F287EFF2829282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929282929292829292953FF530729072929 %290729292907292929072929290729292907292929072929290729292907 %292929072929290729292907292929072929290729292907292929072929 %290729292907292929072929290729292907292929072929290729292907 %2929290729297DFF27532828285228282852282828522828285228282852 %282828522828285228282852282828522828285228282852282828522828 %285228282852282828522828285228282852282828522828285228282852 %282828522828285228282852282828522828282853FF %%EndData %%EndComments %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Utils 70 dict dup begin put /bdf { bind def } bind def /nd{ null def }bdf /xdf { exch def }bdf /ldf { load def }bdf /ddf { put }bdf /xddf { 3 -1 roll put }bdf /xpt { exch put }bdf /ndf { exch dup where{ pop pop pop }{ xdf }ifelse }def /cdndf { exch dup currentdict exch known{ pop pop }{ exch def }ifelse }def /ps_level /languagelevel where{ pop systemdict /languagelevel get exec }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr} stopped { -1 }if def /set_gvm { currentglobal exch setglobal }bdf /reset_gvm { setglobal }bdf /makereadonlyarray { /packedarray where{ pop packedarray }{ array astore readonly }ifelse }bdf /map_reserved_ink_name { dup type /stringtype eq{ dup /Red eq{ pop (_Red_) }{ dup /Green eq{ pop (_Green_) }{ dup /Blue eq{ pop (_Blue_) }{ dup () cvn eq{ pop (Process) }if }ifelse }ifelse }ifelse }if }bdf /AGMUTIL_GSTATE 22 dict def /get_gstate { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_clr_spc currentcolorspace def /AGMUTIL_GSTATE_clr_indx 0 def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end }def /set_gstate { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap AGMUTIL_GSTATE_lj setlinejoin AGMUTIL_GSTATE_ml setmiterlimit AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash AGMUTIL_GSTATE_sa setstrokeadjust AGMUTIL_GSTATE_clr_rnd setcolorrendering AGMUTIL_GSTATE_op setoverprint AGMUTIL_GSTATE_bg cvx setblackgeneration AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or { currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne { mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark } if }{ AGMUTIL_GSTATE_ht sethalftone } ifelse AGMUTIL_GSTATE_flt setflat end }def /get_gstate_and_matrix { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_ctm matrix currentmatrix def end get_gstate }def /set_gstate_and_matrix { set_gstate AGMUTIL_GSTATE begin AGMUTIL_GSTATE_ctm setmatrix end }def /AGMUTIL_str256 256 string def /AGMUTIL_src256 256 string def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd /thold_halftone { level3 {sethalftone currenthalftone} { dup /HalftoneType get 3 eq { sethalftone currenthalftone } { begin Width Height mul { Thresholds read {pop} if } repeat end currenthalftone } ifelse }ifelse } def /rdcmntline { currentfile AGMUTIL_str256 readline pop (%) anchorsearch {pop} if } bdf /filter_cmyk { dup type /filetype ne{ exch () /SubFileDecode filter } { exch pop } ifelse [ exch { AGMUTIL_src256 readstring pop dup length /AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put /AGMUTIL_ndx AGMUTIL_ndx 1 add def }for pop AGMUTIL_dst64 0 AGMUTIL_ndx getinterval } bind /exec cvx ] cvx } bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get } bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf dup type /filetype ne{ 0 () /SubFileDecode filter }if [ exch [ /devicen_colorspace_dict /AGMCORE_gget cvx /begin cvx currentdict /srcStr get /readstring cvx /pop cvx /dup cvx /length cvx 0 /gt cvx [ Adobe_AGM_Utils /AGMUTIL_ndx 0 /ddf cvx names_index Names length currentdict /srcStr get length 1 sub { 1 /index cvx /exch cvx /get cvx currentdict /dstStr get /AGMUTIL_ndx /load cvx 3 -1 /roll cvx /put cvx Adobe_AGM_Utils /AGMUTIL_ndx /AGMUTIL_ndx /load cvx 1 /add cvx /ddf cvx } for currentdict /dstStr get 0 /AGMUTIL_ndx /load cvx /getinterval cvx ] cvx /if cvx /end cvx ] cvx bind /exec cvx ] cvx end } bdf /AGMUTIL_imagefile nd /read_image_file { AGMUTIL_imagefile 0 setfileposition 10 dict begin /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def /origDataSource imageDict /DataSource get def /origMultipleDataSources imageDict /MultipleDataSources get def /origDecode imageDict /Decode get def /dstDataStr imageDict /Width get colorSpaceElemCnt mul string def imageDict /MultipleDataSources known {MultipleDataSources}{false} ifelse { /imbufCnt imageDict /DataSource get length def /imbufs imbufCnt array def 0 1 imbufCnt 1 sub { /imbufIdx xdf imbufs imbufIdx imbufLen string put imageDict /DataSource get imbufIdx [ AGMUTIL_imagefile imbufs imbufIdx get /readstring cvx /pop cvx ] cvx put } for DeviceN_PS2 { imageDict begin /DataSource [ DataSource /devn_sep_datasource cvx ] cvx def /MultipleDataSources false def /Decode [0 1] def end } if }{ /imbuf imbufLen string def Indexed_DeviceN level3 not and DeviceN_NoneName or { /srcDataStrs [ imageDict begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def imageDict begin /DataSource [AGMUTIL_imagefile Decode BitsPerComponent false 1 /filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource /exec cvx] cvx def /Decode [0 1] def end }{ imageDict /DataSource [1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx /pop cvx names_index /get cvx /put cvx] cvx put imageDict /Decode [0 1] put } ifelse } ifelse imageDict exch load exec imageDict /DataSource origDataSource put imageDict /MultipleDataSources origMultipleDataSources put imageDict /Decode origDecode put end } bdf /write_image_file { begin { (AGMUTIL_imagefile) (w+) file } stopped{ false }{ Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def MultipleDataSources {DataSource 0 get}{DataSource}ifelse type /filetype eq { /imbuf imbufLen string def }if 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ pop MultipleDataSources { 0 1 DataSource length 1 sub { DataSource type dup /arraytype eq { pop DataSource exch get exec }{ /filetype eq { DataSource exch get imbuf readstring pop }{ DataSource exch get } ifelse } ifelse AGMUTIL_imagefile exch writestring } for }{ DataSource type dup /arraytype eq { pop DataSource exec }{ /filetype eq { DataSource imbuf readstring pop }{ DataSource } ifelse } ifelse AGMUTIL_imagefile exch writestring } ifelse }for end true }ifelse end } bdf /close_image_file { AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile }def statusdict /product known userdict /AGMP_current_show known not and{ /pstr statusdict /product get def pstr (HP LaserJet 2200) eq pstr (HP LaserJet 4000 Series) eq or pstr (HP LaserJet 4050 Series ) eq or pstr (HP LaserJet 8000 Series) eq or pstr (HP LaserJet 8100 Series) eq or pstr (HP LaserJet 8150 Series) eq or pstr (HP LaserJet 5000 Series) eq or pstr (HP LaserJet 5100 Series) eq or pstr (HP Color LaserJet 4500) eq or pstr (HP Color LaserJet 4600) eq or pstr (HP LaserJet 5Si) eq or pstr (HP LaserJet 1200 Series) eq or pstr (HP LaserJet 1300 Series) eq or pstr (HP LaserJet 4100 Series) eq or { userdict /AGMP_current_show /show load put userdict /show { currentcolorspace 0 get /Pattern eq {false charpath f} {AGMP_current_show} ifelse } put }if currentdict /pstr undef } if /consumeimagedata { begin currentdict /MultipleDataSources known not {/MultipleDataSources false def} if MultipleDataSources { DataSource 0 get type dup /filetype eq { 1 dict begin /flushbuffer Width cvi string def 1 1 Height cvi { pop 0 1 DataSource length 1 sub { DataSource exch get flushbuffer readstring pop pop }for }for end }if dup /arraytype eq exch /packedarraytype eq or DataSource 0 get xcheck and { Width Height mul cvi { 0 1 DataSource length 1 sub {dup DataSource exch get exec length exch 0 ne {pop}if}for dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if } { /DataSource load type dup /filetype eq { 1 dict begin /flushbuffer Width Decode length 2 idiv mul cvi string def 1 1 Height { pop DataSource flushbuffer readstring pop pop} for end }if dup /arraytype eq exch /packedarraytype eq or /DataSource load xcheck and { Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul { DataSource length dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if }ifelse end }bdf /addprocs { 2{/exec load}repeat 3 1 roll [ 5 1 roll ] bind cvx }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end sethalftone pop }ifelse }def /clonearray { dup xcheck exch dup length array exch Adobe_AGM_Core/AGMCORE_tmp -1 ddf { Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf dup type /dicttype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonedict Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if dup type /arraytype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonearray Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if exch dup Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put }forall exch {cvx} if }bdf /clonedict { dup length dict begin { dup type /dicttype eq { clonedict } if dup type /arraytype eq { clonearray } if def }forall currentdict end }bdf /DeviceN_PS2 { /currentcolorspace AGMCORE_gget 0 get /DeviceN eq level3 not and } bdf /Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget dup null ne { dup /CSDBase known { /CSDBase get /CSD get_res /Names known }{ pop false }ifelse }{ pop false } ifelse } bdf /DeviceN_NoneName { /Names where { pop false Names { (None) eq or } forall }{ false }ifelse } bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { pop dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false } { true }ifelse } { true } ifelse } { true } ifelse } bdf /base_colorspace_type { dup type /arraytype eq {0 get} if } bdf /currentdistillerparams where { pop currentdistillerparams /CoreDistVersion get 5000 lt}{true}ifelse { /pdfmark_5 {cleartomark} bind def }{ /pdfmark_5 {pdfmark} bind def }ifelse /ReadBypdfmark_5 { 2 dict begin /makerString exch def string /tmpString exch def { currentfile tmpString readline pop makerString anchorsearch { pop pop cleartomark exit }{ 3 copy /PUT pdfmark_5 pop 2 copy (\n) /PUT pdfmark_5 } ifelse }loop end } bdf /doc_setup{ Adobe_AGM_Utils begin }bdf /doc_trailer{ currentdict Adobe_AGM_Utils eq{ end }if }bdf systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright (C) 1997-2005 Adobe Systems, Inc. All Rights Reserved. %% Note: This procset assumes Adobe_AGM_Utils is opened on the stack below it, for %% definitions of some fundamental procedures. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Core 201 dict dup begin put /Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen [currentscreen] cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&setcmykcolor nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_distilling nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSD_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd /AGMCORE_feature_opCount nd /AGMCORE_feature_ctm nd /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd /AGMCORE_in_pattern false def /AGMCORE_currentpagedevice nd /knockout_unitsq nd currentglobal true setglobal [/CSA /Gradient /Procedure] { /Generic /Category findresource dup length dict copy /Category defineresource pop } forall setglobal /AGMCORE_key_known { where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /flushinput { save 2 dict begin /CompareBuffer 3 -1 roll def /readbuffer 256 string def mark { currentfile readbuffer {readline} stopped {cleartomark mark} { not {pop exit} if CompareBuffer eq {exit} if }ifelse }loop cleartomark end restore }bdf /getspotfunction { AGMCORE_screen exch pop exch pop dup type /dicttype eq{ dup /HalftoneType get 1 eq{ /SpotFunction get }{ dup /HalftoneType get 2 eq{ /GraySpotFunction get }{ pop { abs exch abs 2 copy add 1 gt{ 1 sub dup mul exch 1 sub dup mul add 1 sub }{ dup mul exch dup mul add 1 exch sub }ifelse }bind }ifelse }ifelse }if } def /clp_npth { clip newpath } def /eoclp_npth { eoclip newpath } def /npth_clp { newpath clip } def /graphic_setup { /AGMCORE_graphicsave save def concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth [] 0 setdash 10 setmiterlimit newpath false setoverprint false setstrokeadjust //Adobe_AGM_Core/spot_alias get exec /Adobe_AGM_Image where { pop Adobe_AGM_Image/spot_alias 2 copy known{ get exec }{ pop pop }ifelse } if 100 dict begin /dictstackcount countdictstack def /showpage {} def mark } def /graphic_cleanup { cleartomark dictstackcount 1 countdictstack 1 sub {end}for end AGMCORE_graphicsave restore } def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def } { AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def } ifelse } forall } bdf /doc_setup{ Adobe_AGM_Core begin /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict /AGM_handleerror known not{ errordict /AGM_handleerror errordict /handleerror get put errordict /handleerror { Adobe_AGM_Core begin $error /newerror get AGMCORE_cur_err null ne and{ $error /newerror false put AGMCORE_cur_err compose_error_msg }if $error /newerror true put end errordict /AGM_handleerror get exec } bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err /AGMCORE_bad_environ def} if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def /AGMCORE_distilling /product where{ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and }{ false }ifelse def /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 10 def /AGMCORE_&gsave /gsave ldf /AGMCORE_&grestore /grestore ldf /AGMCORE_&grestoreall /grestoreall ldf /AGMCORE_&save /save ldf /AGMCORE_&setoverprint /setoverprint ldf /AGMCORE_gdictcopy { begin { def } forall end }def /AGMCORE_gput { AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget { AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave { AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore { AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt {1 add} if dup AGMCORE_gstack exch get dup /AGMCORE_currentoverprint known {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse /AGMCORE_gstackptr exch store }def /grestoreall { AGMCORE_&grestoreall /AGMCORE_gstackptr AGMCORE_gstacksaveptr store }def /save { AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store /AGMCORE_gstacksaveptr AGMCORE_gstackptr store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /setoverprint{ dup /AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint }def 0 1 AGMCORE_gstack length 1 sub { AGMCORE_gstack exch AGMCORE_gstackframekeys dict put } for }if level3 /AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def /AGMCORE_&sysmakepattern systemdict/makepattern get def /AGMCORE_&usrmakepattern /makepattern load def }if /currentcmykcolor [0 0 0 0] AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace [/DeviceGray] AGMCORE_gput /sep_tint 0 AGMCORE_gput /devicen_tints [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent () AGMCORE_gput /customcolor_tint 1 AGMCORE_gput << /MaxPatternItem currentsystemparams /MaxPatternCache get >> setuserparams end }def /page_setup { /setcmykcolor where{ pop Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor pop }ndf /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint { pop }ndf /currentoverprint { false }ndf /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_have_reported_unsupported_color_space false def /AGMCORE_report_unsupported_color_space { AGMCORE_have_reported_unsupported_color_space false eq { (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.) == Adobe_AGM_Core /AGMCORE_have_reported_unsupported_color_space true ddf } if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_in_rip_sep /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ AGMCORE_distilling { false }{ userdict/Adobe_AGM_OnHost_Seps known{ false }{ level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse }ifelse }ifelse }ifelse def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ AGMCORE_distilling AGMCORE_producing_seps or }ifelse def /AGM_is_distiller_preserving_spotimages { currentdistillerparams/PreserveOverprintSettings known { currentdistillerparams/PreserveOverprintSettings get { currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get /sRGB ne }{ true }ifelse }{ false }ifelse }{ false }ifelse }def /convert_spot_to_process where {pop}{ /convert_spot_to_process { //Adobe_AGM_Core begin dup map_alias { /Name get exch pop } if dup dup (None) eq exch (All) eq or { pop false }{ AGMCORE_host_sep { gsave 1 0 0 0 setcmykcolor currentgray 1 exch sub 0 1 0 0 setcmykcolor currentgray 1 exch sub 0 0 1 0 setcmykcolor currentgray 1 exch sub 0 0 0 1 setcmykcolor currentgray 1 exch sub add add add 0 eq { pop false }{ false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne }ifelse grestore }{ AGMCORE_distilling { pop AGM_is_distiller_preserving_spotimages not }{ //Adobe_AGM_Core/AGMCORE_name xddf false //Adobe_AGM_Core/AGMCORE_in_pattern known {//Adobe_AGM_Core/AGMCORE_in_pattern get}{false} ifelse not AGMCORE_currentpagedevice/OverrideSeparations known and { AGMCORE_currentpagedevice/OverrideSeparations get { /HqnSpots /ProcSet resourcestatus { pop pop pop true }if }if }if { AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not }{ gsave [/Separation AGMCORE_name /DeviceGray {}]AGMCORE_&setcolorspace false AGMCORE_currentpagedevice/SeparationColorNames 2 copy known { get { AGMCORE_name eq or}forall not }{ pop pop pop true }ifelse grestore }ifelse }ifelse }ifelse }ifelse end }def }ifelse /convert_to_process where {pop}{ /convert_to_process { dup length 0 eq { pop false }{ AGMCORE_host_sep { dup true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } forall { true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch (Black) eq or and }forall not }{pop false}ifelse }{ false exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process or}ifelse } forall }ifelse }ifelse }def }ifelse /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse { /setcmykcolor[ { 4 copy add add add 0 eq currentoverprint and{ pop 0.0005 }if }/exec cvx /AGMCORE_&setcmykcolor load dup type/operatortype ne{ /exec cvx }if ]cvx def }if /AGMCORE_IsSeparationAProcessColor { dup (Cyan) eq exch dup (Magenta) eq exch dup (Yellow) eq exch (Black) eq or or or }def AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ AGMCORE_magenta_plate{ 4 3 roll pop pop pop }{ AGMCORE_yellow_plate{ 4 2 roll pop pop pop }{ 4 1 roll pop pop pop }ifelse }ifelse }ifelse settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames { 1 dict begin /filtername { dup /Cyan eq 1 index (Cyan) eq or {pop (_cyan_)}if dup /Magenta eq 1 index (Magenta) eq or {pop (_magenta_)}if dup /Yellow eq 1 index (Yellow) eq or {pop (_yellow_)}if dup /Black eq 1 index (Black) eq or {pop (_black_)}if }def dup type /arraytype eq {[exch {filtername}forall]} {filtername}ifelse end }def level3 { /AGMCORE_IsCurrentColor { dup AGMCORE_IsSeparationAProcessColor { AGMCORE_plate_ndx 0 eq {dup (Cyan) eq exch /Cyan eq or}if AGMCORE_plate_ndx 1 eq {dup (Magenta) eq exch /Magenta eq or}if AGMCORE_plate_ndx 2 eq {dup (Yellow) eq exch /Yellow eq or}if AGMCORE_plate_ndx 3 eq {dup (Black) eq exch /Black eq or}if AGMCORE_plate_ndx 4 eq {pop false}if }{ gsave false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne grestore }ifelse }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf data_in type /stringtype eq { /ncomp xdf /comp xdf /string_out data_in length ncomp idiv string def 0 ncomp data_in length 1 sub { string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put }for string_out }{ string /string_in xdf /string_out 1 string def /component xdf [ data_in string_in /readstring cvx [component /get cvx 255 /exch cvx /sub cvx string_out /exch cvx 0 /exch cvx /put cvx string_out]cvx [/pop cvx ()]cvx /ifelse cvx ]cvx /ReusableStreamDecode filter }ifelse end }def /AGMCORE_separateShadingFunction { 2 dict begin /paint? xdf /channel xdf dup type /dicttype eq { begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def currentdict /Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not {/Decode [1 1]def}if }if FunctionType 2 eq { paint? { /C0 [C0 channel get 1 exch sub] def /C1 [C1 channel get 1 exch sub] def }{ /C0 [1] def /C1 [1] def }ifelse }if FunctionType 3 eq { /Functions [Functions {channel paint? AGMCORE_separateShadingFunction} forall] def }if currentdict /Range known {/Range [0 1] def}if currentdict end}{ channel get 0 paint? AGMCORE_separateShadingFunction }ifelse end }def /AGMCORE_separateShading { 3 -1 roll begin currentdict /Function known { currentdict /Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if Function 3 1 roll AGMCORE_separateShadingFunction /Function xdf /ColorSpace [/DeviceGray] def }{ ColorSpace dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse ColorSpace 0 get /Separation eq { { [1 /exch cvx /sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll put pop }{ { [exch ColorSpace 1 get length 1 sub exch sub /index cvx 1 /exch cvx /sub cvx ColorSpace 1 get length 1 add 1 /roll cvx ColorSpace 1 get length{/pop cvx} repeat]cvx }{ pop [ColorSpace 1 get length {/pop cvx} repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse ColorSpace 2 /DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { dup /ColorSpace get dup type /arraytype ne {[exch]}if dup 0 get /DeviceCMYK eq { exch begin currentdict AGMCORE_cyan_plate {0 true}if AGMCORE_magenta_plate {1 true}if AGMCORE_yellow_plate {2 true}if AGMCORE_black_plate {3 true}if AGMCORE_plate_ndx 4 eq {0 false}if dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading currentdict end exch }if dup 0 get /Separation eq { exch begin ColorSpace 1 get dup /None ne exch /All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /Separation ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading }if }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse }if currentdict end exch }if dup 0 get /DeviceN eq { exch begin ColorSpace 1 get convert_to_process { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /DeviceN ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading /ColorSpace [/DeviceGray] def }if }ifelse }{ currentdict false -1 ColorSpace 1 get { AGMCORE_IsCurrentColor { 1 add exch pop true exch exit }if 1 add }forall exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse currentdict end exch }if dup 0 get dup /DeviceCMYK eq exch dup /Separation eq exch /DeviceN eq or or not { exch begin ColorSpace dup type /arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { ColorSpace 0 get /CIEBasedA eq { /ColorSpace [/Separation /_ciebaseda_ /DeviceGray {}] def }if ColorSpace 0 get dup /CIEBasedABC eq exch dup /CIEBasedDEF eq exch /DeviceRGB eq or or { /ColorSpace [/DeviceN [/_red_ /_green_ /_blue_] /DeviceRGB {}] def }if ColorSpace 0 get /CIEBasedDEFG eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }if currentdict 0 false AGMCORE_separateShading }if }if currentdict end exch }if pop dup /AGMCORE_ignoreshade known { begin /ColorSpace [/Separation (None) /DeviceGray {}] def currentdict end }if }def /shfill { AGMCORE_separateShadingDict dup /AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch dup /PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def Shading /AGMCORE_ignoreshade known currentdict end exch {pop <>}if exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern }ifelse }def }if }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4 {4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ //Adobe_AGM_Core begin /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf end [/Separation 4 -1 roll /DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation (All) /DeviceGray {}] setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4 {4 index mul 4 1 roll} repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval {255 div} forall } bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index } bdf /n_color_components { base_colorspace_type dup /DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse }bdf level2{ /mo /moveto ldf /li /lineto ldf /cv /curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def level2 /setcolorspace AGMCORE_key_known not and{ /AGMCORE_&&&setcolorspace /setcolorspace ldf /AGMCORE_ReplaceMappedColor { dup type dup /arraytype eq exch /packedarraytype eq or { /AGMCORE_SpotAliasAry2 where { begin dup 0 get dup /Separation eq { pop dup length array copy dup dup 1 get current_spot_alias { dup map_alias { false set_spot_alias dup 1 exch setsepcolorspace true set_spot_alias begin /sep_colorspace_dict currentdict AGMCORE_gput pop pop pop [ /Separation Name CSA map_csa MappedCSA /sep_colorspace_proc load ] dup Name end }if }if map_reserved_ink_name 1 xpt }{ /DeviceN eq { dup length array copy dup dup 1 get [ exch { current_spot_alias{ dup map_alias{ /Name get exch pop }if }if map_reserved_ink_name } forall ] 1 xpt }if }ifelse end } if }if }def /setcolorspace { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /Indexed eq { AGMCORE_distilling { /PhotoshopDuotoneList where { pop false }{ true }ifelse }{ true }ifelse { aload pop 3 -1 roll AGMCORE_ReplaceMappedColor 3 1 roll 4 array astore }if }{ AGMCORE_ReplaceMappedColor }ifelse }if DeviceN_PS2_inRip_seps {AGMCORE_&&&setcolorspace} if }def }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /li{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1 [8 0 0 8 0 0] {} image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /setcolorspace { /currentcolorspace exch AGMCORE_gput } def /currentcolorspace { /currentcolorspace AGMCORE_gget } def /setcolor_devicecolor { base_colorspace_type dup /DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup /DeviceGray ne{ dup /DeviceCMYK ne{ dup /DeviceRGB ne{ dup /Separation eq{ pop currentcolorspace 3 get exec currentcolorspace 2 get }{ dup /Indexed eq{ pop currentcolorspace 3 get dup type /stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err /AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor } def }ifelse /sop /setoverprint ldf /lw /setlinewidth ldf /lc /setlinecap ldf /lj /setlinejoin ldf /ml /setmiterlimit ldf /dsh /setdash ldf /sadj /setstrokeadjust ldf /gry /setgray ldf /rgb /setrgbcolor ldf /cmyk /setcmykcolor ldf /sep /setsepcolor ldf /devn /setdevicencolor ldf /idx /setindexedcolor ldf /colr /setcolor ldf /csacrd /set_csa_crd ldf /sepcs /setsepcolorspace ldf /devncs /setdevicencolorspace ldf /idxcs /setindexedcolorspace ldf /cp /closepath ldf /clp /clp_npth ldf /eclp /eoclp_npth ldf /f /fill ldf /ef /eofill ldf /@ /stroke ldf /nclp /npth_clp ldf /gset /graphic_setup ldf /gcln /graphic_cleanup ldf /AGMCORE_def_ht currenthalftone def /clonedict Adobe_AGM_Utils begin /clonedict load end def /clonearray Adobe_AGM_Utils begin /clonearray load end def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { bind }if def }forall /getrampcolor { /indx exch def 0 1 NumComp 1 sub { dup Samples exch get dup type /stringtype eq {indx get} if exch Scaling exch get aload pop 3 1 roll mul add } for ColorSpaceFamily /Separation eq {sep} { ColorSpaceFamily /DeviceN eq {devn} {setcolor}ifelse }ifelse } bdf /sssetbackground {aload pop setcolor} bdf /RadialShade { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /r2 xdf /c2y xdf /c2x xdf /r1 xdf /c1y xdf /c1x xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if c1x c2x eq { c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse } { /slope c2y c1y sub c2x c1x sub div def /theta slope 1 atan def c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if } ifelse gsave clippath c1x c1y translate theta rotate -90 rotate { pathbbox } stopped { 0 0 0 0 } if /yMax xdf /xMax xdf /yMin xdf /xMin xdf grestore xMax xMin eq yMax yMin eq or { grestore end } { /max { 2 copy gt { pop } {exch pop} ifelse } bdf /min { 2 copy lt { pop } {exch pop} ifelse } bdf rampdict begin 40 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave c1x c1y translate theta rotate -90 rotate /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def /c1y 0 def /c1x 0 def /c2x 0 def ext0 { 0 getrampcolor c2y r2 add r1 sub 0.0001 lt { c1x c1y r1 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2y r1 add r2 le { c1x c1y r1 0 360 arc fill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r1 neg def /p1y c1y def /p2x r1 def /p2y c1y def p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y p1x SS1 div neg def /SS2 90 theta sub dup sin exch cos div def /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y p2x SS2 div neg def r1 r2 gt { /L1maxX p1x yMin p1y sub SS1 div add def /L2maxX p2x yMin p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def } ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if c1x c2x sub dup mul c1y c2y sub dup mul add 0.5 exp 0 dtransform dup mul exch dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop /hires xdf hires mul /numpix xdf /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if /xInc c2x c1x sub numsteps div def /yInc c2y c1y sub numsteps div def /rInc r2 r1 sub numsteps div def /cx c1x def /cy c1y def /radius r1 def newpath xInc 0 eq yInc 0 eq rInc 0 eq and and { 0 getrampcolor cx cy radius 0 360 arc stroke NumSamples 1 sub getrampcolor cx cy radius 72 hires div add 0 360 arc 0 setlinewidth stroke } { 0 numsteps { dup subsampling { round cvi } if getrampcolor cx cy radius 0 360 arc /cx cx xInc add def /cy cy yInc add def /radius radius rInc add def cx cy radius 360 0 arcn eofill rampIndxInc add } repeat pop } ifelse ext1 { c2y r2 add r1 lt { c2x c2y r2 0 360 arc fill } { c2y r1 add r2 sub 0.0001 le { c2x c2y r2 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r2 neg def /p1y c2y def /p2x r2 def /p2y c2y def p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y c2y p1x SS1 div sub def /SS2 90 theta sub dup sin exch cos div def /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y c2y p2x SS2 div sub def r1 r2 lt { /L1maxX p1x yMax p1y sub SS1 div add def /L2maxX p2x yMax p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if grestore grestore end end end } ifelse } bdf /GenStrips { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /y2 xdf /x2 xdf /y1 xdf /x1 xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if x1 x2 eq { y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse } { /slope y2 y1 sub x2 x1 sub div def /theta slope 1 atan def x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if } ifelse gsave clippath x1 y1 translate theta rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { rampdict begin 20 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave x1 y1 translate theta rotate /xStart 0 def /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def /ySpan yMax yMin sub def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def xStart 0 transform xEnd 0 transform 3 -1 roll sub dup mul 3 1 roll sub dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop mul /numpix xdf numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if ext0 { 0 getrampcolor xMin xStart lt { xMin yMin xMin neg ySpan rectfill } if } if /xInc xEnd xStart sub numsteps div def /x xStart def 0 numsteps { dup subsampling { round cvi } if getrampcolor x yMin xInc ySpan rectfill /x x xInc add def rampIndxInc add } repeat pop ext1 { xMax xEnd gt { xEnd yMin xMax xEnd sub ySpan rectfill } if } if grestore grestore end end end } ifelse } bdf }def /page_trailer { end }def /doc_trailer{ }def /capture_currentpagedevice { //Adobe_AGM_Core/AGMCORE_currentpagedevice currentpagedevice ddf } def systemdict /findcolorrendering known{ /findcolorrendering systemdict /findcolorrendering get def }if systemdict /setcolorrendering known{ /setcolorrendering systemdict /setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { dup //Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA get_csa_by_name setcolorspace_opt set_crd end } def /map_csa { currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse {pop}{get_csa_by_name /MappedCSA xdf}ifelse } def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup /sep_tint exch AGMCORE_gput TintProc end } def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin Names length copy Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt } for TintProc end } def /sep_colorspace_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll } repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end } def /sep_colorspace_gray_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end } def /sep_proc_name { dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ pop [/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse } def /setsepcolorspace { current_spot_alias{ dup begin Name map_alias{ exch pop }if end }if dup /sep_colorspace_dict exch AGMCORE_gput begin CSA map_csa /AGMCORE_sep_special Name dup () eq exch (All) eq or store AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx ] setcolorspace_opt /TintProc { 255 mul round cvi setcolor }bdf }{ MappedCSA 0 get /DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc [ Components aload pop Name findcmykcustomcolor /exch cvx /setcustomcolor cvx ] cvx bdf }{ AGMCORE_host_sep Name (All) eq and{ /TintProc { 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and AGMCORE_host_sep or Name () eq and{ /TintProc [ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ cvx /setcmykcolor cvx }{ cvx /setgray cvx }ifelse ] cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc [ /dup cvx MappedCSA sep_proc_name cvx exch 0 get /DeviceGray eq{ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx }if /Name cvx /findcmykcustomcolor cvx /exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep /Name cvx /AGMCORE_IsSeparationAProcessColor load /exec cvx /not cvx /and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 ] cvx /if cvx /setcustomcolor cvx ] cvx bdf }{ /TintProc {setcolor} bdf [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd setsepcolor end } def /additive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 0 1 numarrays 1 sub { 1 exch add /index cvx c1 /get cvx /mul cvx }for numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /subtractive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 1 0 1 numarrays 1 sub { 1 3 3 -1 roll add /index cvx c1 /get cvx /sub cvx /mul cvx }for /sub cvx numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /exec_tint_transform { /TintProc [ /TintTransform cvx /setcolor cvx ] cvx bdf MappedCSA setcolorspace_opt } bdf /devn_makecustomcolor { 2 dict begin /names_index xdf /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor Names length {pop} repeat end } bdf /setdevicencolorspace { dup /AliasedColorants known {false}{true}ifelse current_spot_alias and { 7 dict begin /names_index 0 def dup /names_len exch /Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def dup /Names get { dup map_alias { exch pop dup /ColorLookup known { dup begin new_LookupTables names_index ColorLookup put end }{ dup /Components known { dup begin new_LookupTables names_index Components put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse new_names names_index 3 -1 roll /Name get put /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put dup /LookupTables known { dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse /names_index names_index 1 add def } forall alias_cnt 0 gt { /AliasedColorants true def /lut_entry_len new_LookupTables 0 get dup length 256 ge {0 get length}{length}ifelse def 0 1 names_len 1 sub { /names_index xdf new_LookupTables names_index get dup length 256 ge {0 get length}{length}ifelse lut_entry_len ne { /AliasedColorants false def exit } { new_LookupTables names_index get 0 get null eq { dup /Names get names_index get /name xdf name (Cyan) eq name (Magenta) eq name (Yellow) eq name (Black) eq or or or not { /AliasedColorants false def exit } if } if } ifelse } for lut_entry_len 1 eq { /AliasedColorants false def } if AliasedColorants { dup begin /Names new_names def /LookupTables new_LookupTables def /AliasedColorants true def /NComponents lut_entry_len def /TintMethod NComponents 4 eq {/Subtractive}{/Additive}ifelse def /MappedCSA TintMethod /Additive eq {/DeviceRGB}{/DeviceCMYK}ifelse def currentdict /TTTablesIdx known not { /TTTablesIdx -1 def } if end } if }if end } if dup /devicen_colorspace_dict exch AGMCORE_gput begin currentdict /AliasedColorants known { AliasedColorants }{ false } ifelse dup not { CSA map_csa } if /TintTransform load type /nulltype eq or { /TintTransform [ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def dup LookupTables exch get dup 0 get null eq { 1 index Names exch get dup (Cyan) eq { pop exch LookupTables length exch sub /index cvx 0 0 0 } { dup (Magenta) eq { pop exch LookupTables length exch sub /index cvx 0 /exch cvx 0 0 } { (Yellow) eq { exch LookupTables length exch sub /index cvx 0 0 3 -1 /roll cvx 0 } { exch LookupTables length exch sub /index cvx 0 0 0 4 -1 /roll cvx } ifelse } ifelse } ifelse 5 -1 /roll cvx /astore cvx } { dup length 1 sub LookupTables length 4 -1 roll sub 1 add /index cvx /mul cvx /round cvx /cvi cvx /get cvx } ifelse Names length TTTablesIdx add 1 add 1 /roll cvx } for Names length [/pop cvx] cvx /repeat cvx NComponents Names length TintMethod /Subtractive eq { subtractive_blend } { additive_blend } ifelse ] cvx bdf } if AGMCORE_host_sep { Names convert_to_process { exec_tint_transform } { currentdict /AliasedColorants known { AliasedColorants not }{ false } ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def AvoidAliasedColorants { /currentspotalias current_spot_alias def false set_spot_alias } if Names { AGMCORE_is_cmyk_sep { dup (Cyan) eq AGMCORE_cyan_plate and exch dup (Magenta) eq AGMCORE_magenta_plate and exch dup (Yellow) eq AGMCORE_yellow_plate and exch (Black) eq AGMCORE_black_plate and or or or { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def } if painted? {exit} if }{ 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def exit } if } ifelse /names_index names_index 1 add def } forall AvoidAliasedColorants { currentspotalias set_spot_alias } if painted? { /devicen_colorspace_dict AGMCORE_gget /names_index names_index put }{ /devicen_colorspace_dict AGMCORE_gget /TintProc [ names_len [/pop cvx] cvx /repeat cvx 1 /setseparationgray cvx 0 0 0 0 /setcmykcolor cvx ] cvx ddf } ifelse end } ifelse } { AGMCORE_in_rip_sep { Names convert_to_process not }{ level3 } ifelse { [/DeviceN Names MappedCSA /TintTransform load] setcolorspace_opt /TintProc level3 not AGMCORE_in_rip_sep and { [ Names /length cvx [/pop cvx] cvx /repeat cvx ] cvx bdf }{ {setcolor} bdf } ifelse }{ exec_tint_transform } ifelse } ifelse set_crd /AliasedColorants false def end } def /setindexedcolorspace { dup /indexed_colorspace_dict exch AGMCORE_gput begin currentdict /CSDBase known { CSDBase /CSD get_res begin currentdict /Names known { currentdict devncs }{ 1 currentdict sepcs } ifelse AGMCORE_host_sep{ 4 dict begin /compCnt /Names where {pop Names length}{1}ifelse def /NewLookup HiVal 1 add string def 0 1 HiVal { /tableIndex xdf Lookup dup type /stringtype eq { compCnt tableIndex map_index }{ exec } ifelse /Names where { pop setdevicencolor }{ setsepcolor } ifelse currentgray tableIndex exch HiVal mul cvi NewLookup 3 1 roll put } for [/Indexed currentcolorspace HiVal NewLookup] setcolorspace_opt end }{ level3 { currentdict /Names known { [/Indexed [/DeviceN Names MappedCSA /TintTransform load] HiVal Lookup] setcolorspace_opt }{ [/Indexed [/Separation Name MappedCSA sep_proc_name load] HiVal Lookup] setcolorspace_opt } ifelse }{ [/Indexed MappedCSA HiVal [ currentdict /Names known { Lookup dup type /stringtype eq {/exch cvx CSDBase /CSD get_res /Names get length dup /mul cvx exch /getinterval cvx {255 div} /forall cvx} {/exec cvx}ifelse /TintTransform load /exec cvx }{ Lookup dup type /stringtype eq {/exch cvx /get cvx 255 /div cvx} {/exec cvx}ifelse CSDBase /CSD get_res /MappedCSA get sep_proc_name exch pop /load cvx /exec cvx } ifelse ]cvx ]setcolorspace_opt }ifelse } ifelse end set_crd } { CSA map_csa AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ pop [/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval {} forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end } bind }{ Lookup }ifelse }ifelse ] setcolorspace_opt set_crd }ifelse }ifelse end }def /setindexedcolor { AGMCORE_host_sep { /indexed_colorspace_dict AGMCORE_gget dup /CSDBase known { begin CSDBase /CSD get_res begin currentdict /Names known{ map_indexed_devn devn } { Lookup 1 3 -1 roll map_index sep }ifelse end end }{ /Lookup get 4 3 -1 roll map_index setcmykcolor } ifelse }{ level3 not AGMCORE_in_rip_sep and /indexed_colorspace_dict AGMCORE_gget /CSDBase known and { /indexed_colorspace_dict AGMCORE_gget /CSDBase get /CSD get_res begin map_indexed_devn devn end } { setcolor } ifelse }ifelse } def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray /Decode [0 1] def /DataSource def /MultipleDataSources false def /BitsPerComponent 8 def currentdict end systemdict /image get exec grestore }if consumeimagedata }def /add_res { dup /CSD eq { pop //Adobe_AGM_Core begin /AGMCORE_CSD_cache load 3 1 roll put end }{ defineresource pop } ifelse }def /del_res { { aload pop exch dup /CSD eq { pop { //Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef }forall }{ exch { 1 index undefineresource }forall pop } ifelse } forall }def /get_res { dup /CSD eq { pop dup type dup /nametype eq exch /stringtype eq or { AGMCORE_CSD_cache exch get } if }{ findresource } ifelse }def /get_csa_by_name { dup type dup /nametype eq exch /stringtype eq or{ /CSA get_res } if }def /pattern_buf_init { /count get 0 0 put } def /pattern_buf_next { dup /count get dup 0 get dup 3 1 roll 1 add 0 xpt get } def /cachepattern_compress { 5 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def /string_size 16000 def /readbuffer string_size string def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal /LZWFilter { exch dup length 0 eq { pop }{ patarray dup length 1 sub 3 -1 roll put } ifelse {string_size}{0}ifelse string } /LZWEncode filter def { ReadFilter readbuffer readstring exch LZWFilter exch writestring not {exit} if } loop LZWFilter closefile patarray end }def /cachepattern { 2 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal { ReadFilter 16000 string readstring exch patarray dup length 1 sub 3 -1 roll put not {exit} if } loop patarray dup dup length 1 sub () put end }def /wrap_paintproc { statusdict /currentfilenameextend known{ clonedict begin /OldPaintProc /PaintProc load def /PaintProc { mark exch dup /OldPaintProc get stopped {closefile restore end} if cleartomark } def end } {pop} ifelse } def /make_pattern { exch clonedict exch dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix 1 index begin BBox 0 get XStep div cvi XStep mul /xshift exch neg def BBox 1 get YStep div cvi YStep mul /yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def [ xshift yshift /translate load null /exec load ] dup 3 /PaintProc load put cvx /PaintProc exch def end 1 index dup /ID get exch /Pattern add_res gsave 0 setgray makepattern grestore }def /set_pattern { dup /PatternType get 1 eq{ dup /PaintType get 1 eq{ currentoverprint sop [/DeviceGray] setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{ pop }{ setcolorspace }ifelse }def /updatecolorrendering { currentcolorrendering/RenderingIntent known{ currentcolorrendering/RenderingIntent get }{null}ifelse Intent ne { Intent /ColorRendering {findresource} stopped { pop pop systemdict /findcolorrendering known { Intent findcolorrendering pop /ColorRendering findresource true } {false} ifelse } {true} ifelse { dup begin currentdict /TransformPQR known { currentdict /TransformPQR get aload pop 3 {{} eq 3 1 roll} repeat or or } {true} ifelse currentdict /MatrixPQR known { currentdict /MatrixPQR get aload pop 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq and and and and and and and and } {true} ifelse end or { clonedict begin /TransformPQR [ {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add} bind {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add} bind {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add} bind ] def /MatrixPQR [ 0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] def /RangePQR [-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392] def currentdict end } if setcolorrendering_opt } if }if } def /set_crd { AGMCORE_host_sep not level2 and{ currentdict /ColorRendering known{ ColorRendering /ColorRendering {findresource} stopped not {setcolorrendering_opt} if }{ currentdict/Intent known{ updatecolorrendering }if }ifelse currentcolorspace dup type /arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ clonedict begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /cpaint_gcomp { convert_to_process //Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { (%end_cpaint_gcomp) flushinput }if }def /cpaint_gsep { //Adobe_AGM_Core/AGMCORE_ConvertToProcess get { (%end_cpaint_gsep) flushinput }if }def /cpaint_gend { newpath }def /set_spot_alias_ary { dup inherit_aliases //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf }def /set_spot_normalization_ary { dup inherit_aliases dup length /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add} if array //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf /AGMCORE_SpotAliasAry where{ pop AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval AGMCORE_SpotAliasAry length }{0} ifelse AGMCORE_SpotAliasAry2 3 1 roll exch putinterval true set_spot_alias }def /inherit_aliases { {dup /Name get map_alias {/CSD put}{pop} ifelse} forall }def /set_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop }ifelse }def /current_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias get }{ false }ifelse }def /map_alias { /AGMCORE_SpotAliasAry2 where{ begin /AGMCORE_name xdf false AGMCORE_SpotAliasAry2{ dup/Name get AGMCORE_name eq{ /CSD get /CSD get_res exch pop true exit }{ pop }ifelse }forall end }{ pop false }ifelse }bdf /spot_alias { true set_spot_alias /AGMCORE_&setcustomcolor AGMCORE_key_known not { //Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put } if /customcolor_tint 1 AGMCORE_gput //Adobe_AGM_Core begin /setcustomcolor { currentdict/TintProc known currentdict/CSA known and 3 1 roll //Adobe_AGM_Core begin dup /customcolor_tint exch AGMCORE_gput 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not current_spot_alias and{1 index 4 get map_alias}{false}ifelse { false set_spot_alias 4 -1 roll{ exch pop /sep_tint AGMCORE_gget exch }if mark 3 1 roll setsepcolorspace counttomark 0 ne{ setsepcolor }if pop pop true set_spot_alias }{ AGMCORE_&setcustomcolor pop }ifelse end }bdf end }def /begin_feature { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if }def /end_feature { 2 dict begin /spd /setpagedevice load def /setpagedevice { get_gstate spd set_gstate } def stopped{$error/newerror false put}if end count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if }def /set_negative { //Adobe_AGM_Core begin /AGMCORE_inverting exch def level2{ currentpagedevice/NegativePrint known{ currentpagedevice/NegativePrint get //Adobe_AGM_Core/AGMCORE_inverting get ne{ true begin_feature true{ << /NegativePrint //Adobe_AGM_Core/AGMCORE_inverting get >> setpagedevice }end_feature }if /AGMCORE_inverting false def }if }if AGMCORE_inverting{ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse /AGMIRS_&fill where {pop AGMIRS_&fill}{fill} ifelse grestore }if end }def /lw_save_restore_override { /md where { pop md begin initializepage /initializepage{}def /pmSVsetup{} def /endp{}def /pse{}def /psb{}def /orig_showpage where {pop} {/orig_showpage /showpage load def} ifelse /showpage {orig_showpage gR} def end }if }def /pscript_showpage_override { /NTPSOct95 where { begin showpage save /showpage /restore load def /restore {exch pop}def end }if }def /driver_media_override { /md where { pop md /initializepage known { md /initializepage {} put } if md /rC known { md /rC {4{pop}repeat} put } if }if /mysetup where { /mysetup [1 0 0 1 0 0] put }if Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put level2 {Adobe_AGM_Core /AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if }def /driver_check_media_override { /PrepsDict where {pop} { Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne Adobe_AGM_Core /AGMCORE_Default_PageSize get type /arraytype eq { Adobe_AGM_Core /AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and Adobe_AGM_Core /AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and }if { Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix }if }ifelse }def AGMCORE_err_strings begin /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def end /set_def_ht { AGMCORE_def_ht sethalftone } def end systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_CoolType_Core 2.25 0 %%Copyright: Copyright 1997-2005 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.25 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict /Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined { /Adobe_CoolType_Core userdict /Adobe_CoolType_Core get def } if userdict /Adobe_CoolType_Core 60 dict dup begin put /Adobe_CoolType_Version 2.25 def /Level2? systemdict /languagelevel known dup { pop systemdict /languagelevel get 2 ge } if def Level2? not { /currentglobal false def /setglobal /pop load def /gcheck { pop false } bind def /currentpacking false def /setpacking /pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def end setglobal /@_SaveStackLevels { Adobe_CoolType_Data begin /@vmState currentglobal def false setglobal @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup /args 7 index 5 add array put put get } { get dup /args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch /args exch put } { pop } ifelse } ifelse begin count 1 sub 1 index lt { pop count } if dup /argCount exch def dup 0 gt { args exch 0 exch getinterval astore pop } { pop } ifelse count /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def @vmState setglobal end } bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt { { pop } repeat } { pop } ifelse args 0 argCount getinterval {} forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt { { end } repeat } { pop } ifelse } bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end } bind def /@Raise { exch cvx exch errordict exch get exec stop } bind def /@ReRaise { cvx $error /errorname get errordict exch get exec stop } bind def /@Stopped { 0 @#Stopped } bind def /@#Stopped { @_SaveStackLevels stopped { @_RestoreStackLevels true } { @_PopStackLevels false } ifelse } bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get begin args exch argCount 1 sub exch sub get end end } bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup /@shouldNotDisappearDictValue true def Adobe_CoolType_Data exch /@shouldNotDisappearDict exch put begin count @_SaveStackLevels { (*) { pop stop } 128 string /Category resourceforall } stopped pop @_RestoreStackLevels currentdict Adobe_CoolType_Data /@shouldNotDisappearDict get ne dup { /@shouldNotDisappearDictValue known { { end currentdict 1 index eq { pop exit } if } loop } if } if end } { false } ifelse def true setglobal /CTHasResourceStatusBug Level2? { mark { /steveamerige /Category resourcestatus } stopped { cleartomark true } { cleartomark currentglobal not } ifelse } { false } ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse end } bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad /ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup /CMap CTHasResourceStatusBug { CTResourceStatus } { resourcestatus } ifelse { pop dup 0 eq exch 1 eq or { dup /CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug { exit } { stop } ifelse } ifelse } { pop } ifelse } 128 string /CMap resourceforall } stopped { cleartomark } stopped pop setglobal } if } if } bind def /doc_setup { Adobe_CoolType_Core begin CTWorkAroundBugs /mov /moveto load def /nfnt /newencodedfont load def /mfnt /makefont load def /sfnt /setfont load def /ufnt /undefinefont load def /chp /charpath load def /awsh /awidthshow load def /wsh /widthshow load def /ash /ashow load def /sh /show load def end currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end setglobal } bind def /doc_trailer { currentdict Adobe_CoolType_Core eq { end } if } bind def /page_setup { Adobe_CoolType_Core begin } bind def /page_trailer { end } bind def /unload { systemdict /languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known { undef } { pop pop } ifelse } if } if } bind def /ndf { 1 index where { pop pop pop } { dup xcheck { bind } if def } ifelse } def /findfont systemdict begin userdict begin /globaldict where { /globaldict get begin } if dup where pop exch get /globaldict where { pop end } if end end Adobe_CoolType_Core_Defined { /systemfindfont exch def } { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont { pop } ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq { 0 } { dup length } ifelse 2 index length add 1 add dict begin exch { 1 index /FID eq { pop pop } { def } ifelse } forall dup null eq { pop } { { def } forall } ifelse currentdict end exch setglobal } bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal } bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } { FontDirectory 3 index known { FontDirectory 3 index get /FontReferenced known } { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } ifelse } ifelse dup { 3 index findfont /FontReferenced get 2 index dup type /nametype eq {findfont} if ne { pop false } if } if { pop 1 index findfont /Encoding get exch 0 1 255 { 2 copy get 3 index 3 1 roll put } for pop pop pop } { dup type /nametype eq { findfont } if dup dup maxlength 2 add dict begin exch { 1 index /FID ne {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type /stringtype eq { cvn } if def dup currentdict end definefont def } ifelse } bind def /SetSubstituteStrategy { $SubstituteFont begin dup type /dicttype ne { 0 dict } if currentdict /$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin { def } forall { def } forall currentdict dup /$Init known { dup /$Init get exec } if end /$Strategy exch def } { pop pop pop } ifelse } { pop pop } ifelse end } bind def /scff { $SubstituteFont begin dup type /stringtype eq { dup length exch } { null } ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse def end { findfont } @Stopped { dup length 8 add string exch 1 index 0 (BadFont:) putinterval 1 index exch 8 exch dup length string cvs putinterval cvn { findfont } @Stopped { pop /Courier findfont } if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end } bind def /isWidthsOnlyFont { dup /WidthsOnly known { pop pop true } { dup /FDepVector known { /FDepVector get { isWidthsOnlyFont dup { exit } if } forall } { dup /FDArray known { /FDArray get { isWidthsOnlyFont dup { exit } if } forall } { pop } ifelse } ifelse } ifelse } bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 4 index def /$doSmartSub false def end 3 index currentglobal false setglobal exch /CompatibleFonts /ProcSet resourcestatus { pop pop /CompatibleFonts /ProcSet findresource begin dup /CompatibleFont currentexception 1 index /CompatibleFont true setexception 1 index /Font resourcestatus { pop pop 3 2 roll setglobal end exch dup findfont /CompatibleFonts /ProcSet findresource begin 3 1 roll exch /CompatibleFont exch setexception end } { 3 2 roll setglobal 1 index exch /CompatibleFont exch setexception end findfont $SubstituteFont /$substituteFound true put } ifelse } { exch setglobal findfont } ifelse $SubstituteFont begin $substituteFound { false (%%[Using embedded font ) print 5 index ?str1 cvs print ( to avoid the font substitution problem noted earlier.]%%\n) print } { dup /FontName known { dup /FontName get $fontname eq 1 index /DistillerFauxFont known not and /currentdistillerparams where { pop false 2 index isWidthsOnlyFont not and } if } { false } ifelse } ifelse exch pop /$doSmartSub true def end { exch pop exch pop exch 2 dict dup /Found 3 index put exch findfont exch } { exch exec exch dup findfont dup /FontType get 3 eq { exch ?str1 cvs dup length 1 sub -1 0 { exch dup 2 index get 42 eq { exch 0 exch getinterval cvn 4 1 roll 3 2 roll pop exit } {exch pop} ifelse }for } { exch pop } ifelse 2 dict dup /Downloaded 6 5 roll put } ifelse dup /FontName 4 index put copyfont definefont pop } bind def /?str2 256 string def /?add { 1 index type /integertype eq { exch true 4 2 } { false 3 1 } ifelse roll 1 index findfont dup /Widths known { Adobe_CoolType_Data /AddWidths? true put gsave dup 1000 scalefont setfont } if /Downloaded known { exec exch { exch ?str2 cvs exch findfont /Downloaded get 1 dict begin /Downloaded 1 index def ?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1 index add ?str1 2 index (*) putinterval ?str1 0 2 index getinterval cvn findfont ?str1 3 index (+) putinterval 2 dict dup /FontName ?str1 0 6 index getinterval cvn put dup /Downloaded Downloaded put end copyfont dup /FontName get exch definefont pop pop pop } { pop } ifelse } { pop exch { findfont dup /Found get dup length exch ?str1 cvs pop ?str1 1 index (+) putinterval ?str1 1 index 1 add 4 index ?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add getinterval cvn 1 dict exch 1 index exch /FontName exch put copyfont dup /FontName get exch definefont pop } { pop } ifelse } ifelse Adobe_CoolType_Data /AddWidths? get { grestore Adobe_CoolType_Data /AddWidths? false put } if } bind def /?sh { currentfont /Downloaded known { exch } if pop } bind def /?chp { currentfont /Downloaded known { pop } { false chp } ifelse } bind def /?mv { currentfont /Downloaded known { moveto pop pop } { pop pop moveto } ifelse } bind def setpacking userdict /$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known { get } { pop pop { pop /Courier } bind } ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams /CannotEmbedFontPolicy 2 copy known { get /Error eq } { pop pop false } ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup /WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type /stringtype eq { cvn } if def /FontType 3 def /FontMatrix [ .001 0 0 .001 0 0 ] def /Encoding 256 array dup 0 1 255 { /.notdef put dup } for pop def /FontBBox [ 0 0 0 0 ] def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth /y exch def /x exch def x y setcharwidth $SubstituteFont /$Strategy get /$Underprint get exec 0 0 moveto cc show x y moveto end end } bind def currentdict end exch setglobal } bind def /$GetaTint 2 dict dup begin /$BuildFont { dup /WMode known { dup /WMode get } { 0 } ifelse /$WMode exch def $fontname exch dup /FontName known { dup /FontName get dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse exch Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index /FontName get known { pop Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index get null copyfont } { $deepcopyfont } ifelse exch 1 index exch /FontBasedOn exch put dup /FontName $fontname dup type /stringtype eq { cvn } if put definefont Adobe_CoolType_Data /InVMDeepCopiedFonts get begin dup /FontBasedOn get 1 index def end } bind def /$Underprint { gsave x abs y abs gt { /y 1000 def } { /x -1000 def 500 120 translate } ifelse Level2? { [ /Separation (All) /DeviceCMYK { 0 0 0 1 pop } ] setcolorspace } { 0 setgray } ifelse 10 setlinewidth x .8 mul [ 7 3 ] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? { .2 setcolor } { .8 setgray } ifelse fill grestore stroke } forall pop grestore } bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict /FontName known { FontName dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse def /FontName $fontname dup type /stringtype eq { cvn } if def /currentdistillerparams where { pop } { /FontInfo currentdict /FontInfo known { FontInfo null copyfont } { 2 dict } ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [ 1 0 ItalicAngle dup sin exch cos div 1 0 0 ] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal } bind def end def /$None 1 dict dup begin /$BuildFont {} bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type /stringtype eq { cvn } if dup /$fontname exch def $sname null eq { $str cvs dup length $slen sub $slen getinterval } { pop $sname } ifelse $fontpat dup 0 (fonts/*) putinterval exch 7 exch putinterval /$match false def $SubstituteFont /$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval { /$match exch def exit } $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont /$dstack get { exch { 1 index eq { pop false } { true } ifelse } { begin false } ifelse } forall pop } if cleartomark /$slen 0 def $match false ne { $match (fonts/) anchorsearch pop pop cvn } { /Courier } ifelse } bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [ /Ryumin-Light /HeiseiMin-W3 /GothicBBB-Medium /HeiseiKakuGo-W5 /HeiseiMaruGo-W4 /Jun101-Light ] def /Korea1 [ /HYSMyeongJo-Medium /HYGoThic-Medium ] def /GB1 [ /STSong-Light /STHeiti-Regular ] def /CNS1 [ /MKai-Medium /MHei-Medium ] def end def end def /$cmapname null def /$deepcopyfont { dup /FontType get 0 eq { 1 dict dup /FontName /copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup /FontName /copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } { $Strategies /$Type3Underprint get exec } ifelse } bind def /$buildfontname { dup /CIDFont findresource /CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index (-) putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy (-) putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch { pop pop 3 2 roll putinterval cvn /$cmapname exch def } { pop pop pop pop pop } ifelse length $str 1 index (-) putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn } bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known { get } { pop pop [] } ifelse } { pop pop [] } ifelse false exch { dup /CIDFont resourcestatus { pop pop save 1 index /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get } { false } ifelse exch pop exch restore { pop } { exch pop true exit } ifelse } { pop } ifelse } forall { $str cvs $buildfontname } { false (*) { save exch dup /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get not } { true } ifelse exch /CIDSystemInfo get dup /Registry get Registry eq exch /Ordering get Ordering eq and and { exch restore exch pop true exit } { pop restore } ifelse } $str /CIDFont resourceforall { $buildfontname } { $fontname $findfontByEnum } ifelse } ifelse } bind def end end currentdict /$error known currentdict /languagelevel known and dup { pop $error /SubstituteFont known } if dup { $error } { Adobe_CoolType_Core } ifelse begin { /SubstituteFont /CMap /Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq { dup $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse Adobe_CoolType_Data /InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } { FontDirectory 1 index known { exch pop true exit } { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } ifelse } ifelse } forall } { pop pop false } ifelse { exch pop exch pop } { dup /CMap resourcestatus { pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS } { 128 string cvs dup (-) search { 3 1 roll search { 3 1 roll pop { dup cvi } stopped { pop pop pop pop pop $findfontByEnum } { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup /CMap resourcestatus { pop pop 4 1 roll pop pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS true exit } { pop } ifelse } for dup type /booleantype eq { pop } { pop pop pop $findfontByEnum } ifelse } ifelse } { pop pop pop $findfontByEnum } ifelse } { pop pop $findfontByEnum } ifelse } ifelse } ifelse } { //SubstituteFont exec } ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $findfontByEnum } { //SubstituteFont exec } ifelse end } } ifelse bind readonly def Adobe_CoolType_Core /scfindfont /systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup /FontName known { dup /FontName get dup 3 index ne } { /noname true } ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def /$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin { 1 index /FID eq { pop pop } { def } ifelse } forall currentdict end definefont dup /FontName known { dup /FontName get } { null } ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using ) print dup /FontName known { dup /FontName get } { (unspecified font) } ifelse $str cvs print (.\n) print } if } { exch pop } ifelse } { exch pop } ifelse end } bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core /findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type /stringtype ne { $str cvs } if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne { dup $inVMIndex $AddInVMFont } if $doSmartSub { currentdict /$Strategy known { $Strategy /$BuildFont get exec } if } if } if end } bind put } if } if end /$AddInVMFont { exch /FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data /InVMFontsByCMap get exch $DictAdd } { pop pop pop } ifelse } bind def /$DictAdd { 2 copy known not { 2 copy 4 index length dict put } if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get { forall } def 2 copy currentdict put end } { pop } ifelse } if get begin { def } forall end } bind def end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.21 0 %%Copyright: Copyright 1987-2005 Adobe Systems Incorporated. %%Version: 1.21 0 systemdict /languagelevel known dup { currentglobal false setglobal } { false } ifelse exch userdict /Adobe_CoolType_Utility 2 copy known { 2 copy get dup maxlength 27 add dict copy } { 27 dict } ifelse put Adobe_CoolType_Utility begin /@eexecStartData def /@recognizeCIDFont null def /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch /eCCRun known not ct_Level2? and or def ct_Level2? { globaldict begin currentglobal true setglobal } if /ct_AddStdCIDMap ct_Level2? { { mark Adobe_CoolType_Utility /@recognizeCIDFont currentdict put { ((Hex) 57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77) 0 () /SubFileDecode filter cvx exec } stopped { cleartomark Adobe_CoolType_Utility /@recognizeCIDFont get countdictstack dup array dictstack exch 1 sub -1 0 { 2 copy get 3 index eq { 1 index length exch sub 1 sub { end } repeat exit } { pop } ifelse } for pop pop Adobe_CoolType_Utility /@eexecStartData get eexec } { cleartomark } ifelse } } { { Adobe_CoolType_Utility /@eexecStartData get eexec } } ifelse bind def userdict /cid_extensions known dup { cid_extensions /cid_UpdateDB known and } if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type /stringtype eq { exch cvn exch } if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq { pop pop cid_UpdateDB } { exch 1 index /Created get eq { exch pop exch pop } { pop cid_UpdateDB } ifelse } ifelse } { pop cid_UpdateDB } ifelse } { cid_UpdateDB } ifelse end } bind def end } if ct_Level2? { end setglobal } if /ct_UseNativeCapability? systemdict /composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring () def /usewidths? true def end def ct_Level2? { setglobal } { pop } ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict /languagelevel known { pop /CIDFont findresource /GlyphDirectory get } { 1 index /CIDFont findresource /GlyphDirectory get dup type /dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + } def /+ { systemdict /languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } { 1 dict begin } ifelse /$ exch def systemdict /languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ? { $ begin } if } def /? { $ type /dicttype eq } def /| { userdict /Adobe_CoolType_Data known { Adobe_CoolType_Data /AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data /CC 3 index put ? { def } { $ 3 1 roll put } ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont /Widths get exch CC exch put } { ? { def } { $ 3 1 roll put } ifelse } ifelse end end } { ? { def } { $ 3 1 roll put } ifelse } ifelse } { ? { def } { $ 3 1 roll put } ifelse } ifelse } def /! { ? { end } if systemdict /languagelevel known { gvm setglobal } if end } def /: { string currentfile exch readstring pop } executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx [.001 0 0 .001 0 0] def /ct_1000Mtx [1000 0 0 1000 0 0] def /ct_raise {exch cvx exch errordict exch get exec stop} bind def /ct_reraise { cvx $error /errorname get (Error: ) print dup ( ) cvs print errordict exch get exec stop } bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop } bind def /ct_GetInterval { Adobe_CoolType_Utility /ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt { dup string /dst_string exch def } if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add /dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add /dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt { arrayIndex get } { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end } bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal { /unknowninstancename /Category resourcestatus } stopped { cleartomark setglobal true } { cleartomark currentglobal not exch setglobal } ifelse { { mark 3 1 roll /Category findresource begin ct_Vars /vm currentglobal put ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse ct_Vars /vm get setglobal end } } { { resourcestatus } } ifelse bind def /CIDFont /Category ct_resourcestatus { pop pop } { currentglobal true setglobal /Generic /Category findresource dup length dict copy dup /InstanceType /dicttype put /CIDFont exch /Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /CMapName /Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } { pop pop /defineresource /undefined ct_raise } ifelse } bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known { get 3 1 roll pop pop} { pop pop /findresource /undefinedresource ct_raise } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /ct_resourcestatus /resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup (Binary) eq { pop null currentfile ct_Level2? { { cid_BYTE_COUNT () /SubFileDecode filter } stopped { pop pop pop } if } if /readstring load exit } if dup (Hex) eq { pop currentfile ct_Level2? { { null exch /ASCIIHexDecode filter /readstring } stopped { pop exch pop (>) exch /readhexstring } if } { (>) exch /readhexstring } ifelse load exit } if /StartData /typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch /GlyphData exch put 2 index null eq { pop pop pop } { pop /readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse } bind def /StartData { mark { currentdict dup /FDArray get 0 get /FontMatrix get 0 get 0.001 eq { dup /CDevProc known not { /CDevProc 1183615869 internaldict /stdCDevProc 2 copy known { get } { pop pop { pop pop pop pop pop 0 -1000 7 index 2 div 880 } } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp /cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul } def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup /cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup /SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup /SubrMapOffset undef dup /SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } { pop } ifelse } forall } if cleartomark pop pop end CIDFontName currentdict /CIDFont defineresource pop end end } stopped { cleartomark /StartData ct_reraise } if } bind def currentdict end def /ct_saveCIDInit { /CIDInit /ProcSet ct_resourcestatus { true } { /CIDInitC /ProcSet ct_resourcestatus } ifelse { pop pop /CIDInit /ProcSet findresource ct_UseNativeCapability? { pop null } { /CIDInit ct_CIDInit /ProcSet defineresource pop } ifelse } { /CIDInit ct_CIDInit /ProcSet defineresource pop null } ifelse ct_Vars exch /ct_oldCIDInit exch put } bind def /ct_restoreCIDInit { ct_Vars /ct_oldCIDInit get dup null ne { /CIDInit exch /ProcSet defineresource pop } { pop } ifelse } bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility /ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge { pop 0 } if /cid exch def { GlyphDirectory cid 2 copy known { get } { pop pop nullstring } ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne { 0 FDBytes ct_cvnsi } { pop 0 } ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq { /charstring nullstring def exit } if /cid 0 def } ifelse } loop } def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto } def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont /Widths get cid 2 copy known { get exch pop aload pop } { pop pop stringwidth } ifelse } { stringwidth } ifelse setcharwidth 0 0 moveto } ifelse } def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known { get } { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup /FontMatrix 2 copy known { get } { pop pop ct_defaultFontMtx } ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont /Widths get def /CharStrings 1 dict dup /.notdef dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup /CharStrings get 1 index /Encoding get ct_dfCharCode get charstring put rootfont /WMode 2 copy known { get } { pop pop 0 } ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } { ct_str1 show } ifelse } def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup /FontMatrix get dup ct_defaultFontMtx ct_matrixeq not { ct_1000Mtx matrix concatmatrix concat } { pop } ifelse /Private get Adobe_CoolType_Utility /ct_Level2? get not { ct_dfDict /Private 3 -1 roll { put } 1183615869 internaldict /superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility /ct_Level2? get { 1 index } { 3 index /Private get mark 6 1 roll } ifelse dup /RunInt known { /RunInt get } { pop /CCRun } ifelse get exec Adobe_CoolType_Utility /ct_Level2? get not { cleartomark } if } bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility /ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped { stop } if end end end end } bind def /BaseFontNameStr (BF00) def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /BuildChar /ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString /ct_Type3ShowCharString load def /ct_dfSetCacheProc /ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup /lenIV 4 put def /CharStrings 1 dict dup /.notdef put def /PaintType 0 def /ct_ShowCharString /ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not { exit } if } for exch pop exch pop } bind def /ct_makeocf { 15 dict begin exch /WMode exch def exch /FontName exch def /FontType 0 def /FMapType 2 def dup /FontMatrix known { dup /FontMatrix get /FontMatrix exch def } { /FontMatrix matrix def } ifelse /bfCount 1 index /CIDCount get 256 idiv 1 add dup 256 gt { pop 256} if def /Encoding 256 array 0 1 bfCount 1 sub { 2 copy dup put pop } for bfCount 1 255 { 2 copy bfCount put pop } for def /FDepVector bfCount dup 256 lt { 1 add } if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont /FontBBox known { CIDFont /FontBBox get /FontBBox exch def } if CIDFont /CDevProc known { CIDFont /CDevProc get /CDevProc exch def } if currentdict end BaseFontNameStr 3 (0) putinterval 0 1 bfCount dup 256 eq { 1 sub } if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup /CIDFirstByte exch 256 mul def FontType 3 eq { /ct_FDDict 2 dict def } if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? { /Widths 1 index /CIDFont get /GlyphDirectory get length dict def } if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont /Widths get begin exch /CIDFont get /GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } { exch pop } ifelse } bind def /ct_ComposeFont { ct_UseNativeCapability? { 2 index /CMap ct_resourcestatus { pop pop exch pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch /WMode exch def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity)} ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def /ct_MakeIdentity { ct_UseNativeCapability? { 1 index /CMap ct_resourcestatus { pop pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity) } ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { exch pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def currentdict readonly pop end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. %%Version: 1.0 0 userdict /ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge } bind def /AllocGlyphStorage { Is2015? { pop } { {string} forall } ifelse } bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def 4 array astore cvx /FontBBox exch def /sfnts } bind def /Type42DictEnd { currentdict dup /FontName get exch definefont end ct_T42Dict exch dup /FontName get exch put } bind def /RD {string currentfile exch readstring pop} executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop } ifelse } bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop } ifelse } bind def /T0AddT42Mtx2 { /CIDFont findresource /Metrics2 get begin def end }bind def end %%EndResource Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Image 75 dict dup begin put /Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd /AGMIMG_mbuf () def /AGMIMG_ybuf () def /AGMIMG_kbuf () def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def /AGMIMG_k 0 def /AGMIMG_tmp nd /AGMIMG_imagestring0 nd /AGMIMG_imagestring1 nd /AGMIMG_imagestring2 nd /AGMIMG_imagestring3 nd /AGMIMG_imagestring4 nd /AGMIMG_imagestring5 nd /AGMIMG_cnt nd /AGMIMG_fsave nd /AGMIMG_colorAry nd /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd /AGMIMG_flushfilters nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd /doc_setup { Adobe_AGM_Core begin Adobe_AGM_Image begin /AGMIMG_&image systemdict/image get def /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMIMG_&colorimage /colorimage ldf }if end end }def /page_setup { Adobe_AGM_Image begin /AGMIMG_ccimage_exists {/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where { pop false }{ /Adobe_AGM_InRip_Seps where { pop false }{ true }ifelse }ifelse }{ false }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf /Decode [ Decode 1 get Decode 0 get] def }def /knockout_image_samples { Operator/imagemask ne{ /Decode [1 1] def }if }def }{ /invert_image_samples { {1 exch sub} currenttransfer addprocs settransfer }def /knockout_image_samples { { pop 1 } currenttransfer addprocs settransfer }def }ifelse /img /imageormask ldf /sepimg /sep_imageormask ldf /devnimg /devn_imageormask ldf /idximg /indexed_imageormask ldf /_ctype 7 def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{ bind }if def }forall }def /page_trailer { end }def /doc_trailer { }def /AGMIMG_flushfilters { dup type /arraytype ne {1 array astore}if aload length { dup type /filetype eq { dup status 1 index currentfile ne and {dup flushfile closefile} {pop} ifelse }{pop}ifelse } repeat }def /imageormask_sys { begin save mark level2{ currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMIMG_&imagemask }{ BitsPerComponent ImageMatrix /DataSource load AGMIMG_&image }ifelse }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if cleartomark restore end }def /overprint_plate { currentoverprint { 0 get dup type /nametype eq { dup /DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false exch { AGMOHS_sepink eq or } forall not } ifelse }{ pop false }ifelse }def /process_mask_L3 { dup begin /ImageType 1 def end 4 dict begin /DataDict exch def /ImageType 3 def /InterleaveType 3 def /MaskDict 9 dict begin /ImageType 1 def /Width DataDict dup /MaskWidth known {/MaskWidth}{/Width} ifelse get def /Height DataDict dup /MaskHeight known {/MaskHeight}{/Height} ifelse get def /ImageMatrix [Width 0 0 Height neg 0 Height] def /NComponents 1 def /BitsPerComponent 1 def /Decode [0 1] def /DataSource AGMIMG_maskSource def currentdict end def currentdict end }def /use_mask { dup type /dicttype eq { dup /Mask known { dup /Mask get { level3 {true} { dup /MaskWidth known {dup /MaskWidth get 1 index /Width get eq}{true}ifelse exch dup /MaskHeight known {dup /MaskHeight get 1 index /Height get eq}{true}ifelse 3 -1 roll and } ifelse } {false} ifelse } {false} ifelse } {false} ifelse }def /make_line_source { begin MultipleDataSources { [ Decode length 2 div cvi {Width string} repeat ] }{ Width Decode length 2 div mul cvi string }ifelse end }def /datasource_to_str { exch dup type dup /filetype eq { pop exch readstring }{ /arraytype eq { exec exch copy }{ pop }ifelse }ifelse pop }def /masked_image_simulation { 3 dict begin dup make_line_source /line_source xdf /mask_source AGMIMG_maskSource /LZWDecode filter def dup /Width get 8 div ceiling cvi string /mask_str xdf begin gsave 0 1 translate 1 -1 Height div scale 1 1 Height { pop gsave MultipleDataSources { 0 1 DataSource length 1 sub { dup DataSource exch get exch line_source exch get datasource_to_str } for }{ DataSource line_source datasource_to_str } ifelse << /PatternType 1 /PaintProc [ /pop cvx << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1.0 sub 1 matrix scale 0.5 0 matrix translate matrix concatmatrix /MultipleDataSources MultipleDataSources /DataSource line_source /BitsPerComponent BitsPerComponent /Decode Decode >> /image cvx ] cvx /BBox [0 0 Width 1] /XStep Width /YStep 1 /PaintType 1 /TilingType 2 >> matrix makepattern set_pattern << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1 matrix scale /MultipleDataSources false /DataSource mask_source mask_str readstring pop /BitsPerComponent 1 /Decode [0 1] >> imagemask grestore 0 1 translate } for grestore end end }def /imageormask { begin SkipImageProc { currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict Operator /imagemask eq DeviceN_PS2 not and { imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ [/Separation /Black /DeviceGray {}] setcolorspace /Decode [ Decode 1 get Decode 0 get ] def }if use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { Names convert_to_process not { 2 dict begin /imageDict xdf /names_index 0 def gsave imageDict write_image_file { Names { dup (None) ne { [/Separation 3 -1 roll /DeviceGray {1 exch sub}] setcolorspace Operator imageDict read_image_file names_index 0 eq {true setoverprint} if /names_index names_index 1 add def }{ pop } ifelse } forall close_image_file } if grestore end }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load /Adobe_AGM_OnHost_Seps where { pop imagemask }{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator /colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ /DataSource [ DataSource 0 get /exec cvx DataSource 1 get /exec cvx DataSource 2 get /exec cvx DataSource 3 get /exec cvx /AGMCORE_get_ink_data cvx ] cvx def }{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load filter_cmyk 0 () /SubFileDecode filter def }ifelse /Decode [ Decode 0 get Decode 1 get ] def /MultipleDataSources false def /NComponents 1 def /Operator /image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator /image eq{ AGMCORE_host_sep{ /DoImage true def HostSepColorImage{ invert_image_samples }{ AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if }ifelse 1 AGMCORE_&setgray DoImage {currentdict imageormask_sys} if }{ use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ image }ifelse }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentcolorspace overprint_plate not{ knockout_unitsq }if }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin CSA map_csa begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_avoid_L2_sep_space{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def }if AGMIMG_ccimage_exists MappedCSA 0 get /DeviceCMYK eq and currentdict/Components known and Name () ne and Name (All) ne and Operator /image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load /exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for } /exec cvx ] cvx bind MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator /imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentdict/ImageMatrix get concat knockout_unitsq }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name (All) ne and{ level2{ Name AGMCORE_IsSeparationAProcessColor { Operator /imagemask eq{ /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor }{ invert_image_samples }ifelse }{ [ /Separation Name [/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub } bind ] AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor }ifelse currentdict imageormask_sys }{ currentdict Operator /imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name (All) eq or Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentcolorspace 0 get /Separation ne{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentoverprint MappedCSA 0 get /DeviceCMYK eq and Name AGMCORE_IsSeparationAProcessColor not and Name inRip_spot_has_ink not and Name (All) ne and { imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end }def /decode_image_sample { 4 1 roll exch dup 5 1 roll sub 2 4 -1 roll exp 1 sub div mul add } bdf /colorSpaceElemCnt { mark currentcolor counttomark dup 2 add 1 roll cleartomark } bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ 0 1 dataSource length 1 sub { dup currentdict /dataSource get /exch cvx /get cvx /exec cvx /exch cvx names_index /ne cvx [ /pop cvx ] cvx /if cvx } for ] cvx bind end } bdf /devn_alt_datasource { 11 dict begin /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf /dsCnt origMultipleDataSources {origDataSource length}{1}ifelse def /DataSource origMultipleDataSources { [ BitsPerComponent 8 idiv origDecode length 2 idiv mul string 0 1 origDecode length 2 idiv 1 sub { dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch origDataSource exch get 0 () /SubFileDecode filter BitsPerComponent 8 idiv string /readstring cvx /pop cvx /putinterval cvx }for ]bind cvx }{origDataSource}ifelse 0 () /SubFileDecode filter def [ origcolorSpaceElemCnt string 0 2 origDecode length 2 sub { dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div 1 BitsPerComponent 8 idiv {DataSource /read cvx /not cvx{0}/if cvx /mul cvx}repeat /mul cvx /add cvx }for /convProc load /exec cvx origcolorSpaceElemCnt 1 sub -1 0 { /dup cvx 2 /add cvx /index cvx 3 1 /roll cvx /exch cvx 255 /mul cvx /cvi cvx /put cvx }for ]bind cvx 0 () /SubFileDecode filter end } bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin CSA map_csa 2 dict begin dup /srcDataStrs [ 3 -1 roll begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi { dup 65535 gt {1 add 2 div cvi}{exit}ifelse } loop string } repeat end ] def /dstDataStr srcDataStrs 0 get length string def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_producing_seps not { level3 not { Operator /imagemask ne { /DataSource [ [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse colorSpaceElemCnt /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource 1 /string cvx /readstring cvx /pop cvx] cvx colorSpaceElemCnt 1 sub{dup}repeat] def /MultipleDataSources true def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def } if }if currentdict imageormask }{ AGMCORE_host_sep{ Names convert_to_process { CSA get_csa_by_name 0 get /DeviceCMYK eq { /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse 4 /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource filter_cmyk 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode [1 0] def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate { /DataSource DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse CSA get_csa_by_name 0 get /DeviceRGB eq{3}{1}ifelse /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def currentdict imageormask_sys } { gsave knockout_unitsq grestore currentdict consumeimagedata } ifelse } ifelse } { /devicen_colorspace_dict AGMCORE_gget /names_index known { Operator/imagemask ne{ MultipleDataSources { /DataSource [ DataSource devn_sep_datasource /exec cvx ] cvx def /MultipleDataSources false def }{ /DataSource /DataSource load dstDataStr srcDataStrs 0 get filter_devn def } ifelse invert_image_samples } if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentdict imageormask }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end end }def /imageormask_l2_overprint { currentdict currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ level3{ currentcmykcolor /AGMIMG_k xdf /AGMIMG_y xdf /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ [/DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK {}] setcolorspace AGMIMG_c 0 ne {AGMIMG_c} if AGMIMG_m 0 ne {AGMIMG_m} if AGMIMG_y 0 ne {AGMIMG_y} if AGMIMG_k 0 ne {AGMIMG_k} if setcolor }{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def [/Indexed [ /DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK { AGMIMG_k 0 eq {0} if AGMIMG_y 0 eq {0 exch} if AGMIMG_m 0 eq {0 3 1 roll} if AGMIMG_c 0 eq {0 4 1 roll} if } ] 255 { 255 div mark exch dup dup dup AGMIMG_k 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_y 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_m 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_c 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop counttomark 1 roll }{ pop }ifelse counttomark 1 add -1 roll pop } ] setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ [/Separation /Black /DeviceGray {}] setcolorspace gsave /Black [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Yellow /DeviceGray {}] setcolorspace gsave /Yellow [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Magenta /DeviceGray {}] setcolorspace gsave /Magenta [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Cyan /DeviceGray {}] setcolorspace gsave /Cyan [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore } if close_image_file }{ imageormask }ifelse }ifelse }ifelse } def /indexed_imageormask { begin save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget dup /CSA known { /CSA get get_csa_by_name }{ /Names get } ifelse overprint_plate not{ knockout_unitsq }if }{ Indexed_DeviceN { /devicen_colorspace_dict AGMCORE_gget /names_index known { indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata } ifelse }{ AGMCORE_is_cmyk_sep{ Operator /imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ level2{ Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget begin }{ /indexed_colorspace_dict AGMCORE_gget begin CSA get_csa_by_name 0 get /DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and { [/Indexed [/DeviceN [/Cyan /Magenta /Yellow /Black] /DeviceCMYK {}] HiVal Lookup] setcolorspace } if end } ifelse imageormask Indexed_DeviceN { end } if }{ Operator /imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin Indexed_DeviceN not { currentcolorspace dup 1 /DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put }for put setcolorspace } if currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse end end }def /OPIimage { dup type /dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /ImageType 1 def /Decode [0 1 def] currentdict end }if dup begin /NComponents 1 cdndf /MultipleDataSources false cdndf /SkipImageProc {false} cdndf /HostSepColorImage false cdndf /Decode [ 0 currentcolorspace 0 get /Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ] cdndf /Operator /image cdndf end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cachemask_level2 { 3 dict begin /LZWEncode filter /WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile 0 (%EndMask) /SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring not {exit} if }loop WriteFilter closefile end }def /cachemask_level3 { currentfile << /Filter [ /SubFileDecode /ASCII85Decode /RunLengthDecode ] /DecodeParms [ << /EODCount 0 /EODString (%EndMask) >> null null ] /Intent 1 >> /ReusableStreamDecode filter }def /spot_alias { /mapto_sep_imageormask { dup type /dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def }{ begin }ifelse /Decode [/customcolor_tint AGMCORE_gget 0] def /Operator /image def /HostSepColorImage false def /SkipImageProc {false} def currentdict end sep_imageormask }bdf /customcolorimage { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget << /Name AGMIMG_colorAry 4 get /CSA [ /DeviceCMYK ] /TintMethod /Subtractive /TintProc null /MappedCSA null /NComponents 4 /Components [ AGMIMG_colorAry aload pop pop ] >> setsepcolorspace mapto_sep_imageormask }ndf Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put current_spot_alias{dup 4 get map_alias}{false}ifelse { false set_spot_alias /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask true set_spot_alias }{ AGMIMG_&customcolorimage }ifelse }bdf }def /snap_to_device { 6 dict begin matrix currentmatrix dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { 1 1 dtransform 0 gt exch 0 gt /AGMIMG_xSign? exch def /AGMIMG_ySign? exch def 0 0 transform AGMIMG_ySign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch AGMIMG_xSign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch itransform /AGMIMG_llY exch def /AGMIMG_llX exch def 1 1 transform AGMIMG_ySign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch AGMIMG_xSign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch itransform /AGMIMG_urY exch def /AGMIMG_urX exch def [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY] concat }{ }ifelse end } def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ dup 2 index exch get 255 exch sub 2 index 3 1 roll put }for }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin /AGMIMG_mbuf 0 string def /AGMIMG_ybuf 0 string def /AGMIMG_kbuf 0 string def { colorbuf dup length AGMIMG_mbuf length ne { dup length dup dup /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def } if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage end } def /sep_imageormask_lev1 { begin MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get } currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get /DeviceGray eq { {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} {AGMIMG_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceGray eq { {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def }if end systemdict /setpacking known { setpacking } if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin 2 2010 Adobe_AGM_Core/doc_setup get exec Adobe_CoolType_Core/doc_setup get exec Adobe_AGM_Image/doc_setup get exec currentdict Adobe_AGM_Utils eq {end} if %%EndSetup %%Page: (Page 1) 1 %%EndPageComments %%BeginPageSetup /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 + + + + + + Blue Square Test File - .eps + + + + + XMPFiles BlueSquare test file, created in Illustrator CS2, saved as .ai and .eps. + + + + + XMP + Blue Square + test file + Illustrator + .eps + + + + + + + + + + + 8 + 8 + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + % &&end XMP packet marker&& [{ai_metadata_stream_123} <> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 %AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0 Adobe_AGM_Utils begin Adobe_AGM_Core/page_setup get exec Adobe_AGM_Core/capture_currentpagedevice get exec Adobe_CoolType_Core/page_setup get exec Adobe_AGM_Image/page_setup get exec %%EndPageSetup Adobe_AGM_Core/AGMCORE_save save ddf 1 -1 scale 0 -361 translate [1 0 0 1 0 0 ] concat % page clip gsave newpath gsave % PSGState 0 0 mo 0 361 li 289 361 li 289 0 li cp clp [1 0 0 1 0 0 ] concat 288.5 360.5 mo 0.5 360.5 li 0.5 0.5 li 288.5 0.5 li 288.5 360.5 li cp false sop /0 [/DeviceCMYK] /CSA add_res 0.882353 0.768627 0 0 cmyk f 1 lw 0 lc 0 lj 4 ml [] 0 dsh true sadj 288.5 360.5 mo 0.5 360.5 li 0.5 0.5 li 288.5 0.5 li 288.5 360.5 li cp 0 0 0 1 cmyk @ %ADOBeginClientInjection: EndPageContent "AI11EPS" userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" % page clip grestore grestore % PSGState Adobe_AGM_Core/AGMCORE_save get restore %%PageTrailer [/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 [ [/CSA [/0 ]] ] del_res Adobe_AGM_Image/page_trailer get exec Adobe_CoolType_Core/page_trailer get exec Adobe_AGM_Core/page_trailer get exec currentdict Adobe_AGM_Utils eq {end} if %%Trailer Adobe_AGM_Image/doc_trailer get exec Adobe_CoolType_Core/doc_trailer get exec Adobe_AGM_Core/doc_trailer get exec %%EOF %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 12.0 %%AI8_CreatorVersion: 12.0.0 %%For: (Alan Lillich) (Adobe Systems) %%Title: (BlueSquare.eps) %%CreationDate: 9/7/05 3:18 PM %AI9_DataStream %Gb"-6rK8/2OXKo,q%!3rRn7t-g5*PRDJdXuMPPE==u.r,k]Xtc`nDh!>N1H-C>%t$lCS"Qk8ss4!`bMRCoN?%@WY[OH3/&@_r5QY %3"TGEEV'2,GMg&YpUcphs82!"ft69"LSK(](fEDBn\p!-oBY#cojt;C1^+T+6ICL9L(pfm'n>rVeb=9khgPFQL\IuYJ+qddqmZ#Y %I/!6mm@Rb"49"g4n*$7-a.'Ok?iAsQ`V&,BY@"qfqte;/%sKZk*qRnbfXuT[oDP/fhu(CdGJAS)iTJ68QNF\oRbR\`GLQo+LVF#j %GOJkOrVi;<^S42)J+Il.o_!G',(7^cJ+`Zu7j=HoR#/E/?iJ7+hgYU]a7jf5!!2cgahRiOp$^abp[Q/EO)NmiqmW24fsV\pGbX@K %^NfYT[kHV[T=o^Pa5^7)d@p#9UWWUZS?=U^R%$FWq!e.Q48DchY@%7nq[]lu1Kq8ga^>(klaLfis2bVlRf^?RrCsCc6dU;Tec5LF %j`eK>WGq'n?Jk_OmE:QoH1]l["*J\h6eD7<-##>LN8mp.-:4'&67MFAW/R>qIn[si\RIq3NqVf=Gk:c-5GoZRp#b)NpYYpU7dF,o %?HG06J,&fhS,\fZ0$_WpPsq@\rr2f,nQ$J`%XMq"if2^&NSLg7KtB?\L>KA'1#50jjb:*.0clo.h>QaETi?gJqAWAfMjT/#><.JS18CJa3`gGsZI*56Pj^4#MQ[A?o_-l!sj`J@DHU/[()?$)rhHi?pg_8,.q,KMU#OHA%pS %2gtjd4oqR#;t-OrqLtOioATp]2Emd=GV!)60&`_XPb&9U6G(SkfKm'-Od2#X.#%ZZ-X)ZFP[;OW11L$<;Wsa4Y]*%rU4;rp:["@. %5CNt$JD_eITmuhdUF9"aHklRpBJKS19n$p&KKe?U8dXC60@Fp8*g@%(TY[ADLG/c(6p-meGDrWuAr/q0N' %H?]/$,hqIAE)&*CFIN].XI-AGEfh&u"e-;dVS[PN::Mp$Kl7`>-M[%ijoQe&"IHnYMQEg`=>bqeFu)en77rtG36B=lYRHss@( %SQWt1HD!;1%DZd;&:l?>3JUcL]!Sn6<9ZXT+ST^0,s/5O[_*qHNq>^'I"IlYlTcP'gScbJ0S/ %F3]M%lbDb$q.BRWs))`8oD2\j*PQdl9H`Y>q=jftHsVA'U7\E7_Y.S1(ptbuo'ImQ+NIFd?97],e#O3(qQ;c(e9>9t8t+WFu81d:_[bldk7*NqM_he!q^#r(jc\3U9`Gqrt7n %rOUPZrm>B#,rKs[X^$3fZfH/^UNPl/c&rHMRiZsgZfHMh&$9&3A7'3fR;W-e!VNFj$%,3qN5C3A[iiS[[tJi3VU#45%i^JD!'BF;8UY#*=KOCHHs+Ps*g-sfL\rWcYji1HM2#sXJnCufFr]ifAQmB^uFQG;uA\K(@bgNlc(j>,M'mqrI"VnS2IkA+ %^NHX20=ap!Q1D]>/@c2`a\fq$CE71lXX?,%0!'IrPjn9Ha%"q:PFEkbiBB=.ropUrpN]t=CR/4)qs<.@cXS!-ceEb$ZfEms([Z*' %rH7HMDsL!=Opc&4]"=g!r<1`WdCT#3B#u>VS+@q%FdAPYqn@4=C!DeKC=Q>MC!MmbEM"-qr2eJS]\P5dC9uuAguh'35G'seY?F_? %QCO$5P]c:^SgB`^*dV$dCR1KOqp]cSZ^YJ!HRO$?8ia*m4?f$g4#O*Oqor[^(=VQF%HI`Vc!rZp+# %PG3`&f/hKc>#0@.>ZCU].,j?sNjYq=PFNqciBAbaq"_"$rMoPOB$#b7c]&Q$rH7HjDsL!>P07fOFMlSV?H4,X[[tbq\Z#3j]3EHc %BpN"aq]TnD8^*>j>0,IsP,C320$!pX\+QNBP)F'mn)J_OZfHMhpT7Zun'>klCX/8/eQHoVmYBAqV_UmtWkDQCT&)$/*;;Hj_Tug7 %gNd"!CR/4cqqNUYk:t"HhU^/E-0O;PFku>45P]Hg?>o/ob`_R;TGQ)nG'$pn)(kZSU=N=k&7t[rUKbLb,[#fo@O$3Sk?bCLDNK&rdhi+?iTEYp[luh5.pppO+6olg\6Jq>^uAE\$(k- %HMR+*a.'QAhgP+P:QGjHO%608cnF;Sa(p63]mTFlT0Coa5CL>Z6%=+Va5?mnlW51-Z3&Ul^A@iRa4HA2o[PJ)'D'-3k/6rNrVlRf %n)(m^oPM@CA1Et?./u,Cr/*#;qoLiJST08h\j728;oCXb#]_pn$C"o7%J&7ZB %of'ou;sV3;9::!cj)du8Rr8f:HMF\!(GB)WkN<^G\+JJ&F%oH(-e":CM=^ps4?\]G1-8gdoLsM>3rV:;kP"ECpA#.^fCTc'1-LJd %85Go!oAf%;kaD77Skm\"#.26cKY6F0k4%_lSniWZ5FJ+]:ZNnMj8!]m/H!`i9[BS?maUWFI^m?!rK)Lfr*8hloZ@"VIA/nk+0UaS %B>JZI?ZYg4m;qkcT#6%&G3:=#]OJJ=F3$)6S9)g(q1d6[,?DK+;jka&E5e#j&PFUaP]C&ILcG&,H$OBm?-h-G[Cc.aiG]g@dl#[j %/pQb1p#I"\rPd#Lc[<(S\/To2DB_7.-Jt&WCOQ`U/[=sDbmUCe-JBJ_$/LNKl+m6N`/u#$d5,5N0p#Kt1LhF[)D$q+!#UU16Z^/8 %I7>GO,=l=$&RBX7rIK\anB`Nu"c1)S$ODLJ)+tH2&Bb\s$F0gQK<.B$+FB29a=WV_Yh-37%9FJ&Lc3T)&0#f/Fc]1[uOT %9V%Kk9n!FJSC3Y"10kQkDFmTp'6_#dFd_(Pk:jq:c$:r5omFYeqM`#X@[WO-=VeLA,qSSj,dpaWQQ$QfB-bYR*4>3H[lEQ`$SK$O %Z7G@sh6=OS,EBG+PFqg5SbG>C85Jg0(Otgj%O>6(G]LG&;jbH8>bEhqKG[V.TnI3-DJ5i;d51oCVDuUB3j]MeN%ma6WEA.;7QfNK %BS&?Z##8l-6uI%%d%uhu]\#*(I&6-s_SPgBN9;XW4`/lmJd]s`iJ%%nJ0Dc@il&$Q/M,$Ujr9m^cWI!8o?^2_fJB#6`0(5E2^B@u %%Om1'B7@bg2,!fU:IgQBk88E+HH85p+0lFApL"5#!).rccrj3+"ggB.0H2\fT!QAVSA;5A]YMb,gp#I_q10E83Pr,`_!9kr:R1)o %Cbf:.T'hUdND5n`g-TCH@=hhpQaVPK[U$^IYZo8Mh4rdY[bgS4;P)AE'$\1ET0),>#Kpa^8]s9Z4'r %1h='@37fFhR:]BnH0&ap/Mu'+iokG%elrciCQe0\;_ui9oe]efR^COpf`%D\rg"i!R\iBJ)'3LhH^aO6c2EKRjuLQ(/P51a9pJED %2NfibUc9,f+;54AF-<5$P2pDI:\d8e-Bc[EUjEm*5nf7JEtYia')-28X4%\QD0]#d$`UCfjPW$)j"3u^CRUWY'OE'(k=G\,U^1]. %^VHS&'o]"2Z%OrG,gAoZ8W2RceGlXN&Ft!Zf!*N+d'D$)U1p<:7GE^6'ocui=1#-p?.HTCWdLF=jkHeB;S];^>7E,EfJN(e#9PY_ %G=pN;E)jcVK:d9IGc60()[1'C=-W0UBO96$Y3OfDqGq^?kh5u^!3=l_I@faLp5GCXXK``q5$.N1(/FcqIKDatOuqT]k/7AC!?N9m %b^&?4Qq4\;))j)ef/<7'.=n!WQ5)pujM`/3S`2F.LILB[Qu+rF[k'oY,7%1U@=gHb*mMJejb4=(J,ql";T*rn+aYQ5&rRZ]Xg#Sd %(:hLq`&qMV>?K)r(;P21_226m'B\C$1UEX>LJ)7ASug!)jh2S=f9rWr&#(u8&rp`,Woe,>VeJrUT;FoF>-"Ad=cXV'Q&7=3FXd_u %<9h=.kCcidp$+>>>]3TR(1);#lWDQ?rkO].Yd0gF87/UDIEkL^/M#Zs?L"_>dEenG'`ba9os/AgN`'lWXg%?#M/)3q"hM_=h88&4k'6Ig(3p@>M8f'_fV0\E@-HWU7YjTQ?&7f.H9Zs%UXU3hq'gE;%qDYcu31"RV9DV %1P&d`0)YC'#bgVeM/\:n)#>_jCG %8b@5/\c7P%gcVX?\[g@&YPYA]Y@#%-hZ!=&LC2,emJtaAg%a?P1S=YY5##WOZ+2LDn-_/%(H0QIQtNkIDqGPL/f(tIqB>29p?4=M %EB#`mdD[<^&)2a\%UBcXNBsWXLc,/CfnH`Y!s]l(ll\S!nrXD#EO`8e"$8niL*Xj%f`/L"R3WCY2N6AtkC^'cP%5V%1g:Y5hX86C %D97tC&;0Ji0`"&#mpR&\(kj$>2Xe*GjMe)na>U$:CcAtq"\ %?;DT.cSL'"oBtGX]@Yp[J#ArLEF]02T[^2)6\t]_a.E5o[s@oJ*8"m5)BFneeOPSnU(9=5l2aNt?i8pH&k1^aflUVe3cdPp@Ahgp %=inV=QbRmj_2QJqb>j)Z^V%3g]SZt&T7ceVN-Q=+B0R-i#`K(^h'1++#=(F_)buCii'e;cG01kLLW7J %q,JNGHi3"4RjU*iP38KXV6&&jH`l[UUX-Ljo1Ye>&q?(ba?7\QL83gL)OBs,+pSQQ8VekdqODhj/fa_tjrha)D?=h-lG,+e$+W\' %as;:uh,RQO865gLiAAAuEI_;c5<:1iq[5@XY^Du5*%n>&h"UFBH-W`4?@!+Z"/DX=YtodSfQ10pCrC&f4K^kJD'&E);e<48TWJPq %9f/Y^rD^`3K[&`>8Ggp6QL9D6bpldh"Xgh4Z"5E,RT6J2%]^W*JgRkT"l_q6^Um9ID2F53O> %>"&[4O$s#+c@[t+!siY<\@N-R^b'Br!d$AOpB0"*6T?jFKac/*3CcIJaWXqL.S!P3gfs-CP\$n;??29Timg/H7,O.^50\m7_C-f/ %[l4&,;/UAF"W2<gU_JAPFider1r>EAkDln-1*XWZl1'^kGEOU*#6_[frd0t %,''V4a4=&n4%!RmVUS:qg!&T2`[#$$QreW;D<5L]]3THq?t\o3$WZ8&)n3)0H_M79fheT7&tSiE(tu-`e_1kB]tq9;"fP=X`\@\?S.%U`*:-d)=8eZH2[sV`I#Z%;[c)oB?MEgoF1G\l;QF"cj]:>'>C%.mBkbGI[5W(^pG)LOaGFO %*iJn^R#>1Pqt`T/;-'P1IlU/=R1=)hW]/^:e#bRc:>Vm4XB+,QG2+;Xh.GC5AmK?'o`e];%^j='Aip$c0g.FHg>VhV5\M5E4k)a\ %7:FQVq07-8$n;)($m-3maJg+Sl]bW'sX3_L)iGo9`4-^5?=>&E"W2^Kf$dh:4`l34Bl[T@jGBgln-j\L%#t%-SAJT4:1ecelM5q"d2sDr/3Uo`m7C2]ml0bMTbes3KJNH>FQ" %jDCklgF?q!nb?l$^O4d-WBlZ*ni("US$7p,oc[ak9T\]XeoQiod5Oh7dDL5TgqWXRk*tE.G=VQXWSW#U1A?Uha=g_YQ:ZRg49*:O %heO-rA=ibkTD@OITKiIIJ:BWVj"HJnqJXjQ)i"CaYL2H+K6Jh6)a/XATIl`NUkQS=[04Q47e;\HF1NV=36#NZbe?d'm/7$QqR&'q %eGm35CWAZAXh&`lOgWdPki]#5At`fH=!Zs;"'^ld[`"r1Y?^@#r-OG*_^;j^2mSXWW%B.=XTk2n27R8U>I(Fq)DdX_[fWf"H_-/1=j_?4`8;GYb@9IPR[d<*#VQ5m.L+O-U_j1`Xb(I3/-*iP7:lj(=dFK1< %M"_4_a\*#JeeqTqA"qs`?0J0F4'Ipj@r1d@`i-h_ %9JDSH8T2e>&M5Ig/Z?^)e+60NL"2).4(_q0q('[E"1[;DDFaMaVLZ!d:o>q=Mi%Dqo*iVReFm7 %T`0DPTDjm+V57`K5m'DO:eStskHqO(En)pWUEp-9GI0u%(,H+[9$:7==q%I=['U7>j^?5i(5D\kWMO/jaW#LcPqC59\'^,@+D)H.l@l@DH0/3sMBG7QY^oZVBR %EhD0n$qN@;+5MkY-.uRd1U=Ik[Z%`BrH.-Vo]XHPsRs)A]*?6Yt8k(/7Lk*GMMAdqVRcTSp$l6C>/H[5<\o/<'/XA_YUFG,('^PPCk^2G^QqE[4\[NtWl?Ju0VoNVl %F67"ks'@df`I=Fj\-tnfM%Q<,CSp1`O^e">^a)7$7g)o*CRR3a<@dkZYZ8@+MRQ^-fA`>5^)ZD$&;.'+41P5YsTO.*2^[(![tj>Zhi1 %]7&.PpGDiJjGL;YRR@f9E5="*BiuXc-6Om,0,"L$SB.OuUUutB.RFl4Yb[[D=7B:4R`b.P.h*,Bj>'$clQldeOtOkEg7:f]JcW,X %iR/H-@9P-ed>T52hHdZ'Zl"pr@j01Ojf;r&=eW1]nX8Ic=]t*=@&^%bKdMU4>A+YRnG'%`JeGZ\e6?Jl&3;^N,,UM!jAanpW]Pud %9pMM[869]Oe4;!N"(])NJj\5eC5e3C$ktbX< %UdAk=9j005KJ4Pm)@64FV#Ca^GqMG=Xr#YPkbM29hC_24.GR!6*FgP=P"=SF),-JT&Jj"]d]GJDWY'M)ITOMVqft'+PCc1ckQ.kB %6+fWHRX$&:5ujl=16GC.Zlm[uOt6k[&XMg\#_#s^F/FX(6j6E2,rGOj7gkkA.cni3XoISrN/MoI1`3)c`kC%QUT7h"B %kt:7g/c&6=#oUXVA>D78BRTHc@/>tt#,a8"(/_p'-qQq!RbF%L&EH]<86(LSS`5@A(#N.`F5?]#nP_*(e,2nE=C0.5*OJE+V-Y;`hooaGV\s^X7RiR!us^4r>T`mc@t=l.HW5IV>2S %;@0HmG)l]]>mno25WZdiP#W8OLdVfpA#2cV:S@5%jcUC_[JTsQNY45+_9a?6>D`pQ!bom"qCIQJ(@VfUfrr$Bm-j)GoDeoXSnZNj[j7=P'(e!6QCIgi_gNF^,snA/Ai`k]QAk#!u_8"]-3fBA%aXd %GSpj&6*sF&/=FBJe*L5MQQV6aeOnDD"VP+J+>%pDb7MoI?9riX3#N=tFdd\4I4_c=1F>iA<)nrNOk6E]_8qA>E+h`(p9$W&%AAV4 %AX7#$?#!3ILrJ!i%:RPZ4"&\1-oilZc`'\d6b,0%#>?>;+k%^TEWr#-lU\rZEgLI0U+0?`6Sk&#($R.+N3bqY\$'ho&9Z*Gedp+9 %UiE8:(GL$=-\nO(qF!q$(>M[c+^@uR6*kP$"0%a.9Hca@dhSEo9/[H81__V; %cq:X$,`+_1os&8T`TBNaUBbk2<,/g,19Du6FjVPcY#fCg]e&0UOLV$N+-g17@jIo1Z7[(uVb:G9,Xt8hRnp-G*TiN.R$KttO/$VM %5HVti0oRs1[)>QTfrpE;'@P-@2rZSc$Y2G060UQSU^JAspg/s$nhEDj5][_NO!F05\/T6VtAXf]%/G%5A=Q!:3gIs#jsFBE2uL!.p3J%b#V;@4+KJ6PY@e)Z=N^XTMkM3;KnC%CaN'S)q2Rf:c05sSC&5X %AP06V^,Mb+KT33THo5MLF935^BJpiqj7+C#7-hPY'&!c3M:JNfJr59;(QX@Q)2Y]Q4?T!1Nho6_KL21SA^<[POIp&3,D=W\/&ieO %Z-_d'pYDe(bL17UTknGu8Qg<:W1RpX,h64?Jf8Ok(Uh\CLed?h5ndbn?Se)92(8$3?b-9.^FPjB3iD` %iCm&sW'Xh%/PNu4$b,@p+2I5o)?<@iqC-UI=+Ks65lTg2W(47r7Af8W"3=3BLf.ql`PG;RFY/DeNuU3FUiCJ,.oCD]cXoW(FiJFV %U^d_(:cS^VdoE\c?CIh_=`k8&+%).DeOrD.Tj@^m0^=WF+GbIoZa=oSBfd5hC)Z\7Y(l=f'XIIAI.HXP*YhJWO2R)22C6J_i-!DR %lb06dE+?M/uSE0Kin(@b#M:XM_8>F"X?/X:[A@M%m_')otX&`"OrM>G&NF<24ADYFR"-L&lEE7G/B-d51*a_T9$n %%I8$LQj"Z7HP-nj)qW:S@0UF#@Ec$gfIZ\jXtg>FkDG<\";k>M$[0hkajHV5*bH@&:53]Z:&.StbbMX.^;c>sh;MAr`N!q;d)iQl3>2^#O^eDX$ %AE15d:W!HkGpS#a-;B>Y=brKQ\oNCWf43D=/ms\7_YaaUPmSI$:8^ZWr9CAh)4\W;UU=MbL9\2Jk`31_`*-'_1BWhE+`Jsk/GruG %=F9357g,,m9fk84/HZS[mUaG-JRZ/S5@o#6qD7+d-Mj %%QjoGN.B!2)+6Zo(f8%b$T6pS"QunalB*8=RB\aA<7>4k6?61TTnLk"U=jYOA80us>b$(`_l"EL+a;+fM,;G.oP_UL$FH8$,]I3a %0KS"Shgo>PFsb*P6La]q33?V(>^MN./^4@V8=:f34#f[g$^JpN40]t50RWRGbFn#"gpfC%?%5V8Ld`+UEogt2HqejSGblO@?rCU# %dP$=+PTh%V!7KlL_^Fc<%MbBI;aN%je(6%:5Z+X+lWLVX30_9a_6'4qF^2.+>L44i$/AH^GEq,Q_DO,&J``s)*BIIQY`qF2_5)u) %l$%-0-*r?;Bh_];%O4dj]Zt/kXjfP<\B]2rk?+hG5*s6CC1?mm%?n,dcr;)*`ZoG'B+^PiE-m5(\YtI+_D7Pc0s*!:4\aS00'`:S %W^LCm`/FDt)BjZ5J0b5iZmD^-NMn70D++83N^So=$S[ig(!/b_kHJJnE@QcK#"3ZLP[R*=OSY2mH\/WgdRRV4J;&q?SXI+N5I&6/ %OuR^,^d\4a)'36&6sY:;(5JUb3dA6-RMAR?TS.1K=ZmA:5amPIY)(f_E'!7I=98^\X!s7;V+O+8:7"Q.^C3gE6ZG`!6]1YeMOoI7 %2(h9l(KP3!kIiq0"bY#=K+6g@Nc>o%E7abtf:UMl`$-6IP`Z@,I+(ZrJNTHPeP3s_%aAueEYWK"Q(^k6ft;e#TO;Z"ks0&l2j[X- %+OlTL/D.dli#o8E>A"!HZ;Z?Ii1_2.dVJf+$aATj`F+l=6Q4KX+uRM1NbqJE7a+bSeP9t%Z%/$X@?[W/t/o31_'s.ENrQ,GQ91Y %SU+ii,X_b83['s6K%;%RTPKOMq]^S35bg!p&9Jqn4be=#.hah!D.h9eFZcolOkjcCca`mkNl9k$?G"FlJ)J6(/aeKM)+'q$ljXhL %=St1(K+68Nab""P#/3ok7eZ %Ji?nL+9a,oiDA85.HAF>$r6Kj`ZN+(c!.KSj+Xm%F4T\eR1HVBIgAG:^+)F/1aD"MF`d`rYf5_ee`uV8EN8PoMQhd]+$3bu/-2@s %o9-q!b2"G894WgBQQ:fLjIdK.(pV_J>m4UrJ]QH>+WFaiNBkdYX]+ab70dLYCRP:)YEI0 %EO+Od@7p]<6:T["4cKU1!K1s7/63EEgNn`/mpQ,](868=?&GetA.2-Li@'aKQRp16*0LTNN)re2&BSs8\3h!g4U/6]iKge&c&#VH %$@,30&p8$%%@J.:F]Df9]*7DV;Zq]#(Cibsbac$<:G2c--d5u+N>?=V!X[!CjK#aHGtH%$*DsLKN]^bI@++B_185KBB?NI],iZFE %ns$F,d]k+@I_Vpt4C1Ka$94MF3dE(WsWCb+HRi&jQ%-4XhYS@S%>sjg+.Mq2] %WdCit'i:*f3drOm95.@Ehj]gp7-,Pm(KVh`.M<6-2"M8X,Y1uAgH8Aj+SBQ/7[44fk/OA_?r"bE1eaGWGf`SEUu6"*-'eTlC.h8t %m(./A$q+p@([TMOH([nf=7X"9JU7#-3!XEI!F=bc$=^(pf!OSe+@X'1Xr2!a@6j[GAUn6n**Z@_ridtPlou:kE=l7MaK]i-$M1VO %IkJ)4OBIq5-M+S0`5s6bBKV^93NZGX;$-E9=`Zo$Z#`Mc!]"O\.'8+Y02l3K5ol7U+pf-O(7q<&pE[mq?Mu3=307T=.b1Bunm&EF %JMl*B(Vde<]MO414A`sS@'?IZf\c,nY]fu`9OMZYZ"(5a2WSiP0&;Vj,pXIJndTjhYtm>i`r_)aD8II_d!`pmN)ZWZas!r^IEiuM %S=I*+P7Fj(V$3Q`:"J:+?e*LLKS-p)/4I1h6WhNqUdqh\LER((&!:l"^>YifPA3`puDbS@`/m %A7XYXKJo:FS*l+/Cr6#+T6de[4J-l3-7.0/-c]b@&UbqPm6^XldL#q31&X];]=1*)Y%MB_N)0_M,(`7>J$lF'7qN%W``Y_-#@;-1 %/[?o=1Uc-al$R1#`a-M>g%gQmkX0&B%cbddgDc1c]cFVAAaD4i^14"FFW*i:bfeRQ`:1r)]@Lg-8>AQGC#_.h>iqQONT19VmJOsZ %E#^$*YU*K!OUYkU]lb?`*I8]DQ*@taVjdpTA0l0\!uqe;='Gb-K?[iDNJ2nILsABoIUFDY?fceRLEJ?:)*to %XAk^!$+^S^pGWWe#s&YqF'!*;L+FC%*6]>(-\3P7#74qpo'cBh0F@-XXE2N/"G&sLbSZhb32OVT-QZlQHC_^d+=a[O*jA+RaHJ%C %M]iV4bSZ_F=Rg2hFL""OE`i,'&E9b5$!(MhcUlA.?"AA&&eAWP9kl.c[q'+5/5[E&W'`c.^o?S@7^%S[G]u^m%LJ&(b'CIBHT4;J %_'";um<&Fq5QXH==jllh0T8A\SC'>9E7::T"X5/3K?-*l&G)6P`4c)nb1[=e@3qA:`(ilYf-G>r)1m$pMDd@h30asCG%V+d5uW]' %9UN1;O[I&"<`U)pRNI.tA%&K7aeGOerM"2J7*Wna=$$,6B%rrAjaleX=N7l7RWN%&(4]Xri34@njr>X.+g^!FrG>(MVgiBCQjF8t %l&:UnnMAPC$W`<"P/nGBf*ltK'\G)f2?,mQ`&QBZT.@felq0rU/^.L5c8H7kYg,GE=U;HEJ6bZXd:h8f=Jj(VW;?`h.'!r&ZR2.Q %@'a-X[Dj0NDSb,nA_ScW9m3u4'd2;sZQ[c!!c77)4/(t:2%qO0c=[d^,[0"P5jnEImWG.P>i03VD0;B[8\!d:org[`+.4YIiU!P+.e,YNDfPZ&d!_F$J2G*t+HZQ(eg;I8s!dnUc %dfDGR@6n'q!JmN#r5u/]B.Eu-1WXPls#Gb/qpRV+iDuEOC""0LrTn9rXlOph,AWKmd:3pGaY2Lg485'g);F;f*VsR75/]:[a,W(6 %Yl9iG_e0l21IuuQ/U?#E`S0X1Y&"F'-g\QUc)KqVKJ[tr#9\l+^]g^0]T18&<]8">3RL,ab".R`ckB8T3t.@EatkC,''l+kgKpPo %[[8k66mpYcNJjX"FhKe8aDo!Q#>$gXZJ'lN@cD5jfH&hW8]Xig*EJVg,UD'S/-hB#k\/_#.8+,(\kKi7QK5GL&jC7@U&fNq!K:-D %7:r+O-#i]e=t1b!U1ZLa[W3qDN',@NJ^nu.A9fi76p`Ve]%l8'#Yco;/_Qgelu0[!,hV*5-@tbC#[cM7Y8ms<;A>uI+)nRYY$%(e %jB%I4\jFga(6VkQ7CQo-Cm#.a"ZrDH6S&CR[69^OC'MSa';p]g@>m!FSI%Blf(iJ>r*\N^<:e+SK&K^R`T4;&eK?gj/pKgnV`89.M=).S;[jW1TC98-g,/DdVSleqN.3-F_1qAJHs %r3QqtX=(qoau]=+\`K`3n<'c-oH@bqeYC1MS)YdH[$K`_;o!5=eNe2Y8`J:D16?HSG>#T%*0IO;@h0Vh9+ClsNIB]BPK/.'/4kN[ %3Ci+)3m3r/7JFI6N9!oW"X,%q9=+,Cdr$bU,<$l5?d0A0.<:1K/qPJu%lj)H3Y&c[FqBRUJT.nKM'6:*6DP>&Ce_2k]KcP#-s?&^sHfuMB:OYc&VWZ7tQXV2jX+D9;mgiOW0.#:@3\k58/&75[`NmSJkM%=RVe7Da*WGogS4,S[d_=Op.b7%o.AKHWL %i*@^**dte:c4",OJr&:?)9BhZ,>\!6@hrqIijq@2**&p["?LV,=_P=>+6T:V"b^j:<:7ON@]cM+3+7(2.X6\gt%D1f.B!eNr&#U3sCf2\Z4E^h(2;K>hZeS.aS((sk_0.VA9AnVE@\.%n %ZDkj2&HlJLGZmfahK';CG`e1u!f`Af5.AYB;-;d.^SAXBo*$d.VZFm7$HO>,T!;a\*EtDH<<;1[OBjoVsdo?N%?nN3j:uL %(g[GE^eG'j-9H)j642.or?fcs6G1q?NR'Qrh&'G=Qq!Qg=tnT?"&iAZ,D1a(!@6RI)4k]#:,Wbu4+0scjl9)TitFsCBp!N'%1XpI %Qm\u#Y0LY9Jk#$!?+0$_^i`1s2'6IU[/cAaX$@8^$$eM(>1p2'3H;.1>1p1s"F52]AJh;^'\>ag^,mhaB&$e9Q`6bS&<1/Np5+Up %9S*#U2h02K6R&^J-:nt7S7K^d:25k=9AgK*P-_"&6E;as=:*T[r6WR=fc8$6,["80Xl3=38ZFfj %,3tps5%uX^?TI;?N*Yprc=GP+1ZcQ?2/OW(3HDK`fIiRo3SCPBFU@aRCeh=p&5$P5V_4RnKu-h9V)]:Pe.>%ARU%+ijU1bM[&+N1 %V:Z:&ld\S>RZXt.'&+bLU'%#-#+u.XqHf\.@;)r$?]j>Q[dO$\%t&q`lciD5Y5o#SjUMfl:q)bMK-M\EpY]FNJDF'6VpL]s@!PL` %FCn1s6,-eai!pU%o#6A76Jh2KM\Vu2(l;Md^Y!_i>TlY^^*Kb=0Hl8]@'dk#%![PhJZ("4%"m5lX/3HHj01!U"#6ll"-X-K&0!,$ %ndHClH?#*f'J^5B!\(=?b;&St4^*e5!1U"N9QkhD<<@[_XG]N14LFQ.!!ph=UI+l/hB>\&UI#e%40BP)@8V'RPqX9Z(cRe/nG"7' %?"I.0ZEZ&nf4SO[@/QG-WUc%h5NXG<>p%?3I71(O\YL^0U)D^LT)<_(Z\+Te&]a,Yn*22rI!F#_let_%1ZO>s51^V9IR)oi!ZWs* %1_RFajr1N8c*53!;Ri&./b0(I=u,&o7&FV%r:sJoE#amMX$Z3#F/g?.]*f99s.ZB%d_f/%i/A%tciE)ug!q=:Z0f$L: %DejG`[X[WBng'R2/2[HiF#$:3@_l=ttGiOf/N94@K$!tIuX"c[]`c?6'F*@]ScLUr*H/3O08I^S1a_[rj %4-^D(!ODOY]^^o6C/M[c249iegtQMq1G6jh_]`+9^pRrMEnE;#b>mV`N5G,%28@:L2B/9+9WO)s3uo_P\(Q2:(@/LTAe+MlJNB%g %$AqQ%:*+dhoD!u&,2G9dGh\CBe0hkH%iK;UnA@2_/iBtdeM6W/KUO&c+?k($5qQ8bnC!ajp'8eH^V:a@3eO"C2N"H=/Vlr*@g\ %_lPgj=IZ\`A=,B`,#>a%LtgdV53oP.\9J?l2%4J[+Q!QW3F,S+UYKrBkA8@&8t*)G0N=$R+L[Bn9`J#:hIO=9H!-1Sj$\c8@c:c: %b;%')7D,J^RKJjEm_@d"B6i.9W`5QrPH1tFD23l;*aqH#9900q0j)M&Z?uM?Z4GOf_N@?a$B3UL/4Uq7\0"3N',gXJB+i(3!HOhSH\gcY36-^]aNh*0MkTJ'7 %EiK.LBbZ(r%D^-8Y?>Sd!&;ZnC][NEJG$cRF"N4/eQCB*.];k[MQSeP(7tQ*4\O2sAiTa7)hCI'nQqCP=DqD;9nEmGKJhGP*MkJmPO9"j&f;El(R#=8?[M?itZ)k(Z/F^q0oW2V,Z`-B7c\HYdMj`aqP%Zr.I4p=253ig@.(9Is$p`)J[o&)4 %R<37c=Vc"Y#8HIN!PU%8JgGFjr.1Y1O4B>bXsOdF.o*EWPl#UHRAA[ZfQ_GL17`3S354Z:VhTRXPQ6]SjrXG1R,/D %U4H#Kf^meUKjOlPV;,mr0a,5hhsh1RZ1H+HAs3f]]u_nc>V$\>>5,/:U73T\=YH_niLUb&*$E\9Q(6ekZJglr`8:6#1upnA %(0OP1L4Vd@)b+lp/i#=jOb177W[MBu_5:7-H%C$"ajs?^lNW2JL]H.W]ZAi7S8?BN2glkNHBQI*;SC9%X_h+d#Ce)T;R9JAhkAN$ %HbD6O$dW?tPap'Vq^oM;fSetD";b]R,IS2U%:$Slh:cC<(J2)I2:#^q,%Q:H]k3OMXK(bJCV:];l?`n`gNffr4o#1HMe-Whk8!=a %05J,4)l#\hR"g#Jh.TXjPOjV^SUdL\P?+>*NY-doEU9LX"&?5#N"D!I_`&G+I6cPQQj]]<*)N>e'BQDD!j':\'N3^_0+&6\LnJV"fSpN2k$0+gMfI4P,i3W %]f+Z1@b)='%<0lIYDZ5GjaQR_f0pl8ZIM7[Or_D1Zc!5m\?[D8/X!A3PZ4KKoLb%S"qCH)N(+m+EUk5"nGr!a*_q,oh"`%-8(mj` %CPF(HS1'&1:7S;%X>\b80-S2)Kb]YVdI,2aaF8#+2;TC+n2*U7,8bfU:n,o;#OF]>FUi3\>2P1#LO%9/F>su#orNt^p7ZF.BhdtD %HJ]%gE$a%]>\2dnn%nO;M:/2d(6Uk]pKuiDaXdV/q/OK2S9X'6-dG_MnbF8`i_>VSQlr#=ZB1A4El]Pt2>EH]Ok]PA1upXh`9.\D %^L"j2RXD:ZRObdm%U!!K24H'l\)lEan0selK3Pq2K]O^ATofnlbIR1P%^Y"e&7!HhN.jWcS.&=6Z*kNkjTKL21@f5in,(QBs!&n& %]]p:T\M&.ICgO'h#XTYoaN#2+YDi=d3ViU<^uoZBVd6nY^Vr%+!J=&T<0Cl6BfN`E4A_Zs:S8[o[SO`r:V/)b. %Ufp2Q8I/SU86[XeYcMqKM/pC:^>,fA@fP2pamqIDG5AMR=`ldAV %OhA`QQfSBZ5maSnd_PWp/rPJPMf+U72BVp)5P+)`)2qb=GA[+,*j&p+ra"7a*M1X90j<-`gGZnicaP[+"eO;LC5(Vo!a1FY087;4 %V^MX)T\o?ReL*\YQ#U(KDMuOLQbqB)X)4XB:MTA9/Sgbk)h*j'2:/-Pf(!N?/'J5\(XWoM_[SkjN*M1d=0j<-`gGZnicaTVV\Gm_Sj&oeO[rKq`Oj8Q'p_8M&6M3iIo0A- %(N.@hFk@+1eRY]2;PA"Vm'56e'=g9e^9*r4JX'>4r(0Q5S[>b73,)kSjna/U(7S;;TJL&Z*S4eB*K-=4f:`Fd;X'8U %Tl2+@Y^EK`%teLAmVW-DQF,\39fXIWF0;Q&ioHjQ6?7jTQ>h6[DM*YD1n_Y=[^D*?Me-e1-ll>tf0YP;h?-s=TTe_rV[\ST!>'OS %2YKfaJ"Ecq[YAQUfr:u_ii\QV_.C#2=>e3&XR4s*cPDjpI\d_c4_pJ"Q*eG?Dt"KCG%pWu$8nA09cDql9^bZdn5kFE8m<+cEr3;R %33?eHMG@=/>';ll/P`.EQCE)8p&/,U@!]'aWGR/*>i8P'nnK0OQiS>@ZAGU'=YPrmPhJ('_.WEjO@'FN9Ro9-<2Ya@["U_qY9;T[12Y]0BUCH29OPf)^3UTipGhXk$[i/>@d#4rQ=G:.N!"(ga %DZH2ORQ&TZl5Np8poId*$GC4J994"*n5ZKiPhS(VpA"D(,/*QAm<8qJC3/"m]VqQ@3hJ %A)Tj&Qg3,NW*h7.o/b>#GAL=HYft+Ai)BA\p!WcRp;8WZ+JN(QI#J9k^h1%Fr$A54,Vs %,dnAoe'opG%8a$([[(BE..^)Gl-LSW9;Po]BoC=&O;hn"_BWG5*!%HT`:o9Eh?J\)Dj-h)QO\%E)mo!RB@YYD:o %>>)N@*Oj""eQ2+Z+)^JS@q3E[h-Nen^NS@(oaU^[54Opdo-.9%]7l*t4;IHX`Nl(mH*+.?4k44:/[KAl`FZF[b=neAQ>YFEeBX)4c"Vj&B[C/r@=A"37l&ZO!hnm%D_J\mQi+B0+"_o/?bgs;l %"GPM7BXWi9CdbG&G3s+NBse;4YZu#mp"7[sS'kiDQG/p(DpA9KZo@5=bZtHYFGEOreiDu<9[kb?"mCD:Wf\ad,jX0(*B($#JQ_`h %;@V8qZ%WBdV.hO3[F=lP$%V4rDZ_*sA-!7p6_7m!4O!Nt)?>nJkfElK>ml+67B7hM%=i+2b8*_i!)YeY7+XcX@GuX"XKeBEK%[rl %?GJ/%*'_lm,equ;^9;\[a/+2tbA>p(>2bG?e>Y*N%1m %;JKs7>pDF)ZF4LCHu:j)>+f!084dA7VZcW(`^*[+MO*d\,CYPB.odG@HaT,ag1$LPZa!E7QK]:oHVAUR2CEb@*T#XZ=1:MYL03LI\MssIS.G2%fOAD/nk,I2KPTg1 %jncE_%]@jYd',(AVQ"-^EbSBOdV?>'DlW9f.c>+(lS\2pReI3j_`3gWCA+M91 %UT#]m[8ZeO^/^-_G3^ikqb%Ybfq)%"Z[;c&/Y$??R]W/,a87dVp.]C$>0RDV>=.&p]YcaJE=-Ef=PbpcpTeOQ$S!a=8\&SdI&l53 %fRAU$l*Kc6Ua@$q[XF@I<7fFN@FJs+aLBR"mGo\"rFOK55V"<6#)_>3n9bB8"JJ]khCR"Mhb5%8j*RupUCEmcf %BH;^sWf=GaVCeCf8qr*lM:lOJq&suWR;Em\Mb!(M9N$_KNOcq_2gC8s/*"6"r#QBlD;5@E)]7%ki\j&i_EL5AfBBXDaqVEF %_EMqk^mN-q7d9D!+c/gLQ&/ccnX]_,a*/:_HI-1`X?b$,R+/4:g[L#[/>WD-8?-sG#"-V3D5I&uRQ:N!/aM+[l4GoNhCCT\WD,1\ %DH6L4?Sf-GnQ)%!*]oZ-`tu:ToEstcY1*o[AX9KYAW'(E(sG`a8K4hMj#6KsBN`MpgMhL%R]X7XL$r1^G-='$%-3`aApma6abkLY %e^++iTe4a&Yqrp0(t2O?QodG%#*7-*Y_ITufp_VZFIk,U*f>e]b^J*ZGkW@MH/Ss7E&dB`93)%bFjeC&>AKY0Og)g#Pq%`RS?K'= %*N",$<2n8#Z#:oU0kopR6n8AJeJE/7Y6s@(GKqsIJt+BM."ig.)E#/[]G-mVlmB$M6N[j4[2lOei7b--8b2I62l'G$>:N %HD>p>!QohsQ!gqo#5?lO<4;k];S.*1fJZq?Q?g0Pdr/L0DW=&sZ;M.^gT?,ERqs"^2(,SN\cE/C:/u`s"LoCQdfCEB5SoKi<7amt %@^BeRe<:Nr:?\s"/.nYVQAU)PEK,H'\lnS$DCYZA*5/4qX:"S%$3F/u2LKhf8eeiF+B%of/imBdk'AqU!QodF4Mf5t)RG>34pNUpVor]>QEL%,A@>g_JdJ*Z/IH_2Y %A(9s_Sp&[hd$le=)]LnCa'`re`nGAP*k/s1ZriaO[?:3.Gj@b]r_aEJBOJKKE1X,CK8:mR:o?'+&I_th8EafVd'XIoGdNLIpigR" %GBb#2XO=D?fsVLeGdsA'#qsg\U';k^4LWSGn1hgW1]HZ*`0u!Y9C,hqZ"OjUA_l:DD<*:7ggEu?Ur;&t0^l6=Mn_875C@JLGOFe[ %n%SVJbE!`PIspd6a\\3\uXZ+oMW05J*O%sGng %R9SN/DM4[3<2,N(fapl,:I?sF7b7'3?e&RbmA"Vf58gZ+ %Wj4CuQHt:b5t7'gD+NLh_+NM=P9K?FIQjV8VS(j;Sc%S<[7om.45I,u!2?6]d5J/oA't*-CPN]Q1ts+r\@'eQ %BYlC&B?]CM-6JJW>#!\Am17m7&8_'s(F*OsWsU>YS$B.rh)te=cJd]0'>J)5OGUg*5GGir=Ka+J6_3:YYht0Ra4BN_4(YXV3o4W* %N-bH$1ueqML1WZX7)SD/3:,FT`V*/r@@rca<`M.Om5Ac=V"SBTZFM-(1\`J?G>Et'ZhX>f'0f8>"M)g%!j$n9d-#*r"Ah:A&Ccb5 %F:&t]e'\lbC-2QcZIGnTmc:Z^_e6$]C>jonL=Er]>Z:SY.FUmEmO`"fH.EH2.\dccp*N54X4W38)io_\'!h&^r#O9\5h#+S/%XU96KqNm:>J!g;\og4;l6h%QIH*"IFt*N3Jn(S$tl?iSh/K=r;(UL$0^Xkf_IOuPBg[i00B[B/Yn3u_,!.b;,g1:>l@foXpS %EQdL!jPCA_7fR06G8GBA[;,YMRBo$ZE+02APdYl%ZkdQo@JWX/scC!OP(XSKDA58Z@902pq2GTju+LL[up<"+FOnnhaC9m!Z.*I:&OY<_s%X?U*OM-CBu5&(>ap)DL,GML@)inn_gD6VChQM %;KKXRg;g%t($`pS2gnt'?9J]VW[BnC0/fTSW %qHrqVDKMmIgR8'/iE7tGHW^U"58n\8lSJXT$.)WZ$4'Q"*Z>gk"phAE'[XKc325:&chSc]u`ti2:S'Ka. %fW%*8;VgD;W9\9.C!\=L"dqiZG-g'c^\+AV.NESVF6i`"FY[$P;sS9%2B,`R>WntlVfC54R=d36f3VK^h/*j$`>LVJX<68!iE5#H %C:i0-Ypp`oC*0?SiDb:RDYgr-I'-SKVPUN!56c(!"],[[3`FF(D'a.e%3epOZn %rC5b5q-N*2P:<$AHuIbA'i#2=UeTVfD*3hnFk/m=a)RunBf]HMO0hbDX_)B1>DOgMJ9NCjc+t++7hrRZ,B3ISq%r:r+5ZR+ub1QF75#o5HD0h"mrD"XfaAi&L;+\=K %8ETH\9g;^"0&Dh[)ju8L2]Z2G[>nR^KB*4s8FECrE4,JX5P`5L^DN8dVg,]s %/#dCSY("q;,rW-LZ@PT\0=uBYK1WbCm5mRG0Iu`V?\.[b5qX>Am&_iV#K?4FlOL"5fS*d_,C=cQ(b$d"2%Ou#Z"?5)__b/><.jf/s,"'Ac7mP(&5^SuLf!]1ae^#"3a!:Rof%K)63]Zrt/Dm[!MJE,LC`i:t& %#cW$B1Vu8NQ<);&NuKDsRYTdP16b43Dnq/LdJJCc6lEJB-1?!s1+Ck)H3dHmYaLH6!'\Y6hidE#!>j=7,u.SYlln*\C.*g6q\;&[ %i0WckZiT,rA(X>fW1SDTp\h$hYc67%ALuT9KY%JY'=K%bQNX/^e9&Wt*.[I>6sDF[a;nRh39)kp?#g'j^o%WO#QQEGFjbA`,-^WFDJJoN=PSkQ(rb.WR1u0h3oe2P;8A'^$n#o/#?Kd$/-'*ldJ*"DMbBP\sbEE %('A?`-5ZlcQE82/`E3Z)H/!MYe5"a'dlT/#f$4IHUi!]XB@;-[>G5d(X(T+TgWm/+?aBsID4/_-`(DeJK)I%A]Z*[acA6R]>Ps85g0krnT`n*3mEH2I%1MUAG[?gDd3(l![)P %nPNn@CDBS:dp>c)V\Ro()ob1.f.$0.k+fYUXYD5,[-UCO2=*$d@A?js5$I's@c#S>Vg"s&XEbQV0DBRZ4%&>fh"7XNVG5*)3OCq* %*RaZ!6tHH6;;!X7calD4XCBZ7Oes+4e4OXX\*rY*.q^T+qF@@71M=.d+;95AYiY;E-4OOEHDL1&$H%,!,i0"M<:.G\h,``\?E@mU=IuOgT)En=`m/5Spo#Z+?D7G4]W/RX)N)7VNlN"+cjI@U8E2TTdku %g[=mgX=>=[:"X,Elh$P(0'n_h#om[$%\^/PjK`?%Kf(t1E,IpGhqF)L-i':4WES/;1uUu8R\ji3Bgf@f*>*V4]X0OXif&pf7*EUX %CR@$>m>..D]q1Fc3MV#Smi(TCp0a]8L>#BM?!GppDj`GVIalQgd!Rq5gtb,14r!)3.#jA_<*23pUCl6oc]`rMVP75p*icLNo_2k$ %0]ID>G?p@ZUH91V0d(dX>,p7XR?#&5=Xk&lR#+bA!gCKNcc*ck:PYLeFE\S4KD58%&'':q!MfOe8hIWf+89!-2.VbAOnk[!-eTT* %LUAd_+MEr(!-=2kGA3iJM`@khJ(T$9mGrT3m2L;*&,;6I7"bbqUOgbbgWe(LfDlJ8qPr=?$rD`:QFn-H`>G=cqYS1U$bU9I6UT!E %7Pfk%4:m!f`2+H!SpUK:]5M;oQQ8(dI(hZNXmCTj5&rgSpJ;of=q"jZ,K!i#J;4ScNcQTQ4gVjtipN6@fM'[-]3*$A %!d[5HSH4fI$6u2&+lD=bBZ;Ic0ldtW],ffZ#T4i$RgG:4!#GGmDIm2mPSjW]"qcEKF8h77s-OlaoQLLgOg76r"MVlLPX1Gheof`p %o_(dUje6:&3sF>/_SAJVfMM`toDu;k&U/HW'TXe7)g`?.BR/.m=_1u&oVNM+WFa6qpUmt!gPq?9*5@VgplH`rQo-t2H:QP+-i4Dn %"/i,KhDMr-N*WfG>e.nVae@8\J9AHnfa"Z1fPp*SDB/$3`h+;b]Q^8Arf*u+E!s5WjH'+UaY%Mhl\F%h %)EJFV9u`To"7:n*8Pe;,\`_'_;j\e$T![TGC1IaYRU6P.CCJhl-R%Zoc[.DUf&FWkDsr=d8Gi*]6;D$KeLu8iW/j$i,?WVt;msX> %!Uou;pMRco2rK/BhT=Q6"7F21pVVOY@DMiU]lU_+pY:f3mY:i;_k-aFbl'BVIN!/i%_*Sch!`uZRJUR2rA*;[*cO=S\DOc>0)*P\ %qdmSA4Q(\FF2*[EO#QUr(!e_b4\2[;t,?Pe]\32"uWAli`EIOS,7PHbtEpau#(C"%q %%Q)lF('[t1liDop!Jl@/#_N-`K)t2j]2ZtaJXZ04Pr=6)JY)04+:SMt%0dpb"s=B[TPs:872H/c/e4-"#SmW%ma;+aK)mBQ!Q]lo %aFaNWgY:u(0[b)`T[uZ;0[b)lf1e?gJZ][W2Mu>Oaobq90@b2jT^,dOeQ*U(nj(go#rtf5`IY0b"2-UE`IY1MpZT1Ncuj1Ih15NC %0E?NJBC!,kcugqg0Go,6Et!-p6uI=%=G\iA&ZBqX'IYW1!P %r;]gAPXi<&UMiU_BV^=X((F8D-sW`md\Ke(V2^"+qo_9`L+*Td`=\t$_A!3AqA'N=).4p=9R2:?%l!Z.Y(BT9qI\Ia/%/$t*!"@! %,S"t@\maZE_l0k@,j"GJG/a.?!GGm!2BW-H7WFWq%aF/#8R2UK6:YAJ-tZ<;C#F,O8bG:RWHh;)aMf)YfPs]%*g<%A&5q\::MYYI %k)YfkZ$gt!#5[90A`WQIUK1X;?8`%]a5Tpt_"o-@@,4(W+*.HQ;6s-TVNoh1UUH4VZpOYW^GLg'NT(q[fR=aHihR@6%d#b:q-N9[n#Gu8CAPN)Bak=,]SkjNKL:PhnTQRn7KVB!Q1d]nCW3+?r[&Q#R2D1(mb%C %fPWAsIP;$PQlD".I=YQ\(`P[VLCq`>#3XifU`0c(*t6*ok!nC;6Y/R/_#U>1BFI.G0L5Adh;VgmdU4auYW*Jmqk?`'0L0>+(aE-& %%+)[RPW0SS1`2/`/<0pJLWUrE'6'mrXc4pb6lj(scpHXH::E**r!8?&+`[ZYI>^/jf3h2q9Q>_7%P[Q-m^6 %f^Zc><1qd&iC[Ig<*NV1OMp5L7RDBA#U=j,oO[uKHXPTI;oY8VJaVd3I5[,@2J?hC7!Rf/+E#*,e)KW8FJNgOEbf.>%FN=l27^#) %%belc%>T9sg0r;n'&W3Dn$9#8*-JbE;s?nUF.r-+i\:0Y5EUqNgCg]Dda^+T?(!SV[bpIC*:WRSe)`,36pP&_Ed$/>)6:Np=`%"? %04^f\2BV%b:eU/`JCQRJZ-P!hqD*:sF,1?bEaP]AEmp"(H"csWP%Zt"k%CK9Jp1S:*UB*?,T2og%q]LD['Qo]\>#T'FL:>]7OfT#7@%5pgfT^VRDI:D4&*qq;mE5K8S0&CC^.:cY[OZ!r;:/Z!Po[8V/'*H* %bu[h]2"6SS>o=kZV+j0l,dJp5$@P?qrfH48ANE-_N'DrUrORLH6IUkE>luki\[0bb6GO.6ZJY;[02r6V:/tf"j^qku@XMS1qD(-I %#8?5.L71`nOXs.:W58;kUm'\I2:V'd$JFH!jD>"k4NsqR4>N3;PBnSUFjkX(>:+kKM&>P1F6M3FMQ:@+][H %qgC=DBV(N8CnC<2`#t3=;q#aphbc8hi<*j0=)n.lc+X5b"h_* %O"L7P"8B4X0rQcHAhu^U_k&71n#N"PJi30dqD)f4gaCt5msFn#9Y\@ufo'9uak!;]k_*h?ZE8[m;J7a'if2o$QE"_)MYf/o/Zj8s+)I/R\e0XMd]F6 %eC(r\:e_B6[?9_$QSJ*n+gLLZm)\P)EhS>r(WV_K#*:'kS\&+ZPd%3&T+8QZ[1?!YQf6Sc)NK$6`tNB@_Jh&AStnGFdm33_oS)+ %b>bJ[Ge\:mARt29(8ah'g[@3".d\%T+t`+5M*CL5rWT;/Pnp0Fu=GtBEd=ijk>kAK3a[Z,@VaIU5>HO1ZFnXh<* %5L_=I-*`ID1tH&>0A3Eh57lBuFY3?a<[TkmkTK %SUYUVDS-ZJ,+81q/.21Mofp*=pT"gChL0eCmWUnmR=P+K;>\>k+9%(7Z@$`biVW(mDsc&L7h!?;Un8^*j#-f8c[S!'J(U8E)P8YA %ZUI)O3P2>JeM7A=ZKLrdr[ao*i)%$#qW/K]n9/*++^],V\-H9nG^$s[%e^S/,uJa>P;Pmn4LIDHKaCg2dlL86e#9c*0Q@)*^)!-Q %\A00$RD^Qi!V6(?5ju%F,f25p!a\LGZIHTgO,Ag31-nlse*;0&J6']p&Y`ebUXrS=[7Isd*I5<]!Y.enMBs%LCP[:Bb2TPn]tb+&WlVHLaR8VIoFgq5V#269rX=o5YK %(#oAhfk]9K)fnX&-k390^.i=D:BS<]l=a-3(hRQjU]1S[NP!?\,fK6M;$=I.m$Ap'd3Pi8i'Dmb.]j5j`(X68bK`VVTrXETAuui%]Ig6&Pdcc)i]17Zd$RqBZXM:9sR[f6]=Ie.G>mqd>7O\16t>Y %`4#"1?\>[n2D($'1"JdWke'O`m$66MUrle@foR6Ih.Bg^BgoCr>6%q8s.aP1JJ1Gr6;-:Zt$B1iS"-mF0b>8G%85;!2;QEg4a/`=annp?cSnoMTS0fWM/L5uu9<7D2!sj=pL(f(_HTF>f %Ada5iR?^m@N2kgC^>l"*!P72V(#9^3('81>ZGjm8Ls:*G$5QMrb1=(Y^.kHnb68SRn=ot`V#XV"?NR_gITEVe:9t.*r:6Jk&+3B\R&Eh5#+!IKIhr\TT4s4KtC#1.gg0%ZJLlnVqSq\qMrRFSs+?L01g_j3JB"fE_9#/ %&pDa+E\XR#7'bh.U1L)U9uRn9OP`:d=L&bN+699O!aaoG5]SD)8RC0gs[=4CjM;eD"0NBhYfoW20e;@[J %j;@E%X.N'l[%j\n7I!5e@A8l>:SLNp:D&u+\#p,@FA#0UJ.>0a%CE9IYI&j9c.8dql-,YqXt4S3J5PJ5Xc:H%3C)L:NIhj3e?UnO %X_\PqJq0\Ng!&I0I0-cqn`e]%<=gFFf+R:0J %p[/X@>0EFWN3u:q;%tl<!+i=Ck-/C$dG&!G,MS9@WOm[IW"J>,*\I_$mUNabI1R3$??5b+ %03^fnrNQPKfsr."TY:--pt,eb2eqtEhX-%c(ieO6Yi]"(JPSpSj7huDF"`)I@6%;m=a=qe'Si[p%?8!hVY[sR^O84fFESrZDO4f1 %nHEJDPp9O%I8F'Rh<"n;7CP"3hfbtX]lHuRXq.h+M_!s&\f9$YDaBU+2Y`(KC27J0b'SH==u[+odmp+^9F\0VH>-(lf((;CpZ(lB %;F[0!:"Ja]5J-NsfkX=oGGp>+='HNMcOdJ'mBa]6E+,T#[B7k'`HCZ.?a63do7hkG11!tPRo%^@$=E'CDH$j7M&_oKR1jqO_YAM3 %ce)_/Xgc7Yi((Fs=5eb3A]C_eV4l;B)n[#jG+B"e_2eV\e:_]7&S.G,d:h$l`05PmUSK_(Yh,P.\!l'Njtc0U$/#_mY#SiQdZDt` %1_Z.RQF<]Y9WJN>]_i`1n)_*-4YUT*gOqXe8[HQKp\\*/Rqjk5ciA/%(VX]NPp_X1rfAb?b4!Sq>\@0I!pd"!I= %k**[d(;e3*6B6AlB\/3I&E76nEIn(OGdE=V!\]]U'- %dF]3b]b.S7,Q%4[[O*I]<"gm.Dt:cQIk]aMS=)?aD!%kUB=MOj\4PO:08_gRBgB8`UE3rnfJel65Q!J3f%=,S$t7l+P<6-h`O)^2"!?_u3Z@8@$7qceo+M't;T]DP0;l-Zn;pl%^2>!=)^X$UMp]t2D]&\@]e1tgi3K*h.n&0@b5ZAmSkDK1_i %$WFu_T4`MC&3e,>o[ZNF.Vcb/)(nD2d"KbC*oS0*Xk"Ain2UC_)^G3!/='3rL2M`hjC22I324TZ\jCPs2-r6$%ZMf9g:r%VHZNTF %o=DUb)L0c)VKR1Ff=CUj?9BSCQ1`/ck`M3A%>QUP7qX4ClT)1+3b-*M5FUp1UYLPR%%nB]F0l8j7=1=d`UB-BA!D]MefJ+bA$C:F %R,;%^j%AP,1b_FR\7Ic`&gnm2[=3J7^s(hTs'Q%Q*7'\s<"N2XUlQ[Sl1*LR!$3RgV\ko2q[nU,BT&\LE0@-gB#P1>khAiE#)mKT %0R?FJV\TS&fii7O&?s'`2[H*FR;d54fs;u=:X&#g[Kn\p@TCM)-ut`&HIMs)O8m0g(X,N:N^H@Dm2=!ekfttl"8EF3XY!S*q:o\V %$e/j7okp5Rl[%'0@5CQO@H"E5Aa?ighf2DC0ei_bsbO1MjICor?1HK#1!.^01#>%q`iZ#Ml8'N6gI$X.ZKh>69FIi1_I\@g$Z4GPiPjt7&%jUZOqqe**5O7<$7rWNcC %XBSVd$hgBQCQ*o3cCss>cEO*Yg$mgdYc`Fhc=(!C_cJaKoT+DAQ]m8m!r@_'4I.u(@*YNd=Z!H@h$ru^LKk>6k"k[^K4+5NmB-tU=$W&;K6rtoXUBT>)#O"S48jFG]4\`km6U:-BQo-G*iOb/[lpWg8MC^JrA!iNR4#Vn34e"E#P7(i %oOq3'0l:O<'rg[QS8W#TaY7Z=$D4+qF$E_I4@1>FmLV$9#8[h].,45\II@.Pe;1WYnHjV1$l.*)Eq='cG^<'q[tL.gnRpLR3IGSF %mIGt]>SA?jliq,7;Jc.l0uEU,_6m+m9c+>g0?47/kJ.;r"6`,33\E.@md^')bdUF9k/):_J384a0:Z5diKk(m#PZ7(I9dq2dQfT? %*G7"Ce2KDO*oWk`a_fPt_>`eg'SjD>_EQ"5"(+-?N`?H/`=8!I)<3l\47E`@3(I*J"(J8?R5h<=7Z\iiN=`6*Z^/KTp(P2jFBq!J %2st2G77>C3RKs"g1cCeI6J8tcK%S\!9Q6.-R^E71M7A20("pJTf2;a*>\O+B9Q1>-fr(qP"a"mg4C8c+8*`GKO@I&6\1ck%rUbKU]\-E[KZbO.rVT6,b>;R$3VO]ek0o,nGnZT4F'ZOtpZHg1)URG:On]mao>kQL>pZ.f %p''EfobR9#m9R']834gG&'4<4HF=oVk1t=VPe-(=$T75:g%4O9h%ZE3,Pt?K$4>@Ld6CM*kcsA./ogVBoF\TUHW=d9W":K4LO'k&M>7%*Ldt"p %[-hNPL#_&_h$j",+NAL`)bccq8A_h3J9YH:%d=WImYD\r+;pa_gkjMA2@9]_bd[m=6:f))90kEY^,64WDa0#kAf](thip#Eg@446LEZ-e,730@ksdFMOk&,bqL02/Cb=>9Kf#RCs% %ra2V1'5oAHAqp:>/Ck>BZOZ!b*#oFXQ%N1Q1K9*OUS+*-DA8aHK6P`rrOu.]J4#l4b`K^eb_*/R.M'cJk);%&TqD(bn6LK4LTlbt %H]"l5/NVG+^_;%.m>+]Zqk86.'Nd.UYi/mXq%'m[cG6Qgob!8/#V&ld?ko_r#9!t(2*P\g&/T--"kSRB*mm6D&2GHn&cK[QW"VMF %/c21`JD)d9jXPDoGc]Ck;<)\dp[.VGdY+(>dtMab37B7oS+4*n$:i;BFKpoc(3d(*5$+("=^9"DQd,1<\sE`pSm5WR,^JbX0DZ=, %o_?-$S?.Wg9,Qf?EfZPBq.tRT^HJ!-RMIQ4"#3iONI.+^%BTQLPArb?)eZKbj]ZSPHi!h6pZn3W'Y"A4IW2cA==[>E,CVj+!PfDd %`LrNLp3?YfW^+tcdM"Qf(6&7IX%#SNa3Pne5h.2!,(c]o'c)]V_;XnS$0U($X*,RXY55R^)9_C/1Z6r.1trLN5uWlaKon+Z:+qJ,Dc@+1#.ngJ""(I_5D:@QnotQM4sMJUPZMO?VGk[h-5!IqAAr4oWKZ?=psI\VmFS^@#b50WZ2oc4uSp7mSA]JfX-ftH9,jd+0B(UM7()C]F^i, %6VdnR%cc>u@pWop?KVCH]K^G5GEJh6]2U\$f$u,'+,`WROSu>JeZDX2eC@$d&s@(d\3.sq=ibQ`WOm3"C1+Uq:ur`d;dp'5H+mkJ %g"Hd>jpjcHYQOQdqYdmOLE"U)'CB,`H(Pe3!r&gp[R04L'%Vj\S$;BQkf47,f=?5c!'e]Z#/9cGcAI,AceaPIlPgnP@42"$`-isT %Z5Teo'BV0NV8U's$rYdQGE&C5HB_I\VL!n?iWj)^btV7b_"H92j7B_$Tt*1(Y&Zs3Co^#o`I3L5mJ/p?_`\#_KA$X@\gKUjk`3*h %W**S0@2E;g2G87.:k*itdZp55X8LgN&"_)?8bHct+9)U>j#-67H@?^j89Ts:6+:Kh?KtAu]F&gf0dBb,JBS%@FJf')d2IR<$j!G# %lY8Ku^fu]7$\U2+m>ZDC@HH^^YD_A9?,&AumSCs^CUoRFmg$G@`fsW$`0[sc:Ef)?U?h/i+]:Uq&KW_?ZO%eL*kH;,`0gqn %GjPO]i%gS8G^FEPEEsG62gLUF)>ehf:SS4AF.IC8[9^MNE8f,jjfXq:Kk\D`n,[M>Q]4Kc6FA72=Ha_2^UNSS^:pMXg?&S\9_4c@ %OI8(j3FpQ=2"AGE:80L\oRLg6iF#p:/aK%t?O-PL#\a:J5_A2I`KfoppoAImMpu=E-4(8'XKaGb&`*MX0m@R5KqYltN`,BXIcGfRXCaB_Rn'u/rYDdqiF$a;O`N@0%Mo;d %:"]7V)ijC=*rK!h>2E@^Nd+s`E9E^8`5PQ]E`$#MJ0BlHei$:^h>GtZ`hGZ+9:lL]%E7M1!QkIaKGjZ;(t[n$b$'.\fP'%/k&E]# %[`^pRU3#/AU"MN"&ApLgCZpllL82kDJEPJt2]H5ke:_TMm+4Qd*KLh,pncAV*T0[G$A6VH3;J5pJc/0s',P+\9JWDs0_QN?5M8;Y %'6Qb]kMuO,51C*N.N"C\5>k7l:k`dq-ntD57T=E2%cOG(YL/o5,C5IS:]`)MD'e0L?[r+HIS?:uZWG!fZA(Rm`V=POKr"kWm.+0p %2EW^ja;m<0B(s+u-b?o`-j8'?U%Z0AJ2>fEl>7S`1I-4O*g`\\HtKU)4A42'&MQV]RAVkaJ&7hC&Ia_Q^T?[2EIGLa_MLVuR4()J6TuseM+ItlkaQN(Eog/_&7X[hE2Ji)YnQY54>OU$_([gX %6=,#S;9OPm)VJ6OV2K$*$IiXEO+%JjKGG+lXV"fOr+XOd^N:icOPI9M:cSVUL?2r=c).*-8cmohcalB*::/_5)tg!oQPHA<4)QlU %Pb5j_mokS%'"eM\n4_?b)XUuMDsDO,bWP>/T&d_L_W)PqnOiF4!G#P)Ba*9gVrYpe6E5SoGf'6%a3]SS0Yo>]rQ/L_Q<+chFWTic^7Uh1W]u3fHC-a/e]F]2VK5k,)BUS$c%Kl1BOt'gdB+S71TLE-?[;4\>Y:Cp/m@iSE^a%^9S'ekTnE %AugAQ]IK2qn.3'Kc`_)b$)_n"-Dd]\"V9]Or-ThbPo=G>c8Rnr#E=2@97aapB]>ZjX"Ysj55F='f<`7,36LBm\$)\V?'QK:"P+s> %S!Ofe;8j=r4o9CJr&pWo@YYKsM"9Z\;'KEHqD.c=o57^h&,:N*rh)6Tj#D[&tE$24SA73/ig6fH> %s,[md0q_WHTHQZ2*jfrC/=&2g$'fLD2*s#fl/I:=m'Ru5DgeBBBK;987>(Tn0tIX6fF]X4NK=JYq9^IJ&D<&jeqgknBuE+(*EKE+ %Um&q1^!t`O.Pn%7g5f0NRFJcgE$bZop8mHqV%G=L7?+bWk.NLR<&0bcPjp+biNrt5cP]Od#qb?XI=u*fmZUh,O$P)t$f]A'BFtau %=cg)+F[a*0@t&l&B1>'5i=u@-GS5N\:djmKmW44TAP[ZZ,c>WGaH']Q0Z3t[/qs>J8L-(Z36@%[)k!8Xdjm1D\ok(^:rkO)lIU1N %;[_sHqVVFU6A'FaHa:FJ:?XS^gf5=g;uK$BcD5CdH"Xl(_S'6Jd5)A4H0PSmCHe^E8X\$S<$!Xm2o^U%W&FHVrf.1TbaW5iM\O@p %XCtujWV($;Lnn^8AC`[QDbE@dNW]2L`5397Ld8IqI#N]!k^QpXN8)Uk30]@'uOl,lL+5]/GbH:]j:K6kq'(JPo9]nmc;nVG@Y3mUE^K::D#!0X"j![BjBTXRH[H69G@Ci=*JX>YaqgXFRt]_4e9t %:L!p6J2$M@+cc6'#>ggMCW_lhdl!rQF%ohG582H''RnB9=FbX]L@!!%r!\XX`j_*>hnP_doo[CI`&enBQRY %dN[?$)2Km7D/]mD5#*L9==!=Z%l=Z'IGZ_[*O7s.Vr6J@$An\lhfH,/W`*t#2Zo`G%_+k3pb<='GZc7Zek`\e2aoK@`%;i.:/(RB0Mk,Q57,D-mQ!)Q,LKQq?X)gEU2,pXJu'm_8mkm? %V,E3FGchaE]ElA'J[3>"';8Jig$69_Y=Gdu97bh1No#!rTh^A6"Z4S4'n3Jh:9(QX!'n<3\=O$BNX4?H+iJ*T'J<(92";il1Vu1q %$@H-d46d.]bPI)EZY/ASp+(gL=Nl:DG8HXs:a.VYKJY;S&8h?`ct9)3e[u8VY4tt6j%tGRLlAbNO8X+DY$X5\\$PJ5jB&i`'NeO#dVb[,c)P!EfJh.%I?dd3]uBH)2Mhn.\3AY %!UFNO0%kcMWag'WQIgT]$3q1d]n,($.tg.%(5HbX%lcpA^YipI8^$111W;$G2goCG\q5q^2I2Y)PCII2^gcFu.M6m2cjP?dO[F!gIK.LXK:Vsgt?]1gP92KEca3m`;$0b'#j;E %"7aAO6+k[.5;t))fnA>OnF?kL1r(q3$c'VP4N,a9_?p\0M$4o,eB,m)EOF3i>g%s9L#,\NX$Jp_GJ3n[cH-?JQr^>Cd-_#OO=-Ai %]4)pSqW"-5Ra14d!R_WDX+M\a`X@BWpG.QtE-:OVRMo+jK"W1K0&=.9Dr^6iY+.H*)N7/JOZ,\UR>1Z?G32Bd!6nq]FJTi;)6U>6g"A>-c`I)JNH8tnas%NfMA7c$epUH'l=7cSZ)DB'HZ=piTB_n[f'cb^;FMQIc9k\r^=\u)P6:f3+un!n"^n3^gie7`scMeOV7V&1H$r?I+[79JZ=g`K;( %f`ZbE-[.CT(aRB-]ffC19&i?ATF$aZQS8=CGF3F*3/I&+ijF#:32njUa"cO$6],S^0[n::Z^Vo6T\tCs`!_j3.ef7B9F8%5-$)TR %W3TMT>@!NYZEES.'J^o@I4[We4&'H:Whk(*0*8Poh'mRO/'rEikNb:>"SpS@b<"L!Zg..V1Ra^ba'_G]q(4l2?"]-$bbh)U_k9u? %Xb[s1lVr[1V/6p]\&G`AH;XnOU>ci0ZVQU/GO%bp/A)_RG"pf:O12Tq?6:O-fq@la\hY1iZJf(0c %^cd>urK!*!PTgSY6Ijg_XEq-Jr!:/7,Kf]?J&&B]>&\O/Hk5JupIp$.l!fA@RlN/q(0'Z\UNU:ZlCutVF8G_rQ4Q-)3ntr5`LIm24'VNQ5WVm%u?8S"pm^F">nJL(SI8,_b88n'=2FV4`EWl5Sg]Y,%8q5#Dg_XRK\o'B33m"4BW":-@`29,>N*tG7"c7 %@$(8]N1,jk7QKm1'/P!6Lb[Bt&:em9T4k[\VMC=0?LIo:#263Yqo04LOgp`:YljUE'eG_1?4*h))Ko2>$+mjbfu\$h608=3!7+*? %?2g&3$B6IF7L1Xji+jmEYroG5aA@0@dajdq'UeCjprTd]PG?3&7@gO %r6lVCYgYo*k!GI7'!U%MZ""S@or*;7HnD(.8t[dhN$O2D*DW2PpUC^Q;kO]5UZ!^s2In]hTk?+>V(i %Q"7l_%#@>/#]A%0g_K3`VkA[GQc3E1QFQ_+M\;\u)>b4o:Ea+m:]kCY(uRFGjKotQAmpFHPH*PDLHVA_+k23ZT$IGrk_@c564fuH %+p*37@iAtC\ie8eKhiL[$(:F7,R8[J6SsONW5UT''\P3M+=DG_rA[,^D,om'4K\JZB*/:.c@GkJ&>Wp0L"?8n+r`.8X'K;JM(UKT %[77q?E!N*JK+KY2L-Ta?EDjNSqpL>6F&oo.$rf="n7J/BT[1(bCEWnC%,43h;.t+UKd_Vib`>]?a9Q@^=;Sh\Xp.QGIjD!%T^A.1 %^aWG\8/LP=h5>#H2$P#4!>I?nKohObc5c;h]"1n;[7[UnlXmG1J2l#*l"=!#kY-Q.,/jeLSc9`IgKb]4e%s.)?Y@NmXp,YOQ_N>j %>4!SkNkN&hk+#5VQpE5d8llTT):iGNb20"ea31+s=NV0[EPrtQ:CUlpg-OK?17?EO+3MF19b$m4ArRHZ%RAUTXeADX>c]/!aVp$0 %;`W8XP,^inl6on[P^f)eSjRq7Ks3J]Alb=5,W3!dP%<2lq';%\S22`(?(>L?`YMrM(ZM6)F;4P_-Aef/8]c>s$PUBVTQse5"i#lJ %24@".D>_2i(2:fm)<(U#?T8J0L)>i,XCer!ckpTlBrk");Vp%$KH=HL2F,Lj`2"BAg)?FD4Ar%UQ[YtK@$nE&_gF9O,_+$5jI+o; %M-4HGG>n"8IU)/UqM28t>Ld)cU]q/KVqRHQPZ@QXI`>9Q8*eZB4Th?U5JipQBks-.>CIXQ"7+; %:!@F7(=j)q9$#$@kM*GFA%%1edK]q4KG2G-!Vc]/IS$@PZ(ap/O!kN%G-H4UL?cOWg,#ClG2[$Cl0*FXDtcVPBl6Pmbro+Te>Cqd%k7t`ho)FfC[t)td7?Ofc=ERUTYpa#=0gPZ>7J9!/J;)u;EX:M3YE%0g8=V:/.?-7OH %F*4d_aD$kbVe^OJfRY%;N/:(L_r#"(W_pE,@d0YEM[!G8d5#m0L"2k.QZ0&_#[ah_8jp`eR)G*i9g,6G4b#\]X9tsEA,L(La64t& %NhkV4-Goj%XmL7`\ejs"X^di*:QDGOIs$r8V]W_\XQ\%5j$5=q%^'XNN_ikX_X?t4M7r`;rrsl4L^N\dSZ9P0`=6MPr,>124D_J) %ag5[/c?n$&"s4D/GB5ZW4siBqAP&+@HNp7dAsoG*a@?NpXZmdi=\rGnPlMh1W@(]%]IXQSqktAfcgLRF*i`IJQ"+A79\/fT%3%W9 %JgGqgJ'\:fe13UhbTC+;>-=M][A+T;RJ*/0Qa!&OL9f]",\g"@QU\<2&"CU\e<7;`up>0eA %iRpgXkM,F__:&WcFo-UJ?r&K6BPgck8e)EMb"upq5PS_nfANm'6m!rDWM?UM*pD6'%6-3kS!rj(cBHn!KgHTTaeYruEM^?1jIa]& %l;.fE'L>sYq^";IVeHSUl$EWRg=3Q1[!G8#/R]m.(IcA+$55ldDK:hU/m?s/2,4qdS@-B%.EsuO;cHUW5!j#3jiWFg$K!7-&$B\s %ma`Ob5]LJQ[7$QMo4+\9Z?kM@f'ZZuVcHT"9\X]l=*(pT8leWbn3#aUI0uoEhSbZ28TF$Kn&r1\AT@>(C'Oa0(i;*>MOl(,pI)/) %k-^F![CM/<3")Cu:LF]HGo\C4XH]J_KK?NT*`H:qFSjic.t`'7-FN=oU&iBV!%t0WM^?6$dCDN+El`$MYV.aM0X&,/=.#&liqglt %8lUsGP30:!nYM@;2IW\#$K0UZatC#,"fC!SIHF&-8Y)k0>KFf6E6`?r'G;+%e^[Q_@3j[K(ECSt'd:H#_m&&3FXhgU;@\/d!2!C/ %/"AG+&=?T&nNVpK7e7$o%Yo^$i@lVZ+i)W62YVHIAnd`+LY_X6FGrR?d:Q!%:aU#A&p$Cj4h;I[oVmuD[&t9feFs2;]YLVpibYs_ %*MC'5"gkVlJT[?@BAE4dnq'NqQA!W\AtYAg6>R57F0CX$`e>_ED;.AZ/4DGQg(!W/EigE@X41@S!u[4EIrgfjhaeU9O&p8uKE0sNPDR[PS)9ugB:4%kn!&/FG_YSj^IO[)C`XFiFO29Knum%Y&4ei4Y'5XpX7 %`jf4]:<.(H1I@bA?W!@pnoS5,:,ZR#L6O)Wn0:+ %V(k9ZDC,DM8lNFg.M,rQlInXK,!;b2>6KoA.s\^V5qJR<+IocO1*)!J20Q3Qh\i50K8u?1a/_aQW?o_%g6qf=+TgVK@_@h?6PGGO %XC\55cGn,c1,g^!]&6sg4;6&adr5G0q5GCIbMS%M%2=r:T %GmjWYqL9fq!"8(Q-;GHL.a@_+"I:[b]S?`J_Zf$H&()rj-IG0Gb/X,EVHtKoF\fFPo6)G-joX"j.N5;/]1c/NuWIIR=ql@R-#f;o'8C!N_.[63T%. %o(AOlGY\DhHEJ4`cln;igNe7;>bO2UC:XZr3>",S?9'>B>Rf28'HFf_a.e$Uf-Y)#>]um=s_P%f0^+3HY#fn/'c. %Fq2Un_3,cbS9/kCMAjL$Y95='Kr(eeoa94bMl"]PX?Lh3nb6/r$*H.$!4]sf*CM#>pc>KDd*AB@H+PFOPphDIoDYSWEmcp0;3P2_ %Q2ZUK(OI#4lKs7#;WEe'589RlPZEJ@&iThX3jse$Ak=I>=gjR7I)(?J$^\;8E<*s@pF-DXt^%UeE\5Fn%54VM:_[^T3\0dl?`qugrj$c(U[HbE9c+U."RqBOB"',8"=co`L'ac=Cn1^:fmGnrs %6O8N?8a\V&JL',L15!K/D1uq-0,p9kr:PC1-A#SL!.VV0q8rmo]BQN3kTpQ8Xs:,rhI+$(M3Lm+G%ORK5fM8+>M+6:'GIfXV+g7a(,6YOBaCa:"<7>\'-d)'Xt.]J3sM\2=fnZH'&K*)8*-HQ6I7?20b`^`^$8OsK0dPX#Y.%No-QtV %*BM.)PltiKE[M'`;5VpR:+#UgKL4]s^JBO5G&O5Bl7OaXh?'n!_:R25/Ql)7a#Re$S/Mf_eoPh3"_m:"[]@'":'nk\3V@/^]G+?j %43Y8Y-3Z;\o0VtILQcC+$%JNLEYB47iHbEYU4Te"2m&gCQrR3lf)cGT/#V.IHeCi,b_2X#,G;P^Q;h:#K*F:W69 %k8@VBGk+TE9B1o`;M]K@2:npg6TE6CgMQ24+So(dcEk_%&u+)A3@sRIB$DmQc3V3]1scgIDkSZ[L]U>8"T[?*&l6paX/D8E;po50 %/f*hj=a$Io[?NNk[r,8RbEl,\70[r>"j,VfaZD41aJOmWk,8Q5HfZg4+.IECZFglJQ.Z/"b!j-9'*:=%6>OPJ(Fk-Aj/<3:Q_T&i %#A6_JHrdOJQWK&Q4VPsEk@$a'32?Mr-$(t*\YPYOgld]T*)HesE)(OV=?NCk8]@6[JIj/9]'^++4l#TVN.F9J$id$f5JgB&Y=RSY %?\_S!O\fGu+bqZ;RS5n/jJ'nHfCI5(L1H!s:*DCEB!gRD(S(91X\BDEF+]lWeFE1[1aL(,;_n94Bgf]O%:HZP5pk_TNNB]@8@Ll\h+ %L`dj8.^\=1)6'\Y+pBJ!LcQn3=rbjp]`,"H^1>=?N&+63N'lsb2QC06A/N`-[iXuXIl4ts&36DIOX2]F=:KY_NQgdsO!;bO:V9XCcuf"4p=23>/``is35?Z^Gb-Nd@J4RRE]EaA?"@gZbY2<"b&P0Oe7;#uiVP(f=X@JRO6J%67:,)4PV/+YJ3G %K7=-`(gfr9P(bL?C_:]>%'K<,5mrA'pSg#iVS^Oj1m?8,]1=FamQJTJ=>A9$V$0s,Z`0`M-8MjrpQWIXuga8o>:s.cQ^OV6X+'M'^_g %Jc#Cr7D`fOcmW`[&p_0>PN^2F+8j\ofBccUZgFeEC1@[t$I():O$dZIiX7L![+K`:1=jn31";C0kGJ\Nh'm98ZM'INPP)^Z-In1? %^EHCo+0AP?Me^]'WdtaSW102B_upD6q[)1>O\>E]L3L:ENme"]TGCUW4A1IeTd8r,/ts+!]56C.MEL6d#%/0iBi_pGITaG@-N2FU %4BO29Fl0]e.q%Vt_k2m`Sd)2[GK1$:Rf_tOpODY[>4;%#I0^tDR8Nt]/R4NGQOgh=1< %,TTtA#!8j\`=c#BTl55V>*p-KBU45G-D]fq=63bQ65k^I3t.O_>N[D*5k^3hn7RsT22XYK,!mb0']!],;K3%uo8P=-*fZ=aDD/.U?1"b:9\#;@SU`Hg?GV_o*[&EZ\R8JE(1X2c:*q&8;jG %6pX=CEPSaSBs\7h\WA@$)B$i&;>JF+(VoVB!eqHXA&t&l^gSVl$?otsH(:,S/p,A`4HK[IMoS_i&0T!?^`k;-]r]Sm5*gRV4X`DC %fZGc2%'DcL`ln3idZ,=U3]>FI0euMPaXQOnG%aa9.&&2g9If!T$_ZR8Cp2IVd"&>9c20gkCQZ^_&uHl7Zm4\W]U&i+np(,Pj^sN97FhHaoP&+!]Y-^p[iP])B\ZMBnJH4g$rjL8erX.V[nS$OR?T9o.a(AmDdqQ]Yf2DmbC2X9*'H!o0'4o!BiYL>Hka/-\lES!2,EU_0S1E3.5Sg*1b_OZYEH&=N3TpIKkJJiKfFFb0C8oVi\3Dk`u"/c(- %>cgq)"IuN%i&!.],SVEe7-Y]>#@b>5Tf+D\1+S/G%Zd]r2?U*ELeD!N2XFiE;AUNf0eQk@S"XB2knUBDsVO)ekYF,PNKn_H?Csdt+qjj*+FHm`3N6snV/NDrJ1*T_CX@@SZ#[MjB4#VP;b1_fQ?Y.)(20OelgT"$l %R;6,?ad:.EgU%!mkIg;[EbR+CcR%.OUO<_PE#h+\d/J][OiAiaEj'u6+ZT#!c[O?J?N8.EE@&tk#_jD(QeZhH]q1+hW %^+Y6T\Vg=Kk(=r2@RW&!'Cb]GF9[a_.A2^SA))1+<(J3*HZk3u$C[XpEM;b-P-FLG43#?n/W?JdB1I1r?l`J&4'p9a)]0Y0WsL$j %0AV+..I,tO?Q-JcCiB63bmA?gZa@\&)ESLN/skRqIVEX1Bq6Z(hbW;R$W=b$G7+`"(g4(kR`QChOoqTQ23Et0a:POrbS"qQVbB(h %kE^6+''HsGJdN[]M-JnV5M*GH:&uD7]c(ON&d>[6=LMIWCQ0QW*j_2BF`dj(DA/6:/pZu.UcRkU(\"Unou0PK^^3't-ma=5)b %#7'SYpPRQRN-i_3iZ7'^%m%SQZr]PQgfJg6]kjY<*00jBFet\K1&=mUF/dlSC&XYB_.W+eikc=E3;l>\e^IFHOs(lB"]mk\U)Qq6LN@J\-*RFid5$)b\dU+c09S]bIh`:bGh/oLP>._&Y %([*kC@/c]AQ.5*Z3+nO$)rkVaqrAKNXJiuGJ5ceM^Db8hfTS@+%SugiTmT96!8n_d@Iu.5A4ngMi# %ASEb\KgO6\XfSI&,qAE*@DWa>.['gIUu@9WajH^C$&'#8f0 %Aeu-)%a[m)51@k=Hb0Pdl&b?`4c1nhhiT2\8PZF)'fJO/Tcl>7s9[m'"57EDRWRK.-Eb:kh#o%Q1I!*no49o"(K^Y %D'c0N;`_2IM^sr6m$2[i-dpc`/!%rWgs:H-kbf2k2is\@) %&7W/BWk>o^$sNm#!8!8ZQg+e$'5:gEn+Z&,#?l7e,/il+`hJ'uX&4B_9Z?qE#p"gtV`T2hQ#K!aLrF';m43Z5DKb:^-G9&@t% %]C""ah8r=#*R\bErL/\Q@FCiWMeI'q^9n6+BToq"@,]//kF-4b#kOFl4^+i,He'VJIXN52>k.0`@^[;Bi[mKTGh]qU,>B#`IHn#E9.SA2^FB*Y %(YD='mFdUpr(6FH1>nm#LudnYAaAislq7X?EFROuaK6,NEeEB=qgX)VQ@Je`eqhk6K0hZ[LA?LiE/lA3YQZ%R/s74\5r?hJRc+_i(r5sB%FiI/T[t1XlVMNWg)MJnUq5fD;b2K8%GEtde`&- %D#G_4Z_Akn$B(6Xf)a<*Vllf65ZHC&)"'a7[(b[FHu&K:XR5-an+=uZ$q.Yj`%$9amR0W!W$fW3EAV1GEc!;I)'D@3$fFVipY\qX %=)/L?g'U9-^Ln[<.DfMAeTK,qT%=LgOj]DEW$$cUQa'0WP'ae.0H*96BL(CT7,oiG8or[PqX6oXEM[A]I)nclYk::L^T]Cu4,+e< %*1@VY4I>RO@N;S#EHZr^$"2XA=m]d"Go;'&d5[u?Bj"QS;oEg%33,Dkkt^6219n9N8s<#HMXGG^5q&!N.ID(&jn[Vf,P!%nIDBnj %g`)Zr7g4fDcSAV;mR!^X3RiQB/hEpcCu*TRQl@bZ\1@e[![$-q]8?L?-QiskTmVP"&1SJ&\c-aJY0ELE[3&W"B&e>,I#NR--E..* %I]R3"W)h?EOYOKhf#-O@>`lUPGKG3JMoces$h"EENbIA?GqN+B[IQ8Gk8>q&UEg$?^^diU2;j^dNOIb:F#QS29VVj8k,EH4X.pZ' %;Y[$=V&ERQZKeO/R^H<^+q+^,no\>iT$o96"[$Ca3M-jMT6Fp(g!cGlOsdAYBL>Bp/hXK]GYZ=3@_Tm\#3FcGonWG=!FDK7,$eEsG%.%NG %Rdm[c%(4pWAY?taNa,F4U>R&qKOrceWTd#E>KV?$Qc[dh %Og^^5nr!-p#"aHtR/Bcgrj&f.(:D?&H&!tuOc%qIe?`1$]10Cg@YX4B"/L'b"I]+P:25sr.&MI.V(,BBZjoddKZK$jRB1A=d)1M4!,6k`Y+t\BH,S,GC!2IQ3t3ZP7_@e:Zn3UX)q"*3@B>AU(VdN-O_0uXQGF2l-cKiRWKAF7]IJ2N*nl,glLT"?ThZ#96ibTKY+4:;H&,J+E_XQQWgcG?Nm_]ZJ-*+$,)b&W4`6jS %"[a1?+d29>X^GN,LoZ#@7o5=clg(1EBYpp%G$)@"Ur)VGHiqKB`Je)XEQB73%8@Ai2?iu2Fep;rr>9XFu&R4kVGX_Nm %KYgb-j^R9HBOnFi+qC5;,d8Y-MNl!r4-eX/_H81p@:(j`)W1VPLEX]M@:q*kgFQcs?c=ZbZ[DfP^[g&^R/3;=A\]"GnpUF_l%S5e %SlMMG@B+"V*J8SSSPgf)1_sd*\o9r[&k7k>'"_c@%a$9XDep+=]o,F1Z>3hA<>j!Y]K0[`UR&p2s"%" %8R,K\,7u023>H9&GYt#FTF,;>%l\7:MUuDB_=FSZ@i+*4Z_^9<*#q_gbalZLl&4WSp`Hh#"7`qf@cfK:VL+S*:Fi&sV/`5n\VY]O %8(?[FmNrVj9SD;7-'3?g%u5#bG';?)ag>]F6U$M?/5/ui'NE//nmf!ifM1N:]a?n& %Q-'SER!R*sidKPC-QM$;8:lWTmh%pD#BUY;Iu`@8:h6`06i1YSW.+bue)cUqW's@rXpDoqX@Y)=X_;hm%_QPZ?:"&!t=Fi\_lni[cf,6[q;ajs;JMC'a]W3#gfg %o4mH@ml %lkg[EPX$l/#38JdE?3V8)j\=oV^Hq3@Mh$M@,2oSqDsF4H"s3TB%Bcp^QVq["XTa9,/2H=?&fF2rCO4AR5OAJFeg1/J+Hgm^icAK!%.8:j1lUAE1_oS&]mX9`n;!k7u4Na0'0qp`OC;.#EZQ-Vt.)Z %MJ@M[O0a])m\%R-K,Bl]<[+'dl)P1M65!R4UApCq-op8"nZ3PGYJgXKR;"<#!`\"+Yn!aJh*`-kn\nO#B!W#G=lO-LpL.;h-ClC8FTl;okJ_^6>/O5 %+_EQ"bl%&]5*96I6B0i=12bASUJ[Kf-uo_?,@Zii\;ta1jGl@.MZ@-uR`0=',?bs>tFX:9a526kL26U26^c)b$Y%ZNp%F@CF]#C56r.M@(b:k?qaFI).*b-f]T%B:O;^rMHK %_M6sg5%9H=W*C5EF#E5kS\@Ecq9jB?PQ!YXCakN'ORZM\f'\iH;Tn0&4;O*>6C,rcFZj#8l!-[%D&:(S=e_rUi?m:-Y@G"64SH$J %C1d.o\O=PKP;A&D^Qq3P%s)Lg3o)-t/-37cP9_];[-?1L%=B'%.&TXTW %WqiKtJEiQ)@bpl'?9G6)nlT=j`2HC1.$pcNCd4m"2`P;3DV<0*"U`B]>c*.l8/Ts`42f7QYOIdK3O-bY4/S"S'1"Zg]Nj?-tE::mWYYUARb+*?2PCV%A(0Oe?Zb(h?O?Igug\H!>Q$#e]#rW6r5ss7J.h>(G=e,gn61tM!o#aF)H"L?-@a6<((^*bl %6K]#Y4,(l$KHMlC,%S=q5!-2GHHCHR2!:.`!ZFS((gV/kb_tl`"Pm'W@hKaGLAg'erHc05E/^XScPl)g-cLkl)d8%*&*_d[We/b= %GCPpkkd=Ii5-*(+G-s[aE73cQqdj`,J+7`467lU[0pnlb->%,KH0Pll;_Wk4[5SJQ&9iu&@`DsKS4)Ug7HUED.[CKmks/nphLllt %7Lm_(0p-S_i@k()iEBt.EOFZ/36aRmQMtHg1.O10')5VJ?MD:bEu:7i)!Q$'8]K:8dJGjM.o*RSt[JZgi/.@?#+qjM?EeA(6*(8B3BRA:?IW3 %D0&0W*KlTLPN#/+:[3mn5Y,EHhLN%;l-@/W*@JD;Sh2K^_.69X)P"Z[KbZJ[FTB"VZNIH^JWH2es!qG4.RHV-A.pSs7*]u^M;CbJ %_V8\m^9gmmZj.d$YR2/<-ca1/^I)0@o`k4S/E5>SO`>,q,e2"qURdKHaP3`U*9o(L[qIAk3)3eCq#4[+!):l@Cb&sB+G %_bXm,`6&Dl?35^39LY2!>L?+klIJ%=8p9,2&Z22h42r?9+L;E=?V!ooI`2'G?3@e';eL+3p<@?5&f$AoZU#qH%HS1:N'%IBO[dRlq\ln6\='qrgW$HOW6]WLaeWC'k!#8Q6&1\\IRd'Y2a(SqTsr %8L03>Je("='HE/b05*k"#!fO2Yh`!uE8MPnV'N;"iPpSUBnDMBcFiUhOG>6q]*Zg7(JeT`/c"a>6b[;#YuR7Zr\B2[ON`lA7s48r %5&kLma\VJHSt\QWhQ!I1\"PrmM'8%&O)bg`OUg=uJB(\B7bi0-$<:MU!H/7%TITefC)Ktcl-6+[SORa)&.&p./,?W'JOh`t!KdfEYn[/T:&N`@L7[ %/QMahAdsWT8eA^afO*QfC:_,4B\L1`Hcbqr_F!0+LZ+T&2'r[$'Q4X;L8-^%`CgGblI=`._h-gG!@K8F-<=++iDTeg'5P+u+mRdG %b/YXJgEoZH-"SL@flm5n]/-^He-(.IBkWgikojpfI3IGHg %*r5`/f@f,E<*Q3*4N4;$64!@%]:?SMf?T9#9Z(LIOW6EA@Bu=,:td+]:sAqeb*+Ff96286W1bBRs4+USpAGtf_oGe%AGcaRNA0Wc %K_g\S(FN'`m]J&O>q):R9=eS;_J'D!P6. %@_fZ$FoB[g(53[>$$nB]k+4Z\1=N.7E6kO1>be$(#VWLJIV#[GTmTucq'S3gG[uX:8I1aJ"U%B'b,@kAnpX8[b4(SN1+>+],,G,] %aCdS-L`Zkkjk5QkSdYl6/.i8d82l3W`;0k23?rX6A^B)Eb2AN5.'(_Un36I<6Y\5:9'pR/B'Kb@X%\C"S)\&J1J&`sV7rF,0OA]J %X'aflni^5KiB%\`cr5,;"t$["*+Q!3$+$46Xk5,?l:b'1Qjo/',p-URbc?.=\H+A`;3UAFF+o.Y0-;q+S:k]S)+U:R^KS,TK+ZJ[\R*-ISb7L\HKX`S%4:=/9ESeK% %$H@ee5m#YN@A:@K5scf78[N,\FLud/F8.rP.VX]r&0-,A#F/9jdTBf_GN29k2P(^^b'1?sqj&J680\sCeMBg&2XCI(`hJ?&eptoD %HRoXnD#LsU6/TiEYE8qV_`;-*&=mjBS=NrFGPJi)&,R8$Z6!,[tg'#=,iG(2S^;Xk[EPE3G%MZs3:=io3l!uA>MkOBA-D; %E^,*P)?_Z %VS$08^M(#ifj>CiY:;i6Gd)'[QM)%tC+h=M8l0Pim:BAMh9igCKq3I*_\.;r#,&]DhM%Ra03+s1?7rk4<'H*E+$EnPhUXgPD&k)` %LJY]D>4-V5i\LK@[M4p__I`?7LBkoI?8#[p*U,%58tq61gU %'q@1J)HD.J7o`s2<^%7k?b6]Jmj_V+*,PXH.CAVD9=&K;^F\0cY:oTVIE#=887\8oO)`o%Ac'.4l_jT;F3B0BMsa1&>MR('>,W,A %-$T3Rrpd]7lG/ff+r?./Hr>ZXjElMMJi1AD709j3*,HlnKrD*sN2l+OSN3j:>,c7P=U]TGpYT4QbC]i) %d)Z#QnC=;Q!aGduHr@&=N!RP[6qF:C>nS7p.3^C9'!R"=#Hb=6*f,GFt,HLA.ur\Z,RWjT(e,1ice"edPdGp:I6W`'Rjnc>tII=b>6gKWOBWgGnX_*Sjg60Yo8>HpZ%nlJq.J %>Ki!O0#nN0Hn4?+R)a]MA8qAZUPh%k_qG>6A\PbZF5d9d^;aAuA(=Bm>DM-O^ %:cef2cLXO:R*6qrE&Oi$32lAb7S0-#7E/ucJ8d$@I]-9C;NbW0pSma=lC>m:Il\Eo\a]M@f](NF%5^#'Z,qnneU9erS?IEfl8qrQRht4@jup %-9E$,W2H8F$o$po'X:i5kLbM!em_ %/VbX@5`(tsB$$HE/dggb-*bBW\WWs=X`ALW,-Soc%7659HL^=-+PH6b7C<.hBi?mR?<*KN*dO=\e0Ok/eF %)ApN6OU9*7p#ZY'mF2F#Z"dE4S]*hOiOom"h@7D1rq(DaqX=FFs1&'SJ+M9Ar)`p_TDtO5s1eQFs88Mhks,,(K`C>0ric@kf.Z.` %rpTj_f73Pj:]L3Z97M<,^QniX:[,?C!Erg,kJoCG3B\)dSb\,YpgJ,ZA/O8o(hrKlEqDu]EIs82hYIeuW^npg8&H`(@;VgV%e %NMtk'<2hGjuARKiT\G:o/6WJe:J9G"JqV %XUC3K$od&Nf@6;XEg/K(oBc$>KAU+jVj/.JiNA'=p'Lo:SRL58d?U'im(\8cAN'!2'3a5$R[qh=Yn0qU[[aR,Dcd3k`21? %2]m"Qlta62YZc/o+o>9S^.OfA@]iJ38b`>d$#p^OKW@`f&@Y.&C8KB)ARo^)VKoM%\%S-D5"RrN'fj=hZg!m[No>9N %f?)E+T[EIrPPY[ho?/cA^F?6,1O/aU`Fr*e!j-[`#$e[V$M%H0C5[T$K5]HIK*(`4_#"1oDG?CdDH[d&qIb.LeAt,L'JqeFAS+V!dCsW %B-qUg?ln1;mH!4HE0XX+9Z3Eg_te+=-K91b"QA6[m.C)-$e]$%S"rlPq82;? %cdtL<:oXG(meNmod2qVT2puoB>!af'hS+pr^X04ob_&RRa%IX>En\Jj\[Jg1N8TP,ls2!!eHSprK3=91>8sL18,;6hRQK^Hi[O:j %<+hc6X43qZQmGf5e%fEq'%\C&26h6mO==A3_2i\Ea^&6Qs8IRH<8`RNHn@Q]AB#]i/jOLM3It-h1sQG2/H))_.?VMZl_qp@9/o]L %\[+EK*0iZXg8(m"^\r\T3m(;%_cE:i"n=#0QkQZRN'jqdK0&XhR/.V%b.`jJBs-2G%% %`L5'3C9?aI0,iM0'*P-mrh'LW`Pg'1H+r2ro,7IjSeu\WA^>^WNBCURurh[fA/5VbB*_IXV0LUQ6[Z0 %:`bjd^*FuqXnRA.&u`8*=`/Z*GZAe#0);*QFl;o94Xk@kZ;cpDEQKV3_S'NM9H2KWbdol=a^_AaoGW/R4TejKR$bYd[%9A.GId2M %9+O&gc10@2HiRqpH)m2Z_+oS)H`uY)j?Z]tqf:+n5sJn?\fS6P(i)'dro26)]QBdBI#-[7p"$u@r+>r=[+kZZ>l^JEj0_qMB@mA? %0e2%H!'=$4K0d_-_X"eTr%>)GoqiOlOgF8DFp.K=Ocp&tFo=Y)e&@IBd`@49[%WYo6h)*/#>p"W\iFW8^)Cp,pEk:#DhPWH"..!h %m?-fN3-EU[X<,c>%u?idL6r-U9Sdr/,OE5#^U-XAI$R./8(uiJ`JD>'^h\Eb9HBj_o,C$OP$KJdf6.ZbbALV8ieZV4@sCkDZE-a> %EEFXOB1+ln@oqa]Q49,T'>K%bFO&JVA5-8%V+;5_70N9MR`F031%X%9!;-*gkK=\Sm/\HkQSCC-pabp])cJ6YPGT=$@nL#95U@dIHJ@l0_Ut&&AMYOlBpWT8 %.FbMr&+]C]1a#VOV%;0S8b1J68]s"_F*N$n]SoZ]9VDHp,T647P_Vd%W?)M6:F9(=)KuA$\-)Y?,+N:7LY!UFe36+h^P_-?p__;0 %n[B\U3K*COKS^blXHHi>Y.2JS8Ap0]"Sm=7ppC>H[Di*h9Bm,c^Nj!0BDu="A"]9pk.(Dub1iT/kmC6/#iD\ac.F'2S.UrI#:-uglS/Du@mVdSuo%=@V0l&X1XY]jd'S/CCKp[>Vf3u-Tl"j:D %-Vu6=*[P;EG#dc4>)\O%PPY:=(UbVZQ9dR?f@N#OoKTD?[qXqPF5o@]QllPATcHc`_qM`.`/0GEjL1@GVj%6]f\i %d@?T-;AQf1*hsFm1bBeQGmq %=HW!TKJ\SiF5uC.:)/:KHR)]^"*T"\0RU5=dUk1pftFuP&("hUgi+)8Ih/-7"_,O`LlW4da[mpnTWLYS-)it&]tn_sQrMMYN5?4( %a2:J4W2X,;@:J@=3M)1/,7,O+F&Z_&dI'urCU;O$WAj-qgJdP\#Z1A'r1H7\:0,-?m5d+?2Msk;OZ,P`"!SW/4^DN=]nH"d&\Z.3;;-6oI %ohjfI(O9>,*3]J?BoOra+4c%,\\8EW7>ip")?G44Ut+3E?lSK6=dDcDIsBKRZjOO\;+\Xi)IbpI$=Jb]XLu&"?-!,0ld2Z\="8u@ %E66elL0l1!HJ&&<1eqRe3&:RfJ9n5r%]GUB8:?,#Eqi,gS,qU@E1C-4r%V5B:i%VTtE>(hhnBb17X#QcZ7#A=\kj7N&q:;0[:(o*A%%E7q&mH*6KFq %b^$(0Y$XS$@gO.+%m@lEi3.tDDHKc*8Y[d,Q5N0'c"C/dF_hp[/OFn0ClOq]OL^esdI.jUk=Apc,EgN[_9m1XEJl?%kC[j6AXtjK %Ut]a"@kI6p8VY%MFXJJk'2IY-]kLg'bER4n?YuR">JniWJ2*-^uMp2OMgEgcFgpd'ZX+73"(eW6_0>O7KYBd6J]k%A5P`(O<$iiakGdHnLr\:6I[hVc9\Y %/5?m45gI\h-aUcGORPl$E.qo'-]OO*+f9tE1q"/f %D7nPJh\7j8C-.1Yf.2Pmh2Cd2[7g)A\1Z`WpPKu=;^E((`JN1M]k6tE_5>g]5\\#j!4AZQ2"q_^2qNk96;j1Y1I'T*n-4"!3rjA5ElC`[c"5H/F:qI7-8jub7(dKi^6"O@iaE2&se%TZ&a6u$7h %b)6:!V^@5+4YK,.Ag>8g!T_kl"haT"i'eW":!_D1O^SU1h]ieuOGLJe3h"UH/nmMiNb[Q.h?@ta=@8+d`I!Y"54b2"Jp+XJMXNEu.4TQb]GXeIo[0rmpA4#,n<\bVp\bfP]EjEPY],]aElR%>AlV[:QZ#S5D!BN\k+6VUKpXB4bCp@$?Wk?o!# %S6b9uA]!i/c.7h$K^2'nhIt?&;Lif/"ZB?Xg.R#og`(h$^g4Q+8N9#*:eC#b;!XT3FPS.`,Q4#d>RJ0r86>Ih:5eG-/p!f33m;sW %L-(II]N8bPS#W$+8RFBk,LF60rN\&5WjFNsh0B\+E)LnZP[*#r=2FD]as#1oHO#!XpUCl+8OoVF?((N.Qd&r<(X-%-LOG>?XG=2_Y:K#(DaC[_4k:l0\(S.IkG6:JkpN&+Q:n$W^UXM/W-V.K-TE)=j\3rRFM6Dq*AnVf@jGQ:Do&4]mp3tf79M7]`RG_Xf %6;SR:5Bpb.)2V26]:HL[Oc0l7hE8Td>WI5p#C)P*T&5iF,kI1;R<57f=CZ`hbpWT7a3SKp6&+RHerkk7YaMr@UM;8HYUXkA3iqB5 %_ElNTgZG=k!7'_hMbt5^VP[s7c(_P?,LcaAZ2eW#:KsVl,_*]u\Hj'fZ.MQiikspP>.D %p/]WhR"Mp?*7[+&J;:F2!1a,faNEhnKRB7C'qImTOGfD-&'q!;Ce=0=_p7*)hIdmcZZE@%VW*u]GLV$e64p$a#Z$)Vb'"I9W@LR_a&knNYhoh16AKXTnoocIJcMZ/,FX.9Y6iY;@uu9(jK_oeR0aj %e-W8-H0$).mYKC?dc,-G,hQj+e1+95/s1HRb4=^oaE_%D&e:1eB"R!sruZUV\fBCCS;TQ3hdQLD_KHck\mNZgd`?J(*9\$0m-PfT %:+/@9-t3Q$ckq]eqWUf;jiaY.)Ot]6*&PI>6deZR>1L%3WliK-QX:Z'"pok21qM"Hjh@N9\p^e+c2`iEO;\!EE0sQH0^/ks8ZF59 %UBmb8YHT8a#L,2)%bpi_6t=L2."pPk)6MW#$#M7*-6eT_UlD>c9"/8(jY_r^l-[fKT,OU3.b@s2$h-GiLXh9.H"\I0Feb8;lqqi_3*n!(8eH.N1%[RI`6^(i&h%#o>p(ZP@XBF"6F,3WlEdo3;n0 %"R3i\4kC!Z,Y\'SOoGQhqN;_JHnV(cCHb6-3RLGm8q$j:4YBJ64#nn[PW %3NT]GCHG;FT'^t/a\TB-\:lP+Mn$eH!_Ft,Jf5TBgJREO<>::F"c,s?,fT/?)&pjBbI>Gl9'/&/[X\FQpkLPI32fr:KYVJN<>l\s %>Q%GulnaV>;9b8gSX'I6!:FBTp9RMSN`lspG3i6_WTW_;YVualZW+23hq)JP=^-$@0\j9Chsg%Rg1*kj-LSu'j48qG6-4V$J-$W7 %1sst\,1gV\KN#>qLQ?=# %f>R'<0;6`78)0ilS1Ycdb5A\^K+D!::aA!=J.kP==Bq[ZK-kjPQ!1%I&g$"Ftn5aD#r2MA$(&bB[na':k %'PWuds+^Q75bK-!*Y^N__8:AI'-qa=a"^1S^Y"o)tkKaZ1?joD*oo8g2,A%]@K0V@f6$& %N7&rX549#j&=UG&)sYXDM=`d9H'VFmACliiA`3CdE'5tE:0?.[J.49CU9tbSU!eg(+iqqE]bem6"t3NnX6H#*XjpFX:,aF":P9mb7TrZA,]qG>*lSuj-qF?Y>EOF]S45&upGmhO_bO^N)?]U=GM85sGPW0u(^??3nf@=c^s^CD+3[kdGP]4fhVJrT %6jBHe'5*u/TJVKV$aAWuV7XIoJ;m[B.94-q/p'rmf(&A6#md]6.tCQ!YI1Y@6`l,t*#!8lB3dfj;)QWV#?iLS1;gc)6U@.i5Dk#8 %oSqA'9/LJ#YYu@^@RTdoolUorVeD#)D*D2+_1%:U.nA;T)5F`'8>NqY:]ZQa8:,!fD5W"^^Jtj*eXeoJ7\D$ZWU5l!L`"_JC\heR %biUjpBF]/=(S=[<1G7)+0`W[HrGq8R`9bG&qKaZbZZJko6=an\YRq0 %4[#l^1WtmYG7I.G3la%j%>ajdZ(MT7[*\*$a^Pf-&W?bKas>_"Fb-o?.pN\_M%HL.mV.iYFUV)-TM&S`\L5pf!Dr)N6GkW=1Xm)ioJlOp9>*jI%VtgiaP9<[Y&V=0::QI677_]M@F;T4#csu]D+&_i`iGFd!>L)3ZPS$F^hPb-M^RF'n6k:L`W4-="b\9kf2FmkH8:M/EY$\J8Chj;SAT/6Ho#5& %XKhe9cp45Ae86^DO[b=$&/m1@k@H$Y%NV/-ZTPKumrZPnMB(CMjXbC]Ko %\6>%1VGO'4LU&J8qdGn'3Dg.,pl)ne[D5F779e1l&M&YP>#%BhYW0E,^+Z_WAdrQ)5j&.6o>r1WIG$aHVf4odQ&-U`qT12:*Cc+bV4`3!&SeI6"T76GNHF^irMf-oa?.jfTh8QKkr_SD7=_hic121=CVh.Zt@lgcrF$NY+\'Csg*2=cbZn+QW@!\O#-57uVcXtj,<@o%P1Wm7.L)7b9DLfj?&9YdPc]NO`Q]U"L?'rE$+.[8Og#\>IV=h9q+kqV %Lc"&o?HcaOXU\qZ+&UDsH^rc!7^gF8MI^!Jbm@'n/Bko!ZSR.5@\8Xj1]pFH`2%`%$4-AsZ_1L5I5^es$_U\EK4^/q3e^hr^++pK]F %"SYb%Mr"iLi+(TN_(7OQ`hN.ZjDkG2C;jidi@Htt+=7(KbnKRX?^jWgob]DU?(FZiiV\S\)SoQBFl^sq)oX9c`g'_lb)e"+NRGj`7MoQpXS=)QJ=gHHbrfVFk>YdrET@.`>LjBYj9Vm=R[3%k!(;Kb"_BFZH/&TJ.jnY# %Eon;V8\Brm$(9#E\@B:$\%6OV3j3-&*?QgeMFKgS;>=qt`ooqu@'o)`^bo>W^uWF&PI9X/#$M80cOrYBXY"U*a/ %7,FS-D"iUf[ij0O9:`l9h_CpEWR)V'X;\qo^_D;Cq1n;c6qcR)>/d29#qJ(k+`cTn]H.NT`%K9OWiHTF$Ij']!d`V8`Zp5UM7.n& %d:X8ik_BfO:S0F[Q%]/->/`9G)\TX^Vs.gsK[)7h8W)nDq*]XJdoNA44!k0(n_jU9TbJmM:fK(dtih9&&F#"L$OS[.@a$t$1@e07;,)VWh<>#cm*_Z0sYHHUXh?R-1@GWGN\ %^FWFR"qT?77qJl(N0'mC'X>6?KWG_mga--h\C"]&)4#aC+9*?.X[USSi!$\_'J[j71CN1$Zb(;L>qQD52//ea8I3?DjY.3XYRjI] %&S[32+pJ2m-b`QI@4%\bD(GEX>'I+r1=?</*3"i<.K`Bo%"<*;jJ6$)N%'1a>`)e=B:K\,$ZlZ>TIk2M+B=0W(6dT %pT^=sNt53[mmbmj(750dpaqcfJ-83h3!g&FU(mAbmNs1ra`).u[&>:;DJDIme+_h6AePVUr_Y(2N'cDHqM/C#L!WF_Q;q_%0cVq[ %VTrLk`)RA16UO9n;r+@OW>7qM0aGJEG=SH$[`f*mmK,1_!\1T1JDIjCmOIj$&J,jp$PMi(#Xq%!Torfa\/MNX)`.ZIB7O>_N9KE; %r(bod2DIorT!8/WA\5N/lWr`cN7&MNJ,$ms/)1n\Iba'Z'TUbaW-&p@5* %19s6#&K!F'639VKj$)7F9O]iSm]D9LS.G@DJ%dWk]uIH/)Y)ftNA2.54%_0?,8f@?`S?)#-Ac=e%`IDY]:2&4#*IgPUg['KET0q? %J48=I4M=btUs*(T[;5qrOGm*Y0l(IaA5,\RV9,mLr%3RO[L.A`h.9E0;Bi(juKg3'6a\3q*AA^E4 %J=3)@2+eT=1a5PIj-%`63!_]I2D\\hk.sk&C9esnl_b:EMl@Y$oLhLc^u>!+L/YcVZH!gTB-12EL>^Ano3XLaP?)102d-'*,d-Q(fHF %b3.ZiMIT"+3HiU<&Vec=4V_DeLP*B_BObV(,)a,t)4`#=l5:KS].GWXkkHR>R4!8_>6*g*LW)A,14YG\Z(PWTKVnLb4Lfu*%8ABU %@a%JYP53kG\NYcI^\8"Pm+LfdN+[cWk(9;f],?Ap6de%MPB-f5(m5D*\n`^\K[%@RaJEd"1*L:*$QP?bHe0`BhR]gfM@m35Z`ckT %QFhp)SD*2Wj65O=+\&Y`G#,.]cTm2=_$O:K.YEM)c#90c'MU1c.E^;EmgWkB-S<(qa%JV+?^F>/dF).L*1P`?GWm).ffh2C_V-?@)5sj0QLW0/uB[ %3fO%b@*csQo]Ba`1KPs6>AbK[*C?OZ\E-IrXs:IabI8Ap5dH,$9oK<;S7ZQ0^4c?q[#,ScD6cncg-.'`7_BaL[5-H+T"#nH8bE5k %:,-d31)uAseK/]MP-C0fp2pQr:qN8FDg/Rs95-G=AH.16DV3*K%Zm`>i/F&I9[G,!JJso/P]0?/5.HCc"RM^DT:4<^j@F+YkdfcCIa2N)+.D2*nl#:nfXkinq@Fd)_m>LR_4/<58"iN/2NqLu7?#79F= %)EKenQQR2cIoPDJ>-]4DUTSU.a]*uD-gb!)#Z%s\agc-m:>-:51!h2^TT*<`+i@#`DkFgtK>i0\nnjP\1u'B9T%0`u#b`N!YWM"M %JGdUp'TYp^M/g).@p@DN'L[d[8Ke$(6&q:T%g,;Hus#u1"ak#kcPm6c+)'G*%G-,Z`oLXO&h^d:!OSm6sT\3pi3\>t?s=pc]L'SiL0G]-SV&2Z(9UamcL/1eFL@mLAqQF`%/)dn(m:U3STd@+bD;V$Jh0ne@*69lr];f8Lmp>dB%?ms+=CZ^ln %J3H6o3<4SD!;r&oJH]tRp[hWl2+]]K[fNN9C=jm^5ZA/ennc&DlRBXFi]/A(+:*V'D@H[U`dn$)puDCVf.t=BShrJ\"YZ&kfVYrj %4hnWEm0teKI+3GhCR&16Sj$RG5oJI1!P/k[!WissPfi5'd(4JAcQft,URo8Q'3Cm'qum&ciVk>Q2CIG1K(1W$6>:OX(b`[`OKJLq %AqLt:\8ct+J.b-:aAm;3+>WD`QiUCO5X3hNC""\m4Dm$7`>_Q(91A-cH-[$ib@RVt6t!t@XP[P9,7%b5TaCSZ:_m52YI#=D)IcW" %H%mK$`ceI92F<]&WVU@oVP@,L-N0=Zg@cddPigD19ITOnJ` %QgeaqI^!F8qCDaU\::qbE/JoaA>1+3?IR;q):+2W3+W)afaS]'O@imnHK:*gnOT"^PR8!/B#l-%QU<9'VA6(\0=ta',f.O_-&N8Q %.[9SMhM.St')$%-&4kfTDg1bR@Q!T[*'eFLRpG[;S6BeXhbNlM.[MZT`MAhKhY %@EtPVQuI$On!h-##&[C*:8,`id$9D9&.*!Y(44I*Dai\GdW0&iQkjoY0[@rNR+*i]#u? %P@r=eP1U*cZlgqMLH'ceY^@'ecEM%QKM>?+0UkL+@lBM@4>Ej=ReF09@nSS0AQ8!T&<")XL,Y'9I4.^I=[MCoYF/%'FumlKb8oi; %krO/&'U-l\YcI"_RZluYu&7DJ9iV:=-q&+6bpP=KhUf3 %5>*0`L5+U4!f6o8WNL/*K[*A0+C8oMR[L^I6jPiT@Qk"DV02"^E'bc$@[6\h]3aA(*MBjJ %5rD]FKetdj!#2mC54;Y'og`5lsDM-=ps@6CMs>TVhjU0'c%n##RFQ %`TIl-1NO$S$"jC;H(h%3q[L%BX>Q]CCu^(@Q&q(J/#HI!N\nlD[HZ"oOqbo9GDi\<49:cL)ecJY*!eTM&pcB0C/NP5UD%WY2on<0 %E[3_I'7c#I3>Q*<+n!>-EMfH*4Ga([at(,e)2(s0H_<879a!m6[d0S459V639G^ %(N%o<$rE)fVDJiMfat2cj\2Ua6aUm=bT>[f:24tg/%_R(84,oV]tR$Njtn0N(cRkXZ#IaLDTu:)!-p+aM3g(I"14mTG-Z9!9Ju]T %kHuVA#9`sVL'TT6R#h::>*.jke]dPo&]P=RBoTEfnXSYD'URN_H/`5)3ET!dePI(\PQ`$A'SlMDj`!RBSUm>5-sl$RfS3)kra`.+ %@(?mTY_/JUdru'6PasfWe>:J9TMW&CJqPl3dH85=m$4i]89DiU0]154CL,Y42F@\,0F"2[Qc7UZ(-!8N)E/0p34Q"45XMde=Fo0+ %hN7JScF-r`?mY!0Ba#pN)4)<%g"QPbX.)DXjUWQ:c>:7/+Dc'.]q*%M'.A#2o@^(W'Od)ml()FrNg8JfXDMPjlPUA^1Y3u.bg'R% %i=$[p17W=*##do)BI9IGYe#!%6tEMmW.tVNAr@BP#5IT=/\qFKHt9):e&;cc1coIjSgEhPI,$N<3*0S_dSrsgIaQU4OhpHHC0:>AW$OchhUs@h>!`H`Y[4?t_u85ZLd1!/iO\:-k$Tft)UGq,>CaTICU=Y$1&-!b[0WfZ %6t3Q"MY26<@Bf*FYjR@Pl&4U=AH7H0i,,6UT,R)J9H(8aUA'Dl3tp)d!4:2EYnL7$HU0?=P8#LJ(*1KIV6ELc=C%@b@6_@(,u&Vq %iibWn__r<&/V7WmHmhlb$Ku4jf7os8OO2+21LK]Y/I+b3g0(tn63Ms()\eli %(3U))R#90hXF'grFBDdKL(W9>Mo.YoK9!Bo^t9H@9-uEsQ'5()#b/aAQhoD/0KR[[?CS2X$&$Q%"pfl67cl+Qr"E*)kgITV.)ShkfO/6aMtHg]o+S0SOb]YBKB&On^R9:=Hodf(H3h\Km@7C_Lgn-b3Vn@eu)fco/62Ub0l]A %Hq,^!"i#I++hFnbL8iI,q*cDNqO`oIP%4rW %\:ZAsI]ce!:3@J7M]>R%Ahjd1@Nh*)^3TX"JohjaN(;osl,_2""%DfAncStFC2u4\VG:[\Hl0;Y1&``k&.>6#KeO9ER^V"MGh?iU %)!Cg0mp6]oQ>C6));(^uLIMq2%n3'T2f`q$WJW8.$criN_iB1YhP8T=;2n(8D&&bB2&\q-pb+?"nZX'.ndW[BWW-36YUR3 %c*)jDmN$HUqUdAaN*o^im=6(LeN>Vm,Yl_Y"iM^`/QOp<+4QouQB>d+Wa`_#P;:q!'Au9#kU*"rC52"f %QBX&>_2.uXK:an2^84K?+k\p/,u)[!rUS[nC&!t0$=U%g1\Dtkr[i!4JT4s\'J+!DP((Uj2!c8%f1nDGU&#pm"e,a=3Rf+Wg@H)L %(qQCV6+pY+cs[W(8m*RY3"N['1;jF?P-(BcblO1?aP3$Xa&17/$nNDT`47F3l%/O#0[**3,SHSRbHa/UOL:ihN%l`7@MS] %0LZs5n>rWG88ms>k)ShXIifheu'fL]=Ja0>m.16MYFfWhpd+"4^[ha%&ag+;&f*S^7kscmVi2CM, %?4^:7,)J9ckh:nbH-i3\SWmA^[$M%s1rOqsn]FPqd.ti0=hSr].[FtUe3Yt#q&/;n?nnA:MhT-giFo7t&Qd^h1,Dm9N'Y,]l+Eb5 %6[PC/988^cOK+&sP?BQi@#=#$444b!%USH0POJRLW>'YVUNNB&Hb:hL9Ja]j")ouSg-,s1B3)]p6$[LCt))$0)Ap$,2Xl42(A+n&+>O-=pbR!DD,87%m.j>DYNk"4+^^Q'2$]372%I4QS.CqE@JX?56 %,jZ;hZ2T(!)8+3BP@X,r[]SFgj`QE3cOOD@K8eHJP.9'\D4H[f&pgALB5^W3/3_B3%=6N=YgEbHV(6C-b\B!&6Cr$7n1g9ndmg %DN\LcE"28,*s2T^iLu&/)[*IQCkE[d(u8',W"Zb$"?"p'ag=1I<[9T]'REP5^XV9:N>Cr\Ms@NpQsKb0hkCDai`n0h*!W6t&1M7G %O37O>C7TITBPK_nB2KPY\bOl<@)]&)?Kl&gRl9?YmAM8iGg`RKk;q\>M2;\)N!^[Sg,0<;m+:)Ekj3Z5U89'pLfZLXOh&R8.[/5b %Pkd16LS][rbghNDNFi?+1ot,`!6:p>EsnuK@a!R!W$Y@k$+r!o0[L:\YAr-&E.P]"&Nc6T[qPQ(AG",'"3h/bg06ZRVMdj)*IGd# %^&VCbKPHlr_+2C>S>cjuQ,-gVI8lMpVVn%\?I&Tr:n[eT`@b&2-7+CW922JmNToB0\=N %pbC\VW/`j15)dZ2<2\q-YY$2u/t,F+KYc:\Mh:hq[]#ORD2;3'enP?@Vc@0A^'2Q1[$Ito!2'Wck:uce4b9*rop0/<`EOqcB37d`^G1[tp'Z[$=Y@W+m.@BAR %cs?guW\k/YX^"F-339sO;(`$&%s]8R#3aOf`rHOAR%Qfl)QM(3W0j8+BA!?A7]dnmibXC3 %4!0AWpBUq=NP&d'T.&dd5tQ^U'nrj!%P8T=)o]od`nO+O[%(AA>-`W%H'nfphbq'4r&"E:MYSK=Deo[@PU.Eo`\$`u6>'cF2G1\"F6g##-UJo9;%Up&SgEf"e.4\b_ %^9=Ne)+4JeQ)MW6"?5h;5b&sQE?X&\1d;!OW2kc<[ldZ1;'&MZ?HqGmY^mTorIV*gFqIp'.F4:udF].S?M4hs0^!7@C2kR[Z50gi %rTZu:A7=7I@16"ZPKQoW+cphZ2Il=j+d7-9Db5m17uVIG<>ma^Q+J3TM*(dg>'RPKCP %T&1slgdaj\Znf?>UY]M]B1;'K7sbO)_1L4RW&X.UYjc%"qZsD:P2\Fm*=CAX$qBRcZPq7C&lIKcUDo3Vecl+>MA@k*6B<6U['br& %MD:PM)^fXlUc+$Bn!s#caR>U>80I2Nm/b4E_JiSX,#HT!7;]?M=k9.5`#Y8,9W1kK_IE%l;bb#/nOm4/;SD:E2ZGGF3gl-6`&`nk4)B8Df8k$<:$"\WFb7;$&Vb.sH<-+MOfN=E$]%+f@1-i0tdl;,C\-3=B %+a@/]3\*:m@Tp3gZEbSe,"LnE+;Z4((F;A!qb[l"qd0h6&dC0MK:TW=5fG$?5n)oWgk4O]MTJHnPL7@g[![L/gIh->)%FB_3[ks; %2pQFa1/jij3R]P^`3kq/5fMC(UIF3*0cEX*_TtYKbp:5]OY"eR6'SJ*$!5s!",^^V';&ogBjnWF.Q&`"LN\O8RU9h3`5^OGPp=@T8N)p/!a33[DNdB2Eop,$kg?=g<$H\Q=B]YM %Hn[rk=:-^kf9h];Bl;K`6\beslr+QXop3Gr'R/@aggC9i,]%-%"=&d.BVnJZdV'KrP(Nl^:*EA?&EN`o`5,Sl"u+#=,>k28'ot?t %HOpsFg*st"`@teX0j"b/U6S"V2,6Sq`*$]gI8I27[Dsm50.-=Je536N;VD-7[Edj)&N5t"2i&Kq>;*\tG+_EqUcLgHLeAC+p!C1P %%fM.pKS:^s&10[[RjrHlo';Ai9;k*O?+ol@!Vj#%A_9TDE:\uB-%uR"FmS=I1Jm)88l-'d7["IuL3QV_.RK]d^BRHaWKAk:(uo4k %[9D%L,5"h])tDYhjA%3hB9O=d0 %)P"9KUh"(-!Nofkd6ph[&E;cLam?TJ2-;^RK"i/JmGS3)fZ`9<.4tc[K,%lE8;[KdS2Y3+W(K\pl.T9u-]':J)3De,mCE[,]l!^r %9T49I"454ui#6'cM(.D0V%Ri[9J*g<%E2FUf*PA0k^\4a %1([&`MCN/BE;=.3J!!bODmmjs[!6$DO"jec;cqe*1j#QAYu*#jK]$tL+K%\7%q;^n2AE+UU"X-"B64Lc9u3=H=kIbi'\8*UV7YT8 %k'e)J,+\II!r@mC>jCV,0Y`@P)g;G8.\OO[CP^bc`927>+K%F,V-j5YP^ZG^74E=o/IN&Z`M]27i\[Z#m^MSHH0`W37r]08nZ0gL %3L4,WaQPY%b8N&f0FoZ(B8)mhKh0I%ZCK+T=%d#eW0W?a[@=.>W\`#g-5CmsnXnPS<%MK/[rJtcDn/PB=j,!)"A]RS8\,].[h,=/ %kas[faka&9C'?J_MTRI-$hmuD3K`tJVW/E?A'f^dWAl+doU1a\Wk$1/d`gI*MEquN`ZZNB=%_C3bMST(;_IBiVb5M1>(+p0cV-[e %YMad7DcS?F[rNIKPm8<039uk1(8\nIaWnAWH0Iu+\L&^R-R>>;$+fD*A*?OlQTYnZ'Gdmb8#]Zc/NO5]$^a(=0m!s-DpjJ&F_eNZ %"/rHW8^n>:U70T]An^'.7"VFU'mi^o=NOXB,R&Pc!*UmE(!G2$R\$QFN+-et1GZ!9C9aLh;Kguha<\heHHpntp;1;#q]i8hV;K>rW[T%p7c*B>2\>'[A-%+[!.=6=3^:e,paXcB'03*i5KN$P)@80+/,K_\* %qs*ad\t-+u\C1$P@4)KAKEe%a_FtKH8&3!7Z#\4NauV9_kM]%__l5=fM>i(1@h#O"V8+[c1[IS5n`EgWN_Dd)9+6AjC0%E0#]N@= %e2SshWYeo=BP*7U(j=/i9hc!G'#iG`SItK_pMs]D7hHo%KSn:5&(u7k&qW8']ta@K[/4lnDKl6OS-l#u+Rj,Ge$ZDQ82YGsU2$(W %6u!+*)Mg(&+RYSRJY3ZD(6j<-]ckNW'b=_(Hq74g*!9S;i`(&NVA,0j_:Yt:Tp!Q>_#^&%,U@$_*&E]'!p.)E$KUIV,B%eCC90l]&i8Ei_5&s660DjiqPtJ(lj:;!$HE)5s7.MF+]_m3[sLY$m;(e>_L(*r*eT?9#,FQU,XY!Sr2!1,=_$ %ob"]>\=mVg&W#Klj@@oWa$s9E\p(hL4mi?X/@LdU. %.7dT$PK51NPhol"(Au'c26=clk5655n7GHB.oE(n,)$$h!$T2Jd9J.--PXr`YF4T-)q)CQe0cVp6*%5oZH-1_Pmu).5u3LkqD"t> %UJ)6#XFSMqc8.F_\V4Z.lRt9#g1lF1(2m#lWlC.K6eY/=C9+&C[TiC2+>>o9!)BEBIL6&-^ %!.0?P.8c7adCHr8gMu'eeL?Os(fO1FZrdC1_pi'rZ)./O,];pYgL9ujX'1u\"n^eSNE>)+ONjoD,gmS,$F=_lfuB@ %_eGNqe'.lFN);Mkd:th)U[$0prlHi@$Ct#Qbu>6m;3*mg%,/reX:S[(KLj+WOL&=#'rm#0>8GT2&1_.OHcJZdPW70_[L((6#G<3K %nT)-mQLAgfr>bbgn!;V-s.-4]-,s1=i2@*7.FKXWF34o*ZZN&mAikU6=;I1dqN5$B/et"`LWL8Ag1S7MU1rTPm:PH/Zr71m@]>/L %VZhN;TGu@-//6P@^TGcb*=0OUS`mC;9#n\7KC+/CkL-nJch5VBMT=Vm[ %/6TMrPJ&S-RB-Kk0emKI/0P/cRP9#TQjCo3bmTj$e'N68U['e."YK!ikcfK7FgDk>%/$X'0r;rKR,J]^n8aT:jY5$u#rPN(eb\2\ %KQhN\qLXm`\/%?VlP9IIGL4X4b2k1IQ)ljX`)L*KO0-$E0OHFcE+]2)bB"G1`fd %[d'A7qt#rP]PYhVU)_8FAN`@#mkk7bXZ2>qFQ,C&Lg##2-7k1J`85'@!_AL$Kd2e8H4WZFS2W`M95oR4q@[n4QIZ6kOOm+')U5Y: %]C9k'L6Wi^E3<=]#j(U0XQ(n.)&T)^XuKN13C]t5*`d?R%'"Du'ntuU8msq&?V:EX?i9&V5U-&`OLkJuWH'f_pAe78C %QCE0\amAer2N$+1e^[gN0ZJUe%h:/,(4XJ'"Z'M2F4>,ca@mr#h]AF4ETGZEV:Ui(SVn?=Cs12tpM,8(:a@6?(8@iW+r@ %j(MrE*[]c6")JBGi$D(IaHfZpMH=7A8g6fi$WA%15,0Vq!/#E:Z5dEUX%aq5#oWOc'e8S!FJTRi"_f#e,ToO(Xu8#[Z>-I@eEKD: %GfhSCG@#k(r*ml"kB8^\jiQLi"1WksQ#-*OBt@`2LbZ3SC.&$=/Jd2D>B$Y!pkXp?eJ`kcEntKl5.$(eZ(8AYfip'!8$)HeQMspW %i">utX08eY.s]'cg#D@7onjf1TXO]#O*G5?4h(ji3BCNon'F&ekTJ8tM7:'jW(g:R!USI:;aDjmI6\YM#t'A/[I)K!HGFD]MB=je %\"3"m9n>gYL92fBc+L._i?QA&<^ZJ.CqadEMB=RG\(TJ>NUfRJparrRUcW_.[,>-k8Gq6-Z+4/bDMj9^(ajokNTssmQ>gT!-a"EZ^mlO.=p.:\_'C^fJ)+&K>5L3V&!^ZH^DBC(G0j %S0"r@[T[3GD7<%%]WF*NXV&ra %/t.5hHAThQEorHdU&<$`h'0k8VN*C`$r\J!5QP1rI4A\:pL<+oclhfr:>2@q*P>+Fe/9GZQ`73kjFUbEJS?&5^K.?b.Kc6Hdg2/-`1 %ekt[;("@qI?dWTkL]^U:!O"m?)m(c84'Pqn6[^[66_A%F?4C"E9+h^5L$38m]Kp,*%k;\SR#mAV!,F0YRS@$$U+h0N\LE`]F %lEu<[W>_mIOpIB[qJ_H'3[A2d8JT?6p0`F$7c:fM6unV\bs>"*/u]ENP!WIhToodur2Gs8B)cSe#iuQjOhg?*\P$Dc:IZnj>uJ06 %3\N2^U1>\!WnKW?oLC7T&pd/,5\(-jTJe#4C4c4+kU(k%A?/_W"qeAq=]rPmFSnS>.0)j&$[U/Q]\1f07p-i1g:KnDJ=LVW;Ga30 %@31OR=J8p*g.!9<:bFZSf!>6(2d&tF&t`($khPIYls1-'1iA4@%8!E'kenM:*pF5OkU&e/)K2-d0BarU;fYVLiq![>dkd-N'C %WVL;)ndi5"`a5;-rHh-G5gCqgn.A[27B:<-^tU^=,>.os"(:FlZ1V5PH3A(JXL93egCM,;VrdW)Fo*?[k]+7f,Zi^Hb*9pEh6TS/We5E2+,m'l\-Z-uB,TV8C[qsl&gU?#b %gNEDEhPp]";&G?BQ`Y"9S''HbhR4rO8!N-orOP]85GGNaQ(QR9eX7h\Y9^`o2Od\pn;+&i,JlS%?B7>eJ6-jf"'W#c#%5_/FLtLV %W&E*9gmYPabVgUqZ-='=0.AU@$TH?H[568W=s8Dji6".8LJ%S%m&2CV?j':Mj,%D6LPsY]k/l"=YpTj1E<1B< %cqD\13i0JH&BHi,M`3g2,.&0$ZD=J.ZBPsd7L!!).F'Q53,apdWhg9N2LVB(0s$BaYk[_1cj\MekXC_XV/CbQ<\&*h7C^lkI)O=c %As7,??6?Fo[p$c*mHnmmf]k[`k%ef+9-3p_gDq<.m*nagBHckL/.C64jIpbNcsc4#4^;NLnU+k5DHXQ3/G#uJ %@b^$jA>=#!PZtWcp8u&//SnK2O!pL"MJ9*uHUQ[i5RaW5nDr(tB#ILS2b'9;,(ju^juO$).$[,@+DHZ56[PS[>L9p`>0?p25&+m] %"R[l>^1`_>Lq8p]9PA8K0\uA+9cu4pXu@[IMWfoql6]95U>1q`(`-&KWAY6/d7[N";fT`%BDk_!fPrKH;UP:lM+*)]r[6[RmooPI"Sc2CZ7KXQc^mki\`8%(CJ8r33EKkb](0d %8=9@OBVEdu$(<,>-9Om9CQ?XYXX4mCQJnI?5HK"!AN$H\hCiU]H?j$u@aluoh(5G(DYFiO<@S\[NDYbP+:MF5 %/@7Th/jjC3Tda,g*OQkTQB,r?Y/_;IWotb?_@/EdId+JIG_(.ah:u=A!6bj[$fj %c;hB1?1@'c=^=*TrY$4n[>Q+(NYs7CMS+MunI7du5T@cK5W;Ilq>lYMecqC8.4lXd[X\sH'-AUg\Y;)o>c==em"lX?e:DD05Xe`H %$t=?%+tc&=fA"""gPD/jC%iibN-%pE3>&!r9Nolir;5E"oU7KX0AG.F5XnLOh$.W48[H@+o=W?``QEinE*ZTqd&)nn^Be\ncn!YX %iDJ/Bj9DRZ9oLVj-^iE!V6eEOhJQM81W$U=lp!aDDuH:Cp8V3Z+qAk)m[Fgr6;`Z@=hOW._KW,I]\\ND\L)oVD;#%>9$PdgSW:\a`UB:qjf-etPoWH`:O+9>ILNXN/>Nk.O<(4Er2L#8#f\:?a1[d;'J0Qd[-BI3@\! %)oP`[i)#9/_H'cS1nZ)?U>Wl6@3,k'Mb+epY#RU`XFhAYiIbo7fNX9We6m3(7AprS^k$Y?`=NT%U">h+8$7#EA>a,>X"%2&_A;Ij %N8`RCF_O\^iF=/U0<3jWM"=GE/7<.VU5/k9=\3[*>po4Wk%AEOL88gY'bYl6_*uR6/4Vj"nRJdYLD#Wj\1/1;H[Y:^O@+N[-hIK# %&*+>ga+W]a5/D:>K26kP4h\*n"`\HQA+LF*.D*9BnEDjF^N6YE=ND!W3OPLPr3Lk47gUTB>gcAfhq'=f7Hia$EQV2n+"s.G?BPI9 %<)IS/&\kM$6dMNl[T90GDXQA,KAr=L%cn)I&Li?Db>*K%fQcZ2$4tjeseZ5*OlMf*iM3H)WJHXX43b@W44?!T\I?Reqi8G'q^sC&uNs(HPm8R))#0<-e$8`Gc %=?3\i$[8LJ7t;b,,#g$gb'U*41Y3(iFKAHF_nfD'3XI6lI*PA`F*_AX.`g;#X.oqS/%YggR]_IJ'P\/^p6lnmN_4?k0V`1MYI;0N %2]p_b>[pkM--@)Q]OW/!FG6#ZP9bBuKJ_B>QetEtRF+Y@GEmQ/4?H=& %pIkrB4q1=cC:[Z^jfLalLMo(MfDR]bnZTW3Mei\ZmPt3^n]o"(7Bn95*Y((D(NX2cQQKgSo.SPJ+ZAq %=:MRc4)XQW$FRF'.dT)T5VB#h.f2W^bV@pPCdhPah:Jc.(^_u?WhgPjRCC[OiG`(M0S=YQ5/Jbg9jY$3Sr4Qldb+iL %rY=EHkrOIMAUBit%"g665YuS0]&&52(@!Z+17\\&-kq*3i`$'kkCc2$FRr^5-YsuW6M&IYPNEX3@P23V3ZZ'u3ca-rj=&U7C1H%Y %T@5G`T&&b.7hM_dmu;.eSu-,T(J`[J@(Q-@l/KV$@*1#'qR"^pVG(3?+a=@PDDOSeoQJ`"B<]:N]Lq$m<`sJR)0S)!XM< %&u]).!'&2,-=eZ`)Zd2LEs.DUcW3,`/'H?n_g?LZ,'"+Rp@6W9%Z[7ad2\*8MUhm-m@]JrF2YU\,2#oDdWX]^W/*\I*/_/$N]Ir0 %/22-.&-Ir5gkMZs)YsDG!9H$T,>XV&G#I]JU9ir*X@l>YB0FV_S'n`&6eF!+ %JMlN0rotEaS$Y.-!@:*.(0MNQ.TXTC)r"JCKt=J?1jWa%3WOC"_78bE'A&C*L2pDuF;!nR=4cXUQSfF9J"W81gkkCh(JboL=?=R?H;1KjV*#Y(e&W[T6piY\2_mmX)Vo\N_La!f1/Dfg+H;Ab+Pk>_0W %pb.8-2'>r;OVD"HY#7eg@Bp<23YN=sjP4#I`j %#?bh,9I8Y.5=%;!^V@L1ZEX7?0#E1.gh+_h/lS%h!CX4'Hgk*=h?>14EW[Tb\EX4'I-U!hDe;+cZT=2JDUSoC-nGLXFt %Q,nE]"B1T+4k4Pm_tdlX&&qU*TB]:<\Rfn?EW\dh',Sa4BTjiL.RFikD;;=#@a4h99=6O,A?%k[R4]9M`d:R?-R&PTa<]Ha?!8IM %[T]-7Cq`t[,QjkR2dI&i2O/hd[.VVB3C1ZDI^(HcB\+0fY3J8`UVEMt[lt[,.KD]5[V&Vn08.K#;VG+7[O+?.nO_E8N;M/NA\&Z[ %Zusa.jD#O.6shi#9-WXX'7!bZRaIr="2TEqg/=7GNQ,PqWOgS,j_2&(FX]An9_4fDbY;5944\3og;18g6OXBJF)SL-s2.uR5'=$(NF0Pu %_?*V;-5D3bicK5nP[L=SbgFK!%Fku'lB;k+/Lr;]FurF)Y/s6KPS;?iW;T%O7:$X'R9DN7W!gV1OE[4.,]KN%ocf'g(+W,A/S6h- %!EunbM+(*7*k3-1H;Kp\DJY`YAc9*Fu %0kr49OL#9+8Lgsjohpo0B`h#u.-i@11,'C_Lq)2leSq,:^%Q?q&6W(4n*_c:9?9[giLhW1sF-JATcr)@28+qdh?%W-itOF %3#gF;2]o*%m:rMmd:T5"Mqt/$P&YqI.f<;Br(p%UQQ\-9.]>lkpp`=s]<"2PajQcE_Fk4^8*,JK]\UW-0!4BA>&7D>*oW6>/9JXGIZQoDCo %ULG;*FSj_JS]mhJ4*Hp2V!n/2(gTNB<@Zpc\!fsNjqB%5g?[#$!RN/A^q*d0"G4!0=2nucU`_,)p#t9Me8,'Ei=kFP+XUhb?e!<1 %]<)Y1!(sih/2J.FW-'ORB^jSV?n)310>(&)!QojJaq(&gQK^r*^In_aL\pk"\/$Fo9h>0"@WGsEc:eSP2 %j/EHg#B2b5VXQ2nWGb_GX %&]eW"6,B=A'D#`>Q%ATb$JR6%p6F=$1eB55iBpk;8p+B %2M>K%h[oA!H(tJ;OAm2oD:@'5\n,'3Y;RcjXVLKGSbKBf3m^X%b1Y!UCp1)iEq@I8_bP2cbB2@n,E*gTASN(o()_Ho&ec]mC0:uH&2J!6rIRGs21n0I;sIXqY-E;ijAs0G\p(j(HRqWm`e)`/33eg*13E7<;>AO+B7UY!O90u@*VQi]BO9`j[mlX[LEQK[3:$o%t_";1ecnDM1C6F_]7'm!ZNtXeAOa:Z'IYi*1=aiVA %4UZ#4.\]=Q<(8GGEA6"T`BZc1)l:ucRWjoH=A]_uZW.6c1/kK=C7;hI1f)4fdfn;AZ%PZ3BLN\Z"K][m=[3`,F)[lZ<42In%NlAuj`9C.YAaRiHKJi5 %)%2gX^@J>&]ToU+o^na%AT"NGF^s5Y`O>E:kC(eoR=K1DbQ3k`pBq.^1p#cW,5TAZ7P:@V"+eLsH2nr$83-(_@rqFa.!csASh,@G8$/:-L8->Nt"hU,*PRdZ[0=9.qF5sdfp#FXk=SRm1iQR[8*CaDBN%59lJgV %9_5.MGc1'7HL;,bW-B#4O=TlX`G9.$B%Vc>u?8XkR`=q5VU5C.5q_hX:S %UgmT-,$g#_g[+)g;?r,Rc_&Y'0j%V>KgdAcjF"`=Tkp`G7a;N'3;JqJd4X5>)"e+nR>?1)@A*_k6[1aOWj&N[MU[*B\S\`[@pP<) %o-m9TMF.C[.I"_,A;f.=QQOMu,u698CqB`8mO0QK!HsRG'-66C^8oCkqEn!pH2"p*`n_Koj@$rQe#`T=fl+TuJ+6;5 %l&5T:f3_fiNF>$JRJh,!m:ZIpldObH]Y0t&DTqq(J,&rlhuE*?lJ;65P;02ob:c*8?+d)GO2nst]6D6if9]QWD_Ln=_Q0=-gUk)n %DtIC\hgTW4s7Z3D\\B)ek25'%Se!R4d!Fq`cE9@P[=>l;Hh[2W?VJ`b>s"pX=9$_m5LJ(!Q[el.DWaO,je)I=G(66)GCGotTAV_I %^AP_^kBF\Nq=*h>R+a32rjM-&IDu(q>^H-nk6KePkEA-qci&0J&D;8pN-p7:#:<. %rURkV`Ok`"?!i<@]&VP\msOC24"Tc)TBFD(pD:TU^%ecAj!F&pAFA:Hae/(YbnkSjGNU&.[H:E%kH"W%H$-C(T%UX:PeWo&]P`c%k'FMgrE' %qr[4foA(L(O/I;UL\f[$k*+SJF)cPMGB:Cfo?8/FCtH>1\c1aRrT2ifS*%bY!8E\ZrU$6Uo&?]OT-(b[_gA,Q[s.K"L=pqHS"%Uq0?i>.3>caXpC>[.gKD92h7]SqGBES>mbZ@Iq['l]l,C2[HT]\sEVE5F96'`](\EWD^Kb#lnb(SiS%l[f %bh#%Nk/DX6EceU6qbdpL0<[Qej='p,N6O`_%,TmTrT2"*/f"8hZe)P?oOKkr^Rfjus8MTUh(Rgk4r7FLTCmBkHY;Map3(Y>q"AW% %n/sYsIJ*U!mMA*!9Ich:M7)`Ko-hrM_fnUE40HToPu4Na8Pk,7sC %pNW#(hYC=Rq[%,$hq_PO]0"Q)dSn(/0>:7GFK-_?1U;eM*8?m!M"2o)A1I]oT*>qN/J+ %\Gak[]uant"RUO9]u4jZj%\G;)>_(fY!57-ScNA8O(UN?T]]+O7c_h=c.+Ib0/!6Nk=j@`6DO+s/+A@RH9P[8gWQY(h=I;calD:S %'0R.5J+khpG5!lg'WT*dhO2=?p?_2.LYW\//q5otpu_:>YA^R]rq,S6E_VS:m,4/^O'aAZW"3uLAk-G+j".86=(Yh-*"dZYH[`^2 %OTXJ4-V),B;t'=E>I2*9H#g">J*\&F[Ut""4a5gsd*=>pkJf^TjmGUmF#dKLI\OLdf-`VBSgB<3*hVEL@88IGO+$g9bfDTqmQ3Y\ %U"e!W5KNa#C)g(*n;/7MpH*"ZhL'bFmbPk4(Dg-hkPKq+*o?\V;d2=2,JW\75.pF-cCnTO^Am?\m/5l>in`Focb=ZoLXGeJ(i&4B %lZ;QUp/$*kIO+;#6?kCYdXGGW#CIejQ(iWulG4S@`ZKDQ@fFjE^(DuI6E&tqc0_^.5+[\HgLCC.\ou`Zo6rUO@HT"!FR?;ZRJ!I$ %?9+8+pXNS8Vlq_VY4_m:>s6#j^:J]9EOIZLH8lo-^V5!*]+$W9q"0-NO.8X3!ome[nMPshi@1:ZSJB?(c0j`]bonU'YAS9]GMbK0 %nY`S.gfaHtkH^`[%8VJo#J>94VoN@SrUoO3SbLSmJFCd$pH#P?qG7)q[hnE)melV3^:h1kr6$/=c#.cX*7VUVT8S"#IeYn,BRR2J %Q;?t^m(=%IUje$0k7-P<-ZVf(hHaH[4W--DZfRm-.K7]iMZ^l`r^;P0&"U'P)!8qGYEoTN3ArGDI*1W-L=nrA*V^eb48%BMK>X4o %3&o.M:NV9-*6)VNGWrs#E*9Npc5L0SZZc<.'=*ZpU2ggXeJU='PNaLbc6[8Nn5JiI?JLC0h,o7-Yt0:D+fO8FXEI\?3(TtH*r8]1OJ %3K/+l3ko3sS>/RNDN.\W)XXKNSr#qkH*&,Fg.tS@rQFR>*)3dVVpI'[]=p[]G-oVVqWt!RltE%4p";.KB1MjcW6`1FT<1\U5OOl? %Ipm)/kD0'Djm\;bAs[@5J'-MXkD)9>S"KJaq.[6"qVC8j0!9YIFnY2EpFC8H7!M@JYO]uK2L4o/hZMT@h!pmkhsJDUc,WHTT,6,& %qeq;XA_/;U:0]IOQ2`tV=$D]FG-Ao84s,7qs82WeLK?]$@e5f8ke/*NRiU&$F!jepI/!?oX35^R]-iGQ0>=tV]DL\2+)ndNP<[re %+@]\TOW_Z8lpq]Z6TYUd'>tlJ%J9e78Ue3?Zgm41eDKGW%NVU"$s4L\3nQO%FQc`rHYoAW=)T1Mht,'TS_m\%F7Xi_hnT-Z&U"!R %..8P3$#fYMBce>+3qtmsmEjD#g$RnWf@Lg_];t>^WZGId$fB5?o]P$het8RD?g[h8*s$Yh%hbMO45K]u54Ze\KD:(JOH3r0 %f*=mnr="*<.?e69_9.O"'." %$Mg&Ur_=!sJFc4U--CI++WjY(#Ihtg>S"K\r9C7Cs)`U-na?!gb[5aHqBd0.H8[rgSi;Tu(_4"W%*$kI#MWK_6YXmHd'MnHo,II@p(;rq=U@$bjY[c5WCk8Gbqcn-&sNNcCOu %guc/fD)=j0E>oAHE;8Q4[lMHFNcCOugu]H_3Q>orELR'7WijkGIh?Dj@h@oBK_f"rpd/9@B,H>KOlc/k,91ji&[n#tU@B\mL/4V; %Sg0$1^2U]:5>qb5q)If.8Iot38^^A.QkmEK!fN;c8l7hZor"eLE"\MG\gYp02RNW("^bK`gKhgXX"=Q*M7H\)L5qQqX:uf*bK\\lC0rT)2a6k[\EJU(](t:ML2%DLB %nIot!n':XBn@cbVo2iD6kBCQ?^U^o1]j='DhXMQFQTd8Jlh/Ok-=<@X^\H@H`IEiipQC*r$+MHeRPATs)<7k %#E?^B4eMWYc[S&.f"lAl^&)dIgT_k#ZH#I=Du'%_B]o0GF7FHtJ"jX"d@\aaE$RMk5%I/:M=JX"hRV%Uh9G@7aN\-4+CEs]>joCV %pu5'kmG?Yi3`7^"EkEElR""ftlU]"e:HngodusopG,Hth;1_8epi-,lLT@-'SmNK-KlO<_@=KB/fCt+M=.Uhc]2*k-1"cF2A0Y;glEN3Ij3qGkjBIK]=6*94$%aZL[XHr %D-J&OL[XHr*?@=dpi\QpNt1(+3d`RsQaS\C^sV1(9TO,T%s[aANZR**j#_R78!!*dlga'QkOIs07*ij447Ph5mlC5ls6Jh0m@S:B %G#uNclgX;J!ai%PpEH*.]L8'A]pK'8]P$-IcJ4QPilH@aV"+@30OEOb+QB;qi-m`b*M47t]MJ:mkH[\QHDj3g,@=^c:I;Y:s7;RY %BBOdDr0<(U^,\9i]_hDppP@P<^\d_>pFLu(rFDD^=7hm+BJ9<[#]1&70Y6/-3cKH/AbMUAq8Ua-VVQXkUMBO9&C*HRIJ8n0TKTmg %5F3CsDmSI+[tXhXocAh5=5'nXA;@L,H*I1TIJPM7IZ*]Ro`HMb'l74EGVU6(Q^=cf:,VS='W?R;#?F[!HH7).]dL)Y^.0:2k@3uK %I)P"bm!Zl;]^Z<$rVJe?^\mJgRs,\+j!j/N7r.j407@;Vl"D[ic)%&>\b(SjiFcgW]h!PCpFr*Ih%kC+aad0$i>tAK5?^2Ci"a+e %`'p9R?J^*YIBa%Src:sH=-n-G41kEX/+ia%hjr#s5OZ=crqmIWCA.u/#^t5!+RtP'&V'f$Q0X(tKDm&:J`q,^;\Fog@;(9gF.e(UFs)7du8ToMurmU<#&=5VTUN^j%qeL#`kFs\;i2QU:9A5C?+,@In5"X,] %;j05T(p8qW^A)a#PFZ";,"Sf=?S4 %lC,]V[?!bq,SaGjTe2Ug0_q;.R)YB9q=agA\Or2HqKEaqV9P:WcFZ&h[CgBedR30ol^Sl#3$,oH`qQqR?FT8`M>cb/H_Y@D*ku&3 %$0e't@UXUh>Y4cbIJhM4*h^169ua<=>B='TW0)cs]_:BH.SRQg''@e+\"Y\2&Bhu^$t<[SI@Z#:YQ"9/X15Z1DaSuT^+Ps_6#l:7 %.ZJp/qU`EmnHd*pk=T6mr*tlG#7ob5cPDpc)SbT"$d3=X'$h]@nIFf)'d$eD2,N@R=e&O_<[#dIO4fiAEsSs*IAJ)Hi8cukisp'Od6m8-6,l\nZ?^rmG(1A#H\;1t^P$scL6`ni %)Y8U=n*[UXV.-U!+*N$/+*-4_Wp\;;a!'8c"+>PohoAf%hcBL3g*.WdhJ44*DJY3CHiog'%qF4NrO)04HQ9NV&iNcVO-TEb`ekY[ %`A>"Ojpeaf80>LBnWt*h`_,T3bdP^([5C%"[_DRX8F0hgp;/8:j7p4"Deu>C_X!Fqg=UX5NP-?Q\@5%D>jpmA0,qL#np4Q+2n"02 %I>m:VX,1.rlL`?!7d5%Da2#$MWi+IMgLeu6,k\>4%>@9gZ-`'Aq+-flcc_$P^[RCpZ!LO"nKNf%^Kk+p,4i@d,3CV[2F'6k0iT(N8$4W3EUUK*8^Re>Z(\4'(ZfK@,*sPWLk;;mpT1A.SRnfr`[f4b-4tUf$XYu5F2!R(bN%4eSN%&!piO.ClCk^Jr*4B=XMtL%bA"f@Z.m:@Pd`VqH?LUW %B5j^:l\]5GA1ui`]<8=a3`Y*[j>D6S3Ufr)PMFVQY<(XY3hSo.VU%4t&jQ!7k1rI/+N#BCDmehIGE)")16`X%/<<$7l=F%Xo@^Sq %_QgP]m&@7RADN>Na<;og>`r_G5*Y-\U:_qq?IhKB'N.$GoL^^gMZt$1^r,_7M=m^CXj441[O7QjF_l`te]q[dmZT&WPWETAZ0c=< %$[->)W/@jpa2d4Y6Q.FRSNnGVW/8#brf/7_^*U%)S;S6"[B?A;lOTE"R!0%O7u$ITYCQU#"p1?ZZ19sr<_sLb.u\])FU$mBHP8co %]e4%eO098(XO.7,CV5VrD7aVS'W^N,+`>1QQ)BTn28-H=MM4:Gf0/(PdRbNg!#;t_:jN!o=sdAeA(+;q<*Lqh8YhYO[uW0\4Mqlj*7NcWI'YU!<: %SW79XV\Mo%Z$D,E&+W`F;]232p?VLR-.Zf5p]QXtS53G(Rdk"W"%9edjLlA'X$P@f=92p(nHp+6aZ)t9[NY6kUJY%O$k:ikQdWlH %2?D5NCnHZ/am2IRu`5!:<0P#T7'h0O<>(1o:hfWR%H;^gO0ni0b^!:#5 %@.iHt$A*"0b::nT-/ie[TGhK$MIKu*SJTh\T>o!BAHk?frHW'X>u]i0=)TrrdRX-8fLt2D,&sQ1&X./NH]BTni`sL/TrL+l;Th%(r\IPakuh(Q=!JhE/9h,S$D)iZ*Wscf(gUNLqF;DCiSM1SajE %rJ0USo^qS.j7YauZ\cc,7R&Mn0u:j%24hYt/,X2\-$[hDD%u.\b:o\H408@&Z`#&[F$'OH?%h7IYWS?W8]Wq3#!g1#nl>YSEW5Wj %2:pN-K@&1^-UY$*f:fT'#Bcr:XeB[7H4ij.@rmEagIffdFqYn"dFZWk[g;.,S\hq(jepb[R(L)]Zt"ZA+MUr`4"aC"ThNB2I1^7fgdWhJolX]h0c+Rj3F7VAD2iu`a];&%Du3cm:1F58fI82sp\ %>)sYdeKcN1Ska4rl1qQTBA'8Aa&;CGk8k!Er,k.G=]f*`8D9bW()&=mV2 %bR)u?A%AKHdpjrI75q0-6AmF.V[J;n,n%&90rr;i?kk\,`M"XdbbX/UKc;Ah,+dp57=\:UVbrXmr05O4h)FUIgfni*m6@&@"G.CV %O`j4X\_f=qfsQu&h)%AgJ'gpG0NH02`8i#-[6m'`8%WC8B6F/2N9*0<+82`o$u:anA.Bk97Q)E^W8mY#9n-8O8 %`2H/'\[q]R`X+aigU?&V;rGEF#R>ZlX:6>#D2AnUZ/$\0\iB5Edm+c$gP-ca2>g\g/sK?24[qKm`>DpU$Y8ioV]cU;-B$'gk\.nd %X=GsWPKl)"mcS#O)_fW:`Uml`A&WU/_QYT%BLFKBE3Tq>Hq64*9!9YYL_BHXenr"pqnHrCa %"Xg/RlZdTN,TUHYm]l=M($CO-N*Sd3d:+2.("O458['\_;Np/C/W&++RhWkXQ=Gr8H-PE/;1"4,QKn+'mYSo/,,''mIQ9/)O:W'[ %/W6dje$5nT#>Z`Wd4*R;hh6"k%3IGpT19_EPR?B/TjO7J"\P3lCKULH>'I*iQgRVDlR_2&XGOCnOUrJ?\/2EFXGUtjL? %l9,kBV@"OCPRhOL$`"Mr'j*J+_/YVmm3I/(p`cDbTU%>'#V<,b9k0OOpg^!;Q%!4nAcj=>_arM(_b3)blS<-qn\G@lW,9XdZDjl* %:qD=;m'52N/%sbc"_@'1'cP]571oP4jVuoh-&5uXqS%=Y$)^\nhJ[jH$E*`NXJd`QMPiL:)A^Q$@DtOd'MF&/T9^PL'^tJX`1<"5W8,CRj`:9]S,6\hf5(mG81sV*'Cr\aS&Ip$R %='2:5A^so2YX@(i+B(oqh+H@12LOcFE_(aUmmL"S8W+#]lIg'MJ8`B#nRCE6-Qt>Rm;%*(U<'^0A;(MO^9cWd+]SCKFC[sb@iV]4 %-fEG`bLmM.7Dk,g^IYH-F15g"V0iW*-k#/8";>3IJuh-Wi/JXQZ0/cF/U`B3mYs8nN9%i7B94RA`K@>a>E4coNMdu$A=-g(hAbD% %VFtOLhA.,J_eW!4CSd9J=@;W8(SLB*MYfHL?Yh[G#>RAf[Rgm+($a<:1)Q%GX8Sm%IS<**M0U+<3o_$Markp/bJM_+]ar1EhW#6XDIP@]^@#mC?:)dCQ%/@hip$ %8Vll@`!RWLP!i>CQHcWEL[siRC@T]mUCJ<$Ulq<&HjqK)nJfb%ZZ9S%8LMmdYY2=>ffV!>b+j4`04`g:*a2FL;Go&KBTp6`_c.3S>!%4)i`_cqc[hj"%A42*+Y1T %Zb\$lQ4TTlEeApBSL.oOQWum(,Z2G,fD,:goE7sqqc,[^gCu,dCT(r#B7JDs.=mR?B%dNNegrCR.j(W.`iA=0ED2P_$-V68j/*V% %@s&1/e!Z@N@MK!.25*@KLS3UU;Q0u#-;s+Sp)V]p@Q6`r^+S^]Nk*7?L:Yp&*ufsUMcGc5"^G(?GSheq;W2T*2/lt>2!9/FeW2kb %1`o0u5`[R]FCT;u5kC>eB4T-LfP\9"Z)37T5taR[\J*D7i\a38k&e3TC`G0(d@Nk5.23b"ZbB6C>0NJC3\*c[CC=oEN`,[I;e8<. %A:4J58$c>*KO'Zgc#J^)>Ve_'G>4\UjJ4OWm5;=gl=Teug%)>cisE:+9:Y@(eBHfL.k2rM>f: %OKgM@A<315!/oS%X9*"*;iWXD9Y*48"[IWi?l6I(W]G.,X=?-InFk@c)[H$EKXb"3$01&5P%(eaSYe/%]Ir'?f9K>a]d6OFZ0s`$ %MJi27(.0ajQVJMfdVZgN*G!,ma75XiB_#T>\]Bm\b$/Pj3!Nc98P@'$/M/l>Y9oakMu>mCE.j3%!a8)&E&I6VpgbaLe"(93JO)!pnJ$[O3;s$Hrm]nPft&Ur\1?FjHqIZYu^I&1(K]4SMYPU#Z%Y7lBeh`=/g0 %jc;]bji)u;gTd8(dR&duV9?Fpf=P#'Cl)%\4\+,.RcSfD7[t<14kDip%g8o@mL^(m%C`m?33UlE?T6gk>P@8)T)2Z>96(ZRo=N3c %>(ZZVA;8+0%3$4>?;!niD#s$Bn5.N`!u+Wq9#)nCMNi**SH'QBs7oL %;!lU']BV/j0tDuA_96HJQY_E>Z.&L$-k_Nop`r^q88d7 %Y78C@!fK(W9dbJ]W,-r9mK.eI0>>Qn>'+CB]]k/m_]MU.L#2/Mmc4>nhO>q7q.*aSSGhbM;,4c>,[.?BZ:Afhh7tC %ebRn)R-jq(76I6>BdU4-p6L$?65BrEpPe9C+19.8>LR]P#Ctj4M$&:SZm8f,bR^p>Tq.Eu$SA_^MLi3+g&LGTdA(`\pD7ZMY$=]KBd1j)Km9P>hCZFot@b>o-::qqebUL*(/$rD< %9P,9-lk5`&.3,.Y#&Zb8N*`&OjoqS+Cq>mldat]`9t/VUZ!s/n*)3m*#ql9fa@h!;L@CO*U6+5h(*M!EZZQ$>Ykb!W=_u"e)ddg90[cbi4TP;H[`Z794GBpSr^Zgeb$-#KU+&_P#aY%`,KNQU9*6/IGscFI!!304sW=0;P+[m:8O: %mHDfg7^$^_+W%&SaE.J.a=teYHEI-!W,(WPPj.R1=-2[JU_qeLQ;*ZeHLT:A1[QqY\8p.3!6f)HhU>G`0G:T5F'l*a@0DB0'&IP6 %B2U0IYA1FqMDT(X5[qs_1`R'.$*0S>$O4@2XPjk"K,+,tq+7JG=mu5K5iPIGKED[5tk;38IGdeudD01L_r43!S[]@-\-<3rR/mWsaUM):c."R8'7N(Gg9kiqARO*:ZYiidmW&16ZdRD4aVJ5lU+g0dg[ao+5R8[pVA" %,'*s:PLA\:PBNnE`UW*3*]TbUG5+$$\*F+R1JJ??M:gnPMcscGM$Zu[^\+kHF5Rj1!O"BeB1M>gXcNnLJ@ltH;6dZ5'I4-[i2Pfn %aprDf>XcT!8lJMD[bR9ZkkkmAM^\9'V'bu1T!P-rbg](d!h,;1%*+?84\fY$8HpcHSce7>/9WdL%`!?h?.39gl/9jj8HoO9ET\((`^b4E:1n.#gCG=GF=G5Q %/a/m$&*s<4"Bjg8qhT,qmt)A,rtemkoHkWCf9nsl\c\57.g8$aJe"^QNL*"09Kj20-+II[_-O0;@WWoTrAl._(VsOK+tN&U1CPZ8b6h4GSRA'h%j*"qdm:--2R/+P-+6W`cU5/?F*RnniAG&7AKP %@&8B!G17,P8;R])])TfTIgcs5-uJ))G#T!G`n0-#Sb %,;fa1N_X@Y#YY=Ln\8$(]cGS09E;nDAZ8uXL%$p!23>uK)3WsSk?[R%Y %\fI_!97n$b)]oDa?B>?>ROt;?M!==sK7sDK'PEEeYZ@fJX]Q0%*/[420Ddlb9"YVLF1%Y:o&__VO2LrX^5b1daF2GG=+PdiB(8n_H %m8F5JR:T^_MEVjn!mN4JfI/^ABZS;!(VI9Wa7EkA/'1>7^]L]m5@am8FfI,j0GHC`;'9kC]sUCUcb@[uF_%0;5&LhTp#>kK`3ZA% %?57;7gfHE]U?MI%lSZ4K+K(\t*aKIAj/85(bos;.OkG2pH$lYre`BA0-Y)kd>WbcJ3=;X6P@NmMI(gFid#\f`qkAfJI0a]b8Zo>R %_C;_!ck[=AVE5H1/:*RkE:)06T5%S8P-^h#G&k[/drt=MjU5pu#&(2_ %LHZnP\MlmGSY17\i;B1qV]-O,_eiVte7n!/l2SPgLCAC,n?\'BS0'NA&Q)P<&PnmTPQbZYF:fqtgn^=olrD9=JpfMMl3!A\\E%)< %,>XPg]i?u`;l9fgm2o`fN0\CX$< %Wp7Id&!G0i`NWOuUbg8=Ps8&,dnp+6S,ZmH/S&2?UqLC&[n?HVi_B`2&eaY9r=:Z65u>D(_Bu+%5eu:mc0'nX(UM;"XZ)/b-!`I# %,G$E"6a0]U;pr\`*:Z]o2kN!dk=TOlT-KpVkn_]s#SKemjX&Be^7k<&jrF.FNWG[ph*-(kpFj9ZMK3BX2pPYTL=5?TqF2ZlfY%bm/[].s[@[$Mc]*WhE\GsNJc2*@S %K^F5nPP2#gBmbrNqo(G;qMX/dmXDF)c;_9pI?(i7`APp7`S9Z1Ic$YU7rL*\;M,F!&A6VGcJ0nE$M")*\Blf8@AciA3T?psd=n2= %7)btC!Tj0>RM"n"-GD\\(CE"B\AXbtF2UcZhmN7A5/2&.Z\.fL-#qc`bf/%1@)=FQP!U_G&OX\=c+;XVe5q,2],tXgOD:3YregJt %og)M#CXdu6-S%%P?q&jp4@/^no?S#LP5C_k\#i3EcW]%Zqmn^DkDB(b=kDJ5lM7tGD^c8YMU,m8pJ*hdBiB&4Gbq81_7ZU=gc)52 %k]u/j9@n:GCghubhdHa?ia,?gR*H<3[e4R_.8#\Mg\-glJkgBc(:pHQ6lqtkW=KW%\OWK_SU)^]heZbiO%o-?On7<^-UU0YRoi/VMhUQZ-cS<*96\3>&t/iFHJX(IFoc?>he=L9W5; %F,.3"!'T^_7+%.,7U^-c'!6,*Xj,!bR)qq]Z3nQ,6sA8&+po_N_.a>iQ9po%!B$g[G8#UaE4pg8KApksN,s=57kfoNM%Bn9AO-(0 %=2p%c!WWLQLGM7Y'TRo^S8cGC7S]-s"DeYc-/4$udF=M_=om^4"SDs,ifMn()?a#[CWU`F:JO9P6:*_%"^&V %QB`'Gm4i4D%On+=m/3hb32(q;7\!X-$lUEZc3o7O:6uut(h8@o:p*_UGdnGEgm,[9:4$LS=Y%Ms35_Ldb>g'SL!u9>dkG1M;-Ir$ %-]2;G+h!:\]iZ(ZfZ]*PmP:.B2#0Vj\2UC`E:;k.V4"/>(GQ8O"6!2,Kt!;(F+^uQ-t:f+$Ad2.tL7RtIVK72c.deM"W %;1d9E$-D.@)O)q+].>Fc+?*4H&QjF:$`4:$0B$R&0hc*[Pf%s3p]+/f1'^*BLlM*FBpD5QU`N`.bD9`#`($I\WlL4t62N"6O$b@0 %(nA@9]ADc)qFnhO>$#2,aVnOqO!P+G49KX@/];+T6VIR,Ol+UVKGeY1hbSLh25>[EPjS!mV^&NuAmNK:DnmPh %a_?:*9d'l@p:<@V56/)AQrtK17O(J1QD@FZ&H\aniWCW%*[=5%MP@qoag['^,qG^6=&6?jFjo7PX!Qf)X!O4hSR7^$*49gOP>J3? %"^N4>:oJH!0U"dgP_1g_R1/AE;:o4]XdlUPS'7VnH"m^Q1bCkErmA&DY-e+H[,>2WHB[KT.-*U_.U]b,:d8crd,\<9Y+q3fMVldn/TljRsn6W(!NjMMQPog1.9\`0\rPR^D(nWo/bobc/RCn?f %?MRT8o2#'JUYFaf^6]"Q`Y\;I^gNls(MF-`aFf0KIYn.,Qp&U59Y;aa3>0Gi`5Cc>W&P:4EJ##X$()Q%8RX7UV8D0[*8LcfUXl0& %_OaPM^lWF$N-a4g`dGrd_RM-!kp&S$G(JbJTmPolSBc:Jn8JGFl5p3kjQO)mVYa8Kc/^0"H[,9%]9be&.E>m0C@j.cQ#hk:$)]V$ %o0E/oSa&BkdW*9NE*D'Ntcr?r=WN3Sh;^1V\r.]A)e,m$EW %jCjl+$VtaCD4-hdnC0V4BbAYS%!DYZ*96*ReA9[64d3Q$IsT!M#,f%@8Kbd-RqLn,\UdjQHVH+Df*0FG='/T%h5Vm_u]5& %:$ZV^>1q;HHK-#aNYYAJ]jupFQNBCj2.=*@HCPheLMFG1'+`A+@b+tFpOP$0\5%huk\G3F2J$B='*RW+(g@u00=Ek!;!L:Y.o.,k"!0.@;fl6#$Ddq/]Nfm<_,>R_H[j7m*7bB!9anb\:?u_K %>1q+PEPAdiV^k=UD*r,Kh#>DVAT)\Grb6Hf*\].`5\N9$?^?(m+g5SHKj4^RjsC:NH`'lI"S3P1&2b;oTqR`gmHV']oYIBM(Lj\lNsU %-h2JT#rP^I02(PJL2fXt)2&6@pA8Aic"K@D;COH70R$T&l@oR>l#07Y[S(eo$OPg!@D4&_$Dt'_'_jRTQo+OUt=\BGk`%G\s2aY`\GaaW]!Rd_#sebdG`L))ee2 %(l>@UXiV4$F>Zl<"p23'Q#5o?f(D5:r"5-085arUA346u)np,Y9PR'k[Nd-l7ng?9-FY3HgTcmq&^q-",Gl:3&X2UoM]FOYOuPA24#C8+bQq<)Y-JK,"69SduGJoSFO-j`R$je-kar77*Yp1T> %7gtU\eZ`'ik=3<#1R#3kAgYM06V@$-8Tr$kU.JT'g(D5.i;1>mKmIP\4(;g=G/SL^BL`JjN#j_$NXZmoF8**fL(f08\5jA89XH%! %K\etjm>,J_.(1?IgCY+RZ'"F0M>\$M]>`WlD9%AO0hn&3,Gl:3&X2U<8aV>UG/U3ULrjhYUis[e4(;)L2Yu7*4(>K9#$onma$sf6 %9J>amQsOT!9WtkYUK7)p9,o[ga&@K+oO9mkEjoc;&X0g9^)\pb6gQM2ZGhi`:2;M!8'FYCLI'CXgTf.@OS^9"eTP!%[EGq[otdJc %(rAsmF0-&QpAr4c%'hT2YqRj_U[WQ/:f3XNkL74C$8]kb%l@;5A!/iCBj>7:-4\e@[OTj-p\\4rLd9/Yc/?%[$%Z^Z6V)!(6YN@' %##rh/'amQ[6S.fbYEr74rOLKkB:IGEH8M>=:Yn?rB\,r1qHtZ4?m6>GGj@,&<.CooGQr^<@4B2s%3u@[:&):U5hY)RRdk5apBK!I %XO9+Qk(uj3[*qju`$r).mf=8jkq'&>R6-m@)7Q[PTO7og^U$j&(n9bpB[GD"f]gsDFc/;`]f?1/$qJoR\M/ae<52HlN\HJ9EuRWT %Br_H]C"Q-(ju,Waq.]Q'd\7WS#^)M$l@`7E2*h8cVQ.9^r*tW(RL)"G.24VDU(Uu[2+p\B=Z)8j8<,7&ABd6jYS+U]KaWHb_%^9- %$&oIN"":j6/Qu<%lV!EAOQBe>-Q0YUUpZ4r!0ke&Vj4s^q]@IsIqr6CK/GACXZ>@*+Y/fCL^)I8b*@o'iqoZj/))r)PcjbrjUW/:fEsSA/-.6JB05QDYmM02pMdVT7!O6'Q@1>hctd5!2gU]/LQ$C$Q$k:o7M7Tm %><3C-.:ddX?A'^<6(,!u%_G%VdR&d@AI5p6b0$+e4$4oe3GAO4'N/6fWtZe"XU(tqeUTD(U'Y+.i=DEcWu#r-0GEJ'VJECV,i2uB %1uB:#1MDA0(j%AL&rqK"3o0@0Qr>A#%I+56U6SGF2]K`lg\j8@T<`jR(W/C2$56\$S?H7K]FK+>j9D#*%_d2+SgDQ[a.$Z+<"lQE %`qn$"88UtoU50:tJN>W>)6OSf630EKB4\adJHhTiJf"SM1?J(_ee]OKg(T %0]srj-i]G,.@N!.ZG\K=D"IfX3ihR%m)RP;L%VT]g %qkWP2QqN7PR["mN,@[RY(E+lK0-:!u&SN0oAD#F?li;lJD7d*U?(KQS5.LLk';t(n1e`kQ'aNA1K060)=YWeW!AGbN/HqL#Xd(CW %$S1J59fH2HRj>,u6k=#bR0bk]%Q^qQYpuIkpg(MO`%LV@ZDe5OtM$(M'X+qjl0+;G@$CiY8j-_]B"?->m-lnPV/WBdnu\1:4"N"iA+Qg'R/* %oWG9[V4.i:Xl-^]#rtb[h/XW-a8dk>"G.s0#c=Gg#&OF\A(Vf5a;CDTP[SbU,eNu%.oDu\dMdWn/*eLH?lmO.3"n1m?mg+ae2l2B %gRqS*ZV-fAXi$\l6P%bf_-W7iS"1o_k,0`\Z>MP;*ncm=)S=n+CdS)GI(tMH.INE]b>cpg^'a8)=Kk8sCu8:B]%-m`3aC_a6<0$= %HAS*j_8JC2"Se:OooPr%UIH"($R[,%Jl!f!U29Ub.*70@MdPh)C$]a*9t[',OuB;5]=NaL$13*PKQ:FcJ-D]KX0aJ1AOLl#8C'0u %_3WBiC3&1AQm"AIGl2dB@N<2/<*t+BL[0\i6L>CndI8b\,(SK0]0N<]/UnY+&#Lr/f_. %@pU\O"Ep:lBu[0WAQS?=*$gF\5jN6E>1q1RFhFBf'?>hKXGm<0:Y%8lR,M2C>FB9C>39ZAaK61lbLa1^%NPR?&B1oXQ.nkNm3 %9_Z1$W<7HjQ0l`fNA[i=4Wp`V42N\cP2!s\%+Q2:r]n]=\)MQ/KhMZYNVq %m/!@k"'n/YNA#,3!rAlOK+Xa_#kDfq!`C_rJ-6FX#n:0*"?d*VS-_[!'(2b)UY%+OAX!4h>#J"qI:E4%Y2E %TIn-kb(_OAC#auU;Dqb;AuE$Q2KZc/$lhO1[35ac)YE6FY-t[BX^.fHXUd&_KVE9*#lpM3jB9Tr*CD2T@7"jN"F8R3GjX,eH#f2_ %#CpW7a.(#R/\Bf<(;AHWt6dAeDS;RDpMZ4M?taCoqN]FnH#b"*!XnTF %Es8Mj&E_YV@isjdMfZ?l)PG$c4B!?\jgm([dF"5=7[?$BfR+SJJ=Ki2B/bl@$hL0N3$Qf$P!DOD&rtd8OHs"&K!+H^G=E%k8iRKm %0[H.(%\q_kVBX6JI`dbu/^0F$(*(I&o-C"jo:q"WcM!G;k"-Gn'(uth45r-Dd-3Db]D^'o#kOSNm.RBCrTk.e9^D0"KmCt^E';cc %X?4fr2_DqV$14B"UA_eW*L%[/0s/-nKmCt^#frNM7Him8"te&?b1/^>/Of>_/WR&Oe5\N&/$X\&i#!roRSrud&Z!%g)+5+9;g(`\jFpqIq8[Dc^da-)5G;kpRH==!D%=i>8=SKf9t:dH^iT8O.,NLQT/>E %(KSV;bC_Zl!e2ueZF8FhD&@:_AQagtW+DeNnM:SIX5Z0$q_8Po:<&JkO63^Y:+-Ihp='F$Duq0==j`!s1gam=6Ob4=MD[7BLJP&fPs=$`+%A;h@3;ZF#/P-L(YGRZN0QT`F)l8jljB %h#[7FDAPS3\[F2pW=/4jd&Rn8Zl!)C@7k1L(:hhNN>sd!d!ah#BbVfE"uTP]Lo7p7YEd)EFL;"8-;69J4$E7;k7P4+R+E"LLm#c` %fbp"h,f;+IF1X)n*!54&GFf,9SZO\fdVpl!O`dZ;]]*`4!V.aRpu(4>KtuO]O[#]""Bg-#bL2l%0s'G>R; %BOY>r<[aMU:+I::,m&!gDb%?2*NT\O-us%7!bUT%TWeo3Ya.;B<&dpXNb`4d!+<*HD8Oq2nn)@kaDG,@9m+[&'o3mtD6%G&fsfL2 %Y'%PAT`rQbO>Lq7VI=B&d<4FflBB0kgc;iI?$o6RF+bDK)q[@uK2IYpr-0QI*Fbs=F"t[I(_^@G81&CSWR1Rs6`hkMVaWedp&a#O %mb[l3l$,k9+$9W'>#F31B0)6[j+cGE*Y%>UeqsZ6X*S4@?t2oG.)0R\]/3J(_/q*8P#ofS %_\)&MLHNk9UR].sd)8J@bt1V\C`^=agnFc$9k@%tJ8iO1icr*TRuqA2A5Zr;TS](L?b=Lk?U;4iK;^_pSt:`$j@>u/De2E`4#Y;I %"\K\u&<`%FZY8\3n\(%fJ>eSQ(P_`-HK\WrDlmj%%Lff,R4ra@MC'A:IDtM#Js$_F(6!JY-aVc1lju'Eq.(NuJlm@N6u4/!D!6i* %Xd/S4iuA."Yntsq\SC+nQ.p#DD,;aPfd2.PXi$nVg^huU_#Wc]OMh:b45$@S*M$O@AOL5+9/u6*AhDSY)DVL/3a+#g<6t_F2M)J*pu4:G4>!7?iPRfq=WU<9!5pQpupoV3iT!+5QBn(4g]s_LC.?i %b7?N_hOjf:bp:CMg$Tdb!PE;=^2hZr[J=2RK&dfVQjX9RXA8k-i.Z&s@F*2OIOT^u1,S+A/E[/Fu%d-0uRg]Js31H@2IoQYNDgK.f %&p+"Zh#'IpN$V[G^aqeDhO7(scXEfl==D.b7TVbr(0NeClg %UYKSr)[`DKPdEXdhnM&g?hueD(a>$9,i;@Vf8pOFI!6i9)3;U#rZsa$W?2hc=!HiiBMoQO,Ua74DsCQ!7VeE`d"O(f)&[-YUphd@ %cV^d[Em(/MN&j(cN(^H%;Ynto7RHW-PT=PTA5&9%N5W@8L8eJrlqTJQB8NQ:!=>#@d8Cj/^4oApH`K(D;elAEpDT0*+Vi(uF6G/. %Es"aNC_:;M?e3S;IYDVePLttc,`SY%M+k$>6RPj!Z$T\jf0=N%**/G\Wrcq+)9$&OqB<:m"k9:op`G8Y_3fSh3?R]qj^_]H=,jFoT=qqH[ %]\W3Jj#_N)n5:WR(A't^(-K-c=90e5k7&U>Za5T0eS1\@4-nOC]&D`PsO^BrS)@T%Lj>9E\ %;'&l1$!bBn\6YjPQAO^D"RSE..i*Y5/`Bn&KD*Jb's9e66fMAs._OJ;WUn1iA`?sIT6dWST*ZQ[H@+$i]UDi*1M9CbEA%Hs(ml6* %S=Qg;e"^E+k;\KDW$PLr1Ktk'MT`m$o%2ekCj;Pi[-7`BW0Ch)&lul;^nK$:&(,-8bc76Ad;-I74u?EAO/%8!#X:0QadSD4"N$9? %DA%0XoqH!S&I$#?;4O,6($+NL*F4LG`64;T'XU_56@*E-THY656'*nFB@-D@mK9MQMi=b5mcY_Y6)`?E.Jb()SQ^4uTJHR_Tc*PJU:cU&VXLg=u^8Wq('7,4qiXWeU#((MC02;6c^>F$NC6sa5D?a2T0 %$tm[=af(a44\l05KpYB@Ug:bq4TsY#8N\$Z85R."^I^sl3_S8E-ItaZ1VC.)(HSWb_"EIa+QJq^aL)a+j8,RI+%KP;dI@nl]I'f@ %`#Ss9l4R[o(d1c5<1^jedKkd`-NUii=?=G&5K/[Y(:&u96Ee8i;R533a@r0`0qb\GlHQu%hU5./r;BQVjiEWaYF'B,@gsQa!u'k0RZsIMolpan5\=R=i_7Y^?PjWb2OUDGg[rG9NYD4<>h^3Onr$OEE6@q_h2_M %a+`!_mPLsam$f8bDB`L/nbW[e@qg+Lqo7#&L25#Dfm#/K26!^e3_IaY<`(QlNMk2?8`AS_eOT#S/9bkFd\TgTT>c&pdc+f1 %*0KU0_KP2Ki.<9?nemr%3`JVX3Spc\r)>2QZkk.j)+d@]q#XHa_6+$p]6Q0m%X`kCG,XWg&9@CsKT0/'-D`ErB'<(.Hb0deT8XJ;:(N39:8S1W=Nr]YjIOq %C=Z?J*=@R(E72404E+ut<_R&fHLO\99K%;j"UAJXdK1fdF4g+&1sU;P9d%Xe'&-`[D&B/\j(RP;>jX^PKqO.=A!Zale'>/d>p;FU %%W;\;Neqe(^qM`uMIZI1?!R%"Lh;.c,MEUD4!VVYB(mG2[8`g_(.B0u<`Ln!OsnC;7ceGk-F#`@-n2jT/19dPr(O?.f^&7N$,MJ5 %#2eTSb%a/j`C14*_JrE>7H9V]9M3mqmGoa7:qNOWj%8J#W.rP.;H4mp[R=5ZjiM5n.8bVZLHs$SKmZC8VIbrHgD>,EC(1m==+h%@ %WE)\FHMk&gogm[2FWmi9bml>SWBnPC^1DU6@:qbnJ^&p#A)!>nm=8Rnk>HLO(b?+D[MU[M^`nmM.B/C^E\''4&fF347`I19e(1aY %+m[mm9"MMVYpA2g2H$^,$cXRm4pQRqbKkP%"N;1mQ!-eo.Lm)6!:)BI'gQ?T9u&\K96[#&?-!:)&HDoQ<`U8WD"SkoKXtR4V(t3f %9gOU?YY2Oj7KQuoBL=aUGQ@M@VTfsieqhl$e6Xm8kYCHZZ;Q+oLDL@)d38Us.3LTr"@cI!(*%Ro"A/Mt7V>5Ld@n_l8C3cC:EI@C %//)b20A@h3@oY.412,mk#Wi"u]8cNAQ<.&Hgq:1k[H4-u\\1L]n;`Y8<&+X/#R+`.)V&!2'MQ=kB,Z&uU-_s26W$.B]4Rh:!N.#0 %R+dHUaF9oCWX9jX\5`e:P>e13UP[I@innM_G:AH`g5Ba.pi$uaB5-XH8h,c8b;3EqK1+f+R0P4+[nZG')NmqkpnTi\..Hf=R`*\S %;7.rRFD0>9@uR#$<75TWeQKb(-[nAoH %nWP&=Yt.IuZ&'5>P*j2<`dlJJa\bi;;aeJMB'5>cNa6D!+Q:h7VC*V7S=WYNT2k_\@O+T]@"jJ0lqH %iZ7^_E52cU![-\6h*$HY^mjMVS/ij3CnVRN3'N\JC(=WEn%`4r`b&?!17XN6]9K08bD?3[]_RU#<_Dl;,V4b8+8QnSAXtBFMBXSh %LE]/h_m#\O!FinNo7[b*%$V9;;.+Hj&0?_I5\cSSb>Gul]^eW<.-:=l:%MMlE4hP,dA0*78-Re3,3CJL2_Np4`EEa$)'?3i7FIXJ %^?;R*LkQe<84`;H?5I]U[Id3]em[fJ,L/>h`#RdkOB;$hXHk==AnBleV3La9@V3D7PK@DcX9b'd+b@^Z*#Lb+>>B(_.m6\*n+3*% %KOiIE[K_'CA`RICH?V,!7DT67,V>CZ8\?oi81GRD2Kk;iS8<*]R@(;:dq-BHKgYPnBZZ':*,&iMKo(N?m$F,=J#O9ncKsX>,"k;t %7q/c=qdVCM?O*>qEjh++/3#rP>mu1EE<1qs7b0h+M5L`<#7";0Wr5XNEn@h(:ff`,R4ouP%Qc^ja!nLU[->E?P_,Q%=\-=Mq0ETK %(e`gYU=1H$h4BUc1Z86ICC`B3\D"r;l\2o@*>Z$0H3eY?V6.7>co2AJf4Ar"((Fn,G-HOo1J!IaM/tV+^;1*hZ&G@i"gR'Y&F!%; %F#3*&Om>'!Oh-lKoh=XZTKI@L]_6F_.?hh\eT,+6Zl7TP84eCKl,Vj#8IbD,6q9Ha&$//p61%%.,q5h#"pK[).r'ef&rHufVIm1i %:nm"bg*@[-A4T"X,!#pS9q[GWL3%?8JRDSjRROfQ:kErtE^d[rdj1p6_*g[:*]oT8+PYGF$7`WKDH1(cBl7,R1!le>1EIK/ZE8Y[ %GWtA#@#mE>j^a0?B]r$u#1LVEE2IcFjR/+J_N.#c1^WPZ"Ps,2>i*4u(rH@QBZr@id2EkR_&Go(U4cXf7]XBQ;YZ;NZAM@E'Tges %.Cf\L!HW5&_imb?ZG"ZY&c?4bilqKj?nK;:TNs2\8h+FU*di/h0/`lq=Q_rHa+FN?1,@YUO=KOT"*oFDj"jjQ0_SUU4^Ke])5^5" %:Zd6c&Sui*@3[&B!;m\l$/c4cEj\]3 %ohN^iU[=p"Y9j>=kRB3pa#.(_&4/fY2O]\SLqsc>2>)XBiABIb;`^@H15Rb]M%C:%+E,_0P/Er(3HMlue_:=[7eCgi-,iQnE!F*2 %BeT$K`C4:Xl"goDFW"cVf!flRU;M% %SoX\G,]d7A-q]a=UCBp5T9^m]l7-:COn'X8;-g<"5`HC>7ujFdd!@M8!Es!FqC-R6WscKfg-@^Z6f4Y,h,j+"Q4JoE`uOE:dW7?st0s_:*0DAfR]3 %X]ACRLLb_^:fW)b6q4eOON`pP(e%0GK3=g[D7Bk+VX&khehQ$IbgZs?fU-2rB4@FQB&a2 %<^\McLSmQ-DA=4*(QVt./^e5r$15=&gD4p?[-oel!.Q*f;c6A)(?2@6=,N_:5;`S&Bn0VePu^X"H9R'L4hr$RMX*$4jY-`"EhSLj %Z>T7Emr$l_f[jZ8E*KM"-BOS3CFIV]e]L+0R&_@/;oJF(0KTVBn09&jF_i3PJlX--+_C_N192#V]j`EgFg-dY7m>DrRBl]* %Z[;;59Cu]$4k5FHVeS'['k`(4QWP&3k$aRV8hu4gO$4k*K)^l"7)Ek9:+c"nEDdVJ82NUc3R@21nu<."!s(`M %0]pl*I2"C[P-5@sP"#3Dab(GH5[B&q:V=T)&\k8SNI@2:.`llhnTPItX/%6g>A'o\?V%[Qb#g4c6*N'(L:+\2 %KJr"QPf,HjM`tALi\;YP"8Ih[-`&I_A'O#5QS$XcBG+cR8[q0LK7I*&(Uu_5j;<(sV"Wrm\ihee7I:t7Fll=V$*u@Q-,h>>asDB' %;Mki7%IG(YL)@qd%!5($m5<)qQpEVTh@WmL81N?tJ&%IZ\sH4poP%tS)5`[qadL5bV)0bj244UBdnCC]Qa$:@`9LF`9nQ5/Wu\ %!bO/]f`m#A'eBcODiiJ'kt["QWSjNY")tbegMlOd9+-k8OPC*!dk8Le_EnIW@"/aa(fla*Z'C]PP)Lq)Bi>W[k5gHU;:>WO/i8Q. %/#tlm[YR^e6[6dF+cH>+$9kCFETSmNX93sMk`sH\_.tApJ2-R-GPLiHnr')D3e&YTm23(S06%E-[;=/DIjCah;nt@QRqPaVkQ7P_E?%s %N[-RB?od&]S]tB/c4,XBQQ:e]$[CZ.7`[lWJD"Vd3D3l14`XMh3G3Xi$9G7'W)$/O>u\#\D6%W&nhF#7AjamP-X*9I2/ij6ZN>uq %oYPXVUr*GdTI?eR@#OB";k0DdPVs#n\JsfGRDB6u(%b-'.,\A)r&PrT:4s5o"%+H4Jd+dp3"&2r=l'Yr@aO.JYW"S;nj`l)_&,jJ %&hsI<58_R4QQr=L,[]$Y1kL8&^9g4lG?bn+?03k9!A_6l6:h+WbbaJfK$FsD]E:eA2>dr*5B#:OO;kb4.sXIoHYWl,&Q$k@Lsrii1k6)eG$@Q %[mk]kas2HFVTph)35RjNL(eL^ %]hpFli]%AiP#++[9g*IA'LO,o!#'"QD!:3eBq^W)d8Bs866meG>9edUE),rP6JTCrZI=3D3f(;f(-S4![*m_ar1W&/s*p/qAQ5]9V`SWQN3]>;3\%W&o:n@P:Z3$-\KDq_I:kBFsmRM,W*?Zp:q$TG18"-StA:e/=3IL]8jueAgW4+Ta"MZ %5bhK\3:#r+a[BN+E2-a>PpW(bPIQo6VUc/O'67:aB0bc&L57%a;U5djR;N70'B-^^p"_.Yu*$`FDF,"c/`glu#c7&],U3 %XG#A]22eWH7`IC&fMB4R@(Z^=$J6^i!cats"D`,ho#(B]/;>a3Y6tML;.!,,H.lPnaOPFid$,I2-p`YoEHHo]H)N$5E%X5RAOQ"X %BjYrjE9F]Zkg<?5s)s5kkh?.hAD'T*(i7+t00YZT^D1qan]73mL&%e#?`t:f%CL3\/9%gn9K58Xp!TZ5Pko$Ii.q'T]+klqKh$Q:=g27o1Pu %=;0,)FJ'FL&j6`g8RRa80:&lG$0'[uQ6D,7lCk-#2JH\`pHVkpRr&2"jVhZg'+BPWH6p5XF,AA23[NkHh6p*J#W-9hJ<7c#KdsrJ0mifPIJJiQhTI73VVH^tKh$F)C(+U*> %qp:U6qSc^XA6hA#SSP98]pI--'q%Qc4^518B8uDfPSGb1I4t-2#hr4!$c./Mmmm?"Qi4k(kbc0'B/Ro!$Y.DGh4>-u_Md1u_FI2hlT&.78Yg"hR&V_Zt=JQG_e-ieTnqNK1aFH/si%2^m@ql>je0W!^6^:]+1Oa35pNii(64AH"2Y-QOt9n`)]E&340GnXu/BNbbWM,[%pmrL;?Cll"-g:`lST_KNL&=&=^U2#>:(8[&?qeJ9#GPW#u)]a=VIhYYnrJWe`SMTHMOqir_s!O28hm!HjYrdnYbD2HcV]MI7"HfLUK%k`2sP2ML<=F;1-OJCjHi+Y_N%97iK4tVD1f@@"PGL0!hqDN"9E3Gn;--L %]S_^M@7V$(0q`o'"&74DZCM%(e>C(B2*uj\bfPgHcm"(,bK[+<-ic4HJF[Op&^/KWF/aeKR^J* /&WG&Fl0*iKp5lkq*3@U_m,LA%L^.3sRu!8Loc7&c>F %=:Nj7K.nKh7[0qMb-[XFigi %(i8HP]4pJTg:W$B=2Udh@/f?EK#KjFe`?P-QHG1.I03qc'gf5j@*b2m&KFV[cWNsA*UA3YZ2QQN,(@7Q/V*ogX0_%tU@aoR]5\b% %r7*e@!?YQq.^4Z.9a4X<[HZ%QETmcQ.]tTS7)bEmWfD:AM93"^I>n:RD![c3Ro %MSnkQDqg/hjq'pJrQ/#*lr^)ik/=N#`gL8`3^UrA+\W,mcJq2"J4W,B">20b84-=u+3BM_6<\ %__&u'5U$906#OVW8.Z5iS`J-\\_DG(W7]:bOR`.C>)>6?A>k+3$ZL+pllRIT8OL+co[bA`hupa6QQ5Lg(;)6)!abEqB"0G3k5*5B\bH4!hjO2qRJ,WPg80kV%FYm/k7o><*.CtXMQGf0 %P>O/ABf\jJXu%;ALgPI#MLqm&9$qUCBaG4bS!`dLr7po;d\jULTLMhK]02D\o]:Wcbs\EW3R@q`W%lmKcSY']l5^)]klIUA0%C5& %-CPLlN"\NY]da>1JF6_"2qI70%)s8K1:7+)*,Hp3`+$&Ih.Zi1@ca*ur;^.O^l78IP>SJZZtZKHe2K-&!?NW-)B/Of8mXda_GY;7 %e%Jd*h*[Zu=hOrEc,6(8.02SgS"ao=dR.:rhpAMKo:NH%,<2OSWq^U-"jIb%H"o$@'V"U3&QG'*jsD`r-K/bi#6lRf='h5;e0>[+ %.!OiQS@BKO8AQSU3!7!3O>0^KZ'sp.4VJt&@9<8,1^M!Hmm1Xh(bF>pabZ4OT\D%oCG8B1-j6n9`6g5H+KgMJ*@*_!^d-RI"To5C %dSVbo49[-!3>I1cGZ,P0-q,][8H0S2F!./5B##Rp]$)"i,bdRaV.ebB`_W?16Hnp2gNu`0o#,hT>Y=VYQBpoTD:(WMSA3am=R.42 %9W*II%s$6)?n)0,Qd,/(/V'q4p>u@^T-9<827H^+Z^Pem$sc$KC-IUi3\'2q6#DsfEA0--V>B!TTZ>".(R=RAFi97"6l3ISi_o!gP-M:($#lbBHo=4Mk7$L$R-[D`fuE_^=E-"[n_(G%]j&g%R@'>k(i6LTuiB %)M)>pKV;Ar'T7Tq:P*">aN=e>=4"==k+a,e[piU!#R+OaB2idQeB87]:e48o!Q?=e2PV!"6a-Y%Pbnh>ZBR?W&Bma$A.EAu"Q;/l %./76TrUj8K]\#8,po-A`L),"C3:E@uJ_T)s\9#a#)FdZP&aD,27(t;oZcp$-E&eQ>acZ*\*%$Gh!r!--.Z2S%48m0a[3O %k=h\ZnST"K7>WU<]f'Fh:(lP\7Q9kF8T1gV.s*Y;H&MXi6F`4F-7S`f6%NaFab521H"flcZrK-mJ>nE&UGN:/#%[IYn7.&/qOo>< %&2>%c56Z*9hMqG@[9*NA20s9:=p'H-KFBd>YlT^-,8L]l%eOh)286E&JX2m>Co+J14oaScl:'d-e1C3EIiUdS0dui4!ICJA!f][= %`,CK0X^GPh:=Zks#j#co=R&6uJ=s0->2YKFr'OA7.b(A$YokG5\sA;t:`(bV4P_5Eq#,q^:?RT2G'Z5` %N[aBejF:a,Pio3)m'(j+(%\s@T9I?Dl12Xrn=B(6lL(Z2c@QLUn2Zs"M+JWkjf:Wend)-'6$C%*'CgTXCCm>4d!?G%o&ZJVgM>d'gh*ceIMJluONa>''%ess?+>TXNo$OFCnrRhQQ7#i+b6=, %00,F)5!+231#!6Jk#Jn@l-eo#G+Y&9>(*Vnb^o<[>Op?KVf^:0q#s>1^9H$%UNMY?]aD#sBXe\_K;c9]\H_V*%1hZl_ %;EWUun %[hi6H"PrSpb0$g(3f!Hs4B8DGFZ/$!kPrHY"VNaM@a:`B4BJG8&d%,U.%!"^$ %*\mYXS<']b%t`_L*"=m9L(Ub`=@8p:c$6se;:MTaG7TG!S=0S+u%;j`Aq/!62a`C4H6^9B(oLr]^IHj(u5S$A;,1Vpr?!hBWUO=Lm2i"3I$V$U++J^ahZ`[fE) %5fFIo9`Xt!!jr>6>b9^R%a-BLRtuqP&Y+Z7.oDhpU3?d('3t0-5SSf?Pk-"FP5*[o+-X%-"Jt_JE#.4DBnK/!O]!H!N'P1B"rCr" %27A!g6%p;Io]Y&Wln'sDs*TeA)'ptjdslS5>59]e8lLV^b> %]cK#:0t_*]'F/;.ZD)ZA=b2-\Bi^r\]q/iT%=3E2=i"QcoIWP=1:gl1<(o7rH>.N31t>5tEG;_FLWMm=)Z;[^3I(E8(E.rtC:iM,QVkW0C8Pc&>$>E:)`>'#X6GXC7T8JLUqkti+6MO %oDrr2RLt2DZ*L($QigTH6)h29OP5d+!H+I.\HE.H)1VaN/LBS5>Y@GYRF.ct0o7TD=^`3\bS5dcU:UaUkI4DZP"7bpVlB?VUVTHB %OO3W-u.P@4:.QM?7_j.O]MMeIq[1s-Pa_WIGY*@[A<*Ula/ZZBhIbQN_oL1RkRdSA^\A\tb+j2Gu %l10+;d>gk4\j[>dTBd72/t_MH'D;e/DP?%s)/ld'YE8>k.^"m+(;&36o%qMY9JKY$80lN:=H[o`8N%:?Bpe0CiWD,S %l00(hCAD.U@hY\3;rMN-#Ip"/KS0r^,-kE"&<[T6?RWcZ"^SG;AJ&h><#^oB[!3N#`_n1D7c5j:8()o$PJJmVM&V5GLmTkUkT(BN %i['Jq]5^jK+G7_1AmV8+"0gT#nc_D"6M=keES:9/H:te8#%M>V64RM\00 %_6Z;V*)];%-cs`::u#a94q_V:fXB8#>*uJ?Eja5I6c&Y8NR6$IpiZGNNC8UB8/4S47LI.0>`B\9*F\V->&0"<GI+ek_hje?jfC=2(>^8="5jO2pH!i[V#_($N31<;2#h,IF0j9YGl]%(DWJtSkDUR4^tDHeB]b_YSJk,F86)Vik0 %644)1$*lY9>=L'goI`*+!.YnL2n%[a*VZMh<7m;3BObsE6r$L:5^AAR6$Fe`Y4NFWl^>B8a*kANh593&ft3s;$Mh>`!-*+jT*SH9>i>*,0$>K/$Z_2l"qA-Di[^<3hi^k\q;+;ZI5W[M;.E1Vq,)Qo0\ %*%Igqa3+^F[jK-n"LIU)NBdSmNgm71@qraK#fl'[!]+_PZ6eCm6RCB9em*6AO\RK,-4)7q[kTFPaGCBA=3-7/'j0gTf]#jY\!eo_ %/Hr6j2aTrcH?(j#%*0Pi_?o_po\rj;$fr %;(9c0$.eDVT0gCc.]&g3STWshYlj3Jm:?R)A%MN.9$Ru-Q78b#MD`UO^RUX7(LB;-[9OH+]o0AG-Y0"pE:e??63-%uOiS&!S"X3H]ai %/Mq&`[6,k%[CYn$,\Mtc#:&W3]7E'm.%Ud^JncCjqY!TnZ,j61&!2$i-B:4,]B`H8XD/[OhpoSU$Wu?N#;*K?f?dImM1DWoCnQ'B %2[Pi$W_Wjpf8Dcmn/PWLYt`j&NJI)jE6Q^c,ee"p93o>u"4\oU^P7JfV(-1*6Aq9LiU9@5O[7@I-cW?cd@O/H@AKWW#qCNNpE`I% %6jE=a)c2d+l;035FAJ,3&C3^[GC%$T\=4EUI3djHY"YQU*Y@4%_Nr[%foP[B@EVXFd;h>5UPj*C&okt/ %!\h'[bbF^;$U#ahp/mUS:jl1\*#"M+'-c6DrK4u#3#bGECughm*8&7qD.%/sgrOQAO>EVr@nV,04CSfs!Vh]M6kOKE]5Y*u.Vm6g %>O7dc=KWZ"A^G^ql0@NS-k=2=c!"#V\XgFeU?U?Gcu8Hh:uu!"3@`Z;[\+5hY+;?0=+$*L@]!#h42Eh9:&2Ol_o?M$)tSr(a?_.& %BXb!V4+_$t386s-;.-/l^utbViXSLJ+%YUMOC.3/MHW.k9gmAWbeaKi`XC5+U2\C1V'nT1$td#pL'?Fub72)6LfA:_=t!8\Fg9)?f-GKLna3_D-.C@%'++1tW%9N<.E>Io$JL!FqBS?l,kr=GWY[d-rI/qiJb3'*0s<+_nGT,sWB)Tkso3 %^p(?AhVm_YqX+%4Yh1rsG]InL\@X_G]_uBO3&oVt^9W!#.eUgRn+=rhY>5,VZL4LTe'mFKiJ2'Dqg4+AHUl*eSfDZ5>98"M_0k`- %l2Ku(_qbRD%NZ\Yleh.^^YV%Oan61*^V782HG"ZR]"##t3]]B.m[P==^N+0nga5Y'IpP4Kp7!k3QXg$)n&#G^>LY>dNE9ZUJ:j7l %W-F2qr@$b"$b@9[9&'H:-c1mTRoNdKU(f7b:_9qLJ9+OG8>@LLrY5=]8OYW/=S5n0ZOKE`J28-<*p#,Ien*oY^ofIA8n*HPbI!g%I9kCr)ns_k98!!1g-dmW] %g)MZPp5dLB:M/'Gk0D$!-k=6/R36.?)$ogMM-=lgL\ZUDdtDc):8l<46k"FB&s3E2Q7OFm7`B!C@SX*0%HRZgF68ipV(U\FoIZoL %R79KY:rpLC(:flUpJJ+J'4m'gKCC@!PbD_(>=ke-n$ADQ$g8Y1FV)K\mr>5aRi\nP-rG.Af'Bsui-8NZ/(e?K=k/h?GKn^H3tI1l %n]uuGgBYpX`Ri/b]6h_8e#D@Xgte6AhW_nSs5*SJg5Tf[kl9GTB6cJb_h)>Eo`K@>65nX'I67GEXupJ2k-;-9]$((O,:LeqHt`$[g_LJDWs?&-OSTRh_!EQJa9:n?'4+)LBm[``;79IO> %`SN\HlMZBScKFM''ib$^mGi,_WH*X2s6I_OYJ=f*PKo_or?EflM)8a]kM*tX2oT-HUL&Yskl0(RCDD'E<:c3]pSo.1;%3E()H-flA5>[QuI`FZ8*VMP/ %DGYCm>d2I+EZo7&T2XS.Rhj82Bns\c6:t![>.@cEr'/Gh>79jZGND86I]ZXo`cGqXJ$PNjp3U\b`ZMZn[*bLIQW=cG;%e7"HbQ/" %#+jHhDTT0^_cF-+C"HnQTI^dV0\IlUp"S"(Dfk._f30>E_4]2+cK+7AQ[pl,GYAC3?t;SBcl %I[RG_5'h=V4JeJ?p_@[8qndLON'=h`^%Z%UH^SMFJYgYDla*ePqIK&:J,*A5kLCLKc/In#C>ZP2p$m(VKWcKami@MJ7Y^!fdE1Wu %?*MbG#H,U4h_(PU!M9>(s5C5KrN6`u@Vq(GYW"`$.rW(O2VUn@9R8dT#PDKQS6^N762b0\s+qnN/X2Vm:e^0M[njQ[ebc$U+Us>?iO;g\]1OJ+_4[G\;;H %g>=t%cORCDT'S%)Ap`A(o$RGYC&XWp+h!1;Nh2Dse!&HbkEq@VbHL+f4B54%#1i``n*m*I4o)dZP#".cqLdOX]13*Qs#8hU:XN^l %iGYgY(Gka>dSIWh\'<:r^,UU_J+$4&]%T0:p7:5EqJE*Hf'9ljYE,$n+3WC8UFh^m%TU(W4"pX0$.d8FiO#Bp5@MB=,kO<96"E%7 %(N=tL%^#?KclBgd$k;*BL:Ynke6Uu@rRp*.IU&66^]3]\pY3^n7u,D+>=\SfgKuU`%bHX=^7el[dIDf1?5=KQ-hG335%jgas8U\' %7c;J/P99`lp4JhrI!kHWoj;Li_ggaWL]@!T:]Hj#rZAo1o7,i2QQL2!s8B-d!]RjlO0e5m+.!ZRrL\>:Uj'5EjK\l7lI*1E1I**# %RtrSEOE^AYeBF&\0Q8hko:"qC`L@a%qLk=%>cd*Ie,MZM`uh:GM,IT!/&QEH).""Rm\do-&R,pX1@a-_VjZS'C#csi.I_p0o>;"9 %J)7U3a4e*Q>[FllGQ+P(q*2`GXFlkYJ,3aNjERnQn7:FJ*350WO7dGS6A.;I %gZ^6^UM3dhm4-">NUIqV[ZJMtN/RUIH[e&hZag\j4hTo6ipuqQ5Ft&%3B^tDW@qs:5!QTd._YQ':=kftT0;$m?$8OY':X;kH5cH& %ah@=`MaO(a7#8A=^Z0S2R3kO066G#IGs%8p&jA:Bp'hV?"4<=iN1=PQiI/!Ui5Q+KUKB;Xsrbh`Z/(]h( %/@W6`[/sTY*_@OU=Df35md-Pt;$Jh?)nko\Hi@UPm.]97gtpdiq;P-Gplg3q&P'^ue+r1[$;>C5PfX%jPb-ZR8'p"00\%fH?j`b1\M=Kr5dlGD'@)FJHahsfnaW^+?lHD %;:U26i6L@_AIF6,m!fP:pdV=>K@Aq&Ii:S(+Q6ij=4Kq%VM-u)l+$M5g,:%9O8c\)<_JVt%/,Vt%#47pT2W#qPM=).[?^PaUZZ#Kj`Tl(+\!"&fD-=*DhjZ3-rr8BU?De`lX'Q+!d!rV8BSW#N. %^CO>[rTOaWch_cKp::QN%8"#06/6GiXI\JNS!Tg/QnpacRfAHDS@0Ll:]>@B>hiFT+&';fn_Ob>bl%J(lt"4#(QYEqn,!"Ep7k^7 %k7M"YKj:;PP92m$db:gIO*8eYVX"1H)l=dGI1gi;OgZG*a.4Ht.0pIh25`ViPaikPfQIS=L!bMAaWu[soA400k"g %C?P-DrpK;SBg!'FK2:_rVpCq_Sa?#V*M.ZOFLlG(dF!U?7A"Jh!o^F15<5V]\R:XlFFf%IrQFr\_eIq$9m%99S>d/D/5Q;eh=05` %e4#[.>kJRs\l';"=c!rtSc,T%j)LNU,Hp_u8[c-N84LjA3G8GKrrYNt-W;V>d[*MnT,^_Mt=b(SAi7gcTu_ %A=LdEFQQ;%a$lod&&'Zn])7Meo'`eT:EKK+B7(Wt`67(LIrFLWI4mMBo6H=CG]Z"6e+]2i:-UktS*mm))I(7;cf>3?+(QY0`/h2K/n:a\A*Iep"B&jbJctA:X5Q5S/M6YO,fPSbN#MD`@&k/4^G_4]6Cjb %E,U6p'J"-6d@%o>J/KbG,Jt^NZG!l^nf&rPN`n;/[(X5PZT_k.mQT=9.ADW3T;2?pC[g`c(:VUbNtrgUT:@Np2/KGEa:1G5/G;i! %p:!haMhbh2SU,=jgi'r/(E@,_A:#6.SS*kaaio$>8mPM9qtTgBdJ!+uJuM/GJtCC%SQBF^Vk:r,IV7'3`C,!FZH%1pVauZMc7S:l %$@HL6Xod5TqS@2rn*FHPnT*p01NgCaADB#PLna]eH+5u&8T_OW7Yl,?k1df<5u17GYE+`\3jt\pWoF?FNPIfcYHP!h::Oa+N=X?1 %T1g`,s.-;ZFn'#>a].Mg]ng6[0bbBMh@p>2/)]RFnmi75HC]mP"lqX8SL?$hu$le^O6qXEk>UG"jTGP9qIs8;O[G93Ao %4jJOsZgRVcYO:hgqu:p(c/8Ns1XS!Yq./f0?iTM,qU;YIEVI0&pO7,F7eu25[iaCMktp[7q=a70[?p2?7cBC"0!^:1L4qp!lf^AlXA2g0AQ^SO0^^&%/lqiBj*h/I-k+7K1!n#u3YmJYj&q_/!Cf/J^srL^FNpE0=u+&r8A %hKe/[a5Paql&AKRI-:4^cE@abIHuMEDWQNNH##(r>:5KKmGjc3goK>HmS)Zdh=j]/S[pEQHC6u*_sZi;>IV&=nT>qdFoB5H(\_9cBC!5i?i'-Ff4mF9`oXnKVO-/b>=X0ip!$9Vs8'+'sBmm<;q/GCTM_>H6km\))LB %pR=DHNCVDH4R)b4:=NX=$Jg!b.e%#MJ@kg3a&H_4Z7Q"7cJ>\6X7%Z:IQOFAUi1EoIrb:Q=78>aonS%0]=n1/?f"?bs88cRIt.3n %[r6ceGj"_m8&*jTi:\N^9V[)!J,.&Vds$!8o'Y[js6Z4sOj)P42#Z1<9j-/aH2N!tfG@&%+$FjmQhti%]D]mQDnkqaB/2fLq:a$\ %IcXo7oZm7-qtJr-5("XS2\+LGP%(-/?-5Snf+dHFa!`?h0jK[GX&o+rTACBT'1G]4Zn&R %NDE=LhsF4r5b*A+UqAf\[N,LhBC6eQPCcbB)ta\=[Z$a?8lR1*J+93RKZP?t@7ZhBdfNOJjf %p"\S?rgkadC/N,T+&1t9ACX2e;e?H\q.2PY/CY\(1fCOQ9#mHb[)$,NXdD9fb6uK-OD6)8KF(J]q"*XT[F0)*nB#f$Db[!/baA`# %82ud2mPhJhHp8-/C$C(^qX*E[7Hd`\)S]L-Q2G0Je*GkYWkHtCU>PE)NWm3s9>aUj$mr#[qlc`6C_e9U?R6bpqsg?I8Qgq;"R:T-=-RD3>_KJmW2A((_OoU7c(W/>gns`@p0-AZb_5]1]H1C]MH,_o9W^[F6CEI %O,k2"9@e7WN?=LPZda?$E!jR(=.J@R;bZcR:Vl8$cV$LAgccUcg1^FG&#N,,HOBT^cTR]C&%!o([[5dP=g4:.^U*Gsar0sA9#es$a!:j9EAe4('M@j*>[2B2q\4TW$YfB?/r<,m6(WlX^aZTK%.+r2m1I,Je^$%9Vp8nhtH%tnI1(b3BfP^-jUptsL^T>^)(H6ms`oA-5hD.'=3@k$Z#L*8kO17r57;=#g- %,!Rg3VaWu&.q,HJbZR>fa=N)'GnE-B5.=*W'sGa]/^3:>DK>2"TD0l]Xe@%^3\;\9lH:sC,-Z\`*E@i<"hosB8q*`nI#"o%pdN$C %8m3'[VHV6Gei7"JbL6lb-N=Q?nCTg>m_puZ+e$k?D"J)tm77.SS*pPrqu^GdA:F5B7dh?9e]7%E@!To&Nu!p]@;LH?^UJo(=/?Y9 %qLBG_oDWPW@B*B).mQu#.#n[h'em5j$_Vb-+j@Xh`IN;4c\JX<:p[VbUSLgM3cUF?Qg4^RD`A0IHV(`XP^:;j*:NhKm=SXDkR+nO %dXFoJ3^fCB4f]#_R,VZ0pn3P==20D\,k9T]F.o\E>HHK.k$5UW?AkBbho!',V4C>l,GnqpBb#t^52][4"&!IH!k/_R9RcV>S2s7O %;,8oV_[.`e]-\ %Fn.%S(XFq`+Viirk@Z4.)Jd^r.dt@8])2u=g'(dQ!Dfp?Nqk-]k)P>sR&>H^iNRsDO//?NWle^X.r0h0FL(Q,i@Pk,Z?rFu\UmgM %%$jHY@p1P2>5PaPhL*MQM[&l9i&A=uqhpoU`TLUd,I;HcCK[l-#dKe;h6e/=T=UB.Go'N]t$h0eLPn?nXA?PP>j(-'7r0Z %GY)5-ClWfl9qpZDWjWaFr*Kb#'0`8PPLYftdaD2aJkKf`FX#L,]l*s9c&[u/rAa;0QBoa)Y$IXsJiT.Nq6O@:N*.:+>OPe=G4\R] %HZ_8W*q5@6q8badXUl/XI8V.H6"L[9ONP.9TOtGqPmncSqj-$t2IFQ2O*Sn2lL+I*qr%QroBe=M9@VeqK+@(3VS==;Nak]3.]*@, %[`=dQ`IB(fZG@_Tqq@:.(1V$a;c4NEn\6^#KqER!gmKc*#,8[lp&*h+H0\-_B>P"7_\)[f0Dm8onA&Gj,9QpEeC])g0;j)&@;^J! %!g/pi'rfr[>\UkG]0i>*qq]5)qK#]Cd^`Bn#l&FunT-+.3-WD8kEf?nGX8*lp\sD?#AXh-Z+e[)POic?IfhHkBjA=d2k\%P5aD!] %>LK"/QIUmPK_=.%(#I..Pmd8][)Q]hfu"Vp2a8tn]G84C&)Vl-IKLof47H7Of/JQ'f-2:>k!]!L=<0J-i4"`-[09\'Y/9oDm0;^@bnP"B[]cNi %Qhgp;`Q7p;O$A">k+trg`L_\O.iZ=)S:"rKo"G5<7fd\QD=iLX %?/s+Zd0CuHnQE#$-Ph;&Wo60\_LGHofs]7["^$]-\(Z1CS@K"BlW%FVf!PA'fmU!mbJmpm$$/.c$?O[5QsGI:&njX]l]TO&G*Bf? %PO6W+GrW`HgcAuH!om2XLtKDO;!"H%[Sb_/O3[@7dO4GNk$!US$YBOJK,Cp0C]!64XR36iCam+0EpIai812SERnsi0O1hf^c83S^ %Ibo-=Y_\53\Yi3r&%B4)Q?e&Og2Q*smtj@hrqn^949kr:>UR!@R<&;Ri\)CZLOl"d>?;eoFHR^6Z,r/(K`c/!YW-9'U9F$[=d#c, %:QVg6"PPR.cA"9e047eg/=WkjmHX3'<%=!qoJ2>@1;/+WFhRHYBk.YbMtDNDYj\8KjpSD@22dEjN9N4*4/e'I0;b^9G4$nAJ2&35b4\r_t5TW.Vbm(1uT2#M[+i<)-d*fJq< %pHEO[Cu`r'Ces2lFDW=lqh]%=5;(OT].ZF8c_:04P3;:HuLC"Y28[Ee/k]f>N&->V-1lM2,Zg,r#"uL'B%EVlol:K4S.o!R47,$X8e[g-^;!DNo2I&oG!,77/%9N7 %(Nocl@dbpMX3gk9k*O&$o$[^e9XFEg!3Dpm4g+Ed\J6e.So7b5K&)B5c*^'r)7(XM:JJHq2m?[Y`_Rse-9e@?!udR`*#ZaaHHSb_ %#1.9]KC*3(\:^gb1oFRHB)#bj'+LGFo.*c3(\UCbscD#lDbW*M3%';R6aff@C*:q$4\`XFK$+7jMT8t5WK*e9-(kaLt9iP.+,M@fg9nkq;l?)'q7BC3R`cP %9CpGsaurom9($Y/_oTCDPAu?pPF0A04a%2n>jFH2m8l*a`Kgh!p15XM`b=NU8C[afc0r%QZi(!8GD'sM!NgE=>M3?ib1#>!Z9ZA)BAd&Zq %f;,JIe]TW%^.u4'fRAZG(am"A_8WHR7Tcp8(oYEjJ%f#&DDG,cho5F-;Q1IJ0C>hh51k7BFM:AUV!Ie>&#]FIM:/nF:PiPFW(=m# %(QUSd.J\nsmOmW@koLZ.&WK!$[$8I]6s0*G=L\U.1:P'Y>-h7e\43h@MtPfE+-MS787X6AIhlEk@@E7D%tBejan+>a-/r2n&!ong %p`1b^"MYiE(j*&C.6/JRGJMhS:&#!2(p`E1qCeDpF7D=+2T6HbhaTM5>!6q"pWf_SH%'_B6Q.OTC##>p-&0a8hkIUPCS=DKV[=c7 %9@1Ksk8rrS+n?e=["Q:P>+?S=^"aqn$VLjdc/B^&n$86mkB7j]l4s^G/>.6%!o$l1/r0rdF+",k[s*?\CtUKp55N-J %".!W(qpA%HB="R:^L6_&U9.-oU:Wke\6lSa9`@T;GLa!("jojf<<8!?c3*3`]+7r=.%VK7HfEW)ph6,:V^_4pmsc>OV&:kNO5dlN %D>)3]8s_ac:eo6#A`16'Dl_4ie*A7(rd&A^IFg'`!GV+ka26[3j1u.GDX"V%\a]OtYsqrUoQp")r:p8apr6H6/]g>\^B/;[c,TE& %*IbF3]e:BZ;]1bY?pK4";`\;"pTtImcb4:rM7tK![a(Drpu=#."8DfSm9?*L)Om^fZ/G*PCV6sN*Hi6\r'9\_33u3.A6h7O1@e%uf\(JUXbN\Ad\M2oU%:ueFCFG1ORQHssQ_(;iSd@(O-B\s&/[O9X2Z/,*;R-1? %Zp0?W9T.W5#CPLVWle_2j %eg<#gT@UtSrSQ0N3hM>!-seVU7&AE"\/m./5#[2!/'UcgRr\,I42^`["&&tjTMJ07k\K`kN)q&d,hT]"[ccdu3k?bVL'JiYhehcDa6(#4 %k!+=V(4g5/]?P0+S!KF7tBcB>W/S'H^+@\U+#h>@*[d %>2Iq-i*\+fRN&Z*BWdkn$2baJ&o5*XSM78V9:]'W5/40q"6D6/A0aVqKd.4Y@?8($"6JYq?pe>Uee_=:b:D=D/E@*eQc52+,SEp( %N@S3JhSY[J_W8)\Z%Q9@69)._WnO,IbGph!MOc@T=:.?eaCTfZ,;:55oC)?K=c^@MBMj^j8>0ca9V*Yu)t$5f_eQ-C:gd.tN)\i: %$m'dn=VHa\4--[E"\Wg'EP#)RX'eNUa2B8nrW#m6Yq:NNooV?I %TEQI>9.[R5)ie/RPqqCU7UZIq,$Q19kO?JEj^L=C1X"K`/,\OnD]WU,m>Lb:QK)u`_`Q^V_jr1,nI'(ZMLO=jF1Os+_M>-pihT?GChlJcsTA=*:Q(ps-L1lOh>NAd.Nd*&^6AUZ@Z>4[q2AF6-cHgJf=qBdh"k/ld#HVse^pEmdi=$:4?d;%dN,]RnKXoLm58r*o*a0.@ZRA@\ %Xsbga3nOTMCu[ij[Dm?>ak&_eVa?[SSBB8.Mb(aabVAWEPqn:@;_X7%"%-ao<"LlFbP>6`Y0=T-h+s.ik[5aPXn)Yeapm;(c/E;] %_hL3i^eB;<_X;@Aq3eC(p;?nqJM^Whi&UjAg,Ho4r)pP6J@j4GEs&AW.`#J3AcHY.2d;rpi=3q..&]GVO>Knl2pA6U(D1]D!+Pl, %CVZU4_Zj-rT&.]=k03=,3W']MSh]#CG5r_d(7Iq+@"c@*7kRc4M[^p*05=8Xg739cZ,U0Su8@? %I/8oTWUQ]5)#]DT8&9iCH47;1R1V_Zq@B([Jm;;^HZ5F3Q_%Ap=X)#2Mhu`AJ@@?R*ZDqGV`S`MA$JT*#_4qWE_08LqAJ)l-51m4 %8Vh$dBXj?sI@)mj(=];V!LW&fh*g6P.-NgJ)c$aQ=2)gFIN(buSs"+]j1qok/cL/pN[9Q_NUkXG;%m\LAZSLSTe5LQdpR_T?6ho! %-taakeQ8,;A#\0PU*YO#g_(is$c=Q;j40[+Qh9_t8^ohHcM0,]5G1!0g;adFWm1D0"P;3bK.BV&\Qp-/*X4;"5=J.mic?2dcCcF=Xp*\BP6MJ*dUNpEiL8LS=$I^FdQV&<0)#S]pg4#Um'kX?O_U_40BdL! %#t996iUS[/mK2`7JaST8b2T^HaG)Ki6^pfl9=:)\4YR@!m)uE6F1rIa,1RUk`uCbi:Q"83?WZJ7 %fntp;!A*:V\('qK*u&!hHk,)i:har8gglBb$tu';IVB&)WfqY8S,OE35Do#bAN/]?#)VK8)Ip^d::W4#m0IFcN*e@4.W`slcTsQo %->Ks4h34Y^'JCEeRORJ$WN@of6PO/,G]Qi)=7Iapc^#AJ>a?4,)54?KHR]e`g=Ss\P!4?Z[":rfXXZ3]L\4e[ %Z[LPp.?]j/Z<3iP8U)o.]SLRMhniH7<_.5'f#\5uOHuToP0.Q+^e?Cp-qJ#r.hjJctrtt-S9$6Ak>+^c!oHJ"V9RV&YlfY`oYeV>o:S8:%+&Z;N %9AntE88mn;/SK0A`AW#:P\34/eM='V*q);b#D!+KabP33-o>]5^Aj2pb0ct?>rLOCp\t+S=)G;aGYXW= %i+mTEhX),i4u`2I?"3iFqa`Oc.;uG-6Z#7[!>U?*g%QP8q.[?LM10j8.n$+?s0($F,!+G+HC`B4MO5qfoHA-3GIPbM*7;Iq1Rog) %Xe]0`F\b=<;F+iGp(q@Nr-0kbFEdY?gDlNTnOnlj78oU"JS<\`)bnOcBI:pp2;!DVkYAiL2KdW=rcD_.Q2Q@90/CD2d-L%MG&d`hGY6%j(?XND( %A(?IX'J%rO0rF;1rP(6(-4-j:/ZK>fc+*Qhij']0o5"UYlbSIg3Cg&=0.03LOs[?D/E`]&;^96:be %#Xj5;L1DmB2\Vt/rV=12.M`Rk<9`AD%#MPkFm=VVFra+1!R\bMb2-%\f7SmrENtd6&lE>53*E3p\;_OJqohZdXiX2kr'Ghp4@korRi%]FPZEF:eMqY\T,[f0lqtsDkuHbAl3/GsS+dtuo4s/k2#57N%D %4,N%WQ,GEW^1jt.CCfX.hjUuR`(tGD:F2KBSk:<$s0+=,K=,(F.H"=Emg8%:>2J8h#)L!dXoHfqAj*NUG` %Bch32Rj*Eq1\n/PVOLF-d*KP(4AIa*"9"aLKI@fV6oN\I6"FP`RcoTp8/1k["JW]="b+`.\&\!P#5_a77*G!87W`ZpB,6:Il^oOC %5X^a$`%i05rs=^!Gq!4,abCH<[Vl>D^`W2oLd[BuO4e"D8RJ1as"7)(fRG+Y"mfOj,t&1XSAE#;-PD-as+Ed^8gYI)JG8IFqhf1s %!mtZbg(XW%d?\<:%2SEf*-\Xs5bH\s*^:Njq/QcNjVY&%TrH&)]ucLKUkQPq('fL\$^X$Y:YY_Hi$0MbV`_9D(u`@%<`nlpT<%:! %nUKD7B,tq113JMYVD%*NYt3tkUV)Jb?/ua-GsVH/F4J1rJ'8?kDO?>=QfdQK*;hhER*a\5LZ>1rW*Zf6WKD@KShJ[L!V5Lai40dq<=*$"L]GrO30"4=9QpU %4[ab,D#]qnp&:XL:Qk5]H$j9.JXq0A2hLi"%?:q$nVg6gf=qbZ_uVJ#UHX9_r["'Qk,1M`/;;5OQV;S*0?eMkpUAbB=k(Z.l3hup %C]Ae-oCQ!_N^3cRW!f!#'h>F@4<'.H!L-ko&HR@;knH;-jp0]j@oZpQISBCdn'J_3k?Ztf:i6`C?dKm\G:7D[_n4?DcU\]'nuIpn %Ch-QmpsiGa>hCpC=jf0V>XYZjVG5AWZ^W)TA^K8q9"e;M9Ws,`Lo:,_M43iKc^0[Bt=uJZX.bih_ft+9dP-s5TKMoA(]$-iCk?SI%ZmGeGcq %Ti_YZ.Wa]gCm4@33Jm-tAd-L"]Dlp*c,Z-?'rEf5_7u0W=[[J4=(q>&?Iij+4ePk0H]hQA/4P7\d:O*4[k*fE;RN;W]!sBtMGMC/ %iN9M."m]k71CCHi[)7eV.lFW3::WsLT7;jNjI=)s#6#4c$b9,HU952b:3lb>RicTkEN;$doBF["n$rk($F5+UMM;u-ZGQR2`*P;J2_9ak+k/oh*+t'$LhZc;3T+h9gS'&RSXPQ7,HgV:!rC:&0&JZ!Ps7G %K-u,M%Dg'GZmj/@?KrEJs5XpE+h`Z3P,Rj1HucSG.6_:\^#;FT'#N=p28<-6"bn>B#`437+fOB"fWS;,)?u&n+>&]4Wg_V7e0NgB %!f]7.Y9EtH&ck8gpU(9Whl9]X?r2\*q*,?aWud*LgE`S%^e@S0'r81%[H46k2Ie6YI#e+X/a4?.r8/Wf4> %ma_5DV=6t42YKX4r(;YC#K_:l!@kdBL(5(PEhe?5*JnX85OOa*eW0,]$nfrRA5#NGegHH.&0a"i`H[B4.)7#9#)guucGZ1WM(p$l %F=eD_M.BOg=>/F?fU+jXGF>V[,1d_u7B[o:9.aTJ)1ehSid0;/`JX/tY,1K`C]'d6%]L^17&p/UoA!_NR-F.,;69T=l]Q,pQA?9DLJd>K&/jpGr/Y?g3+t4p/?>0V'G=\E;#YuBPs %"^@k.kp*s`a7oRT>UFZD9fl4>q5GXeJE%9J1GehmTE9S%CG=g+8@5NBd7E;l7ABH5=s]V`"Xgom4o)W'q:2=HD%.8'9#:WJY&9 %)UFHnC;ZaEm$-ePTrEV=1npqV?>]J=p%4B0`s7$olU8)+9EpbfbJ&K+PLG4@0j*Oojtj!T>dS4MU$;O`=q&n)h6B#MSh$OTHS4Y9h2+7@i1m5niM]4ARpQq`(FH(P'5`5WrPrL?R8_^.jM36Z/jNB\d(;k %QEFo8O?")jNcPLrZKKeY8rXs\?PGlZb`(IUF_YZU`Yid%\Cef5RZkscoDgQF?Ear64=lc.#X`3Uuc/)3b8Gb %J/5d+6UrI1&TgFJTM>od14i7`qWDAPPS&""Npf:CSMGeWM3(u&Ti4G-@Je,(:X>Gc*%p[A(3pagkdZZ8q'9#Ve1\t.;fhsQE-&Z$,O-GW;6#ub %q'MXV+/PGeW_=cu8Nh*j^aHCgd0,k!3N&Zi_L@em*q.OK!KpdE2GY\1a_s[tdgO^])$:Lh#G[+gcAti\3qA18^k`SC"KM2(:%h2A$Em'a5@9>S5$NGuW?cH>n7H[[.(,>)A[n3Wj:p %9o0u0%ApKg$0cf&ZgD4JR)+Xm;e+j'eMpB5A@&_:#M\PmF-T5r2s;km.$Ci+euW[3STsPU<;7?=("k.,/"eb,#B+j&kATaIg/!aTs5)[QBMQX6UdeeXBN %eMK[)e4utHDWA1[M^'uNCqOr!K7'`R'i#a4o5`/9'i]?n4P\U;<-@0Y'MbT5&J'(G %,#o!l:,?)C,!6hla"Tp:[IJ4gRB+W$:^rh(.)j*_?BT3)L1WQ<5o(%[*LBFhE;WDl0`VasV]-/EZKmG/`@f^k:qb!E)97YL4qe5P %;h`"]bcnN %W9s'X(^@>QYu@3+,-+\9(i5^Le'V^lT;Il@\lM:XZ-qegb)WIF_$9kh3.q]Hj#1:EcXk:]X+ai4Qe^DJlI"Zc/)PK%lHsM''+K:X %_XpU+Qr1J49'LF"kas,T`T"kD]$uTI28gV#ahekdag(#E,#Y&:LIcj-%O1TEmja,mT?2Kr6n5.u$A_Y`b;Bj1Yb#VQ;B^K`gGR@K %kV_m\$3%?fY,M2R-0[0)lqS&b_;G#V8@m>VgG77cKbJ5V,$O.r.%E7X$Lqp3$RhP)4n)O*_J.^q]GM!2qj"&a8Zi5N_l2e1VHt>Y %cCj:=P4P>cQskf`=/'Cgg+2r23c9U`1icrLU$uX'\qTc'`09"9NMidaAUhkW5?R]JMiAAOaKVt&#'We*%F^YM1486H!Wujmh8#/` %9hX_o?7=%2$7_+0*/M(-<_5(R_FE1gbW+Z2WQbK_1:PjZ#.rP&^huk"L%C[!S[#^bpX\(.ScDb!G-d0GT,%RbRJgD??/2>^XS4#K[s[t55W!9m_4m`5[nfGG %?.g'XlRSG4\\.8"7&=!:L!4C*j+eI]-%UTSZ;2<7$.pi7loku:L41,qB?-l-&.s9;%jCaXKouM2/?n=P::Eo*N0hFSfH_5e[70Sa[MPPRIX<4a_;_UX%D3:.ttWLWYn;PkP?f),)>b] %<#+h&C.KPH\UWTHO_*s3QQ44Nkb%Kl33c%KFB#5:WeW#\1^Q`H[JY$uq:#\ab;G.&/1H)(oaE[J>RN8SlBT_<"HHb*9daS5P&kW7 %Ml)^(g<$H8(Sg6UY]Rh^b-TK;\r_tcUZo!kihObb7'5RuFE5Y32Nt=tVGfV]I2+RZ8L%RY9rB:PI6!`k%SMTRE`Fre_V(M2U?PFN %c_RXu'0ck!-`93(HPN]@^1#WFS&1=3]S`3KBBZjRSIbu`0&nlT]tOAFJQ!fkG.:ehVm"=VUL(!]E4Ns%SM"+ %a&I*Bki8%B1n?bLY)TTss#&2GEYTEBf1+62X_f4BH7^tE*0s@Y-43Wc.VLlR$H*S>)JD/l/=eW\j5jr83@p_7m9^#k-O7C0 %gd4A=LHYr>El4T\6g(6/,Yd8<5^eGfYlbj#T7D-%79L9kI,[mGOH,R&P)(iU[4\Io\LJol-YGMNZdm0$(Dl26P=n`L2/e(m^,dRa %)R_;"b"69Snqk#HAT'S-i0.pL=kP-m8f5pRn/3EKI(Mr-2R`)^rXaj5PB]Kn %kE!!'_2)gnFIe.I43a<)roGuaSZ_R?U9:b8mOj?%BMW]iTE\@.h-CSN@FEq:Hp1\3RQH-KK]/bAmU0'BeO4U"0=)t&\Wb[#7(./Q'BLGWL4)5;G>g%t9K0#+^iZn6QqPgV[O"opu1i8('+Eo#BY$NFZ %.mXm&:*!o5S*kYm-aJu6_guX(1VLT,TJSQSp1Ypco3^f?'LMh,H;5J)+"prJnDLu8Ln2#p2:SB;;_*WP!qffggQec"FT%bo-W,Af %8VK9`f)aI.Sct'1fM6t)^JgE2,jhh>h^PB2?`@r%_9*`c@7JHt5s2^0?>F!rmRB7Vq-Kn1W-bFH]'qZ75R&G/.=:6HTdP]njRLs)$,nM4(fE2PKjhO,8LA?sF8EnooZ$p+O5UF/lm]@2/2=#jrF%]K`O %E5!:o`gmG^>qg?LmN%"HBu7_:RQ4WC+&j#gfQ@5MT#tLqF<_n#!c.U6Tk9V4,AEIBjJ.p`qf^XQ4)lXQZdtIP>X;qY=&Xrl(c@9#rL[Nd"o[km3lutPkiKaZ3eREr_mH_PP=eg')WBjWn!FbjfJO\uAo9&Jec!rtpTP;$Oca(I?V`53V %aWHQUdbL8Y$l1#qDg2-M\FI*Q:32coJ!2\68TO-JE=nn_?BqaE^HNi=MOlua6K; %VuLX9Hs\1E3'/"2#M>LiB:K(!:WFjrp+L6rI9QG28KbYV,s9sH.'f$_fY=`XX%+FMS_>8P,S6Q&8CV#JA/eQY?[)Bbg.3K(b^R&` %U+r4Y3:c8H3t)=O^$n'cBdd]q4Kd88jhg/pcdL"3U`@"9+=\9*@HSZ3-6[9i4XVsF\VQ2]FeUq]j%^eYnGO.heIgi[@V\tU2s@@l %GAQi_/7qU,9aEJq7S"LeS,]Uhmq-QD0,/ZE3' %#:n8C:.qjAZM@eIV[&J0DRrSWJL1t+S-da+kZXHTn@W%>]d1Z(>BtnXl026kG\L\+@K<5@G+P3Ee]&Gs=#Q6%0I>^=/WK;*XiTe.I/-P3G"2Hq[4na!#rAB\ %k9H#h-KQQl2",b.R,GNA?-1k*%@Eu2)8:ieSKt)
  • &Z:nV"rPZMlE,:<:fA< %iKsZhm0#%8Zjt1p5gbVB=WW\@$m:$1a]U#WXVa;f&=OFHOJ=%NW_uQC% %Cl%Gf,blEDr+Dc)AND(E)^>1#>#9`)Q:Y/\=3r"P!"]&68bn$uD#_\SHqI8GlQtX;7cCM=Pg?"*BW,;F(!VrkS](Os;Ef*7V#OFm %4q2_8>p1Yhar0t)-07Mi.uT/jP4FI!1mM@[N(hMPm88K?/*-A%p2W%G%AbMWT/r/$)L;8u,hM_WL6BmKVt7:_RUam1=0]">fc@bn533Ssa8Q'Z%]X61\f8j9!Z<@.%G7^=7f2!9U_SjJIcg-AN/f@]1j)Sj?5NStq*+J-[]RBo]9$VNC"-ob3 %B/r%?hR:q+f2"E-h\F^+b3Ps:\,,[.I`f&(q=lS_4cm#Hl-ICo:3(5$Rc?6.htabeiFZ]t41b+F*gF#-Oo6)EH2T?cV.n';VejZM %LnP4JqMErQobPlX`b"cUQ.G(:;+5]*%:f7[i@k&'EX^Dc^][jGIfT)#dtlA_a]RH=?nS,etC<<5@MIu+ta*1hmo->F8`HPM-AG,PP4hgOZqT8(RBt-61DdGZi\/#m3^GN-d*9Kg^Md;_% %:XVgkgFdQneQI1rPhgN#Q1Fc#mq-#K]-skTBI$BZqC26*"MlCRfC.MDKDP08.3"##QZRLZ5:+3d["i:?YE@EiXdIWLGnsK&l_hC* %K<4SnjRlI,0SATCX5rqH.q\Gfmj4Nsf8gX1,i.6r?=#j:PMi]n@^]YB8RJACqi'_taZ1YeP8VW)f\sUHL'N)96 %KD-#2U1c`-,r$r)36d'5%uSEhbIPW\J7&F@"DVUR(Kc-,Q*IM%VM3hYrA;iH&'8##(O^2uX_C]G'nL$JLumkXLHD9mh0EXdTcg-' %ZgqVuUjdC17/AS!9I?A-cH^gBTh;.g03.jka!nUV.T5nNhOr#nR%%hi*sP\S2>a6lQd[%VI348BSa*jXFn\*VW^e)fWpG/2NmtDI %B;8d=>s%^61-JO-T.`!8n.[iY?\'"DolY1gm<6+)GIN(Z,^)]8]!ja2U:.`mEX*&*VZT>1>2AdAjg"@fRq6pgYMVgiS`Q\n)bhl7 %eRrU)bI+sSKuIS[Gopkbjk*H?`pOm<^G!R%K7a4DO03?hie,r[@6qe0S6l %_XcZ)YP:MlXb:pLehobjn=5$(EG)X+++ctkf@kk5gS45H)"eeQp1tND<\ld@V?__W!cK1=UQ!Tk$VZM^qj32fnRi&S*WAL\3DCUS %I_4JDjlW\k;=Gk=o:ab@HSrkk)TEd9*4k4GO+L0pXj?\=SHb^4Ir(XInh*TWoQK.N[Q76Lc/V6"Thr,$T73[Jn4psJV!FORs.&SZ %PPlE/\`$UKqm@#H.f`K*:`;"d@ZX3\9''*C`]dIRIf9=Fi"0B;RZ?$S#C$d-.4=gsG[!^Y%gm45JNs1gc(G<'9"O:&*Wb$]43,&+ %ki3b4JcW2/.;q6.&:VMGQO>G4!CjV)ocRQ)EWB,5mKE3MmJ`1Fmh%[.ntE7<9\0Qa2R>a+"(WU-he3fWiW(n11lnF='SK=+9,g_N %NZQ$P2BTUdZKsoho'[@lcpcJGR)/;NhZD[3p*'LnmJusMP@jU>#mbcVPdfN])"Y^Dq#UX?IWZI?_rP,$HYr/ua\qUES&lWiZi&7g %*ETc\1OgXha\@J(-']B")QMmE/?79-Mmd*B17bgJ42pK<9iDAppYt4FEl[W"\h$A*s)+Yb7s"$4VVM'8H9M)a1bUZWr$s %OYupfoqE`45.se,;57k2TAFsSp$3WHqU;^L+,noe(dO_gVuj"%$b4Ueo*H35r;+nd!0ZhM%K=J"[?'C!lYlYK0*%gDF1le%CGsb9 %!$[m!`oGR"efmr!D$T>h&fL3D,0g5Gf7/P?rsh`jRj>FDbdO2;_DrEi7\Fu!r/nUJ`b&^ %j%G"hG2>t(d9cY,#`oJMjFbp5Ri>b[#&V_CpJ;Nm/^CKY39l7C=8Ik'\_j\F1rmheVKhq>5L:HF5^_ogMu;#1VL>UaJL]66)sUBD %!8!\X3Zo,a^`J"]o"g/P9t\B%X;#?a$:C:XD2%#ABKCpE0fnagS]#nAk(GP@/kr:$AR4*Y;WBjD%>0V%A=[_5:iUuY1C=Hn)#=]= %pV#aipc>D43,8EnjVL'8ad_a*rAE!e%eQeVeR*;#_nIY4!!1C!@)%P"&_bU[$3Ja:Tn51h;j]EY!DhVV@M^+LYkmafHj%_kS$2bc %9u/i,B7Cm"3S<4)-79eJOL*G`WPGd-M"hJC53OfLqo:?tEJbA>%tO_&d``^D:^<^"G$F*GM&EKF=Y4]!6uh,H01CCoQt%Hd__Gu) %M6S]0igV*-gpi$^[ui'8K5CBn2?b@:%!/fZCP;aE-eZEie<,4_oa;bZj&\-hFi]_&DM30hf0,\5>EZ;G`D;pEa4i4#ibZ08:LY]H %"=:!lW!^g@8g[S7S:+ptJIfs[=eGZ^JC\&0eHQCKQ5p7'LH#ir9]nZT*=0b@Yl6hm,Ko!B_,p/X=##0:Q`C2B9>W_BWdr>A:2C)4 %"hY<5Ou=FF1-`-YZDj#--$NZNV)V&F.;[#DIW(O[4q@*$`oBb%d1BK6hShK%IbVk3H[%a9qn=QR("J;&&n%be=]LdQ#N`T$W;#u]$2V=IY*#% %!SRB3r<3(*K#+2=:XJPV+O0Ha?!^a?Y5qRkn^rVo)NldLIUY>d!CH%H/HO&?JYa0#@A]`$AOXM%$tH5fg-Kmf`GL+[]#qV3F[pCN2M/-J>4:jG?;6oO,U5=b1459KR5k)f^@MR- %*PYVbn18_<0(@NVMB,N#6?O[TCVpJ1I[sX=51aFXb"8-bW$9Zj'YY?n#o)\u``@<@eS6p?S;oOll&A?#\.T1`MLpP5 %Ho)BD^P5gn8bX%7M*)$Aa_i?6>Ti(] %]']F3n6-!MN@[QN@.IoOq<>?8^`WE3Bud_6ifGZ)q*KI0Z6+ocN-*]M3#5lckmM6MiM6>C&q26&9INN%p$O16K8#>R(X:BL %2Xm,ZD623Zf.ZU'9%Z*idou7+dIt/t\VS&U\b_rR38^nCBunWp0AqU<4fn+pUgm#PqX!SA*c03%*$!UR(%PJ;:Hf`'mb)`A/W]04 %q6&p3OIpGQjL0*4d9\(Z&=!TV:LWQ"Y:6;(I`Oa89_pLD^l:S:VE_C`]_J7=iL>>;LHR'Ks.FO`E8\KRD'OLh\F9a\_$U.W"/u8. %!4]F>MNKq72[u%iK9'/qQ-9p>g;<.sI6/Tb>:ueopbiatN="P,1FmJ3:-kMQj[G:5+S*R@.[7Iq[b>`%MlI4o.]>,T=dY"uh&V.m %U#X,rF=*L8BDb\Wl1oM`Rc@PG=K`Xt'UBf(5CQ`HDaDJc"j-Z/'fr=!Xe\jI78pUr7S6dTTgSEp>5ic+IcoG*gNi%+d\L:NI)8SN %IiL\ZXIe[+#/GQDZr@TH689/4Vp."B0`Ask!D;'Y0.VWAc_0^R#<^E2m,Jf#1Q",.i26SH8T`TW'Z:bRfUMs"f;B)Z&H@"1fLjKc %H_?8fp>rF`KL*,202\=dW;tj&$nD=ZCs4pV[3D)rlUGs5Y/Q_2A$D\5>@`:Oi/=R[a4m86:;(oi[tci66:!].)GBO%pbhL#695jJ %TLZg;4ZGbC&)+7Bi$f0l3l"EAIsN5ZWT#4?ErsJ!9ti]*DLaT[K/i'ZT8Qm&na"iDC;#4Q?`nOI?dPu^j;6E2\.n^5H+?1?K;(]- %H:C@FKYcaHIUn*u]"^Ndd`u+b-TVI.)R)WYq;adf2u6406jUCIF`Ud`%.UToQK43(']e&]nSll8>!Ij&*Gg):MWSWca\ha7/%HB2 %e_3"D!b:YF/21[oo`Lr(=P.GsjDTrCD!e$M]GIWa8&(::(j%jc`mn"9)q%L@@T?G&lc+N\TSbDhc;JhH1A#&qh*/LS %PohP54?5^aT!Xps-a3^#=,;0r<.`g.68AtN(5'GG4'0C(nOqeL41GVoa70M`[<$)F2]0qd?IB&A;T*FTbIUR?\\`".hoEUD7TA(SaX*it?Xf-u1O/hFI`:dVZq>2rGs=@&k+a-%oRncC8]Va%7&:_%Y,ONcK]ba5[>+,XE7?sX]M %qE'\p9Pjo2pt*i.#4IZH-R.[i[>s6R)pSTcoeVcJ^OE*/XAK%8FXEabRjmMH5RF4;:XJPVTP\G7IY*#%6.S%snItPA$%RnN5=*&N %!$mM@5=*&NJ2jFT:XJPV(bGO^"T;X.Yf:h_$2V=<%[*R,:OjoJUh`mHD-!0C.pmX%)6M&FD<5PO.^L)8P&9;rD^qNMI'TmPhm=P8 %Ye\W8TX:+'EVW.nCP\$?peLDI.j$6&8qYhDKdMSa+sJ&4l$!_ %'8Jfcgc)gpi_B?*.6@N@'/qhr)JT7EK1C)%$QFU3%Lgi]%fH(l%j7IuJkqF3aqKd2"/3L>jb\Yc@=JEfB*"Se)(;q1FT]Uk'>42q %peh29I_eh[g]VQ`Dr*[VRgH1iaUemUDu@?=c-"rP#!E[iI*gK"n21o2?XYtR'2rFPB]L$X!LBF^\D?Xng[KRDfa[+;^pBk %iHi0t$kLf=G]NDhS*gfVh=P=ZZhXk*!aaiC"6MhrLAqL@P;(S~> %AI9_PrivateDataEnd \ No newline at end of file diff --git a/tests/exempi/samples/testfiles/BlueSquare.gif b/tests/exempi/samples/testfiles/BlueSquare.gif new file mode 100644 index 0000000..862bc24 Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.gif differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.indd b/tests/exempi/samples/testfiles/BlueSquare.indd new file mode 100755 index 0000000..c8b9680 Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.indd differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.jpg b/tests/exempi/samples/testfiles/BlueSquare.jpg new file mode 100755 index 0000000..81b8a22 Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.jpg differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.mov b/tests/exempi/samples/testfiles/BlueSquare.mov new file mode 100755 index 0000000..2ee3885 Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.mov differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.mp3 b/tests/exempi/samples/testfiles/BlueSquare.mp3 new file mode 100755 index 0000000..0b275b2 Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.mp3 differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.pdf b/tests/exempi/samples/testfiles/BlueSquare.pdf new file mode 100755 index 0000000..2498719 Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.pdf differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.png b/tests/exempi/samples/testfiles/BlueSquare.png new file mode 100755 index 0000000..91589cd Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.png differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.psd b/tests/exempi/samples/testfiles/BlueSquare.psd new file mode 100755 index 0000000..1850b8f Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.psd differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.tif b/tests/exempi/samples/testfiles/BlueSquare.tif new file mode 100755 index 0000000..3ae7b02 Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.tif differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.wav b/tests/exempi/samples/testfiles/BlueSquare.wav new file mode 100755 index 0000000..c9983ff Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.wav differ diff --git a/tests/exempi/samples/testfiles/BlueSquare.webp b/tests/exempi/samples/testfiles/BlueSquare.webp new file mode 100644 index 0000000..d68328e Binary files /dev/null and b/tests/exempi/samples/testfiles/BlueSquare.webp differ diff --git a/tests/exempi/samples/testfiles/Image1.jpg b/tests/exempi/samples/testfiles/Image1.jpg new file mode 100755 index 0000000..0da199f Binary files /dev/null and b/tests/exempi/samples/testfiles/Image1.jpg differ diff --git a/tests/exempi/samples/testfiles/Image2.jpg b/tests/exempi/samples/testfiles/Image2.jpg new file mode 100755 index 0000000..17862cc Binary files /dev/null and b/tests/exempi/samples/testfiles/Image2.jpg differ diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..8610a94 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,19 @@ +- hosts: localhost + roles: + - role: standard-test-beakerlib + tags: + - atomic + - classic + - container + tests: + - upstream-test-suite + required_packages: + - exempi + - exempi-devel + - gcc + - gcc-c++ + - make + - autoconf + - automake + - libtool + - boost-devel diff --git a/tests/upstream-test-suite b/tests/upstream-test-suite new file mode 100755 index 0000000..5ac7e89 --- /dev/null +++ b/tests/upstream-test-suite @@ -0,0 +1,28 @@ +#!/bin/bash + +. /usr/share/beakerlib/beakerlib.sh + +TEST="/AppStream/exempi/Sanity/upstream-test-suite" + +PACKAGES=${PACKAGES:-"exempi"} +REQUIRES=${REQUIRES:-"exempi-devel gcc gcc-c++ make autoconf automake libtool boost-devel"} + +rlJournalStart + rlPhaseStartSetup + rlAssertRpm --all + rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory" + rlRun "cp -r exempi/* $TmpDir/." 0 "Copying test suite" + rlRun "pushd $TmpDir" + rlPhaseEnd + + rlPhaseStartTest + rlRun "autoreconf -f -i && ./configure --prefix=/usr" 0 "Configuring test suite" + rlRun "make check" 0 "Running tests" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TmpDir" 0 "Removing tmp directory" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd